Add OTN links support in TAPI topology 49/92949/1
authorGilles Thouenon <gilles.thouenon@orange.com>
Wed, 7 Oct 2020 15:48:01 +0000 (17:48 +0200)
committerGuillaume Lambert <guillaume.lambert@orange.com>
Fri, 9 Oct 2020 09:41:44 +0000 (09:41 +0000)
- Add OTN OTU4 and ODU4 links in TAPI topology. Replace 2
  unidirectional OTU4 links in OpenROADM otn-topology by a single
  bidirectional Photonics link in TAPI. In the same way, replace 2
  unidirectional ODU4 links in OpenROADM otn-topology by a single
  bidirectional ODU link in TAPI topology
- add new Unitary tests for TAPI otn links
- add a new sample OpenROADM otn-topology XML file
  containing more nodes with OTN links as input for UTs
- adapt UUID creation to take into account new OTN topology context
- wait that the XML input file has been written in datastore before
  getting topology from it in UT

JIRA: TRNSPRTPCE-185
Signed-off-by: Gilles Thouenon <gilles.thouenon@orange.com>
Co-authored-by: Christophe Betoule <christophe.betoule@orange.com>
Change-Id: I5c762f30d3bd290b98d04d7f960fb1077be3a111
(cherry picked from commit a01f4032cd7dc71e3f047db5b3e2db77c4733b2c)

tapi/src/main/java/org/opendaylight/transportpce/tapi/topology/ConvertORTopoObjectToTapiTopoObject.java
tapi/src/main/java/org/opendaylight/transportpce/tapi/topology/TapiTopologyImpl.java
tapi/src/test/java/org/opendaylight/transportpce/tapi/topology/TapiTopologyImplTest.java
tapi/src/test/java/org/opendaylight/transportpce/tapi/utils/TopologyDataUtils.java
tapi/src/test/resources/otn-topology-with-otn-links.xml [new file with mode: 0644]

index 7203fa12434cf910e548a2a3ed1f51fb0bb1fa3d..12d81cb6d8978541cb0b5fc6295ac15f83ca2c04 100644 (file)
@@ -39,6 +39,7 @@ import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Term
 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Uuid;
 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.capacity.TotalSizeBuilder;
 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.capacity.pac.AvailableCapacityBuilder;
 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Uuid;
 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.capacity.TotalSizeBuilder;
 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.capacity.pac.AvailableCapacityBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.capacity.pac.TotalPotentialCapacityBuilder;
 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.Name;
 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameBuilder;
 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameKey;
 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.Name;
 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameBuilder;
 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameKey;
