2 * Copyright (c) 2014 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.controller.md.compatibility.switchmanager
10 import java.net.InetAddress
11 import java.net.NetworkInterface
12 import java.net.SocketException
13 import java.util.ArrayList
14 import java.util.Collections
15 import java.util.HashSet
18 import org.opendaylight.controller.sal.binding.api.data.DataBrokerService
19 import org.opendaylight.controller.sal.core.Bandwidth
20 import org.opendaylight.controller.sal.core.Description
21 import org.opendaylight.controller.sal.core.ForwardingMode
22 import org.opendaylight.controller.sal.core.MacAddress
23 import org.opendaylight.controller.sal.core.Node
24 import org.opendaylight.controller.sal.core.NodeConnector
25 import org.opendaylight.controller.sal.core.Property
26 import org.opendaylight.controller.sal.core.Tier
27 import org.opendaylight.controller.switchmanager.ISwitchManager
28 import org.opendaylight.controller.switchmanager.Switch
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey
33 import org.opendaylight.yangtools.yang.binding.DataObject
34 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier
35 import org.slf4j.LoggerFactory
37 import static extension org.opendaylight.controller.sal.compatibility.NodeMapping.*
39 class CompatibleSwitchManager extends ConfigurableSwitchManager implements ISwitchManager {
41 private static val log = LoggerFactory.getLogger(CompatibleSwitchManager)
43 @org.eclipse.xtend.lib.Property
44 var DataBrokerService dataService;
46 override addNodeConnectorProp(NodeConnector nodeConnector, Property prop) {
47 val it = dataService.beginTransaction
48 val path = nodeConnector.toNodeConnectorRef
50 // TODO: Update FlowCapableNode
54 override createProperty(String propName, String propValue) {
56 if (propName.equalsIgnoreCase(Description.propertyName)) {
57 return new Description(propValue);
58 } else if (propName.equalsIgnoreCase(Tier.TierPropName)) {
59 val tier = Integer.parseInt(propValue);
60 return new Tier(tier);
61 } else if (propName.equalsIgnoreCase(Bandwidth.BandwidthPropName)) {
62 val bw = Long.parseLong(propValue);
63 return new Bandwidth(bw);
64 } else if (propName.equalsIgnoreCase(ForwardingMode.name)) {
65 val mode = Integer.parseInt(propValue);
66 return new ForwardingMode(mode);
67 } else if (propName.equalsIgnoreCase(MacAddress.name)) {
68 return new MacAddress(propValue);
70 log.debug("Not able to create {} property", propName);
72 } catch (Exception e) {
73 log.debug("createProperty caught exception {}", e.getMessage());
78 override doesNodeConnectorExist(NodeConnector nc) {
79 val ref = nc.toNodeConnectorRef
80 return dataService.readOperationalData(ref.value as InstanceIdentifier<? extends DataObject>) !== null
83 override getControllerMAC() {
84 var byte[] macAddress = null;
87 val nis = NetworkInterface.getNetworkInterfaces();
88 while (nis.hasMoreElements()) {
89 val ni = nis.nextElement();
91 macAddress = ni.getHardwareAddress();
93 } catch (SocketException e) {
94 log.error("Failed to acquire controller MAC: ", e);
97 } catch (SocketException e) {
98 log.error("Failed to acquire controller MAC: ", e);
102 if (macAddress == null) {
103 log.warn("Failed to acquire controller MAC: No physical interface found");
105 // This happens when running controller on windows VM, for example
106 // Try parsing the OS command output
111 override getControllerProperties() {
112 return Collections.emptyMap()
115 override getControllerProperty(String propertyName) {
119 override getNetworkDevices() {
120 val path = InstanceIdentifier.builder(Nodes).toInstance;
121 val data = dataService.readOperationalData(path) as Nodes;
122 val ret = new ArrayList<Switch>();
123 for (node : data.node) {
124 ret.add(node.toSwitch());
129 override getNodeConnector(Node node, String nodeConnectorName) {
130 val key = new NodeConnectorKey(new NodeConnectorId(nodeConnectorName));
131 return new NodeConnector(MD_SAL_TYPE, key, node);
134 override getNodeConnectorProp(NodeConnector nodeConnector, String propName) {
135 getNodeConnectorProps(nodeConnector).get(propName);
138 override getNodeConnectorProps(NodeConnector nodeConnector) {
139 val ref = nodeConnector.toNodeConnectorRef
140 val data = readNodeConnector(ref.value);
141 return data.toAdProperties();
144 override getNodeConnectors(Node node) {
145 val ref = node.toNodeRef;
146 val data = readNode(ref.value);
147 val ret = new HashSet();
148 for (nc : data.nodeConnector) {
150 val adConnector = new NodeConnector(MD_SAL_TYPE, nc.key, node);
151 ret.add(adConnector);
156 override getNodeDescription(Node node) {
157 (getNodeProps(node).get(Description.propertyName) as Description).value;
160 override getNodeMAC(Node node) {
161 (getNodeProps(node).get(MacAddress.name) as MacAddress).macAddress;
164 override getNodeProp(Node node, String propName) {
165 getNodeProps(node).get(propName)
168 override getNodeProps(Node node) {
169 val ref = node.toNodeRef;
170 val data = dataService.readOperationalData(ref.value as InstanceIdentifier<? extends DataObject>) as org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
171 return data.toAdProperties();
174 override getNodes() {
175 val path = InstanceIdentifier.builder(Nodes).toInstance;
176 val data = dataService.readOperationalData(path) as Nodes;
177 val ret = new HashSet<Node>();
178 for (node : data.node) {
179 ret.add(new Node(MD_SAL_TYPE, node.key));
184 def Switch toSwitch(org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node node) {
185 val adNode = new Node(MD_SAL_TYPE, node.key);
186 val sw = new Switch(adNode)
190 override getPhysicalNodeConnectors(Node node) {
191 val ref = node.toNodeRef;
192 val data = readNode(ref.value);
193 val ret = new HashSet();
194 for (nc : data.nodeConnector) {
195 val flowConnector = nc.getAugmentation(FlowCapableNodeConnector)
196 val adConnector = new NodeConnector(MD_SAL_TYPE, nc.key, node);
197 ret.add(adConnector);
202 def Map<String, Property> toAdProperties(
203 org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector connector) {
204 return Collections.emptyMap
207 def Map<String, Property> toAdProperties(
208 org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node connector) {
209 return Collections.emptyMap
212 def readNode(InstanceIdentifier<?> ref) {
213 dataService.readOperationalData(ref as InstanceIdentifier<? extends DataObject>) as org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node
216 def readNodeConnector(InstanceIdentifier<?> ref) {
217 dataService.readOperationalData(ref as InstanceIdentifier<? extends DataObject>) as org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector
220 override getSpanPorts(Node node) {
221 throw new UnsupportedOperationException("TODO: auto-generated method stub")
224 override getSubnetByNetworkAddress(InetAddress networkAddress) {
225 throw new UnsupportedOperationException("TODO: auto-generated method stub")
228 override getUpNodeConnectors(Node node) {
229 val ref = node.toNodeRef
230 val data = readNode(ref.value);
231 val ret = new HashSet<NodeConnector>();
232 for (nc : data.nodeConnector) {
233 val flowConn = nc.getAugmentation(FlowCapableNodeConnector);
234 if (flowConn != null && flowConn.state != null && !flowConn.state.linkDown) {
235 ret.add(new NodeConnector(MD_SAL_TYPE, nc.key, node));
241 override isNodeConnectorEnabled(NodeConnector nodeConnector) {
242 val ref = nodeConnector.toNodeConnectorRef
243 val data = readNodeConnector(ref.value);
248 override isSpecial(NodeConnector p) {
249 val ref = p.toNodeConnectorRef
250 val data = readNodeConnector(ref.value);
255 override removeControllerProperty(String propertyName) {
259 override removeNodeAllProps(Node node) {
260 // NOOP: not supported node has more properties than AD-SAL is capable to see
263 override removeNodeConnectorAllProps(NodeConnector nodeConnector) {
264 // NOOP: not supported node has more properties than AD-SAL is capable to see
267 override removeNodeConnectorProp(NodeConnector nc, String propName) {
268 // NOOP: not supported node has more properties than AD-SAL is capable to see
271 override removeNodeProp(Node node, String propName) {
272 // NOOP: not supported node has more properties than AD-SAL is capable to see
275 override removePortsFromSubnet(String name, List<String> nodeConnectors) {
279 override removeSubnet(String name) {
283 override setControllerProperty(Property property) {
287 override setNodeProp(Node node, Property prop) {
288 throw new UnsupportedOperationException("TODO: auto-generated method stub")
291 override addPortsToSubnet(String name, List<String> nodeConnectors) {
292 throw new UnsupportedOperationException("TODO: auto-generated method stub")
295 override getConfiguredNotConnectedSwitches() {