5eb52cadc66c49c74328308f07698fca9535d3b6
[ovsdb.git] / southbound / southbound-impl / src / main / java / org / opendaylight / ovsdb / southbound / transactions / md / OvsdbPortUpdateCommand.java
1 /*
2  * Copyright (c) 2014 Intel Corp. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.ovsdb.southbound.transactions.md;
10
11 import java.util.ArrayList;
12 import java.util.Collection;
13 import java.util.Iterator;
14 import java.util.List;
15 import java.util.Map;
16 import java.util.Set;
17
18 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
19 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
20 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
21 import org.opendaylight.ovsdb.lib.message.TableUpdates;
22 import org.opendaylight.ovsdb.lib.notation.Column;
23 import org.opendaylight.ovsdb.lib.notation.UUID;
24 import org.opendaylight.ovsdb.lib.schema.DatabaseSchema;
25 import org.opendaylight.ovsdb.lib.schema.GenericTableSchema;
26 import org.opendaylight.ovsdb.lib.schema.typed.TyperUtils;
27 import org.opendaylight.ovsdb.schema.openvswitch.Bridge;
28 import org.opendaylight.ovsdb.schema.openvswitch.Interface;
29 import org.opendaylight.ovsdb.schema.openvswitch.Port;
30 import org.opendaylight.ovsdb.southbound.OvsdbClientKey;
31 import org.opendaylight.ovsdb.southbound.SouthboundMapper;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeName;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentationBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.external.ids.attributes.ExternalIds;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.external.ids.attributes.ExternalIdsBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.Options;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.OptionsBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.OptionsKey;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.Trunks;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.TrunksBuilder;
45 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
46 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TpId;
47 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
48 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder;
49 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
50 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointBuilder;
51 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
52 import org.slf4j.Logger;
53 import org.slf4j.LoggerFactory;
54
55 import com.google.common.base.Optional;
56
57 public class OvsdbPortUpdateCommand extends AbstractTransactionCommand {
58     private static final Logger LOG = LoggerFactory.getLogger(OvsdbPortUpdateCommand.class);
59
60     public OvsdbPortUpdateCommand(OvsdbClientKey key, TableUpdates updates,
61             DatabaseSchema dbSchema) {
62         super(key, updates, dbSchema);
63     }
64
65     @Override
66     public void execute(ReadWriteTransaction transaction) {
67         String bridgeName = null;
68         Collection<Port> portUpdatedRows = TyperUtils.extractRowsUpdated(
69                 Port.class, getUpdates(), getDbSchema()).values();
70         Collection<Bridge> bridgeUpdatedRows = TyperUtils.extractRowsUpdated(
71                 Bridge.class, getUpdates(), getDbSchema()).values();
72         for (Bridge bridge : bridgeUpdatedRows) {
73             Iterator<UUID> bridgePorts = bridge.getPortsColumn().getData()
74                     .iterator();
75             while (bridgePorts.hasNext()) {
76                 UUID portUUID = bridgePorts.next();
77                 for (Port port : portUpdatedRows) {
78                     if (portUUID.equals(port.getUuid())) {
79                         Collection<Long> vlanId = port.getTagColumn().getData();
80                         Set<Long> portTrunks = port.getTrunksColumn().getData();
81                         bridgeName = bridge.getName();
82                         NodeId bridgeId = SouthboundMapper.createManagedNodeId(
83                                 getKey(), new OvsdbBridgeName(bridgeName));
84                         final InstanceIdentifier<Node> nodePath = SouthboundMapper
85                                 .createInstanceIdentifier(bridgeId);
86                         Optional<Node> node = Optional.absent();
87                         try {
88                             node = transaction.read(
89                                     LogicalDatastoreType.OPERATIONAL, nodePath)
90                                     .checkedGet();
91                         } catch (final ReadFailedException e) {
92                             LOG.warn("Read Operational/DS for Node fail! {}",
93                                     nodePath, e);
94                         }
95                         if (node.isPresent()) {
96                             NodeBuilder nodeBuilder = new NodeBuilder();
97                             nodeBuilder.setNodeId(bridgeId);
98
99                             OvsdbTerminationPointAugmentationBuilder ovsdbTerminationPointBuilder
100                                 = new OvsdbTerminationPointAugmentationBuilder();
101                             List<TerminationPoint> tpList = new ArrayList<TerminationPoint>();
102                             TerminationPointBuilder entry = new TerminationPointBuilder();
103                             TpId tpId = SouthboundMapper
104                                     .createTerminationPointId(getKey(),
105                                             new OvsdbBridgeName(bridgeName),
106                                             port.getName());
107                             entry.setTpId(tpId);
108                             ovsdbTerminationPointBuilder
109                                     .setName(port.getName());
110                             ovsdbTerminationPointBuilder.setPortUuid(new Uuid(
111                                     port.getUuid().toString()));
112                             if (vlanId.size() > 0) {
113                                 Iterator<Long> itr = vlanId.iterator();
114                                 // There are no loops here, just get the first element.
115                                 int id = itr.next().intValue();
116                                 ovsdbTerminationPointBuilder.setVlanTag(new VlanId(id));
117                             }
118                             List<Trunks> modelTrunks = new ArrayList<Trunks>();
119                             for (Long trunk: portTrunks) {
120                                 if (trunk != null) {
121                                     modelTrunks.add(new TrunksBuilder().setTrunk(new VlanId(trunk.intValue())).build());
122                                 }
123                             }
124                             ovsdbTerminationPointBuilder.setTrunks(modelTrunks);
125                             Column<GenericTableSchema, Set<UUID>> iface = port.getInterfacesColumn();
126                             Set<UUID> ifUuid = iface.getData();
127                             Collection<Interface> ifUpdateRows = TyperUtils.extractRowsUpdated(
128                                     Interface.class, getUpdates(),  getDbSchema()).values();
129                             for (UUID ifIter : ifUuid) {
130                                 for (Interface interfIter : ifUpdateRows) {
131                                     Column<GenericTableSchema, String> typeColumn = interfIter.getTypeColumn();
132                                     String type = typeColumn.getData();
133                                     if ((interfIter.getUuid()).equals(ifIter)) {
134                                         ovsdbTerminationPointBuilder.setInterfaceUuid(
135                                                 new Uuid(interfIter.getUuid().toString()));
136                                         ovsdbTerminationPointBuilder.setInterfaceType(
137                                                 SouthboundMapper.createInterfaceType(type));
138                                         Set<Long> ofPorts = interfIter.getOpenFlowPortColumn().getData();
139                                         if (ofPorts != null && !ofPorts.isEmpty()) {
140                                             Iterator<Long> ofPortsIter = ofPorts.iterator();
141                                             long ofPort = ofPortsIter.next();
142                                             if (ofPort >= 0) {
143                                                 ovsdbTerminationPointBuilder
144                                                     .setOfport(ofPort);
145                                             } else {
146                                                 LOG.debug("Received negative value for ofPort from ovsdb for {} {} {}",
147                                                         bridge.getName(), interfIter.getName(),ofPort);
148                                             }
149                                         }
150                                         Set<Long> ofPortRequests = interfIter
151                                                 .getOpenFlowPortRequestColumn().getData();
152                                         if (ofPortRequests != null && !ofPortRequests.isEmpty()) {
153                                             Iterator<Long> ofPortRequestsIter = ofPortRequests.iterator();
154                                             int ofPort = ofPortRequestsIter.next().intValue();
155                                             if (ofPort >= 0) {
156                                                 ovsdbTerminationPointBuilder
157                                                     .setOfportRequest(ofPort);
158                                             } else {
159                                                 LOG.debug("Received negative value for ofPort from ovsdb for {} {} {}",
160                                                         bridge.getName(), interfIter.getName(),ofPort);
161                                             }
162                                         }
163
164                                         Map<String, String> externalIds = interfIter.getExternalIdsColumn().getData();
165                                         if (externalIds != null && !externalIds.isEmpty()) {
166                                             Set<String> externalIdKeys = externalIds.keySet();
167                                             ArrayList<ExternalIds> externalIdsList = new ArrayList<ExternalIds>();
168                                             String externalIdValue;
169                                             for (String externalIdKey : externalIdKeys) {
170                                                 externalIdValue = externalIds.get(externalIdKey);
171                                                 if (externalIdKey != null && externalIdValue != null) {
172                                                     externalIdsList.add(new ExternalIdsBuilder()
173                                                             .setExternalIdKey(externalIdKey)
174                                                             .setExternalIdValue(externalIdValue).build());
175                                                 }
176                                             }
177                                             ovsdbTerminationPointBuilder.setExternalIds(externalIdsList);
178                                         }
179
180                                         Map<String, String> optionsMap = interfIter.getOptionsColumn().getData();
181                                         if (optionsMap != null && !optionsMap.isEmpty()) {
182                                             List<Options> options = new ArrayList<Options>();
183                                             String optionsValueString;
184                                             OptionsKey optionsKey;
185                                             for (String optionsKeyString : optionsMap.keySet()) {
186                                                 optionsValueString = optionsMap.get(optionsKeyString);
187                                                 if (optionsKeyString != null && optionsValueString != null) {
188                                                     optionsKey = new OptionsKey(optionsKeyString);
189                                                     options.add(new OptionsBuilder()
190                                                         .setKey(optionsKey)
191                                                         .setValue(optionsValueString).build());
192                                                 }
193                                             }
194                                             ovsdbTerminationPointBuilder.setOptions(options);
195                                         }
196
197                                         break;
198                                     }
199                                 }
200                             }
201                             entry.addAugmentation(
202                                     OvsdbTerminationPointAugmentation.class,
203                                     ovsdbTerminationPointBuilder.build());
204
205                             tpList.add(entry.build());
206                             nodeBuilder.setTerminationPoint(tpList);
207                             nodeBuilder.addAugmentation(
208                                     OvsdbBridgeAugmentation.class,
209                                     node.get().getAugmentation(
210                                             OvsdbBridgeAugmentation.class));
211                             transaction.merge(LogicalDatastoreType.OPERATIONAL,
212                                     nodePath, nodeBuilder.build());
213                         }
214                     }
215                 }
216             }
217         }
218     }
219 }