@@ -74,13 +75,13 @@ import org.opendaylight.yangtools.yang.common.Uint64;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+
 public class ConvertORTopoObjectToTapiTopoObject {
 
 public class ConvertORTopoObjectToTapiTopoObject {
 
-    private static final String DSR_PLUS = "DSR+";
-    private static final String PLUS_DSR = "+DSR";
-    private static final String OT_SI = "+OTSi";
-    private static final String E_OT_SI = "eOTSi+";
-    private static final String I_OT_SI = "iOTSi+";
+    private static final String DSR = "DSR";
+    private static final String OTSI = "OTSi";
+    private static final String E_OTSI = "eOTSi";
+    private static final String I_OTSI = "iOTSi";
     private static final Logger LOG = LoggerFactory.getLogger(ConvertORTopoObjectToTapiTopoObject.class);
     private String ietfNodeId;
     private List<TerminationPoint> oorClientPortList;
     private static final Logger LOG = LoggerFactory.getLogger(ConvertORTopoObjectToTapiTopoObject.class);
     private String ietfNodeId;
     private List<TerminationPoint> oorClientPortList;
@@ -92,7 +93,15 @@ public class ConvertORTopoObjectToTapiTopoObject {
     private Map<LinkKey, Link> tapiLinks;
     private Map<String, Uuid> uuidMap;
 
     private Map<LinkKey, Link> tapiLinks;
     private Map<String, Uuid> uuidMap;
 
-    public ConvertORTopoObjectToTapiTopoObject(Node ietfNode, Link1 otnLink, Uuid tapiTopoUuid) {
+
+    public ConvertORTopoObjectToTapiTopoObject(Uuid tapiTopoUuid) {
+        this.tapiTopoUuid = tapiTopoUuid;
+        this.tapiNodes = new HashMap<>();
+        this.tapiLinks = new HashMap<>();
+        this.uuidMap = new HashMap<>();
+    }
+
+    public void convertNode(Node ietfNode) {
         this.ietfNodeId = ietfNode.getNodeId().getValue();
         this.oorClientPortList = ietfNode.augmentation(
                 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
         this.ietfNodeId = ietfNode.getNodeId().getValue();
         this.oorClientPortList = ietfNode.augmentation(
                 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
@@ -110,18 +119,12 @@ public class ConvertORTopoObjectToTapiTopoObject {
             .collect(Collectors.toList());
         this.oorOduSwitchingPool = ietfNode.augmentation(Node1.class).getSwitchingPools().getOduSwitchingPools()
             .values().stream().findFirst().get();
             .collect(Collectors.toList());
         this.oorOduSwitchingPool = ietfNode.augmentation(Node1.class).getSwitchingPools().getOduSwitchingPools()
             .values().stream().findFirst().get();
-        this.tapiTopoUuid = tapiTopoUuid;
-        this.tapiNodes = new HashMap<>();
-        this.tapiLinks = new HashMap<>();
-        this.uuidMap = new HashMap<>();
-    }
 
 
-    public void convertNode() {
         // node creation [DSR/ODU]
         LOG.info("creation of a DSR/ODU node");
         // node creation [DSR/ODU]
         LOG.info("creation of a DSR/ODU node");
-        Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes((this.ietfNodeId + PLUS_DSR).getBytes(Charset.forName("UTF-8")))
-            .toString());
-        this.uuidMap.put(this.ietfNodeId + PLUS_DSR, nodeUuid);
+        Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", this.ietfNodeId, DSR))
+            .getBytes(Charset.forName("UTF-8"))).toString());
+        this.uuidMap.put(String.join("+", this.ietfNodeId, DSR), nodeUuid);
         Name nameDsr = new NameBuilder().setValueName("dsr/odu node name").setValue(this.ietfNodeId).build();
         List<LayerProtocolName> dsrLayerProtocols = Arrays.asList(LayerProtocolName.DSR, LayerProtocolName.ODU);
         org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology
         Name nameDsr = new NameBuilder().setValueName("dsr/odu node name").setValue(this.ietfNodeId).build();
         List<LayerProtocolName> dsrLayerProtocols = Arrays.asList(LayerProtocolName.DSR, LayerProtocolName.ODU);
         org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology
@@ -130,9 +133,9 @@ public class ConvertORTopoObjectToTapiTopoObject {
 
         // node creation [otsi]
         LOG.info("creation of an OTSi node");
 
         // node creation [otsi]
         LOG.info("creation of an OTSi node");
-        nodeUuid = new Uuid(UUID.nameUUIDFromBytes((this.ietfNodeId + OT_SI).getBytes(Charset.forName("UTF-8")))
-            .toString());
-        this.uuidMap.put(this.ietfNodeId + OT_SI, nodeUuid);
+        nodeUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", this.ietfNodeId, OTSI))
+            .getBytes(Charset.forName("UTF-8"))).toString());
+        this.uuidMap.put(String.join("+", this.ietfNodeId, OTSI), nodeUuid);
         Name nameOtsi =  new NameBuilder().setValueName("otsi node name").setValue(this.ietfNodeId).build();
         List<LayerProtocolName> otsiLayerProtocols = Arrays.asList(LayerProtocolName.PHOTONICMEDIA);
         org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology
         Name nameOtsi =  new NameBuilder().setValueName("otsi node name").setValue(this.ietfNodeId).build();
         List<LayerProtocolName> otsiLayerProtocols = Arrays.asList(LayerProtocolName.PHOTONICMEDIA);
         org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology
@@ -144,6 +147,23 @@ public class ConvertORTopoObjectToTapiTopoObject {
         createTapiTransitionalLinks();
     }
 
         createTapiTransitionalLinks();
     }
 
+    public void convertLinks(List
+        <org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link>
+        otnLinkList) {
+        List<String> linksToNotConvert = new ArrayList<>();
+        LOG.info("creation of {} otn links", otnLinkList.size() / 2);
+        for (org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network
+            .Link link : otnLinkList) {
+            if (!linksToNotConvert.contains(link.getLinkId().getValue())) {
+                Link tapiLink = createTapiLink(link);
+                linksToNotConvert.add(link
+                    .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Link1.class)
+                    .getOppositeLink().getValue());
+                tapiLinks.put(tapiLink.key(), tapiLink);
+            }
+        }
+    }
+
     private org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology
         .Node createTapiNode(Map<NameKey, Name> nodeNames, List<LayerProtocolName> layerProtocols) {
         Uuid nodeUuid = null;
     private org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology
         .Node createTapiNode(Map<NameKey, Name> nodeNames, List<LayerProtocolName> layerProtocols) {
         Uuid nodeUuid = null;
@@ -182,35 +202,41 @@ public class ConvertORTopoObjectToTapiTopoObject {
     private Uuid getNodeUuid4Phonic(Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl,
         Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupList, Map<RuleKey, Rule> ruleList) {
         Uuid nodeUuid;
     private Uuid getNodeUuid4Phonic(Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl,
         Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupList, Map<RuleKey, Rule> ruleList) {
         Uuid nodeUuid;
-        nodeUuid = this.uuidMap.get(this.ietfNodeId + OT_SI);
+        nodeUuid = this.uuidMap.get(String.join("+", this.ietfNodeId, OTSI));
         // iNep creation on otsi node
         for (int i = 0; i < oorNetworkPortList.size(); i++) {
             Uuid nepUuid1 = new Uuid(UUID.nameUUIDFromBytes(
         // iNep creation on otsi node
         for (int i = 0; i < oorNetworkPortList.size(); i++) {
             Uuid nepUuid1 = new Uuid(UUID.nameUUIDFromBytes(
-                    (I_OT_SI + oorNetworkPortList.get(i).getTpId().getValue()).getBytes(Charset.forName("UTF-8")))
+                    (String.join("+", this.ietfNodeId, I_OTSI, oorNetworkPortList.get(i).getTpId().getValue()))
+                    .getBytes(Charset.forName("UTF-8")))
                 .toString());
                 .toString());
-            this.uuidMap.put(I_OT_SI + oorNetworkPortList.get(i).getTpId().getValue(), nepUuid1);
+            this.uuidMap.put(String.join("+", this.ietfNodeId, I_OTSI, oorNetworkPortList.get(i).getTpId().getValue()),
+                nepUuid1);
             Name onedName = new NameBuilder()
                 .setValueName(new StringBuilder("iNodeEdgePoint_").append(i + 1).toString())
                 .setValue(oorNetworkPortList.get(i).getTpId().getValue())
                 .build();
 
             OwnedNodeEdgePoint onep = createNep(oorNetworkPortList.get(i), Map.of(onedName.key(), onedName),
             Name onedName = new NameBuilder()
                 .setValueName(new StringBuilder("iNodeEdgePoint_").append(i + 1).toString())
                 .setValue(oorNetworkPortList.get(i).getTpId().getValue())
                 .build();
 
             OwnedNodeEdgePoint onep = createNep(oorNetworkPortList.get(i), Map.of(onedName.key(), onedName),
-                LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA, true, I_OT_SI);
+                LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA, true,
+                String.join("+", this.ietfNodeId, I_OTSI));
             onepl.put(onep.key(), onep);
         }
         // eNep creation on otsi node
         for (int i = 0; i < oorNetworkPortList.size(); i++) {
             Uuid nepUuid2 = new Uuid(UUID.nameUUIDFromBytes(
             onepl.put(onep.key(), onep);
         }
         // eNep creation on otsi node
         for (int i = 0; i < oorNetworkPortList.size(); i++) {
             Uuid nepUuid2 = new Uuid(UUID.nameUUIDFromBytes(
-                    (E_OT_SI + oorNetworkPortList.get(i).getTpId().getValue()).getBytes(Charset.forName("UTF-8")))
+                    (String.join("+", this.ietfNodeId, E_OTSI, oorNetworkPortList.get(i).getTpId().getValue()))
+                    .getBytes(Charset.forName("UTF-8")))
                 .toString());
                 .toString());
-            this.uuidMap.put(E_OT_SI + oorNetworkPortList.get(i).getTpId().getValue(), nepUuid2);
+            this.uuidMap.put(String.join("+", this.ietfNodeId, E_OTSI, oorNetworkPortList.get(i).getTpId().getValue()),
+                nepUuid2);
             Name onedName = new NameBuilder()
                 .setValueName(new StringBuilder("eNodeEdgePoint_").append(i + 1).toString())
                 .setValue(oorNetworkPortList.get(i).getTpId().getValue())
                 .build();
 
             OwnedNodeEdgePoint onep = createNep(oorNetworkPortList.get(i), Map.of(onedName.key(), onedName),
             Name onedName = new NameBuilder()
                 .setValueName(new StringBuilder("eNodeEdgePoint_").append(i + 1).toString())
                 .setValue(oorNetworkPortList.get(i).getTpId().getValue())
                 .build();
 
             OwnedNodeEdgePoint onep = createNep(oorNetworkPortList.get(i), Map.of(onedName.key(), onedName),
-                LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA, true, E_OT_SI);
+                LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA, true,
+                String.join("+", this.ietfNodeId, E_OTSI));
             onepl.put(onep.key(), onep);
         }
         // create NodeRuleGroup
             onepl.put(onep.key(), onep);
         }
         // create NodeRuleGroup
@@ -223,15 +249,17 @@ public class ConvertORTopoObjectToTapiTopoObject {
                 .NodeEdgePoint inep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210
                 .node.rule.group.NodeEdgePointBuilder()
                 .setTopologyUuid(tapiTopoUuid)
                 .NodeEdgePoint inep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210
                 .node.rule.group.NodeEdgePointBuilder()
                 .setTopologyUuid(tapiTopoUuid)
-                .setNodeUuid(this.uuidMap.get(this.ietfNodeId + OT_SI))
-                .setNodeEdgePointUuid(this.uuidMap.get(I_OT_SI + tp.getTpId().getValue()))
+                .setNodeUuid(this.uuidMap.get(String.join("+", this.ietfNodeId, OTSI)))
+                .setNodeEdgePointUuid(
+                    this.uuidMap.get(String.join("+", this.ietfNodeId, I_OTSI, tp.getTpId().getValue())))
                 .build();
             org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group
                 .NodeEdgePoint enep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210
                 .node.rule.group.NodeEdgePointBuilder()
                 .setTopologyUuid(tapiTopoUuid)
                 .build();
             org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group
                 .NodeEdgePoint enep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210
                 .node.rule.group.NodeEdgePointBuilder()
                 .setTopologyUuid(tapiTopoUuid)
-                .setNodeUuid(this.uuidMap.get(this.ietfNodeId + OT_SI))
-                .setNodeEdgePointUuid(this.uuidMap.get(E_OT_SI + tp.getTpId().getValue()))
+                .setNodeUuid(this.uuidMap.get(String.join("+", this.ietfNodeId, OTSI)))
+                .setNodeEdgePointUuid(
+                    this.uuidMap.get(String.join("+", this.ietfNodeId, E_OTSI, tp.getTpId().getValue())))
                 .build();
             nepList.put(inep.key(), inep);
             nepList.put(enep.key(), enep);
                 .build();
             nepList.put(inep.key(), inep);
             nepList.put(enep.key(), enep);
@@ -251,33 +279,37 @@ public class ConvertORTopoObjectToTapiTopoObject {
     private Uuid getNodeUuid4Dsr(Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl,
         Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupList, Map<RuleKey, Rule> ruleList) {
         Uuid nodeUuid;
     private Uuid getNodeUuid4Dsr(Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl,
         Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupList, Map<RuleKey, Rule> ruleList) {
         Uuid nodeUuid;
-        nodeUuid = this.uuidMap.get(this.ietfNodeId + PLUS_DSR);
+        nodeUuid = this.uuidMap.get(String.join("+", this.ietfNodeId, DSR));
         // client nep creation on DSR/ODU node
         for (int i = 0; i < oorClientPortList.size(); i++) {
         // client nep creation on DSR/ODU node
         for (int i = 0; i < oorClientPortList.size(); i++) {
-            Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes((DSR_PLUS + oorClientPortList.get(i).getTpId().getValue())
+            Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(
+                (String.join("+", this.ietfNodeId, DSR, oorClientPortList.get(i).getTpId().getValue()))
                 .getBytes(Charset.forName("UTF-8"))).toString());
                 .getBytes(Charset.forName("UTF-8"))).toString());
-            this.uuidMap.put(DSR_PLUS + oorClientPortList.get(i).getTpId().getValue(), nepUuid);
+            this.uuidMap.put(String.join("+", this.ietfNodeId, DSR, oorClientPortList.get(i).getTpId().getValue()),
+                nepUuid);
             Name name = new NameBuilder()
                 .setValueName(new StringBuilder("NodeEdgePoint_C").append(i + 1).toString())
                 .setValue(oorClientPortList.get(i).getTpId().getValue())
                 .build();
 
             OwnedNodeEdgePoint onep = createNep(oorClientPortList.get(i), Map.of(name.key(), name),
             Name name = new NameBuilder()
                 .setValueName(new StringBuilder("NodeEdgePoint_C").append(i + 1).toString())
                 .setValue(oorClientPortList.get(i).getTpId().getValue())
                 .build();
 
             OwnedNodeEdgePoint onep = createNep(oorClientPortList.get(i), Map.of(name.key(), name),
-                LayerProtocolName.ETH, LayerProtocolName.DSR, true, DSR_PLUS);
+                LayerProtocolName.ETH, LayerProtocolName.DSR, true, String.join("+", this.ietfNodeId, DSR));
             onepl.put(onep.key(), onep);
         }
         // network nep creation on DSR/ODU node
         for (int i = 0; i < oorNetworkPortList.size(); i++) {
             onepl.put(onep.key(), onep);
         }
         // network nep creation on DSR/ODU node
         for (int i = 0; i < oorNetworkPortList.size(); i++) {
-            Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes((DSR_PLUS + oorNetworkPortList.get(i).getTpId().getValue())
+            Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(
+                (String.join("+", this.ietfNodeId, DSR, oorNetworkPortList.get(i).getTpId().getValue()))
                 .getBytes(Charset.forName("UTF-8"))).toString());
                 .getBytes(Charset.forName("UTF-8"))).toString());
-            this.uuidMap.put(DSR_PLUS + oorNetworkPortList.get(i).getTpId().getValue(), nepUuid);
+            this.uuidMap.put(String.join("+", this.ietfNodeId, DSR, oorNetworkPortList.get(i).getTpId().getValue()),
+                nepUuid);
             Name onedName = new NameBuilder()
                 .setValueName(new StringBuilder("NodeEdgePoint_N").append(i + 1).toString())
                 .setValue(oorNetworkPortList.get(i).getTpId().getValue())
                 .build();
 
             OwnedNodeEdgePoint onep = createNep(oorNetworkPortList.get(i), Map.of(onedName.key(), onedName),
             Name onedName = new NameBuilder()
                 .setValueName(new StringBuilder("NodeEdgePoint_N").append(i + 1).toString())
                 .setValue(oorNetworkPortList.get(i).getTpId().getValue())
                 .build();
 
             OwnedNodeEdgePoint onep = createNep(oorNetworkPortList.get(i), Map.of(onedName.key(), onedName),
-                LayerProtocolName.ODU, LayerProtocolName.DSR, true, DSR_PLUS);
+                LayerProtocolName.ODU, LayerProtocolName.DSR, true, String.join("+", this.ietfNodeId, DSR));
             onepl.put(onep.key(), onep);
         }
         // create NodeRuleGroup
             onepl.put(onep.key(), onep);
         }
         // create NodeRuleGroup
@@ -291,8 +323,8 @@ public class ConvertORTopoObjectToTapiTopoObject {
                     .NodeEdgePoint nep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210
                     .node.rule.group.NodeEdgePointBuilder()
                     .setTopologyUuid(tapiTopoUuid)
                     .NodeEdgePoint nep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210
                     .node.rule.group.NodeEdgePointBuilder()
                     .setTopologyUuid(tapiTopoUuid)
-                    .setNodeUuid(this.uuidMap.get(this.ietfNodeId + PLUS_DSR))
-                    .setNodeEdgePointUuid(this.uuidMap.get(DSR_PLUS + tp.getValue()))
+                    .setNodeUuid(this.uuidMap.get(String.join("+", this.ietfNodeId, DSR)))
+                    .setNodeEdgePointUuid(this.uuidMap.get(String.join("+", this.ietfNodeId, DSR, tp.getValue())))
                     .build();
                 nepList.put(nep.key(), nep);
             }
                     .build();
                 nepList.put(nep.key(), nep);
             }
@@ -311,7 +343,7 @@ public class ConvertORTopoObjectToTapiTopoObject {
 
     private OwnedNodeEdgePoint createNep(TerminationPoint oorTp, Map<NameKey, Name> nepNames,
         LayerProtocolName nepProtocol, LayerProtocolName nodeProtocol, boolean withSip, String keyword) {
 
     private OwnedNodeEdgePoint createNep(TerminationPoint oorTp, Map<NameKey, Name> nepNames,
         LayerProtocolName nepProtocol, LayerProtocolName nodeProtocol, boolean withSip, String keyword) {
-        String key = keyword + oorTp.getTpId().getValue();
+        String key = String.join("+", keyword, oorTp.getTpId().getValue());
         OwnedNodeEdgePointBuilder onepBldr = new OwnedNodeEdgePointBuilder()
             .setUuid(this.uuidMap.get(key))
             .setLayerProtocolName(nepProtocol)
         OwnedNodeEdgePointBuilder onepBldr = new OwnedNodeEdgePointBuilder()
             .setUuid(this.uuidMap.get(key))
             .setLayerProtocolName(nepProtocol)
@@ -374,28 +406,28 @@ public class ConvertORTopoObjectToTapiTopoObject {
     private void createTapiTransitionalLinks() {
         for (TerminationPoint tp : this.oorNetworkPortList) {
             Map<NodeEdgePointKey, NodeEdgePoint> nepList = new HashMap<>();
     private void createTapiTransitionalLinks() {
         for (TerminationPoint tp : this.oorNetworkPortList) {
             Map<NodeEdgePointKey, NodeEdgePoint> nepList = new HashMap<>();
-            String sourceKey = DSR_PLUS + tp.getTpId().getValue();
+            String sourceKey = String.join("+", this.ietfNodeId, DSR, tp.getTpId().getValue());
             Uuid sourceUuidTp = this.uuidMap.get(sourceKey);
             Uuid sourceUuidTp = this.uuidMap.get(sourceKey);
-            String destKey = I_OT_SI + tp.getTpId().getValue();
+            String destKey = String.join("+", this.ietfNodeId, I_OTSI, tp.getTpId().getValue());
             Uuid destUuidTp = this.uuidMap.get(destKey);
             NodeEdgePoint sourceNep = new NodeEdgePointBuilder()
                 .setTopologyUuid(this.tapiTopoUuid)
             Uuid destUuidTp = this.uuidMap.get(destKey);
             NodeEdgePoint sourceNep = new NodeEdgePointBuilder()
                 .setTopologyUuid(this.tapiTopoUuid)
-                .setNodeUuid(this.uuidMap.get(this.ietfNodeId + PLUS_DSR))
+                .setNodeUuid(this.uuidMap.get(String.join("+", this.ietfNodeId, DSR)))
                 .setNodeEdgePointUuid(sourceUuidTp)
                 .build();
             nepList.put(sourceNep.key(), sourceNep);
             NodeEdgePoint destNep = new NodeEdgePointBuilder()
                 .setTopologyUuid(this.tapiTopoUuid)
                 .setNodeEdgePointUuid(sourceUuidTp)
                 .build();
             nepList.put(sourceNep.key(), sourceNep);
             NodeEdgePoint destNep = new NodeEdgePointBuilder()
                 .setTopologyUuid(this.tapiTopoUuid)
-                .setNodeUuid(this.uuidMap.get(this.ietfNodeId + OT_SI))
+                .setNodeUuid(this.uuidMap.get(String.join("+", this.ietfNodeId, OTSI)))
                 .setNodeEdgePointUuid(destUuidTp)
                 .build();
             nepList.put(destNep.key(), destNep);
             Name linkName = new NameBuilder().setValueName("transitional link name")
                 .setNodeEdgePointUuid(destUuidTp)
                 .build();
             nepList.put(destNep.key(), destNep);
             Name linkName = new NameBuilder().setValueName("transitional link name")
-                .setValue(this.ietfNodeId + "-" + sourceKey + "--" + destKey)
+                .setValue(String.join("--", this.ietfNodeId, sourceKey, destKey))
                 .build();
             Link transiLink = new LinkBuilder()
                 .setUuid(new Uuid(
                 .build();
             Link transiLink = new LinkBuilder()
                 .setUuid(new Uuid(
-                        UUID.nameUUIDFromBytes((this.ietfNodeId + "-" + sourceKey + "--" + destKey)
+                        UUID.nameUUIDFromBytes((String.join("--", this.ietfNodeId, sourceKey, destKey))
                             .getBytes(Charset.forName("UTF-8")))
                     .toString()))
                 .setName(Map.of(linkName.key(), linkName))
                             .getBytes(Charset.forName("UTF-8")))
                     .toString()))
                 .setName(Map.of(linkName.key(), linkName))
@@ -410,6 +442,104 @@ public class ConvertORTopoObjectToTapiTopoObject {
         }
     }
 
         }
     }
 
+    private Link createTapiLink(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+        .networks.network.Link link) {
+        String prefix = link.getLinkId().getValue().split("-")[0];
+        String sourceNode = link.getSource().getSourceNode().getValue();
+        String sourceTp = link.getSource().getSourceTp().toString();
+        String destNode = link.getDestination().getDestNode().getValue();
+        String destTp = link.getDestination().getDestTp().toString();
+        Map<NodeEdgePointKey, NodeEdgePoint> nepList = new HashMap<>();
+        Uuid sourceUuidTp;
+        Uuid sourceUuidNode;
+        Uuid destUuidTp;
+        Uuid destUuidNode;
+        Name linkName;
+        switch (prefix) {
+            case "OTU4":
+                sourceUuidTp = this.uuidMap.get(String.join("+", sourceNode, I_OTSI, sourceTp));
+                sourceUuidNode = this.uuidMap.get(String.join("+", sourceNode, OTSI));
+                NodeEdgePoint sourceNep = new NodeEdgePointBuilder()
+                    .setTopologyUuid(this.tapiTopoUuid)
+                    .setNodeUuid(sourceUuidNode)
+                    .setNodeEdgePointUuid(sourceUuidTp)
+                    .build();
+                nepList.put(sourceNep.key(), sourceNep);
+                destUuidTp = this.uuidMap.get(String.join("+", destNode, I_OTSI, destTp));
+                destUuidNode = this.uuidMap.get(String.join("+", destNode, OTSI));
+                NodeEdgePoint destNep = new NodeEdgePointBuilder()
+                    .setTopologyUuid(this.tapiTopoUuid)
+                    .setNodeUuid(destUuidNode)
+                    .setNodeEdgePointUuid(destUuidTp)
+                    .build();
+                nepList.put(destNep.key(), destNep);
+                linkName = new NameBuilder().setValueName("otn link name")
+                    .setValue(link.getLinkId().getValue())
+                    .build();
+                return new LinkBuilder()
+                    .setUuid(new Uuid(
+                        UUID.nameUUIDFromBytes((link.getLinkId().getValue())
+                            .getBytes(Charset.forName("UTF-8")))
+                    .toString()))
+                .setName(Map.of(linkName.key(), linkName))
+                .setLayerProtocolName(Arrays.asList(LayerProtocolName.PHOTONICMEDIA))
+                .setAdministrativeState(AdministrativeState.UNLOCKED)
+                .setOperationalState(OperationalState.ENABLED)
+                .setDirection(ForwardingDirection.BIDIRECTIONAL)
+                .setNodeEdgePoint(nepList)
+                .setTotalPotentialCapacity(new TotalPotentialCapacityBuilder().setTotalSize(
+                    new TotalSizeBuilder().setUnit(CapacityUnit.GBPS)
+                        .setValue(Uint64.valueOf(100)).build()).build())
+                .setAvailableCapacity(new AvailableCapacityBuilder().setTotalSize(
+                    new TotalSizeBuilder().setUnit(CapacityUnit.MBPS)
+                        .setValue(Uint64.valueOf(link.augmentation(Link1.class).getAvailableBandwidth())).build())
+                    .build())
+                .build();
+            case "ODU4":
+                sourceUuidTp = this.uuidMap.get(String.join("+", sourceNode, DSR, sourceTp));
+                sourceUuidNode = this.uuidMap.get(String.join("+", sourceNode, DSR));
+                NodeEdgePoint sourceNep2 = new NodeEdgePointBuilder()
+                    .setTopologyUuid(this.tapiTopoUuid)
+                    .setNodeUuid(sourceUuidNode)
+                    .setNodeEdgePointUuid(sourceUuidTp)
+                    .build();
+                nepList.put(sourceNep2.key(), sourceNep2);
+                destUuidTp = this.uuidMap.get(String.join("+", destNode, DSR, destTp));
+                destUuidNode = this.uuidMap.get(String.join("+", destNode, DSR));
+                NodeEdgePoint destNep2 = new NodeEdgePointBuilder()
+                    .setTopologyUuid(this.tapiTopoUuid)
+                    .setNodeUuid(destUuidNode)
+                    .setNodeEdgePointUuid(destUuidTp)
+                    .build();
+                nepList.put(destNep2.key(), destNep2);
+                linkName = new NameBuilder().setValueName("otn link name")
+                    .setValue(link.getLinkId().getValue())
+                    .build();
+                return new LinkBuilder()
+                    .setUuid(new Uuid(
+                        UUID.nameUUIDFromBytes((link.getLinkId().getValue())
+                            .getBytes(Charset.forName("UTF-8")))
+                    .toString()))
+                .setName(Map.of(linkName.key(), linkName))
+                .setLayerProtocolName(Arrays.asList(LayerProtocolName.ODU))
+                .setAdministrativeState(AdministrativeState.UNLOCKED)
+                .setOperationalState(OperationalState.ENABLED)
+                .setDirection(ForwardingDirection.BIDIRECTIONAL)
+                .setNodeEdgePoint(nepList)
+                .setTotalPotentialCapacity(new TotalPotentialCapacityBuilder().setTotalSize(
+                    new TotalSizeBuilder().setUnit(CapacityUnit.GBPS)
+                        .setValue(Uint64.valueOf(100)).build()).build())
+                .setAvailableCapacity(new AvailableCapacityBuilder().setTotalSize(
+                    new TotalSizeBuilder().setUnit(CapacityUnit.MBPS)
+                        .setValue(Uint64.valueOf(link.augmentation(Link1.class).getAvailableBandwidth())).build())
+                    .build())
+                .build();
+            default:
+                LOG.error("OTN link of type {} not managed yet", prefix);
+                return null;
+        }
+    }
+
     public Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node>
         getTapiNodes() {
         return tapiNodes;
     public Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node>
         getTapiNodes() {
         return tapiNodes;
@@ -418,4 +548,9 @@ public class ConvertORTopoObjectToTapiTopoObject {
     public Map<LinkKey, Link> getTapiLinks() {
         return tapiLinks;
     }
     public Map<LinkKey, Link> getTapiLinks() {
         return tapiLinks;
     }
-}
+
+    public Map<String, Uuid> getUuidMap() {
+        return uuidMap;
+    }
+
+}
\ No newline at end of file
index b8e85a95adae66d14784217830ad664e878bf848..6b23a299c496638f2852d7322908969d5d1457e6 100644 (file)
@@ -11,6 +11,7 @@ import com.google.common.util.concurrent.FluentFuture;
 import com.google.common.util.concurrent.ListenableFuture;
 import java.nio.charset.Charset;
 import java.util.ArrayList;
 import com.google.common.util.concurrent.ListenableFuture;
 import java.nio.charset.Charset;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -238,13 +239,19 @@ public class TapiTopologyImpl implements TapiTopologyService {
                 tapiLinkList = new HashMap<>();
             Uuid topoUuid = new Uuid(UUID.nameUUIDFromBytes(T0_MULTI_LAYER_TOPO.getBytes(Charset.forName("UTF-8")))
                 .toString());
                 tapiLinkList = new HashMap<>();
             Uuid topoUuid = new Uuid(UUID.nameUUIDFromBytes(T0_MULTI_LAYER_TOPO.getBytes(Charset.forName("UTF-8")))
                 .toString());
+            ConvertORTopoObjectToTapiTopoObject tapiFactory = new ConvertORTopoObjectToTapiTopoObject(topoUuid);
             for (Node node : otnNodeList) {
             for (Node node : otnNodeList) {
-                ConvertORTopoObjectToTapiTopoObject tapiFactory =
-                    new ConvertORTopoObjectToTapiTopoObject(node, null, topoUuid);
-                tapiFactory.convertNode();
+                tapiFactory.convertNode(node);
                 tapiNodeList.putAll(tapiFactory.getTapiNodes());
                 tapiLinkList.putAll(tapiFactory.getTapiLinks());
             }
                 tapiNodeList.putAll(tapiFactory.getTapiNodes());
                 tapiLinkList.putAll(tapiFactory.getTapiLinks());
             }
+            if (otnTopo.augmentation(Network1.class) != null) {
+                List<Link> otnLinkList = new ArrayList<>(otnTopo.augmentation(Network1.class).getLink().values());
+                Collections.sort(otnLinkList, (l1, l2) -> l1.getLinkId().getValue()
+                    .compareTo(l2.getLinkId().getValue()));
+                tapiFactory.convertLinks(otnLinkList);
+                tapiLinkList.putAll(tapiFactory.getTapiLinks());
+            }
             Name name = new NameBuilder().setValue(T0_MULTI_LAYER_TOPO).setValueName("TAPI Topology Name").build();
             return new TopologyBuilder()
                     .setName(Map.of(name.key(), name))
             Name name = new NameBuilder().setValue(T0_MULTI_LAYER_TOPO).setValueName("TAPI Topology Name").build();
             return new TopologyBuilder()
                     .setName(Map.of(name.key(), name))
index 72770195aea29b425a7e34a5d4c058d6755e0056..026c5744b01b404d3244c620c4e163afdaf0a90a 100644 (file)
@@ -45,6 +45,7 @@ import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Term
 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.TerminationState;
 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Uuid;
 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.Name;
 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.TerminationState;
 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Uuid;
 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.Name;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameKey;
 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev181210.DIGITALSIGNALTYPE100GigE;
 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev181210.DIGITALSIGNALTYPE10GigELAN;
 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.odu.rev181210.ODUTYPEODU2E;
 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev181210.DIGITALSIGNALTYPE100GigE;
 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev181210.DIGITALSIGNALTYPE10GigELAN;
 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.odu.rev181210.ODUTYPEODU2E;
@@ -75,7 +76,7 @@ public class TapiTopologyImplTest extends AbstractTest {
     private static final int NUM_THREADS = 3;
 
     @Before
     private static final int NUM_THREADS = 3;
 
     @Before
-    public void setUp() throws InterruptedException {
+    public void setUp() throws InterruptedException, ExecutionException {
         executorService = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(NUM_THREADS));
         endSignal = new CountDownLatch(1);
         TopologyDataUtils.writeTopologyFromFileToDatastore(getDataStoreContextUtil(),
         executorService = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(NUM_THREADS));
         endSignal = new CountDownLatch(1);
         TopologyDataUtils.writeTopologyFromFileToDatastore(getDataStoreContextUtil(),
@@ -151,27 +152,85 @@ public class TapiTopologyImplTest extends AbstractTest {
             .collect(Collectors.toList());
         Uuid node1Uuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SA1-XPDR1+DSR".getBytes(Charset.forName("UTF-8")))
             .toString());
             .collect(Collectors.toList());
         Uuid node1Uuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SA1-XPDR1+DSR".getBytes(Charset.forName("UTF-8")))
             .toString());
-        checkDsrNode(nodes.get(0), node1Uuid, false);
+        checkDsrNode(nodes.get(0), node1Uuid, false, "SPDR-SA1-XPDR1");
         Uuid node2Uuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SA1-XPDR2+DSR".getBytes(Charset.forName("UTF-8")))
             .toString());
         Uuid node2Uuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SA1-XPDR2+DSR".getBytes(Charset.forName("UTF-8")))
             .toString());
-        checkDsrNode(nodes.get(1), node2Uuid, true);
+        checkDsrNode(nodes.get(1), node2Uuid, true, "SPDR-SA1-XPDR2");
         Uuid node3Uuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SA1-XPDR1+OTSi".getBytes(Charset.forName("UTF-8")))
             .toString());
         Uuid node3Uuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SA1-XPDR1+OTSi".getBytes(Charset.forName("UTF-8")))
             .toString());
-        checkOtsiNode(nodes.get(2), node3Uuid, false);
+        checkOtsiNode(nodes.get(2), node3Uuid, false, "SPDR-SA1-XPDR1");
         Uuid node4Uuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SA1-XPDR2+OTSi".getBytes(Charset.forName("UTF-8")))
             .toString());
         Uuid node4Uuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SA1-XPDR2+OTSi".getBytes(Charset.forName("UTF-8")))
             .toString());
-        checkOtsiNode(nodes.get(3), node4Uuid, true);
+        checkOtsiNode(nodes.get(3), node4Uuid, true, "SPDR-SA1-XPDR2");
 
         List<Link> links = topology.nonnullLink().values().stream()
             .sorted((l1, l2) -> l1.getUuid().getValue().compareTo(l2.getUuid().getValue()))
             .collect(Collectors.toList());
 
         List<Link> links = topology.nonnullLink().values().stream()
             .sorted((l1, l2) -> l1.getUuid().getValue().compareTo(l2.getUuid().getValue()))
             .collect(Collectors.toList());
-        checkTransitionalLink(links.get(1), topoUuid, node1Uuid, node3Uuid, "DSR+XPDR1-NETWORK1",
-            "iOTSi+XPDR1-NETWORK1", "SPDR-SA1-XPDR1");
-        checkTransitionalLink(links.get(4), topoUuid, node2Uuid, node4Uuid, "DSR+XPDR2-NETWORK1",
-            "iOTSi+XPDR2-NETWORK1", "SPDR-SA1-XPDR2");
+        checkTransitionalLink(links.get(4), topoUuid, node1Uuid, node3Uuid, "SPDR-SA1-XPDR1+DSR+XPDR1-NETWORK1",
+            "SPDR-SA1-XPDR1+iOTSi+XPDR1-NETWORK1", "SPDR-SA1-XPDR1");
+        checkTransitionalLink(links.get(2), topoUuid, node2Uuid, node4Uuid, "SPDR-SA1-XPDR2+DSR+XPDR2-NETWORK1",
+            "SPDR-SA1-XPDR2+iOTSi+XPDR2-NETWORK1", "SPDR-SA1-XPDR2");
     }
 
     }
 
-    private void checkDsrNode(Node node, Uuid nodeUuid, boolean isSwitch) {
+    @Test
+    public void getTopologyDetailsForOtnTopologyWithOtnLinksWhenSuccessful()
+        throws ExecutionException, InterruptedException {
+        executorService = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(NUM_THREADS));
+        endSignal = new CountDownLatch(1);
+        TopologyDataUtils.writeTopologyFromFileToDatastore(getDataStoreContextUtil(),
+            TopologyDataUtils.OTN_TOPOLOGY_WITH_OTN_LINKS_FILE, InstanceIdentifiers.OTN_NETWORK_II);
+
+        GetTopologyDetailsInput input = TopologyDataUtils.buildGetTopologyDetailsInput(NetworkUtils.OTN_NETWORK_ID);
+        TapiTopologyImpl tapiTopoImpl = new TapiTopologyImpl(getDataBroker());
+        ListenableFuture<RpcResult<GetTopologyDetailsOutput>> result = tapiTopoImpl.getTopologyDetails(input);
+        result.addListener(new Runnable() {
+            @Override
+            public void run() {
+                endSignal.countDown();
+            }
+        }, executorService);
+        endSignal.await();
+        RpcResult<GetTopologyDetailsOutput> rpcResult = result.get();
+        @Nullable
+        Topology topology = rpcResult.getResult().getTopology();
+        assertNotNull("Topology should not be null", topology);
+        assertEquals("Node list size should be 8", 8, topology.getNode().size());
+        assertEquals("Link list size should be 12", 12, topology.getLink().size());
+
+        Uuid topoUuid = new Uuid(UUID.nameUUIDFromBytes("T0 - Multi-layer topology".getBytes()).toString());
+        Uuid node1Uuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SA1-XPDR1+DSR".getBytes(Charset.forName("UTF-8")))
+            .toString());
+        Uuid node2Uuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SC1-XPDR1+DSR".getBytes(Charset.forName("UTF-8")))
+            .toString());
+        Uuid node3Uuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SA1-XPDR1+OTSi".getBytes(Charset.forName("UTF-8")))
+            .toString());
+        Uuid node4Uuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SC1-XPDR1+OTSi".getBytes(Charset.forName("UTF-8")))
+            .toString());
+        Uuid tp1Uuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SA1-XPDR1+DSR+XPDR1-NETWORK1"
+            .getBytes(Charset.forName("UTF-8"))).toString());
+        Uuid tp2Uuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SC1-XPDR1+DSR+XPDR1-NETWORK1"
+            .getBytes(Charset.forName("UTF-8"))).toString());
+        Uuid tp3Uuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SA1-XPDR1+iOTSi+XPDR1-NETWORK1"
+            .getBytes(Charset.forName("UTF-8"))).toString());
+        Uuid tp4Uuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SC1-XPDR1+iOTSi+XPDR1-NETWORK1"
+            .getBytes(Charset.forName("UTF-8"))).toString());
+        Uuid link1Uuid =
+            new Uuid(UUID.nameUUIDFromBytes("ODU4-SPDR-SA1-XPDR1-XPDR1-NETWORK1toSPDR-SC1-XPDR1-XPDR1-NETWORK1"
+                .getBytes(Charset.forName("UTF-8"))).toString());
+        Uuid link2Uuid =
+            new Uuid(UUID.nameUUIDFromBytes("OTU4-SPDR-SA1-XPDR1-XPDR1-NETWORK1toSPDR-SC1-XPDR1-XPDR1-NETWORK1"
+                .getBytes(Charset.forName("UTF-8"))).toString());
+
+        List<Link> links = topology.nonnullLink().values().stream()
+            .sorted((l1, l2) -> l1.getUuid().getValue().compareTo(l2.getUuid().getValue()))
+            .collect(Collectors.toList());
+        checkOtnLink(links.get(3), topoUuid, node1Uuid, node2Uuid, tp1Uuid, tp2Uuid, link1Uuid,
+            "ODU4-SPDR-SA1-XPDR1-XPDR1-NETWORK1toSPDR-SC1-XPDR1-XPDR1-NETWORK1");
+        checkOtnLink(links.get(9), topoUuid, node3Uuid, node4Uuid, tp3Uuid, tp4Uuid, link2Uuid,
+            "OTU4-SPDR-SA1-XPDR1-XPDR1-NETWORK1toSPDR-SC1-XPDR1-XPDR1-NETWORK1");
+    }
+
+    private void checkDsrNode(Node node, Uuid nodeUuid, boolean isSwitch, String nodeId) {
         assertEquals("incorrect node uuid", nodeUuid, node.getUuid());
         assertEquals("administrative state should be UNLOCKED",
             AdministrativeState.UNLOCKED, node.getAdministrativeState());
         assertEquals("incorrect node uuid", nodeUuid, node.getUuid());
         assertEquals("administrative state should be UNLOCKED",
             AdministrativeState.UNLOCKED, node.getAdministrativeState());
@@ -188,13 +247,15 @@ public class TapiTopologyImplTest extends AbstractTest {
             .collect(Collectors.toList());
         if (isSwitch) {
             assertEquals("Switch-DSR node should have 8 NEPs", 8, neps.size());
             .collect(Collectors.toList());
         if (isSwitch) {
             assertEquals("Switch-DSR node should have 8 NEPs", 8, neps.size());
-            OwnedNodeEdgePoint nep1 = neps.get(5);
+            OwnedNodeEdgePoint nep1 = neps.get(3);
             Uuid client4NepUuid = new Uuid(
             Uuid client4NepUuid = new Uuid(
-                    UUID.nameUUIDFromBytes("DSR+XPDR2-CLIENT4".getBytes(Charset.forName("UTF-8"))).toString());
+                    UUID.nameUUIDFromBytes((nodeId + "+DSR+XPDR2-CLIENT4").getBytes(Charset.forName("UTF-8")))
+                    .toString());
             checkNepClient100G(nep1, client4NepUuid, "XPDR2-CLIENT4", "NodeEdgePoint_C4");
             checkNepClient100G(nep1, client4NepUuid, "XPDR2-CLIENT4", "NodeEdgePoint_C4");
-            OwnedNodeEdgePoint nep2 = neps.get(1);
+            OwnedNodeEdgePoint nep2 = neps.get(4);
             Uuid networkNepUuid = new Uuid(
             Uuid networkNepUuid = new Uuid(
-                    UUID.nameUUIDFromBytes("DSR+XPDR2-NETWORK1".getBytes(Charset.forName("UTF-8"))).toString());
+                    UUID.nameUUIDFromBytes((nodeId + "+DSR+XPDR2-NETWORK1").getBytes(Charset.forName("UTF-8")))
+                    .toString());
             checkNepNetworkODU4(nep2, networkNepUuid, "XPDR2-NETWORK1", "NodeEdgePoint_N1");
             List<NodeRuleGroup> nrgList = node.nonnullNodeRuleGroup().values().stream()
                 .sorted((nrg1, nrg2) -> nrg1.getUuid().getValue().compareTo(nrg2.getUuid().getValue()))
             checkNepNetworkODU4(nep2, networkNepUuid, "XPDR2-NETWORK1", "NodeEdgePoint_N1");
             List<NodeRuleGroup> nrgList = node.nonnullNodeRuleGroup().values().stream()
                 .sorted((nrg1, nrg2) -> nrg1.getUuid().getValue().compareTo(nrg2.getUuid().getValue()))
@@ -204,12 +265,14 @@ public class TapiTopologyImplTest extends AbstractTest {
             assertEquals("Mux-DSR node should have 5 NEPs", 5, neps.size());
             OwnedNodeEdgePoint nep1 = neps.get(0);
             Uuid client4NepUuid = new Uuid(
             assertEquals("Mux-DSR node should have 5 NEPs", 5, neps.size());
             OwnedNodeEdgePoint nep1 = neps.get(0);
             Uuid client4NepUuid = new Uuid(
-                    UUID.nameUUIDFromBytes("DSR+XPDR1-CLIENT4".getBytes(Charset.forName("UTF-8"))).toString());
+                    UUID.nameUUIDFromBytes((nodeId + "+DSR+XPDR1-CLIENT4").getBytes(Charset.forName("UTF-8")))
+                    .toString());
             checkNepClient10G(nep1, client4NepUuid, "XPDR1-CLIENT4", "NodeEdgePoint_C4");
 
             OwnedNodeEdgePoint nep2 = neps.get(1);
             Uuid networkNepUuid = new Uuid(
             checkNepClient10G(nep1, client4NepUuid, "XPDR1-CLIENT4", "NodeEdgePoint_C4");
 
             OwnedNodeEdgePoint nep2 = neps.get(1);
             Uuid networkNepUuid = new Uuid(
-                    UUID.nameUUIDFromBytes("DSR+XPDR1-NETWORK1".getBytes(Charset.forName("UTF-8"))).toString());
+                    UUID.nameUUIDFromBytes((nodeId + "+DSR+XPDR1-NETWORK1").getBytes(Charset.forName("UTF-8")))
+                    .toString());
             checkNepNetworkODU4(nep2, networkNepUuid, "XPDR1-NETWORK1", "NodeEdgePoint_N1");
             List<NodeRuleGroup> nrgList = node.nonnullNodeRuleGroup().values().stream()
                 .sorted((nrg1, nrg2) -> nrg1.getUuid().getValue().compareTo(nrg2.getUuid().getValue()))
             checkNepNetworkODU4(nep2, networkNepUuid, "XPDR1-NETWORK1", "NodeEdgePoint_N1");
             List<NodeRuleGroup> nrgList = node.nonnullNodeRuleGroup().values().stream()
                 .sorted((nrg1, nrg2) -> nrg1.getUuid().getValue().compareTo(nrg2.getUuid().getValue()))
@@ -218,7 +281,7 @@ public class TapiTopologyImplTest extends AbstractTest {
         }
     }
 
         }
     }
 
-    private void checkOtsiNode(Node node, Uuid nodeUuid, boolean isSwitch) {
+    private void checkOtsiNode(Node node, Uuid nodeUuid, boolean isSwitch, String nodeId) {
         assertEquals("incorrect node uuid", nodeUuid, node.getUuid());
         assertEquals("administrative state should be UNLOCKED",
             AdministrativeState.UNLOCKED, node.getAdministrativeState());
         assertEquals("incorrect node uuid", nodeUuid, node.getUuid());
         assertEquals("administrative state should be UNLOCKED",
             AdministrativeState.UNLOCKED, node.getAdministrativeState());
@@ -235,13 +298,15 @@ public class TapiTopologyImplTest extends AbstractTest {
             .collect(Collectors.toList());
         if (isSwitch) {
             assertEquals("Switch-OTSi node should have 8 NEPs", 8, neps.size());
             .collect(Collectors.toList());
         if (isSwitch) {
             assertEquals("Switch-OTSi node should have 8 NEPs", 8, neps.size());
-            OwnedNodeEdgePoint nep1 = neps.get(0);
+            OwnedNodeEdgePoint nep1 = neps.get(2);
             Uuid inepUuid = new Uuid(
             Uuid inepUuid = new Uuid(
-                    UUID.nameUUIDFromBytes("iOTSi+XPDR2-NETWORK2".getBytes(Charset.forName("UTF-8"))).toString());
+                    UUID.nameUUIDFromBytes((nodeId + "+iOTSi+XPDR2-NETWORK2").getBytes(Charset.forName("UTF-8")))
+                    .toString());
             checkNepOtsiNode(nep1, inepUuid, "XPDR2-NETWORK2", "iNodeEdgePoint_2");
             checkNepOtsiNode(nep1, inepUuid, "XPDR2-NETWORK2", "iNodeEdgePoint_2");
-            OwnedNodeEdgePoint nep2 = neps.get(5);
+            OwnedNodeEdgePoint nep2 = neps.get(0);
             Uuid enepUuid = new Uuid(
             Uuid enepUuid = new Uuid(
-                    UUID.nameUUIDFromBytes("eOTSi+XPDR2-NETWORK2".getBytes(Charset.forName("UTF-8"))).toString());
+                    UUID.nameUUIDFromBytes((nodeId + "+eOTSi+XPDR2-NETWORK2").getBytes(Charset.forName("UTF-8")))
+                    .toString());
             checkNepOtsiNode(nep2, enepUuid, "XPDR2-NETWORK2", "eNodeEdgePoint_2");
             List<NodeRuleGroup> nrgList = node.nonnullNodeRuleGroup().values().stream()
                 .sorted((nrg1, nrg2) -> nrg1.getUuid().getValue().compareTo(nrg2.getUuid().getValue()))
             checkNepOtsiNode(nep2, enepUuid, "XPDR2-NETWORK2", "eNodeEdgePoint_2");
             List<NodeRuleGroup> nrgList = node.nonnullNodeRuleGroup().values().stream()
                 .sorted((nrg1, nrg2) -> nrg1.getUuid().getValue().compareTo(nrg2.getUuid().getValue()))
@@ -251,11 +316,13 @@ public class TapiTopologyImplTest extends AbstractTest {
             assertEquals("Mux-OTSi node should have 2 NEPs", 2, neps.size());
             OwnedNodeEdgePoint nep1 = neps.get(0);
             Uuid enepUuid = new Uuid(
             assertEquals("Mux-OTSi node should have 2 NEPs", 2, neps.size());
             OwnedNodeEdgePoint nep1 = neps.get(0);
             Uuid enepUuid = new Uuid(
-                    UUID.nameUUIDFromBytes("eOTSi+XPDR1-NETWORK1".getBytes(Charset.forName("UTF-8"))).toString());
+                    UUID.nameUUIDFromBytes((nodeId + "+eOTSi+XPDR1-NETWORK1").getBytes(Charset.forName("UTF-8")))
+                    .toString());
             checkNepOtsiNode(nep1, enepUuid, "XPDR1-NETWORK1", "eNodeEdgePoint_1");
             OwnedNodeEdgePoint nep2 = neps.get(1);
             Uuid inepUuid = new Uuid(
             checkNepOtsiNode(nep1, enepUuid, "XPDR1-NETWORK1", "eNodeEdgePoint_1");
             OwnedNodeEdgePoint nep2 = neps.get(1);
             Uuid inepUuid = new Uuid(
-                    UUID.nameUUIDFromBytes("iOTSi+XPDR1-NETWORK1".getBytes(Charset.forName("UTF-8"))).toString());
+                    UUID.nameUUIDFromBytes((nodeId + "+iOTSi+XPDR1-NETWORK1").getBytes(Charset.forName("UTF-8")))
+                    .toString());
             checkNepOtsiNode(nep2, inepUuid, "XPDR1-NETWORK1", "iNodeEdgePoint_1");
             List<NodeRuleGroup> nrgList = node.nonnullNodeRuleGroup().values().stream()
                 .sorted((nrg1, nrg2) -> nrg1.getUuid().getValue().compareTo(nrg2.getUuid().getValue()))
             checkNepOtsiNode(nep2, inepUuid, "XPDR1-NETWORK1", "iNodeEdgePoint_1");
             List<NodeRuleGroup> nrgList = node.nonnullNodeRuleGroup().values().stream()
                 .sorted((nrg1, nrg2) -> nrg1.getUuid().getValue().compareTo(nrg2.getUuid().getValue()))
@@ -335,13 +402,13 @@ public class TapiTopologyImplTest extends AbstractTest {
                 .compareTo(nrg2.getNodeEdgePointUuid().getValue()))
             .collect(Collectors.toList());
         assertEquals("in the sorted node-rule-group, nep number 2 should be XPDR2-NETWORK1",
                 .compareTo(nrg2.getNodeEdgePointUuid().getValue()))
             .collect(Collectors.toList());
         assertEquals("in the sorted node-rule-group, nep number 2 should be XPDR2-NETWORK1",
-            networkNepUuid, nrg.get(1).getNodeEdgePointUuid());
+            networkNepUuid, nrg.get(4).getNodeEdgePointUuid());
         assertEquals("in the sorted node-rule-group, nep number 6 should be XPDR2-CLIENT4",
         assertEquals("in the sorted node-rule-group, nep number 6 should be XPDR2-CLIENT4",
-            clientNepUuid, nrg.get(5).getNodeEdgePointUuid());
+            clientNepUuid, nrg.get(3).getNodeEdgePointUuid());
         assertEquals("any item of the node-rule-group should have the same nodeUuid",
         assertEquals("any item of the node-rule-group should have the same nodeUuid",
-            nodeUuid, nrg.get(1).getNodeUuid());
+            nodeUuid, nrg.get(4).getNodeUuid());
         assertEquals("any item of the node-rule-group should have the same nodeUuid",
         assertEquals("any item of the node-rule-group should have the same nodeUuid",
-            nodeUuid, nrg.get(5).getNodeUuid());
+            nodeUuid, nrg.get(3).getNodeUuid());
         @Nullable
         List<Rule> ruleList = new ArrayList<>(nrgList.get(0).nonnullRule().values());
         assertEquals("node-rule-group should contain a single rule", 1, ruleList.size());
         @Nullable
         List<Rule> ruleList = new ArrayList<>(nrgList.get(0).nonnullRule().values());
         assertEquals("node-rule-group should contain a single rule", 1, ruleList.size());
@@ -460,7 +527,7 @@ public class TapiTopologyImplTest extends AbstractTest {
 
     private void checkTransitionalLink(Link link, Uuid topoUuid, Uuid node1Uuid, Uuid node2Uuid, String tp1,
         String tp2, String ietfNodeId) {
 
     private void checkTransitionalLink(Link link, Uuid topoUuid, Uuid node1Uuid, Uuid node2Uuid, String tp1,
         String tp2, String ietfNodeId) {
-        Uuid linkUuid = new Uuid(UUID.nameUUIDFromBytes((ietfNodeId + "-" + tp1 + "--" + tp2)
+        Uuid linkUuid = new Uuid(UUID.nameUUIDFromBytes((ietfNodeId + "--" + tp1 + "--" + tp2)
             .getBytes(Charset.forName("UTF-8"))).toString());
         assertEquals("bad uuid for link between DSR node " + tp1 + " and iOTSI port " + tp2, linkUuid, link.getUuid());
         assertEquals("Available capacity unit should be GBPS",
             .getBytes(Charset.forName("UTF-8"))).toString());
         assertEquals("bad uuid for link between DSR node " + tp1 + " and iOTSI port " + tp2, linkUuid, link.getUuid());
         assertEquals("Available capacity unit should be GBPS",
@@ -495,4 +562,56 @@ public class TapiTopologyImplTest extends AbstractTest {
             nodeEdgePointList.get(1).getNodeEdgePointUuid().getValue(),
             either(containsString(nep1Uuid.getValue())).or(containsString(nep2Uuid.getValue())));
     }
             nodeEdgePointList.get(1).getNodeEdgePointUuid().getValue(),
             either(containsString(nep1Uuid.getValue())).or(containsString(nep2Uuid.getValue())));
     }
+
+    private void checkOtnLink(Link link, Uuid topoUuid, Uuid node1Uuid, Uuid node2Uuid, Uuid tp1Uuid, Uuid tp2Uuid,
+        Uuid linkUuid, String linkName) {
+        assertEquals("bad name for the link", linkName, link.getName().get(new NameKey("otn link name")).getValue());
+        assertEquals("bad uuid for link", linkUuid, link.getUuid());
+        assertEquals("Available capacity unit should be MBPS",
+            CapacityUnit.MBPS, link.getAvailableCapacity().getTotalSize().getUnit());
+        String prefix = linkName.split("-")[0];
+        if ("OTU4".equals(prefix)) {
+            assertEquals("Available capacity -total size value should be 0",
+                Uint64.valueOf(0), link.getAvailableCapacity().getTotalSize().getValue());
+        } else if ("ODU4".equals(prefix)) {
+            assertEquals("Available capacity -total size value should be 100 000",
+                Uint64.valueOf(100000), link.getAvailableCapacity().getTotalSize().getValue());
+        }
+        assertEquals("Total capacity unit should be GBPS",
+            CapacityUnit.GBPS, link.getTotalPotentialCapacity().getTotalSize().getUnit());
+        assertEquals("Total capacity -total size value should be 100",
+            Uint64.valueOf(100), link.getTotalPotentialCapacity().getTotalSize().getValue());
+        if ("OTU4".equals(prefix)) {
+            assertEquals("otn link should be between 2 nodes of protocol layers PHOTONIC_MEDIA",
+                LayerProtocolName.PHOTONICMEDIA.getName(), link.getLayerProtocolName().get(0).getName());
+        } else if ("ODU4".equals(prefix)) {
+            assertEquals("otn link should be between 2 nodes of protocol layers ODU",
+                LayerProtocolName.ODU.getName(), link.getLayerProtocolName().get(0).getName());
+        }
+        assertEquals("transitional link should be BIDIRECTIONAL",
+            ForwardingDirection.BIDIRECTIONAL, link.getDirection());
+        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210
+            .link.NodeEdgePoint> nodeEdgePointList = new ArrayList<>(link.nonnullNodeEdgePoint().values());
+        assertEquals("topology uuid should be the same for the two termination point of the link",
+            topoUuid, nodeEdgePointList.get(0).getTopologyUuid());
+        assertEquals("topology uuid should be the same for the two termination point of the link",
+            topoUuid, nodeEdgePointList.get(1).getTopologyUuid());
+        assertThat("otn links should terminate on two distinct nodes",
+            nodeEdgePointList.get(0).getNodeUuid().getValue(),
+            either(containsString(node1Uuid.getValue())).or(containsString(node2Uuid.getValue())));
+        assertThat("otn links should terminate on two distinct nodes",
+            nodeEdgePointList.get(1).getNodeUuid().getValue(),
+            either(containsString(node1Uuid.getValue())).or(containsString(node2Uuid.getValue())));
+        assertThat("otn links should terminate on two distinct tps",
+            nodeEdgePointList.get(0).getNodeEdgePointUuid().getValue(),
+            either(containsString(tp1Uuid.getValue())).or(containsString(tp2Uuid.getValue())));
+        assertThat("otn links should terminate on two distinct tps",
+            nodeEdgePointList.get(1).getNodeEdgePointUuid().getValue(),
+            either(containsString(tp1Uuid.getValue())).or(containsString(tp2Uuid.getValue())));
+        assertEquals("operational state should be ENABLED",
+            OperationalState.ENABLED, link.getOperationalState());
+        assertEquals("administrative state should be UNLOCKED",
+            AdministrativeState.UNLOCKED, link.getAdministrativeState());
+    }
+
 }
 }
index fac97ffd99c8ce82c37a03c6399b28c0df4fd46b..2d669c1c3cf4476864cdeff8ba32cff859492a9e 100644 (file)
@@ -7,14 +7,16 @@
  */
 package org.opendaylight.transportpce.tapi.utils;
 
  */
 package org.opendaylight.transportpce.tapi.utils;
 
-import edu.umd.cs.findbugs.annotations.NonNull;
+import com.google.common.util.concurrent.FluentFuture;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.InputStream;
 import java.util.Optional;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.InputStream;
 import java.util.Optional;
+import java.util.concurrent.ExecutionException;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.WriteTransaction;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.WriteTransaction;
+import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.test.DataStoreContext;
 import org.opendaylight.transportpce.test.converter.XMLDataObjectConverter;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.test.DataStoreContext;
 import org.opendaylight.transportpce.test.converter.XMLDataObjectConverter;
@@ -33,6 +35,7 @@ public final class TopologyDataUtils {
     private static final Logger LOG = LoggerFactory.getLogger(TopologyDataUtils.class);
     public static final String OPENROADM_TOPOLOGY_FILE = "src/test/resources/openroadm-topology2.xml";
     public static final String OTN_TOPOLOGY_FILE = "src/test/resources/otn-topology.xml";
     private static final Logger LOG = LoggerFactory.getLogger(TopologyDataUtils.class);
     public static final String OPENROADM_TOPOLOGY_FILE = "src/test/resources/openroadm-topology2.xml";
     public static final String OTN_TOPOLOGY_FILE = "src/test/resources/otn-topology.xml";
+    public static final String OTN_TOPOLOGY_WITH_OTN_LINKS_FILE = "src/test/resources/otn-topology-with-otn-links.xml";
     public static final String PORTMAPPING_FILE = "src/test/resources/portmapping-example.xml";
 
     public static GetTopologyDetailsInput buildGetTopologyDetailsInput(String topoName) {
     public static final String PORTMAPPING_FILE = "src/test/resources/portmapping-example.xml";
 
     public static GetTopologyDetailsInput buildGetTopologyDetailsInput(String topoName) {
@@ -42,7 +45,7 @@ public final class TopologyDataUtils {
     }
 
     public static <T> void writeTopologyFromFileToDatastore(DataStoreContext dataStoreContextUtil, String file,
     }
 
     public static <T> void writeTopologyFromFileToDatastore(DataStoreContext dataStoreContextUtil, String file,
-        InstanceIdentifier ii) {
+        InstanceIdentifier ii) throws InterruptedException, ExecutionException {
         Networks networks = null;
         File topoFile = new File(file);
         if (topoFile.exists()) {
         Networks networks = null;
         File topoFile = new File(file);
         if (topoFile.exists()) {
@@ -70,22 +73,22 @@ public final class TopologyDataUtils {
         } else {
             LOG.error("xml file {} not found at {}", topoFile.getName(), topoFile.getAbsolutePath());
         }
         } else {
             LOG.error("xml file {} not found at {}", topoFile.getName(), topoFile.getAbsolutePath());
         }
-        writeTransaction(dataStoreContextUtil.getDataBroker(), ii,
+        FluentFuture<? extends CommitInfo> commitFuture = writeTransaction(dataStoreContextUtil.getDataBroker(), ii,
                 networks.nonnullNetwork().values().stream().findFirst().get());
                 networks.nonnullNetwork().values().stream().findFirst().get());
+        commitFuture.get();
         LOG.info("extraction from {} stored with success in datastore", topoFile.getName());
     }
 
     @SuppressWarnings("unchecked")
         LOG.info("extraction from {} stored with success in datastore", topoFile.getName());
     }
 
     @SuppressWarnings("unchecked")
-    private static boolean writeTransaction(DataBroker dataBroker, InstanceIdentifier instanceIdentifier,
-        DataObject object) {
-        @NonNull
+    private static FluentFuture<? extends CommitInfo> writeTransaction(DataBroker dataBroker,
+        InstanceIdentifier instanceIdentifier, DataObject object) {
         WriteTransaction transaction = dataBroker.newWriteOnlyTransaction();
         transaction.put(LogicalDatastoreType.CONFIGURATION, instanceIdentifier, object);
         WriteTransaction transaction = dataBroker.newWriteOnlyTransaction();
         transaction.put(LogicalDatastoreType.CONFIGURATION, instanceIdentifier, object);
-        transaction.commit();
-        return true;
+        return transaction.commit();
     }
 
     }
 
-    public static void writePortmappingFromFileToDatastore(DataStoreContext dataStoreContextUtil) {
+    public static void writePortmappingFromFileToDatastore(DataStoreContext dataStoreContextUtil)
+        throws InterruptedException, ExecutionException {
         Network result = null;
         File portmappingFile = new File(PORTMAPPING_FILE);
         if (portmappingFile.exists()) {
         Network result = null;
         File portmappingFile = new File(PORTMAPPING_FILE);
         if (portmappingFile.exists()) {
@@ -114,7 +117,9 @@ public final class TopologyDataUtils {
             LOG.error("xml file {} not found at {}", portmappingFile.getName(), portmappingFile.getAbsolutePath());
         }
         InstanceIdentifier<Network> portmappingIID = InstanceIdentifier.builder(Network.class).build();
             LOG.error("xml file {} not found at {}", portmappingFile.getName(), portmappingFile.getAbsolutePath());
         }
         InstanceIdentifier<Network> portmappingIID = InstanceIdentifier.builder(Network.class).build();
-        writeTransaction(dataStoreContextUtil.getDataBroker(), portmappingIID, result);
+        FluentFuture<? extends CommitInfo> writeTransaction = writeTransaction(dataStoreContextUtil.getDataBroker(),
+            portmappingIID, result);
+        writeTransaction.get();
         LOG.info("portmapping-example stored with success in datastore");
     }
 
         LOG.info("portmapping-example stored with success in datastore");
     }
 
diff --git a/tapi/src/test/resources/otn-topology-with-otn-links.xml b/tapi/src/test/resources/otn-topology-with-otn-links.xml
new file mode 100644 (file)
index 0000000..237abf4
--- /dev/null
@@ -0,0 +1,968 @@
+<data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
+<networks xmlns="urn:ietf:params:xml:ns:yang:ietf-network">
+<network>
+  <network-id>otn-topology</network-id>
+  <network-types>
+    <openroadm-common-network xmlns="http://org/openroadm/common/network" />
+  </network-types>
+  <node>
+    <node-id>SPDR-SA1-XPDR1</node-id>
+    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR1-CLIENT1</tp-id>
+      <xpdr-tp-port-connection-attributes xmlns="http://org/openroadm/otn/network/topology">
+        <rate xmlns:x="http://org/openroadm/otn-common-types">x:ODU2e</rate>
+      </xpdr-tp-port-connection-attributes>
+      <tp-supported-interfaces xmlns="http://org/openroadm/otn/network/topology">
+        <supported-interface-capability>
+          <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-10GE-ODU2e</if-cap-type>
+        </supported-interface-capability>
+      </tp-supported-interfaces>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
+    </termination-point>
+    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR1-CLIENT3</tp-id>
+      <xpdr-tp-port-connection-attributes xmlns="http://org/openroadm/otn/network/topology">
+        <rate xmlns:x="http://org/openroadm/otn-common-types">x:ODU2e</rate>
+      </xpdr-tp-port-connection-attributes>
+      <tp-supported-interfaces xmlns="http://org/openroadm/otn/network/topology">
+        <supported-interface-capability>
+          <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-10GE-ODU2e</if-cap-type>
+        </supported-interface-capability>
+      </tp-supported-interfaces>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
+    </termination-point>
+    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR1-CLIENT2</tp-id>
+      <xpdr-tp-port-connection-attributes xmlns="http://org/openroadm/otn/network/topology">
+        <rate xmlns:x="http://org/openroadm/otn-common-types">x:ODU2e</rate>
+      </xpdr-tp-port-connection-attributes>
+      <tp-supported-interfaces xmlns="http://org/openroadm/otn/network/topology">
+        <supported-interface-capability>
+          <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-10GE-ODU2e</if-cap-type>
+        </supported-interface-capability>
+      </tp-supported-interfaces>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
+    </termination-point>
+    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR1-NETWORK1</tp-id>
+      <supporting-termination-point>
+        <network-ref>openroadm-topology</network-ref>
+        <node-ref>SPDR-SA1-XPDR1</node-ref>
+        <tp-ref>XPDR1-NETWORK1</tp-ref>
+      </supporting-termination-point>
+      <xpdr-tp-port-connection-attributes xmlns="http://org/openroadm/otn/network/topology">
+        <odtu-tpn-pool>
+          <odtu-type xmlns:x="http://org/openroadm/otn-common-types">x:ODTU4.ts-Allocated</odtu-type>
+          <tpn-pool>2</tpn-pool>
+          <tpn-pool>1</tpn-pool>
+          <tpn-pool>12</tpn-pool>
+          <tpn-pool>11</tpn-pool>
+          <tpn-pool>14</tpn-pool>
+          <tpn-pool>13</tpn-pool>
+          <tpn-pool>16</tpn-pool>
+          <tpn-pool>15</tpn-pool>
+          <tpn-pool>18</tpn-pool>
+          <tpn-pool>17</tpn-pool>
+          <tpn-pool>4</tpn-pool>
+          <tpn-pool>3</tpn-pool>
+          <tpn-pool>6</tpn-pool>
+          <tpn-pool>5</tpn-pool>
+          <tpn-pool>8</tpn-pool>
+          <tpn-pool>7</tpn-pool>
+          <tpn-pool>10</tpn-pool>
+          <tpn-pool>9</tpn-pool>
+          <tpn-pool>28</tpn-pool>
+          <tpn-pool>27</tpn-pool>
+          <tpn-pool>30</tpn-pool>
+          <tpn-pool>29</tpn-pool>
+          <tpn-pool>32</tpn-pool>
+          <tpn-pool>31</tpn-pool>
+          <tpn-pool>34</tpn-pool>
+          <tpn-pool>33</tpn-pool>
+          <tpn-pool>20</tpn-pool>
+          <tpn-pool>19</tpn-pool>
+          <tpn-pool>22</tpn-pool>
+          <tpn-pool>21</tpn-pool>
+          <tpn-pool>24</tpn-pool>
+          <tpn-pool>23</tpn-pool>
+          <tpn-pool>26</tpn-pool>
+          <tpn-pool>25</tpn-pool>
+          <tpn-pool>44</tpn-pool>
+          <tpn-pool>43</tpn-pool>
+          <tpn-pool>46</tpn-pool>
+          <tpn-pool>45</tpn-pool>
+          <tpn-pool>48</tpn-pool>
+          <tpn-pool>47</tpn-pool>
+          <tpn-pool>50</tpn-pool>
+          <tpn-pool>49</tpn-pool>
+          <tpn-pool>36</tpn-pool>
+          <tpn-pool>35</tpn-pool>
+          <tpn-pool>38</tpn-pool>
+          <tpn-pool>37</tpn-pool>
+          <tpn-pool>40</tpn-pool>
+          <tpn-pool>39</tpn-pool>
+          <tpn-pool>42</tpn-pool>
+          <tpn-pool>41</tpn-pool>
+          <tpn-pool>60</tpn-pool>
+          <tpn-pool>59</tpn-pool>
+          <tpn-pool>62</tpn-pool>
+          <tpn-pool>61</tpn-pool>
+          <tpn-pool>64</tpn-pool>
+          <tpn-pool>63</tpn-pool>
+          <tpn-pool>66</tpn-pool>
+          <tpn-pool>65</tpn-pool>
+          <tpn-pool>52</tpn-pool>
+          <tpn-pool>51</tpn-pool>
+          <tpn-pool>54</tpn-pool>
+          <tpn-pool>53</tpn-pool>
+          <tpn-pool>56</tpn-pool>
+          <tpn-pool>55</tpn-pool>
+          <tpn-pool>58</tpn-pool>
+          <tpn-pool>57</tpn-pool>
+          <tpn-pool>76</tpn-pool>
+          <tpn-pool>75</tpn-pool>
+          <tpn-pool>78</tpn-pool>
+          <tpn-pool>77</tpn-pool>
+          <tpn-pool>80</tpn-pool>
+          <tpn-pool>79</tpn-pool>
+          <tpn-pool>68</tpn-pool>
+          <tpn-pool>67</tpn-pool>
+          <tpn-pool>70</tpn-pool>
+          <tpn-pool>69</tpn-pool>
+          <tpn-pool>72</tpn-pool>
+          <tpn-pool>71</tpn-pool>
+          <tpn-pool>74</tpn-pool>
+          <tpn-pool>73</tpn-pool>
+        </odtu-tpn-pool>
+        <rate xmlns:x="http://org/openroadm/otn-common-types">x:ODU4</rate>
+        <ts-pool>48</ts-pool>
+        <ts-pool>49</ts-pool>
+        <ts-pool>46</ts-pool>
+        <ts-pool>47</ts-pool>
+        <ts-pool>52</ts-pool>
+        <ts-pool>53</ts-pool>
+        <ts-pool>50</ts-pool>
+        <ts-pool>51</ts-pool>
+        <ts-pool>40</ts-pool>
+        <ts-pool>41</ts-pool>
+        <ts-pool>38</ts-pool>
+        <ts-pool>39</ts-pool>
+        <ts-pool>44</ts-pool>
+        <ts-pool>45</ts-pool>
+        <ts-pool>42</ts-pool>
+        <ts-pool>43</ts-pool>
+        <ts-pool>64</ts-pool>
+        <ts-pool>65</ts-pool>
+        <ts-pool>62</ts-pool>
+        <ts-pool>63</ts-pool>
+        <ts-pool>68</ts-pool>
+        <ts-pool>69</ts-pool>
+        <ts-pool>66</ts-pool>
+        <ts-pool>67</ts-pool>
+        <ts-pool>56</ts-pool>
+        <ts-pool>57</ts-pool>
+        <ts-pool>54</ts-pool>
+        <ts-pool>55</ts-pool>
+        <ts-pool>60</ts-pool>
+        <ts-pool>61</ts-pool>
+        <ts-pool>58</ts-pool>
+        <ts-pool>59</ts-pool>
+        <ts-pool>80</ts-pool>
+        <ts-pool>78</ts-pool>
+        <ts-pool>79</ts-pool>
+        <ts-pool>72</ts-pool>
+        <ts-pool>73</ts-pool>
+        <ts-pool>70</ts-pool>
+        <ts-pool>71</ts-pool>
+        <ts-pool>76</ts-pool>
+        <ts-pool>77</ts-pool>
+        <ts-pool>74</ts-pool>
+        <ts-pool>75</ts-pool>
+        <ts-pool>1</ts-pool>
+        <ts-pool>4</ts-pool>
+        <ts-pool>5</ts-pool>
+        <ts-pool>2</ts-pool>
+        <ts-pool>3</ts-pool>
+        <ts-pool>16</ts-pool>
+        <ts-pool>17</ts-pool>
+        <ts-pool>14</ts-pool>
+        <ts-pool>15</ts-pool>
+        <ts-pool>20</ts-pool>
+        <ts-pool>21</ts-pool>
+        <ts-pool>18</ts-pool>
+        <ts-pool>19</ts-pool>
+        <ts-pool>8</ts-pool>
+        <ts-pool>9</ts-pool>
+        <ts-pool>6</ts-pool>
+        <ts-pool>7</ts-pool>
+        <ts-pool>12</ts-pool>
+        <ts-pool>13</ts-pool>
+        <ts-pool>10</ts-pool>
+        <ts-pool>11</ts-pool>
+        <ts-pool>32</ts-pool>
+        <ts-pool>33</ts-pool>
+        <ts-pool>30</ts-pool>
+        <ts-pool>31</ts-pool>
+        <ts-pool>36</ts-pool>
+        <ts-pool>37</ts-pool>
+        <ts-pool>34</ts-pool>
+        <ts-pool>35</ts-pool>
+        <ts-pool>24</ts-pool>
+        <ts-pool>25</ts-pool>
+        <ts-pool>22</ts-pool>
+        <ts-pool>23</ts-pool>
+        <ts-pool>28</ts-pool>
+        <ts-pool>29</ts-pool>
+        <ts-pool>26</ts-pool>
+        <ts-pool>27</ts-pool>
+      </xpdr-tp-port-connection-attributes>
+      <tp-supported-interfaces xmlns="http://org/openroadm/otn/network/topology">
+        <supported-interface-capability>
+          <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-OCH-OTU4-ODU4</if-cap-type>
+        </supported-interface-capability>
+      </tp-supported-interfaces>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
+    </termination-point>
+    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR1-CLIENT4</tp-id>
+      <xpdr-tp-port-connection-attributes xmlns="http://org/openroadm/otn/network/topology">
+        <rate xmlns:x="http://org/openroadm/otn-common-types">x:ODU2e</rate>
+      </xpdr-tp-port-connection-attributes>
+      <tp-supported-interfaces xmlns="http://org/openroadm/otn/network/topology">
+        <supported-interface-capability>
+          <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-10GE-ODU2e</if-cap-type>
+        </supported-interface-capability>
+      </tp-supported-interfaces>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
+    </termination-point>
+    <supporting-node>
+      <network-ref>openroadm-network</network-ref>
+      <node-ref>SPDR-SA1</node-ref>
+    </supporting-node>
+    <supporting-node>
+      <network-ref>clli-network</network-ref>
+      <node-ref>NodeSA</node-ref>
+    </supporting-node>
+    <supporting-node>
+      <network-ref>openroadm-topology</network-ref>
+      <node-ref>SPDR-SA1-XPDR1</node-ref>
+    </supporting-node>
+    <node-type xmlns="http://org/openroadm/common/network">MUXPDR</node-type>
+    <switching-pools xmlns="http://org/openroadm/otn/network/topology">
+      <odu-switching-pools>
+        <switching-pool-number>1</switching-pool-number>
+        <non-blocking-list>
+          <nbl-number>4</nbl-number>
+          <available-interconnect-bandwidth>10
+          </available-interconnect-bandwidth>
+          <interconnect-bandwidth-unit>1000000000
+          </interconnect-bandwidth-unit>
+          <tp-list>XPDR1-CLIENT4</tp-list>
+          <tp-list>XPDR1-NETWORK1</tp-list>
+        </non-blocking-list>
+        <non-blocking-list>
+          <nbl-number>1</nbl-number>
+          <available-interconnect-bandwidth>10
+          </available-interconnect-bandwidth>
+          <interconnect-bandwidth-unit>1000000000
+          </interconnect-bandwidth-unit>
+          <tp-list>XPDR1-CLIENT1</tp-list>
+          <tp-list>XPDR1-NETWORK1</tp-list>
+        </non-blocking-list>
+        <non-blocking-list>
+          <nbl-number>2</nbl-number>
+          <available-interconnect-bandwidth>10
+          </available-interconnect-bandwidth>
+          <interconnect-bandwidth-unit>1000000000
+          </interconnect-bandwidth-unit>
+          <tp-list>XPDR1-NETWORK1</tp-list>
+          <tp-list>XPDR1-CLIENT2</tp-list>
+        </non-blocking-list>
+        <non-blocking-list>
+          <nbl-number>3</nbl-number>
+          <available-interconnect-bandwidth>10
+          </available-interconnect-bandwidth>
+          <interconnect-bandwidth-unit>1000000000
+          </interconnect-bandwidth-unit>
+          <tp-list>XPDR1-NETWORK1</tp-list>
+          <tp-list>XPDR1-CLIENT3</tp-list>
+        </non-blocking-list>
+        <switching-pool-type>non-blocking</switching-pool-type>
+      </odu-switching-pools>
+    </switching-pools>
+    <tp-bandwidth-sharing xmlns="http://org/openroadm/otn/network/topology" />
+    <xpdr-attributes xmlns="http://org/openroadm/otn/network/topology">
+      <xpdr-number>1</xpdr-number>
+    </xpdr-attributes>
+  </node>
+  <node>
+    <node-id>SPDR-SC1-XPDR1</node-id>
+    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR1-CLIENT1</tp-id>
+      <xpdr-tp-port-connection-attributes xmlns="http://org/openroadm/otn/network/topology">
+        <rate xmlns:x="http://org/openroadm/otn-common-types">x:ODU2e</rate>
+      </xpdr-tp-port-connection-attributes>
+      <tp-supported-interfaces xmlns="http://org/openroadm/otn/network/topology">
+        <supported-interface-capability>
+          <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-10GE-ODU2e</if-cap-type>
+        </supported-interface-capability>
+      </tp-supported-interfaces>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
+    </termination-point>
+    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR1-CLIENT3</tp-id>
+      <xpdr-tp-port-connection-attributes xmlns="http://org/openroadm/otn/network/topology">
+        <rate xmlns:x="http://org/openroadm/otn-common-types">x:ODU2e</rate>
+      </xpdr-tp-port-connection-attributes>
+      <tp-supported-interfaces xmlns="http://org/openroadm/otn/network/topology">
+        <supported-interface-capability>
+          <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-10GE-ODU2e</if-cap-type>
+        </supported-interface-capability>
+      </tp-supported-interfaces>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
+    </termination-point>
+    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR1-CLIENT2</tp-id>
+      <xpdr-tp-port-connection-attributes xmlns="http://org/openroadm/otn/network/topology">
+        <rate xmlns:x="http://org/openroadm/otn-common-types">x:ODU2e</rate>
+      </xpdr-tp-port-connection-attributes>
+      <tp-supported-interfaces xmlns="http://org/openroadm/otn/network/topology">
+        <supported-interface-capability>
+          <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-10GE-ODU2e</if-cap-type>
+        </supported-interface-capability>
+      </tp-supported-interfaces>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
+    </termination-point>
+    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR1-NETWORK1</tp-id>
+      <supporting-termination-point>
+        <network-ref>openroadm-topology</network-ref>
+        <node-ref>SPDR-SC1-XPDR1</node-ref>
+        <tp-ref>XPDR1-NETWORK1</tp-ref>
+      </supporting-termination-point>
+      <xpdr-tp-port-connection-attributes xmlns="http://org/openroadm/otn/network/topology">
+        <odtu-tpn-pool>
+          <odtu-type xmlns:x="http://org/openroadm/otn-common-types">x:ODTU4.ts-Allocated</odtu-type>
+          <tpn-pool>2</tpn-pool>
+          <tpn-pool>1</tpn-pool>
+          <tpn-pool>12</tpn-pool>
+          <tpn-pool>11</tpn-pool>
+          <tpn-pool>14</tpn-pool>
+          <tpn-pool>13</tpn-pool>
+          <tpn-pool>16</tpn-pool>
+          <tpn-pool>15</tpn-pool>
+          <tpn-pool>18</tpn-pool>
+          <tpn-pool>17</tpn-pool>
+          <tpn-pool>4</tpn-pool>
+          <tpn-pool>3</tpn-pool>
+          <tpn-pool>6</tpn-pool>
+          <tpn-pool>5</tpn-pool>
+          <tpn-pool>8</tpn-pool>
+          <tpn-pool>7</tpn-pool>
+          <tpn-pool>10</tpn-pool>
+          <tpn-pool>9</tpn-pool>
+          <tpn-pool>28</tpn-pool>
+          <tpn-pool>27</tpn-pool>
+          <tpn-pool>30</tpn-pool>
+          <tpn-pool>29</tpn-pool>
+          <tpn-pool>32</tpn-pool>
+          <tpn-pool>31</tpn-pool>
+          <tpn-pool>34</tpn-pool>
+          <tpn-pool>33</tpn-pool>
+          <tpn-pool>20</tpn-pool>
+          <tpn-pool>19</tpn-pool>
+          <tpn-pool>22</tpn-pool>
+          <tpn-pool>21</tpn-pool>
+          <tpn-pool>24</tpn-pool>
+          <tpn-pool>23</tpn-pool>
+          <tpn-pool>26</tpn-pool>
+          <tpn-pool>25</tpn-pool>
+          <tpn-pool>44</tpn-pool>
+          <tpn-pool>43</tpn-pool>
+          <tpn-pool>46</tpn-pool>
+          <tpn-pool>45</tpn-pool>
+          <tpn-pool>48</tpn-pool>
+          <tpn-pool>47</tpn-pool>
+          <tpn-pool>50</tpn-pool>
+          <tpn-pool>49</tpn-pool>
+          <tpn-pool>36</tpn-pool>
+          <tpn-pool>35</tpn-pool>
+          <tpn-pool>38</tpn-pool>
+          <tpn-pool>37</tpn-pool>
+          <tpn-pool>40</tpn-pool>
+          <tpn-pool>39</tpn-pool>
+          <tpn-pool>42</tpn-pool>
+          <tpn-pool>41</tpn-pool>
+          <tpn-pool>60</tpn-pool>
+          <tpn-pool>59</tpn-pool>
+          <tpn-pool>62</tpn-pool>
+          <tpn-pool>61</tpn-pool>
+          <tpn-pool>64</tpn-pool>
+          <tpn-pool>63</tpn-pool>
+          <tpn-pool>66</tpn-pool>
+          <tpn-pool>65</tpn-pool>
+          <tpn-pool>52</tpn-pool>
+          <tpn-pool>51</tpn-pool>
+          <tpn-pool>54</tpn-pool>
+          <tpn-pool>53</tpn-pool>
+          <tpn-pool>56</tpn-pool>
+          <tpn-pool>55</tpn-pool>
+          <tpn-pool>58</tpn-pool>
+          <tpn-pool>57</tpn-pool>
+          <tpn-pool>76</tpn-pool>
+          <tpn-pool>75</tpn-pool>
+          <tpn-pool>78</tpn-pool>
+          <tpn-pool>77</tpn-pool>
+          <tpn-pool>80</tpn-pool>
+          <tpn-pool>79</tpn-pool>
+          <tpn-pool>68</tpn-pool>
+          <tpn-pool>67</tpn-pool>
+          <tpn-pool>70</tpn-pool>
+          <tpn-pool>69</tpn-pool>
+          <tpn-pool>72</tpn-pool>
+          <tpn-pool>71</tpn-pool>
+          <tpn-pool>74</tpn-pool>
+          <tpn-pool>73</tpn-pool>
+        </odtu-tpn-pool>
+        <rate xmlns:x="http://org/openroadm/otn-common-types">x:ODU4</rate>
+        <ts-pool>48</ts-pool>
+        <ts-pool>49</ts-pool>
+        <ts-pool>46</ts-pool>
+        <ts-pool>47</ts-pool>
+        <ts-pool>52</ts-pool>
+        <ts-pool>53</ts-pool>
+        <ts-pool>50</ts-pool>
+        <ts-pool>51</ts-pool>
+        <ts-pool>40</ts-pool>
+        <ts-pool>41</ts-pool>
+        <ts-pool>38</ts-pool>
+        <ts-pool>39</ts-pool>
+        <ts-pool>44</ts-pool>
+        <ts-pool>45</ts-pool>
+        <ts-pool>42</ts-pool>
+        <ts-pool>43</ts-pool>
+        <ts-pool>64</ts-pool>
+        <ts-pool>65</ts-pool>
+        <ts-pool>62</ts-pool>
+        <ts-pool>63</ts-pool>
+        <ts-pool>68</ts-pool>
+        <ts-pool>69</ts-pool>
+        <ts-pool>66</ts-pool>
+        <ts-pool>67</ts-pool>
+        <ts-pool>56</ts-pool>
+        <ts-pool>57</ts-pool>
+        <ts-pool>54</ts-pool>
+        <ts-pool>55</ts-pool>
+        <ts-pool>60</ts-pool>
+        <ts-pool>61</ts-pool>
+        <ts-pool>58</ts-pool>
+        <ts-pool>59</ts-pool>
+        <ts-pool>80</ts-pool>
+        <ts-pool>78</ts-pool>
+        <ts-pool>79</ts-pool>
+        <ts-pool>72</ts-pool>
+        <ts-pool>73</ts-pool>
+        <ts-pool>70</ts-pool>
+        <ts-pool>71</ts-pool>
+        <ts-pool>76</ts-pool>
+        <ts-pool>77</ts-pool>
+        <ts-pool>74</ts-pool>
+        <ts-pool>75</ts-pool>
+        <ts-pool>1</ts-pool>
+        <ts-pool>4</ts-pool>
+        <ts-pool>5</ts-pool>
+        <ts-pool>2</ts-pool>
+        <ts-pool>3</ts-pool>
+        <ts-pool>16</ts-pool>
+        <ts-pool>17</ts-pool>
+        <ts-pool>14</ts-pool>
+        <ts-pool>15</ts-pool>
+        <ts-pool>20</ts-pool>
+        <ts-pool>21</ts-pool>
+        <ts-pool>18</ts-pool>
+        <ts-pool>19</ts-pool>
+        <ts-pool>8</ts-pool>
+        <ts-pool>9</ts-pool>
+        <ts-pool>6</ts-pool>
+        <ts-pool>7</ts-pool>
+        <ts-pool>12</ts-pool>
+        <ts-pool>13</ts-pool>
+        <ts-pool>10</ts-pool>
+        <ts-pool>11</ts-pool>
+        <ts-pool>32</ts-pool>
+        <ts-pool>33</ts-pool>
+        <ts-pool>30</ts-pool>
+        <ts-pool>31</ts-pool>
+        <ts-pool>36</ts-pool>
+        <ts-pool>37</ts-pool>
+        <ts-pool>34</ts-pool>
+        <ts-pool>35</ts-pool>
+        <ts-pool>24</ts-pool>
+        <ts-pool>25</ts-pool>
+        <ts-pool>22</ts-pool>
+        <ts-pool>23</ts-pool>
+        <ts-pool>28</ts-pool>
+        <ts-pool>29</ts-pool>
+        <ts-pool>26</ts-pool>
+        <ts-pool>27</ts-pool>
+      </xpdr-tp-port-connection-attributes>
+      <tp-supported-interfaces xmlns="http://org/openroadm/otn/network/topology">
+        <supported-interface-capability>
+          <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-OCH-OTU4-ODU4</if-cap-type>
+        </supported-interface-capability>
+      </tp-supported-interfaces>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
+    </termination-point>
+    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR1-CLIENT4</tp-id>
+      <xpdr-tp-port-connection-attributes xmlns="http://org/openroadm/otn/network/topology">
+        <rate xmlns:x="http://org/openroadm/otn-common-types">x:ODU2e</rate>
+      </xpdr-tp-port-connection-attributes>
+      <tp-supported-interfaces xmlns="http://org/openroadm/otn/network/topology">
+        <supported-interface-capability>
+          <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-10GE-ODU2e</if-cap-type>
+        </supported-interface-capability>
+      </tp-supported-interfaces>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
+    </termination-point>
+    <supporting-node>
+      <network-ref>openroadm-network</network-ref>
+      <node-ref>SPDR-SC1</node-ref>
+    </supporting-node>
+    <supporting-node>
+      <network-ref>clli-network</network-ref>
+      <node-ref>NodeSC</node-ref>
+    </supporting-node>
+    <supporting-node>
+      <network-ref>openroadm-topology</network-ref>
+      <node-ref>SPDR-SC1-XPDR1</node-ref>
+    </supporting-node>
+    <node-type xmlns="http://org/openroadm/common/network">MUXPDR</node-type>
+    <switching-pools xmlns="http://org/openroadm/otn/network/topology">
+      <odu-switching-pools>
+        <switching-pool-number>1</switching-pool-number>
+        <non-blocking-list>
+          <nbl-number>4</nbl-number>
+          <available-interconnect-bandwidth>10
+          </available-interconnect-bandwidth>
+          <interconnect-bandwidth-unit>1000000000
+          </interconnect-bandwidth-unit>
+          <tp-list>XPDR1-CLIENT4</tp-list>
+          <tp-list>XPDR1-NETWORK1</tp-list>
+        </non-blocking-list>
+        <non-blocking-list>
+          <nbl-number>1</nbl-number>
+          <available-interconnect-bandwidth>10
+          </available-interconnect-bandwidth>
+          <interconnect-bandwidth-unit>1000000000
+          </interconnect-bandwidth-unit>
+          <tp-list>XPDR1-CLIENT1</tp-list>
+          <tp-list>XPDR1-NETWORK1</tp-list>
+        </non-blocking-list>
+        <non-blocking-list>
+          <nbl-number>2</nbl-number>
+          <available-interconnect-bandwidth>10
+          </available-interconnect-bandwidth>
+          <interconnect-bandwidth-unit>1000000000
+          </interconnect-bandwidth-unit>
+          <tp-list>XPDR1-NETWORK1</tp-list>
+          <tp-list>XPDR1-CLIENT2</tp-list>
+        </non-blocking-list>
+        <non-blocking-list>
+          <nbl-number>3</nbl-number>
+          <available-interconnect-bandwidth>10
+          </available-interconnect-bandwidth>
+          <interconnect-bandwidth-unit>1000000000
+          </interconnect-bandwidth-unit>
+          <tp-list>XPDR1-NETWORK1</tp-list>
+          <tp-list>XPDR1-CLIENT3</tp-list>
+        </non-blocking-list>
+        <switching-pool-type>non-blocking</switching-pool-type>
+      </odu-switching-pools>
+    </switching-pools>
+    <tp-bandwidth-sharing xmlns="http://org/openroadm/otn/network/topology" />
+    <xpdr-attributes xmlns="http://org/openroadm/otn/network/topology">
+      <xpdr-number>1</xpdr-number>
+    </xpdr-attributes>
+  </node>
+  <node>
+    <node-id>SPDR-SA1-XPDR2</node-id>
+    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR2-NETWORK1</tp-id>
+      <supporting-termination-point>
+        <network-ref>openroadm-topology</network-ref>
+        <node-ref>SPDR-SA1-XPDR2</node-ref>
+        <tp-ref>XPDR2-NETWORK1</tp-ref>
+      </supporting-termination-point>
+      <xpdr-tp-port-connection-attributes xmlns="http://org/openroadm/otn/network/topology">
+        <rate xmlns:x="http://org/openroadm/otn-common-types">x:ODU4</rate>
+      </xpdr-tp-port-connection-attributes>
+      <tp-supported-interfaces xmlns="http://org/openroadm/otn/network/topology">
+        <supported-interface-capability>
+          <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-OCH-OTU4-ODU4</if-cap-type>
+        </supported-interface-capability>
+      </tp-supported-interfaces>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
+    </termination-point>
+    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR2-NETWORK3</tp-id>
+      <supporting-termination-point>
+        <network-ref>openroadm-topology</network-ref>
+        <node-ref>SPDR-SA1-XPDR2</node-ref>
+        <tp-ref>XPDR2-NETWORK3</tp-ref>
+      </supporting-termination-point>
+      <xpdr-tp-port-connection-attributes xmlns="http://org/openroadm/otn/network/topology">
+        <rate xmlns:x="http://org/openroadm/otn-common-types">x:ODU4</rate>
+      </xpdr-tp-port-connection-attributes>
+      <tp-supported-interfaces xmlns="http://org/openroadm/otn/network/topology">
+        <supported-interface-capability>
+          <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-OCH-OTU4-ODU4</if-cap-type>
+        </supported-interface-capability>
+      </tp-supported-interfaces>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
+    </termination-point>
+    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR2-NETWORK2</tp-id>
+      <supporting-termination-point>
+        <network-ref>openroadm-topology</network-ref>
+        <node-ref>SPDR-SA1-XPDR2</node-ref>
+        <tp-ref>XPDR2-NETWORK2</tp-ref>
+      </supporting-termination-point>
+      <xpdr-tp-port-connection-attributes xmlns="http://org/openroadm/otn/network/topology">
+        <rate xmlns:x="http://org/openroadm/otn-common-types">x:ODU4</rate>
+      </xpdr-tp-port-connection-attributes>
+      <tp-supported-interfaces xmlns="http://org/openroadm/otn/network/topology">
+        <supported-interface-capability>
+          <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-OCH-OTU4-ODU4</if-cap-type>
+        </supported-interface-capability>
+      </tp-supported-interfaces>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
+    </termination-point>
+    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR2-NETWORK4</tp-id>
+      <supporting-termination-point>
+        <network-ref>openroadm-topology</network-ref>
+        <node-ref>SPDR-SA1-XPDR2</node-ref>
+        <tp-ref>XPDR2-NETWORK4</tp-ref>
+      </supporting-termination-point>
+      <xpdr-tp-port-connection-attributes xmlns="http://org/openroadm/otn/network/topology">
+        <rate xmlns:x="http://org/openroadm/otn-common-types">x:ODU4</rate>
+      </xpdr-tp-port-connection-attributes>
+      <tp-supported-interfaces xmlns="http://org/openroadm/otn/network/topology">
+        <supported-interface-capability>
+          <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-OCH-OTU4-ODU4</if-cap-type>
+        </supported-interface-capability>
+      </tp-supported-interfaces>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
+    </termination-point>
+    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR2-CLIENT3</tp-id>
+      <xpdr-tp-port-connection-attributes xmlns="http://org/openroadm/otn/network/topology">
+        <rate xmlns:x="http://org/openroadm/otn-common-types">x:ODU4</rate>
+      </xpdr-tp-port-connection-attributes>
+      <tp-supported-interfaces xmlns="http://org/openroadm/otn/network/topology">
+        <supported-interface-capability>
+          <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-100GE-ODU4</if-cap-type>
+        </supported-interface-capability>
+      </tp-supported-interfaces>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
+    </termination-point>
+    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR2-CLIENT4</tp-id>
+      <xpdr-tp-port-connection-attributes xmlns="http://org/openroadm/otn/network/topology">
+        <rate xmlns:x="http://org/openroadm/otn-common-types">x:ODU4</rate>
+      </xpdr-tp-port-connection-attributes>
+      <tp-supported-interfaces xmlns="http://org/openroadm/otn/network/topology">
+        <supported-interface-capability>
+          <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-100GE-ODU4</if-cap-type>
+        </supported-interface-capability>
+      </tp-supported-interfaces>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
+    </termination-point>
+    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR2-CLIENT1</tp-id>
+      <xpdr-tp-port-connection-attributes xmlns="http://org/openroadm/otn/network/topology">
+        <rate xmlns:x="http://org/openroadm/otn-common-types">x:ODU4</rate>
+      </xpdr-tp-port-connection-attributes>
+      <tp-supported-interfaces xmlns="http://org/openroadm/otn/network/topology">
+        <supported-interface-capability>
+          <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-100GE-ODU4</if-cap-type>
+        </supported-interface-capability>
+      </tp-supported-interfaces>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
+    </termination-point>
+    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR2-CLIENT2</tp-id>
+      <xpdr-tp-port-connection-attributes xmlns="http://org/openroadm/otn/network/topology">
+        <rate xmlns:x="http://org/openroadm/otn-common-types">x:ODU4</rate>
+      </xpdr-tp-port-connection-attributes>
+      <tp-supported-interfaces xmlns="http://org/openroadm/otn/network/topology">
+        <supported-interface-capability>
+          <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-100GE-ODU4</if-cap-type>
+        </supported-interface-capability>
+      </tp-supported-interfaces>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
+    </termination-point>
+    <supporting-node>
+      <network-ref>openroadm-network</network-ref>
+      <node-ref>SPDR-SA1</node-ref>
+    </supporting-node>
+    <supporting-node>
+      <network-ref>clli-network</network-ref>
+      <node-ref>NodeSA</node-ref>
+    </supporting-node>
+    <supporting-node>
+      <network-ref>openroadm-topology</network-ref>
+      <node-ref>SPDR-SA1-XPDR2</node-ref>
+    </supporting-node>
+    <node-type xmlns="http://org/openroadm/common/network">SWITCH</node-type>
+    <switching-pools xmlns="http://org/openroadm/otn/network/topology">
+      <odu-switching-pools>
+        <switching-pool-number>1</switching-pool-number>
+        <non-blocking-list>
+          <nbl-number>1</nbl-number>
+          <tp-list>XPDR2-CLIENT1</tp-list>
+          <tp-list>XPDR2-NETWORK4</tp-list>
+          <tp-list>XPDR2-CLIENT2</tp-list>
+          <tp-list>XPDR2-NETWORK1</tp-list>
+          <tp-list>XPDR2-CLIENT3</tp-list>
+          <tp-list>XPDR2-NETWORK2</tp-list>
+          <tp-list>XPDR2-CLIENT4</tp-list>
+          <tp-list>XPDR2-NETWORK3</tp-list>
+        </non-blocking-list>
+        <switching-pool-type>non-blocking</switching-pool-type>
+      </odu-switching-pools>
+    </switching-pools>
+    <tp-bandwidth-sharing xmlns="http://org/openroadm/otn/network/topology" />
+    <xpdr-attributes xmlns="http://org/openroadm/otn/network/topology">
+      <xpdr-number>2</xpdr-number>
+    </xpdr-attributes>
+  </node>
+  <node>
+    <node-id>SPDR-SC1-XPDR2</node-id>
+    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR2-NETWORK1</tp-id>
+      <supporting-termination-point>
+        <network-ref>openroadm-topology</network-ref>
+        <node-ref>SPDR-SC1-XPDR2</node-ref>
+        <tp-ref>XPDR2-NETWORK1</tp-ref>
+      </supporting-termination-point>
+      <xpdr-tp-port-connection-attributes xmlns="http://org/openroadm/otn/network/topology">
+        <rate xmlns:x="http://org/openroadm/otn-common-types">x:ODU4</rate>
+      </xpdr-tp-port-connection-attributes>
+      <tp-supported-interfaces xmlns="http://org/openroadm/otn/network/topology">
+        <supported-interface-capability>
+          <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-OCH-OTU4-ODU4</if-cap-type>
+        </supported-interface-capability>
+      </tp-supported-interfaces>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
+    </termination-point>
+    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR2-NETWORK3</tp-id>
+      <supporting-termination-point>
+        <network-ref>openroadm-topology</network-ref>
+        <node-ref>SPDR-SC1-XPDR2</node-ref>
+        <tp-ref>XPDR2-NETWORK3</tp-ref>
+      </supporting-termination-point>
+      <xpdr-tp-port-connection-attributes xmlns="http://org/openroadm/otn/network/topology">
+        <rate xmlns:x="http://org/openroadm/otn-common-types">x:ODU4</rate>
+      </xpdr-tp-port-connection-attributes>
+      <tp-supported-interfaces xmlns="http://org/openroadm/otn/network/topology">
+        <supported-interface-capability>
+          <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-OCH-OTU4-ODU4</if-cap-type>
+        </supported-interface-capability>
+      </tp-supported-interfaces>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
+    </termination-point>
+    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR2-NETWORK2</tp-id>
+      <supporting-termination-point>
+        <network-ref>openroadm-topology</network-ref>
+        <node-ref>SPDR-SC1-XPDR2</node-ref>
+        <tp-ref>XPDR2-NETWORK2</tp-ref>
+      </supporting-termination-point>
+      <xpdr-tp-port-connection-attributes xmlns="http://org/openroadm/otn/network/topology">
+        <rate xmlns:x="http://org/openroadm/otn-common-types">x:ODU4</rate>
+      </xpdr-tp-port-connection-attributes>
+      <tp-supported-interfaces xmlns="http://org/openroadm/otn/network/topology">
+        <supported-interface-capability>
+          <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-OCH-OTU4-ODU4</if-cap-type>
+        </supported-interface-capability>
+      </tp-supported-interfaces>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
+    </termination-point>
+    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR2-NETWORK4</tp-id>
+      <supporting-termination-point>
+        <network-ref>openroadm-topology</network-ref>
+        <node-ref>SPDR-SC1-XPDR2</node-ref>
+        <tp-ref>XPDR2-NETWORK4</tp-ref>
+      </supporting-termination-point>
+      <xpdr-tp-port-connection-attributes xmlns="http://org/openroadm/otn/network/topology">
+        <rate xmlns:x="http://org/openroadm/otn-common-types">x:ODU4</rate>
+      </xpdr-tp-port-connection-attributes>
+      <tp-supported-interfaces xmlns="http://org/openroadm/otn/network/topology">
+        <supported-interface-capability>
+          <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-OCH-OTU4-ODU4</if-cap-type>
+        </supported-interface-capability>
+      </tp-supported-interfaces>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
+    </termination-point>
+    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR2-CLIENT3</tp-id>
+      <xpdr-tp-port-connection-attributes xmlns="http://org/openroadm/otn/network/topology">
+        <rate xmlns:x="http://org/openroadm/otn-common-types">x:ODU4</rate>
+      </xpdr-tp-port-connection-attributes>
+      <tp-supported-interfaces xmlns="http://org/openroadm/otn/network/topology">
+        <supported-interface-capability>
+          <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-100GE-ODU4</if-cap-type>
+        </supported-interface-capability>
+      </tp-supported-interfaces>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
+    </termination-point>
+    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR2-CLIENT4</tp-id>
+      <xpdr-tp-port-connection-attributes xmlns="http://org/openroadm/otn/network/topology">
+        <rate xmlns:x="http://org/openroadm/otn-common-types">x:ODU4</rate>
+      </xpdr-tp-port-connection-attributes>
+      <tp-supported-interfaces xmlns="http://org/openroadm/otn/network/topology">
+        <supported-interface-capability>
+          <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-100GE-ODU4</if-cap-type>
+        </supported-interface-capability>
+      </tp-supported-interfaces>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
+    </termination-point>
+    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR2-CLIENT1</tp-id>
+      <xpdr-tp-port-connection-attributes xmlns="http://org/openroadm/otn/network/topology">
+        <rate xmlns:x="http://org/openroadm/otn-common-types">x:ODU4</rate>
+      </xpdr-tp-port-connection-attributes>
+      <tp-supported-interfaces xmlns="http://org/openroadm/otn/network/topology">
+        <supported-interface-capability>
+          <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-100GE-ODU4</if-cap-type>
+        </supported-interface-capability>
+      </tp-supported-interfaces>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
+    </termination-point>
+    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+      <tp-id>XPDR2-CLIENT2</tp-id>
+      <xpdr-tp-port-connection-attributes xmlns="http://org/openroadm/otn/network/topology">
+        <rate xmlns:x="http://org/openroadm/otn-common-types">x:ODU4</rate>
+      </xpdr-tp-port-connection-attributes>
+      <tp-supported-interfaces xmlns="http://org/openroadm/otn/network/topology">
+        <supported-interface-capability>
+          <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-100GE-ODU4</if-cap-type>
+        </supported-interface-capability>
+      </tp-supported-interfaces>
+      <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
+    </termination-point>
+    <supporting-node>
+      <network-ref>openroadm-topology</network-ref>
+      <node-ref>SPDR-SC1-XPDR2</node-ref>
+    </supporting-node>
+    <supporting-node>
+      <network-ref>openroadm-network</network-ref>
+      <node-ref>SPDR-SC1</node-ref>
+    </supporting-node>
+    <supporting-node>
+      <network-ref>clli-network</network-ref>
+      <node-ref>NodeSC</node-ref>
+    </supporting-node>
+    <node-type xmlns="http://org/openroadm/common/network">SWITCH</node-type>
+    <switching-pools xmlns="http://org/openroadm/otn/network/topology">
+      <odu-switching-pools>
+        <switching-pool-number>1</switching-pool-number>
+        <non-blocking-list>
+          <nbl-number>1</nbl-number>
+          <tp-list>XPDR2-CLIENT1</tp-list>
+          <tp-list>XPDR2-NETWORK4</tp-list>
+          <tp-list>XPDR2-CLIENT2</tp-list>
+          <tp-list>XPDR2-NETWORK1</tp-list>
+          <tp-list>XPDR2-CLIENT3</tp-list>
+          <tp-list>XPDR2-NETWORK2</tp-list>
+          <tp-list>XPDR2-CLIENT4</tp-list>
+          <tp-list>XPDR2-NETWORK3</tp-list>
+        </non-blocking-list>
+        <switching-pool-type>non-blocking</switching-pool-type>
+      </odu-switching-pools>
+    </switching-pools>
+    <tp-bandwidth-sharing xmlns="http://org/openroadm/otn/network/topology" />
+    <xpdr-attributes xmlns="http://org/openroadm/otn/network/topology">
+      <xpdr-number>2</xpdr-number>
+    </xpdr-attributes>
+  </node>
+  <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+    <link-id>OTU4-SPDR-SC1-XPDR1-XPDR1-NETWORK1toSPDR-SA1-XPDR1-XPDR1-NETWORK1
+    </link-id>
+    <source>
+      <source-node>SPDR-SC1-XPDR1</source-node>
+      <source-tp>XPDR1-NETWORK1</source-tp>
+    </source>
+    <otn-link-type xmlns="http://transportpce/topology">OTU4</otn-link-type>
+    <destination>
+      <dest-tp>XPDR1-NETWORK1</dest-tp>
+      <dest-node>SPDR-SA1-XPDR1</dest-node>
+    </destination>
+    <available-bandwidth xmlns="http://org/openroadm/otn/network/topology">0</available-bandwidth>
+    <used-bandwidth xmlns="http://org/openroadm/otn/network/topology">100000</used-bandwidth>
+    <opposite-link xmlns="http://org/openroadm/common/network">OTU4-SPDR-SA1-XPDR1-XPDR1-NETWORK1toSPDR-SC1-XPDR1-XPDR1-NETWORK1
+    </opposite-link>
+    <link-type xmlns="http://org/openroadm/common/network">OTN-LINK</link-type>
+  </link>
+  <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+    <link-id>OTU4-SPDR-SA1-XPDR1-XPDR1-NETWORK1toSPDR-SC1-XPDR1-XPDR1-NETWORK1
+    </link-id>
+    <source>
+      <source-node>SPDR-SA1-XPDR1</source-node>
+      <source-tp>XPDR1-NETWORK1</source-tp>
+    </source>
+    <otn-link-type xmlns="http://transportpce/topology">OTU4</otn-link-type>
+    <destination>
+      <dest-tp>XPDR1-NETWORK1</dest-tp>
+      <dest-node>SPDR-SC1-XPDR1</dest-node>
+    </destination>
+    <available-bandwidth xmlns="http://org/openroadm/otn/network/topology">0</available-bandwidth>
+    <used-bandwidth xmlns="http://org/openroadm/otn/network/topology">100000</used-bandwidth>
+    <opposite-link xmlns="http://org/openroadm/common/network">OTU4-SPDR-SC1-XPDR1-XPDR1-NETWORK1toSPDR-SA1-XPDR1-XPDR1-NETWORK1
+    </opposite-link>
+    <link-type xmlns="http://org/openroadm/common/network">OTN-LINK</link-type>
+  </link>
+  <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+    <link-id>ODU4-SPDR-SC1-XPDR1-XPDR1-NETWORK1toSPDR-SA1-XPDR1-XPDR1-NETWORK1
+    </link-id>
+    <source>
+      <source-node>SPDR-SC1-XPDR1</source-node>
+      <source-tp>XPDR1-NETWORK1</source-tp>
+    </source>
+    <otn-link-type xmlns="http://transportpce/topology">ODTU4</otn-link-type>
+    <destination>
+      <dest-tp>XPDR1-NETWORK1</dest-tp>
+      <dest-node>SPDR-SA1-XPDR1</dest-node>
+    </destination>
+    <available-bandwidth xmlns="http://org/openroadm/otn/network/topology">100000</available-bandwidth>
+    <used-bandwidth xmlns="http://org/openroadm/otn/network/topology">0</used-bandwidth>
+    <opposite-link xmlns="http://org/openroadm/common/network">ODU4-SPDR-SA1-XPDR1-XPDR1-NETWORK1toSPDR-SC1-XPDR1-XPDR1-NETWORK1
+    </opposite-link>
+    <link-type xmlns="http://org/openroadm/common/network">OTN-LINK</link-type>
+  </link>
+  <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+    <link-id>ODU4-SPDR-SA1-XPDR1-XPDR1-NETWORK1toSPDR-SC1-XPDR1-XPDR1-NETWORK1
+    </link-id>
+    <source>
+      <source-node>SPDR-SA1-XPDR1</source-node>
+      <source-tp>XPDR1-NETWORK1</source-tp>
+    </source>
+    <otn-link-type xmlns="http://transportpce/topology">ODTU4</otn-link-type>
+    <destination>
+      <dest-tp>XPDR1-NETWORK1</dest-tp>
+      <dest-node>SPDR-SC1-XPDR1</dest-node>
+    </destination>
+    <available-bandwidth xmlns="http://org/openroadm/otn/network/topology">100000</available-bandwidth>
+    <used-bandwidth xmlns="http://org/openroadm/otn/network/topology">0</used-bandwidth>
+    <opposite-link xmlns="http://org/openroadm/common/network">ODU4-SPDR-SC1-XPDR1-XPDR1-NETWORK1toSPDR-SA1-XPDR1-XPDR1-NETWORK1
+    </opposite-link>
+    <link-type xmlns="http://org/openroadm/common/network">OTN-LINK</link-type>
+  </link>
+</network>
+</networks>
+</data>
\ No newline at end of file