Add the bridge datapath_type to the operational MDSAL
[ovsdb.git] / southbound / southbound-impl / src / main / java / org / opendaylight / ovsdb / southbound / transactions / md / OvsdbBridgeUpdateCommand.java
index 6afe67ba82540a7cf8ab02e5d1ce104dfd43b955..03595f3f3c9b73ca6a2f4939b0d75b5ddd6f0041 100644 (file)
@@ -2,98 +2,114 @@ package org.opendaylight.ovsdb.southbound.transactions.md;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
 
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.ovsdb.lib.message.TableUpdates;
+import org.opendaylight.ovsdb.lib.notation.UUID;
 import org.opendaylight.ovsdb.lib.schema.DatabaseSchema;
-import org.opendaylight.ovsdb.lib.schema.typed.TypedBaseTable;
+import org.opendaylight.ovsdb.lib.schema.typed.TyperUtils;
 import org.opendaylight.ovsdb.schema.openvswitch.Bridge;
+import org.opendaylight.ovsdb.schema.openvswitch.Controller;
 import org.opendaylight.ovsdb.southbound.OvsdbClientKey;
 import org.opendaylight.ovsdb.southbound.SouthboundConstants;
 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.params.xml.ns.yang.ovsdb.rev150105.DatapathId;
+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.OvsdbBridgeAugmentationBuilder;
+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.OvsdbBridgeRef;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbManagedNodeAugmentation;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbManagedNodeAugmentationBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentationBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeRef;
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ManagedNodeEntry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ManagedNodeEntryBuilder;
 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.network.topology.Topology;
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
 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.NodeKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Optional;
 
