Openroadm Xpdr link TAPI listener 45/98745/7
authorerrea <errea@eurecom.fr>
Sat, 27 Nov 2021 00:06:47 +0000 (01:06 +0100)
committerGilles Thouenon <gilles.thouenon@orange.com>
Mon, 13 Dec 2021 13:58:54 +0000 (14:58 +0100)
Automatic creation of TAPI XPDR link when a
new OpenROADM XPDR-RDM link is created using
the NetworkUtils RPCs

JIRA: TRNSPRTPCE-549
Signed-off-by: errea <errea@eurecom.fr>
Change-Id: I603d9ea435acfa9ddc17ef05ceec4f8a7444a45e

lighty/src/main/java/io/lighty/controllers/tpce/module/TransportPCEImpl.java
tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/TapiProvider.java
tapi/src/main/java/org/opendaylight/transportpce/tapi/topology/TapiOrLinkListener.java [new file with mode: 0644]
tapi/src/main/resources/OSGI-INF/blueprint/tapi-blueprint.xml
tapi/src/test/java/org/opendaylight/transportpce/tapi/provider/TapiProviderTest.java
tests/transportpce_tests/2.2.1/test13_tapi_full_multi_layer.py

index 579bcebc16515441c417a965cdee902cb45b7586..f0542376a91d7d4d80e34280dbf051bd24245ba1 100644 (file)
@@ -87,6 +87,7 @@ import org.opendaylight.transportpce.tapi.topology.TapiNetconfTopologyListener;
 import org.opendaylight.transportpce.tapi.topology.TapiNetworkModelService;
 import org.opendaylight.transportpce.tapi.topology.TapiNetworkModelServiceImpl;
 import org.opendaylight.transportpce.tapi.topology.TapiNetworkUtilsImpl;
+import org.opendaylight.transportpce.tapi.topology.TapiOrLinkListener;
 import org.opendaylight.transportpce.tapi.topology.TapiPortMappingListener;
 import org.opendaylight.transportpce.tapi.utils.TapiLink;
 import org.opendaylight.transportpce.tapi.utils.TapiListener;
@@ -222,17 +223,19 @@ public class TransportPCEImpl extends AbstractLightyModule implements TransportP
             tapilinkDiscoveryImpl, networkTransaction, tapiLink);
         TapiNetconfTopologyListener tapiNetConfTopologyListener =
                 new TapiNetconfTopologyListener(tapiNetworkModelService);
+        TapiOrLinkListener orLinkListener = new TapiOrLinkListener(tapiLink, networkTransaction);
         TapiPortMappingListener tapiPortMappingListener =
             new TapiPortMappingListener(tapiNetworkModelService);
 
         tapiProvider = initTapi(lightyServices, servicehandler, networkTransaction, serviceDataStoreOperations,
-                tapiNetConfTopologyListener, tapiPortMappingListener, tapiNetworkutilsServiceImpl, tapiPceListenerImpl,
-                tapiRendererListenerImpl, tapiServiceHandlerListener, lightyServices.getNotificationService());
+            tapiNetConfTopologyListener, tapiPortMappingListener, tapiNetworkutilsServiceImpl, tapiPceListenerImpl,
+            tapiRendererListenerImpl, tapiServiceHandlerListener, lightyServices.getNotificationService(),
+            orLinkListener);
         if (activateNbiNotification) {
             LOG.info("Creating nbi-notifications beans ...");
             nbiNotificationsProvider = new NbiNotificationsProvider(
-                    publisherServiceList, publisherAlarmList, null, null, lightyServices.getRpcProviderService(),
-                    lightyServices.getNotificationService(), lightyServices.getAdapterContext().currentSerializer());
+                publisherServiceList, publisherAlarmList, null, null, lightyServices.getRpcProviderService(),
+                lightyServices.getNotificationService(), lightyServices.getAdapterContext().currentSerializer());
         }
     }
 
