description
"OTS interface provisioned on the port";
}
+ leaf port-direction{
+ type string;
+ description
+ "Useful for line port of XPDR, for which there is no
+ indication in its logical-termination-point naming";
+ }
+ leaf port-qual{
+ type string;
+ description
+ "Useful to identify from portmapping client from network ports of XPDR";
+ }
+ leaf associated-lcp{
+ type string;
+ description
+ "For XPDR, associate two logical-connection-points
+ from device/connnection-map data";
+ }
}
list cp-to-degree{
description
import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.interfaces.grp.Interface;
import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.interfaces.grp.InterfaceKey;
import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.OrgOpenroadmDevice;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.org.openroadm.device.ConnectionMap;
import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.org.openroadm.device.Degree;
import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.org.openroadm.device.DegreeKey;
import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.org.openroadm.device.Info;
LOG.warn("Circuit Packs are not present for {}", nodeId);
return false; // TODO return false or continue?
}
+ Map<String, String> lcpMap = new HashMap();
+ Map<String, Mapping> mappingMap = new HashMap();
List<CircuitPacks> circuitPackList = deviceObject.get().getCircuitPacks();
circuitPackList.sort(Comparator.comparing(CircuitPack::getCircuitPackName));
LOG.warn("Ports were not found for circuit pack: {}", circuitPackName);
continue;
}
-
- for (Ports port : cp.getPorts()) {
- if (port.getPortQual() == null) {
- continue;
- }
- if (PortQual.XpdrNetwork.getName().equals(port.getPortQual().getName())) {
- portMapList.add(createMappingObject(nodeId, port, circuitPackName,
- "XPDR1-" + StringConstants.NETWORK_TOKEN + line));
+ List<Ports> portList = cp.getPorts();
+ portList.sort(Comparator.comparing(Ports::getPortName));
+ for (Ports port : portList) {
+ if (PortQual.XpdrNetwork.getName().equals(port.getPortQual().getName())) {
+ String lcp = "XPDR1-" + StringConstants.NETWORK_TOKEN + line;
+ lcpMap.put(circuitPackName + '+' + port.getPortName(), lcp);
+ mappingMap.put(lcp, createXpdrMappingObject(nodeId, port, circuitPackName, lcp, null, null));
line++;
} else if (PortQual.XpdrClient.getName().equals(port.getPortQual().getName())) {
- portMapList.add(createMappingObject(nodeId, port, circuitPackName,
- "XPDR1-" + StringConstants.CLIENT_TOKEN + client));
+ String lcp = "XPDR1-" + StringConstants.CLIENT_TOKEN + client;
+ lcpMap.put(circuitPackName + '+' + port.getPortName(), lcp);
+ mappingMap.put(lcp, createXpdrMappingObject(nodeId, port, circuitPackName, lcp, null, null));
client++;
} else {
LOG.warn("Not supported type of port! Port type: {}", port.getPortQual().getName());
}
- LOG.info("portMapList Is {} {}",portMapList.size(),portMapList.get(0));
+ if (portMapList.size() == 0) {
+ LOG.info("portMapList is empty");
+ } else {
+ LOG.info("portMapList Is {} {}",portMapList.size(),portMapList.get(0));
+ }
+ }
+ }
+ List<ConnectionMap> connectionMap = deviceObject.get().getConnectionMap();
+ for (ConnectionMap cm : connectionMap) {
+ String skey = cm.getSource().getCircuitPackName() + "+" + cm.getSource().getPortName();
+ String slcp = lcpMap.get(skey);
+ String dkey = cm.getDestination().get(0).getCircuitPackName() + "+" + cm.getDestination().get(0)
+ .getPortName();
+ String dlcp = lcpMap.get(dkey);
+ Mapping mapping = mappingMap.get(slcp);
+ mappingMap.remove(slcp);
+ portMapList.add(createXpdrMappingObject(nodeId, null, null, null, mapping, dlcp));
+ }
+ if (!mappingMap.isEmpty()) {
+ for (Mapping m : mappingMap.values()) {
+ portMapList.add(m);
}
}
return true;
}
private Mapping createMappingObject(String nodeId, Ports port, String circuitPackName,
- String logicalConnectionPoint) {
+ String logicalConnectionPoint) {
MappingBuilder mpBldr = new MappingBuilder();
mpBldr.withKey(new MappingKey(logicalConnectionPoint)).setLogicalConnectionPoint(logicalConnectionPoint)
.setSupportingCircuitPackName(circuitPackName).setSupportingPort(port.getPortName());
return mpBldr.build();
}
+ private Mapping createXpdrMappingObject(String nodeId, Ports port, String circuitPackName,
+ String logicalConnectionPoint, Mapping mapping, String assoLcp) {
+ MappingBuilder mpBldr;
+ if (mapping != null && assoLcp != null) {
+ mpBldr = new MappingBuilder(mapping);
+ mpBldr.setAssociatedLcp(assoLcp);
+ } else {
+ mpBldr = new MappingBuilder();
+ mpBldr.withKey(new MappingKey(logicalConnectionPoint))
+ .setLogicalConnectionPoint(logicalConnectionPoint)
+ .setSupportingCircuitPackName(circuitPackName)
+ .setSupportingPort(port.getPortName())
+ .setPortDirection(port.getPortDirection().getName());
+ if (port.getPortQual() != null) {
+ mpBldr.setPortQual(port.getPortQual().getName());
+ }
+ }
+ return mpBldr.build();
+ }
+
private boolean createTtpPortMapping(String nodeId, Info deviceInfo, List<Mapping> portMapList) {
// Creating mapping data for degree TTP's
networkTransactionService.merge(LogicalDatastoreType.CONFIGURATION, iiOpenRoadmNode, openRoadmNode,
CREATE_MISSING_PARENTS);
-
- TopologyShard topologyShard = openRoadmFactory.createTopologyShardVersionControl(nodeId);
+ TopologyShard topologyShard =
+ openRoadmFactory.createTopologyShardVersionControl(portMapping.getNode(nodeId));
if (topologyShard == null) {
LOG.error("Unable to create topology shard for node {}!", nodeId);
*/
package org.opendaylight.transportpce.networkmodel.util;
-import org.opendaylight.transportpce.common.StringConstants;
import org.opendaylight.transportpce.common.mapping.MappingUtils;
import org.opendaylight.transportpce.common.network.NetworkTransactionService;
import org.opendaylight.transportpce.networkmodel.dto.TopologyShard;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev170228.network.Nodes;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.LinkBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
}
- public TopologyShard createTopologyShardVersionControl(String nodeId) {
- LOG.info("Create topology called for {}",nodeId);
- switch (mappingUtils.getOpenRoadmVersion(nodeId)) {
- case StringConstants.OPENROADM_DEVICE_VERSION_1_2_1:
- return openRoadmTopology121.createTopologyShard(nodeId);
- case StringConstants.OPENROADM_DEVICE_VERSION_2_2_1:
- LOG.info("Creating openroadm topology v2.2 node for {}",nodeId);
- return openRoadmTopology22.createTopologyShard(nodeId);
+ public TopologyShard createTopologyShardVersionControl(Nodes mappingNode) {
+ LOG.info("Create topology called for {} - version", mappingNode.getNodeId(),
+ mappingNode.getOpenroadmVersion().getName());
+ switch (mappingNode.getOpenroadmVersion().getName()) {
+ case "1.2.1":
+ return openRoadmTopology121.createTopologyShard(mappingNode.getNodeId());
+ case "2.2.1":
+ LOG.info("Creating openroadm topology v2.2 node for {}",mappingNode.getNodeId());
+ return openRoadmTopology22.createTopologyShard(mappingNode);
default:
return null;
import org.opendaylight.transportpce.common.network.NetworkTransactionService;
import org.opendaylight.transportpce.networkmodel.dto.NodeData;
import org.opendaylight.transportpce.networkmodel.dto.TopologyShard;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev170228.network.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev170228.network.nodes.Mapping;
import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.NetworkTypes1;
import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.NetworkTypes1Builder;
import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.networks.network.network.types.OpenroadmCommonNetworkBuilder;
return nwBuilder.build();
}
- public TopologyShard createTopologyShard(String nodeId) {
+ public TopologyShard createTopologyShard(Nodes mappingNode) {
int numOfDegrees;
int numOfSrgs;
int portDirectionEnum = DEFAULT_PORT_DIRECTION;
+ String nodeId = mappingNode.getNodeId();
InstanceIdentifier<Info> infoIID = InstanceIdentifier.create(OrgOpenroadmDevice.class).child(Info.class);
java.util.Optional<Info> deviceInfoOpt =
}
List<Node> nodes = new ArrayList<>();
// Check if node is ROADM
- if (NodeTypes.Rdm.getName().equals(deviceInfo.getNodeType().getName())) {
+ if (NodeTypes.Rdm.getName().equals(mappingNode.getNodeType().getName())) {
/*
* Adding Degree Node Get Degree Number -> x then get connection ports then find the port directions
links.addAll(createAddDropLinks(nodeId, numOfDegrees, numOfSrgs, portDirectionEnum));
LOG.info("created nodes/links: {}/{}", nodes.size(), links.size());
return new TopologyShard(nodes, links);
- } else if (NodeTypes.Xpdr.getName().equals(deviceInfo.getNodeType().getName())) {
+ } else if (NodeTypes.Xpdr.getName().equals(mappingNode.getNodeType().getName())) {
// Check if node is XPONDER
- Integer clientport = getNoOfClientPorts(nodeId);
+ LOG.info("creating xpdr node in openroadmtopology for node {}", mappingNode.getNodeId());
+ NodeBuilder ietfNode = createXpdr(mappingNode);
+ nodes.add(ietfNode.build());
List<Link> links = new ArrayList<>();
- Integer clientCounter = 1;
- Integer lineCounter = 1;
- while (clientCounter <= clientport) {
- NodeBuilder tempNode = createXpdr(clientCounter, lineCounter, nodeId);
- if (tempNode == null) {
- break;
- }
- nodes.add(tempNode.build());
- clientCounter++;
- lineCounter++;
- LOG.info("Entered this loop");
- }
return new TopologyShard(nodes, links);
}
LOG.error("Device node Type not managed yet");
return client;
}
- private NodeBuilder createXpdr(Integer clientCounter, Integer lineCounter, String nodeId) {
- // Create a generic Topo Layer node
- NodeBuilder nodebldr = createTopoLayerNode(nodeId);
- // Create augmentation node to inorder to add degree
- Node1Builder node1bldr = new Node1Builder();
- TerminationPoint1Builder tp1Bldr = new TerminationPoint1Builder();
- TerminationPointBuilder tempTpBldr;
-
- // set node type to Xponder
- node1bldr.setNodeType(OpenroadmNodeType.XPONDER);
+ private NodeBuilder createXpdr(Nodes mappingNode) {
+ // Create ietf node setting supporting-node data
+ NodeBuilder ietfNodeBldr = createTopoLayerNode(mappingNode.getNodeId());
+ // set node-id
+ String nodeIdtopo = new StringBuilder().append(mappingNode.getNodeId()).append("-XPDR1").toString();
+ ietfNodeBldr.setNodeId(new NodeId(nodeIdtopo));
+ ietfNodeBldr.withKey((new NodeKey(new NodeId(nodeIdtopo))));
+ // Create openroadm-network-topo augmentation to set node type to Xponder
+ Node1Builder ontNode1Bldr = new Node1Builder();
+ ontNode1Bldr.setNodeType(OpenroadmNodeType.XPONDER);
+ ietfNodeBldr.addAugmentation(Node1.class, ontNode1Bldr.build());
+
+ // Create tp-list
List<TerminationPoint> tpList = new ArrayList<>();
- String nodeIdtopo = new StringBuilder().append(nodeId).append("-XPDR1").toString();
- // Ad degree node specific augmentation
- nodebldr.setNodeId(new NodeId(nodeIdtopo));
- nodebldr.withKey((new NodeKey(new NodeId(nodeIdtopo))));
- nodebldr.addAugmentation(Node1.class, node1bldr.build());
- while (clientCounter != 0) {
- // Create CLNT-TX termination
- tempTpBldr = createTpBldr("XPDR1-CLIENT" + clientCounter);
- tp1Bldr.setTpType(OpenroadmTpType.XPONDERCLIENT);
- XpdrClientAttributesBuilder xpdrClntBldr = new XpdrClientAttributesBuilder();
- xpdrClntBldr.setTailEquipmentId("XPDR1-NETWORK" + clientCounter);
- tp1Bldr.setXpdrClientAttributes(xpdrClntBldr.build());
- tempTpBldr.addAugmentation(TerminationPoint1.class, tp1Bldr.build());
- tpList.add(tempTpBldr.build());
- clientCounter--; }
- while (lineCounter != 0) {
- // Create LINE-TX termination
- tempTpBldr = (createTpBldr("XPDR1-NETWORK" + lineCounter));
- tp1Bldr.setTpType(OpenroadmTpType.XPONDERNETWORK);
- XpdrNetworkAttributesBuilder xpdrNwAttrBldr = new XpdrNetworkAttributesBuilder();
- xpdrNwAttrBldr.setTailEquipmentId("XPDR1-CLIENT" + lineCounter);
- tp1Bldr.setXpdrNetworkAttributes(xpdrNwAttrBldr.build());
- tempTpBldr.addAugmentation(TerminationPoint1.class, tp1Bldr.build());
- tpList.add(tempTpBldr.build());
- lineCounter--; }
- LOG.info("printing tpList {}",tpList);
+ TerminationPointBuilder ietfTpBldr;
+ for (Mapping m : mappingNode.getMapping()) {
+ ietfTpBldr = createTpBldr(m.getLogicalConnectionPoint());
+ // Add openroadm-network-topology tp augmentations
+ TerminationPoint1Builder ontTp1Bldr = new TerminationPoint1Builder();
+ if (m.getPortQual().equals("xpdr-network")) {
+ ontTp1Bldr.setTpType(OpenroadmTpType.XPONDERNETWORK);
+ XpdrNetworkAttributesBuilder xpdrNwAttrBldr = new XpdrNetworkAttributesBuilder();
+ xpdrNwAttrBldr.setTailEquipmentId(m.getAssociatedLcp());
+ ontTp1Bldr.setXpdrNetworkAttributes(xpdrNwAttrBldr.build());
+ ietfTpBldr.addAugmentation(TerminationPoint1.class, ontTp1Bldr.build());
+ org.opendaylight.yang.gen.v1.http.transportpce.topology.rev190625
+ .TerminationPoint1Builder tpceTp1Bldr = new org.opendaylight.yang.gen.v1.http.transportpce
+ .topology.rev190625.TerminationPoint1Builder();
+ tpceTp1Bldr.setAssociatedConnectionMapPort(m.getAssociatedLcp());
+ ietfTpBldr.addAugmentation(org.opendaylight.yang.gen.v1.http.transportpce.topology.rev190625
+ .TerminationPoint1.class, tpceTp1Bldr.build());
+ tpList.add(ietfTpBldr.build());
+ } else if (m.getPortQual().equals("xpdr-client")) {
+ ontTp1Bldr.setTpType(OpenroadmTpType.XPONDERCLIENT);
+ XpdrClientAttributesBuilder xpdrNwAttrBldr = new XpdrClientAttributesBuilder();
+ xpdrNwAttrBldr.setTailEquipmentId(m.getAssociatedLcp());
+ ontTp1Bldr.setXpdrClientAttributes(xpdrNwAttrBldr.build());
+ ietfTpBldr.addAugmentation(TerminationPoint1.class, ontTp1Bldr.build());
+ org.opendaylight.yang.gen.v1.http.transportpce.topology.rev190625
+ .TerminationPoint1Builder tpceTp1Bldr = new org.opendaylight.yang.gen.v1.http.transportpce
+ .topology.rev190625.TerminationPoint1Builder();
+ tpceTp1Bldr.setAssociatedConnectionMapPort(m.getAssociatedLcp());
+ ietfTpBldr.addAugmentation(org.opendaylight.yang.gen.v1.http.transportpce.topology.rev190625
+ .TerminationPoint1.class, tpceTp1Bldr.build());
+ tpList.add(ietfTpBldr.build());
+ }
+ }
+
+ // Create ietf node augmentation to support ietf tp-list
org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
- .Node1Builder tpNode1 = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
- .ietf.network.topology.rev180226.Node1Builder();
- tpNode1.setTerminationPoint(tpList);
- nodebldr.addAugmentation(
- org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class,
- tpNode1.build());
- LOG.info("The nodebldr {}",nodebldr);
- return nodebldr;
+ .Node1Builder ietfNode1 = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology
+ .rev180226.Node1Builder();
+ ietfNode1.setTerminationPoint(tpList);
+ ietfNodeBldr.addAugmentation(
+ org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class,
+ ietfNode1.build());
+ return ietfNodeBldr;
}
--- /dev/null
+module transportpce-topology {
+ namespace "http://transportpce/topology";
+ prefix "tpce-topo";
+
+ import ietf-network {
+ prefix nd;
+ revision-date 2018-02-26;
+ }
+ import ietf-network-topology {
+ prefix nwt;
+ revision-date 2018-02-26;
+ }
+ import org-openroadm-common-network {
+ prefix cnet;
+ revision-date 2018-11-30;
+ }
+
+ organization
+ "TransportPCE team";
+ contact
+ "TransportPCE team";
+
+ revision 2019-06-25 {
+ description "Initial revision";
+ }
+
+ augment "/nd:networks/nd:network/nd:node/nwt:termination-point" {
+ when "../../nd:network-types/cnet:openroadm-common-network/openroadm-topology";
+ description
+ "Defines associated logical-connection-point for XPDR port.";
+ leaf associated-connection-map-port {
+ when
+ "../cnet:tp-type = 'XPONDER-CLIENT' or ../cnet:tp-type = 'XPONDER-NETWORK'";
+ type string;
+ description
+ "The xpdr port connectable regarding the device connection-map";
+ }
+ }
+}
\ No newline at end of file
{py27,rspn}: nosetests --with-xunit transportpce_tests/1.2.1/test_renderer_service_path_nominal.py
{py27,pce}: nosetests --with-xunit transportpce_tests/1.2.1/test_pce.py
{py27,olm}: nosetests --with-xunit transportpce_tests/1.2.1/test_olm.py
- #{py27,end2end}: - nosetests --with-xunit transportpce_tests/1.2.1/test_end2end.py
+ {end2end}: - nosetests --with-xunit transportpce_tests/1.2.1/test_end2end.py
{py27,portmapping221,rspn221,topology221,olm221,end2end221}: - ./buildHoneynode.sh 2.2.1
{py27,portmapping221}: nosetests --with-xunit transportpce_tests/2.2.1/test_portmapping.py
{py27,topology221}: nosetests --with-xunit transportpce_tests/2.2.1/test_topology.py
{py27,rspn221}: nosetests --with-xunit transportpce_tests/2.2.1/test_renderer_service_path_nominal.py
{py27,olm221}: nosetests --with-xunit transportpce_tests/2.2.1/test_olm.py
- {py27,end2end221}: - nosetests --with-xunit transportpce_tests/2.2.1/test_end2end.py
+ {end2end221}: - nosetests --with-xunit transportpce_tests/2.2.1/test_end2end.py
#{gnpy}: - sudo docker pull atriki/gnpyrest:v1.1
{gnpy}: - sudo docker run -d -p 8008:5000 --name gnpy_tpce_rest1 atriki/gnpyrest:v1.1
{gnpy}: nosetests --with-xunit transportpce_tests/1.2.1/test_gnpy.py