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