Possible fix for OfOverlay overwrite (#2).
[groupbasedpolicy.git] / neutron-ovsdb / src / main / java / org / opendaylight / groupbasedpolicy / neutron / ovsdb / util / InventoryHelper.java
index 9f2b398a6d17586b921022dd85e4e914a1cf699b..9056c92aa922ada5ff3b0855d3272af2b3631ac4 100644 (file)
@@ -7,9 +7,8 @@
  */
 package org.opendaylight.groupbasedpolicy.neutron.ovsdb.util;
 
-import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.DataStore.getLongFromDpid;
-import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.DataStore.readFromDs;
-import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.DataStore.submitToDs;
+import static org.opendaylight.groupbasedpolicy.util.DataStoreHelper.readFromDs;
+import static org.opendaylight.groupbasedpolicy.util.DataStoreHelper.submitToDs;
 import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.OvsdbHelper.getOvsdbBridgeFromTerminationPoint;
 import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.OvsdbHelper.getOvsdbTerminationPoint;
 
@@ -30,6 +29,7 @@ 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;
@@ -46,6 +46,25 @@ import com.google.common.base.Optional;
 
 public class InventoryHelper {
     private static final Logger LOG = LoggerFactory.getLogger(InventoryHelper.class);
+    private static final String HEX = "0x";
+
+    /**
+     * Convert an OpenFlow Datapath ID to a Long
+     *
+     * @param dpid The OpenFlow Datapath ID
+     * @return The Long representation of the DPID
+     */
+    public static Long getLongFromDpid(String dpid) {
+        String[] addressInBytes = dpid.split(":");
+        Long address =
+                (Long.decode(HEX + addressInBytes[2]) << 40) |
+                (Long.decode(HEX + addressInBytes[3]) << 32) |
+                (Long.decode(HEX + addressInBytes[4]) << 24) |
+                (Long.decode(HEX + addressInBytes[5]) << 16) |
+                (Long.decode(HEX + addressInBytes[6]) << 8 ) |
+                (Long.decode(HEX + addressInBytes[7]));
+        return address;
+    }
 
     private static final Long MAX_OF_PORT=65534L;
     /**
@@ -198,6 +217,19 @@ public class InventoryHelper {
         submitToDs(transaction);
     }
 
+    private static void addTunnelToOfOverlayAugmentation(Tunnel tunnel, String nodeIdString, DataBroker dataBroker) {
+        InstanceIdentifier<Tunnel> ofOverlayNodeIid = InstanceIdentifier.builder(
+                Nodes.class)
+            .child(Node.class, new NodeKey(new NodeId(nodeIdString)))
+            .augmentation(OfOverlayNodeConfig.class)
+            .child(Tunnel.class, new TunnelKey(tunnel.getKey()))
+            .build();
+
+        WriteTransaction transaction = dataBroker.newReadWriteTransaction();
+        transaction.merge(LogicalDatastoreType.CONFIGURATION, ofOverlayNodeIid, tunnel, true);
+        submitToDs(transaction);
+    }
+
     /**
      * Update the {@link OfOverlayConfig} of an Inventory Node
      * using the new tunnel state.
@@ -248,14 +280,9 @@ public class InventoryHelper {
             }
         }
         if (tunnelsUpdated == true) {
-            OfOverlayNodeConfigBuilder ofOverlayBuilder = null;
-            if (ofConfig == null) {
-                ofOverlayBuilder = new OfOverlayNodeConfigBuilder();
-            } else {
-                ofOverlayBuilder = new OfOverlayNodeConfigBuilder(ofConfig);
+            for (Tunnel tunnel: tunnelList) {
+                addTunnelToOfOverlayAugmentation(tunnel, nodeIdString, dataBroker);
             }
-            ofOverlayBuilder.setTunnel(tunnelList);
-            addOfOverlayAugmentation(ofOverlayBuilder.build(), nodeIdString, dataBroker);
         }
     }
 }