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 com.google.common.base.Splitter;
11 import com.google.common.base.Strings;
12 import java.math.BigInteger;
13 import java.util.List;
14 import javax.annotation.Nonnull;
15 import javax.annotation.Nullable;
16 import org.opendaylight.openflowplugin.api.OFConstants;
17 import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorUpdatedBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeUpdatedBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
30 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
31 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
35 public abstract class InventoryDataServiceUtil {
36 private static final Splitter COLON_SPLITTER = Splitter.on(":");
37 private static final Logger LOG = LoggerFactory.getLogger(InventoryDataServiceUtil.class);
40 * Get an InstanceIdentifier for the Nodes class that is the root of the
41 * inventory tree We use this alot, so its worth keeping around
43 private static final InstanceIdentifier<Nodes> NODES_IDENTIFIER = InstanceIdentifier.create(Nodes.class);
45 public static InstanceIdentifier<Node> identifierFromDatapathId(final BigInteger datapathId) {
46 NodeKey nodeKey = nodeKeyFromDatapathId(datapathId);
47 return NODES_IDENTIFIER.child(Node.class, nodeKey);
50 public static NodeKey nodeKeyFromDatapathId(final BigInteger datapathId) {
51 return new NodeKey(nodeIdFromDatapathId(datapathId));
54 public static NodeUpdatedBuilder nodeUpdatedBuilderFromDataPathId(final BigInteger datapathId) {
55 NodeUpdatedBuilder builder = new NodeUpdatedBuilder();
56 builder.setId(nodeIdFromDatapathId(datapathId));
57 builder.setNodeRef(nodeRefFromNodeKey(new NodeKey(builder.getId())));
61 public static NodeId nodeIdFromDatapathId(final BigInteger datapathId) {
62 // FIXME: Convert to textual representation of datapathID
63 String current = datapathId.toString();
64 return new NodeId(OFConstants.OF_URI_PREFIX + current);
67 public static BigInteger dataPathIdFromNodeId(final NodeId nodeId) {
68 String dpids = nodeId.getValue().replace(OFConstants.OF_URI_PREFIX, "");
69 BigInteger dpid = new BigInteger(dpids);
74 public static NodeRef nodeRefFromNodeKey(final NodeKey nodeKey) {
75 return new NodeRef(nodeKeyToInstanceIdentifier(nodeKey));
78 public static InstanceIdentifier<Node> nodeKeyToInstanceIdentifier(final NodeKey nodeKey) {
79 return NODES_IDENTIFIER.child(Node.class, nodeKey);
82 public static NodeConnectorId nodeConnectorIdfromDatapathPortNo(final BigInteger datapathid, final Long portNo,
83 final OpenflowVersion ofVersion) {
84 String logicalName = OpenflowPortsUtil.getPortLogicalName(ofVersion, portNo);
85 return new NodeConnectorId(OFConstants.OF_URI_PREFIX + datapathid + ":" + (logicalName == null
86 ? portNo : logicalName));
90 public static Long portNumberfromNodeConnectorId(final OpenflowVersion ofVersion, final NodeConnectorId ncId) {
91 return portNumberfromNodeConnectorId(ofVersion, ncId.getValue());
95 public static Long portNumberfromNodeConnectorId(final OpenflowVersion ofVersion, @Nonnull final String ncId) {
96 String portNoString = portNoStringfromNodeConnectorID(ncId);
97 return OpenflowPortsUtil.getPortFromLogicalName(ofVersion, portNoString);
100 public static String portNoStringfromNodeConnectorID(final String ncID) {
102 List<String> splitStringList = COLON_SPLITTER.splitToList(ncID);
104 // It can happen that token length will be just 1 i.e 2 or CONTROLLER
105 // If the length is just one then this cannot be the new MD-SAL style node connector Id which
106 // is of the form openflow:1:3.
108 return splitStringList.get(splitStringList.size() - 1);
112 public static NodeConnectorRef nodeConnectorRefFromDatapathIdPortno(final BigInteger datapathId, final Long portNo,
113 final OpenflowVersion ofVersion) {
114 return new NodeConnectorRef(nodeConnectorInstanceIdentifierFromDatapathIdPortno(datapathId, portNo, ofVersion));
117 public static NodeConnectorRef nodeConnectorRefFromDatapathIdPortno(final BigInteger datapathId, final Long portNo,
118 final OpenflowVersion ofVersion, final KeyedInstanceIdentifier<Node, NodeKey> nodePath) {
119 return new NodeConnectorRef(
120 nodeConnectorInstanceIdentifierFromDatapathIdPortno(datapathId, portNo, ofVersion, nodePath));
123 public static InstanceIdentifier<NodeConnector> nodeConnectorInstanceIdentifierFromDatapathIdPortno(
124 final BigInteger datapathId, final Long portNo, final OpenflowVersion ofVersion) {
125 NodeId nodeId = nodeIdFromDatapathId(datapathId);
126 KeyedInstanceIdentifier<Node, NodeKey> nodePath = NODES_IDENTIFIER.child(Node.class, new NodeKey(nodeId));
127 return nodeConnectorInstanceIdentifierFromDatapathIdPortno(datapathId, portNo, ofVersion, nodePath);
130 public static InstanceIdentifier<NodeConnector> nodeConnectorInstanceIdentifierFromDatapathIdPortno(
131 final BigInteger datapathId, final Long portNo, final OpenflowVersion ofVersion,
132 final KeyedInstanceIdentifier<Node, NodeKey> nodePath) {
133 NodeConnectorId nodeConnectorId = nodeConnectorIdfromDatapathPortNo(datapathId, portNo, ofVersion);
134 return nodePath.child(NodeConnector.class, new NodeConnectorKey(nodeConnectorId));
137 public static NodeConnectorUpdatedBuilder nodeConnectorUpdatedBuilderFromDatapathIdPortNo(
138 final BigInteger datapathId, final Long portNo, final OpenflowVersion ofVersion) {
139 NodeConnectorUpdatedBuilder builder = new NodeConnectorUpdatedBuilder();
140 builder.setId(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId, portNo, ofVersion));
141 builder.setNodeConnectorRef(InventoryDataServiceUtil.nodeConnectorRefFromDatapathIdPortno(
142 datapathId, portNo, ofVersion));
146 public static NodeConnectorBuilder nodeConnectorBuilderFromDatapathIdPortNo(final BigInteger datapathId,
147 final Long portNo, final OpenflowVersion ofVersion) {
148 NodeConnectorBuilder builder = new NodeConnectorBuilder();
149 builder.setId(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId, portNo, ofVersion));
154 * Converts a BigInteger to a padded hex value.
156 * @param dataPathId datapath id in big interger value
157 * @return string of size 16, padded with '0'
159 public static String bigIntegerToPaddedHex(final BigInteger dataPathId) {
160 return Strings.padStart(dataPathId.toString(16), 16, '0');
163 public static BigInteger extractDatapathId(final NodeRef ref) {
164 return InventoryDataServiceUtil.dataPathIdFromNodeId(ref.getValue().firstKeyOf(Node.class).getId());