@@ -288,11 +291,11 @@ public class TransportPCEImpl extends AbstractLightyModule implements TransportP
                                   TransportpceTapinetworkutilsService tapiNetworkutilsServiceImpl,
                                   TapiPceListenerImpl pceListenerImpl, TapiRendererListenerImpl rendererListenerImpl,
                                   TapiServiceHandlerListenerImpl serviceHandlerListenerImpl,
-                                  NotificationService notificationService) {
+                                  NotificationService notificationService, TapiOrLinkListener orLinkListener) {
         return new TapiProvider(lightyServices.getBindingDataBroker(), lightyServices.getRpcProviderService(),
             servicehandler, serviceDataStoreOperations, new TapiListener(), networkTransactionService,
             tapiNetConfTopologyListener, tapiPortMappingListener, tapiNetworkutilsServiceImpl, pceListenerImpl,
-            rendererListenerImpl, serviceHandlerListenerImpl, notificationService);
+            rendererListenerImpl, serviceHandlerListenerImpl, notificationService, orLinkListener);
     }
 
     private RendererProvider initRenderer(LightyServices lightyServices, TransportpceOlmService olmPowerServiceRpc,
index 149d7ded40ec59bbde450db51af804057e8fea51..95a7e9824142bea81943dcce0048c4023ee56598 100644 (file)
@@ -15,6 +15,7 @@ import org.opendaylight.mdsal.binding.api.NotificationService;
 import org.opendaylight.mdsal.binding.api.RpcProviderService;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.InstanceIdentifiers;
+import org.opendaylight.transportpce.common.NetworkUtils;
 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
 import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations;
 import org.opendaylight.transportpce.tapi.connectivity.ConnectivityUtils;
@@ -23,6 +24,7 @@ import org.opendaylight.transportpce.tapi.listeners.TapiPceListenerImpl;
 import org.opendaylight.transportpce.tapi.listeners.TapiRendererListenerImpl;
 import org.opendaylight.transportpce.tapi.listeners.TapiServiceHandlerListenerImpl;
 import org.opendaylight.transportpce.tapi.topology.TapiNetconfTopologyListener;
+import org.opendaylight.transportpce.tapi.topology.TapiOrLinkListener;
 import org.opendaylight.transportpce.tapi.topology.TapiPortMappingListener;
 import org.opendaylight.transportpce.tapi.topology.TapiTopologyImpl;
 import org.opendaylight.transportpce.tapi.topology.TopologyUtils;
@@ -37,6 +39,11 @@ import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.servicehandler.rev201125.TransportpceServicehandlerListener;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.tapinetworkutils.rev210408.TransportpceTapinetworkutilsService;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev190531.OrgOpenroadmServiceService;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.NetworkKey;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Network1;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link;
 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.TapiCommonService;
 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.TapiConnectivityService;
 import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.TapiTopologyService;
@@ -61,11 +68,16 @@ public class TapiProvider {
     private static final InstanceIdentifier<Nodes> MAPPING_II = InstanceIdentifier.create(Network.class)
         .child(org.opendaylight.yang.gen.v1.http
             .org.opendaylight.transportpce.portmapping.rev210927.network.Nodes.class);
+    private static final InstanceIdentifier<Link> LINK_II = InstanceIdentifier.create(Networks.class).child(
+        org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network.class,
+            new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))).augmentation(Network1.class)
+        .child(Link.class);
     private final DataBroker dataBroker;
     private final RpcProviderService rpcProviderService;
     private ObjectRegistration<TapiConnectivityService> rpcRegistration;
     private ObjectRegistration<TransportpceTapinetworkutilsService> tapiNetworkutilsServiceRpcRegistration;
     private ListenerRegistration<TapiNetconfTopologyListener> dataTreeChangeListenerRegistration;
