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