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.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.WriteTransaction;
17 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
18 import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;
19 import org.opendaylight.openflowplugin.openflow.md.core.session.OFSessionUtil;
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.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
38 public abstract class InventoryDataServiceUtil {
39 public static final String OF_URI_PREFIX = "openflow:";
40 private static final Logger LOG = LoggerFactory.getLogger(InventoryDataServiceUtil.class);
43 * Get an InstanceIdentifier for the Nodes class that is the root of the
44 * inventory tree We use this alot, so its worth keeping around
46 private static final InstanceIdentifier<Nodes> NODES_IDENTIFIER = InstanceIdentifier.create(Nodes.class);
48 public static Nodes checkForNodes() {
50 LOG.error("Before Nodes - nodes: " + nodes);
52 nodes = getDataObject(OFSessionUtil.getSessionManager().getDataBroker().newReadOnlyTransaction(), NODES_IDENTIFIER);
53 } catch (Exception e) {
55 "Caught exception from OFSessionUtil.getSessionManager().getDataBroker().newReadWriteTransaction()",
58 LOG.error("After Nodes- nodes: " + nodes);
62 public static List<Node> readAllNodes() {
63 Nodes nodes = getDataObject(OFSessionUtil.getSessionManager().getDataBroker().newReadOnlyTransaction(), NODES_IDENTIFIER);
64 return nodes.getNode();
67 public static Node readNode(final InstanceIdentifier<Node> instance) {
68 return getDataObject(OFSessionUtil.getSessionManager().getDataBroker().newReadOnlyTransaction(), instance);
71 public static void putNodeConnector(final InstanceIdentifier<Node> instance, final NodeConnector nodeConnector) {
72 WriteTransaction transaction = OFSessionUtil.getSessionManager().getDataBroker().newWriteOnlyTransaction();
73 InstanceIdentifier<NodeConnector> nodeConnectorID = instance.child(NodeConnector.class, nodeConnector.getKey());
74 transaction.merge(LogicalDatastoreType.OPERATIONAL, nodeConnectorID, nodeConnector);
78 public static void putNodeConnector(final NodeKey nodeKey, final NodeConnector nodeConnector) {
79 InstanceIdentifier<Node> instance = nodeKeyToInstanceIdentifier(nodeKey);
80 putNodeConnector(instance, nodeConnector);
83 public static void putNodeConnector(final NodeId nodeId, final NodeConnector nodeConnector) {
84 putNodeConnector(new NodeKey(nodeId), nodeConnector);
87 public static InstanceIdentifier<Node> identifierFromDatapathId(final BigInteger datapathId) {
88 NodeKey nodeKey = nodeKeyFromDatapathId(datapathId);
89 return NODES_IDENTIFIER.child(Node.class, nodeKey);
92 public static NodeKey nodeKeyFromDatapathId(final BigInteger datapathId) {
93 return new NodeKey(nodeIdFromDatapathId(datapathId));
96 public static NodeUpdatedBuilder nodeUpdatedBuilderFromDataPathId(final BigInteger datapathId) {
97 NodeUpdatedBuilder builder = new NodeUpdatedBuilder();
98 builder.setId(nodeIdFromDatapathId(datapathId));
99 builder.setNodeRef(nodeRefFromNodeKey(new NodeKey(builder.getId())));
103 public static NodeId nodeIdFromDatapathId(final BigInteger datapathId) {
104 // FIXME: Convert to textual representation of datapathID
105 String current = datapathId.toString();
106 return new NodeId(OF_URI_PREFIX + current);
109 public static BigInteger dataPathIdFromNodeId(final NodeId nodeId) {
110 String dpids = nodeId.getValue().replace(OF_URI_PREFIX, "");
111 BigInteger dpid = new BigInteger(dpids);
116 public static NodeRef nodeRefFromNodeKey(final NodeKey nodeKey) {
117 return new NodeRef(nodeKeyToInstanceIdentifier(nodeKey));
120 public static InstanceIdentifier<Node> nodeKeyToInstanceIdentifier(final NodeKey nodeKey) {
121 return NODES_IDENTIFIER.child(Node.class, nodeKey);
124 public static NodeConnectorId nodeConnectorIdfromDatapathPortNo(final BigInteger datapathid, final Long portNo,
125 final OpenflowVersion ofVersion) {
126 String logicalName = OpenflowPortsUtil.getPortLogicalName(ofVersion, portNo);
127 return new NodeConnectorId(OF_URI_PREFIX + datapathid + ":" + (logicalName == null ? portNo : logicalName));
130 public static Long portNumberfromNodeConnectorId(final OpenflowVersion ofVersion, final NodeConnectorId ncId) {
131 return portNumberfromNodeConnectorId(ofVersion, ncId.getValue());
134 public static String portNoStringfromNodeConnectorID(final String ncID) {
135 String[] split = ncID.split(":");
137 // It can happen that token length will be just 1 i.e 2 or CONTROLLER
138 // If the length is just one then this cannot be the new MD-SAL style node connector Id which
139 // is of the form openflow:1:3.
141 return split[split.length - 1];
144 public static Long portNumberfromNodeConnectorId(final OpenflowVersion ofVersion, final String ncId) {
145 String portNoString = portNoStringfromNodeConnectorID(ncId);
146 Long portNo = OpenflowPortsUtil.getPortFromLogicalName(ofVersion, portNoString);
151 public static NodeConnectorRef nodeConnectorRefFromDatapathIdPortno(final BigInteger datapathId, final Long portNo, final OpenflowVersion ofVersion) {
152 return new NodeConnectorRef(nodeConnectorInstanceIdentifierFromDatapathIdPortno(datapathId, portNo, ofVersion));
155 public static NodeConnectorRef nodeConnectorRefFromDatapathIdPortno(final BigInteger datapathId, final Long portNo,
156 final OpenflowVersion ofVersion,
157 final KeyedInstanceIdentifier<Node, NodeKey> nodePath) {
158 return new NodeConnectorRef(nodeConnectorInstanceIdentifierFromDatapathIdPortno(datapathId, portNo, ofVersion, nodePath));
161 public static InstanceIdentifier<NodeConnector> nodeConnectorInstanceIdentifierFromDatapathIdPortno(
162 final BigInteger datapathId, final Long portNo, final OpenflowVersion ofVersion) {
163 NodeId nodeId = nodeIdFromDatapathId(datapathId);
164 KeyedInstanceIdentifier<Node, NodeKey> nodePath = NODES_IDENTIFIER.child(Node.class, new NodeKey(nodeId));
165 return nodeConnectorInstanceIdentifierFromDatapathIdPortno(datapathId, portNo, ofVersion, nodePath);
168 public static InstanceIdentifier<NodeConnector> nodeConnectorInstanceIdentifierFromDatapathIdPortno(
169 final BigInteger datapathId, final Long portNo, final OpenflowVersion ofVersion, final KeyedInstanceIdentifier<Node, NodeKey> nodePath) {
170 NodeConnectorId nodeConnectorId = nodeConnectorIdfromDatapathPortNo(datapathId, portNo, ofVersion);
171 return nodePath.child(NodeConnector.class, new NodeConnectorKey(nodeConnectorId));
174 public static NodeConnectorUpdatedBuilder nodeConnectorUpdatedBuilderFromDatapathIdPortNo(final BigInteger datapathId,
175 final Long portNo, final OpenflowVersion ofVersion) {
176 NodeConnectorUpdatedBuilder builder = new NodeConnectorUpdatedBuilder();
177 builder.setId(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId, portNo, ofVersion));
178 builder.setNodeConnectorRef(InventoryDataServiceUtil.nodeConnectorRefFromDatapathIdPortno(datapathId, portNo, ofVersion));
182 public static NodeConnectorBuilder nodeConnectorBuilderFromDatapathIdPortNo(final BigInteger datapathId,
183 final Long portNo, final OpenflowVersion ofVersion) {
184 NodeConnectorBuilder builder = new NodeConnectorBuilder();
185 builder.setId(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId, portNo, ofVersion));
190 * @param dataPathId datapath id in big interger value
191 * @return string of size 16, padded with '0'
193 public static String bigIntegerToPaddedHex(final BigInteger dataPathId) {
194 return StringUtils.leftPad(dataPathId.toString(16), 16, "0");
197 //TODO : create new module openflowplugin-util, move there this method along with TestProviderTransactionUtil#getDataObject
198 private static <T extends DataObject> T getDataObject(final ReadTransaction readOnlyTransaction, final InstanceIdentifier<T> identifier) {
199 Optional<T> optionalData = null;
201 optionalData = readOnlyTransaction.read(LogicalDatastoreType.OPERATIONAL, identifier).get();
202 if (optionalData.isPresent()) {
203 return optionalData.get();
205 } catch (ExecutionException | InterruptedException e) {
206 LOG.error("Read transaction for identifier {} failed.", identifier, e);