Merge "Use single-argument form of firstKeyOf()"
[ovsdb.git] / southbound / southbound-impl / src / main / java / org / opendaylight / ovsdb / southbound / transactions / md / OpenVSwitchUpdateCommand.java
index 9fe2f7990151a3f162d6747df1579fb42c9318cc..2e132d60d036f135648718cc6f6f3f22248cae7b 100644 (file)
@@ -38,6 +38,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.re
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.OpenvswitchExternalIdsKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.OpenvswitchOtherConfigs;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.OpenvswitchOtherConfigsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.OpenvswitchOtherConfigsKey;
 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.NodeKey;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
@@ -52,8 +53,7 @@ import org.slf4j.LoggerFactory;
 
 public class OpenVSwitchUpdateCommand extends AbstractTransactionCommand {
 
-    private static final Logger LOG = LoggerFactory
-            .getLogger(OpenVSwitchUpdateCommand.class);
+    private static final Logger LOG = LoggerFactory.getLogger(OpenVSwitchUpdateCommand.class);
 
     public OpenVSwitchUpdateCommand(OvsdbConnectionInstance key, TableUpdates updates,
             DatabaseSchema dbSchema) {
@@ -80,7 +80,7 @@ public class OpenVSwitchUpdateCommand extends AbstractTransactionCommand {
             setDataPathTypes(ovsdbNodeBuilder, openVSwitch);
             setInterfaceTypes(ovsdbNodeBuilder, openVSwitch);
             setExternalIds(transaction, ovsdbNodeBuilder, oldEntry, openVSwitch);
-            setOtherConfig(ovsdbNodeBuilder, openVSwitch);
+            setOtherConfig(transaction, ovsdbNodeBuilder, oldEntry, openVSwitch);
             ovsdbNodeBuilder.setConnectionInfo(getConnectionInfo());
 
             NodeBuilder nodeBuilder = new NodeBuilder();
@@ -92,24 +92,53 @@ public class OpenVSwitchUpdateCommand extends AbstractTransactionCommand {
         }
     }
 
-    private void setOtherConfig(OvsdbNodeAugmentationBuilder ovsdbNodeBuilder,
-            OpenVSwitch openVSwitch) {
-        Map<String, String> otherConfigs = openVSwitch.getOtherConfigColumn().getData();
-        if (otherConfigs != null && !otherConfigs.isEmpty()) {
-            Set<String> otherConfigKeys = otherConfigs.keySet();
-            List<OpenvswitchOtherConfigs> otherConfigsList = new ArrayList<OpenvswitchOtherConfigs>();
-            String otherConfigValue;
-            for (String otherConfigKey : otherConfigKeys) {
-                otherConfigValue = otherConfigs.get(otherConfigKey);
-                if (otherConfigKey != null && otherConfigValue != null) {
-                    otherConfigsList.add(new OpenvswitchOtherConfigsBuilder()
-                            .setOtherConfigKey(otherConfigKey)
-                            .setOtherConfigValue(otherConfigValue)
-                            .build());
-                }
+    private void setOtherConfig(ReadWriteTransaction transaction,
+            OvsdbNodeAugmentationBuilder ovsdbNodeBuilder, OpenVSwitch oldEntry, OpenVSwitch openVSwitch) {
+        Map<String, String> oldOtherConfigs = null;
+        Map<String, String> otherConfigs = null;
+
+        if (openVSwitch.getOtherConfigColumn() != null) {
+            otherConfigs = openVSwitch.getOtherConfigColumn().getData();
+        }
+        if (oldEntry != null && oldEntry.getOtherConfigColumn() != null) {
+            oldOtherConfigs = oldEntry.getOtherConfigColumn().getData();
+        }
+        if ((oldOtherConfigs == null) || oldOtherConfigs.isEmpty()) {
+            setNewOtherConfigs(ovsdbNodeBuilder, otherConfigs);
+        } else if (otherConfigs != null && !otherConfigs.isEmpty()) {
+            removeOldConfigs(transaction, oldOtherConfigs, openVSwitch);
+            setNewOtherConfigs(ovsdbNodeBuilder, otherConfigs);
+        }
+    }
+
+    private void removeOldConfigs(ReadWriteTransaction transaction, Map<String, String> oldOtherConfigs,
+            OpenVSwitch ovs) {
+        InstanceIdentifier<OvsdbNodeAugmentation> nodeAugmentataionIid = InstanceIdentifier
+                .create(NetworkTopology.class)
+                .child(Topology.class, new TopologyKey(SouthboundConstants.OVSDB_TOPOLOGY_ID))
+                .child(Node.class, new NodeKey(getNodeId(ovs))).augmentation(OvsdbNodeAugmentation.class);
+        Set<String> otherConfigKeys = oldOtherConfigs.keySet();
+        for (String otherConfigKey : otherConfigKeys) {
+            KeyedInstanceIdentifier<OpenvswitchOtherConfigs, OpenvswitchOtherConfigsKey> externalIid =
+                    nodeAugmentataionIid
+                    .child(OpenvswitchOtherConfigs.class, new OpenvswitchOtherConfigsKey(otherConfigKey));
+            transaction.delete(LogicalDatastoreType.OPERATIONAL, externalIid);
+        }
+    }
+
+    private void setNewOtherConfigs(OvsdbNodeAugmentationBuilder ovsdbNodeBuilder,
+            Map<String, String> otherConfigs) {
+        Set<String> otherConfigKeys = otherConfigs.keySet();
+        List<OpenvswitchOtherConfigs> otherConfigsList = new ArrayList<>();
+        String otherConfigValue;
+        for (String otherConfigKey : otherConfigKeys) {
+            otherConfigValue = otherConfigs.get(otherConfigKey);
+            if (otherConfigKey != null && otherConfigValue != null) {
+                otherConfigsList.add(new OpenvswitchOtherConfigsBuilder().setOtherConfigKey(otherConfigKey)
+                        .setOtherConfigValue(otherConfigValue).build());
             }
-            ovsdbNodeBuilder.setOpenvswitchOtherConfigs(otherConfigsList);
         }
+        ovsdbNodeBuilder.setOpenvswitchOtherConfigs(otherConfigsList);
     }
 
     private void setExternalIds(ReadWriteTransaction transaction,
@@ -149,7 +178,7 @@ public class OpenVSwitchUpdateCommand extends AbstractTransactionCommand {
     private void setNewExternalIds(OvsdbNodeAugmentationBuilder ovsdbNodeBuilder,
             Map<String, String> externalIds) {
         Set<String> externalIdKeys = externalIds.keySet();
-        List<OpenvswitchExternalIds> externalIdsList = new ArrayList<OpenvswitchExternalIds>();
+        List<OpenvswitchExternalIds> externalIdsList = new ArrayList<>();
         String externalIdValue;
         for (String externalIdKey : externalIdKeys) {
             externalIdValue = externalIds.get(externalIdKey);
@@ -166,17 +195,21 @@ public class OpenVSwitchUpdateCommand extends AbstractTransactionCommand {
             OpenVSwitch openVSwitch) {
         try {
             Set<String> iftypes = openVSwitch.getIfaceTypesColumn().getData();
-            List<InterfaceTypeEntry> ifEntryList = new ArrayList<InterfaceTypeEntry>();
+            List<InterfaceTypeEntry> ifEntryList = new ArrayList<>();
             for (String ifType : iftypes) {
-                InterfaceTypeEntry ifEntry = new InterfaceTypeEntryBuilder()
-                        .setInterfaceType(
-                                SouthboundMapper.createInterfaceType(ifType))
-                        .build();
-                ifEntryList.add(ifEntry);
+                if (SouthboundMapper.createInterfaceType(ifType) != null) {
+                    InterfaceTypeEntry ifEntry = new InterfaceTypeEntryBuilder()
+                            .setInterfaceType(
+                                    SouthboundMapper.createInterfaceType(ifType))
+                            .build();
+                    ifEntryList.add(ifEntry);
+                } else {
+                    LOG.warn("Interface type {} not present in model", ifType);
+                }
             }
             ovsdbNodeBuilder.setInterfaceTypeEntry(ifEntryList);
         } catch (SchemaVersionMismatchException e) {
-            LOG.debug("Iface types  not supported by this version of ovsdb",e);;
+            LOG.debug("Iface types  not supported by this version of ovsdb",e);
         }
     }
 
@@ -186,13 +219,17 @@ public class OpenVSwitchUpdateCommand extends AbstractTransactionCommand {
         try {
             Set<String> dptypes = openVSwitch.getDatapathTypesColumn()
                     .getData();
-            List<DatapathTypeEntry> dpEntryList = new ArrayList<DatapathTypeEntry>();
+            List<DatapathTypeEntry> dpEntryList = new ArrayList<>();
             for (String dpType : dptypes) {
-                DatapathTypeEntry dpEntry = new DatapathTypeEntryBuilder()
-                        .setDatapathType(
-                                SouthboundMapper.createDatapathType(dpType))
-                        .build();
-                dpEntryList.add(dpEntry);
+                if (SouthboundMapper.createDatapathType(dpType) != null) {
+                    DatapathTypeEntry dpEntry = new DatapathTypeEntryBuilder()
+                            .setDatapathType(
+                                    SouthboundMapper.createDatapathType(dpType))
+                            .build();
+                    dpEntryList.add(dpEntry);
+                } else {
+                    LOG.warn("Datapath type {} not present in model", dpType);
+                }
             }
             ovsdbNodeBuilder.setDatapathTypeEntry(dpEntryList);
         } catch (SchemaVersionMismatchException e) {
@@ -232,7 +269,7 @@ public class OpenVSwitchUpdateCommand extends AbstractTransactionCommand {
     }
 
     private NodeId getNodeId(OpenVSwitch ovs) {
-        NodeKey nodeKey = getInstanceIdentifier(ovs).firstKeyOf(Node.class, NodeKey.class);
+        NodeKey nodeKey = getInstanceIdentifier(ovs).firstKeyOf(Node.class);
         return nodeKey.getNodeId();
     }
 }