1 package org.opendaylight.controller.md.compatibility.switchmanager
3 import org.opendaylight.controller.switchmanager.ISwitchManager
4 import org.opendaylight.controller.sal.core.NodeConnector
5 import org.opendaylight.controller.sal.core.Property
7 import org.opendaylight.controller.sal.core.Node
8 import java.net.InetAddress
9 import org.opendaylight.controller.sal.binding.api.data.DataBrokerService
10 import static extension org.opendaylight.controller.sal.compatibility.NodeMapping.*
11 import org.opendaylight.controller.sal.core.Description
12 import org.opendaylight.controller.sal.core.Tier
13 import org.opendaylight.controller.sal.core.Bandwidth
14 import org.opendaylight.controller.sal.core.ForwardingMode
15 import org.opendaylight.controller.sal.core.MacAddress
17 import org.slf4j.LoggerFactory
18 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier
19 import org.opendaylight.yangtools.yang.binding.DataObject
20 import java.net.NetworkInterface
21 import java.net.SocketException
22 import java.util.Collections
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes
24 import java.util.ArrayList
25 import org.opendaylight.controller.switchmanager.Switch
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId
29 import java.util.HashSet
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortState
33 class CompatibleSwitchManager extends ConfigurableSwitchManager implements ISwitchManager {
35 private static val log = LoggerFactory.getLogger(CompatibleSwitchManager)
37 @org.eclipse.xtend.lib.Property
38 var DataBrokerService dataService;
40 override addNodeConnectorProp(NodeConnector nodeConnector, Property prop) {
41 val it = dataService.beginTransaction
42 val path = nodeConnector.toNodeConnectorRef
44 // TODO: Update FlowCapableNode
48 override createProperty(String propName, String propValue) {
50 if (propName.equalsIgnoreCase(Description.propertyName)) {
51 return new Description(propValue);
52 } else if (propName.equalsIgnoreCase(Tier.TierPropName)) {
53 val tier = Integer.parseInt(propValue);
54 return new Tier(tier);
55 } else if (propName.equalsIgnoreCase(Bandwidth.BandwidthPropName)) {
56 val bw = Long.parseLong(propValue);
57 return new Bandwidth(bw);
58 } else if (propName.equalsIgnoreCase(ForwardingMode.name)) {
59 val mode = Integer.parseInt(propValue);
60 return new ForwardingMode(mode);
61 } else if (propName.equalsIgnoreCase(MacAddress.name)) {
62 return new MacAddress(propValue);
64 log.debug("Not able to create {} property", propName);
66 } catch (Exception e) {
67 log.debug("createProperty caught exception {}", e.getMessage());
72 override doesNodeConnectorExist(NodeConnector nc) {
73 val ref = nc.toNodeConnectorRef
74 return dataService.readOperationalData(ref.value as InstanceIdentifier<? extends DataObject>) !== null
77 override getControllerMAC() {
78 var byte[] macAddress = null;
81 val nis = NetworkInterface.getNetworkInterfaces();
82 while (nis.hasMoreElements()) {
83 val ni = nis.nextElement();
85 macAddress = ni.getHardwareAddress();
87 } catch (SocketException e) {
88 log.error("Failed to acquire controller MAC: ", e);
91 } catch (SocketException e) {
92 log.error("Failed to acquire controller MAC: ", e);
96 if (macAddress == null) {
97 log.warn("Failed to acquire controller MAC: No physical interface found");
99 // This happens when running controller on windows VM, for example
100 // Try parsing the OS command output
105 override getControllerProperties() {
106 return Collections.emptyMap()
109 override getControllerProperty(String propertyName) {
113 override getNetworkDevices() {
114 val path = InstanceIdentifier.builder().node(Nodes).toInstance;
115 val data = dataService.readOperationalData(path) as Nodes;
116 val ret = new ArrayList<Switch>();
117 for (node : data.node) {
118 ret.add(node.toSwitch());
123 override getNodeConnector(Node node, String nodeConnectorName) {
124 val key = new NodeConnectorKey(new NodeConnectorId(nodeConnectorName));
125 return new NodeConnector(MD_SAL_TYPE, key, node);
128 override getNodeConnectorProp(NodeConnector nodeConnector, String propName) {
129 getNodeConnectorProps(nodeConnector).get(propName);
132 override getNodeConnectorProps(NodeConnector nodeConnector) {
133 val ref = nodeConnector.toNodeConnectorRef
134 val data = readNodeConnector(ref.value);
135 return data.toAdProperties();
138 override getNodeConnectors(Node node) {
139 val ref = node.toNodeRef;
140 val data = readNode(ref.value);
141 val ret = new HashSet();
142 for (nc : data.nodeConnector) {
144 val adConnector = new NodeConnector(MD_SAL_TYPE, nc.key, node);
145 ret.add(adConnector);
150 override getNodeDescription(Node node) {
151 (getNodeProps(node).get(Description.propertyName) as Description).value;
154 override getNodeMAC(Node node) {
155 (getNodeProps(node).get(MacAddress.name) as MacAddress).macAddress;
158 override getNodeProp(Node node, String propName) {
159 getNodeProps(node).get(propName)
162 override getNodeProps(Node node) {
163 val ref = node.toNodeRef;
164 val data = dataService.readOperationalData(ref.value as InstanceIdentifier<? extends DataObject>) as org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
165 return data.toAdProperties();
168 override getNodes() {
169 val path = InstanceIdentifier.builder().node(Nodes).toInstance;
170 val data = dataService.readOperationalData(path) as Nodes;
171 val ret = new HashSet<Node>();
172 for (node : data.node) {
173 ret.add(new Node(MD_SAL_TYPE, node.key));
178 def Switch toSwitch(org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node node) {
179 val adNode = new Node(MD_SAL_TYPE, node.key);
180 val sw = new Switch(adNode)
184 override getPhysicalNodeConnectors(Node node) {
185 val ref = node.toNodeRef;
186 val data = readNode(ref.value);
187 val ret = new HashSet();
188 for (nc : data.nodeConnector) {
189 val flowConnector = nc.getAugmentation(FlowCapableNodeConnector)
190 val adConnector = new NodeConnector(MD_SAL_TYPE, nc.key, node);
191 ret.add(adConnector);
196 def Map<String, Property> toAdProperties(
197 org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector connector) {
198 return Collections.emptyMap
201 def Map<String, Property> toAdProperties(
202 org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node connector) {
203 return Collections.emptyMap
206 def readNode(InstanceIdentifier<?> ref) {
207 dataService.readOperationalData(ref as InstanceIdentifier<? extends DataObject>) as org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node
210 def readNodeConnector(InstanceIdentifier<?> ref) {
211 dataService.readOperationalData(ref as InstanceIdentifier<? extends DataObject>) as org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector
214 override getSpanPorts(Node node) {
215 throw new UnsupportedOperationException("TODO: auto-generated method stub")
218 override getSubnetByNetworkAddress(InetAddress networkAddress) {
219 throw new UnsupportedOperationException("TODO: auto-generated method stub")
222 override getUpNodeConnectors(Node node) {
223 val ref = node.toNodeRef
224 val data = readNode(ref.value);
225 val ret = new HashSet<NodeConnector>();
226 for (nc : data.nodeConnector) {
227 val flowConn = nc.getAugmentation(FlowCapableNodeConnector);
228 if (flowConn != null && flowConn.state != null && !flowConn.state.linkDown) {
229 ret.add(new NodeConnector(MD_SAL_TYPE, nc.key, node));
235 override isNodeConnectorEnabled(NodeConnector nodeConnector) {
236 val ref = nodeConnector.toNodeConnectorRef
237 val data = readNodeConnector(ref.value);
242 override isSpecial(NodeConnector p) {
243 val ref = p.toNodeConnectorRef
244 val data = readNodeConnector(ref.value);
249 override removeControllerProperty(String propertyName) {
253 override removeNodeAllProps(Node node) {
254 // NOOP: not supported node has more properties than AD-SAL is capable to see
257 override removeNodeConnectorAllProps(NodeConnector nodeConnector) {
258 // NOOP: not supported node has more properties than AD-SAL is capable to see
261 override removeNodeConnectorProp(NodeConnector nc, String propName) {
262 // NOOP: not supported node has more properties than AD-SAL is capable to see
265 override removeNodeProp(Node node, String propName) {
266 // NOOP: not supported node has more properties than AD-SAL is capable to see
269 override removePortsFromSubnet(String name, List<String> nodeConnectors) {
273 override removeSubnet(String name) {
277 override setControllerProperty(Property property) {
281 override setNodeProp(Node node, Property prop) {
282 throw new UnsupportedOperationException("TODO: auto-generated method stub")
285 override addPortsToSubnet(String name, List<String> nodeConnectors) {
286 throw new UnsupportedOperationException("TODO: auto-generated method stub")
289 override getConfiguredNotConnectedSwitches() {