Merge "Bug 5117 - DOS chars in shell script"
[groupbasedpolicy.git] / neutron-ovsdb / src / main / java / org / opendaylight / groupbasedpolicy / neutron / ovsdb / util / InventoryHelper.java
index 7ec29c0961cee178a28cd3666a0a927050e7fca9..3a4d00156daf7c8326713bf11cb87c9db7bcabe0 100755 (executable)
@@ -7,15 +7,23 @@
  */
 package org.opendaylight.groupbasedpolicy.neutron.ovsdb.util;
 
-import com.google.common.base.Optional;
+import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.OvsdbHelper.getOvsdbBridgeFromTerminationPoint;
+import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.OvsdbHelper.getOvsdbTerminationPoint;
+import static org.opendaylight.groupbasedpolicy.util.DataStoreHelper.readFromDs;
+import static org.opendaylight.groupbasedpolicy.util.DataStoreHelper.submitToDs;
+
+import java.util.ArrayList;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
+
 import org.apache.commons.lang3.StringUtils;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.groupbasedpolicy.neutron.ovsdb.AbstractTunnelType;
+import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayNodeConfig;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayNodeConfigBuilder;
@@ -24,7 +32,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.nodes.node.ExternalInterfacesKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.nodes.node.Tunnel;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.nodes.node.TunnelBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.nodes.node.TunnelKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
@@ -37,15 +44,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.OvsdbHelper.getOvsdbBridgeFromTerminationPoint;
-import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.OvsdbHelper.getOvsdbTerminationPoint;
-import static org.opendaylight.groupbasedpolicy.util.DataStoreHelper.readFromDs;
-import static org.opendaylight.groupbasedpolicy.util.DataStoreHelper.submitToDs;
+import com.google.common.base.Optional;
 
 public class InventoryHelper {
 
@@ -74,7 +73,9 @@ public class InventoryHelper {
      * augmentation, converting that to a Long, and prepending it with the
      * "openflow:" prefix.
      *
-     * @param ovsdbBridge The OVSDB bridge augmentation
+     * @param ovsdbBridge The {@link OvsdbBridgeAugmentation}
+     * @param ovsdbTpIid the {@link OvsdbTerminationPointAugmentation}
+     * @param dataBroker the {@link DataBroker}
      * @return String representation of the Inventory NodeId, null if it fails
      */
     public static String getInventoryNodeIdString(OvsdbBridgeAugmentation ovsdbBridge,
@@ -105,6 +106,8 @@ public class InventoryHelper {
      *
      * @param inventoryNodeId The string representation of the Inventory NodeId
      * @param ovsdbTp The {@link OvsdbTerminationPointAugmentation}
+     * @param tpIid the InstanceIdentifier for OvsdbTerminationPointAugmentation
+     * @param dataBroker the {@link DataBroker}
      * @return String representation of the Inventory NodeConnectorId, null if it fails
      */
     public static String getInventoryNodeConnectorIdString(String inventoryNodeId,
@@ -139,6 +142,9 @@ public class InventoryHelper {
      * Inventory Node, and verify that the tunnel types we need
      * are present
      *
+     * @param nodeIdString The inventory node id string
+     * @param requiredTunnelTypes the list of tunnel types
+     * @param dataBroker the {@link DataBroker}
      * @return true if tunnel types are present, false otherwise
      */
     public static boolean checkOfOverlayConfig(String nodeIdString, List<AbstractTunnelType> requiredTunnelTypes,
@@ -168,9 +174,9 @@ public class InventoryHelper {
         return true;
     }
 
-    public static void addOfOverlayExternalPort(String nodeIdString, NodeConnectorId ncId, DataBroker dataBroker) {
+    public static InstanceIdentifier<ExternalInterfaces> addOfOverlayExternalPort(NodeId nodeId, NodeConnectorId ncId, DataBroker dataBroker) {
         InstanceIdentifier<ExternalInterfaces> nodeExternalInterfacesIid = InstanceIdentifier.builder(Nodes.class)
-            .child(Node.class, new NodeKey(new NodeId(nodeIdString)))
+            .child(Node.class, new NodeKey(nodeId))
             .augmentation(OfOverlayNodeConfig.class)
             .child(ExternalInterfaces.class, new ExternalInterfacesKey(ncId))
             .build();
@@ -178,10 +184,11 @@ public class InventoryHelper {
         ExternalInterfaces externalInterfaces = new ExternalInterfacesBuilder().setKey(new ExternalInterfacesKey(ncId))
             .setNodeConnectorId(ncId)
             .build();
-        WriteTransaction transaction = dataBroker.newReadWriteTransaction();
+        WriteTransaction transaction = dataBroker.newWriteOnlyTransaction();
         transaction.put(LogicalDatastoreType.CONFIGURATION, nodeExternalInterfacesIid, externalInterfaces, true);
-        submitToDs(transaction);
-        LOG.trace("Added external interface node connector {} to node {}", ncId.getValue(), nodeIdString);
+        DataStoreHelper.submitToDs(transaction);
+        LOG.trace("Added external interface node connector {} to node {}", ncId.getValue(), nodeId.getValue());
+        return nodeExternalInterfacesIid;
     }
 
     public static OfOverlayNodeConfig getOfOverlayConfig(String nodeIdString, DataBroker dataBroker) {
@@ -199,26 +206,15 @@ public class InventoryHelper {
         return null;
     }
 
-    private static boolean addOfOverlayAugmentation(OfOverlayNodeConfig config, String nodeIdString, DataBroker dataBroker) {
-        InstanceIdentifier<OfOverlayNodeConfig> ofOverlayNodeIid = InstanceIdentifier.builder(Nodes.class)
-            .child(Node.class, new NodeKey(new NodeId(nodeIdString)))
-            .augmentation(OfOverlayNodeConfig.class)
-            .build();
-
-        WriteTransaction transaction = dataBroker.newReadWriteTransaction();
-        transaction.put(LogicalDatastoreType.CONFIGURATION, ofOverlayNodeIid, config, true);
-        return submitToDs(transaction);
-    }
-
     /**
-     * Update the {@link OfOverlayConfig} of an Inventory Node
+     * Update the {@link OfOverlayNodeConfig} of an Inventory Node
      * using the new tunnel state.
      *
-     * @param ip
-     * @param nodeIdString
-     * @param nodeConnectorIdString
-     * @param tunnelType
-     * @param dataBroker
+     * @param ip the ipaddress
+     * @param nodeIdString the string representation of the inventory NodeId
+     * @param nodeConnectorIdString the string representation of the inventory NodeConnectorId
+     * @param tunnelType the tunnel type
+     * @param dataBroker the {@link DataBroker}
      */
     public static void updateOfOverlayConfig(IpAddress ip, String nodeIdString, String nodeConnectorIdString,
             AbstractTunnelType tunnelType, DataBroker dataBroker) {
@@ -283,7 +279,7 @@ public class InventoryHelper {
             ofOverlayNodeConfigBuilder.setTunnel(new ArrayList<Tunnel>(existingTunnels));
         }
         OfOverlayNodeConfig newConfig = ofOverlayNodeConfigBuilder.build();
-        if (addOfOverlayAugmentation(newConfig, nodeIdString, dataBroker)) {
+        if (addOfOverlayConfig(newConfig, new NodeId(nodeIdString), dataBroker)) {
             LOG.trace("updateOfOverlayConfig - Added Tunnel: {} to Node: {} at NodeConnector: {}",tunnelBuilder.build(), nodeIdString, nodeConnectorIdString);
             return;
         } else {
@@ -315,14 +311,42 @@ public class InventoryHelper {
 
         // runs only if some tunnels were really removed
         if (existingTunnels.removeAll(tunnelsToRemove)) {
-            OfOverlayNodeConfigBuilder ofOverlayBuilder;
-            if (ofConfig == null) {
-                ofOverlayBuilder = new OfOverlayNodeConfigBuilder();
-            } else {
-                ofOverlayBuilder = new OfOverlayNodeConfigBuilder(ofConfig);
+            ReadWriteTransaction wTx = dataBroker.newReadWriteTransaction();
+            for (Tunnel tunnel : tunnelsToRemove) {
+                InstanceIdentifier<Tunnel> tunnelIid = InstanceIdentifier.builder(Nodes.class)
+                    .child(Node.class, new NodeKey(new NodeId(nodeIdString)))
+                    .augmentation(OfOverlayNodeConfig.class)
+                    .child(Tunnel.class, tunnel.getKey())
+                    .build();
+                wTx.delete(LogicalDatastoreType.CONFIGURATION, tunnelIid);
+                LOG.trace("Removing tunnel: {} from node {}",tunnel, nodeIdString);
             }
-            ofOverlayBuilder.setTunnel(existingTunnels);
-            addOfOverlayAugmentation(ofOverlayBuilder.build(), nodeIdString, dataBroker);
+            submitToDs(wTx);
+        }
+    }
+
+    private static boolean addOfOverlayConfig(OfOverlayNodeConfig newConfig, NodeId nodeId, DataBroker dataBroker) {
+        ReadWriteTransaction wTx = dataBroker.newReadWriteTransaction();
+        InstanceIdentifier<OfOverlayNodeConfig> ofOverlayNodeIid = InstanceIdentifier.builder(Nodes.class)
+            .child(Node.class, new NodeKey(nodeId))
+            .augmentation(OfOverlayNodeConfig.class)
+            .build();
+        wTx.put(LogicalDatastoreType.CONFIGURATION, ofOverlayNodeIid, newConfig, true);
+        LOG.trace("Adding tunnel: {} to node {}", newConfig, nodeId.getValue());
+        return submitToDs(wTx);
+    }
+
+    private static boolean addTunnelsOfOverlayConfig(List<Tunnel> tunnels, NodeId nodeId, DataBroker dataBroker) {
+        ReadWriteTransaction wTx = dataBroker.newReadWriteTransaction();
+        for (Tunnel tunnel : tunnels) {
+            InstanceIdentifier<Tunnel> tunnelIid = InstanceIdentifier.builder(Nodes.class)
+                .child(Node.class, new NodeKey(nodeId))
+                .augmentation(OfOverlayNodeConfig.class)
+                .child(Tunnel.class, tunnel.getKey())
+                .build();
+            wTx.put(LogicalDatastoreType.CONFIGURATION, tunnelIid, tunnel, true);
+            LOG.trace("Adding tunnel: {} to node {}",tunnel, nodeId.getValue());
         }
+        return submitToDs(wTx);
     }
 }