-public class OvsdbBridgeUpdateCommand implements TransactionCommand {
+public class OvsdbBridgeUpdateCommand extends AbstractTransactionCommand {
     private static final Logger LOG = LoggerFactory.getLogger(OvsdbBridgeUpdateCommand.class);
 
-    private TableUpdates updates;
-    private DatabaseSchema dbSchema;
-
-    private OvsdbClientKey key;
-
-    public OvsdbBridgeUpdateCommand(OvsdbClientKey key,TableUpdates updates, DatabaseSchema dbSchema) {
-        this.updates = updates;
-        this.dbSchema = dbSchema;
-        this.key = key;
+    public OvsdbBridgeUpdateCommand(OvsdbClientKey key, TableUpdates updates,
+            DatabaseSchema dbSchema) {
+        super(key,updates,dbSchema);
     }
+
     @Override
     public void execute(ReadWriteTransaction transaction) {
-        List<TypedBaseTable<?>> updatedRows = TransactionUtils.extractRowsUpdated(Bridge.class, updates, dbSchema);
-        for(TypedBaseTable<?> updatedRow : updatedRows) {
-            if(updatedRow instanceof Bridge) {
-                Bridge bridge = (Bridge)updatedRow;
-                final InstanceIdentifier<Node> nodePath = key.toInstanceIndentifier();
-                Optional<Node> node = Optional.absent();
-                try{
-                    node = transaction.read(LogicalDatastoreType.OPERATIONAL, nodePath).checkedGet();
-                }catch (final ReadFailedException e) {
-                    LOG.debug("Read Operational/DS for Node fail! {}", nodePath, e);
+        Map<UUID,Bridge> updatedBridgeRows = TyperUtils.extractRowsUpdated(Bridge.class, getUpdates(), getDbSchema());
+        Map<UUID,Controller> updatedControllerRows = TyperUtils.extractRowsUpdated(Controller.class, getUpdates(), getDbSchema());
+        for(Entry<UUID, Bridge> entry : updatedBridgeRows.entrySet()) {
+            Bridge bridge = entry.getValue();
+            final InstanceIdentifier<Node> nodePath = getKey().toInstanceIndentifier();
+            Optional<Node> node = Optional.absent();
+            try{
+                node = transaction.read(LogicalDatastoreType.OPERATIONAL, nodePath).checkedGet();
+            }catch (final ReadFailedException e) {
+                LOG.debug("Read Operational/DS for Node fail! {}", nodePath, e);
+            }
+            if(node.isPresent()){
+                LOG.debug("Node {} is present",node);
+                NodeBuilder managedNodeBuilder = new NodeBuilder();
+                NodeId manageNodeId = SouthboundMapper.createManagedNodeId(getKey(), new OvsdbBridgeName(bridge.getName()));
+                managedNodeBuilder.setNodeId(manageNodeId);
+                OvsdbBridgeAugmentationBuilder ovsdbManagedNodeBuilder = new OvsdbBridgeAugmentationBuilder();
+                ovsdbManagedNodeBuilder.setBridgeName(new OvsdbBridgeName(bridge.getName()));
+                ovsdbManagedNodeBuilder.setBridgeUuid(new Uuid(bridge.getUuid().toString()));
+                DatapathId dpid= SouthboundMapper.createDatapathId(bridge);
+                if(dpid != null) {
+                    ovsdbManagedNodeBuilder.setDatapathId(dpid);
+                }
+                ovsdbManagedNodeBuilder.setDatapathType(SouthboundMapper.createDatapathType(bridge.getDatapathTypeColumn().getData()));
+                if(SouthboundMapper.createMdsalProtocols(bridge) != null
+                        && SouthboundMapper.createMdsalProtocols(bridge).size() > 0) {
+                    ovsdbManagedNodeBuilder.setProtocolEntry(SouthboundMapper.createMdsalProtocols(bridge));
                 }
-                if(node.isPresent()){
-                    LOG.info("Node {} is present",node);
-                    NodeBuilder managedNodeBuilder = new NodeBuilder();
-                    NodeId manageNodeId = SouthboundMapper.createManagedNodeId(key, bridge.getUuid());
-                    managedNodeBuilder.setNodeId(manageNodeId);
 
-                    OvsdbManagedNodeAugmentationBuilder ovsdbManagedNodeBuilder = new OvsdbManagedNodeAugmentationBuilder();
-                    ovsdbManagedNodeBuilder.setBridgeName(bridge.getName());
-                    ovsdbManagedNodeBuilder.setBridgeUuid(new Uuid(bridge.getUuid().toString()));
-                    ovsdbManagedNodeBuilder.setManagedBy(new OvsdbNodeRef(nodePath));
-                    managedNodeBuilder.addAugmentation(OvsdbManagedNodeAugmentation.class, ovsdbManagedNodeBuilder.build());
+                if(!SouthboundMapper.createControllerEntries(bridge, updatedControllerRows).isEmpty()) {
+                    ovsdbManagedNodeBuilder.setControllerEntry(SouthboundMapper.createControllerEntries(bridge, updatedControllerRows));
+                }
+
+                if(bridge.getFailModeColumn() != null &&
+                        bridge.getFailModeColumn().getData() != null &&
+                        !bridge.getFailModeColumn().getData().isEmpty()) {
+                    String[] failmodeArray = new String[bridge.getFailModeColumn().getData().size()];
+                    bridge.getFailModeColumn().getData().toArray(failmodeArray);
+                    ovsdbManagedNodeBuilder.setFailMode(SouthboundConstants.OVSDB_FAIL_MODE_MAP.inverse().get(failmodeArray[0]));
+                }
+                ovsdbManagedNodeBuilder.setManagedBy(new OvsdbNodeRef(nodePath));
+                managedNodeBuilder.addAugmentation(OvsdbBridgeAugmentation.class, ovsdbManagedNodeBuilder.build());
 
-                    InstanceIdentifier<Node> managedNodePath = InstanceIdentifier
-                            .create(NetworkTopology.class)
-                            .child(Topology.class, new TopologyKey(SouthboundConstants.OVSDB_TOPOLOGY_ID))
-                            .child(Node.class,new NodeKey(manageNodeId));
+                InstanceIdentifier<Node> managedNodePath = SouthboundMapper.createInstanceIdentifier(manageNodeId);
 
-                    LOG.debug("Store managed node augmentation data {}",ovsdbManagedNodeBuilder.toString());
-                    transaction.put(LogicalDatastoreType.OPERATIONAL, managedNodePath, managedNodeBuilder.build());
+                LOG.debug("Store managed node augmentation data {}",ovsdbManagedNodeBuilder.toString());
+                transaction.merge(LogicalDatastoreType.OPERATIONAL, managedNodePath, managedNodeBuilder.build());
 
-                    //Update node with managed node reference
-                    NodeBuilder nodeBuilder = new NodeBuilder();
-                    nodeBuilder.setNodeId(SouthboundMapper.createNodeId(key.getIp(),key.getPort()));
+                //Update node with managed node reference
+                NodeBuilder nodeBuilder = new NodeBuilder();
+                nodeBuilder.setNodeId(SouthboundMapper.createNodeId(getKey().getIp(),getKey().getPort()));
 
-                    OvsdbNodeAugmentationBuilder ovsdbNodeBuilder = new OvsdbNodeAugmentationBuilder();
-                    List<OvsdbBridgeRef> managedNodes = new ArrayList<OvsdbBridgeRef>();
-                    managedNodes.add(new OvsdbBridgeRef(managedNodePath));
-                    ovsdbNodeBuilder.setManagedNodeEntry(managedNodes);
+                OvsdbNodeAugmentationBuilder ovsdbNodeBuilder = new OvsdbNodeAugmentationBuilder();
+                List<ManagedNodeEntry> managedNodes = new ArrayList<ManagedNodeEntry>();
+                ManagedNodeEntry managedNodeEntry = new ManagedNodeEntryBuilder().setBridgeRef(new OvsdbBridgeRef(managedNodePath)).build();
+                managedNodes.add(managedNodeEntry);
+                ovsdbNodeBuilder.setManagedNodeEntry(managedNodes);
 
-                    nodeBuilder.addAugmentation(OvsdbNodeAugmentation.class, ovsdbNodeBuilder.build());
+                nodeBuilder.addAugmentation(OvsdbNodeAugmentation.class, ovsdbNodeBuilder.build());
 
-                    LOG.debug("Update node with managed node ref {}",ovsdbNodeBuilder.toString());
-                    transaction.merge(LogicalDatastoreType.OPERATIONAL, nodePath, nodeBuilder.build());
+                LOG.debug("Update node with managed node ref {}",ovsdbNodeBuilder.toString());
+                transaction.merge(LogicalDatastoreType.OPERATIONAL, nodePath, nodeBuilder.build());
 
-                }
             }
         }
     }