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