BUG-2794: incorporate openflowjava api changes to openflowplugin
[openflowplugin.git] / openflowplugin / src / main / java / org / opendaylight / openflowplugin / openflow / md / util / InventoryDataServiceUtil.java
index 51708714be0edaf8307669e76c8edb25ff14174b..b4a675f4534565557e8a6dbf9fa6cd9cb9021555 100644 (file)
@@ -7,9 +7,16 @@
  */
 package org.opendaylight.openflowplugin.openflow.md.util;
 
+import com.google.common.base.Optional;
+import java.math.BigInteger;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
 import org.apache.commons.lang3.StringUtils;
-import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
+import org.opendaylight.controller.md.sal.binding.api.ReadTransaction;
+import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.openflowplugin.openflow.md.core.session.OFSessionUtil;
+import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorUpdatedBuilder;
@@ -22,13 +29,11 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.No
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
+import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.math.BigInteger;
-import java.util.List;
-
 public abstract class InventoryDataServiceUtil {
     private final static Logger LOG = LoggerFactory.getLogger(InventoryDataServiceUtil.class);
 
@@ -37,18 +42,16 @@ public abstract class InventoryDataServiceUtil {
      * Get an InstanceIdentifier for the Nodes class that is the root of the
      * inventory tree We use this alot, so its worth keeping around
      */
-    private static InstanceIdentifier<Nodes> nodesIdentifier = InstanceIdentifier.builder(Nodes.class)
-            .toInstance();
+    private static InstanceIdentifier<Nodes> nodesIdentifier = InstanceIdentifier.create(Nodes.class);
 
     public static Nodes checkForNodes() {
         Nodes nodes = null;
         LOG.error("Before Nodes - nodes: " + nodes);
         try {
-            nodes = (Nodes) OFSessionUtil.getSessionManager().getDataProviderService()
-                    .readOperationalData(nodesIdentifier);
+            nodes = getDataObject(OFSessionUtil.getSessionManager().getDataBroker().newReadOnlyTransaction(), nodesIdentifier);
         } catch (Exception e) {
             LOG.error(
-                    "Caught exception from OFSessionUtil.getSessionManager().getDataProviderService().readOperationalData",
+                    "Caught exception from OFSessionUtil.getSessionManager().getDataBroker().newReadWriteTransaction()",
                     e);
         }
         LOG.error("After Nodes- nodes: " + nodes);
@@ -56,44 +59,19 @@ public abstract class InventoryDataServiceUtil {
     }
 
     public static List<Node> readAllNodes() {
-        Nodes nodes = (Nodes) OFSessionUtil.getSessionManager().getDataProviderService()
-                .readOperationalData(nodesIdentifier);
+        Nodes nodes = getDataObject(OFSessionUtil.getSessionManager().getDataBroker().newReadOnlyTransaction(), nodesIdentifier);
         return nodes.getNode();
     }
 
     public static Node readNode(InstanceIdentifier<Node> instance) {
-        return (Node) OFSessionUtil.getSessionManager().getDataProviderService().readOperationalData(instance);
-    }
-
-    public static Node readNode(NodeRef nodeRef) {
-        return readNode((InstanceIdentifier<Node>) nodeRef.getValue());
-    }
-
-    public static Node readNode(NodeKey nodeKey) {
-        return readNode(nodeKeyToInstanceIdentifier(nodeKey));
-    }
-
-    public static Node readNode(NodeId nodeId) {
-        return readNode(new NodeKey(nodeId));
-    }
-
-    public static Node readNodeByDataPath(BigInteger datapathId) {
-        return (Node) OFSessionUtil.getSessionManager().getDataProviderService()
-                .readOperationalData(identifierFromDatapathId(datapathId));
-    }
-
-    public static void putNode(Node node) {
-        DataModificationTransaction transaction = OFSessionUtil.getSessionManager().getDataProviderService()
-                .beginTransaction();
-        transaction.putOperationalData(nodesIdentifier, node);
-        transaction.commit();
+        return (Node) getDataObject(OFSessionUtil.getSessionManager().getDataBroker().newReadOnlyTransaction(), instance);
     }
 
     public static void putNodeConnector(InstanceIdentifier<Node> instance, NodeConnector nodeConnector) {
-        DataModificationTransaction transaction = OFSessionUtil.getSessionManager().getDataProviderService()
-                .beginTransaction();
-        transaction.putOperationalData(instance, nodeConnector);
-        transaction.commit();
+        ReadWriteTransaction transaction = OFSessionUtil.getSessionManager().getDataBroker().newReadWriteTransaction();
+        InstanceIdentifier<NodeConnector> nodeConnectorID = instance.child(NodeConnector.class, nodeConnector.getKey());
+        transaction.merge(LogicalDatastoreType.OPERATIONAL, nodeConnectorID, nodeConnector);
+        transaction.submit();
     }
 
     public static void putNodeConnector(NodeKey nodeKey, NodeConnector nodeConnector) {
@@ -105,13 +83,9 @@ public abstract class InventoryDataServiceUtil {
         putNodeConnector(new NodeKey(nodeId), nodeConnector);
     }
 
-    public static void putNodeConnector(BigInteger datapathId, NodeConnector nodeConnector) {
-        putNodeConnector(new NodeId(OF_URI_PREFIX + datapathId), nodeConnector);
-    }
-
     public static InstanceIdentifier<Node> identifierFromDatapathId(BigInteger datapathId) {
         NodeKey nodeKey = nodeKeyFromDatapathId(datapathId);
-        return InstanceIdentifier.builder(Nodes.class).child(Node.class, nodeKey).toInstance();
+        return InstanceIdentifier.builder(Nodes.class).child(Node.class, nodeKey).build();
     }
 
     public static NodeKey nodeKeyFromDatapathId(BigInteger datapathId) {
@@ -130,75 +104,70 @@ public abstract class InventoryDataServiceUtil {
         String current = datapathId.toString();
         return new NodeId(OF_URI_PREFIX + current);
     }
-    
+
     public static BigInteger dataPathIdFromNodeId(NodeId nodeId) {
         String dpids = nodeId.getValue().replace(OF_URI_PREFIX, "");
         BigInteger dpid = new BigInteger(dpids);
         return dpid;
     }
 
-    public static NodeRef nodeRefFromNode(Node node) {
-        return nodeRefFromNodeKey(node.getKey());
-    }
 
     public static NodeRef nodeRefFromNodeKey(NodeKey nodeKey) {
         return new NodeRef(nodeKeyToInstanceIdentifier(nodeKey));
     }
 
     public static InstanceIdentifier<Node> nodeKeyToInstanceIdentifier(NodeKey nodeKey) {
-        return InstanceIdentifier.builder(Nodes.class).child(Node.class, nodeKey).toInstance();
+        return InstanceIdentifier.builder(Nodes.class).child(Node.class, nodeKey).build();
     }
 
-    public static InstanceIdentifier<Node> nodeIdToInstanceIdentifier(NodeId nodeId) {
-        return nodeKeyToInstanceIdentifier(new NodeKey(nodeId));
+    public static NodeConnectorId nodeConnectorIdfromDatapathPortNo(BigInteger datapathid, Long portNo,
+                                                                    OpenflowVersion ofVersion) {
+        String logicalName = OpenflowPortsUtil.getPortLogicalName(ofVersion, portNo);
+        return new NodeConnectorId(OF_URI_PREFIX + datapathid + ":" + (logicalName == null ? portNo : logicalName));
     }
 
-    public static NodeConnectorId nodeConnectorIdfromDatapathPortNo(BigInteger datapathid, Long portNo) {
-        return new NodeConnectorId(OF_URI_PREFIX + datapathid + ":" + portNo);
-    }
-    
-    public static Long portNumberfromNodeConnectorId(NodeConnectorId ncId) {
-        return portNumberfromNodeConnectorId(ncId.getValue());
+    public static Long portNumberfromNodeConnectorId(OpenflowVersion ofVersion, NodeConnectorId ncId) {
+        return portNumberfromNodeConnectorId(ofVersion, ncId.getValue());
     }
 
-    public static Long portNumberfromNodeConnectorId(String ncId){
+    public static Long portNumberfromNodeConnectorId(OpenflowVersion ofVersion, String ncId) {
         String[] split = ncId.split(":");
 
+        // It can happen that token length will be just 1 i.e 2 or CONTROLLER
         // If the length is just one then this cannot be the new MD-SAL style node connector Id which
         // is of the form openflow:1:3.
-        if(split.length == 1){
-            return Long.decode(ncId);
-        }
-        String portNoString = split[split.length-1];
-        Long portNo = Long.decode(portNoString);
+
+        String portNoString = split[split.length - 1];
+        Long portNo = OpenflowPortsUtil.getPortFromLogicalName(ofVersion, portNoString);
         return portNo;
     }
 
 
-
-    public static NodeConnectorRef nodeConnectorRefFromDatapathIdPortno(BigInteger datapathId, Long portNo) {
-        return new NodeConnectorRef(nodeConnectorInstanceIdentifierFromDatapathIdPortno(datapathId, portNo));
+    public static NodeConnectorRef nodeConnectorRefFromDatapathIdPortno(BigInteger datapathId, Long portNo, OpenflowVersion ofVersion) {
+        return new NodeConnectorRef(nodeConnectorInstanceIdentifierFromDatapathIdPortno(datapathId, portNo, ofVersion));
     }
 
     public static InstanceIdentifier<NodeConnector> nodeConnectorInstanceIdentifierFromDatapathIdPortno(
-            BigInteger datapathId, Long portNo) {
+            BigInteger datapathId, Long portNo, OpenflowVersion ofVersion) {
         NodeId nodeId = nodeIdFromDatapathId(datapathId);
-        NodeConnectorId nodeConnectorId = nodeConnectorIdfromDatapathPortNo(datapathId, portNo);
+        NodeConnectorId nodeConnectorId = nodeConnectorIdfromDatapathPortNo(datapathId, portNo, ofVersion);
         return InstanceIdentifier.builder(Nodes.class) //
                 .child(Node.class, new NodeKey(nodeId)) //
-                .child(NodeConnector.class, new NodeConnectorKey(nodeConnectorId)).toInstance();
+                .child(NodeConnector.class, new NodeConnectorKey(nodeConnectorId)).build();
     }
 
-    public static NodeConnectorUpdatedBuilder nodeConnectorUpdatedBuilderFromDatapathIdPortNo(BigInteger datapathId, Long portNo) {
+    public static NodeConnectorUpdatedBuilder nodeConnectorUpdatedBuilderFromDatapathIdPortNo(BigInteger datapathId,
+                                                                                              Long portNo, OpenflowVersion ofVersion) {
         NodeConnectorUpdatedBuilder builder = new NodeConnectorUpdatedBuilder();
-        builder.setId(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId,portNo));
-        builder.setNodeConnectorRef(InventoryDataServiceUtil.nodeConnectorRefFromDatapathIdPortno(datapathId,portNo));
+        builder.setId(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId, portNo, ofVersion));
+        builder.setNodeConnectorRef(InventoryDataServiceUtil.nodeConnectorRefFromDatapathIdPortno(datapathId, portNo, ofVersion));
         return builder;
     }
 
-    public static NodeConnectorBuilder nodeConnectorBuilderFromDatapathIdPortNo(BigInteger datapathId, Long portNo) {
+    public static NodeConnectorBuilder nodeConnectorBuilderFromDatapathIdPortNo(BigInteger datapathId,
+                                                                                Long portNo, OpenflowVersion ofVersion) {
         NodeConnectorBuilder builder = new NodeConnectorBuilder();
-        builder.setId(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId,portNo));
+        builder.setId(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId, portNo, ofVersion));
         return builder;
     }
 
@@ -207,6 +176,21 @@ public abstract class InventoryDataServiceUtil {
      * @return string of size 16, padded with '0'
      */
     public static String bigIntegerToPaddedHex(BigInteger dataPathId) {
-        return StringUtils.leftPad(dataPathId.toString(16),16,"0");
+        return StringUtils.leftPad(dataPathId.toString(16), 16, "0");
     }
-}
+
+    //TODO : create new module openflowplugin-util, move there this method along with TestProviderTransactionUtil#getDataObject
+    private static <T extends DataObject> T getDataObject(ReadTransaction readOnlyTransaction, InstanceIdentifier<T> identifier) {
+        Optional<T> optionalData = null;
+        try {
+            optionalData = readOnlyTransaction.read(LogicalDatastoreType.OPERATIONAL, identifier).get();
+            if (optionalData.isPresent()) {
+                return optionalData.get();
+            }
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("Read transaction for identifier {} failed.", identifier, e);
+        }
+        return null;
+    }
+
+}
\ No newline at end of file