Possible fix for OfOverlay overwrite (#2).
[groupbasedpolicy.git] / neutron-ovsdb / src / main / java / org / opendaylight / groupbasedpolicy / neutron / ovsdb / util / InventoryHelper.java
index 2cbca5eb969c9f35b213fda62824f8dc1785bd9e..9056c92aa922ada5ff3b0855d3272af2b3631ac4 100644 (file)
@@ -7,10 +7,9 @@
  */
 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.neutron.ovsdb.util.OvsdbHelper.getOvsdbBridge;
+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;
 
 import java.util.ArrayList;
@@ -25,8 +24,12 @@ import org.opendaylight.groupbasedpolicy.neutron.ovsdb.AbstractTunnelType;
 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;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.nodes.node.ExternalInterfaces;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.nodes.node.ExternalInterfacesBuilder;
+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;
@@ -43,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;
     /**
@@ -59,7 +81,7 @@ public class InventoryHelper {
             InstanceIdentifier<OvsdbTerminationPointAugmentation> ovsdbTpIid, DataBroker dataBroker) {
         DatapathId dpid = ovsdbBridge.getDatapathId();
         if (dpid == null) {
-            OvsdbBridgeAugmentation bridgeData = getOvsdbBridge(ovsdbTpIid, dataBroker);
+            OvsdbBridgeAugmentation bridgeData = getOvsdbBridgeFromTerminationPoint(ovsdbTpIid, dataBroker);
             dpid = bridgeData.getDatapathId();
             if (dpid == null) {
                 LOG.error("No Data Path ID for OVSDB Bridge {}", ovsdbBridge);
@@ -150,6 +172,24 @@ public class InventoryHelper {
         return true;
     }
 
+    public static void addOfOverlayExternalPort(String nodeIdString, NodeConnectorId ncId, DataBroker dataBroker) {
+        InstanceIdentifier<ExternalInterfaces> nodeExternalInterfacesIid = InstanceIdentifier.builder(
+                Nodes.class)
+            .child(Node.class, new NodeKey(new NodeId(nodeIdString)))
+            .augmentation(OfOverlayNodeConfig.class)
+            .child(ExternalInterfaces.class,new ExternalInterfacesKey(ncId))
+            .build();
+
+        ExternalInterfaces externalInterfaces = new ExternalInterfacesBuilder()
+                                                .setKey(new ExternalInterfacesKey(ncId))
+                                                .setNodeConnectorId(ncId)
+                                                .build();
+        WriteTransaction transaction = dataBroker.newReadWriteTransaction();
+        transaction.put(LogicalDatastoreType.CONFIGURATION, nodeExternalInterfacesIid, externalInterfaces, true);
+        submitToDs(transaction);
+        LOG.trace("Added external interface node connector {} to node {}", ncId.getValue(),nodeIdString);
+    }
+
     public static OfOverlayNodeConfig getOfOverlayConfig(String nodeIdString, DataBroker dataBroker) {
         InstanceIdentifier<OfOverlayNodeConfig> ofOverlayNodeIid = InstanceIdentifier.builder(
                 Nodes.class)
@@ -177,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.
@@ -227,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);
         }
     }
 }