OpenFlow port values are uint32, correcting the size in the model for that
[ovsdb.git] / southbound / southbound-impl / src / main / java / org / opendaylight / ovsdb / southbound / transactions / md / OvsdbPortUpdateCommand.java
index c16b93111fdbb8d552b54bf4bbf7b53f323cc3e1..3332999dc894995acbb9e0e34cec44979257d778 100644 (file)
@@ -12,6 +12,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
@@ -29,17 +30,21 @@ import org.opendaylight.ovsdb.schema.openvswitch.Port;
 import org.opendaylight.ovsdb.southbound.OvsdbClientKey;
 import org.opendaylight.ovsdb.southbound.SouthboundMapper;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeName;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.external.ids.attributes.ExternalIds;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.external.ids.attributes.ExternalIdsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.Trunks;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.TrunksBuilder;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TpId;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointBuilder;
-import org.opendaylight.yangtools.yang.binding.Augmentation;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -47,8 +52,7 @@ import org.slf4j.LoggerFactory;
 import com.google.common.base.Optional;
 
 public class OvsdbPortUpdateCommand extends AbstractTransactionCommand {
-    private static final Logger LOG = LoggerFactory
-            .getLogger(OvsdbPortUpdateCommand.class);
+    private static final Logger LOG = LoggerFactory.getLogger(OvsdbPortUpdateCommand.class);
 
     public OvsdbPortUpdateCommand(OvsdbClientKey key, TableUpdates updates,
             DatabaseSchema dbSchema) {
@@ -69,6 +73,8 @@ public class OvsdbPortUpdateCommand extends AbstractTransactionCommand {
                 UUID portUUID = bridgePorts.next();
                 for (Port port : portUpdatedRows) {
                     if (portUUID.equals(port.getUuid())) {
+                        Collection<Long> vlanId = port.getTagColumn().getData();
+                        Set<Long> portTrunks = port.getTrunksColumn().getData();
                         bridgeName = bridge.getName();
                         NodeId bridgeId = SouthboundMapper.createManagedNodeId(
                                 getKey(), new OvsdbBridgeName(bridgeName));
@@ -87,7 +93,8 @@ public class OvsdbPortUpdateCommand extends AbstractTransactionCommand {
                             NodeBuilder nodeBuilder = new NodeBuilder();
                             nodeBuilder.setNodeId(bridgeId);
 
-                            OvsdbTerminationPointAugmentationBuilder ovsdbTerminationPointBuilder = new OvsdbTerminationPointAugmentationBuilder();
+                            OvsdbTerminationPointAugmentationBuilder ovsdbTerminationPointBuilder
+                                = new OvsdbTerminationPointAugmentationBuilder();
                             List<TerminationPoint> tpList = new ArrayList<TerminationPoint>();
                             TerminationPointBuilder entry = new TerminationPointBuilder();
                             TpId tpId = SouthboundMapper
@@ -99,22 +106,80 @@ public class OvsdbPortUpdateCommand extends AbstractTransactionCommand {
                                     .setName(port.getName());
                             ovsdbTerminationPointBuilder.setPortUuid(new Uuid(
                                     port.getUuid().toString()));
+                            if (vlanId.size() > 0) {
+                                Iterator<Long> itr = vlanId.iterator();
+                                // There are no loops here, just get the first element.
+                                int id = itr.next().intValue();
+                                ovsdbTerminationPointBuilder.setVlanTag(new VlanId(id));
+                            }
+                            List<Trunks> modelTrunks = new ArrayList<Trunks>();
+                            for (Long trunk: portTrunks) {
+                                if (trunk != null) {
+                                    modelTrunks.add(new TrunksBuilder().setTrunk(new VlanId(trunk.intValue())).build());
+                                }
+                            }
+                            ovsdbTerminationPointBuilder.setTrunks(modelTrunks);
                             Column<GenericTableSchema, Set<UUID>> iface = port.getInterfacesColumn();
                             Set<UUID> ifUuid = iface.getData();
-                            Collection<Interface> ifUpdateRows = TyperUtils.extractRowsUpdated(Interface.class, getUpdates(),  getDbSchema()).values();
+                            Collection<Interface> ifUpdateRows = TyperUtils.extractRowsUpdated(
+                                    Interface.class, getUpdates(),  getDbSchema()).values();
                             for (UUID ifIter : ifUuid) {
                                 for (Interface interfIter : ifUpdateRows) {
                                     Column<GenericTableSchema, String> typeColumn = interfIter.getTypeColumn();
                                     String type = typeColumn.getData();
                                     if ((interfIter.getUuid()).equals(ifIter)) {
-                                        ovsdbTerminationPointBuilder.setInterfaceUuid(new Uuid(interfIter.getUuid().toString()));
-                                        ovsdbTerminationPointBuilder.setInterfaceType(SouthboundMapper.createInterfaceType(type));
+                                        ovsdbTerminationPointBuilder.setInterfaceUuid(
+                                                new Uuid(interfIter.getUuid().toString()));
+                                        ovsdbTerminationPointBuilder.setInterfaceType(
+                                                SouthboundMapper.createInterfaceType(type));
+                                        Set<Long> ofPorts = interfIter.getOpenFlowPortColumn().getData();
+                                        if (ofPorts != null && !ofPorts.isEmpty()) {
+                                            Iterator<Long> ofPortsIter = ofPorts.iterator();
+                                            long ofPort = ofPortsIter.next();
+                                            if (ofPort >= 0) {
+                                                ovsdbTerminationPointBuilder
+                                                    .setOfport(ofPort);
+                                            } else {
+                                                LOG.debug("Received negative value for ofPort from ovsdb for {} {} {}",
+                                                        bridge.getName(), interfIter.getName(),ofPort);
+                                            }
+                                        }
+                                        Set<Long> ofPortRequests = interfIter
+                                                .getOpenFlowPortRequestColumn().getData();
+                                        if (ofPortRequests != null && !ofPortRequests.isEmpty()) {
+                                            Iterator<Long> ofPortRequestsIter = ofPortRequests.iterator();
+                                            int ofPort = ofPortRequestsIter.next().intValue();
+                                            if (ofPort >= 0) {
+                                                ovsdbTerminationPointBuilder
+                                                    .setOfportRequest(ofPort);
+                                            } else {
+                                                LOG.debug("Received negative value for ofPort from ovsdb for {} {} {}",
+                                                        bridge.getName(), interfIter.getName(),ofPort);
+                                            }
+                                        }
+
+                                        Map<String, String> externalIds = interfIter.getExternalIdsColumn().getData();
+                                        if (externalIds != null && !externalIds.isEmpty()) {
+                                            Set<String> externalIdKeys = externalIds.keySet();
+                                            ArrayList<ExternalIds> externalIdsList = new ArrayList<ExternalIds>();
+                                            String externalIdValue;
+                                            for (String externalIdKey : externalIdKeys) {
+                                                externalIdValue = externalIds.get(externalIdKey);
+                                                if (externalIdKey != null && externalIdValue != null) {
+                                                    externalIdsList.add(new ExternalIdsBuilder()
+                                                            .setExternalIdKey(externalIdKey)
+                                                            .setExternalIdValue(externalIdValue).build());
+                                                }
+                                            }
+                                            ovsdbTerminationPointBuilder.setExternalIds(externalIdsList);
+                                        }
+
                                         break;
                                     }
                                 }
                             }
                             entry.addAugmentation(
-                                    (Class<? extends Augmentation<TerminationPoint>>) OvsdbTerminationPointAugmentation.class,
+                                    OvsdbTerminationPointAugmentation.class,
                                     ovsdbTerminationPointBuilder.build());
 
                             tpList.add(entry.build());