From: Tony Tkacik Date: Thu, 7 Nov 2013 10:40:48 +0000 (+0100) Subject: Added MD-SAL Topology Reader for reading and accessing AD-SAL topology. X-Git-Tag: jenkins-controller-bulk-release-prepare-only-2-1~474^2 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=dba622bd5b8444f8a7ef3597a8d1652fe424b448;hp=-c;ds=sidebyside Added MD-SAL Topology Reader for reading and accessing AD-SAL topology. Change-Id: I7441c0f148cc891e552bd673c41902ad4f5ecd54 Signed-off-by: Tony Tkacik --- dba622bd5b8444f8a7ef3597a8d1652fe424b448 diff --git a/opendaylight/md-sal/compatibility/inventory-topology-compatibility/src/main/java/org/opendaylight/controller/md/compatibility/topology/TopologyMapping.xtend b/opendaylight/md-sal/compatibility/inventory-topology-compatibility/src/main/java/org/opendaylight/controller/md/compatibility/topology/TopologyMapping.xtend new file mode 100644 index 0000000000..2ae74de108 --- /dev/null +++ b/opendaylight/md-sal/compatibility/inventory-topology-compatibility/src/main/java/org/opendaylight/controller/md/compatibility/topology/TopologyMapping.xtend @@ -0,0 +1,77 @@ +package org.opendaylight.controller.md.compatibility.topology + +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier +import org.opendaylight.yangtools.yang.binding.DataObject +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.TopologyKey +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.Topology +import org.opendaylight.controller.sal.core.Edge +import java.util.Set +import org.opendaylight.controller.sal.core.Property +import org.opendaylight.controller.sal.core.NodeConnector + +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.node.TerminationPoint +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.Link +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.node.TerminationPointKey +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.TpId +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.NodeKey +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.NodeId +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.LinkKey +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.LinkId +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.IdentifiableItem +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.Node + +class TopologyMapping { + + new(TopologyKey path, InstanceIdentifier key) { + // NOOP + } + + def Edge toAdTopologyEdge(InstanceIdentifier identifier) { + val linkKey = (identifier.path.last as IdentifiableItem).key; + val components = linkKey.linkId.value.split("::::"); + val tail = nodeConnectorFromString(components.get(0).split("::")); + val head = nodeConnectorFromString(components.get(1).split("::")); + return new Edge(tail, head); + } + + def NodeConnector toAdTopologyNodeConnector(InstanceIdentifier identifier) { + val tpKey = (identifier.path.last as IdentifiableItem).key; + return nodeConnectorFromString(tpKey.tpId.value.split("::")); + } + + def org.opendaylight.controller.sal.core.Node toAdTopologyNode( + InstanceIdentifier identifier) { + val tpKey = (identifier.path.last as IdentifiableItem).key; + return nodeFromString(tpKey.nodeId.value.split("::")); + } + + + + def NodeKey toTopologyNodeKey(org.opendaylight.controller.sal.core.Node node) { + val nodeId = new NodeId('''ad-sal:«node.type»::«node.nodeIDString»''') + return new NodeKey(nodeId); + } + + def TerminationPointKey toTopologyTerminationPointKey(NodeConnector nc) { + val node = nc.node; + val nodeId = new TpId('''ad-sal:«node.type»::«node.nodeIDString»::«nc.nodeConnectorIDString»''') + return new TerminationPointKey(nodeId); + } + + def LinkKey toTopologyLinkKey(Edge edge) { + val sourceTp = edge.tailNodeConnector.toTopologyTerminationPointKey; + val destTp = edge.headNodeConnector.toTopologyTerminationPointKey; + val linkId = new LinkId('''«sourceTp.tpId»::::«destTp.tpId»''') + return new LinkKey(linkId); + } + + def NodeConnector nodeConnectorFromString(String[] string) { + val node = nodeFromString(string.subList(0,1)); + return NodeConnector.fromStringNoNode(string.get(2),node); + } + + def org.opendaylight.controller.sal.core.Node nodeFromString(String[] strings) { + val type = strings.get(0).substring(6); + org.opendaylight.controller.sal.core.Node.fromString(type,strings.get(1)) + } +} diff --git a/opendaylight/md-sal/compatibility/inventory-topology-compatibility/src/main/java/org/opendaylight/controller/md/compatibility/topology/TopologyReader.xtend b/opendaylight/md-sal/compatibility/inventory-topology-compatibility/src/main/java/org/opendaylight/controller/md/compatibility/topology/TopologyReader.xtend new file mode 100644 index 0000000000..fb9d2b8786 --- /dev/null +++ b/opendaylight/md-sal/compatibility/inventory-topology-compatibility/src/main/java/org/opendaylight/controller/md/compatibility/topology/TopologyReader.xtend @@ -0,0 +1,151 @@ +package org.opendaylight.controller.md.compatibility.topology + +import org.opendaylight.controller.switchmanager.ISwitchManager +import org.opendaylight.controller.topologymanager.ITopologyManager +import org.opendaylight.controller.md.sal.common.api.data.DataReader +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier +import org.opendaylight.yangtools.yang.binding.DataObject +import org.opendaylight.controller.sal.binding.api.data.RuntimeDataProvider +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.Topology +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.Node +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.node.TerminationPoint +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.Link +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.TopologyKey +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.NetworkTopology +import org.opendaylight.controller.md.compatibility.topology.TopologyMapping +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.LinkBuilder + +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.TopologyBuilder +import java.util.ArrayList +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.NodeBuilder +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.NodeKey +import org.opendaylight.controller.sal.core.NodeConnector +import org.opendaylight.controller.sal.topology.TopoEdgeUpdate +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.TopologyId +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.node.TerminationPointBuilder +import org.opendaylight.controller.sal.core.Edge +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.link.attributes.SourceBuilder +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.link.attributes.DestinationBuilder + +class TopologyReader implements RuntimeDataProvider { + + @Property + var ISwitchManager switchManager; + + @Property + var ITopologyManager topologyManager; + + @Property + val TopologyKey topologyKey; + + @Property + val InstanceIdentifier topologyPath; + + @Property + val extension TopologyMapping mapping; + + new() { + _topologyKey = new TopologyKey(new TopologyId("compatibility:ad-sal")); + _topologyPath = InstanceIdentifier.builder().node(NetworkTopology).child(Topology, topologyKey).toInstance; + _mapping = new TopologyMapping(topologyKey, topologyPath); + } + + override readConfigurationData(InstanceIdentifier path) { + + // Topology and Inventory are operational only + return null; + } + + override readOperationalData(InstanceIdentifier path) { + val type = path.targetType; + var DataObject data = null; + if (false == topologyPath.contains(path)) { + return null; + } + switch (type) { + case Topology: + data = readTopology(path as InstanceIdentifier) + case Node: + data = readNode(path as InstanceIdentifier) + case TerminationPoint: + data = readTerminationPoint(path as InstanceIdentifier) + case Link: + data = readLink(path as InstanceIdentifier) + } + return data; + } + + def DataObject readLink(InstanceIdentifier identifier) { + val edge = identifier.toAdTopologyEdge(); + val properties = topologyManager?.edges?.get(edge); + + return constructLink(edge); + } + + def DataObject readTerminationPoint(InstanceIdentifier identifier) { + val nodeConnector = identifier.toAdTopologyNodeConnector(); + return constructTerminationPoint(nodeConnector) + } + + def DataObject readNode(InstanceIdentifier identifier) { + val node = identifier.toAdTopologyNode(); + return constructNode(node); + } + + def DataObject readTopology(InstanceIdentifier identifier) { + + //val nodeConnectors = switchManager. + val nodes = switchManager.nodes + val edges = topologyManager.edges + + val nodeList = new ArrayList(nodes.size) + for (node : nodes) { + nodeList.add(constructNode(node)) + } + + val linkList = new ArrayList(edges.size) + for (edge : edges.keySet) { + linkList.add(constructLink(edge)) + } + + val it = new TopologyBuilder(); + key = topologyKey + node = nodeList + link = linkList + return build() + } + + def constructLink(Edge edge) { + val sourceNc = edge.tailNodeConnector + val destNc = edge.headNodeConnector + + val it = new LinkBuilder() + key = edge.toTopologyLinkKey(); + source = new SourceBuilder().setSourceNode(sourceNc.node.toTopologyNodeKey.nodeId).setSourceTp( + sourceNc.toTopologyTerminationPointKey.tpId).build() + destination = new DestinationBuilder().setDestNode(destNc.node.toTopologyNodeKey.nodeId).setDestTp( + destNc.toTopologyTerminationPointKey.tpId).build + return build() + } + + def Node constructNode(org.opendaylight.controller.sal.core.Node node) { + val connectors = switchManager.getNodeConnectors(node) + + val tpList = new ArrayList(connectors.size) + for (connector : connectors) { + tpList.add(constructTerminationPoint(connector)); + } + + val it = new NodeBuilder() + key = node.toTopologyNodeKey(); + terminationPoint = tpList + return build(); + } + + def TerminationPoint constructTerminationPoint(NodeConnector connector) { + val it = new TerminationPointBuilder() + key = connector.toTopologyTerminationPointKey + return build(); + } + +}