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.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
11 import org.opendaylight.openflowplugin.openflow.md.core.session.OFSessionUtil;
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorUpdatedBuilder;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeUpdatedBuilder;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
24 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
25 import org.slf4j.Logger;
26 import org.slf4j.LoggerFactory;
28 import java.math.BigInteger;
29 import java.util.List;
31 public abstract class InventoryDataServiceUtil {
32 private final static Logger LOG = LoggerFactory.getLogger(InventoryDataServiceUtil.class);
34 public final static String OF_URI_PREFIX = "openflow:";
36 * Get an InstanceIdentifier for the Nodes class that is the root of the
37 * inventory tree We use this alot, so its worth keeping around
39 private static InstanceIdentifier<Nodes> nodesIdentifier = InstanceIdentifier.builder(Nodes.class)
42 public static Nodes checkForNodes() {
44 LOG.error("Before Nodes - nodes: " + nodes);
46 nodes = (Nodes) OFSessionUtil.getSessionManager().getDataProviderService()
47 .readOperationalData(nodesIdentifier);
48 } catch (Exception e) {
50 "Caught exception from OFSessionUtil.getSessionManager().getDataProviderService().readOperationalData",
53 LOG.error("After Nodes- nodes: " + nodes);
57 public static List<Node> readAllNodes() {
58 Nodes nodes = (Nodes) OFSessionUtil.getSessionManager().getDataProviderService()
59 .readOperationalData(nodesIdentifier);
60 return nodes.getNode();
63 public static Node readNode(InstanceIdentifier<Node> instance) {
64 return (Node) OFSessionUtil.getSessionManager().getDataProviderService().readOperationalData(instance);
67 public static Node readNode(NodeRef nodeRef) {
68 return readNode((InstanceIdentifier<Node>) nodeRef.getValue());
71 public static Node readNode(NodeKey nodeKey) {
72 return readNode(nodeKeyToInstanceIdentifier(nodeKey));
75 public static Node readNode(NodeId nodeId) {
76 return readNode(new NodeKey(nodeId));
79 public static Node readNodeByDataPath(BigInteger datapathId) {
80 return (Node) OFSessionUtil.getSessionManager().getDataProviderService()
81 .readOperationalData(identifierFromDatapathId(datapathId));
84 public static void putNode(Node node) {
85 DataModificationTransaction transaction = OFSessionUtil.getSessionManager().getDataProviderService()
87 transaction.putOperationalData(nodesIdentifier, node);
91 public static void putNodeConnector(InstanceIdentifier<Node> instance, NodeConnector nodeConnector) {
92 DataModificationTransaction transaction = OFSessionUtil.getSessionManager().getDataProviderService()
94 transaction.putOperationalData(instance, nodeConnector);
98 public static void putNodeConnector(NodeKey nodeKey, NodeConnector nodeConnector) {
99 InstanceIdentifier<Node> instance = nodeKeyToInstanceIdentifier(nodeKey);
100 putNodeConnector(instance, nodeConnector);
103 public static void putNodeConnector(NodeId nodeId, NodeConnector nodeConnector) {
104 putNodeConnector(new NodeKey(nodeId), nodeConnector);
107 public static void putNodeConnector(BigInteger datapathId, NodeConnector nodeConnector) {
108 putNodeConnector(new NodeId(OF_URI_PREFIX + datapathId), nodeConnector);
111 public static InstanceIdentifier<Node> identifierFromDatapathId(BigInteger datapathId) {
112 NodeKey nodeKey = nodeKeyFromDatapathId(datapathId);
113 return InstanceIdentifier.builder(Nodes.class).child(Node.class, nodeKey).toInstance();
116 public static NodeKey nodeKeyFromDatapathId(BigInteger datapathId) {
117 return new NodeKey(nodeIdFromDatapathId(datapathId));
120 public static NodeUpdatedBuilder nodeUpdatedBuilderFromDataPathId(BigInteger datapathId) {
121 NodeUpdatedBuilder builder = new NodeUpdatedBuilder();
122 builder.setId(nodeIdFromDatapathId(datapathId));
123 builder.setNodeRef(nodeRefFromNodeKey(new NodeKey(builder.getId())));
127 public static NodeId nodeIdFromDatapathId(BigInteger datapathId) {
128 // FIXME: Convert to textual representation of datapathID
129 String current = datapathId.toString();
130 return new NodeId(OF_URI_PREFIX + current);
133 public static Long dataPathIdFromNodeId(NodeId nodeId) {
134 String dpids = nodeId.getValue().replace(OF_URI_PREFIX, "");
135 Long dpid = Long.decode(dpids);
139 public static NodeRef nodeRefFromNode(Node node) {
140 return nodeRefFromNodeKey(node.getKey());
143 public static NodeRef nodeRefFromNodeKey(NodeKey nodeKey) {
144 return new NodeRef(nodeKeyToInstanceIdentifier(nodeKey));
147 public static InstanceIdentifier<Node> nodeKeyToInstanceIdentifier(NodeKey nodeKey) {
148 return InstanceIdentifier.builder(Nodes.class).child(Node.class, nodeKey).toInstance();
151 public static InstanceIdentifier<Node> nodeIdToInstanceIdentifier(NodeId nodeId) {
152 return nodeKeyToInstanceIdentifier(new NodeKey(nodeId));
155 public static NodeConnectorId nodeConnectorIdfromDatapathPortNo(BigInteger datapathid, Long portNo) {
156 return new NodeConnectorId(OF_URI_PREFIX + datapathid + ":" + portNo);
159 public static Long portNumberfromNodeConnectorId(NodeConnectorId ncId) {
160 return portNumberfromNodeConnectorId(ncId.getValue());
163 public static Long portNumberfromNodeConnectorId(String ncId){
164 String[] split = ncId.split(":");
166 // If the length is just one then this cannot be the new MD-SAL style node connector Id which
167 // is of the form openflow:1:3.
168 if(split.length == 1){
169 return Long.decode(ncId);
171 String portNoString = split[split.length-1];
172 Long portNo = Long.decode(portNoString);
178 public static NodeConnectorRef nodeConnectorRefFromDatapathIdPortno(BigInteger datapathId, Long portNo) {
179 return new NodeConnectorRef(nodeConnectorInstanceIdentifierFromDatapathIdPortno(datapathId, portNo));
182 public static InstanceIdentifier<NodeConnector> nodeConnectorInstanceIdentifierFromDatapathIdPortno(
183 BigInteger datapathId, Long portNo) {
184 NodeId nodeId = nodeIdFromDatapathId(datapathId);
185 NodeConnectorId nodeConnectorId = nodeConnectorIdfromDatapathPortNo(datapathId, portNo);
186 return InstanceIdentifier.builder(Nodes.class) //
187 .child(Node.class, new NodeKey(nodeId)) //
188 .child(NodeConnector.class, new NodeConnectorKey(nodeConnectorId)).toInstance();
191 public static NodeConnectorUpdatedBuilder nodeConnectorUpdatedBuilderFromDatapathIdPortNo(BigInteger datapathId, Long portNo) {
192 NodeConnectorUpdatedBuilder builder = new NodeConnectorUpdatedBuilder();
193 builder.setId(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId,portNo));
194 builder.setNodeConnectorRef(InventoryDataServiceUtil.nodeConnectorRefFromDatapathIdPortno(datapathId,portNo));
198 public static NodeConnectorBuilder nodeConnectorBuilderFromDatapathIdPortNo(BigInteger datapathId, Long portNo) {
199 NodeConnectorBuilder builder = new NodeConnectorBuilder();
200 builder.setId(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId,portNo));