+    private ListenerRegistration<TapiOrLinkListener> dataTreeChangeListenerRegistration1;
     private ListenerRegistration<TapiPortMappingListener> mappingListenerListenerRegistration;
     private ListenerRegistration<TransportpcePceListener> pcelistenerRegistration;
     private ListenerRegistration<TransportpceRendererListener> rendererlistenerRegistration;
@@ -74,6 +86,7 @@ public class TapiProvider {
     private final ServiceDataStoreOperations serviceDataStoreOperations;
     private final TapiListener tapiListener;
     private final TapiNetconfTopologyListener topologyListener;
+    private final TapiOrLinkListener orLinkListener;
     private TapiPortMappingListener tapiPortMappingListener;
     private final NetworkTransactionService networkTransactionService;
     private final TransportpceTapinetworkutilsService tapiNetworkUtils;
@@ -88,7 +101,7 @@ public class TapiProvider {
             TapiNetconfTopologyListener topologyListener, TapiPortMappingListener tapiPortMappingListener,
             TransportpceTapinetworkutilsService tapiNetworkUtils, TapiPceListenerImpl pceListenerImpl,
             TapiRendererListenerImpl rendererListenerImpl, TapiServiceHandlerListenerImpl serviceHandlerListenerImpl,
-            NotificationService notificationService) {
+            NotificationService notificationService, TapiOrLinkListener orLinkListener) {
         this.dataBroker = dataBroker;
         this.rpcProviderService = rpcProviderService;
         this.serviceHandler = serviceHandler;
@@ -102,6 +115,7 @@ public class TapiProvider {
         this.rendererListenerImpl = rendererListenerImpl;
         this.serviceHandlerListenerImpl = serviceHandlerListenerImpl;
         this.notificationService = notificationService;
+        this.orLinkListener = orLinkListener;
     }
 
     /**
@@ -126,6 +140,9 @@ public class TapiProvider {
         rpcRegistration = rpcProviderService.registerRpcImplementation(TapiConnectivityService.class, tapi);
         rpcProviderService.registerRpcImplementation(TapiTopologyService.class, topo);
         rpcProviderService.registerRpcImplementation(TapiCommonService.class, topo);
+        dataTreeChangeListenerRegistration1 =
+            dataBroker.registerDataTreeChangeListener(DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION,
+                LINK_II), orLinkListener);
         dataTreeChangeListenerRegistration =
             dataBroker.registerDataTreeChangeListener(DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL,
                 InstanceIdentifiers.NETCONF_TOPOLOGY_II.child(Node.class)), topologyListener);
@@ -157,6 +174,9 @@ public class TapiProvider {
         if (mappingListenerListenerRegistration != null) {
             mappingListenerListenerRegistration.close();
         }
+        if (dataTreeChangeListenerRegistration1 != null) {
+            dataTreeChangeListenerRegistration1.close();
+        }
         if (tapiNetworkutilsServiceRpcRegistration != null) {
             tapiNetworkutilsServiceRpcRegistration.close();
         }
diff --git a/tapi/src/main/java/org/opendaylight/transportpce/tapi/topology/TapiOrLinkListener.java b/tapi/src/main/java/org/opendaylight/transportpce/tapi/topology/TapiOrLinkListener.java
new file mode 100644 (file)
index 0000000..e49bc77
--- /dev/null
@@ -0,0 +1,152 @@
+/*
+ * Copyright © 2021 Nokia.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.tapi.topology;
+
+import java.nio.charset.Charset;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.UUID;
+import java.util.concurrent.ExecutionException;
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
+import org.opendaylight.mdsal.binding.api.DataTreeModification;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.transportpce.common.NetworkUtils;
+import org.opendaylight.transportpce.common.network.NetworkTransactionService;
+import org.opendaylight.transportpce.tapi.TapiStringConstants;
+import org.opendaylight.transportpce.tapi.utils.TapiLink;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.OpenroadmLinkType;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.NetworkKey;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.LinkId;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Network1;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.LinkKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Context;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LayerProtocolName;
+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.topology.rev181210.Context1;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.context.TopologyContext;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.context.Topology;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.context.TopologyBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.context.TopologyKey;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class TapiOrLinkListener implements DataTreeChangeListener<Link> {
+
+    private static final Logger LOG = LoggerFactory.getLogger(TapiOrLinkListener.class);
+    private final TapiLink tapiLink;
+    private final NetworkTransactionService networkTransactionService;
+    private final Uuid tapiTopoUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_FULL_MULTILAYER
+        .getBytes(Charset.forName("UTF-8"))).toString());
+
+    public TapiOrLinkListener(final TapiLink tapiLink, final NetworkTransactionService networkTransactionService) {
+        this.tapiLink = tapiLink;
+        this.networkTransactionService = networkTransactionService;
+    }
+
+    @Override
+    public void onDataTreeChanged(@NonNull Collection<DataTreeModification<Link>> changes) {
+        LOG.info("onDataTreeChanged - {}", this.getClass().getSimpleName());
+        for (DataTreeModification<Link> change : changes) {
+            if (change.getRootNode().getDataBefore() == null && change.getRootNode().getDataAfter() != null) {
+                LOG.info("New link in openroadm topology");
+                Link link = change.getRootNode().getDataAfter();
+                // Todo: XPDR links are unidirectional, therefore we need to check for the current one and
+                //  the opposite one. But first check the type
+                Link1 link1 = link.augmentation(Link1.class);
+                if (link1 == null) {
+                    LOG.error("No type in link. We cannot trigger the TAPI link creation");
+                    return;
+                }
+                if (!(link1.getLinkType().equals(OpenroadmLinkType.XPONDERINPUT)
+                        || link1.getLinkType().equals(OpenroadmLinkType.XPONDEROUTPUT))) {
+                    LOG.warn("Not triggering creation of link for type = {}", link1.getLinkType().getName());
+                    return;
+                }
+                if (!oppositeLinkExists(link1.getOppositeLink())) {
+                    LOG.warn("Opposite link doest exist. Not creating TAPI link");
+                    return;
+                }
+                LOG.info("Opposite link already in datastore. Creatin TAPI bidirectional link");
+                String srcNode = getRoadmOrXpdr(link.getSource().getSourceNode().getValue());
+                String srcTp = link.getSource().getSourceTp().getValue();
+                String destNode = getRoadmOrXpdr(link.getDestination().getDestNode().getValue());
+                String destTp = link.getDestination().getDestTp().getValue();
+                putTapiLinkInTopology(this.tapiLink.createTapiLink(srcNode, srcTp, destNode, destTp,
+                    TapiStringConstants.OMS_XPDR_RDM_LINK, getQual(srcNode), getQual(destNode),
+                    TapiStringConstants.PHTNC_MEDIA, TapiStringConstants.PHTNC_MEDIA,
+                    link1.getAdministrativeState().getName(), link1.getOperationalState().getName(),
+                    List.of(LayerProtocolName.PHOTONICMEDIA), List.of(LayerProtocolName.PHOTONICMEDIA.getName()),
+                    tapiTopoUuid));
+            }
+        }
+    }
+
+    private void putTapiLinkInTopology(
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Link tapiXpdrLink) {
+        LOG.info("Creating tapi link in TAPI topology context");
+        InstanceIdentifier<Topology> topoIID = InstanceIdentifier.builder(Context.class)
+            .augmentation(Context1.class).child(TopologyContext.class)
+            .child(Topology.class, new TopologyKey(this.tapiTopoUuid))
+            .build();
+
+        Topology topology = new TopologyBuilder().setUuid(this.tapiTopoUuid)
+            .setLink(Map.of(tapiXpdrLink.key(), tapiXpdrLink)).build();
+
+        // merge in datastore
+        this.networkTransactionService.merge(LogicalDatastoreType.OPERATIONAL, topoIID,
+            topology);
+        try {
+            this.networkTransactionService.commit().get();
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.error("Error populating TAPI topology: ", e);
+        }
+        LOG.info("TAPI Link added succesfully.");
+    }
+
+    private String getQual(String node) {
+        if (node.contains("ROADM")) {
+            return TapiStringConstants.PHTNC_MEDIA;
+        }
+        return TapiStringConstants.OTSI;
+    }
+
+    private boolean oppositeLinkExists(LinkId oppositeLink) {
+        try {
+            InstanceIdentifier<Link> linkIID = InstanceIdentifier.builder(Networks.class)
+                .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
+                .augmentation(Network1.class).child(Link.class, new LinkKey(oppositeLink)).build();
+
+            Optional<Link> optLink =
+                this.networkTransactionService.read(LogicalDatastoreType.CONFIGURATION, linkIID).get();
+            if (!optLink.isPresent()) {
+                LOG.error("Opposite link not found in datastore {}", oppositeLink.getValue());
+                return false;
+            }
+            return true;
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.error("Failed to read opposite link", e);
+            return false;
+        }
+    }
+
+    private String getRoadmOrXpdr(String node) {
+        if (node.contains("ROADM")) {
+            return String.join("-", node.split("-")[0], node.split("-")[1]);
+        }
+        return node;
+    }
+}
index 758d66f77fe0c7870d9898e24008eda04e21027d..add5b43c3bea23505028b780b0f2e18b85336cd2 100644 (file)
@@ -65,6 +65,11 @@ Author: Gilles Thouenon <gilles.thouenon@orange.com>
         <argument ref="tapiNetworkModelService" />
     </bean>
 
+    <bean id="tapiOrLinkListener" class="org.opendaylight.transportpce.tapi.topology.TapiOrLinkListener">
+        <argument ref="tapiLink" />
+        <argument ref="networkTransactionImpl" />
+    </bean>
+
     <bean id="tapiNetworkUtilsImpl" class="org.opendaylight.transportpce.tapi.topology.TapiNetworkUtilsImpl">
         <argument ref="networkTransactionImpl" />
         <argument ref="tapiLink" />
@@ -86,6 +91,7 @@ Author: Gilles Thouenon <gilles.thouenon@orange.com>
         <argument ref="tapiRendererListener" />
         <argument ref="tapiServiceHandlerListener" />
         <argument ref="notificationService" />
+        <argument ref="tapiOrLinkListener" />
     </bean>
 
     <bean id="tapiPortMappingListener" class="org.opendaylight.transportpce.tapi.topology.TapiPortMappingListener">
index 878c7633ed23281f0ab0d3d910fd0c3f4446bf59..69ce85cebc0eb51d9cca1693066cde0f235a8908 100644 (file)
@@ -27,6 +27,7 @@ import org.opendaylight.transportpce.tapi.listeners.TapiPceListenerImpl;
 import org.opendaylight.transportpce.tapi.listeners.TapiRendererListenerImpl;
 import org.opendaylight.transportpce.tapi.listeners.TapiServiceHandlerListenerImpl;
 import org.opendaylight.transportpce.tapi.topology.TapiNetconfTopologyListener;
+import org.opendaylight.transportpce.tapi.topology.TapiOrLinkListener;
 import org.opendaylight.transportpce.tapi.topology.TapiPortMappingListener;
 import org.opendaylight.transportpce.tapi.utils.TapiListener;
 import org.opendaylight.transportpce.test.AbstractTest;
@@ -60,6 +61,9 @@ public class TapiProviderTest extends AbstractTest {
     @Mock
     TapiNetconfTopologyListener topologyListener;
 
+    @Mock
+    TapiOrLinkListener orLinkListener;
+
     @Mock
     TapiPceListenerImpl pceListenerImpl;
 
@@ -87,7 +91,7 @@ public class TapiProviderTest extends AbstractTest {
         TapiProvider provider =  new TapiProvider(getDataBroker(), rpcProviderRegistry, serviceHandler,
             serviceDataStoreOperations, tapiListener, networkTransactionService, topologyListener,
             tapiPortMappingListener, tapiNetworkUtils, pceListenerImpl, rendererListenerImpl,
-            serviceHandlerListenerImpl, getNotificationService());
+            serviceHandlerListenerImpl, getNotificationService(), orLinkListener);
 
         provider.init();
 
index 4c8d3c9b035edd43a4299d859d65641f36e0d1aa..2baf41cbd0c04586047d4327b491d0f128dcf3db 100644 (file)
@@ -174,16 +174,7 @@ class TransportPCEtesting(unittest.TestCase):
                       res["output"]["result"])
         time.sleep(2)
 
-    def test_07_connect_roadmA_PP1_to_spdrA_1_N1_tapi(self):
-        response = test_utils.connect_xpdr_to_rdm_tapi_request("SPDR-SA1-XPDR1", "XPDR1-NETWORK1",
-                                                               "ROADM-A1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Link created in tapi topology',
-                      res["output"]["result"])
-        time.sleep(2)
-
-    def test_08_connect_sprdC_1_N1_to_roadmC_PP1(self):
+    def test_07_connect_sprdC_1_N1_to_roadmC_PP1(self):
         response = test_utils.connect_xpdr_to_rdm_request("SPDR-SC1", "1", "1",
                                                           "ROADM-C1", "1", "SRG1-PP1-TXRX")
         self.assertEqual(response.status_code, requests.codes.ok)
@@ -192,7 +183,7 @@ class TransportPCEtesting(unittest.TestCase):
                       res["output"]["result"])
         time.sleep(2)
 
-    def test_09_connect_roadmC_PP1_to_spdrC_1_N1(self):
+    def test_08_connect_roadmC_PP1_to_spdrC_1_N1(self):
         response = test_utils.connect_rdm_to_xpdr_request("SPDR-SC1", "1", "1",
                                                           "ROADM-C1", "1", "SRG1-PP1-TXRX")
         self.assertEqual(response.status_code, requests.codes.ok)
@@ -201,16 +192,7 @@ class TransportPCEtesting(unittest.TestCase):
                       res["output"]["result"])
         time.sleep(2)
 
-    def test_10_connect_roadmC_PP1_to_spdrC_1_N1_tapi(self):
-        response = test_utils.connect_xpdr_to_rdm_tapi_request("SPDR-SC1-XPDR1", "XPDR1-NETWORK1",
-                                                               "ROADM-C1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Link created in tapi topology',
-                      res["output"]["result"])
-        time.sleep(2)
-
-    def test_11_add_omsAttributes_ROADMA_ROADMC(self):
+    def test_09_add_omsAttributes_ROADMA_ROADMC(self):
         # Config ROADMA-ROADMC oms-attributes
         data = {"span": {
             "auto-spanloss": "true",
@@ -227,7 +209,7 @@ class TransportPCEtesting(unittest.TestCase):
         self.assertEqual(response.status_code, requests.codes.created)
         time.sleep(2)
 
-    def test_12_add_omsAttributes_ROADMC_ROADMA(self):
+    def test_10_add_omsAttributes_ROADMC_ROADMA(self):
         # Config ROADMC-ROADMA oms-attributes
         data = {"span": {
             "auto-spanloss": "true",
@@ -244,7 +226,7 @@ class TransportPCEtesting(unittest.TestCase):
         self.assertEqual(response.status_code, requests.codes.created)
         time.sleep(2)
 
-    def test_13_check_otn_topology(self):
+    def test_11_check_otn_topology(self):
         response = test_utils.get_otn_topo_request()
         self.assertEqual(response.status_code, requests.codes.ok)
         res = response.json()
@@ -253,7 +235,7 @@ class TransportPCEtesting(unittest.TestCase):
         self.assertNotIn('ietf-network-topology:link', res['network'][0])
         time.sleep(2)
 
-    def test_14_check_openroadm_topology(self):
+    def test_12_check_openroadm_topology(self):
         response = test_utils.get_ordm_topo_request("")
         self.assertEqual(response.status_code, requests.codes.ok)
         res = response.json()
@@ -263,7 +245,7 @@ class TransportPCEtesting(unittest.TestCase):
         self.assertEqual(nbLink, 22, 'There should be 22 openroadm links')
         time.sleep(2)
 
-    def test_15_get_tapi_topology_details(self):
+    def test_13_get_tapi_topology_details(self):
         response = test_utils.tapi_get_topology_details_request(
             "T0 - Full Multi-layer topology")
         time.sleep(2)
@@ -275,7 +257,7 @@ class TransportPCEtesting(unittest.TestCase):
         self.assertEqual(nbLink, 15, 'There should be 15 TAPI links')
         time.sleep(2)
 
-    def test_16_check_sip_details(self):
+    def test_14_check_sip_details(self):
         response = test_utils.tapi_get_sip_details_request()
         self.assertEqual(response.status_code, requests.codes.ok)
         res = response.json()
@@ -284,7 +266,7 @@ class TransportPCEtesting(unittest.TestCase):
         time.sleep(2)
 
 # test create connectivity service from spdrA to spdrC for Photonic_media
-    def test_17_create_connectivity_service_PhotonicMedia(self):
+    def test_15_create_connectivity_service_PhotonicMedia(self):
         response = test_utils.tapi_create_connectivity_request(self.cr_serv_sample_data)
         time.sleep(self.WAITING)
         self.assertEqual(response.status_code, requests.codes.ok)
@@ -314,7 +296,7 @@ class TransportPCEtesting(unittest.TestCase):
         # If the gate fails is because of the waiting time not being enough
         time.sleep(self.WAITING)
 
-    def test_18_get_service_PhotonicMedia(self):
+    def test_16_get_service_PhotonicMedia(self):
         response = test_utils.get_service_list_request(
             "services/" + str(self.uuid_services.pm))
         self.assertEqual(response.status_code, requests.codes.ok)
@@ -330,7 +312,7 @@ class TransportPCEtesting(unittest.TestCase):
         time.sleep(2)
 
 # test create connectivity service from spdrA to spdrC for odu
-    def test_19_create_connectivity_service_ODU(self):
+    def test_17_create_connectivity_service_ODU(self):
         # pylint: disable=line-too-long
         self.cr_serv_sample_data["input"]["end-point"][0]["layer-protocol-name"] = "ODU"
         self.cr_serv_sample_data["input"]["end-point"][0]["service-interface-point"]["service-interface-point-uuid"] = "5efda776-f8de-3e0b-9bbd-2c702e210946"
@@ -367,7 +349,7 @@ class TransportPCEtesting(unittest.TestCase):
         # If the gate fails is because of the waiting time not being enough
         time.sleep(self.WAITING)
 
-    def test_20_get_service_ODU(self):
+    def test_18_get_service_ODU(self):
         response = test_utils.get_service_list_request(
             "services/" + str(self.uuid_services.odu))
         self.assertEqual(response.status_code, requests.codes.ok)
@@ -383,7 +365,7 @@ class TransportPCEtesting(unittest.TestCase):
         time.sleep(2)
 
 # test create connectivity service from spdrA to spdrC for dsr
-    def test_21_create_connectivity_service_DSR(self):
+    def test_19_create_connectivity_service_DSR(self):
         # pylint: disable=line-too-long
         self.cr_serv_sample_data["input"]["end-point"][0]["layer-protocol-name"] = "DSR"
         self.cr_serv_sample_data["input"]["end-point"][0]["service-interface-point"]["service-interface-point-uuid"] = "c14797a0-adcc-3875-a1fe-df8949d1a2d7"
@@ -424,7 +406,7 @@ class TransportPCEtesting(unittest.TestCase):
         # The sleep here is okey as the DSR service creation is very fast
         time.sleep(self.WAITING)
 
-    def test_22_get_service_DSR(self):
+    def test_20_get_service_DSR(self):
         response = test_utils.get_service_list_request(
             "services/" + str(self.uuid_services.dsr))
         self.assertEqual(response.status_code, requests.codes.ok)
@@ -439,7 +421,7 @@ class TransportPCEtesting(unittest.TestCase):
             res['services'][0]['lifecycle-state'], 'planned')
         time.sleep(2)
 
-    def test_23_get_connectivity_service_list(self):
+    def test_21_get_connectivity_service_list(self):
         response = test_utils.tapi_get_service_list_request()
         self.assertEqual(response.status_code, requests.codes.ok)
         res = response.json()
@@ -464,22 +446,22 @@ class TransportPCEtesting(unittest.TestCase):
                 self.fail("get connectivity service failed")
         time.sleep(2)
 
-    def test_24_delete_connectivity_service_DSR(self):
+    def test_22_delete_connectivity_service_DSR(self):
         response = test_utils.tapi_delete_connectivity_request(self.uuid_services.dsr)
         self.assertEqual(response.status_code, requests.codes.no_content)
         time.sleep(self.WAITING)
 
-    def test_25_delete_connectivity_service_ODU(self):
+    def test_23_delete_connectivity_service_ODU(self):
         response = test_utils.tapi_delete_connectivity_request(self.uuid_services.odu)
         self.assertEqual(response.status_code, requests.codes.no_content)
         time.sleep(self.WAITING)
 
-    def test_26_delete_connectivity_service_PhotonicMedia(self):
+    def test_24_delete_connectivity_service_PhotonicMedia(self):
         response = test_utils.tapi_delete_connectivity_request(self.uuid_services.pm)
         self.assertEqual(response.status_code, requests.codes.no_content)
         time.sleep(self.WAITING)
 
-    def test_27_get_no_tapi_services(self):
+    def test_25_get_no_tapi_services(self):
         response = test_utils.tapi_get_service_list_request()
         res = response.json()
         self.assertIn(
@@ -489,7 +471,7 @@ class TransportPCEtesting(unittest.TestCase):
             res['errors']['error'])
         time.sleep(2)
 
-    def test_28_get_no_openroadm_services(self):
+    def test_26_get_no_openroadm_services(self):
         response = test_utils.get_service_list_request("")
         self.assertEqual(response.status_code, requests.codes.conflict)
         res = response.json()
@@ -499,22 +481,22 @@ class TransportPCEtesting(unittest.TestCase):
             res['errors']['error'])
         time.sleep(2)
 
-    def test_29_disconnect_spdrA(self):
+    def test_27_disconnect_spdrA(self):
         response = test_utils.unmount_device("SPDR-SA1")
         self.assertEqual(response.status_code, requests.codes.ok,
                          test_utils.CODE_SHOULD_BE_200)
 
-    def test_30_disconnect_spdrC(self):
+    def test_28_disconnect_spdrC(self):
         response = test_utils.unmount_device("SPDR-SC1")
         self.assertEqual(response.status_code, requests.codes.ok,
                          test_utils.CODE_SHOULD_BE_200)
 
-    def test_31_disconnect_roadmA(self):
+    def test_29_disconnect_roadmA(self):
         response = test_utils.unmount_device("ROADM-A1")
         self.assertEqual(response.status_code, requests.codes.ok,
                          test_utils.CODE_SHOULD_BE_200)
 
-    def test_32_disconnect_roadmC(self):
+    def test_30_disconnect_roadmC(self):
         response = test_utils.unmount_device("ROADM-C1")
         self.assertEqual(response.status_code, requests.codes.ok,
                          test_utils.CODE_SHOULD_BE_200)