Fix Bug 271
[openflowplugin.git] / openflowplugin / src / main / java / org / opendaylight / openflowplugin / openflow / md / util / InventoryDataServiceUtil.java
1 package org.opendaylight.openflowplugin.openflow.md.util;
2
3 import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
4 import org.opendaylight.openflowplugin.openflow.md.core.session.OFSessionUtil;
5 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
6 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;
7 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorUpdatedBuilder;
8 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
9 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
10 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeUpdatedBuilder;
11 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorBuilder;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
17 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
18 import org.slf4j.Logger;
19 import org.slf4j.LoggerFactory;
20
21 import java.math.BigInteger;
22 import java.util.List;
23
24 public class InventoryDataServiceUtil {
25     private final static Logger LOG = LoggerFactory.getLogger(InventoryDataServiceUtil.class);
26
27     public final static String OF_URI_PREFIX = "openflow:";
28     /*
29      * Get an InstanceIdentifier for the Nodes class that is the root of the
30      * inventory tree We use this alot, so its worth keeping around
31      */
32     private static InstanceIdentifier<Nodes> nodesIdentifier = InstanceIdentifier.builder().node(Nodes.class)
33             .toInstance();
34
35     public static Nodes checkForNodes() {
36         Nodes nodes = null;
37         LOG.error("Before Nodes - nodes: " + nodes);
38         try {
39             nodes = (Nodes) OFSessionUtil.getSessionManager().getDataProviderService()
40                     .readOperationalData(nodesIdentifier);
41         } catch (Exception e) {
42             LOG.error(
43                     "Caught exception from OFSessionUtil.getSessionManager().getDataProviderService().readOperationalData",
44                     e);
45         }
46         LOG.error("After Nodes- nodes: " + nodes);
47         return nodes;
48     }
49
50     public static List<Node> readAllNodes() {
51         Nodes nodes = (Nodes) OFSessionUtil.getSessionManager().getDataProviderService()
52                 .readOperationalData(nodesIdentifier);
53         return nodes.getNode();
54     }
55
56     public static Node readNode(InstanceIdentifier<Node> instance) {
57         return (Node) OFSessionUtil.getSessionManager().getDataProviderService().readOperationalData(instance);
58     }
59
60     public static Node readNode(NodeRef nodeRef) {
61         return readNode((InstanceIdentifier<Node>) nodeRef.getValue());
62     }
63
64     public static Node readNode(NodeKey nodeKey) {
65         return readNode(nodeKeyToInstanceIdentifier(nodeKey));
66     }
67
68     public static Node readNode(NodeId nodeId) {
69         return readNode(new NodeKey(nodeId));
70     }
71
72     public static Node readNodeByDataPath(BigInteger datapathId) {
73         return (Node) OFSessionUtil.getSessionManager().getDataProviderService()
74                 .readOperationalData(identifierFromDatapathId(datapathId));
75     }
76
77     public static void putNode(Node node) {
78         DataModificationTransaction transaction = OFSessionUtil.getSessionManager().getDataProviderService()
79                 .beginTransaction();
80         transaction.putOperationalData(nodesIdentifier, node);
81         transaction.commit();
82     }
83
84     public static void putNodeConnector(InstanceIdentifier<Node> instance, NodeConnector nodeConnector) {
85         DataModificationTransaction transaction = OFSessionUtil.getSessionManager().getDataProviderService()
86                 .beginTransaction();
87         transaction.putOperationalData(instance, nodeConnector);
88         transaction.commit();
89     }
90
91     public static void putNodeConnector(NodeKey nodeKey, NodeConnector nodeConnector) {
92         InstanceIdentifier<Node> instance = nodeKeyToInstanceIdentifier(nodeKey);
93         putNodeConnector(instance, nodeConnector);
94     }
95
96     public static void putNodeConnector(NodeId nodeId, NodeConnector nodeConnector) {
97         putNodeConnector(new NodeKey(nodeId), nodeConnector);
98     }
99
100     public static void putNodeConnector(BigInteger datapathId, NodeConnector nodeConnector) {
101         putNodeConnector(new NodeId(OF_URI_PREFIX + datapathId), nodeConnector);
102     }
103
104     public static InstanceIdentifier<Node> identifierFromDatapathId(BigInteger datapathId) {
105         NodeKey nodeKey = nodeKeyFromDatapathId(datapathId);
106         return InstanceIdentifier.builder(Nodes.class).child(Node.class, nodeKey).toInstance();
107     }
108
109     public static NodeKey nodeKeyFromDatapathId(BigInteger datapathId) {
110         return new NodeKey(nodeIdFromDatapathId(datapathId));
111     }
112
113     public static NodeUpdatedBuilder nodeUpdatedBuilderFromDataPathId(BigInteger datapathId) {
114         NodeUpdatedBuilder builder = new NodeUpdatedBuilder();
115         builder.setId(nodeIdFromDatapathId(datapathId));
116         builder.setNodeRef(nodeRefFromNodeKey(new NodeKey(builder.getId())));
117         return builder;
118     }
119
120     public static NodeId nodeIdFromDatapathId(BigInteger datapathId) {
121         // FIXME: Convert to textual representation of datapathID
122         String current = datapathId.toString();
123         return new NodeId(OF_URI_PREFIX + current);
124     }
125     
126     public static Long dataPathIdFromNodeId(NodeId nodeId) {
127         String dpids = nodeId.getValue().replace(OF_URI_PREFIX, "");
128         Long dpid = Long.decode(dpids);
129         return dpid;
130     }
131
132     public static NodeRef nodeRefFromNode(Node node) {
133         return nodeRefFromNodeKey(node.getKey());
134     }
135
136     public static NodeRef nodeRefFromNodeKey(NodeKey nodeKey) {
137         return new NodeRef(nodeKeyToInstanceIdentifier(nodeKey));
138     }
139
140     public static InstanceIdentifier<Node> nodeKeyToInstanceIdentifier(NodeKey nodeKey) {
141         return InstanceIdentifier.builder(Nodes.class).child(Node.class, nodeKey).toInstance();
142     }
143
144     public static InstanceIdentifier<Node> nodeIdToInstanceIdentifier(NodeId nodeId) {
145         return nodeKeyToInstanceIdentifier(new NodeKey(nodeId));
146     }
147
148     public static NodeConnectorId nodeConnectorIdfromDatapathPortNo(BigInteger datapathid, Long portNo) {
149         return new NodeConnectorId(OF_URI_PREFIX + datapathid + ":" + portNo);
150     }
151     
152     public static Long portNumberfromNodeConnectorId(NodeConnectorId ncId) {
153         return portNumberfromNodeConnectorId(ncId.getValue());
154     }
155
156     public static Long portNumberfromNodeConnectorId(String ncId){
157         String[] split = ncId.split(":");
158
159         // If the length is just one then this cannot be the new MD-SAL style node connector Id which
160         // is of the form openflow:1:3.
161         if(split.length == 1){
162             return Long.decode(ncId);
163         }
164         String portNoString = split[split.length-1];
165         Long portNo = Long.decode(portNoString);
166         return portNo;
167     }
168
169
170
171     public static NodeConnectorRef nodeConnectorRefFromDatapathIdPortno(BigInteger datapathId, Long portNo) {
172         return new NodeConnectorRef(nodeConnectorInstanceIdentifierFromDatapathIdPortno(datapathId, portNo));
173     }
174
175     public static InstanceIdentifier<NodeConnector> nodeConnectorInstanceIdentifierFromDatapathIdPortno(
176             BigInteger datapathId, Long portNo) {
177         NodeId nodeId = nodeIdFromDatapathId(datapathId);
178         NodeConnectorId nodeConnectorId = nodeConnectorIdfromDatapathPortNo(datapathId, portNo);
179         return InstanceIdentifier.builder(Nodes.class) //
180                 .child(Node.class, new NodeKey(nodeId)) //
181                 .child(NodeConnector.class, new NodeConnectorKey(nodeConnectorId)).toInstance();
182     }
183
184     public static NodeConnectorUpdatedBuilder nodeConnectorUpdatedBuilderFromDatapathIdPortNo(BigInteger datapathId, Long portNo) {
185         NodeConnectorUpdatedBuilder builder = new NodeConnectorUpdatedBuilder();
186         builder.setId(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId,portNo));
187         builder.setNodeConnectorRef(InventoryDataServiceUtil.nodeConnectorRefFromDatapathIdPortno(datapathId,portNo));
188         return builder;
189     }
190
191     public static NodeConnectorBuilder nodeConnectorBuilderFromDatapathIdPortNo(BigInteger datapathId, Long portNo) {
192         NodeConnectorBuilder builder = new NodeConnectorBuilder();
193         builder.setId(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId,portNo));
194         return builder;
195     }
196 }