Support for reporting PortDesc and PortStatus changes 98/2998/4
authorEd Warnicke <eaw@cisco.com>
Fri, 22 Nov 2013 12:46:16 +0000 (13:46 +0100)
committerEd Warnicke <eaw@cisco.com>
Sat, 23 Nov 2013 23:46:59 +0000 (15:46 -0800)
Also cleaned up logging in MultipartMessageDescToNodeUpdatedTranslator
Expanded functions in InventoryDataServiceUtil
Added PortTranslatorUtil to expose reusable translator methods.

Change-Id: I4a5e1a5b12bab46a08ce2aafb9cb3e64240be3bd
Signed-off-by: Ed Warnicke <eaw@cisco.com>
Signed-off-by: Tony Tkacik <ttkacik@cisco.com>
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/ConnectionConductorImpl.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/MDController.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/SalRegistrationManager.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/MultiPartMessageDescToNodeUpdatedTranslator.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/MultiPartReplyPortToNodeConnectorUpdatedTranslator.java [new file with mode: 0644]
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/PortStatusMessageToNodeConnectorUpdatedTranslator.java [new file with mode: 0644]
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/util/InventoryDataServiceUtil.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/util/PortTranslatorUtil.java [new file with mode: 0644]

index 7ce355a1e0d12550d8f4cf9a7079d70639926ee5..1249855749e2b919eb466b368b8604635da71a50 100644 (file)
@@ -45,6 +45,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortStatusMessage;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyDesc;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestDescBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortDescBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.DisconnectEvent;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SwitchIdleEvent;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SystemNotificationsListener;
@@ -339,6 +340,7 @@ public class ConnectionConductorImpl implements OpenflowProtocolListener,
         conductorState = CONDUCTOR_STATE.WORKING;
         OFSessionUtil.registerSession(this, featureOutput, negotiatedVersion);
         requestDesc();
+        requestPorts();
     }
 
     /*
@@ -355,6 +357,16 @@ public class ConnectionConductorImpl implements OpenflowProtocolListener,
         getConnectionAdapter().multipartRequest(builder.build());
     }
 
+    private void requestPorts() {
+        MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();
+        builder.setType(MultipartType.OFPMPPORTDESC);
+        builder.setVersion(getVersion());
+        builder.setFlags(new MultipartRequestFlags(false));
+        builder.setMultipartRequestBody(new MultipartRequestPortDescBuilder().build());
+        builder.setXid(getSessionContext().getNextXid());
+        getConnectionAdapter().multipartRequest(builder.build());
+    }
+
     /**
      * @param isBitmapNegotiationEnable the isBitmapNegotiationEnable to set
      */
index 2362006618637cb3b38e7fa17fb967423be0a3c5..dadd6dab2042db20c0eb611505825009ed118f0e 100644 (file)
@@ -27,8 +27,11 @@ import org.opendaylight.openflowplugin.openflow.md.core.translator.ErrorTranslat
 import org.opendaylight.openflowplugin.openflow.md.core.translator.ExperimenterTranslator;
 import org.opendaylight.openflowplugin.openflow.md.core.translator.FlowRemovedTranslator;
 import org.opendaylight.openflowplugin.openflow.md.core.translator.MultiPartMessageDescToNodeUpdatedTranslator;
+import org.opendaylight.openflowplugin.openflow.md.core.translator.MultiPartReplyPortToNodeConnectorUpdatedTranslator;
 import org.opendaylight.openflowplugin.openflow.md.core.translator.PacketInTranslator;
+import org.opendaylight.openflowplugin.openflow.md.core.translator.PortStatusMessageToNodeConnectorUpdatedTranslator;
 import org.opendaylight.openflowplugin.openflow.md.queue.PopListener;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorUpdated;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeUpdated;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterMessage;
@@ -36,6 +39,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessage;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketInMessage;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortStatusMessage;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketReceived;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInput;
 import org.opendaylight.yangtools.yang.binding.DataObject;
