2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.openflowplugin.openflow.md.util;
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;
29 import java.math.BigInteger;
30 import java.util.List;
32 public abstract class InventoryDataServiceUtil {
33 private final static Logger LOG = LoggerFactory.getLogger(InventoryDataServiceUtil.class);
35 public final static String OF_URI_PREFIX = "openflow:";
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
40 private static InstanceIdentifier<Nodes> nodesIdentifier = InstanceIdentifier.builder(Nodes.class)
43 public static Nodes checkForNodes() {
45 LOG.error("Before Nodes - nodes: " + nodes);
47 nodes = (Nodes) OFSessionUtil.getSessionManager().getDataProviderService()
48 .readOperationalData(nodesIdentifier);
49 } catch (Exception e) {
51 "Caught exception from OFSessionUtil.getSessionManager().getDataProviderService().readOperationalData",
54 LOG.error("After Nodes- nodes: " + nodes);
58 public static List<Node> readAllNodes() {
59 Nodes nodes = (Nodes) OFSessionUtil.getSessionManager().getDataProviderService()
60 .readOperationalData(nodesIdentifier);
61 return nodes.getNode();
64 public static Node readNode(InstanceIdentifier<Node> instance) {
65 return (Node) OFSessionUtil.getSessionManager().getDataProviderService().readOperationalData(instance);
68 public static Node readNode(NodeRef nodeRef) {
69 return readNode((InstanceIdentifier<Node>) nodeRef.getValue());
72 public static Node readNode(NodeKey nodeKey) {
73 return readNode(nodeKeyToInstanceIdentifier(nodeKey));
76 public static Node readNode(NodeId nodeId) {
77 return readNode(new NodeKey(nodeId));
80 public static Node readNodeByDataPath(BigInteger datapathId) {
81 return (Node) OFSessionUtil.getSessionManager().getDataProviderService()
82 .readOperationalData(identifierFromDatapathId(datapathId));
85 public static void putNode(Node node) {
86 DataModificationTransaction transaction = OFSessionUtil.getSessionManager().getDataProviderService()
88 transaction.putOperationalData(nodesIdentifier, node);
92 public static void putNodeConnector(InstanceIdentifier<Node> instance, NodeConnector nodeConnector) {
93 DataModificationTransaction transaction = OFSessionUtil.getSessionManager().getDataProviderService()
95 transaction.putOperationalData(instance, nodeConnector);
99 public static void putNodeConnector(NodeKey nodeKey, NodeConnector nodeConnector) {
100 InstanceIdentifier<Node> instance = nodeKeyToInstanceIdentifier(nodeKey);
101 putNodeConnector(instance, nodeConnector);
104 public static void putNodeConnector(NodeId nodeId, NodeConnector nodeConnector) {
105 putNodeConnector(new NodeKey(nodeId), nodeConnector);
108 public static void putNodeConnector(BigInteger datapathId, NodeConnector nodeConnector) {
109 putNodeConnector(new NodeId(OF_URI_PREFIX + datapathId), nodeConnector);
112 public static InstanceIdentifier<Node> identifierFromDatapathId(BigInteger datapathId) {
113 NodeKey nodeKey = nodeKeyFromDatapathId(datapathId);
114 return InstanceIdentifier.builder(Nodes.class).child(Node.class, nodeKey).toInstance();
117 public static NodeKey nodeKeyFromDatapathId(BigInteger datapathId) {
118 return new NodeKey(nodeIdFromDatapathId(datapathId));
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())));
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);
134 public static BigInteger dataPathIdFromNodeId(NodeId nodeId) {
135 String dpids = nodeId.getValue().replace(OF_URI_PREFIX, "");
136 BigInteger dpid = new BigInteger(dpids);
140 public static NodeRef nodeRefFromNode(Node node) {
141 return nodeRefFromNodeKey(node.getKey());
144 public static NodeRef nodeRefFromNodeKey(NodeKey nodeKey) {
145 return new NodeRef(nodeKeyToInstanceIdentifier(nodeKey));
148 public static InstanceIdentifier<Node> nodeKeyToInstanceIdentifier(NodeKey nodeKey) {
149 return InstanceIdentifier.builder(Nodes.class).child(Node.class, nodeKey).toInstance();
152 public static InstanceIdentifier<Node> nodeIdToInstanceIdentifier(NodeId nodeId) {
153 return nodeKeyToInstanceIdentifier(new NodeKey(nodeId));
156 public static NodeConnectorId nodeConnectorIdfromDatapathPortNo(BigInteger datapathid, Long portNo,
157 OpenflowVersion ofVersion) {
158 String logicalName = OpenflowPortsUtil.getPortLogicalName(ofVersion, portNo);
159 return new NodeConnectorId(OF_URI_PREFIX + datapathid + ":" + (logicalName == null? portNo : logicalName));
162 public static Long portNumberfromNodeConnectorId(OpenflowVersion ofVersion, NodeConnectorId ncId) {
163 return portNumberfromNodeConnectorId(ofVersion, ncId.getValue());
166 public static Long portNumberfromNodeConnectorId(OpenflowVersion ofVersion, String ncId){
167 String[] split = ncId.split(":");
169 // It can happen that token length will be just 1 i.e 2 or CONTROLLER
170 // If the length is just one then this cannot be the new MD-SAL style node connector Id which
171 // is of the form openflow:1:3.
173 String portNoString = split[split.length-1];
174 Long portNo = OpenflowPortsUtil.getPortFromLogicalName(ofVersion, portNoString);
180 public static NodeConnectorRef nodeConnectorRefFromDatapathIdPortno(BigInteger datapathId, Long portNo, OpenflowVersion ofVersion) {
181 return new NodeConnectorRef(nodeConnectorInstanceIdentifierFromDatapathIdPortno(datapathId, portNo, ofVersion));
184 public static InstanceIdentifier<NodeConnector> nodeConnectorInstanceIdentifierFromDatapathIdPortno(
185 BigInteger datapathId, Long portNo, OpenflowVersion ofVersion) {
186 NodeId nodeId = nodeIdFromDatapathId(datapathId);
187 NodeConnectorId nodeConnectorId = nodeConnectorIdfromDatapathPortNo(datapathId, portNo, ofVersion);
188 return InstanceIdentifier.builder(Nodes.class) //
189 .child(Node.class, new NodeKey(nodeId)) //
190 .child(NodeConnector.class, new NodeConnectorKey(nodeConnectorId)).toInstance();
193 public static NodeConnectorUpdatedBuilder nodeConnectorUpdatedBuilderFromDatapathIdPortNo(BigInteger datapathId,
194 Long portNo, OpenflowVersion ofVersion) {
195 NodeConnectorUpdatedBuilder builder = new NodeConnectorUpdatedBuilder();
196 builder.setId(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId, portNo, ofVersion));
197 builder.setNodeConnectorRef(InventoryDataServiceUtil.nodeConnectorRefFromDatapathIdPortno(datapathId,portNo, ofVersion));
201 public static NodeConnectorBuilder nodeConnectorBuilderFromDatapathIdPortNo(BigInteger datapathId,
202 Long portNo, OpenflowVersion ofVersion) {
203 NodeConnectorBuilder builder = new NodeConnectorBuilder();
204 builder.setId(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId,portNo, ofVersion));
210 * @return string of size 16, padded with '0'
212 public static String bigIntegerToPaddedHex(BigInteger dataPathId) {
213 return StringUtils.leftPad(dataPathId.toString(16),16,"0");