Merge "Eliminate {infra,service}utils.version"
[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.Splitter;
11 import com.google.common.base.Strings;
12 import java.math.BigInteger;
13 import java.util.List;
14 import org.eclipse.jdt.annotation.NonNull;
15 import org.eclipse.jdt.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.opendaylight.yangtools.yang.common.Uint32;
33 import org.opendaylight.yangtools.yang.common.Uint64;
34 import org.slf4j.Logger;
35 import org.slf4j.LoggerFactory;
36
37 public abstract class InventoryDataServiceUtil {
38     private static final Splitter COLON_SPLITTER = Splitter.on(":");
39     private static final Logger LOG = LoggerFactory.getLogger(InventoryDataServiceUtil.class);
40
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 final InstanceIdentifier<Nodes> NODES_IDENTIFIER = InstanceIdentifier.create(Nodes.class);
46
47     public static InstanceIdentifier<Node> identifierFromDatapathId(final Uint64 datapathId) {
48         NodeKey nodeKey = nodeKeyFromDatapathId(datapathId);
49         return NODES_IDENTIFIER.child(Node.class, nodeKey);
50     }
51
52     public static NodeKey nodeKeyFromDatapathId(final Uint64 datapathId) {
53         return new NodeKey(nodeIdFromDatapathId(datapathId));
54     }
55
56     public static NodeUpdatedBuilder nodeUpdatedBuilderFromDataPathId(final Uint64 datapathId) {
57         NodeUpdatedBuilder builder = new NodeUpdatedBuilder();
58         builder.setId(nodeIdFromDatapathId(datapathId));
59         builder.setNodeRef(nodeRefFromNodeKey(new NodeKey(builder.getId())));
60         return builder;
61     }
62
63     public static NodeId nodeIdFromDatapathId(final Uint64 datapathId) {
64         // FIXME: Convert to textual representation of datapathID
65         String current = datapathId.toString();
66         return new NodeId(OFConstants.OF_URI_PREFIX + current);
67     }
68
69     public static Uint64 dataPathIdFromNodeId(final NodeId nodeId) {
70         return Uint64.valueOf(nodeId.getValue().replace(OFConstants.OF_URI_PREFIX, ""));
71     }
72
73     public static NodeRef nodeRefFromNodeKey(final NodeKey nodeKey) {
74         return new NodeRef(nodeKeyToInstanceIdentifier(nodeKey));
75     }
76
77     public static InstanceIdentifier<Node> nodeKeyToInstanceIdentifier(final NodeKey nodeKey) {
78         return NODES_IDENTIFIER.child(Node.class, nodeKey);
79     }
80
81     public static NodeConnectorId nodeConnectorIdfromDatapathPortNo(final Uint64 datapathid, final Uint32 portNo,
82                                                                     final OpenflowVersion ofVersion) {
83         String logicalName = OpenflowPortsUtil.getPortLogicalName(ofVersion, portNo);
84         return new NodeConnectorId(OFConstants.OF_URI_PREFIX + datapathid + ":" + (logicalName == null
85                 ? portNo : logicalName));
86     }
87
88     @Nullable
89     public static Uint32 portNumberfromNodeConnectorId(final OpenflowVersion ofVersion, final NodeConnectorId ncId) {
90         return portNumberfromNodeConnectorId(ofVersion, ncId.getValue());
91     }
92
93     @Nullable
94     public static Uint32 portNumberfromNodeConnectorId(final OpenflowVersion ofVersion, @NonNull final String ncId) {
95         String portNoString = portNoStringfromNodeConnectorID(ncId);
96         return OpenflowPortsUtil.getPortFromLogicalName(ofVersion, portNoString);
97     }
98
99     public static String portNoStringfromNodeConnectorID(final String ncID) {
100
101         List<String> splitStringList = COLON_SPLITTER.splitToList(ncID);
102
103         // It can happen that token length will be just 1 i.e 2 or CONTROLLER
104         // If the length is just one then this cannot be the new MD-SAL style node connector Id which
105         // is of the form openflow:1:3.
106
107         return splitStringList.get(splitStringList.size() - 1);
108     }
109
110
111     public static NodeConnectorRef nodeConnectorRefFromDatapathIdPortno(final Uint64 datapathId, final Uint32 portNo,
112             final OpenflowVersion ofVersion) {
113         return new NodeConnectorRef(nodeConnectorInstanceIdentifierFromDatapathIdPortno(datapathId, portNo, ofVersion));
114     }
115
116     public static NodeConnectorRef nodeConnectorRefFromDatapathIdPortno(final Uint64 datapathId, final Uint32 portNo,
117             final OpenflowVersion ofVersion, final KeyedInstanceIdentifier<Node, NodeKey> nodePath) {
118         return new NodeConnectorRef(
119                 nodeConnectorInstanceIdentifierFromDatapathIdPortno(datapathId, portNo, ofVersion, nodePath));
120     }
121
122     public static InstanceIdentifier<NodeConnector> nodeConnectorInstanceIdentifierFromDatapathIdPortno(
123             final Uint64 datapathId, final Uint32 portNo, final OpenflowVersion ofVersion) {
124         NodeId nodeId = nodeIdFromDatapathId(datapathId);
125         KeyedInstanceIdentifier<Node, NodeKey> nodePath = NODES_IDENTIFIER.child(Node.class, new NodeKey(nodeId));
126         return nodeConnectorInstanceIdentifierFromDatapathIdPortno(datapathId, portNo, ofVersion, nodePath);
127     }
128
129     public static InstanceIdentifier<NodeConnector> nodeConnectorInstanceIdentifierFromDatapathIdPortno(
130             final Uint64 datapathId, final Uint32 portNo, final OpenflowVersion ofVersion,
131             final KeyedInstanceIdentifier<Node, NodeKey> nodePath) {
132         NodeConnectorId nodeConnectorId = nodeConnectorIdfromDatapathPortNo(datapathId, portNo, ofVersion);
133         return nodePath.child(NodeConnector.class, new NodeConnectorKey(nodeConnectorId));
134     }
135
136     public static NodeConnectorUpdatedBuilder nodeConnectorUpdatedBuilderFromDatapathIdPortNo(
137             final Uint64 datapathId, final Uint32 portNo, final OpenflowVersion ofVersion) {
138         NodeConnectorUpdatedBuilder builder = new NodeConnectorUpdatedBuilder();
139         builder.setId(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId, portNo, ofVersion));
140         builder.setNodeConnectorRef(InventoryDataServiceUtil.nodeConnectorRefFromDatapathIdPortno(
141                 datapathId, portNo, ofVersion));
142         return builder;
143     }
144
145     public static NodeConnectorBuilder nodeConnectorBuilderFromDatapathIdPortNo(final Uint64 datapathId,
146             final Uint32 portNo, final OpenflowVersion ofVersion) {
147         NodeConnectorBuilder builder = new NodeConnectorBuilder();
148         builder.setId(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId, portNo, ofVersion));
149         return builder;
150     }
151
152     /**
153      * Converts a BigInteger to a padded hex value.
154      *
155      * @param dataPathId datapath id in big interger value
156      * @return string of size 16, padded with '0'
157      */
158     public static String bigIntegerToPaddedHex(final BigInteger dataPathId) {
159         return Strings.padStart(dataPathId.toString(16), 16, '0');
160     }
161
162     public static Uint64 extractDatapathId(final NodeRef ref) {
163         return InventoryDataServiceUtil.dataPathIdFromNodeId(ref.getValue().firstKeyOf(Node.class).getId());
164     }
165 }