@@ -81,11 +85,15 @@ public class MDController implements IMDController {
         addMessageTranslator(FlowRemovedMessage.class, OF13, new FlowRemovedTranslator());
         addMessageTranslator(PacketInMessage.class,OF10, new PacketInTranslator());
         addMessageTranslator(PacketInMessage.class,OF13, new PacketInTranslator());
+        addMessageTranslator(PortStatusMessage.class,OF10, new PortStatusMessageToNodeConnectorUpdatedTranslator());
+        addMessageTranslator(PortStatusMessage.class,OF13, new PortStatusMessageToNodeConnectorUpdatedTranslator());
+        addMessageTranslator(MultipartReplyMessage.class,OF13,new MultiPartReplyPortToNodeConnectorUpdatedTranslator());
         addMessageTranslator(MultipartReplyMessage.class,OF13, new MultiPartMessageDescToNodeUpdatedTranslator());
         addMessageTranslator(ExperimenterMessage.class, OF10, new ExperimenterTranslator());
 
         //TODO: move registration to factory
         NotificationPopListener<DataObject> notificationPopListener = new NotificationPopListener<DataObject>();
+        addMessagePopListener(NodeConnectorUpdated.class,notificationPopListener);
         addMessagePopListener(PacketReceived.class,notificationPopListener);
         addMessagePopListener(TransmitPacketInput.class, notificationPopListener);
         addMessagePopListener(NodeUpdated.class, notificationPopListener);
index 89f4223b2220f9f85e0446b275e1e34e6558b85a..c5e11dac289387ef27ecc63985d8e6d8b6f63118 100644 (file)
@@ -123,8 +123,8 @@ public class SalRegistrationManager implements SessionListener, SwitchInventory
 
     public static InstanceIdentifier<Node> identifierFromDatapathId(BigInteger datapathId) {
         NodeKey nodeKey = nodeKeyFromDatapathId(datapathId);
-        InstanceIdentifierBuilder<?> builder = InstanceIdentifier.builder(Node.class,nodeKey);
-        return (InstanceIdentifier<Node>) builder.toInstance();
+        InstanceIdentifierBuilder<Node> builder = InstanceIdentifier.builder(Nodes.class).child(Node.class,nodeKey);
+        return builder.toInstance();
     }
 
     public static NodeKey nodeKeyFromDatapathId(BigInteger datapathId) {
index f04ad78a75b95860fae41896c5af786086eff458..98bc4b7d934a7ccf65f7cce0589007f0242019aa 100644 (file)
@@ -22,7 +22,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class MultiPartMessageDescToNodeUpdatedTranslator implements IMDMessageTranslator<OfHeader, List<DataObject>> {
-    protected static final Logger LOG = LoggerFactory.getLogger(PacketInTranslator.class);
+    protected static final Logger LOG = LoggerFactory.getLogger(MultiPartMessageDescToNodeUpdatedTranslator.class);
     @Override
     public List<DataObject> translate(SwitchConnectionDistinguisher cookie,
             SessionContext sc, OfHeader msg) {
diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/MultiPartReplyPortToNodeConnectorUpdatedTranslator.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/MultiPartReplyPortToNodeConnectorUpdatedTranslator.java
new file mode 100644 (file)
index 0000000..a1c326c
--- /dev/null
@@ -0,0 +1,65 @@
+package org.opendaylight.openflowplugin.openflow.md.core.translator;
+
+import java.math.BigInteger;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.opendaylight.openflowplugin.openflow.md.core.IMDMessageTranslator;
+import org.opendaylight.openflowplugin.openflow.md.core.SwitchConnectionDistinguisher;
+import org.opendaylight.openflowplugin.openflow.md.core.session.SessionContext;
+import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
+import org.opendaylight.openflowplugin.openflow.md.util.PortTranslatorUtil;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnectorUpdated;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnectorUpdatedBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorUpdatedBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortConfig;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReply;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessage;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyPortDesc;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.desc.Ports;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class MultiPartReplyPortToNodeConnectorUpdatedTranslator implements IMDMessageTranslator<OfHeader, List<DataObject>> {
+    protected static final Logger LOG = LoggerFactory.getLogger(MultiPartReplyPortToNodeConnectorUpdatedTranslator.class);
+    @Override
+    public List<DataObject> translate(SwitchConnectionDistinguisher cookie,
+            SessionContext sc, OfHeader msg) {
+        if(msg instanceof MultipartReply && ((MultipartReply) msg).getType() == MultipartType.OFPMPPORTDESC) {
+            BigInteger datapathId = sc.getFeatures().getDatapathId();
+            LOG.info("MultiPartReplyPortToNodeConnectorUpdatedTranslator Being translated to NodeConnectorUpdated ");
+            MultipartReplyMessage message = (MultipartReplyMessage) msg;
+            MultipartReplyPortDesc body = (MultipartReplyPortDesc) message.getMultipartReplyBody();
+            List<DataObject> list = new CopyOnWriteArrayList<DataObject>();
+            for ( Ports port : body.getPorts() ) {
+                LOG.info("Port: " + port);
+                port.getPortNo();
+                NodeConnectorUpdatedBuilder builder = InventoryDataServiceUtil
+                .nodeConnectorUpdatedBuilderFromDatapathIdPortNo(datapathId,port.getPortNo());
+                FlowCapableNodeConnectorUpdatedBuilder fcncub = new FlowCapableNodeConnectorUpdatedBuilder();
+                fcncub.setAdvertisedFeatures(PortTranslatorUtil.translatePortFeatures(port.getAdvertisedFeatures()));
+                fcncub.setConfiguration(PortTranslatorUtil.translatePortConfig(port.getConfig()));
+                fcncub.setCurrentFeature(PortTranslatorUtil.translatePortFeatures(port.getCurrentFeatures()));
+                fcncub.setCurrentSpeed(port.getCurrSpeed());
+                fcncub.setHardwareAddress(port.getHwAddr());
+                fcncub.setMaximumSpeed(port.getMaxSpeed());
+                fcncub.setName(port.getName());
+                fcncub.setPeerFeatures(PortTranslatorUtil.translatePortFeatures(port.getPeerFeatures()));
+                fcncub.setPortNumber(port.getPortNo());
+                fcncub.setState(PortTranslatorUtil.translatePortState(port.getState()));
+                fcncub.setSupported(PortTranslatorUtil.translatePortFeatures(port.getSupportedFeatures()));
+                builder.addAugmentation(FlowCapableNodeConnectorUpdated.class, fcncub.build());
+                list.add(builder.build());
+            }
+            return list;
+        } else {
+            return null;
+        }
+    }
+
+
+
+}
diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/PortStatusMessageToNodeConnectorUpdatedTranslator.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/PortStatusMessageToNodeConnectorUpdatedTranslator.java
new file mode 100644 (file)
index 0000000..4a29714
--- /dev/null
@@ -0,0 +1,57 @@
+package org.opendaylight.openflowplugin.openflow.md.core.translator;
+
+import java.math.BigInteger;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.opendaylight.openflowplugin.openflow.md.core.IMDMessageTranslator;
+import org.opendaylight.openflowplugin.openflow.md.core.SwitchConnectionDistinguisher;
+import org.opendaylight.openflowplugin.openflow.md.core.session.SessionContext;
+import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
+import org.opendaylight.openflowplugin.openflow.md.util.PortTranslatorUtil;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnectorUpdated;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnectorUpdatedBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorUpdatedBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortConfig;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortStatusMessage;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class PortStatusMessageToNodeConnectorUpdatedTranslator implements IMDMessageTranslator<OfHeader, List<DataObject>> {
+    protected static final Logger LOG = LoggerFactory
+            .getLogger(PortStatusMessageToNodeConnectorUpdatedTranslator.class);
+
+    @Override
+    public List<DataObject> translate(SwitchConnectionDistinguisher cookie,
+            SessionContext sc, OfHeader msg) {
+        if(msg instanceof PortStatusMessage) {
+            PortStatusMessage port = (PortStatusMessage)msg;
+            List<DataObject> list = new CopyOnWriteArrayList<DataObject>();
+            BigInteger datapathId = sc.getFeatures().getDatapathId();
+            Long portNo = port.getPortNo();
+            LOG.error("PortStatusMessage: dataPathId {} portNo {}",datapathId,portNo);
+            NodeConnectorUpdatedBuilder builder = InventoryDataServiceUtil
+                    .nodeConnectorUpdatedBuilderFromDatapathIdPortNo(datapathId,port.getPortNo());
+            FlowCapableNodeConnectorUpdatedBuilder fcncub = new FlowCapableNodeConnectorUpdatedBuilder();
+            fcncub.setAdvertisedFeatures(PortTranslatorUtil.translatePortFeatures(port.getAdvertisedFeatures()));
+            fcncub.setConfiguration(PortTranslatorUtil.translatePortConfig(port.getConfig()));
+            fcncub.setCurrentFeature(PortTranslatorUtil.translatePortFeatures(port.getCurrentFeatures()));
+            fcncub.setCurrentSpeed(port.getCurrSpeed());
+            fcncub.setHardwareAddress(port.getHwAddr());
+            fcncub.setMaximumSpeed(port.getMaxSpeed());
+            fcncub.setName(port.getName());
+            fcncub.setPeerFeatures(PortTranslatorUtil.translatePortFeatures(port.getPeerFeatures()));
+            fcncub.setPortNumber(port.getPortNo());
+            fcncub.setState(PortTranslatorUtil.translatePortState(port.getState()));
+            fcncub.setSupported(PortTranslatorUtil.translatePortFeatures(port.getSupportedFeatures()));
+            builder.addAugmentation(FlowCapableNodeConnectorUpdated.class, fcncub.build());
+            list.add(builder.build());
+            return list;
+        } else {
+            // TODO - Do something smarter than returning null if translation fails... what Exception should we throw here?
+            return null;
+        }
+    }
+}
index 546791c00518b681079a87048b857e39e9199a58..d2f6229ee51622fd347868f1ac9726c1cb508333 100644 (file)
@@ -4,95 +4,106 @@ import java.math.BigInteger;
 import java.util.List;
 
 import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
-import org.opendaylight.controller.sal.binding.api.data.DataProviderService;
+import org.opendaylight.openflowplugin.openflow.md.core.session.OFSessionUtil;
+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;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeUpdatedBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorBuilder;
+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.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class InventoryDataServiceUtil {
     private final static Logger LOG = LoggerFactory.getLogger(InventoryDataServiceUtil.class);
-    /*
-     *   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  InstanceIdentifier<Nodes> nodesIdentifier = InstanceIdentifier.builder().node(Nodes.class).toInstance();
 
+    public final static String OF_URI_PREFIX = "openflow:";
     /*
-     * The DataProviderService is how we access the DataTree
+     * 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  DataProviderService dataService;
-
-    public InventoryDataServiceUtil(DataProviderService dataService) {
-        // Save the dataService
-        this.dataService = dataService;
-    }
-
-    public  List<Node> readAllNodes() {
-        Nodes nodes = (Nodes) dataService.readOperationalData(nodesIdentifier);
+    private static InstanceIdentifier<Nodes> nodesIdentifier = InstanceIdentifier.builder().node(Nodes.class)
+            .toInstance();
+
+    public static Nodes checkForNodes() {
+        Nodes nodes = null;
+        LOG.error("Before Nodes - nodes: " + nodes);
+        try {
+            nodes = (Nodes) OFSessionUtil.getSessionManager().getDataProviderService()
+                    .readOperationalData(nodesIdentifier);
+        } catch (Exception e) {
+            LOG.error(
+                    "Caught exception from OFSessionUtil.getSessionManager().getDataProviderService().readOperationalData",
+                    e);
+        }
+        LOG.error("After Nodes- nodes: " + nodes);
+        return nodes;
+    }
+
+    public static List<Node> readAllNodes() {
+        Nodes nodes = (Nodes) OFSessionUtil.getSessionManager().getDataProviderService()
+                .readOperationalData(nodesIdentifier);
         return nodes.getNode();
     }
 
-    public Node readNode(InstanceIdentifier<Node> instance) {
-        return (Node) dataService.readOperationalData(instance);
+    public static Node readNode(InstanceIdentifier<Node> instance) {
+        return (Node) OFSessionUtil.getSessionManager().getDataProviderService().readOperationalData(instance);
     }
 
-    public Node readNode(NodeRef nodeRef) {
+    public static Node readNode(NodeRef nodeRef) {
         return readNode((InstanceIdentifier<Node>) nodeRef.getValue());
     }
 
-    public Node readNode(NodeKey nodeKey) {
+    public static Node readNode(NodeKey nodeKey) {
         return readNode(nodeKeyToInstanceIdentifier(nodeKey));
     }
 
-    public Node readNode(NodeId nodeId) {
+    public static Node readNode(NodeId nodeId) {
         return readNode(new NodeKey(nodeId));
     }
 
-
-    public  Node readNodeByDataPath(BigInteger datapathId) {
-        return (Node) dataService.readOperationalData(identifierFromDatapathId(datapathId));
+    public static Node readNodeByDataPath(BigInteger datapathId) {
+        return (Node) OFSessionUtil.getSessionManager().getDataProviderService()
+                .readOperationalData(identifierFromDatapathId(datapathId));
     }
 
-    public void putNode(Node node) {
-        DataModificationTransaction transaction = dataService.beginTransaction();
+    public static void putNode(Node node) {
+        DataModificationTransaction transaction = OFSessionUtil.getSessionManager().getDataProviderService()
+                .beginTransaction();
         transaction.putOperationalData(nodesIdentifier, node);
         transaction.commit();
     }
 
-    public void putNodeConnector(InstanceIdentifier<Node> instance,NodeConnector nodeConnector) {
-        DataModificationTransaction transaction = dataService.beginTransaction();
+    public static void putNodeConnector(InstanceIdentifier<Node> instance, NodeConnector nodeConnector) {
+        DataModificationTransaction transaction = OFSessionUtil.getSessionManager().getDataProviderService()
+                .beginTransaction();
         transaction.putOperationalData(instance, nodeConnector);
         transaction.commit();
     }
 
-    public void putNodeConnector(NodeKey nodeKey,NodeConnector nodeConnector) {
+    public static void putNodeConnector(NodeKey nodeKey, NodeConnector nodeConnector) {
         InstanceIdentifier<Node> instance = nodeKeyToInstanceIdentifier(nodeKey);
-        putNodeConnector(instance,nodeConnector);
+        putNodeConnector(instance, nodeConnector);
     }
 
-
-
-    public void putNodeConnector(NodeId nodeId,NodeConnector nodeConnector) {
-        putNodeConnector(new NodeKey(nodeId),nodeConnector);
+    public static void putNodeConnector(NodeId nodeId, NodeConnector nodeConnector) {
+        putNodeConnector(new NodeKey(nodeId), nodeConnector);
     }
 
-    public void putNodeConnector(BigInteger datapathId, NodeConnector nodeConnector) {
-        putNodeConnector(new NodeId("openflow:" + datapathId),nodeConnector);
+    public static void putNodeConnector(BigInteger datapathId, NodeConnector nodeConnector) {
+        putNodeConnector(new NodeId(OF_URI_PREFIX + datapathId), nodeConnector);
     }
 
     public static InstanceIdentifier<Node> identifierFromDatapathId(BigInteger datapathId) {
-        InstanceIdentifierBuilder<?> builder = InstanceIdentifier.builder().node(Nodes.class);
-
         NodeKey nodeKey = nodeKeyFromDatapathId(datapathId);
-        return builder.node(Node.class, nodeKey).toInstance();
+        return InstanceIdentifier.builder(Nodes.class).child(Node.class, nodeKey).toInstance();
     }
 
     public static NodeKey nodeKeyFromDatapathId(BigInteger datapathId) {
@@ -109,23 +120,52 @@ public class InventoryDataServiceUtil {
     public static NodeId nodeIdFromDatapathId(BigInteger datapathId) {
         // FIXME: Convert to textual representation of datapathID
         String current = datapathId.toString();
-        return new NodeId("openflow:" + current);
+        return new NodeId(OF_URI_PREFIX + current);
     }
 
     public static NodeRef nodeRefFromNode(Node node) {
-        InstanceIdentifierBuilder<?> builder = InstanceIdentifier.builder().node(Nodes.class);
-        return new NodeRef(builder.node(Node.class,node.getKey()).toInstance());
+        return nodeRefFromNodeKey(node.getKey());
     }
 
     public static NodeRef nodeRefFromNodeKey(NodeKey nodeKey) {
-        InstanceIdentifierBuilder<?> builder = InstanceIdentifier.builder().node(Nodes.class);
-        return new NodeRef(builder.node(Node.class,nodeKey).toInstance());
+        return new NodeRef(nodeKeyToInstanceIdentifier(nodeKey));
     }
 
     public static InstanceIdentifier<Node> nodeKeyToInstanceIdentifier(NodeKey nodeKey) {
-        InstanceIdentifierBuilder<?> builder = InstanceIdentifier.builder().node(Nodes.class);
-        InstanceIdentifier<Node> instance = builder.node(Node.class,nodeKey).toInstance();
-        return instance;
+        return InstanceIdentifier.builder(Nodes.class).child(Node.class, nodeKey).toInstance();
+    }
+
+    public static InstanceIdentifier<Node> nodeIdToInstanceIdentifier(NodeId nodeId) {
+        return nodeKeyToInstanceIdentifier(new NodeKey(nodeId));
     }
 
+    public static NodeConnectorId nodeConnectorIdfromDatapathPortNo(BigInteger datapathid, Long portNo) {
+        return new NodeConnectorId(OF_URI_PREFIX + datapathid + ":" + portNo);
+    }
+
+    public static NodeConnectorRef nodeConnectorRefFromDatapathIdPortno(BigInteger datapathId, Long portNo) {
+        return new NodeConnectorRef(nodeConnectorInstanceIdentifierFromDatapathIdPortno(datapathId, portNo));
+    }
+
+    public static InstanceIdentifier<NodeConnector> nodeConnectorInstanceIdentifierFromDatapathIdPortno(
+            BigInteger datapathId, Long portNo) {
+        NodeId nodeId = nodeIdFromDatapathId(datapathId);
+        NodeConnectorId nodeConnectorId = nodeConnectorIdfromDatapathPortNo(datapathId, portNo);
+        return InstanceIdentifier.builder(Nodes.class) //
+                .child(Node.class, new NodeKey(nodeId)) //
+                .child(NodeConnector.class, new NodeConnectorKey(nodeConnectorId)).toInstance();
+    }
+
+    public static NodeConnectorUpdatedBuilder nodeConnectorUpdatedBuilderFromDatapathIdPortNo(BigInteger datapathId, Long portNo) {
+        NodeConnectorUpdatedBuilder builder = new NodeConnectorUpdatedBuilder();
+        builder.setId(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId,portNo));
+        builder.setNodeConnectorRef(InventoryDataServiceUtil.nodeConnectorRefFromDatapathIdPortno(datapathId,portNo));
+        return builder;
+    }
+
+    public static NodeConnectorBuilder nodeConnectorBuilderFromDatapathIdPortNo(BigInteger datapathId, Long portNo) {
+        NodeConnectorBuilder builder = new NodeConnectorBuilder();
+        builder.setId(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId,portNo));
+        return builder;
+    }
 }
diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/util/PortTranslatorUtil.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/util/PortTranslatorUtil.java
new file mode 100644 (file)
index 0000000..9aee3af
--- /dev/null
@@ -0,0 +1,41 @@
+package org.opendaylight.openflowplugin.openflow.md.util;
+
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortConfig;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortFeatures;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortState;
+
+public class PortTranslatorUtil {
+    public static  org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortFeatures translatePortFeatures(PortFeatures apf) {
+        org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortFeatures napf = null;
+        if(apf != null){
+                napf = new org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortFeatures(
+                        apf.is_100gbFd(),apf.is_100mbFd(),apf.is_100mbHd(),apf.is_10gbFd(),apf.is_10mbFd(),apf.is_10mbHd(),
+                        apf.is_1gbFd(),apf.is_1gbHd(),apf.is_1tbFd(),apf.is_40gbFd(),apf.isAutoneg(),apf.isCopper(),apf.isFiber(),apf.isOther(),
+                        apf.isPause(), apf.isPauseAsym());
+        }
+        return napf;
+    }
+
+    public static  org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortState translatePortState(PortState state) {
+        org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortState nstate = null;
+        if(state != null) {
+            if(state.isBlocked()) {
+                nstate = org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortState.Blocked;
+            } else if (state.isLinkDown()) {
+                nstate = org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortState.LinkDown;
+            } else if (state.isLive()) {
+                nstate = org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortState.Live;
+            }
+        }
+        return nstate;
+    }
+
+    public static org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortConfig translatePortConfig(PortConfig pc) {
+        org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortConfig npc = null;
+        if(pc != null) {
+                npc = new org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortConfig(pc.isNoFwd(),
+                        pc.isNoPacketIn(), pc.isNoRecv(), pc.isPortDown());
+        }
+        return npc;
+    }
+}