Merge "Add allure-pytest tox profiles for local use"
authorGilles Thouenon <gilles.thouenon@orange.com>
Thu, 29 Sep 2022 09:24:02 +0000 (09:24 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Thu, 29 Sep 2022 09:24:02 +0000 (09:24 +0000)
72 files changed:
api/pom.xml
api/src/main/yang/service_path/transportpce-pce@2022-08-08.yang [moved from api/src/main/yang/service_path/transportpce-pce@2022-06-15.yang with 86% similarity]
common/pom.xml
common/src/main/java/org/opendaylight/transportpce/common/crossconnect/CrossConnectImpl221.java
common/src/main/java/org/opendaylight/transportpce/common/crossconnect/CrossConnectImpl710.java
dmaap-client/pom.xml
features/odl-transportpce-swagger/pom.xml
features/odl-transportpce/pom.xml
inventory/pom.xml
lighty/src/main/java/io/lighty/controllers/tpce/utils/TPCEUtils.java
nbinotifications/pom.xml
networkmodel/pom.xml
networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/service/FrequenciesServiceTest.java
olm/pom.xml
ordmodels/common/pom.xml
ordmodels/device/pom.xml
ordmodels/network/pom.xml
ordmodels/pom.xml
ordmodels/service/pom.xml
pce/pom.xml
pce/src/main/java/org/opendaylight/transportpce/pce/PceComplianceCheck.java
pce/src/main/java/org/opendaylight/transportpce/pce/PceSendingPceRPCs.java
pce/src/main/java/org/opendaylight/transportpce/pce/constraints/PceConstraintsCalc.java
pce/src/main/java/org/opendaylight/transportpce/pce/gnpy/GnpyServiceImpl.java
pce/src/main/java/org/opendaylight/transportpce/pce/gnpy/GnpyUtilitiesImpl.java
pce/src/main/java/org/opendaylight/transportpce/pce/graph/PostAlgoPathValidator.java
pce/src/main/java/org/opendaylight/transportpce/pce/impl/PceProvider.java
pce/src/main/java/org/opendaylight/transportpce/pce/impl/PceServiceRPCImpl.java
pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceCalculation.java
pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceOpticalNode.java
pce/src/main/java/org/opendaylight/transportpce/pce/service/PathComputationService.java
pce/src/main/java/org/opendaylight/transportpce/pce/service/PathComputationServiceImpl.java
pce/src/test/java/org/opendaylight/transportpce/pce/impl/PceProviderTest.java
pce/src/test/java/org/opendaylight/transportpce/pce/impl/PceServiceRPCImplTest.java
pce/src/test/java/org/opendaylight/transportpce/pce/networkanalyzer/PceCalculationTest.java
pce/src/test/java/org/opendaylight/transportpce/pce/service/PathComputationServiceImplTest.java
pce/src/test/java/org/opendaylight/transportpce/pce/utils/PceTestData.java
pce/src/test/java/org/opendaylight/transportpce/pce/utils/PceTestUtils.java
renderer/pom.xml
renderer/src/main/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadmInterfaceFactory.java
renderer/src/main/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadmOtnInterface221.java
renderer/src/main/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadmOtnInterface710.java
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/OtnDeviceRendererServiceImpl.java
servicehandler/pom.xml
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/ModelMappingUtils.java
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/ServiceInput.java
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/ServicehandlerImpl.java
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/ServicehandlerProvider.java
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/listeners/PceListenerImpl.java
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/listeners/ServiceListener.java
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/service/PCEServiceWrapper.java
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/service/ServiceDataStoreOperations.java
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/service/ServiceDataStoreOperationsImpl.java
servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/ModelMappingUtilsTest.java
servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/impl/ServicehandlerImplTest.java
servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/listeners/ServiceListenerTest.java
servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/service/PCEServiceWrapperTest.java
servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/service/ServiceDataStoreOperationsImplTest.java
servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/utils/ModelMappingUtils.java
servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/utils/ServiceDataUtils.java
tapi/pom.xml
tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/TapiProvider.java
tapi/src/main/java/org/opendaylight/transportpce/tapi/listeners/TapiPceListenerImpl.java
tapimodels/pom.xml
test-common/pom.xml
tests/transportpce_tests/2.2.1/test07_otn_renderer.py
tests/transportpce_tests/2.2.1/test08_otn_sh_renderer.py
tests/transportpce_tests/2.2.1/test11_otn_end2end.py
tests/transportpce_tests/2.2.1/test15_otn_end2end_with_intermediate_switch.py
tests/transportpce_tests/7.1/test02_otn_renderer.py
tests/transportpce_tests/hybrid/test02_B100G_end2end.py
tests/transportpce_tests/hybrid/test03_autonomous_reroute.py

index 41e2805738bf83783249d6f60e7f3db83b2228bd..0a023ab0589783f380cd6ca4530519a7669af435 100644 (file)
@@ -12,7 +12,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
   <parent>
     <groupId>org.opendaylight.mdsal</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>10.0.1</version>
+    <version>10.0.2</version>
     <relativePath/>
   </parent>
 
similarity index 86%
rename from api/src/main/yang/service_path/transportpce-pce@2022-06-15.yang
rename to api/src/main/yang/service_path/transportpce-pce@2022-08-08.yang
index 520526f64b614e8056974c95239a228e368faaff..fce8723c5f38e0e4802d5ba0ea57f21239f5d80c 100644 (file)
@@ -54,6 +54,11 @@ module transportpce-pce {
       POSSIBILITY OF SUCH DAMAGE";
 
 
+  revision 2022-08-08 {
+    description
+      "Implement the RPC path-computation-reroute-request (only for reroute purposes) that computes a service path of
+      an existing service in order to reroute it";
+  }
   revision 2022-06-15 {
     description
       "change fraction digits from 2 to 6 for accumulative-value leaf, from 2 to 6 to be compliant with Gnpy";
@@ -189,6 +194,38 @@ module transportpce-pce {
     }
   }
 
+  rpc path-computation-reroute-request {
+    input {
+      container endpoints {
+        description
+          "Indicates the endpoints termination-point of the service to reroute";
+        leaf a-end-tp {
+          mandatory true;
+          type string;
+        }
+        leaf z-end-tp {
+          mandatory true;
+          type string;
+        }
+      }
+      leaf pce-routing-metric {
+        type transportpce-common-service-path-types:pce-metric;
+      }
+      uses transportpce-common-service-path-types:service-handler-header;
+      container service-a-end {
+        uses transportpce-common-service-path-types:service-endpoint-sp;
+      }
+      container service-z-end {
+        uses transportpce-common-service-path-types:service-endpoint-sp;
+      }
+      uses org-openroadm-routing-constraints:routing-constraints;
+      uses org-openroadm-common-service-types:routing-metric;
+    }
+    output {
+       uses org-openroadm-common-service-types:configuration-response-common;
+    }
+  }
+
   rpc cancel-resource-reserve {
     input {
       leaf service-name {
index 64a61d0d87720bf09077f3a884a690371e5e9600..8f8e708a2dce629923bd08692c2d438c7fcb5f38 100644 (file)
@@ -10,7 +10,7 @@
   <parent>
     <groupId>org.opendaylight.mdsal</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>10.0.1</version>
+    <version>10.0.2</version>
     <relativePath/>
   </parent>
 
@@ -24,7 +24,7 @@
       <dependency>
         <groupId>org.opendaylight.netconf</groupId>
         <artifactId>netconf-artifacts</artifactId>
-        <version>4.0.1</version>
+        <version>4.0.2</version>
         <scope>import</scope>
         <type>pom</type>
       </dependency>
index 529af506c4335d0f87a9bb913add82f4e7de2ac5..c912f373188a6287f88682e3c2f453935037b50c 100644 (file)
@@ -297,8 +297,10 @@ public class CrossConnectImpl221 {
         sortedCreatedOduInterfaces.sort((s1,s2) -> s1.compareTo(s2));
         String srcTp = sortedCreatedOduInterfaces.get(0);
         String dstTp = sortedCreatedOduInterfaces.get(1);
+        // Strip the service name from the src and dst
+        String oduXConnectionName = srcTp.split(":")[0] + "-x-" + dstTp.split(":")[0];
         OduConnectionBuilder oduConnectionBuilder = new OduConnectionBuilder()
-                .setConnectionName(srcTp + "-x-" + dstTp)
+                .setConnectionName(oduXConnectionName)
                 .setDestination(new org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.odu.connection
                         .DestinationBuilder().setDstIf(dstTp).build())
                 .setSource(new org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.odu.connection
@@ -331,8 +333,8 @@ public class CrossConnectImpl221 {
                 deviceTx.commit(Timeouts.DEVICE_WRITE_TIMEOUT, Timeouts.DEVICE_WRITE_TIMEOUT_UNIT);
         try {
             commit.get();
-            LOG.info("Otn-connection successfully created: {}-{}", srcTp, dstTp);
-            return Optional.of(srcTp + "-x-" + dstTp);
+            LOG.info("Otn-connection successfully created: {}", oduXConnectionName);
+            return Optional.of(oduXConnectionName);
         } catch (InterruptedException | ExecutionException e) {
             LOG.warn("Failed to post {}.", oduConnectionBuilder.build(), e);
         }
index ef8fa13e0c4a42c5b8af386aaaa2999dc9ce33c1..c2063d90843b2dbde289506c5d833d1eb2fb502f 100644 (file)
@@ -57,9 +57,20 @@ public class CrossConnectImpl710 {
         String deviceId = node.getNodeId();
         String srcTp = createdOduInterfaces.get(0);
         String dstTp = createdOduInterfaces.get(1);
-
+        LOG.debug("Client TP: {}, Network TP: {}, Network2TP: {} SrcTP: {}, DstTP: {}",
+                node.getClientTp(), node.getNetworkTp(), node.getNetwork2Tp(), srcTp, dstTp);
+        if (!srcTp.contains(node.getClientTp())) {
+            // If the src-tp does not contain client port, then we swap src-tp & dest-tp
+            String tmp;
+            tmp = dstTp;
+            dstTp = srcTp;
+            srcTp = tmp;
+            LOG.debug("After swap, SrcTP: {}, DstTP: {}", srcTp, dstTp);
+        }
+        // Strip the service name from the src and dst
+        String oduXConnectionName = srcTp.split(":")[0] + "-x-" + dstTp.split(":")[0];
         OduConnectionBuilder oduConnectionBuilder = new OduConnectionBuilder()
-            .setConnectionName(srcTp + "-x-" + dstTp)
+            .setConnectionName(oduXConnectionName)
             .setDestination(new org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.odu.connection
                 .DestinationBuilder().setDstIf(dstTp).build())
             .setSource(new org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.odu.connection
@@ -92,8 +103,8 @@ public class CrossConnectImpl710 {
             deviceTx.commit(Timeouts.DEVICE_WRITE_TIMEOUT, Timeouts.DEVICE_WRITE_TIMEOUT_UNIT);
         try {
             commit.get();
-            LOG.info("Otn-connection successfully created: {}-{}", srcTp, dstTp);
-            return Optional.of(srcTp + "-x-" + dstTp);
+            LOG.info("Otn-connection successfully created: {}", oduXConnectionName);
+            return Optional.of(oduXConnectionName);
         } catch (InterruptedException | ExecutionException e) {
             LOG.warn("Failed to post {}.", oduConnectionBuilder.build(), e);
         }
index cb3a12ef30db204bfdec806a02dc785f53f0e623..29dc03f3b51e5d86ebbb45fe46abb1e38fb799b6 100644 (file)
@@ -9,7 +9,7 @@
   <parent>
     <groupId>org.opendaylight.mdsal</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>10.0.1</version>
+    <version>10.0.2</version>
     <relativePath/>
   </parent>
 
index 592ab06f60720b4dd896b9a13d1229946e5c6662..c3f8f20444c7e58300e179392bffcaef96a3d528 100644 (file)
@@ -23,7 +23,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL
   <name>OpenDaylight :: transportpce :: swagger</name>
 
   <properties>
-    <netconf.version>4.0.1</netconf.version>
+    <netconf.version>4.0.2</netconf.version>
     <configfile.directory>etc/opendaylight/karaf</configfile.directory>
   </properties>
 
index 9e21107bdc43f5b090a273c0ccfb428208467c43..3ee7cdce77e9ee9a7f3a816c6737ee2b19e547e6 100644 (file)
@@ -23,7 +23,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL
   <name>OpenDaylight :: transportpce</name>
 
   <properties>
-    <netconf.version>4.0.1</netconf.version>
+    <netconf.version>4.0.2</netconf.version>
     <configfile.directory>etc/opendaylight/karaf</configfile.directory>
   </properties>
 
index 69314b17f4db4b353ca3059166254803c77ba75a..e65fc2b9d898960617ad09471639f29c0933ed77 100644 (file)
@@ -10,7 +10,7 @@
   <parent>
     <groupId>org.opendaylight.mdsal</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>10.0.1</version>
+    <version>10.0.2</version>
     <relativePath/>
   </parent>
 
index 18d5b5e7355c1173494aeea3262f56ddee3aac94..6e0ddcb15b94734b792ac52454d777afcb915493 100644 (file)
@@ -314,7 +314,7 @@ public final class TPCEUtils {
                     .getInstance(),
             org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.$YangModuleInfoImpl
                     .getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.$YangModuleInfoImpl
+            org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.$YangModuleInfoImpl
                     .getInstance(),
             org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.$YangModuleInfoImpl
                     .getInstance(),
index d6647c9043c6e75273cb4a1a1c16ddbc0f6ac3e4..20eafb2e8673823db6243af542712e2e5f6d3e92 100644 (file)
@@ -11,7 +11,7 @@
   <parent>
     <groupId>org.opendaylight.mdsal</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>10.0.1</version>
+    <version>10.0.2</version>
     <relativePath/>
   </parent>
 
index 1f8f00d5394492f250c4ff1ffcd3a00391936f00..a226bf86173be78e8f85e2dda9d48bef2607353c 100644 (file)
@@ -34,14 +34,14 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
       <dependency>
         <groupId>org.opendaylight.mdsal</groupId>
         <artifactId>mdsal-artifacts</artifactId>
-        <version>10.0.1</version>
+        <version>10.0.2</version>
         <scope>import</scope>
         <type>pom</type>
       </dependency>
       <dependency>
         <groupId>org.opendaylight.netconf</groupId>
         <artifactId>netconf-artifacts</artifactId>
-        <version>4.0.1</version>
+        <version>4.0.2</version>
         <scope>import</scope>
         <type>pom</type>
       </dependency>
index f7c5c9b1fac8e974ae74bff6488b66a0c668e9c4..20be031529bc4efb31a57c40d6d37a0e0c53a837 100644 (file)
@@ -36,7 +36,7 @@ import org.opendaylight.transportpce.test.AbstractTest;
 import org.opendaylight.transportpce.test.converter.DataObjectConverter;
 import org.opendaylight.transportpce.test.converter.JSONDataObjectConverter;
 import org.opendaylight.transportpce.test.utils.TopologyDataUtils;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.service.path.rpc.result.PathDescription;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.service.path.rpc.result.PathDescription;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Node1;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.TerminationPoint1;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.available.freq.map.AvailFreqMapsKey;
index 10bfde6f8c83e438e0bb800461850676516ca878..09439f77bc78eb3a7c9b8edb5e5f34085f98ba1a 100644 (file)
@@ -13,7 +13,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
   <parent>
     <groupId>org.opendaylight.mdsal</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>10.0.1</version>
+    <version>10.0.2</version>
     <relativePath/>
   </parent>
 
index bc091c0a42e38a9cc17c0204fead6fb9adc07ea0..352e2a7e80c7025c0cf81ddb56a9d2bbb86feda4 100644 (file)
@@ -12,7 +12,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
   <parent>
     <groupId>org.opendaylight.mdsal</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>10.0.1</version>
+    <version>10.0.2</version>
     <relativePath/>
   </parent>
 
index 1bd590b146c1852513e791b31f0ab27538b07dad..8a385da4bf541584f1a4c347b9e79430a706d840 100644 (file)
@@ -12,7 +12,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
   <parent>
     <groupId>org.opendaylight.mdsal</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>10.0.1</version>
+    <version>10.0.2</version>
     <relativePath/>
   </parent>
 
@@ -26,7 +26,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
       <dependency>
         <groupId>org.opendaylight.netconf</groupId>
         <artifactId>netconf-artifacts</artifactId>
-        <version>4.0.1</version>
+        <version>4.0.2</version>
         <scope>import</scope>
         <type>pom</type>
       </dependency>
index 819bc38491d1752bce7c59de871fc50682243bbf..7763b08ba95a007be3f4e4b11fabd6c5d525d10f 100644 (file)
@@ -12,7 +12,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
   <parent>
     <groupId>org.opendaylight.mdsal</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>10.0.1</version>
+    <version>10.0.2</version>
     <relativePath/>
   </parent>
 
index 135db93586f2cfb4a27b968ef93d52ecb64d3bb1..8dd4e832ff2d12adb88e603946c84d600d499adb 100644 (file)
@@ -12,7 +12,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
   <parent>
     <groupId>org.opendaylight.mdsal</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>10.0.1</version>
+    <version>10.0.2</version>
     <relativePath/>
   </parent>
 
index 5e4d4c6aec4895a22864d109f475e4c2194d1a9b..e78cd424c3628fe39bc2966307dc54b2681befd5 100644 (file)
@@ -12,7 +12,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
   <parent>
     <groupId>org.opendaylight.mdsal</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>10.0.1</version>
+    <version>10.0.2</version>
     <relativePath/>
   </parent>
 
index 63419124869e847da17eb129b9192d492fab90a1..2e6cff3c7a144d7318c8161f481919a66c09792a 100644 (file)
@@ -14,7 +14,7 @@
   <parent>
     <groupId>org.opendaylight.mdsal</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>10.0.1</version>
+    <version>10.0.2</version>
     <relativePath/>
   </parent>
 
index 022aa32667c8bf64fc00077a858decf105d380ab..92585ecba08a0d190b277656020aff5502b353a5 100644 (file)
@@ -7,7 +7,8 @@
  */
 package org.opendaylight.transportpce.pce;
 
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.PathComputationRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRerouteRequestInput;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -56,4 +57,18 @@ public final class PceComplianceCheck {
         return new PceComplianceCheckResult(result, message);
     }
 
+    public static PceComplianceCheckResult check(PathComputationRerouteRequestInput input) {
+        if (input == null) {
+            return new PceComplianceCheckResult(false, "");
+        }
+        if (input.getEndpoints() == null
+                || input.getEndpoints().getAEndTp() == null
+                || input.getEndpoints().getZEndTp() == null) {
+            String message = "At least one of the termination points is missing";
+            LOG.debug(message);
+            return new PceComplianceCheckResult(false, message);
+        }
+        return new PceComplianceCheckResult(true, "");
+    }
+
 }
index 0288f07089f0f818eb68397f14748bd3e8bd3d04..452b711708f1f471b03f62ecbed5932d989546d0 100644 (file)
@@ -20,9 +20,10 @@ import org.opendaylight.transportpce.pce.gnpy.consumer.GnpyConsumer;
 import org.opendaylight.transportpce.pce.graph.PceGraph;
 import org.opendaylight.transportpce.pce.networkanalyzer.PceCalculation;
 import org.opendaylight.transportpce.pce.networkanalyzer.PceResult;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.PathComputationRequestInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.PathComputationRequestInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.service.path.rpc.result.PathDescriptionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.path.computation.reroute.request.input.Endpoints;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.service.path.rpc.result.PathDescriptionBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.routing.constraints.HardConstraints;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.AToZDirection;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ZToADirection;
@@ -34,6 +35,7 @@ import org.slf4j.LoggerFactory;
  * Class for Sending
  * PCE requests :
  * - path-computation-request
+ * - path-computation-reroute
  * - cancel-resource-reserve.
  * @author Martial Coulibaly ( martial.coulibaly@gfi.com ) on behalf of Orange
  *
@@ -61,6 +63,8 @@ public class PceSendingPceRPCs {
     private String responseCode;
     private final GnpyConsumer gnpyConsumer;
     private PortMapping portMapping;
+    // Define the termination points whose reservation status is not taken into account during the pruning process
+    private Endpoints endpoints;
 
     public PceSendingPceRPCs(GnpyConsumer gnpyConsumer) {
         setPathDescription(null);
@@ -69,15 +73,26 @@ public class PceSendingPceRPCs {
         this.gnpyConsumer = gnpyConsumer;
     }
 
-    public PceSendingPceRPCs(PathComputationRequestInput input,
-        NetworkTransactionService networkTransaction, GnpyConsumer gnpyConsumer, PortMapping portMapping) {
+    public PceSendingPceRPCs(PathComputationRequestInput input, NetworkTransactionService networkTransaction,
+                             GnpyConsumer gnpyConsumer, PortMapping portMapping) {
         this.gnpyConsumer = gnpyConsumer;
         setPathDescription(null);
-
         // TODO compliance check to check that input is not empty
         this.input = input;
         this.networkTransaction = networkTransaction;
         this.portMapping = portMapping;
+        this.endpoints = null;
+    }
+
+    public PceSendingPceRPCs(PathComputationRequestInput input, NetworkTransactionService networkTransaction,
+                             GnpyConsumer gnpyConsumer, PortMapping portMapping,
+                             Endpoints endpoints) {
+        this.gnpyConsumer = gnpyConsumer;
+        setPathDescription(null);
+        this.input = input;
+        this.networkTransaction = networkTransaction;
+        this.portMapping = portMapping;
+        this.endpoints = endpoints;
     }
 
     public void cancelResourceReserve() {
@@ -95,8 +110,8 @@ public class PceSendingPceRPCs {
 
     public void pathComputationWithConstraints(PceConstraints hardConstraints, PceConstraints softConstraints) {
 
-        PceCalculation nwAnalizer =
-            new PceCalculation(input, networkTransaction, hardConstraints, softConstraints, rc, portMapping);
+        PceCalculation nwAnalizer = new PceCalculation(input, networkTransaction, hardConstraints, softConstraints, rc,
+                portMapping, endpoints);
         nwAnalizer.retrievePceNetwork();
         rc = nwAnalizer.getReturnStructure();
         String serviceType = nwAnalizer.getServiceType();
index 091da934063ed8055628044e82eadee88e4f291d..0142d0fcc952cd6dbcc6ca96d8417b3c895a715a 100644 (file)
@@ -20,7 +20,7 @@ import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.Timeouts;
 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
 import org.opendaylight.transportpce.pce.constraints.PceConstraints.ResourcePair;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.PathComputationRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestInput;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.node.types.rev210528.NodeIdType;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.Constraints;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.CoRouting;
index 30e521ad0725e8149fde534ff701ce3f3badcc08..d830c2f53c09e80817d4157501f12575a9cf09af 100644 (file)
@@ -56,7 +56,7 @@ import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.synchronization.info.Syn
 import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.synchronization.info.SynchronizationBuilder;
 import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.synchronization.info.synchronization.Svec;
 import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.synchronization.info.synchronization.SvecBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.PathComputationRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestInput;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev211210.FrequencyTHz;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.ModulationFormat;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.AToZDirection;
index 62ad9563586ae3ec92dfaaf7646b1283137edbf4..9f3fb18514ee457211a982054296afbb0ca7e61d 100644 (file)
@@ -23,7 +23,7 @@ import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.Result;
 import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.generic.path.properties.path.properties.PathRouteObjects;
 import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.service.PathRequest;
 import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.synchronization.info.Synchronization;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.PathComputationRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestInput;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.routing.constraints.HardConstraints;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.AToZDirection;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.AToZDirectionBuilder;
index 10f781cef1c13ae103622f6146dcc231c59999e7..c05eaa09124526fa49371a9bc99a4fbe5ff2923e 100644 (file)
@@ -27,8 +27,8 @@ import org.opendaylight.transportpce.pce.constraints.PceConstraints;
 import org.opendaylight.transportpce.pce.constraints.PceConstraints.ResourcePair;
 import org.opendaylight.transportpce.pce.networkanalyzer.PceNode;
 import org.opendaylight.transportpce.pce.networkanalyzer.PceResult;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.SpectrumAssignment;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.SpectrumAssignmentBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.SpectrumAssignment;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.SpectrumAssignmentBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmLinkType;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev181130.OpucnTribSlotDef;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
index d4f9d6d4f600562d53c5a59c50bbea569afdcd3c..f5b1516f71708ca83ab192790a6832f6f69946b1 100644 (file)
@@ -9,7 +9,7 @@ package org.opendaylight.transportpce.pce.impl;
 
 import org.opendaylight.mdsal.binding.api.RpcProviderService;
 import org.opendaylight.transportpce.pce.service.PathComputationService;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.TransportpcePceService;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.TransportpcePceService;
 import org.opendaylight.yangtools.concepts.ObjectRegistration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
index 7c48710e4526b990cd0990952727cd8bc6ebd525..13fd7684d842a0e27c2f85f5122c19eb31690fa7 100644 (file)
@@ -10,11 +10,13 @@ package org.opendaylight.transportpce.pce.impl;
 import com.google.common.util.concurrent.ListenableFuture;
 import java.util.concurrent.ExecutionException;
 import org.opendaylight.transportpce.pce.service.PathComputationService;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.CancelResourceReserveInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.CancelResourceReserveOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.PathComputationRequestInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.PathComputationRequestOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.TransportpcePceService;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.CancelResourceReserveInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.CancelResourceReserveOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRerouteRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRerouteRequestOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.TransportpcePceService;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
 import org.slf4j.Logger;
@@ -37,26 +39,46 @@ public class PceServiceRPCImpl implements TransportpcePceService {
     public ListenableFuture<RpcResult<CancelResourceReserveOutput>>
             cancelResourceReserve(CancelResourceReserveInput input) {
         LOG.info("RPC cancelResourceReserve request received");
-        CancelResourceReserveOutput output = null;
         try {
-            output = this.pathComputationService.cancelResourceReserve(input).get();
+            return RpcResultBuilder
+                    .success(
+                            this.pathComputationService.cancelResourceReserve(input).get())
+                    .buildFuture();
         } catch (InterruptedException | ExecutionException e) {
             LOG.error("RPC cancelResourceReserve failed !", e);
+            return RpcResultBuilder.success((CancelResourceReserveOutput) null).buildFuture();
         }
-        return RpcResultBuilder.success(output).buildFuture();
     }
 
     @Override
     public ListenableFuture<RpcResult<PathComputationRequestOutput>>
             pathComputationRequest(PathComputationRequestInput input) {
         LOG.info("RPC path computation request received");
-        LOG.debug("input parameters are : input = {}", input.toString());
-        PathComputationRequestOutput output = null;
+        LOG.debug("input parameters are : input = {}", input);
         try {
-            output = this.pathComputationService.pathComputationRequest(input).get();
+            return RpcResultBuilder
+                    .success(
+                            this.pathComputationService.pathComputationRequest(input).get())
+                    .buildFuture();
         } catch (InterruptedException | ExecutionException e) {
             LOG.error("RPC path computation request failed !", e);
         }
-        return RpcResultBuilder.success(output).buildFuture();
+        return RpcResultBuilder.success((PathComputationRequestOutput) null).buildFuture();
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<PathComputationRerouteRequestOutput>> pathComputationRerouteRequest(
+            PathComputationRerouteRequestInput input) {
+        LOG.info("RPC path computation reroute request received");
+        LOG.debug("input parameters are : input = {}", input);
+        try {
+            return RpcResultBuilder
+                    .success(
+                            this.pathComputationService.pathComputationRerouteRequest(input).get())
+                    .buildFuture();
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.error("RPC path computation request failed !", e);
+            return RpcResultBuilder.success((PathComputationRerouteRequestOutput) null).buildFuture();
+        }
     }
 }
index c419727d212e99d9ca8817a05ef86742c8927fc4..065eab4a5918743c23081ff2ee4ed3cc6a5248ae 100644 (file)
@@ -29,7 +29,8 @@ import org.opendaylight.transportpce.common.network.NetworkTransactionService;
 import org.opendaylight.transportpce.common.service.ServiceTypes;
 import org.opendaylight.transportpce.pce.PceComplianceCheck;
 import org.opendaylight.transportpce.pce.constraints.PceConstraints;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.PathComputationRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.path.computation.reroute.request.input.Endpoints;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mc.capabilities.McCapabilities;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1;
@@ -86,6 +87,8 @@ public class PceCalculation {
     private List<LinkId> linksToExclude = new ArrayList<>();
     private PceResult returnStructure;
     private PortMapping portMapping;
+    // Define the termination points whose reservation status is not taken into account during the pruning process
+    private Endpoints endpoints;
 
     private enum ConstraintTypes {
         NONE, HARD_EXCLUDE, HARD_INCLUDE, HARD_DIVERSITY, SOFT_EXCLUDE, SOFT_INCLUDE, SOFT_DIVERSITY;
@@ -94,15 +97,28 @@ public class PceCalculation {
     private MappingUtils mappingUtils;
 
     public PceCalculation(PathComputationRequestInput input, NetworkTransactionService networkTransactionService,
-            PceConstraints pceHardConstraints, PceConstraints pceSoftConstraints, PceResult rc,
-            PortMapping portMapping) {
+                          PceConstraints pceHardConstraints, PceConstraints pceSoftConstraints, PceResult rc,
+                          PortMapping portMapping) {
         this.input = input;
         this.networkTransactionService = networkTransactionService;
         this.returnStructure = rc;
+        this.pceHardConstraints = pceHardConstraints;
+        this.mappingUtils = new MappingUtilsImpl(networkTransactionService.getDataBroker());
+        this.portMapping = portMapping;
+        this.endpoints = null;
+        parseInput();
+    }
 
+    public PceCalculation(PathComputationRequestInput input, NetworkTransactionService networkTransactionService,
+                          PceConstraints pceHardConstraints, PceConstraints pceSoftConstraints, PceResult rc,
+                          PortMapping portMapping, Endpoints endpoints) {
+        this.input = input;
+        this.networkTransactionService = networkTransactionService;
+        this.returnStructure = rc;
         this.pceHardConstraints = pceHardConstraints;
         this.mappingUtils = new MappingUtilsImpl(networkTransactionService.getDataBroker());
         this.portMapping = portMapping;
+        this.endpoints = endpoints;
         parseInput();
     }
 
@@ -450,6 +466,9 @@ public class PceCalculation {
         PceOpticalNode pceNode = new PceOpticalNode(deviceNodeId, this.serviceType, portMapping, node, nodeType,
             mappingUtils.getOpenRoadmVersion(deviceNodeId), getSlotWidthGranularity(deviceNodeId, node.getNodeId()),
             getCentralFreqGranularity(deviceNodeId, node.getNodeId()));
+        if (endpoints != null) {
+            pceNode.setEndpoints(endpoints);
+        }
         pceNode.validateAZxponder(anodeId, znodeId, input.getServiceAEnd().getServiceFormat());
         pceNode.initFrequenciesBitSet();
 
index 7fd8976c484a0b1cd9306476a16440ca6ce34ad2..0592bbcab8f5888a8a3b09d6b0dd0efc42243244 100644 (file)
@@ -20,6 +20,7 @@ import java.util.TreeMap;
 import org.opendaylight.transportpce.common.fixedflex.GridConstant;
 import org.opendaylight.transportpce.common.mapping.PortMapping;
 import org.opendaylight.transportpce.pce.SortPortsByName;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.path.computation.reroute.request.input.Endpoints;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
@@ -63,6 +64,7 @@ public class PceOpticalNode implements PceNode {
     private String version;
     private BigDecimal slotWidthGranularity;
     private BigDecimal centralFreqGranularity;
+    private Endpoints endpoints;
 
     public PceOpticalNode(String deviceNodeId, String serviceType, PortMapping portMapping, Node node,
         OpenroadmNodeType nodeType, String version, BigDecimal slotWidthGranularity,
@@ -276,13 +278,17 @@ public class PceOpticalNode implements PceNode {
                 LOG.warn("initXndrTps: XPONDER tp = {} is OOS/degraded", tp.getTpId().getValue());
                 continue;
             }
-            org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.TerminationPoint1 nttp1 = tp
-                .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210
-                .TerminationPoint1.class);
-            if (nttp1 != null && nttp1.getXpdrNetworkAttributes().getWavelength() != null) {
-                this.usedXpndrNWTps.add(tp.getTpId().getValue());
-                LOG.debug("initXndrTps: XPONDER tp = {} is used", tp.getTpId().getValue());
-                continue;
+            if (endpoints == null
+                    || (!endpoints.getAEndTp().equals(tp.getTpId().getValue())
+                        && !endpoints.getZEndTp().equals(tp.getTpId().getValue()))) {
+                org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.TerminationPoint1 nttp1 =
+                        tp.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210
+                                .TerminationPoint1.class);
+                if (nttp1 != null && nttp1.getXpdrNetworkAttributes().getWavelength() != null) {
+                    this.usedXpndrNWTps.add(tp.getTpId().getValue());
+                    LOG.debug("initXndrTps: XPONDER tp = {} is used", tp.getTpId().getValue());
+                    continue;
+                }
             }
             // find Client of this network TP
             if (cntp1.getAssociatedConnectionMapTp() != null) {
@@ -483,4 +489,8 @@ public class PceOpticalNode implements PceNode {
         return centralFreqGranularity;
     }
 
+    public void setEndpoints(Endpoints endpoints) {
+        this.endpoints = endpoints;
+    }
+
 }
index 7a3a78934127b7144fec9e94d1d557978baab82d..cb6a4210703deb4c4d0f5b6fe1b226f5d366ef05 100644 (file)
@@ -8,10 +8,12 @@
 package org.opendaylight.transportpce.pce.service;
 
 import com.google.common.util.concurrent.ListenableFuture;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.CancelResourceReserveInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.CancelResourceReserveOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.PathComputationRequestInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.PathComputationRequestOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.CancelResourceReserveInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.CancelResourceReserveOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRerouteRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRerouteRequestOutput;
 
 /**
  * Path Computation Service.
@@ -34,4 +36,13 @@ public interface PathComputationService {
      */
     ListenableFuture<PathComputationRequestOutput> pathComputationRequest(PathComputationRequestInput input);
 
+    /**
+     * Requests a path computation in order to reroute a service.
+     *
+     * @param input PathComputationRerouteRequestInput data
+     * @return output PathComputationRerouteRequestOutput data
+     */
+    ListenableFuture<PathComputationRerouteRequestOutput> pathComputationRerouteRequest(
+            PathComputationRerouteRequestInput input);
+
 }
index dfc614a6cbbb03d2a556c47a6f551282dca9e5a9..32942c2bd12d9a92de028e557cc51b7335d7009f 100644 (file)
@@ -25,29 +25,36 @@ import org.opendaylight.transportpce.pce.PceSendingPceRPCs;
 import org.opendaylight.transportpce.pce.gnpy.GnpyResult;
 import org.opendaylight.transportpce.pce.gnpy.consumer.GnpyConsumer;
 import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.result.Response;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.CancelResourceReserveInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.CancelResourceReserveOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.CancelResourceReserveOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.PathComputationRequestInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.PathComputationRequestOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.PathComputationRequestOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.ServicePathRpcResult;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.ServicePathRpcResultBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.gnpy.GnpyResponse;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.gnpy.GnpyResponseBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.gnpy.gnpy.response.response.type.NoPathCaseBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.gnpy.gnpy.response.response.type.PathCaseBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.path.performance.PathPropertiesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.path.performance.path.properties.PathMetric;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.path.performance.path.properties.PathMetricBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.service.path.rpc.result.PathDescription;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.service.path.rpc.result.PathDescriptionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.CancelResourceReserveInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.CancelResourceReserveOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.CancelResourceReserveOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRerouteRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRerouteRequestOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRerouteRequestOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.ServicePathRpcResult;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.ServicePathRpcResultBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.gnpy.GnpyResponse;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.gnpy.GnpyResponseBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.gnpy.gnpy.response.response.type.NoPathCaseBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.gnpy.gnpy.response.response.type.PathCaseBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.path.computation.request.input.ServiceAEndBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.path.computation.request.input.ServiceZEndBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.path.performance.PathPropertiesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.path.performance.path.properties.PathMetric;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.path.performance.path.properties.PathMetricBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.service.path.rpc.result.PathDescription;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.service.path.rpc.result.PathDescriptionBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.configuration.response.common.ConfigurationResponseCommonBuilder;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.AToZDirection;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ZToADirection;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.RpcStatusEx;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.ServicePathNotificationTypes;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.response.parameters.sp.ResponseParametersBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.handler.header.ServiceHandlerHeaderBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -222,8 +229,7 @@ public class PathComputationServiceImpl implements PathComputationService {
                 }
                 // Path calculator returned Success
                 PathDescription pathDescription =
-                    new org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615
-                            .service.path.rpc.result.PathDescriptionBuilder()
+                    new PathDescriptionBuilder()
                         .setAToZDirection(path.getAToZDirection())
                         .setZToADirection(path.getZToADirection())
                         .build();
@@ -272,6 +278,52 @@ public class PathComputationServiceImpl implements PathComputationService {
         });
     }
 
+    @Override
+    public ListenableFuture<PathComputationRerouteRequestOutput> pathComputationRerouteRequest(
+            PathComputationRerouteRequestInput input) {
+        return executor.submit(() -> {
+            PathComputationRerouteRequestOutputBuilder output = new PathComputationRerouteRequestOutputBuilder();
+            ConfigurationResponseCommonBuilder configurationResponseCommon = new ConfigurationResponseCommonBuilder()
+                    .setRequestId("none");
+            PceComplianceCheckResult check = PceComplianceCheck.check(input);
+            if (!check.hasPassed()) {
+                LOG.error("Path not calculated, path computation reroute request not compliant : {}",
+                        check.getMessage());
+                configurationResponseCommon
+                        .setAckFinalIndicator("Yes")
+                        .setResponseCode("Path not calculated")
+                        .setResponseMessage(check.getMessage());
+                return output
+                        .setConfigurationResponseCommon(configurationResponseCommon.build())
+                        .build();
+            }
+            PathComputationRequestInput pathComputationInput = new PathComputationRequestInputBuilder()
+                    .setServiceName("no_name")
+                    .setServiceHandlerHeader(new ServiceHandlerHeaderBuilder().setRequestId("none").build())
+                    .setServiceAEnd(new ServiceAEndBuilder(input.getServiceAEnd()).build())
+                    .setServiceZEnd(new ServiceZEndBuilder(input.getServiceZEnd()).build())
+                    .setHardConstraints(input.getHardConstraints())
+                    .setPceRoutingMetric(input.getPceRoutingMetric())
+                    .setResourceReserve(false)
+                    .setSoftConstraints(input.getSoftConstraints())
+                    .setRoutingMetric(input.getRoutingMetric())
+                    .build();
+            PceSendingPceRPCs sendingPCE = new PceSendingPceRPCs(pathComputationInput, networkTransactionService,
+                    gnpyConsumer, portMapping, input.getEndpoints());
+            sendingPCE.pathComputation();
+            String message = sendingPCE.getMessage();
+            String responseCode = sendingPCE.getResponseCode();
+            LOG.info("PCE response: {} {}", message, responseCode);
+            return output.setConfigurationResponseCommon(
+                    configurationResponseCommon
+                            .setAckFinalIndicator("Yes")
+                            .setResponseCode(responseCode)
+                            .setResponseMessage(message)
+                            .build())
+                    .build();
+        });
+    }
+
     public GnpyResponse generateGnpyResponse(Response responseGnpy, String pathDir) {
         if (responseGnpy == null) {
             return new GnpyResponseBuilder()
index 0b038e5bcb93803dae6b093ee814ed08fc004dee..e840111cad8f2b34c969d6834470e101f261fffe 100644 (file)
@@ -22,7 +22,7 @@ import org.opendaylight.transportpce.pce.service.PathComputationService;
 import org.opendaylight.transportpce.pce.service.PathComputationServiceImpl;
 import org.opendaylight.transportpce.pce.utils.NotificationPublishServiceMock;
 import org.opendaylight.transportpce.test.AbstractTest;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.TransportpcePceService;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.TransportpcePceService;
 import org.opendaylight.yangtools.concepts.ObjectRegistration;
 
 public class PceProviderTest extends AbstractTest {
index e3d46ab769d794aae9d3a8c5cf88403c9c8cc099..7cb93031d35c809dbcd39b431a349c7510b497e3 100644 (file)
@@ -25,7 +25,7 @@ import org.opendaylight.transportpce.pce.utils.PceTestData;
 import org.opendaylight.transportpce.pce.utils.PceTestUtils;
 import org.opendaylight.transportpce.pce.utils.TransactionUtils;
 import org.opendaylight.transportpce.test.AbstractTest;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.CancelResourceReserveInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.CancelResourceReserveInputBuilder;
 
 
 public class PceServiceRPCImplTest extends AbstractTest {
@@ -60,6 +60,11 @@ public class PceServiceRPCImplTest extends AbstractTest {
         assertNotNull(pceServiceRPC.pathComputationRequest(PceTestData.getPCERequest()));
     }
 
+    @Test
+    public void testPathComputationRerouteRequest() {
+        assertNotNull(pceServiceRPC.pathComputationRerouteRequest(PceTestData.getPCERerouteRequest()));
+    }
+
     @Test
     public void testPathComputationRequestCoRoutingOrGeneral2() {
         assertNotNull(pceServiceRPC.pathComputationRequest(
index 943ca09c6f68cb391cd9e6b833125ca1319f8814..b1a87bab1c854625010ac10f1b681eceb7f776ab 100644 (file)
@@ -26,7 +26,7 @@ import org.opendaylight.transportpce.pce.utils.PceTestData;
 import org.opendaylight.transportpce.pce.utils.PceTestUtils;
 import org.opendaylight.transportpce.pce.utils.TransactionUtils;
 import org.opendaylight.transportpce.test.AbstractTest;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.PathComputationRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestInput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.MappingBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes;
@@ -35,7 +35,6 @@ import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmappi
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.nodes.NodeInfo;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.nodes.NodeInfoBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.NodeTypes;
-//import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.NodeTypes;
 
 @RunWith(MockitoJUnitRunner.StrictStubs.class)
 public class PceCalculationTest extends AbstractTest {
index 042a1f90aa92b7e32103af07395e076d9309f776..74fdf1e9756a517d17ae669905c103e67141db91 100644 (file)
@@ -78,6 +78,14 @@ public class PathComputationServiceImplTest extends AbstractTest {
 
     }
 
+    @Test
+    public void pathComputationRerouteRequestTest() {
+        pathComputationServiceImpl.generateGnpyResponse(null,"path");
+        Assert.assertNotNull(pathComputationServiceImpl
+                .pathComputationRerouteRequest(PceTestData.getPCEReroute()));
+
+    }
+
     @After
     public void destroy() {
         pathComputationServiceImpl.close();
index ac37b0f3d963a47e4c36e7762abce931bd51c3b9..1921c3c0246473fd87b43589d922f19df4efc818 100644 (file)
@@ -10,12 +10,15 @@ package org.opendaylight.transportpce.pce.utils;
 import java.util.Map;
 import java.util.Set;
 import org.opendaylight.transportpce.common.ResponseCodes;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.PathComputationRequestInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.PathComputationRequestInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.PathComputationRequestOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.PathComputationRequestOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.path.computation.request.input.ServiceAEndBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.path.computation.request.input.ServiceZEndBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRerouteRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRerouteRequestInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.path.computation.request.input.ServiceAEndBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.path.computation.request.input.ServiceZEndBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.path.computation.reroute.request.input.EndpointsBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.node.types.rev210528.NodeIdType;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ConnectionType;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.configuration.response.common.ConfigurationResponseCommon;
@@ -336,6 +339,97 @@ public final class PceTestData {
             .build();
     }
 
+    public static PathComputationRerouteRequestInput getPCERerouteRequest() {
+        return new PathComputationRerouteRequestInputBuilder()
+                .setPceRoutingMetric(PceMetric.HopCount)
+                .setServiceHandlerHeader(new ServiceHandlerHeaderBuilder()
+                        .setRequestId("request1")
+                        .build())
+                .setServiceAEnd(new org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808
+                        .path.computation.reroute.request.input.ServiceAEndBuilder()
+                        .setServiceFormat(ServiceFormat.Ethernet)
+                        .setServiceRate(Uint32.valueOf(100))
+                        .setClli("clli11")
+                        .setNodeId("XPONDER-2-2")
+                        .setTxDirection(new TxDirectionBuilder()
+                                .setPort(new PortBuilder()
+                                        .setPortDeviceName("Some port-device-name")
+                                        .setPortType("Some port-type")
+                                        .setPortName("Some port-name")
+                                        .setPortRack("Some port-rack")
+                                        .setPortShelf("Some port-shelf")
+                                        .setPortSlot("Some port-slot")
+                                        .setPortSubSlot("Some port-sub-slot")
+                                        .build())
+                                .build())
+                        .setRxDirection(new RxDirectionBuilder()
+                                .setPort(new PortBuilder()
+                                        .setPortDeviceName("Some port-device-name")
+                                        .setPortType("Some port-type")
+                                        .setPortName("Some port-name")
+                                        .setPortRack("Some port-rack")
+                                        .setPortShelf("Some port-shelf")
+                                        .setPortSlot("Some port-slot")
+                                        .setPortSubSlot("Some port-sub-slot")
+                                        .build())
+                                .build())
+                        .build())
+                .setServiceZEnd(new org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808
+                        .path.computation.reroute.request.input.ServiceZEndBuilder()
+                        .setServiceFormat(ServiceFormat.Ethernet)
+                        .setServiceRate(Uint32.valueOf(0))
+                        .setClli("Some clli11")
+                        .setNodeId("XPONDER-1-2")
+                        .setTxDirection(new TxDirectionBuilder()
+                                .setPort(new PortBuilder()
+                                        .setPortDeviceName("Some port-device-name")
+                                        .setPortType("Some port-type")
+                                        .setPortName("Some port-name")
+                                        .setPortRack("Some port-rack")
+                                        .setPortShelf("Some port-shelf")
+                                        .setPortSlot("Some port-slot")
+                                        .setPortSubSlot("Some port-sub-slot")
+                                        .build())
+                                .build())
+                        .setRxDirection(new RxDirectionBuilder()
+                                .setPort(new PortBuilder()
+                                        .setPortDeviceName("Some port-device-name")
+                                        .setPortType("Some port-type")
+                                        .setPortName("Some port-name")
+                                        .setPortRack("Some port-rack")
+                                        .setPortShelf("Some port-shelf")
+                                        .setPortSlot("Some port-slot")
+                                        .setPortSubSlot("Some port-sub-slot")
+                                        .build())
+                                .build())
+                        .build())
+                .setHardConstraints(new HardConstraintsBuilder()
+                        .setCustomerCode(Set.of("Some customer-code"))
+                        .setCoRouting(new CoRoutingBuilder()
+                                .setServiceIdentifierList(Map.of(
+                                        new org.opendaylight.yang.gen.v1
+                                                .http.org.openroadm.routing.constraints.rev211210
+                                                .constraints.co.routing.ServiceIdentifierListKey("test"),
+                                        new ServiceIdentifierListBuilder().setServiceIdentifier("test").build()))
+                                .build())
+                        .build())
+                .setSoftConstraints(new SoftConstraintsBuilder()
+                        .setCustomerCode(Set.of("Some customer-code"))
+                        .setCoRouting(new CoRoutingBuilder()
+                                .setServiceIdentifierList(Map.of(
+                                        new org.opendaylight.yang.gen.v1
+                                                .http.org.openroadm.routing.constraints.rev211210
+                                                .constraints.co.routing.ServiceIdentifierListKey("test"),
+                                        new ServiceIdentifierListBuilder().setServiceIdentifier("test").build()))
+                                .build())
+                        .build())
+                .setEndpoints(new EndpointsBuilder()
+                        .setAEndTp("AendTP")
+                        .setZEndTp("ZendTP")
+                        .build())
+                .build();
+    }
+
     public static PathComputationRequestOutput getFailedPCEResultYes() {
         return new PathComputationRequestOutputBuilder()
             .setConfigurationResponseCommon(
@@ -486,6 +580,38 @@ public final class PceTestData {
             .build();
     }
 
+    public static PathComputationRerouteRequestInput getPCEReroute() {
+        return new PathComputationRerouteRequestInputBuilder()
+                .setServiceHandlerHeader(new ServiceHandlerHeaderBuilder()
+                        .setRequestId("request 1")
+                        .build())
+                .setPceRoutingMetric(PceMetric.HopCount)
+                .setServiceAEnd(new org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808
+                        .path.computation.reroute.request.input.ServiceAEndBuilder()
+                        .setServiceRate(Uint32.valueOf(100))
+                        .setServiceFormat(ServiceFormat.Ethernet)
+                        .setNodeId("XPONDER-1-2")
+                        .build())
+                .setServiceZEnd(new org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808
+                        .path.computation.reroute.request.input.ServiceZEndBuilder()
+                        .setServiceRate(Uint32.valueOf(0))
+                        .setServiceFormat(ServiceFormat.Ethernet)
+                        .setNodeId("XPONDER-3-2")
+                        .build())
+                .setHardConstraints(new HardConstraintsBuilder()
+                        .setExclude(new ExcludeBuilder()
+                                .setNodeId(Set.of(
+                                        new NodeIdType("OpenROADM-2-1"),
+                                        new NodeIdType("OpenROADM-2-2")))
+                                .build())
+                        .build())
+                .setEndpoints(new EndpointsBuilder()
+                        .setAEndTp("AendTP")
+                        .setZEndTp("ZendTP")
+                        .build())
+                .build();
+    }
+
     /**
      * Generate Data for Test 2 request 5-4.
      * <code>{
index e447a547150d03f94d1c0fcd5bc1b6ac2baa7468..e0574c29bcb9008641d6b130d69092a2af7e6633 100644 (file)
@@ -29,7 +29,7 @@ import org.opendaylight.transportpce.common.NetworkUtils;
 import org.opendaylight.transportpce.test.DataStoreContext;
 import org.opendaylight.transportpce.test.converter.DataObjectConverter;
 import org.opendaylight.transportpce.test.converter.XMLDataObjectConverter;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.PathComputationRequestOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestOutput;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZ;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZKey;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.resource.resource.Node;
index 50169a07421708b5c541cd0443d503b9fafef49d..a88940f050bee8d8595a9dda7e153eee51c79922 100644 (file)
@@ -13,7 +13,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
   <parent>
     <groupId>org.opendaylight.mdsal</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>10.0.1</version>
+    <version>10.0.2</version>
     <relativePath/>
   </parent>
 
index b7b3b220a1d26e628612686e3f7885e225811447..1e61dc90d2a15dd629e7b5508ac7754f66be3969 100644 (file)
@@ -273,14 +273,14 @@ public class OpenRoadmInterfaceFactory {
                 LOG.error(OTN_FUNTIONS_ARE_NOT_SUPPORTED_BY_OPENROADM_MODELS_1_2_1_MSG);
                 return null;
             case StringConstants.OPENROADM_DEVICE_VERSION_2_2_1:
-                return openRoadmOtnInterface221.createOpenRoadmOdu0Interface(nodeId, logicalConnPoint,
+                return openRoadmOtnInterface221.createOpenRoadmOdu0Interface(nodeId, logicalConnPoint, servicename,
                     isCTP, tribPortNumber, tribSlotIndex, apiInfoA, apiInfoZ, payLoadType);
             default:
                 return null;
         }
     }
 
-    public String createOpenRoadmOdu2Interface(String nodeId, String logicalConnPoint,
+    public String createOpenRoadmOdu2Interface(String nodeId, String logicalConnPoint, String servicename,
             boolean isCTP, int tribPortNumber, int tribSlotIndex, AEndApiInfo apiInfoA, ZEndApiInfo apiInfoZ,
             String payLoadType)
             throws OpenRoadmInterfaceException {
@@ -289,14 +289,14 @@ public class OpenRoadmInterfaceFactory {
                 LOG.error(OTN_FUNTIONS_ARE_NOT_SUPPORTED_BY_OPENROADM_MODELS_1_2_1_MSG);
                 return null;
             case StringConstants.OPENROADM_DEVICE_VERSION_2_2_1:
-                return openRoadmOtnInterface221.createOpenRoadmOdu2Interface(nodeId, logicalConnPoint,
+                return openRoadmOtnInterface221.createOpenRoadmOdu2Interface(nodeId, logicalConnPoint,  servicename,
                     isCTP, tribPortNumber, tribSlotIndex, apiInfoA, apiInfoZ, payLoadType);
             default:
                 return null;
         }
     }
 
-    public String createOpenRoadmOdu2eInterface(String nodeId, String logicalConnPoint,
+    public String createOpenRoadmOdu2eInterface(String nodeId, String logicalConnPoint, String servicename,
             boolean isCTP, int tribPortNumber, int tribSlotIndex, AEndApiInfo apiInfoA, ZEndApiInfo apiInfoZ,
             String payLoadType)
             throws OpenRoadmInterfaceException {
@@ -306,7 +306,7 @@ public class OpenRoadmInterfaceFactory {
                 LOG.error(OTN_FUNTIONS_ARE_NOT_SUPPORTED_BY_OPENROADM_MODELS_1_2_1_MSG);
                 return null;
             case StringConstants.OPENROADM_DEVICE_VERSION_2_2_1:
-                return openRoadmOtnInterface221.createOpenRoadmOdu2eInterface(nodeId, logicalConnPoint,
+                return openRoadmOtnInterface221.createOpenRoadmOdu2eInterface(nodeId, logicalConnPoint, servicename,
                     isCTP, tribPortNumber, tribSlotIndex, apiInfoA, apiInfoZ, payLoadType);
             default:
                 return null;
@@ -326,7 +326,7 @@ public class OpenRoadmInterfaceFactory {
                 LOG.error(OTN_FUNTIONS_ARE_NOT_SUPPORTED_BY_OPENROADM_MODELS_2_2_1_MSG);
                 return null;
             case StringConstants.OPENROADM_DEVICE_VERSION_7_1:
-                return openRoadmOtnInterface710.createOpenRoadmOdu4Interface(nodeId, logicalConnPoint,
+                return openRoadmOtnInterface710.createOpenRoadmOdu4Interface(nodeId, logicalConnPoint, serviceName,
                     payLoad, isNetworkPort, minTribSlotNumber, maxTribSlotNumber);
             default:
                 return null;
index 3ce172da3b5f5363820501b8aee79122682f2a4c..907992286f796564c41f67dde5d385ec8482671e 100644 (file)
@@ -130,7 +130,7 @@ public class OpenRoadmOtnInterface221 {
         return ethernetInterfaceName;
     }
 
-    public String createOpenRoadmOdu2eInterface(String nodeId, String logicalConnPoint,
+    public String createOpenRoadmOdu2eInterface(String nodeId, String logicalConnPoint, String serviceName,
             boolean isCTP, int tribPortNumber, int tribSlotIndex, AEndApiInfo apiInfoA, ZEndApiInfo apiInfoZ,
             String payloadType) throws OpenRoadmInterfaceException {
 
@@ -140,7 +140,7 @@ public class OpenRoadmOtnInterface221 {
                 String.format(MAPPING_ERROR_EXCEPTION_MESSAGE, nodeId, logicalConnPoint));
         }
         InterfaceBuilder oduInterfaceBldr = createGenericInterfaceBuilder(mapping, OtnOdu.VALUE,
-            logicalConnPoint + "-ODU2e");
+            logicalConnPoint + "-ODU2e" + ":" + serviceName);
         if (mapping.getSupportingOdu4() != null) {
             oduInterfaceBldr.setSupportingInterface(mapping.getSupportingOdu4());
         }
@@ -206,8 +206,8 @@ public class OpenRoadmOtnInterface221 {
         return oduInterfaceBldr.getName();
     }
 
-    public String createOpenRoadmOdu0Interface(String nodeId, String logicalConnPoint,
-            boolean isCTP, int tribPortNumber, int tribSlotIndex, AEndApiInfo apiInfoA, ZEndApiInfo apiInfoZ,
+    public String createOpenRoadmOdu0Interface(String nodeId, String logicalConnPoint, String servicename,
+        boolean isCTP, int tribPortNumber, int tribSlotIndex, AEndApiInfo apiInfoA, ZEndApiInfo apiInfoZ,
             String payloadType) throws OpenRoadmInterfaceException {
 
         Mapping mapping = this.portMapping.getMapping(nodeId, logicalConnPoint);
@@ -216,7 +216,7 @@ public class OpenRoadmOtnInterface221 {
                 String.format(MAPPING_ERROR_EXCEPTION_MESSAGE, nodeId, logicalConnPoint));
         }
         InterfaceBuilder oduInterfaceBldr = createGenericInterfaceBuilder(mapping, OtnOdu.VALUE,
-            logicalConnPoint + "-ODU0");
+            logicalConnPoint + "-ODU0" + ":" + servicename);
         if (mapping.getSupportingOdu4() != null) {
             oduInterfaceBldr.setSupportingInterface(mapping.getSupportingOdu4());
         }
@@ -283,8 +283,8 @@ public class OpenRoadmOtnInterface221 {
     }
 
     public String createOpenRoadmOdu2Interface(String nodeId, String logicalConnPoint,
-            boolean isCTP, int tribPortNumber, int tribSlotIndex, AEndApiInfo apiInfoA, ZEndApiInfo apiInfoZ,
-            String payloadType) throws OpenRoadmInterfaceException {
+            String servicename, boolean isCTP, int tribPortNumber, int tribSlotIndex, AEndApiInfo apiInfoA,
+            ZEndApiInfo apiInfoZ, String payloadType) throws OpenRoadmInterfaceException {
 
         Mapping mapping = this.portMapping.getMapping(nodeId, logicalConnPoint);
         if (mapping == null) {
@@ -292,7 +292,7 @@ public class OpenRoadmOtnInterface221 {
                 String.format(MAPPING_ERROR_EXCEPTION_MESSAGE, nodeId, logicalConnPoint));
         }
         InterfaceBuilder oduInterfaceBldr = createGenericInterfaceBuilder(mapping, OtnOdu.VALUE,
-            logicalConnPoint + "-ODU2");
+            logicalConnPoint + "-ODU2" + ":" + servicename);
         if (mapping.getSupportingOdu4() != null) {
             oduInterfaceBldr.setSupportingInterface(mapping.getSupportingOdu4());
         }
index 8764dba3f69c7b52a6ed2e48b68e259878fd9adc..4b86cf804340a98ca60ab03cc5f726fa9121375e 100644 (file)
@@ -86,7 +86,7 @@ public class OpenRoadmOtnInterface710 {
             nodeId, logicalConnPoint));
     }
 
-    public String createOpenRoadmOdu4Interface(String nodeId, String logicalConnPoint,
+    public String createOpenRoadmOdu4Interface(String nodeId, String logicalConnPoint, String serviceName,
         String payLoad, boolean isNetworkPort, OpucnTribSlotDef minTribSlotNumber, OpucnTribSlotDef maxTribSlotNumber)
         throws OpenRoadmInterfaceException {
         Mapping portMap = this.portMapping.getMapping(nodeId, logicalConnPoint);
@@ -111,7 +111,8 @@ public class OpenRoadmOtnInterface710 {
         // Supporting interface is a list for B100G (7.1) device models
         supportingInterfaceList.add(supportingInterface);
 
-        InterfaceBuilder oduIfBuilder = createGenericInterfaceBuilder(portMap, OtnOdu.VALUE, logicalConnPoint + "-ODU4")
+        InterfaceBuilder oduIfBuilder = createGenericInterfaceBuilder(
+            portMap, OtnOdu.VALUE, logicalConnPoint + "-ODU4" + ":" + serviceName)
             .setSupportingInterfaceList(supportingInterfaceList);
         // Agument ODU4 specific interface data
         OduBuilder oduBuilder = new OduBuilder().setRate(ODU4.VALUE)
index 3c8f6fa519f56ec13bd206269c736ec665c91d2d..d7b2c4500b574dcb6712093f4f457eba1b4b5b7d 100644 (file)
@@ -366,15 +366,15 @@ public class OtnDeviceRendererServiceImpl implements OtnDeviceRendererService {
                         createdEthInterfaces.add(openRoadmInterfaceFactory.createOpenRoadmEth10GInterface(
                             node.getNodeId(), node.getClientTp()));
                         createdOduInterfaces.add(
-                            // suppporting interface?, payload ?
+                            // supporting interface?, payload ?
                             openRoadmInterfaceFactory.createOpenRoadmOdu2eInterface(node.getNodeId(),
-                                node.getClientTp(),  false, input.getTribPortNumber(),
+                                node.getClientTp(),  input.getServiceName(), false, input.getTribPortNumber(),
                                 input.getTribSlot(), apiInfoA, apiInfoZ, PT_03));
                     }
                     createdOduInterfaces.add(
                         // supporting interface? payload ?
                         openRoadmInterfaceFactory.createOpenRoadmOdu2eInterface(node.getNodeId(), node.getNetworkTp(),
-                             true, input.getTribPortNumber(), input.getTribSlot(), null,
+                             input.getServiceName(), true, input.getTribPortNumber(), input.getTribSlot(), null,
                             null, null));
                     linkTpList.add(
                         new LinkTpBuilder().setNodeId(node.getNodeId()).setTpId(node.getNetworkTp()).build());
@@ -382,7 +382,7 @@ public class OtnDeviceRendererServiceImpl implements OtnDeviceRendererService {
                         createdOduInterfaces.add(
                             // supporting interface? payload ?
                             openRoadmInterfaceFactory.createOpenRoadmOdu2eInterface(node.getNodeId(),
-                                node.getNetwork2Tp(), true, input.getTribPortNumber(),
+                                node.getNetwork2Tp(), input.getServiceName(),true, input.getTribPortNumber(),
                                 input.getTribSlot(), null, null, null));
                         linkTpList.add(
                             new LinkTpBuilder().setNodeId(node.getNodeId()).setTpId(node.getNetworkTp()).build());
index a4390f427c162091ec26ca9c3ca328f4b50bce0b..ca897bda9c6241f0567ec63e1c946a7432941481 100644 (file)
@@ -15,7 +15,7 @@ Author: Martial Coulibaly <martial.coulibaly@gfi.com> on behalf of Orange
   <parent>
     <groupId>org.opendaylight.mdsal</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>10.0.1</version>
+    <version>10.0.2</version>
     <relativePath/>
   </parent>
 
index b8d1668e6dd0e499ba1d9a0b8d8f85d3bbce5cb5..033dc72b123b696a7b49f810ef33ec9f6323f1eb 100644 (file)
@@ -9,12 +9,12 @@ package org.opendaylight.transportpce.servicehandler;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.util.concurrent.ListenableFuture;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.PathComputationRequestOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.path.computation.request.input.ServiceAEnd;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.path.computation.request.input.ServiceAEndBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.path.computation.request.input.ServiceZEnd;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.path.computation.request.input.ServiceZEndBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.service.path.rpc.result.PathDescription;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.path.computation.request.input.ServiceAEnd;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.path.computation.request.input.ServiceAEndBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.path.computation.request.input.ServiceZEnd;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.path.computation.request.input.ServiceZEndBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.service.path.rpc.result.PathDescription;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteInputBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceImplementationRequestInput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceImplementationRequestInputBuilder;
@@ -259,6 +259,19 @@ public final class ModelMappingUtils {
             .build();
     }
 
+    public static org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808
+            .path.computation.reroute.request.input.ServiceAEnd createServiceAEndReroute(ServiceEndpoint serviceAEnd) {
+        return new org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808
+                .path.computation.reroute.request.input.ServiceAEndBuilder()
+                .setClli(serviceAEnd.getClli())
+                .setNodeId(serviceAEnd.getNodeId().getValue())
+                .setRxDirection(createRxDirection(serviceAEnd.getRxDirection().values().stream().findFirst().get()))
+                .setServiceFormat(serviceAEnd.getServiceFormat())
+                .setServiceRate(serviceAEnd.getServiceRate())
+                .setTxDirection(createTxDirection(serviceAEnd.getTxDirection().values().stream().findFirst().get()))
+                .build();
+    }
+
     public static ServiceZEnd createServiceZEnd(ServiceEndpoint serviceZEnd) {
         return new ServiceZEndBuilder()
             .setClli(serviceZEnd.getClli())
@@ -270,6 +283,19 @@ public final class ModelMappingUtils {
             .build();
     }
 
+    public static org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808
+            .path.computation.reroute.request.input.ServiceZEnd createServiceZEndReroute(ServiceEndpoint serviceZEnd) {
+        return new org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808
+                .path.computation.reroute.request.input.ServiceZEndBuilder()
+                .setClli(serviceZEnd.getClli())
+                .setNodeId(serviceZEnd.getNodeId().getValue())
+                .setRxDirection(createRxDirection(serviceZEnd.getRxDirection().values().stream().findFirst().get()))
+                .setServiceFormat(serviceZEnd.getServiceFormat())
+                .setServiceRate(serviceZEnd.getServiceRate())
+                .setTxDirection(createTxDirection(serviceZEnd.getTxDirection().values().stream().findFirst().get()))
+                .build();
+    }
+
     public static RxDirection createRxDirection(
             org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210
                 .service.endpoint.RxDirection rxDirection) {
@@ -391,14 +417,16 @@ public final class ModelMappingUtils {
     }
 
     public static ListenableFuture<RpcResult<ServiceRerouteOutput>> createRerouteServiceReply(
-            ServiceRerouteInput input, String finalAckYes, String message) {
+            ServiceRerouteInput input, String finalAckYes, String message, String responseCode) {
         return RpcResultBuilder
             .success(
                 new ServiceRerouteOutputBuilder()
                     .setConfigurationResponseCommon(
                         new ConfigurationResponseCommonBuilder()
-                            .setResponseMessage(message)
-                            .build())
+                             .setAckFinalIndicator(finalAckYes)
+                             .setResponseCode(responseCode)
+                             .setResponseMessage(message)
+                             .build())
                     .setHardConstraints(null)
                     .setSoftConstraints(null)
                     .build())
index a818df60cf14fe2b6f52ebb3204cf3b523c73490..d03293738f205a8f7bca85de93f4c5c87efb7531 100644 (file)
@@ -20,6 +20,7 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.Service
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceDeleteInput;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceFeasibilityCheckInput;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceReconfigureInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRerouteInput;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceCreateInput;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceCreateInputBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceDeleteInput;
@@ -30,7 +31,6 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service
  * Super class of {@link ServiceCreateInput} and {@link TempServiceCreateInput}.
  *
  * @author Martial Coulibaly ( martial.coulibaly@gfi.com ) on behalf of Orange
- *
  */
 public class ServiceInput {
     private String serviceName;
@@ -124,6 +124,13 @@ public class ServiceInput {
         setServiceReconfigure(false);
     }
 
+    public ServiceInput(ServiceRerouteInput serviceRerouteInput) {
+        setServiceName(serviceRerouteInput.getServiceName());
+        setSdncRequestHeader(serviceRerouteInput.getSdncRequestHeader());
+        setServiceResiliency(serviceRerouteInput.getServiceResiliency());
+        setServiceReconfigure(false);
+    }
+
     public ServiceCreateInput getServiceCreateInput() {
         ServiceCreateInputBuilder serviceCreateInputBuilder = new ServiceCreateInputBuilder()
                 .setCommonId(commonId)
index 37e7c1a223a14507f7f7a0accc7c51b903bcfd2a..7d3d4f9edb7bcfde39b2cdc32d83bfd4100a121a 100644 (file)
@@ -11,6 +11,7 @@ import com.google.common.util.concurrent.ListenableFuture;
 import java.time.OffsetDateTime;
 import java.time.ZoneOffset;
 import java.time.format.DateTimeFormatter;
+import java.util.Map;
 import java.util.Optional;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.NotificationPublishService;
@@ -30,7 +31,9 @@ import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOper
 import org.opendaylight.transportpce.servicehandler.validation.ServiceCreateValidation;
 import org.opendaylight.transportpce.servicehandler.validation.checks.ComplianceCheckResult;
 import org.opendaylight.transportpce.servicehandler.validation.checks.ServicehandlerComplianceCheck;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.PathComputationRequestOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRerouteRequestOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.path.computation.reroute.request.input.EndpointsBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.RpcActions;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ServiceNotificationTypes;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.configuration.response.common.ConfigurationResponseCommon;
@@ -105,6 +108,10 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempSer
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.delete.input.ServiceDeleteReqInfo.TailRetention;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.delete.input.ServiceDeleteReqInfoBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.list.Services;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZ;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZKey;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.resource.resource.TerminationPoint;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.service.path.list.ServicePaths;
 import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.PublishNotificationProcessService;
 import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.PublishNotificationProcessServiceBuilder;
 import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.notification.process.service.ServiceAEndBuilder;
@@ -185,6 +192,10 @@ public class ServicehandlerImpl implements OrgOpenroadmServiceService {
             return "Service '" + serviceName + "' does not exist in datastore";
         }
 
+        public static String servicePathNotInDS(String serviceName) {
+            return "Service Path from '" + serviceName + "' does not exist in datastore";
+        }
+
         public static String serviceInService(String serviceName) {
             return "Service '" + serviceName + "' is in 'inService' state";
         }
@@ -490,50 +501,57 @@ public class ServicehandlerImpl implements OrgOpenroadmServiceService {
         if (servicesObject.isEmpty()) {
             LOG.warn("serviceReroute: {}", LogMessages.serviceNotInDS(serviceName));
             return ModelMappingUtils.createRerouteServiceReply(
-                    input, ResponseCodes.FINAL_ACK_NO,
-                    LogMessages.serviceNotInDS(serviceName));
+                    input, ResponseCodes.FINAL_ACK_YES,
+                    LogMessages.serviceNotInDS(serviceName),
+                    ResponseCodes.RESPONSE_FAILED);
         }
         Services service = servicesObject.get();
-        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssxxx");
-        OffsetDateTime offsetDateTime = OffsetDateTime.now(ZoneOffset.UTC);
-        DateAndTime datetime = new DateAndTime(dtf.format(offsetDateTime));
-        SdncRequestHeaderBuilder sdncBuilder = new SdncRequestHeaderBuilder()
-                .setNotificationUrl(service.getSdncRequestHeader().getNotificationUrl())
-                .setRequestId(service.getSdncRequestHeader().getRequestId())
-                .setRequestSystemId(service.getSdncRequestHeader().getRequestSystemId())
-                .setRpcAction(RpcActions.ServiceDelete);
-        ServiceDeleteInputBuilder deleteInputBldr = new ServiceDeleteInputBuilder()
-                .setServiceDeleteReqInfo(new ServiceDeleteReqInfoBuilder()
-                    .setServiceName(serviceName).setDueDate(datetime)
-                    .setTailRetention(TailRetention.No).build())
-                .setSdncRequestHeader(sdncBuilder.build());
-        ServiceInput serviceInput = new ServiceInput(deleteInputBldr.build());
+        Optional<ServicePaths> servicePathsObject = this.serviceDataStoreOperations.getServicePath(serviceName);
+        if (servicePathsObject.isEmpty()) {
+            LOG.warn("serviceReroute: {}", LogMessages.servicePathNotInDS(serviceName));
+            return ModelMappingUtils.createRerouteServiceReply(
+                    input, ResponseCodes.FINAL_ACK_YES,
+                    LogMessages.servicePathNotInDS(serviceName),
+                    ResponseCodes.RESPONSE_FAILED);
+        }
+        ServicePaths servicePaths = servicePathsObject.get();
+        // serviceInput for later use maybe...
+        ServiceInput serviceInput = new ServiceInput(input);
         serviceInput.setServiceAEnd(service.getServiceAEnd());
         serviceInput.setServiceZEnd(service.getServiceZEnd());
         serviceInput.setConnectionType(service.getConnectionType());
-        this.pceListenerImpl.setInput(serviceInput);
-        this.pceListenerImpl.setServiceReconfigure(true);
-        this.pceListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
-        this.rendererListenerImpl.setServiceInput(serviceInput);
-        this.rendererListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
-        this.networkModelListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
-        org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915
-            .ServiceDeleteInput serviceDeleteInput = ModelMappingUtils.createServiceDeleteInput(
-                    new ServiceInput(deleteInputBldr.build()));
-        org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915
-            .ServiceDeleteOutput output = this.rendererServiceWrapper.performRenderer(serviceDeleteInput,
-                ServiceNotificationTypes.ServiceDeleteResult, null);
+        serviceInput.setCommonId(service.getCommonId());
+        serviceInput.setHardConstraints(service.getHardConstraints());
+        serviceInput.setSoftConstraints(service.getSoftConstraints());
+        serviceInput.setCustomer(service.getCustomer());
+        serviceInput.setCustomerContact(service.getCustomerContact());
+
+        // Get the network xpdr termination points
+        Map<AToZKey, AToZ> mapaToz = servicePaths.getPathDescription().getAToZDirection().getAToZ();
+        String aendtp = ((TerminationPoint) mapaToz.get(new AToZKey(String.valueOf(mapaToz.size() - 3)))
+                .getResource()
+                .getResource())
+                .getTpId();
+        String zendtp = ((TerminationPoint) mapaToz.get(new AToZKey("2"))
+                .getResource()
+                .getResource())
+                .getTpId();
+
+        PathComputationRerouteRequestOutput output = this.pceServiceWrapper.performPCEReroute(
+                service.getHardConstraints(), service.getSoftConstraints(), input.getSdncRequestHeader(),
+                service.getServiceAEnd(), service.getServiceZEnd(),
+                new EndpointsBuilder().setAEndTp(aendtp).setZEndTp(zendtp).build());
+
         if (output == null) {
-            LOG.error("serviceReroute: {}", LogMessages.RENDERER_DELETE_FAILED);
+            LOG.error("serviceReroute: {}", LogMessages.PCE_FAILED);
             return ModelMappingUtils.createRerouteServiceReply(
                     input, ResponseCodes.FINAL_ACK_YES,
-                    LogMessages.RENDERER_DELETE_FAILED);
+                    LogMessages.PCE_FAILED, ResponseCodes.RESPONSE_FAILED);
         }
-        LOG.info("RPC ServiceReroute in progress...");
+        LOG.info("RPC ServiceReroute is done");
         ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
-        return ModelMappingUtils.createRerouteServiceReply(
-                input, common.getAckFinalIndicator(),
-                common.getResponseMessage());
+        return ModelMappingUtils.createRerouteServiceReply(input, common.getAckFinalIndicator(),
+                common.getResponseMessage(), common.getResponseCode());
     }
 
     @Override
index 0b7ab2b3548d881dac251a93131ea0b001d4d216..379296038f85ed463703a7ad40961b0acf4a347a 100644 (file)
@@ -19,7 +19,7 @@ import org.opendaylight.transportpce.servicehandler.listeners.RendererListenerIm
 import org.opendaylight.transportpce.servicehandler.listeners.ServiceListener;
 import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkmodel.rev201116.TransportpceNetworkmodelListener;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.TransportpcePceListener;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.TransportpcePceListener;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.TransportpceRendererListener;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.OrgOpenroadmServiceService;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceList;
index 1fd4cbb39dff1ecbe6008a74c5220124d2ece430..665b18f52415e035bbc876dd13f938489f94eaa7 100644 (file)
@@ -16,11 +16,11 @@ import org.opendaylight.transportpce.servicehandler.ModelMappingUtils;
 import org.opendaylight.transportpce.servicehandler.ServiceInput;
 import org.opendaylight.transportpce.servicehandler.service.PCEServiceWrapper;
 import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.PathComputationRequestOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.ServicePathRpcResult;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.TransportpcePceListener;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.service.path.rpc.result.PathDescription;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.service.path.rpc.result.PathDescriptionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.ServicePathRpcResult;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.TransportpcePceListener;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.service.path.rpc.result.PathDescription;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.service.path.rpc.result.PathDescriptionBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceImplementationRequestInput;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.list.Services;
index ed6a9a6be3bb1bc02d16cfde87ddf2cb25108b3a..7caf6b2e1331eb485fe1b0a48d97e90e8df1a2e8 100644 (file)
@@ -22,18 +22,24 @@ import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
 import org.opendaylight.mdsal.binding.api.DataTreeModification;
 import org.opendaylight.mdsal.binding.api.NotificationPublishService;
 import org.opendaylight.transportpce.common.ResponseCodes;
+import org.opendaylight.transportpce.pce.service.PathComputationService;
 import org.opendaylight.transportpce.servicehandler.ServiceInput;
 import org.opendaylight.transportpce.servicehandler.impl.ServicehandlerImpl;
 import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.Restorable;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.RpcActions;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.routing.metric.RoutingMetric;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.sdnc.request.header.SdncRequestHeaderBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.resiliency.ServiceResiliency;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateInputBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateOutput;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceDeleteInputBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceDeleteOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRerouteInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRerouteInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRerouteOutput;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.create.input.ServiceAEndBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.create.input.ServiceZEndBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.delete.input.ServiceDeleteReqInfo;
@@ -52,6 +58,7 @@ public class ServiceListener implements DataTreeChangeListener<Services> {
     private ServicehandlerImpl servicehandlerImpl;
     private ServiceDataStoreOperations serviceDataStoreOperations;
     private NotificationPublishService notificationPublishService;
+    private PathComputationService pathComputationService;
     private Map<String, ServiceInput> mapServiceInputReroute;
     private final ScheduledExecutorService executor;
 
@@ -98,7 +105,12 @@ public class ServiceListener implements DataTreeChangeListener<Services> {
                                 && inputAfter.getServiceResiliency().getResiliency() != null
                                 && inputAfter.getServiceResiliency().getResiliency().equals(Restorable.VALUE)) {
                             LOG.info("Attempting to reroute the service '{}'...", serviceInputName);
-                            // It is used for hold off time purposes
+                            if (!serviceRerouteCheck(serviceInputName, inputAfter.getServiceResiliency(),
+                                    inputAfter.getRoutingMetric())) {
+                                LOG.info("No other path available, cancelling reroute process of service '{}'...",
+                                        serviceInputName);
+                                continue;
+                            }
                             mapServiceInputReroute.put(serviceInputName, null);
                             if (inputAfter.getServiceResiliency().getHoldoffTime() != null) {
                                 LOG.info("Waiting hold off time before rerouting...");
@@ -108,7 +120,8 @@ public class ServiceListener implements DataTreeChangeListener<Services> {
                                                     && mapServiceInputReroute.get(serviceInputName) == null) {
                                                 serviceRerouteStep1(serviceInputName);
                                             } else {
-                                                LOG.info("Cancelling rerouting for service '{}'...", serviceInputName);
+                                                LOG.info("Cancelling reroute process of service '{}'...",
+                                                        serviceInputName);
                                             }
                                         },
                                         Long.parseLong(String.valueOf(inputAfter.getServiceResiliency()
@@ -215,6 +228,34 @@ public class ServiceListener implements DataTreeChangeListener<Services> {
         mapServiceInputReroute.remove(serviceNameToReroute);
     }
 
+    /**
+     * Prior to the reroute steps: check that an alternative route of the service is possible.
+     *
+     * @param serviceNameToReroute Name of the service
+     * @param serviceResiliency Resiliency of the service
+     * @param routingMetric Metric of the routing
+     */
+    private boolean serviceRerouteCheck(String serviceNameToReroute, ServiceResiliency serviceResiliency,
+                                        RoutingMetric routingMetric) {
+        ServiceRerouteInput serviceRerouteInput = new ServiceRerouteInputBuilder()
+                .setServiceName(serviceNameToReroute)
+                .setServiceResiliency(serviceResiliency)
+                .setRoutingMetric(routingMetric)
+                .setSdncRequestHeader(new SdncRequestHeaderBuilder()
+                        .setRpcAction(RpcActions.ServiceReroute)
+                        .build())
+                .build();
+        ListenableFuture<RpcResult<ServiceRerouteOutput>> res = this.servicehandlerImpl.serviceReroute(
+                serviceRerouteInput);
+        try {
+            return res.get().getResult().getConfigurationResponseCommon().getResponseCode()
+                    .equals(ResponseCodes.RESPONSE_OK);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.warn("ServiceRerouteCheck FAILED ! ", e);
+            return false;
+        }
+    }
+
     /**
      * Send notification to NBI notification in order to publish message.
      *
index 3cdf5f740292234dbe251a8a5625cc4fee70ad3b..056b291e600bb544c731a4cb48a01a4dabb7e879 100644 (file)
@@ -12,19 +12,26 @@ import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.ListeningExecutorService;
 import com.google.common.util.concurrent.MoreExecutors;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executors;
 import org.opendaylight.mdsal.binding.api.NotificationPublishService;
 import org.opendaylight.transportpce.common.ResponseCodes;
 import org.opendaylight.transportpce.pce.service.PathComputationService;
 import org.opendaylight.transportpce.servicehandler.ModelMappingUtils;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.CancelResourceReserveInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.CancelResourceReserveInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.CancelResourceReserveOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.CancelResourceReserveOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.PathComputationRequestInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.PathComputationRequestInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.PathComputationRequestOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.PathComputationRequestOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.CancelResourceReserveInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.CancelResourceReserveInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.CancelResourceReserveOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.CancelResourceReserveOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRerouteRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRerouteRequestInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRerouteRequestOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRerouteRequestOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.path.computation.reroute.request.input.Endpoints;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.path.computation.reroute.request.input.EndpointsBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.servicehandler.rev201125.ServiceRpcResultSh;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.servicehandler.rev201125.ServiceRpcResultShBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ServiceEndpoint;
@@ -138,6 +145,31 @@ public class PCEServiceWrapper {
                 .build();
     }
 
+    public PathComputationRerouteRequestOutput performPCEReroute(HardConstraints hardConstraints,
+           SoftConstraints softConstraints, SdncRequestHeader serviceHandler, ServiceEndpoint serviceAEnd,
+           ServiceEndpoint serviceZEnd,
+           Endpoints endpoints) {
+        // TODO: Make it asynchronous
+        LOG.info("Calling path computation reroute");
+        PathComputationRerouteRequestInput inputPCE = createPceRerouteRequestInput(hardConstraints, softConstraints,
+                serviceHandler, serviceAEnd, serviceZEnd, endpoints);
+        ListenableFuture<PathComputationRerouteRequestOutput> res =
+                pathComputationService.pathComputationRerouteRequest(inputPCE);
+        try {
+            return res.get();
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.warn("PerformPCEReroute FAILED ! ", e);
+            return new PathComputationRerouteRequestOutputBuilder()
+                    .setConfigurationResponseCommon(new ConfigurationResponseCommonBuilder()
+                            .setAckFinalIndicator(ResponseCodes.FINAL_ACK_YES)
+                            .setRequestId("None")
+                            .setResponseCode(ResponseCodes.RESPONSE_OK)
+                            .setResponseMessage("PCE calculation FAILED")
+                            .build())
+                    .build();
+        }
+    }
+
     private PathComputationRequestInput createPceRequestInput(String serviceName,
             SdncRequestHeader serviceHandler, HardConstraints hardConstraints,
             SoftConstraints softConstraints, Boolean reserveResource, ServiceEndpoint serviceAEnd,
@@ -160,6 +192,26 @@ public class PCEServiceWrapper {
             .build();
     }
 
+    private PathComputationRerouteRequestInput createPceRerouteRequestInput(HardConstraints hardConstraints,
+            SoftConstraints softConstraints, SdncRequestHeader serviceHandler, ServiceEndpoint serviceAEnd,
+            ServiceEndpoint serviceZEnd, Endpoints endpoints) {
+        LOG.info("Mapping Service-reroute to PCE requests");
+        return new PathComputationRerouteRequestInputBuilder()
+                .setServiceHandlerHeader(serviceHandler == null
+                        ? new ServiceHandlerHeaderBuilder().build()
+                        : new ServiceHandlerHeaderBuilder().setRequestId(serviceHandler.getRequestId()).build())
+                .setHardConstraints(hardConstraints)
+                .setSoftConstraints(softConstraints)
+                .setPceRoutingMetric(PceMetric.TEMetric)
+                .setEndpoints(new EndpointsBuilder()
+                        .setAEndTp(endpoints.getAEndTp())
+                        .setZEndTp(endpoints.getZEndTp())
+                        .build())
+                .setServiceAEnd(ModelMappingUtils.createServiceAEndReroute(serviceAEnd))
+                .setServiceZEnd(ModelMappingUtils.createServiceZEndReroute(serviceZEnd))
+                .build();
+    }
+
     private CancelResourceReserveInput mappingCancelResourceReserve(String serviceName,
                                                                     SdncRequestHeader sdncRequestHeader) {
         LOG.info("Mapping to PCE Cancel resource request input");
index 69545a7ac188a5168e20e4549a125eca4d9b381a..ced0f3969eb971f51de4f02173906f2391ee056b 100644 (file)
@@ -10,7 +10,7 @@ package org.opendaylight.transportpce.servicehandler.service;
 import java.util.Optional;
 import org.opendaylight.transportpce.common.OperationResult;
 import org.opendaylight.transportpce.servicehandler.ServiceInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.PathComputationRequestOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestOutput;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateInput;
index 9916204ca689e0c3daee385f3f588a662ca9c447..49b631d2afbbad6268b7f55e4eeb440b9a9528da 100644 (file)
@@ -23,7 +23,7 @@ import org.opendaylight.transportpce.common.OperationResult;
 import org.opendaylight.transportpce.common.Timeouts;
 import org.opendaylight.transportpce.servicehandler.ModelMappingUtils;
 import org.opendaylight.transportpce.servicehandler.ServiceInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.PathComputationRequestOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestOutput;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateInput;
index ef1fe31cf48bf504f38cc4a91ae89cd974971001..a36e934619e6853610dfa6b394fee109516770b1 100644 (file)
@@ -25,8 +25,8 @@ import org.junit.Test;
 import org.opendaylight.transportpce.common.ResponseCodes;
 import org.opendaylight.transportpce.servicehandler.utils.ServiceDataUtils;
 import org.opendaylight.transportpce.test.AbstractTest;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.PathComputationRequestOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.PathComputationRequestOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestOutputBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ConnectionType;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.configuration.response.common.ConfigurationResponseCommon;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.configuration.response.common.ConfigurationResponseCommonBuilder;
index 9c3fcacc0f95d711398c8648df9b517a536617cf..63445c36d05fc948e3d13a38e9e550d2996ccc18 100644 (file)
@@ -15,6 +15,7 @@ import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.ListeningExecutorService;
 import com.google.common.util.concurrent.MoreExecutors;
+import java.util.Map;
 import java.util.Optional;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutionException;
@@ -29,6 +30,7 @@ import org.opendaylight.mdsal.binding.api.NotificationPublishService;
 import org.opendaylight.transportpce.common.ResponseCodes;
 import org.opendaylight.transportpce.pce.service.PathComputationService;
 import org.opendaylight.transportpce.renderer.provisiondevice.RendererServiceOperations;
+import org.opendaylight.transportpce.servicehandler.ServiceInput;
 import org.opendaylight.transportpce.servicehandler.listeners.NetworkModelListenerImpl;
 import org.opendaylight.transportpce.servicehandler.listeners.PceListenerImpl;
 import org.opendaylight.transportpce.servicehandler.listeners.RendererListenerImpl;
@@ -36,6 +38,10 @@ import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOper
 import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperationsImpl;
 import org.opendaylight.transportpce.servicehandler.utils.ServiceDataUtils;
 import org.opendaylight.transportpce.test.AbstractTest;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRerouteRequestOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.configuration.response.common.ConfigurationResponseCommonBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateInput;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateInputBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateOutput;
@@ -61,7 +67,17 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempSer
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceDeleteOutput;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.delete.input.ServiceDeleteReqInfoBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.list.ServicesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.AToZDirectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ZToADirectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZ;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZKey;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.ResourceBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.resource.resource.TerminationPointBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.response.parameters.sp.ResponseParametersBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.response.parameters.sp.response.parameters.PathDescriptionBuilder;
 import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.Uint32;
 
 public class ServicehandlerImplTest extends AbstractTest {
 
@@ -339,6 +355,9 @@ public class ServicehandlerImplTest extends AbstractTest {
         result.addListener(() -> endSignal.countDown(), executorService);
 
         endSignal.await();
+
+        Assert.assertEquals(ResponseCodes.RESPONSE_FAILED,
+                result.get().getResult().getConfigurationResponseCommon().getResponseCode());
     }
 
     @Test
@@ -353,25 +372,80 @@ public class ServicehandlerImplTest extends AbstractTest {
         result.addListener(() -> endSignal.countDown(), executorService);
 
         endSignal.await();
+
+        Assert.assertEquals(ResponseCodes.RESPONSE_FAILED,
+                result.get().getResult().getConfigurationResponseCommon().getResponseCode());
     }
 
     @Test
     public void serviceRerouteShouldBeSuccessForExistingService() throws ExecutionException, InterruptedException {
-        // serviceReroute is calling service delete method in renderer
-        Mockito.when(rendererServiceOperations.serviceDelete(any(), any())).thenReturn(Futures.immediateFuture(any()));
-        //create service to be rerouted later
-        ServicehandlerImpl servicehandlerImpl = new ServicehandlerImpl(getNewDataBroker(), pathComputationService,
-                rendererServiceOperations, notificationPublishService, pceListenerImpl, rendererListenerImpl,
-                networkModelListenerImpl, serviceDataStoreOperations);
-        serviceDataStoreOperations.createService(serviceCreateInput);
+        Mockito.when(pathComputationService.pathComputationRerouteRequest(any()))
+                .thenReturn(Futures.immediateFuture(new PathComputationRerouteRequestOutputBuilder()
+                        .setConfigurationResponseCommon(new ConfigurationResponseCommonBuilder()
+                                .setResponseCode(ResponseCodes.RESPONSE_OK)
+                                .build())
+                        .build()));
+        Map<AToZKey, AToZ> atoz = Map.of(
+                new AToZKey("0"),
+                new AToZBuilder()
+                        .setId("0")
+                        .setResource(new ResourceBuilder()
+                                .setResource(new TerminationPointBuilder()
+                                        .setTpNodeId("tpNodeIdC")
+                                        .setTpId("TpIdC1")
+                                        .build())
+                                .setState(State.InService)
+                                .build())
+                        .build(),
+                new AToZKey("1"),
+                new AToZBuilder()
+                        .setId("1")
+                        .setResource(new ResourceBuilder()
+                                .setResource(new TerminationPointBuilder()
+                                        .setTpNodeId("tpNodeIdD")
+                                        .setTpId("TpIdCD")
+                                        .build())
+                                .setState(State.InService)
+                                .build())
+                        .build(), new AToZKey("2"),
+                new AToZBuilder()
+                        .setId("2")
+                        .setResource(new ResourceBuilder()
+                                .setResource(new TerminationPointBuilder()
+                                        .setTpNodeId("tpNodeIdA")
+                                        .setTpId("TpIdA1")
+                                        .build())
+                                .setState(State.InService)
+                                .build())
+                        .build()
+
+        );
+        serviceDataStoreOperations.createServicePath(new ServiceInput(serviceCreateInput),
+                new PathComputationRequestOutputBuilder()
+                        .setResponseParameters(new ResponseParametersBuilder()
+                                .setPathDescription(new PathDescriptionBuilder()
+                                        .setAToZDirection(new AToZDirectionBuilder()
+                                                .setAToZ(atoz)
+                                                .setRate(Uint32.valueOf(1))
+                                                .build())
+                                        .setZToADirection(new ZToADirectionBuilder()
+                                                .setRate(Uint32.valueOf(1))
+                                                .build())
+                                        .build())
+                                .build())
+                        .build());
 
-        //service reroute test action
-        //ServiceRerouteInput is created with the same service information that is created before
-        ListenableFuture<RpcResult<ServiceRerouteOutput>> result = servicehandlerImpl.serviceReroute(
-                serviceRerouteInput);
+        serviceDataStoreOperations.createService(serviceCreateInput);
+        ListenableFuture<RpcResult<ServiceRerouteOutput>> result =  new ServicehandlerImpl(getNewDataBroker(),
+                pathComputationService, rendererServiceOperations, notificationPublishService, pceListenerImpl,
+                rendererListenerImpl, networkModelListenerImpl, serviceDataStoreOperations)
+                .serviceReroute(serviceRerouteInput);
         result.addListener(() -> endSignal.countDown(), executorService);
 
         endSignal.await();
+
+        Assert.assertEquals(
+                ResponseCodes.RESPONSE_OK, result.get().getResult().getConfigurationResponseCommon().getResponseCode());
     }
 
     @Test
index f94d94b3e770187e95231cb537b89452769c9254..4471263cfd3c53cd343d922b296b2543b1c152fe 100755 (executable)
@@ -29,6 +29,7 @@ import org.opendaylight.mdsal.binding.api.DataObjectModification;
 import org.opendaylight.mdsal.binding.api.DataTreeModification;
 import org.opendaylight.mdsal.binding.api.NotificationPublishService;
 import org.opendaylight.transportpce.common.ResponseCodes;
+import org.opendaylight.transportpce.pce.service.PathComputationService;
 import org.opendaylight.transportpce.servicehandler.impl.ServicehandlerImpl;
 import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.node.types.rev210528.NodeIdType;
@@ -55,6 +56,7 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.re
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.format.rev191129.ServiceFormat;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateOutputBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceDeleteOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRerouteOutputBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.list.Services;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.list.ServicesBuilder;
 import org.opendaylight.yang.gen.v1.nbi.notifications.rev211013.PublishNotificationAlarmService;
@@ -72,6 +74,8 @@ public class ServiceListenerTest {
     private ServiceDataStoreOperations serviceDataStoreOperations;
     @Mock
     private NotificationPublishService notificationPublishService;
+    @Mock
+    private PathComputationService pathComputationService;
 
     @Test
     public void testOnDataTreeChangedWhenDeleteService() {
@@ -180,6 +184,15 @@ public class ServiceListenerTest {
                                                 .build())
                                 .build())
                         .buildFuture());
+        when(servicehandler.serviceReroute(any())).thenReturn(
+                RpcResultBuilder.success(
+                        new ServiceRerouteOutputBuilder()
+                                .setConfigurationResponseCommon(
+                                        new ConfigurationResponseCommonBuilder()
+                                                .setResponseCode(ResponseCodes.RESPONSE_OK)
+                                                .build())
+                                .build())
+                        .buildFuture());
         when(servicehandler.serviceCreate(any())).thenReturn(
                 RpcResultBuilder.success(
                         new ServiceCreateOutputBuilder()
index 06d10b6992e3ec2751b08b8b68f95f0b7148cb18..e13e55f40048392402e9385eb875fc87ab13d517 100644 (file)
@@ -24,12 +24,12 @@ import org.opendaylight.transportpce.common.ResponseCodes;
 import org.opendaylight.transportpce.pce.service.PathComputationService;
 import org.opendaylight.transportpce.servicehandler.utils.ServiceDataUtils;
 import org.opendaylight.transportpce.test.AbstractTest;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.CancelResourceReserveInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.CancelResourceReserveOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.CancelResourceReserveOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.PathComputationRequestInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.PathComputationRequestOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.PathComputationRequestOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.CancelResourceReserveInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.CancelResourceReserveOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.CancelResourceReserveOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestOutputBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ServiceNotificationTypes;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.configuration.response.common.ConfigurationResponseCommon;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.configuration.response.common.ConfigurationResponseCommonBuilder;
index d3ee49ce7c0754c4b95b21f72a489cec5e3edaf8..5fa8aba6fef70627c42a151139ff8fe295927be5 100644 (file)
@@ -19,8 +19,8 @@ import org.opendaylight.transportpce.common.ResponseCodes;
 import org.opendaylight.transportpce.servicehandler.ServiceInput;
 import org.opendaylight.transportpce.servicehandler.utils.ServiceDataUtils;
 import org.opendaylight.transportpce.test.AbstractTest;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.PathComputationRequestOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.PathComputationRequestOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestOutputBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.configuration.response.common.ConfigurationResponseCommon;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.configuration.response.common.ConfigurationResponseCommonBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
index 46461dd6bd9bf9c4a87864c51822df7ac523334a..d476a64696b91a15285b29f9740380a9b12413c8 100644 (file)
@@ -9,12 +9,12 @@ package org.opendaylight.transportpce.servicehandler.utils;
 
 import com.google.common.util.concurrent.ListenableFuture;
 import org.opendaylight.transportpce.servicehandler.ServiceInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.PathComputationRequestOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.path.computation.request.input.ServiceAEnd;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.path.computation.request.input.ServiceAEndBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.path.computation.request.input.ServiceZEnd;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.path.computation.request.input.ServiceZEndBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.service.path.rpc.result.PathDescription;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.path.computation.request.input.ServiceAEnd;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.path.computation.request.input.ServiceAEndBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.path.computation.request.input.ServiceZEnd;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.path.computation.request.input.ServiceZEndBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.service.path.rpc.result.PathDescription;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteInputBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceImplementationRequestInput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceImplementationRequestInputBuilder;
index 18b86a159a85d7ceee5940d1daee748ce30e15ed..e5939034c59505d8f444d8a2ba25727635893f31 100644 (file)
@@ -17,12 +17,12 @@ import java.util.Map;
 import java.util.concurrent.Callable;
 import java.util.concurrent.Executors;
 import org.opendaylight.transportpce.servicehandler.ModelMappingUtils;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.PathComputationRequestInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.PathComputationRequestInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.ServicePathRpcResult;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.ServicePathRpcResultBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.service.path.rpc.result.PathDescription;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.service.path.rpc.result.PathDescriptionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.ServicePathRpcResult;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.ServicePathRpcResultBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.service.path.rpc.result.PathDescription;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.service.path.rpc.result.PathDescriptionBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.RendererRpcResultSp;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.RendererRpcResultSpBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.servicehandler.rev201125.ServiceRpcResultSh;
index a65d9fa676fcac68525f2fa8e088d9c16833e143..e8924b3654f38bb589645f265ed1785053e56f80 100644 (file)
@@ -15,7 +15,7 @@ Author: Martial Coulibaly <martial.coulibaly@gfi.com> on behalf of Orange
   <parent>
     <groupId>org.opendaylight.mdsal</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>10.0.1</version>
+    <version>10.0.2</version>
     <relativePath/>
   </parent>
 
@@ -29,7 +29,7 @@ Author: Martial Coulibaly <martial.coulibaly@gfi.com> on behalf of Orange
       <dependency>
         <groupId>org.opendaylight.netconf</groupId>
         <artifactId>netconf-artifacts</artifactId>
-        <version>4.0.1</version>
+        <version>4.0.2</version>
         <scope>import</scope>
         <type>pom</type>
       </dependency>
index 0f87998752fc82b895f5338895f6c4de0bd69478..31f8ed8b659bb0c70ba31e8e942f715e7982b5eb 100644 (file)
@@ -33,7 +33,7 @@ import org.opendaylight.transportpce.tapi.utils.TapiContext;
 import org.opendaylight.transportpce.tapi.utils.TapiInitialORMapping;
 import org.opendaylight.transportpce.tapi.utils.TapiLink;
 import org.opendaylight.transportpce.tapi.utils.TapiListener;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.TransportpcePceListener;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.TransportpcePceListener;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.Network;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.TransportpceRendererListener;
index d7d75b7758a9707208493922f1a0b307684f871e..959b8d6b0324630626177ea4642d1a4b49e4a25c 100644 (file)
@@ -24,10 +24,10 @@ import org.opendaylight.transportpce.common.network.NetworkTransactionImpl;
 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
 import org.opendaylight.transportpce.common.network.RequestProcessor;
 import org.opendaylight.transportpce.tapi.TapiStringConstants;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.ServicePathRpcResult;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.TransportpcePceListener;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.service.path.rpc.result.PathDescription;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220615.service.path.rpc.result.PathDescriptionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.ServicePathRpcResult;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.TransportpcePceListener;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.service.path.rpc.result.PathDescription;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.service.path.rpc.result.PathDescriptionBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.Network;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.MappingKey;
index 2332db230379527058205c4a349590b06e358ff7..b65351cb5fa4b59e86de276d3d298876b1965231 100644 (file)
@@ -12,7 +12,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
   <parent>
     <groupId>org.opendaylight.mdsal</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>10.0.1</version>
+    <version>10.0.2</version>
     <relativePath/>
   </parent>
 
index aa9ff06abee4511a1500bceefdb44e67f0f8686c..1e7991ea94edb963960228e68bf28a37ee2d25ad 100644 (file)
@@ -12,7 +12,7 @@
   <parent>
     <groupId>org.opendaylight.mdsal</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>10.0.1</version>
+    <version>10.0.2</version>
     <relativePath/>
   </parent>
 
@@ -26,7 +26,7 @@
       <dependency>
         <groupId>org.opendaylight.netconf</groupId>
         <artifactId>netconf-artifacts</artifactId>
-        <version>4.0.1</version>
+        <version>4.0.2</version>
         <scope>import</scope>
         <type>pom</type>
       </dependency>
index e9fca26d07bf4c9c286f5f0e8a187f4a0c52091b..c27c5e8b7a777d27f5c91e61cf93eaba51ca9489 100644 (file)
@@ -224,8 +224,8 @@ class TransportPCEtesting(unittest.TestCase):
         self.assertIn('XPDR1-CLIENT4-ODU2e-x-XPDR1-NETWORK1-ODU2e',
                       response['output']['node-interface'][0]['connection-id'])
         self.assertIn('XPDR1-CLIENT4-ETHERNET10G', response['output']['node-interface'][0]['eth-interface-id'])
-        self.assertIn('XPDR1-NETWORK1-ODU2e', response['output']['node-interface'][0]['odu-interface-id'])
-        self.assertIn('XPDR1-CLIENT4-ODU2e', response['output']['node-interface'][0]['odu-interface-id'])
+        self.assertIn('XPDR1-NETWORK1-ODU2e:service1', response['output']['node-interface'][0]['odu-interface-id'])
+        self.assertIn('XPDR1-CLIENT4-ODU2e:service1', response['output']['node-interface'][0]['odu-interface-id'])
 
     def test_12_check_interface_10GE_CLIENT(self):
         response = test_utils.check_node_attribute_request("SPDR-SA1", "interface", "XPDR1-CLIENT4-ETHERNET10G")
@@ -242,10 +242,10 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_13_check_interface_ODU2E_CLIENT(self):
         response = test_utils.check_node_attribute_request(
-            "SPDR-SA1", "interface", "XPDR1-CLIENT4-ODU2e")
+            "SPDR-SA1", "interface", "XPDR1-CLIENT4-ODU2e:service1")
         self.assertEqual(response['status_code'], requests.codes.ok)
 
-        input_dict_1 = {'name': 'XPDR1-CLIENT4-ODU2e',
+        input_dict_1 = {'name': 'XPDR1-CLIENT4-ODU2e:service1',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-SFP4',
                         'supporting-interface': 'XPDR1-CLIENT4-ETHERNET10G',
@@ -267,9 +267,9 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_14_check_interface_ODU2E_NETWORK(self):
         response = test_utils.check_node_attribute_request(
-            "SPDR-SA1", "interface", "XPDR1-NETWORK1-ODU2e")
+            "SPDR-SA1", "interface", "XPDR1-NETWORK1-ODU2e:service1")
         self.assertEqual(response['status_code'], requests.codes.ok)
-        input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU2e', 'administrative-state': 'inService',
+        input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU2e:service1', 'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-CFP0',
                         'supporting-interface': 'XPDR1-NETWORK1-ODU4',
                         'type': 'org-openroadm-interfaces:otnOdu',
@@ -308,9 +308,9 @@ class TransportPCEtesting(unittest.TestCase):
 
         self.assertDictEqual(dict(response['odu-connection'][0], **input_dict_1),
                              response['odu-connection'][0])
-        self.assertDictEqual({'dst-if': 'XPDR1-NETWORK1-ODU2e'},
+        self.assertDictEqual({'dst-if': 'XPDR1-NETWORK1-ODU2e:service1'},
                              response['odu-connection'][0]['destination'])
-        self.assertDictEqual({'src-if': 'XPDR1-CLIENT4-ODU2e'},
+        self.assertDictEqual({'src-if': 'XPDR1-CLIENT4-ODU2e:service1'},
                              response['odu-connection'][0]['source'])
 
     def test_16_otn_service_path_delete_10GE(self):
@@ -337,12 +337,12 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_18_check_no_interface_ODU2E_NETWORK(self):
         response = test_utils.check_node_attribute_request(
-            "SPDR-SA1", "interface", "XPDR1-NETWORK1-ODU2e")
+            "SPDR-SA1", "interface", "XPDR1-NETWORK1-ODU2e:service1")
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_19_check_no_interface_ODU2E_CLIENT(self):
         response = test_utils.check_node_attribute_request(
-            "SPDR-SA1", "interface", "XPDR1-CLIENT4-ODU2e")
+            "SPDR-SA1", "interface", "XPDR1-CLIENT4-ODU2e:service1")
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_20_check_no_interface_10GE_CLIENT(self):
index a035f38e97e47e01986d27961753c739af90016d..effe77bb0b2b595f57e03f0d6d3092b54e8bf5ec 100644 (file)
@@ -516,9 +516,9 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_13_check_interface_ODU2E_CLIENT(self):
         response = test_utils.check_node_attribute_request(
-            "SPDR-SA1", "interface", "XPDR1-CLIENT1-ODU2e")
+            "SPDR-SA1", "interface", "XPDR1-CLIENT1-ODU2e:SPDRA-SPDRC-10G")
         self.assertEqual(response['status_code'], requests.codes.ok)
-        input_dict_1 = {'name': 'XPDR1-CLIENT1-ODU2e',
+        input_dict_1 = {'name': 'XPDR1-CLIENT1-ODU2e:SPDRA-SPDRC-10G',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-SFP4',
                         'supporting-interface': 'XPDR1-CLIENT1-ETHERNET10G',
@@ -550,16 +550,16 @@ class TransportPCEtesting(unittest.TestCase):
         }
         self.assertDictEqual(dict(input_dict_1, **response['odu-connection'][0]),
                              response['odu-connection'][0])
-        self.assertDictEqual({'dst-if': 'XPDR1-NETWORK1-ODU2e'},
+        self.assertDictEqual({'dst-if': 'XPDR1-NETWORK1-ODU2e:SPDRA-SPDRC-10G'},
                              response['odu-connection'][0]['destination'])
-        self.assertDictEqual({'src-if': 'XPDR1-CLIENT1-ODU2e'},
+        self.assertDictEqual({'src-if': 'XPDR1-CLIENT1-ODU2e:SPDRA-SPDRC-10G'},
                              response['odu-connection'][0]['source'])
 
     def test_15_check_interface_ODU2E_NETWORK(self):
         response = test_utils.check_node_attribute_request(
-            "SPDR-SA1", "interface", "XPDR1-NETWORK1-ODU2e")
+            "SPDR-SA1", "interface", "XPDR1-NETWORK1-ODU2e:SPDRA-SPDRC-10G")
         self.assertEqual(response['status_code'], requests.codes.ok)
-        input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU2e',
+        input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU2e-SPDRA:SPDRC-10G',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-CFP0',
                         'supporting-interface': 'XPDR1-NETWORK1-ODU4',
@@ -588,9 +588,9 @@ class TransportPCEtesting(unittest.TestCase):
     # Test the interfaces on SPDR-C1
     def test_16_check_interface_ODU2E_NETWORK(self):
         response = test_utils.check_node_attribute_request(
-            "SPDR-SC1", "interface", "XPDR1-NETWORK1-ODU2e")
+            "SPDR-SC1", "interface", "XPDR1-NETWORK1-ODU2e:SPDRA-SPDRC-10G")
         self.assertEqual(response['status_code'], requests.codes.ok)
-        input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU2e',
+        input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU2e:SPDRA-SPDRC-10G',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-CFP0',
                         'supporting-interface': 'XPDR1-NETWORK1-ODU4',
@@ -631,9 +631,9 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_18_check_interface_ODU2E_CLIENT(self):
         response = test_utils.check_node_attribute_request(
-            "SPDR-SC1", "interface", "XPDR1-CLIENT1-ODU2e")
+            "SPDR-SC1", "interface", "XPDR1-CLIENT1-ODU2e:SPDRA-SPDRC-10G")
         self.assertEqual(response['status_code'], requests.codes.ok)
-        input_dict_1 = {'name': 'XPDR1-CLIENT1-ODU2e',
+        input_dict_1 = {'name': 'XPDR1-CLIENT1-ODU2e-SPDRA-SPDRC-10G',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-SFP4',
                         'supporting-interface': 'XPDR1-CLIENT1-ETHERNET10G',
@@ -664,16 +664,16 @@ class TransportPCEtesting(unittest.TestCase):
         }
         self.assertDictEqual(dict(input_dict_1, **response['odu-connection'][0]),
                              response['odu-connection'][0])
-        self.assertDictEqual({'dst-if': 'XPDR1-NETWORK1-ODU2e'},
+        self.assertDictEqual({'dst-if': 'XPDR1-NETWORK1-ODU2e:SPDRA-SPDRC-10G'},
                              response['odu-connection'][0]['destination'])
-        self.assertDictEqual({'src-if': 'XPDR1-CLIENT1-ODU2e'},
+        self.assertDictEqual({'src-if': 'XPDR1-CLIENT1-ODU2e:SPDRA-SPDRC-10G'},
                              response['odu-connection'][0]['source'])
 
     def test_20_check_interface_ODU2E_NETWORK(self):
         response = test_utils.check_node_attribute_request(
-            "SPDR-SC1", "interface", "XPDR1-NETWORK1-ODU2e")
+            "SPDR-SC1", "interface", "XPDR1-NETWORK1-ODU2e:SPDRA-SPDRC-10G")
         self.assertEqual(response['status_code'], requests.codes.ok)
-        input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU2e',
+        input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU2e:SPDRA-SPDRC-10G',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-CFP0',
                         'supporting-interface': 'XPDR1-NETWORK1-ODU4',
index 02398aa8306da675152b32135d310cadece54314..b6181acf60a4bab1f4ba366cb910a0b27439c1f7 100644 (file)
@@ -609,9 +609,9 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_32_check_interface_ODU2E_CLIENT_spdra(self):
         response = test_utils.check_node_attribute_request(
-            'SPDR-SA1', 'interface', 'XPDR1-CLIENT1-ODU2e')
+            'SPDR-SA1', 'interface', 'XPDR1-CLIENT1-ODU2e:service1-10GE')
         self.assertEqual(response['status_code'], requests.codes.ok)
-        input_dict_1 = {'name': 'XPDR1-CLIENT1-ODU2e',
+        input_dict_1 = {'name': 'XPDR1-CLIENT1-ODU2e:service1-10GE',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-SFP4',
                         'supporting-interface': 'XPDR1-CLIENT1-ETHERNET10G',
@@ -633,9 +633,9 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_33_check_interface_ODU2E_NETWORK_spdra(self):
         response = test_utils.check_node_attribute_request(
-            'SPDR-SA1', 'interface', 'XPDR1-NETWORK1-ODU2e')
+            'SPDR-SA1', 'interface', 'XPDR1-NETWORK1-ODU2e:service1-10GE')
         self.assertEqual(response['status_code'], requests.codes.ok)
-        input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU2e',
+        input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU2e:service1-10GE',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-CFP0',
                         'supporting-interface': 'XPDR1-NETWORK1-ODU4',
@@ -671,9 +671,9 @@ class TransportPCEtesting(unittest.TestCase):
 
         self.assertDictEqual(dict(input_dict_1, **response['odu-connection'][0]),
                              response['odu-connection'][0])
-        self.assertDictEqual({'dst-if': 'XPDR1-NETWORK1-ODU2e'},
+        self.assertDictEqual({'dst-if': 'XPDR1-NETWORK1-ODU2e:service1-10GE'},
                              response['odu-connection'][0]['destination'])
-        self.assertDictEqual({'src-if': 'XPDR1-CLIENT1-ODU2e'},
+        self.assertDictEqual({'src-if': 'XPDR1-CLIENT1-ODU2e:service1-10GE'},
                              response['odu-connection'][0]['source'])
 
     def test_35_check_interface_10GE_CLIENT_spdrc(self):
@@ -694,9 +694,9 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_36_check_interface_ODU2E_CLIENT_spdrc(self):
         response = test_utils.check_node_attribute_request(
-            'SPDR-SC1', 'interface', 'XPDR1-CLIENT1-ODU2e')
+            'SPDR-SC1', 'interface', 'XPDR1-CLIENT1-ODU2e:service1-10GE')
         self.assertEqual(response['status_code'], requests.codes.ok)
-        input_dict_1 = {'name': 'XPDR1-CLIENT1-ODU2e',
+        input_dict_1 = {'name': 'XPDR1-CLIENT1-ODU2e:service1-10GE',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-SFP4',
                         'supporting-interface': 'XPDR1-CLIENT1-ETHERNET10G',
@@ -718,9 +718,9 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_37_check_interface_ODU2E_NETWORK_spdrc(self):
         response = test_utils.check_node_attribute_request(
-            'SPDR-SC1', 'interface', 'XPDR1-NETWORK1-ODU2e')
+            'SPDR-SC1', 'interface', 'XPDR1-NETWORK1-ODU2e:service1-10GE')
         self.assertEqual(response['status_code'], requests.codes.ok)
-        input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU2e',
+        input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU2e:service1-10GE',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-CFP0',
                         'supporting-interface': 'XPDR1-NETWORK1-ODU4',
@@ -760,9 +760,9 @@ class TransportPCEtesting(unittest.TestCase):
 
         self.assertDictEqual(dict(input_dict_1, **response['odu-connection'][0]),
                              response['odu-connection'][0])
-        self.assertDictEqual({'dst-if': 'XPDR1-NETWORK1-ODU2e'},
+        self.assertDictEqual({'dst-if': 'XPDR1-NETWORK1-ODU2e:service1-10GE'},
                              response['odu-connection'][0]['destination'])
-        self.assertDictEqual({'src-if': 'XPDR1-CLIENT1-ODU2e'},
+        self.assertDictEqual({'src-if': 'XPDR1-CLIENT1-ODU2e:service1-10GE'},
                              response['odu-connection'][0]['source'])
 
     def test_39_check_otn_topo_links(self):
@@ -1117,9 +1117,9 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_73_check_interface_ODU0_CLIENT_spdra(self):
         response = test_utils.check_node_attribute_request(
-            'SPDR-SA1', 'interface', 'XPDR3-CLIENT1-ODU0')
+            'SPDR-SA1', 'interface', 'XPDR3-CLIENT1-ODU0:service1-1GE')
         self.assertEqual(response['status_code'], requests.codes.ok)
-        input_dict_1 = {'name': 'XPDR3-CLIENT1-ODU0',
+        input_dict_1 = {'name': 'XPDR3-CLIENT1-ODU0:service1-1GE',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP3-SFP1',
                         'supporting-interface': 'XPDR3-CLIENT1-ETHERNET1G',
@@ -1140,9 +1140,9 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_74_check_interface_ODU0_NETWORK_spdra(self):
         response = test_utils.check_node_attribute_request(
-            'SPDR-SA1', 'interface', 'XPDR3-NETWORK1-ODU0')
+            'SPDR-SA1', 'interface', 'XPDR3-NETWORK1-ODU0:service1-1GE')
         self.assertEqual(response['status_code'], requests.codes.ok)
-        input_dict_1 = {'name': 'XPDR3-NETWORK1-ODU0',
+        input_dict_1 = {'name': 'XPDR3-NETWORK1-ODU0:service1-1GE',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP3-CFP0',
                         'supporting-interface': 'XPDR3-NETWORK1-ODU4',
@@ -1176,9 +1176,9 @@ class TransportPCEtesting(unittest.TestCase):
         }
         self.assertDictEqual(dict(input_dict_1, **response['odu-connection'][0]),
                              response['odu-connection'][0])
-        self.assertDictEqual({'dst-if': 'XPDR3-NETWORK1-ODU0'},
+        self.assertDictEqual({'dst-if': 'XPDR3-NETWORK1-ODU0:service1-1GE'},
                              response['odu-connection'][0]['destination'])
-        self.assertDictEqual({'src-if': 'XPDR3-CLIENT1-ODU0'},
+        self.assertDictEqual({'src-if': 'XPDR3-CLIENT1-ODU0:service1-1GE'},
                              response['odu-connection'][0]['source'])
 
     def test_76_check_interface_1GE_CLIENT_spdrc(self):
@@ -1199,9 +1199,9 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_77_check_interface_ODU0_CLIENT_spdrc(self):
         response = test_utils.check_node_attribute_request(
-            'SPDR-SC1', 'interface', 'XPDR3-CLIENT1-ODU0')
+            'SPDR-SC1', 'interface', 'XPDR3-CLIENT1-ODU0:service1-1GE')
         self.assertEqual(response['status_code'], requests.codes.ok)
-        input_dict_1 = {'name': 'XPDR3-CLIENT1-ODU0',
+        input_dict_1 = {'name': 'XPDR3-CLIENT1-ODU0:service1-1GE',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP3-SFP1',
                         'supporting-interface': 'XPDR3-CLIENT1-ETHERNET1G',
@@ -1222,9 +1222,9 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_78_check_interface_ODU0_NETWORK_spdrc(self):
         response = test_utils.check_node_attribute_request(
-            'SPDR-SC1', 'interface', 'XPDR3-NETWORK1-ODU0')
+            'SPDR-SC1', 'interface', 'XPDR3-NETWORK1-ODU0:service1-1GE')
         self.assertEqual(response['status_code'], requests.codes.ok)
-        input_dict_1 = {'name': 'XPDR3-NETWORK1-ODU0',
+        input_dict_1 = {'name': 'XPDR3-NETWORK1-ODU0:service1-1GE',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP3-CFP0',
                         'supporting-interface': 'XPDR3-NETWORK1-ODU4',
@@ -1261,9 +1261,9 @@ class TransportPCEtesting(unittest.TestCase):
         }
         self.assertDictEqual(dict(input_dict_1, **response['odu-connection'][0]),
                              response['odu-connection'][0])
-        self.assertDictEqual({'dst-if': 'XPDR3-NETWORK1-ODU0'},
+        self.assertDictEqual({'dst-if': 'XPDR3-NETWORK1-ODU0:service1-1GE'},
                              response['odu-connection'][0]['destination'])
-        self.assertDictEqual({'src-if': 'XPDR3-CLIENT1-ODU0'},
+        self.assertDictEqual({'src-if': 'XPDR3-CLIENT1-ODU0:service1-1GE'},
                              response['odu-connection'][0]['source'])
 
     def test_80_check_otn_topo_links(self):
@@ -1317,12 +1317,12 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_85_check_no_interface_ODU0_NETWORK_spdra(self):
         response = test_utils.check_node_attribute_request(
-            'SPDR-SA1', 'interface', 'XPDR3-NETWORK1-ODU0-service1')
+            'SPDR-SA1', 'interface', 'XPDR3-NETWORK1-ODU0:service1-1GE')
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_86_check_no_interface_ODU0_CLIENT_spdra(self):
         response = test_utils.check_node_attribute_request(
-            'SPDR-SA1', 'interface', 'XPDR3-CLIENT1-ODU0-service1')
+            'SPDR-SA1', 'interface', 'XPDR3-CLIENT1-ODU0:service1-1GE')
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_87_check_no_interface_10GE_CLIENT_spdra(self):
index 8a2f924fdebc99f7a0c116ea38dd5a92e13c1691..c0c6505561e01168324eac41a676245ea59fd592 100644 (file)
@@ -751,9 +751,9 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_043_check_interface_ODU2E_CLIENT_spdra(self):
         response = test_utils.check_node_attribute_request(
-            'SPDR-SA1', 'interface', 'XPDR1-CLIENT1-ODU2e')
+            'SPDR-SA1', 'interface', 'XPDR1-CLIENT1-ODU2e:service1-10GE')
         self.assertEqual(response['status_code'], requests.codes.ok)
-        input_dict_1 = {'name': 'XPDR1-CLIENT1-ODU2e',
+        input_dict_1 = {'name': 'XPDR1-CLIENT1-ODU2e:service1-10GE',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-SFP4',
                         'supporting-interface': 'XPDR1-CLIENT1-ETHERNET10G',
@@ -779,7 +779,7 @@ class TransportPCEtesting(unittest.TestCase):
             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
 
         response2 = test_utils.check_node_attribute_request(
-            'SPDR-SC1', 'interface', 'XPDR1-CLIENT1-ODU2e')
+            'SPDR-SC1', 'interface', 'XPDR1-CLIENT1-ODU2e:service1-10GE')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(input_dict_2['tx-sapi'],
                          response2['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['tx-dapi'])
@@ -792,9 +792,9 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_044_check_interface_ODU2E_NETWORK_spdra(self):
         response = test_utils.check_node_attribute_request(
-            'SPDR-SA1', 'interface', 'XPDR1-NETWORK1-ODU2e')
+            'SPDR-SA1', 'interface', 'XPDR1-NETWORK1-ODU2e:service1-10GE')
         self.assertEqual(response['status_code'], requests.codes.ok)
-        input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU2e',
+        input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU2e:service1-10GE',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-CFP0',
                         'supporting-interface': 'XPDR1-NETWORK1-ODU4',
@@ -830,9 +830,9 @@ class TransportPCEtesting(unittest.TestCase):
         }
         self.assertDictEqual(dict(input_dict_1, **response['odu-connection'][0]),
                              response['odu-connection'][0])
-        self.assertDictEqual({'dst-if': 'XPDR1-NETWORK1-ODU2e'},
+        self.assertDictEqual({'dst-if': 'XPDR1-NETWORK1-ODU2e:service1-10GE'},
                              response['odu-connection'][0]['destination'])
-        self.assertDictEqual({'src-if': 'XPDR1-CLIENT1-ODU2e'},
+        self.assertDictEqual({'src-if': 'XPDR1-CLIENT1-ODU2e:service1-10GE'},
                              response['odu-connection'][0]['source'])
 
     def test_046_check_interface_10GE_CLIENT_spdrc(self):
@@ -851,9 +851,9 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_047_check_interface_ODU2E_CLIENT_spdrc(self):
         response = test_utils.check_node_attribute_request(
-            'SPDR-SC1', 'interface', 'XPDR1-CLIENT1-ODU2e')
+            'SPDR-SC1', 'interface', 'XPDR1-CLIENT1-ODU2e:service1-10GE')
         self.assertEqual(response['status_code'], requests.codes.ok)
-        input_dict_1 = {'name': 'XPDR1-CLIENT1-ODU2e',
+        input_dict_1 = {'name': 'XPDR1-CLIENT1-ODU2e:service1-10GE',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-SFP4',
                         'supporting-interface': 'XPDR1-CLIENT1-ETHERNET10G',
@@ -879,7 +879,7 @@ class TransportPCEtesting(unittest.TestCase):
             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
 
         response2 = test_utils.check_node_attribute_request(
-            'SPDR-SA1', 'interface', 'XPDR1-CLIENT1-ODU2e')
+            'SPDR-SA1', 'interface', 'XPDR1-CLIENT1-ODU2e:service1-10GE')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(input_dict_2['tx-sapi'],
                          response2['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['tx-dapi'])
@@ -892,9 +892,9 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_048_check_interface_ODU2E_NETWORK_spdrc(self):
         response = test_utils.check_node_attribute_request(
-            'SPDR-SC1', 'interface', 'XPDR1-NETWORK1-ODU2e')
+            'SPDR-SC1', 'interface', 'XPDR1-NETWORK1-ODU2e:service1-10GE')
         self.assertEqual(response['status_code'], requests.codes.ok)
-        input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU2e',
+        input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU2e:service1-10GE',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-CFP0',
                         'supporting-interface': 'XPDR1-NETWORK1-ODU4',
@@ -930,9 +930,9 @@ class TransportPCEtesting(unittest.TestCase):
         }
         self.assertDictEqual(dict(input_dict_1, **response['odu-connection'][0]),
                              response['odu-connection'][0])
-        self.assertDictEqual({'dst-if': 'XPDR1-NETWORK1-ODU2e'},
+        self.assertDictEqual({'dst-if': 'XPDR1-NETWORK1-ODU2e:service1-10GE'},
                              response['odu-connection'][0]['destination'])
-        self.assertDictEqual({'src-if': 'XPDR1-CLIENT1-ODU2e'},
+        self.assertDictEqual({'src-if': 'XPDR1-CLIENT1-ODU2e:service1-10GE'},
                              response['odu-connection'][0]['source'])
 
     def test_050_check_otn_topo_links(self):
@@ -990,12 +990,12 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_055_check_no_interface_ODU2E_NETWORK_spdra(self):
         response = test_utils.check_node_attribute_request(
-            'SPDR-SA1', 'interface', 'XPDR1-NETWORK1-ODU2e')
+            'SPDR-SA1', 'interface', 'XPDR1-NETWORK1-ODU2e:service1-10GE')
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_056_check_no_interface_ODU2E_CLIENT_spdra(self):
         response = test_utils.check_node_attribute_request(
-            'SPDR-SA1', 'interface', 'XPDR1-CLIENT1-ODU2e')
+            'SPDR-SA1', 'interface', 'XPDR1-CLIENT1-ODU2e:service1-10GE')
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_057_check_no_interface_10GE_CLIENT_spdra(self):
@@ -1355,9 +1355,9 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_078_check_interface_ODU2E_NETWORK1_spdrb(self):
         response = test_utils.check_node_attribute_request(
-            'SPDR-SB1', 'interface', 'XPDR2-NETWORK1-ODU2e')
+            'SPDR-SB1', 'interface', 'XPDR2-NETWORK1-ODU2e:service1-10GE')
         self.assertEqual(response['status_code'], requests.codes.ok)
-        input_dict_1 = {'name': 'XPDR2-NETWORK1-ODU2e',
+        input_dict_1 = {'name': 'XPDR2-NETWORK1-ODU2e:service1-10GE',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-CFP0',
                         'supporting-interface': 'XPDR2-NETWORK1-ODU4',
@@ -1383,9 +1383,9 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_079_check_interface_ODU2E_NETWORK2_spdrb(self):
         response = test_utils.check_node_attribute_request(
-            'SPDR-SB1', 'interface', 'XPDR2-NETWORK2-ODU2e')
+            'SPDR-SB1', 'interface', 'XPDR2-NETWORK2-ODU2e:service1-10GE')
         self.assertEqual(response['status_code'], requests.codes.ok)
-        input_dict_1 = {'name': 'XPDR2-NETWORK2-ODU2e',
+        input_dict_1 = {'name': 'XPDR2-NETWORK2-ODU2e:service1-10GE',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-CFP0',
                         'supporting-interface': 'XPDR2-NETWORK2-ODU4',
@@ -1418,12 +1418,11 @@ class TransportPCEtesting(unittest.TestCase):
             'XPDR2-NETWORK1-ODU2e-x-XPDR2-NETWORK2-ODU2e',
             'direction': 'bidirectional'
         }
-
         self.assertDictEqual(dict(input_dict_1, **response['odu-connection'][0]),
                              response['odu-connection'][0])
-        self.assertDictEqual({'dst-if': 'XPDR2-NETWORK2-ODU2e'},
+        self.assertDictEqual({'dst-if': 'XPDR2-NETWORK2-ODU2e:service1-10GE'},
                              response['odu-connection'][0]['destination'])
-        self.assertDictEqual({'src-if': 'XPDR2-NETWORK1-ODU2e'},
+        self.assertDictEqual({'src-if': 'XPDR2-NETWORK1-ODU2e:service1-10GE'},
                              response['odu-connection'][0]['source'])
 
     def test_081_check_otn_topo_links(self):
@@ -1474,12 +1473,12 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_087_check_no_interface_ODU2E_NETWORK1_spdrb(self):
         response = test_utils.check_node_attribute_request(
-            'SPDR-SB1', 'interface', 'XPDR2-NETWORK1-ODU2e')
+            'SPDR-SB1', 'interface', 'XPDR2-NETWORK1-ODU2e-service1-10GE')
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_088_check_no_interface_ODU2E_NETWORK2_spdrb(self):
         response = test_utils.check_node_attribute_request(
-            'SPDR-SB1', 'interface', 'XPDR2-NETWORK2-ODU2e')
+            'SPDR-SB1', 'interface', 'XPDR2-NETWORK2-ODU2e-service1-10GE')
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_089_check_otn_topo_links(self):
index 65f9cdcf0f46fd1b3214cfe1f0f9b5fb5f0fb2d5..a0a4c1ed6e888b5f41e21d8c6c50773beab2ad01 100644 (file)
@@ -238,9 +238,9 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
         self.assertIn('XPDR2-CLIENT1-ODU4-x-XPDR2-NETWORK1-ODU4',
                       response['output']['node-interface'][0]['connection-id'])
         self.assertIn('XPDR2-CLIENT1-ETHERNET-100G', response['output']['node-interface'][0]['eth-interface-id'])
-        self.assertIn('XPDR2-NETWORK1-ODU4',
+        self.assertIn('XPDR2-NETWORK1-ODU4:service_Ethernet',
                       response['output']['node-interface'][0]['odu-interface-id'])
-        self.assertIn('XPDR2-CLIENT1-ODU4',
+        self.assertIn('XPDR2-CLIENT1-ODU4:service_Ethernet',
                       response['output']['node-interface'][0]['odu-interface-id'])
 
     def test_11_check_interface_100ge_client(self):
@@ -262,9 +262,9 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
 
     def test_12_check_interface_odu4_client(self):
         response = test_utils.check_node_attribute_request(
-            "XPDR-A2", "interface", "XPDR2-CLIENT1-ODU4")
+            "XPDR-A2", "interface", "XPDR2-CLIENT1-ODU4:service_Ethernet")
         self.assertEqual(response['status_code'], requests.codes.ok)
-        input_dict_1 = {'name': 'XPDR2-CLIENT1-ODU4',
+        input_dict_1 = {'name': 'XPDR2-CLIENT1-ODU4:service_Ethernet',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': '1/2/1/1-PLUG-CLIENT',
                         'supporting-interface-list': 'XPDR2-CLIENT1-ETHERNET-100G',
@@ -286,9 +286,9 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
 
     def test_13_check_interface_odu4_network(self):
         response = test_utils.check_node_attribute_request(
-            "XPDR-A2", "interface", "XPDR2-NETWORK1-ODU4")
+            "XPDR-A2", "interface", "XPDR2-NETWORK1-ODU4:service_Ethernet")
         self.assertEqual(response['status_code'], requests.codes.ok)
-        input_dict_1 = {'name': 'XPDR2-NETWORK1-ODU4',
+        input_dict_1 = {'name': 'XPDR2-NETWORK1-ODU4:service_Ethernet',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': '1/2/2-PLUG-NET',
                         'supporting-interface-list': 'XPDR2-NETWORK1-ODUC2',
@@ -321,15 +321,15 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
         self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {
             'connection-name':
-            'XPDR2-CLIENT1-ODU4-x-XPDR2-NETWORK1-ODU4',
+            'XPDR2-NETWORK1-ODU4-x-XPDR2-CLIENT1-ODU4',
             'direction': 'bidirectional'
         }
 
         self.assertDictEqual(dict(input_dict_1, **response['odu-connection'][0]),
                              response['odu-connection'][0])
-        self.assertDictEqual({'dst-if': 'XPDR2-NETWORK1-ODU4'},
+        self.assertDictEqual({'dst-if': 'XPDR2-NETWORK1-ODU4:service_Ethernet'},
                              response['odu-connection'][0]['destination'])
-        self.assertDictEqual({'src-if': 'XPDR2-CLIENT1-ODU4'},
+        self.assertDictEqual({'src-if': 'XPDR2-CLIENT1-ODU4:service_Ethernet'},
                              response['odu-connection'][0]['source'])
 
     # 1d) Delete Ethernet device interfaces
@@ -357,12 +357,12 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
 
     def test_17_check_no_interface_odu_network(self):
         response = test_utils.check_node_attribute_request(
-            "XPDR-A2", "interface", "XPDR2-NETWORK1-ODU4")
+            "XPDR-A2", "interface", "XPDR2-NETWORK1-ODU4:service_Ethernet")
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_18_check_no_interface_odu_client(self):
         response = test_utils.check_node_attribute_request(
-            "XPDR-A2", "interface", "XPDR2-CLIENT1-ODU4")
+            "XPDR-A2", "interface", "XPDR2-CLIENT1-ODU4:service_Ethernet")
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_19_check_no_interface_100ge_client(self):
index 6c9d74aaf5e0bc1c654b4d0b43868d630a3cdc18..01fbd36bdf5e485c1db2c40fa669f9d994f897d3 100644 (file)
@@ -610,9 +610,9 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_32_check_interface_ODU4_CLIENT_xpdra2(self):
         response = test_utils.check_node_attribute_request(
-            'XPDR-A2', 'interface', 'XPDR2-CLIENT1-ODU4')
+            'XPDR-A2', 'interface', 'XPDR2-CLIENT1-ODU4:service-100GE')
         self.assertEqual(response['status_code'], requests.codes.ok)
-        input_dict_1 = {'name': 'XPDR2-CLIENT1-ODU4',
+        input_dict_1 = {'name': 'XPDR2-CLIENT1-ODU4:service-100GE',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': '1/2/1/1-PLUG-CLIENT',
                         'supporting-interface-list': 'XPDR2-CLIENT1-ETHERNET-100G',
@@ -634,9 +634,9 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_33_check_interface_ODU4_NETWORK_xpdra2(self):
         response = test_utils.check_node_attribute_request(
-            'XPDR-A2', 'interface', 'XPDR2-NETWORK1-ODU4')
+            'XPDR-A2', 'interface', 'XPDR2-NETWORK1-ODU4:service-100GE')
         self.assertEqual(response['status_code'], requests.codes.ok)
-        input_dict_1 = {'name': 'XPDR2-NETWORK1-ODU4',
+        input_dict_1 = {'name': 'XPDR2-NETWORK1-ODU4:service-100GE',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': '1/2/2-PLUG-NET',
                         'supporting-interface-list': 'XPDR2-NETWORK1-ODUC4',
@@ -674,9 +674,9 @@ class TransportPCEtesting(unittest.TestCase):
 
         self.assertDictEqual(dict(input_dict_1, **response['odu-connection'][0]),
                              response['odu-connection'][0])
-        self.assertDictEqual({'dst-if': 'XPDR2-NETWORK1-ODU4'},
+        self.assertDictEqual({'dst-if': 'XPDR2-NETWORK1-ODU4:service-100GE'},
                              response['odu-connection'][0]['destination'])
-        self.assertDictEqual({'src-if': 'XPDR2-CLIENT1-ODU4'},
+        self.assertDictEqual({'src-if': 'XPDR2-CLIENT1-ODU4:service-100GE'},
                              response['odu-connection'][0]['source'])
 
     def test_35_check_interface_100GE_CLIENT_xpdrc2(self):
@@ -698,9 +698,9 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_36_check_interface_ODU4_CLIENT_xpdrc2(self):
         response = test_utils.check_node_attribute_request(
-            'XPDR-C2', 'interface', 'XPDR2-CLIENT1-ODU4')
+            'XPDR-C2', 'interface', 'XPDR2-CLIENT1-ODU4:service-100GE')
         self.assertEqual(response['status_code'], requests.codes.ok)
-        input_dict_1 = {'name': 'XPDR2-CLIENT1-ODU4',
+        input_dict_1 = {'name': 'XPDR2-CLIENT1-ODU4:service-100GE',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': '1/2/1/1-PLUG-CLIENT',
                         'supporting-interface-list': 'XPDR2-CLIENT1-ETHERNET-100G',
@@ -722,9 +722,9 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_37_check_interface_ODU4_NETWORK_xpdrc2(self):
         response = test_utils.check_node_attribute_request(
-            'XPDR-C2', 'interface', 'XPDR2-NETWORK1-ODU4')
+            'XPDR-C2', 'interface', 'XPDR2-NETWORK1-ODU4:service-100GE')
         self.assertEqual(response['status_code'], requests.codes.ok)
-        input_dict_1 = {'name': 'XPDR2-NETWORK1-ODU4',
+        input_dict_1 = {'name': 'XPDR2-NETWORK1-ODU4:service-100GE',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': '1/2/2-PLUG-NET',
                         'supporting-interface-list': 'XPDR2-NETWORK1-ODUC4',
@@ -768,9 +768,9 @@ class TransportPCEtesting(unittest.TestCase):
 
         self.assertDictEqual(dict(input_dict_1, **response['odu-connection'][0]),
                              response['odu-connection'][0])
-        self.assertDictEqual({'dst-if': 'XPDR2-NETWORK1-ODU4'},
+        self.assertDictEqual({'dst-if': 'XPDR2-NETWORK1-ODU4:service-100GE'},
                              response['odu-connection'][0]['destination'])
-        self.assertDictEqual({'src-if': 'XPDR2-CLIENT1-ODU4'},
+        self.assertDictEqual({'src-if': 'XPDR2-CLIENT1-ODU4:service-100GE'},
                              response['odu-connection'][0]['source'])
 
     def test_39_check_otn_topo_links(self):
@@ -901,12 +901,12 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_50_check_no_interface_ODU4_NETWORK_xpdra2(self):
         response = test_utils.check_node_attribute_request(
-            'XPDR-A2', 'interface', 'XPDR2-NETWORK1-ODU4')
+            'XPDR-A2', 'interface', 'XPDR2-NETWORK1-ODU4:service-100GE')
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_51_check_no_interface_ODU4_CLIENT_xpdra2(self):
         response = test_utils.check_node_attribute_request(
-            'XPDR-A2', 'interface', 'XPDR2-CLIENT1-ODU4')
+            'XPDR-A2', 'interface', 'XPDR2-CLIENT1-ODU4:service-100GE')
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_52_check_no_interface_100GE_CLIENT_xpdra2(self):
index 217b7e591b71f2b5521f6e8186bb2811dcb39a03..5053ae23911733c6e1eb1f04068dd5cf6825edac 100644 (file)
@@ -758,71 +758,211 @@ class TransportPCEtesting(unittest.TestCase):
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Roadm Xponder links created successfully', response["output"]["result"])
 
-    def test_10_connect_xprda2_3_N1_to_roadma_PP2(self):
+    def test_10_add_omsAttributes_roadma_roadmc(self):
+        # Config ROADMA-ROADMC oms-attributes
+        data = {"span": {
+            "auto-spanloss": "true",
+            "spanloss-base": 11.4,
+            "spanloss-current": 12,
+            "engineered-spanloss": 12.2,
+            "link-concatenation": [{
+                "SRLG-Id": 0,
+                "fiber-type": "smf",
+                "SRLG-length": 100000,
+                "pmd": 0.5}]}}
+        response = test_utils.add_oms_attr_request("ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX", data)
+        self.assertEqual(response.status_code, requests.codes.created)
+
+    def test_11_add_omsAttributes_roadmc_roadma(self):
+        # Config ROADMC-ROADMA oms-attributes
+        data = {"span": {
+            "auto-spanloss": "true",
+            "spanloss-base": 11.4,
+            "spanloss-current": 12,
+            "engineered-spanloss": 12.2,
+            "link-concatenation": [{
+                "SRLG-Id": 0,
+                "fiber-type": "smf",
+                "SRLG-length": 100000,
+                "pmd": 0.5}]}}
+        response = test_utils.add_oms_attr_request("ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX", data)
+        self.assertEqual(response.status_code, requests.codes.created)
+
+    # test service-create for Eth service from xpdr to xpdr with service-resiliency
+    def test_12_create_eth_service1_with_service_resiliency_restorable(self):
+        self.cr_serv_input_data["service-name"] = "service1"
+        response = test_utils.transportpce_api_rpc_request('org-openroadm-service', 'service-create',
+                                                           self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('PCE calculation in progress',
+                      response['output']['configuration-response-common']['response-message'])
+        time.sleep(self.WAITING)
+
+    def test_13_get_eth_service1(self):
+        response = test_utils.get_ordm_serv_list_attr_request("services", "service1")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['services'][0]['administrative-state'], 'inService')
+        self.assertEqual(response['services'][0]['service-name'], 'service1')
+        self.assertEqual(response['services'][0]['connection-type'], 'service')
+        self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
+        self.assertEqual(response['services'][0]['service-resiliency']['resiliency'],
+                         'org-openroadm-common-service-types:restorable')
+        time.sleep(1)
+
+    # Degrade ROADM-A1-ROADM-C1 link
+    def test_14_set_pm_ROADMA_OTS_DEG2_TTP_TXRX_OpticalPowerInput(self):
+        url = "{}/operations/pm-handling:pm-interact"
+        body = {
+            "input": {
+                "rpc-action": "set",
+                "pm-to-be-set-or-created": {
+                    "current-pm-entry": [
+                        {
+                            "pm-resource-instance": "/org-openroadm-device:org-openroadm-device/org-openroadm-device"
+                                                    ":interface[org-openroadm-device:name='OTS-DEG2-TTP-TXRX']",
+                            "pm-resource-type": "interface",
+                            "pm-resource-type-extension": "",
+                            "current-pm": [
+                                {
+                                    "type": "opticalPowerInput",
+                                    "extension": "",
+                                    "location": "nearEnd",
+                                    "direction": "rx",
+                                    "measurement": [
+                                        {
+                                            "granularity": "15min",
+                                            "pmParameterValue": -30,
+                                            "pmParameterUnit": "dBm",
+                                            "validity": "complete"
+                                        },
+                                        {
+                                            "granularity": "24Hour",
+                                            "pmParameterValue": -21.3,
+                                            "pmParameterUnit": "dBm",
+                                            "validity": "complete"
+                                        }
+                                    ]
+                                }
+                            ]
+                        }
+                    ]
+                }
+            }
+        }
+        response = requests.request("POST", url.format("http://127.0.0.1:8141/restconf"),
+                                    data=json.dumps(body), headers=test_utils.TYPE_APPLICATION_JSON,
+                                    auth=(test_utils.ODL_LOGIN, test_utils.ODL_PWD),
+                                    timeout=test_utils.REQUEST_TIMEOUT)
+        self.assertEqual(response.status_code, requests.codes.ok)
+        self.assertEqual(response.json()['output']['status-message'], "The PMs has been successfully set !")
+        time.sleep(2)
+
+    def test_15_get_eth_service1(self):
+        response = test_utils.get_ordm_serv_list_attr_request("services", "service1")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['services'][0]['operational-state'], 'outOfService')
+        self.assertEqual(response['services'][0]['administrative-state'], 'inService')
+        self.assertEqual(response['services'][0]['service-name'], 'service1')
+        self.assertEqual(response['services'][0]['connection-type'], 'service')
+        self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
+        self.assertEqual(response['services'][0]['service-resiliency']['resiliency'],
+                         'org-openroadm-common-service-types:restorable')
+        time.sleep(1)
+
+    def test_16_service_reroute_service1(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-reroute',
+            {
+                "sdnc-request-header": {
+                    "request-id": "request-1",
+                    "rpc-action": "service-reroute",
+                    "request-system-id": "appname"
+                },
+                "service-name": "service1",
+                "service-resiliency": {
+                    "resiliency": "org-openroadm-common-service-types:restorable"
+                }
+            })
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('500', response['output']['configuration-response-common']['response-code'])
+        self.assertIn('No path available by PCE',
+                      response['output']['configuration-response-common']['response-message'])
+        time.sleep(2)
+
+    # Restore ROADM-A1-ROADM-C1 link
+    def test_17_clear_pm_ROADMA_OTS_DEG2_TTP_TXRX_OpticalPowerInput(self):
+        url = "{}/operations/pm-handling:pm-interact"
+        body = {
+            "input": {
+                "rpc-action": "clear",
+                "pm-to-get-clear-or-delete": {
+                    "current-pm-entry": [
+                        {
+                            "pm-resource-instance": "/org-openroadm-device:org-openroadm-device/org-openroadm-device"
+                                                    ":interface[org-openroadm-device:name='OTS-DEG2-TTP-TXRX']",
+                            "pm-resource-type": "interface",
+                            "pm-resource-type-extension": "",
+                            "current-pm": [
+                                {
+                                    "type": "opticalPowerInput",
+                                    "extension": "",
+                                    "location": "nearEnd",
+                                    "direction": "rx"
+                                }
+                            ]
+                        }
+                    ]
+                }
+            }
+        }
+        response = requests.request("POST", url.format("http://127.0.0.1:8141/restconf"),
+                                    data=json.dumps(body), headers=test_utils.TYPE_APPLICATION_JSON,
+                                    auth=(test_utils.ODL_LOGIN, test_utils.ODL_PWD),
+                                    timeout=test_utils.REQUEST_TIMEOUT)
+        self.assertEqual(response.status_code, requests.codes.ok)
+        self.assertEqual(response.json()['output']['status-message'], "The PMs has been successfully released !")
+        time.sleep(2)
+
+    def test_18_get_eth_service1(self):
+        self.test_13_get_eth_service1()
+
+    def test_19_connect_xprda2_3_N1_to_roadma_PP2(self):
         response = test_utils.transportpce_api_rpc_request(
             'transportpce-networkutils', 'init-xpdr-rdm-links',
             {'links-input': {'xpdr-node': 'XPDR-A2', 'xpdr-num': '3', 'network-num': '1',
                              'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP2-TXRX'}})
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"])
+        time.sleep(2)
 
-    def test_11_connect_roadma_PP2_to_xpdra2_3_N1(self):
+    def test_20_connect_roadma_PP2_to_xpdra2_3_N1(self):
         response = test_utils.transportpce_api_rpc_request(
             'transportpce-networkutils', 'init-rdm-xpdr-links',
             {'links-input': {'xpdr-node': 'XPDR-A2', 'xpdr-num': '3', 'network-num': '1',
                              'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP2-TXRX'}})
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Roadm Xponder links created successfully', response["output"]["result"])
+        time.sleep(2)
 
-    def test_12_connect_xprdc2_3_N1_to_roadmc_PP2(self):
+    def test_21_connect_xprdc2_3_N1_to_roadmc_PP2(self):
         response = test_utils.transportpce_api_rpc_request(
             'transportpce-networkutils', 'init-xpdr-rdm-links',
             {'links-input': {'xpdr-node': 'XPDR-C2', 'xpdr-num': '3', 'network-num': '1',
                              'rdm-node': 'ROADM-C1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP2-TXRX'}})
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"])
+        time.sleep(2)
 
-    def test_13_connect_roadmc_PP2_to_xpdrc2_3_N1(self):
+    def test_22_connect_roadmc_PP2_to_xpdrc2_3_N1(self):
         response = test_utils.transportpce_api_rpc_request(
             'transportpce-networkutils', 'init-rdm-xpdr-links',
             {'links-input': {'xpdr-node': 'XPDR-C2', 'xpdr-num': '3', 'network-num': '1',
                              'rdm-node': 'ROADM-C1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP2-TXRX'}})
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Roadm Xponder links created successfully', response["output"]["result"])
+        time.sleep(2)
 
-    def test_14_add_omsAttributes_roadma_roadmc(self):
-        # Config ROADMA-ROADMC oms-attributes
-        data = {"span": {
-            "auto-spanloss": "true",
-            "spanloss-base": 11.4,
-            "spanloss-current": 12,
-            "engineered-spanloss": 12.2,
-            "link-concatenation": [{
-                "SRLG-Id": 0,
-                "fiber-type": "smf",
-                "SRLG-length": 100000,
-                "pmd": 0.5}]}}
-        response = test_utils.add_oms_attr_request(
-            "ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX", data)
-        self.assertEqual(response.status_code, requests.codes.created)
-
-    def test_15_add_omsAttributes_roadmc_roadma(self):
-        # Config ROADMC-ROADMA oms-attributes
-        data = {"span": {
-            "auto-spanloss": "true",
-            "spanloss-base": 11.4,
-            "spanloss-current": 12,
-            "engineered-spanloss": 12.2,
-            "link-concatenation": [{
-                "SRLG-Id": 0,
-                "fiber-type": "smf",
-                "SRLG-length": 100000,
-                "pmd": 0.5}]}}
-        response = test_utils.add_oms_attr_request(
-            "ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX", data)
-        self.assertEqual(response.status_code, requests.codes.created)
-
-    def test_16_add_omsAttributes_roadma_roadmb(self):
+    def test_23_add_omsAttributes_roadma_roadmb(self):
         # Config ROADMA-ROADMB oms-attributes
         data = {"span": {
             "auto-spanloss": "true",
@@ -834,11 +974,10 @@ class TransportPCEtesting(unittest.TestCase):
                 "fiber-type": "smf",
                 "SRLG-length": 100000,
                 "pmd": 0.5}]}}
-        response = test_utils.add_oms_attr_request(
-            "ROADM-A1-DEG1-DEG1-TTP-TXRXtoROADM-B1-DEG1-DEG1-TTP-TXRX", data)
+        response = test_utils.add_oms_attr_request("ROADM-A1-DEG1-DEG1-TTP-TXRXtoROADM-B1-DEG1-DEG1-TTP-TXRX", data)
         self.assertEqual(response.status_code, requests.codes.created)
 
-    def test_17_add_omsAttributes_roadmb_roadma(self):
+    def test_24_add_omsAttributes_roadmb_roadma(self):
         # Config ROADMB-ROADMA oms-attributes
         data = {"span": {
             "auto-spanloss": "true",
@@ -850,11 +989,10 @@ class TransportPCEtesting(unittest.TestCase):
                 "fiber-type": "smf",
                 "SRLG-length": 100000,
                 "pmd": 0.5}]}}
-        response = test_utils.add_oms_attr_request(
-            "ROADM-B1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG1-DEG1-TTP-TXRX", data)
+        response = test_utils.add_oms_attr_request("ROADM-B1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG1-DEG1-TTP-TXRX", data)
         self.assertEqual(response.status_code, requests.codes.created)
 
-    def test_18_add_omsAttributes_roadmb_roadmc(self):
+    def test_25_add_omsAttributes_roadmb_roadmc(self):
         # Config ROADMB-ROADMC oms-attributes
         data = {"span": {
             "auto-spanloss": "true",
@@ -866,11 +1004,10 @@ class TransportPCEtesting(unittest.TestCase):
                 "fiber-type": "smf",
                 "SRLG-length": 100000,
                 "pmd": 0.5}]}}
-        response = test_utils.add_oms_attr_request(
-            "ROADM-B1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG2-DEG2-TTP-TXRX", data)
+        response = test_utils.add_oms_attr_request("ROADM-B1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG2-DEG2-TTP-TXRX", data)
         self.assertEqual(response.status_code, requests.codes.created)
 
-    def test_19_add_omsAttributes_roadmc_roadmb(self):
+    def test_26_add_omsAttributes_roadmc_roadmb(self):
         # Config ROADMC-ROADMB oms-attributes
         data = {"span": {
             "auto-spanloss": "true",
@@ -882,11 +1019,10 @@ class TransportPCEtesting(unittest.TestCase):
                 "fiber-type": "smf",
                 "SRLG-length": 100000,
                 "pmd": 0.5}]}}
-        response = test_utils.add_oms_attr_request(
-            "ROADM-C1-DEG2-DEG2-TTP-TXRXtoROADM-B1-DEG2-DEG2-TTP-TXRX", data)
+        response = test_utils.add_oms_attr_request("ROADM-C1-DEG2-DEG2-TTP-TXRXtoROADM-B1-DEG2-DEG2-TTP-TXRX", data)
         self.assertEqual(response.status_code, requests.codes.created)
 
-    def test_20_create_OTS_ROADMA_DEG1(self):
+    def test_27_create_OTS_ROADMA_DEG1(self):
         response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'create-ots-oms',
             {
@@ -897,7 +1033,7 @@ class TransportPCEtesting(unittest.TestCase):
         self.assertIn('Interfaces OTS-DEG1-TTP-TXRX - OMS-DEG1-TTP-TXRX successfully created on node ROADM-A1',
                       response["output"]["result"])
 
-    def test_21_create_OTS_ROADMC_DEG2(self):
+    def test_28_create_OTS_ROADMC_DEG2(self):
         response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'create-ots-oms',
             {
@@ -908,7 +1044,7 @@ class TransportPCEtesting(unittest.TestCase):
         self.assertIn('Interfaces OTS-DEG2-TTP-TXRX - OMS-DEG2-TTP-TXRX successfully created on node ROADM-C1',
                       response["output"]["result"])
 
-    def test_22_create_OTS_ROADMB_DEG1(self):
+    def test_29_create_OTS_ROADMB_DEG1(self):
         response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'create-ots-oms',
             {
@@ -919,7 +1055,7 @@ class TransportPCEtesting(unittest.TestCase):
         self.assertIn('Interfaces OTS-DEG1-TTP-TXRX - OMS-DEG1-TTP-TXRX successfully created on node ROADM-B1',
                       response["output"]["result"])
 
-    def test_23_create_OTS_ROADMB_DEG2(self):
+    def test_30_create_OTS_ROADMB_DEG2(self):
         response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'create-ots-oms',
             {
@@ -930,7 +1066,7 @@ class TransportPCEtesting(unittest.TestCase):
         self.assertIn('Interfaces OTS-DEG2-TTP-TXRX - OMS-DEG2-TTP-TXRX successfully created on node ROADM-B1',
                       response["output"]["result"])
 
-    def test_24_calculate_span_loss_base_all(self):
+    def test_31_calculate_span_loss_base_all(self):
         response = test_utils.transportpce_api_rpc_request(
             'transportpce-olm', 'calculate-spanloss-base',
             {
@@ -964,50 +1100,27 @@ class TransportPCEtesting(unittest.TestCase):
         }, response["output"]["spans"])
         time.sleep(1)
 
-    # test service-create for Eth service from xpdr to xpdr with service-resiliency
-    def test_25_create_eth_service1_with_service_resiliency_restorable(self):
-        response = test_utils.transportpce_api_rpc_request(
-            'org-openroadm-service', 'service-create',
-            self.cr_serv_input_data)
-        self.assertEqual(response['status_code'], requests.codes.ok)
-        self.assertIn('PCE calculation in progress',
-                      response['output']['configuration-response-common']['response-message'])
-        time.sleep(self.WAITING)
-
-    def test_26_get_eth_service1(self):
-        response = test_utils.get_ordm_serv_list_attr_request("services", "service1")
-        self.assertEqual(response['status_code'], requests.codes.ok)
-        self.assertEqual(response['services'][0]['administrative-state'], 'inService')
-        self.assertEqual(response['services'][0]['service-name'], 'service1')
-        self.assertEqual(response['services'][0]['connection-type'], 'service')
-        self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
-        self.assertEqual(
-            response['services'][0]['service-resiliency']['resiliency'],
-            'org-openroadm-common-service-types:restorable')
-        time.sleep(1)
-
-    def test_27_get_service_path_service_1(self):
+    def test_32_get_service_path_service_1(self):
         response = test_utils.get_serv_path_list_attr("service-paths", "service1")
         self.assertEqual(response['status_code'], requests.codes.ok)
-        self.assertCountEqual(
-            self.service_path_service_1_AtoZ,
-            response['service-paths'][0]['path-description']['aToZ-direction']['aToZ'])
+        self.assertCountEqual(self.service_path_service_1_AtoZ,
+                              response['service-paths'][0]['path-description']['aToZ-direction']['aToZ'])
 
     # test service-create for Eth service from xpdr to xpdr without service-resiliency
-    def test_28_create_eth_service2_without_service_resiliency(self):
+    def test_33_create_eth_service2_without_service_resiliency(self):
         self.cr_serv_input_data["service-name"] = "service2"
         del self.cr_serv_input_data["service-resiliency"]
-        response = test_utils.transportpce_api_rpc_request(
-            'org-openroadm-service', 'service-create',
-            self.cr_serv_input_data)
+        response = test_utils.transportpce_api_rpc_request('org-openroadm-service', 'service-create',
+                                                           self.cr_serv_input_data)
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('PCE calculation in progress',
                       response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
-    def test_29_get_eth_service2(self):
+    def test_34_get_eth_service2(self):
         response = test_utils.get_ordm_serv_list_attr_request("services", "service2")
         self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['services'][0]['operational-state'], 'inService')
         self.assertEqual(response['services'][0]['administrative-state'], 'inService')
         self.assertEqual(response['services'][0]['service-name'], 'service2')
         self.assertEqual(response['services'][0]['connection-type'], 'service')
@@ -1015,7 +1128,7 @@ class TransportPCEtesting(unittest.TestCase):
         self.assertNotIn('service-resiliency', response['services'][0])
         time.sleep(1)
 
-    def test_30_get_service_path_service_2(self):
+    def test_35_get_service_path_service_2(self):
         response = test_utils.get_serv_path_list_attr("service-paths", "service2")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertCountEqual(
@@ -1023,7 +1136,7 @@ class TransportPCEtesting(unittest.TestCase):
             response['service-paths'][0]['path-description']['aToZ-direction']['aToZ'])
 
     # Degrade ROADM-A1-ROADM-C1 link
-    def test_31_set_pm_ROADMA_OTS_DEG2_TTP_TXRX_OpticalPowerInput(self):
+    def test_36_set_pm_ROADMA_OTS_DEG2_TTP_TXRX_OpticalPowerInput(self):
         url = "{}/operations/pm-handling:pm-interact"
         body = {
             "input": {
@@ -1070,17 +1183,17 @@ class TransportPCEtesting(unittest.TestCase):
         self.assertEqual(response.json()['output']['status-message'], "The PMs has been successfully set !")
         time.sleep(self.WAITING * 2)
 
-    def test_32_get_eth_service1(self):
-        self.test_26_get_eth_service1()
+    def test_37_get_eth_service1(self):
+        self.test_13_get_eth_service1()
 
-    def test_33_get_service_path_service_1(self):
+    def test_38_get_service_path_service_1(self):
         response = test_utils.get_serv_path_list_attr("service-paths", "service1")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertCountEqual(
             self.service_path_service_1_rerouted_AtoZ,
             response['service-paths'][0]['path-description']['aToZ-direction']['aToZ'])
 
-    def test_34_get_eth_service2(self):
+    def test_39_get_eth_service2(self):
         response = test_utils.get_ordm_serv_list_attr_request("services", "service2")
         self.assertEqual(response['services'][0]['operational-state'], 'outOfService')
         self.assertEqual(response['services'][0]['administrative-state'], 'inService')
@@ -1090,7 +1203,7 @@ class TransportPCEtesting(unittest.TestCase):
         self.assertNotIn('service-resiliency', response['services'])
         time.sleep(1)
 
-    def test_35_get_service_path_service_2(self):
+    def test_40_get_service_path_service_2(self):
         response = test_utils.get_serv_path_list_attr("service-paths", "service2")
         self.assertEqual(response['status_code'], requests.codes.ok)
         index = self.service_path_service_2_AtoZ.index(
@@ -1115,7 +1228,7 @@ class TransportPCEtesting(unittest.TestCase):
                               response['service-paths'][0]['path-description']['aToZ-direction']['aToZ'])
 
     # Restore ROADM-A1-ROADM-C1 link
-    def test_36_clear_pm_ROADMA_OTS_DEG2_TTP_TXRX_OpticalPowerInput(self):
+    def test_41_clear_pm_ROADMA_OTS_DEG2_TTP_TXRX_OpticalPowerInput(self):
         url = "{}/operations/pm-handling:pm-interact"
         body = {
             "input": {
@@ -1148,19 +1261,19 @@ class TransportPCEtesting(unittest.TestCase):
         self.assertEqual(response.json()['output']['status-message'], "The PMs has been successfully released !")
         time.sleep(2)
 
-    def test_37_get_eth_service1(self):
-        self.test_26_get_eth_service1()
+    def test_42_get_eth_service1(self):
+        self.test_13_get_eth_service1()
 
-    def test_38_get_service_path_service_1(self):
-        self.test_33_get_service_path_service_1()
+    def test_43_get_service_path_service_1(self):
+        self.test_38_get_service_path_service_1()
 
-    def test_39_get_eth_service2(self):
-        self.test_29_get_eth_service2()
+    def test_44_get_eth_service2(self):
+        self.test_34_get_eth_service2()
 
-    def test_40_get_service_path_service_2(self):
-        self.test_30_get_service_path_service_2()
+    def test_45_get_service_path_service_2(self):
+        self.test_35_get_service_path_service_2()
 
-    def test_41_delete_eth_service2(self):
+    def test_46_delete_eth_service2(self):
         self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service2"
         response = test_utils.transportpce_api_rpc_request(
             'org-openroadm-service', 'service-delete',
@@ -1170,7 +1283,7 @@ class TransportPCEtesting(unittest.TestCase):
                       response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
-    def test_42_delete_eth_service1(self):
+    def test_47_delete_eth_service1(self):
         self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service1"
         response = test_utils.transportpce_api_rpc_request(
             'org-openroadm-service', 'service-delete',
@@ -1180,7 +1293,7 @@ class TransportPCEtesting(unittest.TestCase):
                       response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
-    def test_43_disconnect_xponders_from_roadm(self):
+    def test_48_disconnect_xponders_from_roadm(self):
         response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         links = response['network'][0]['ietf-network-topology:link']
@@ -1190,23 +1303,23 @@ class TransportPCEtesting(unittest.TestCase):
                     'openroadm-topology', link['link-id'], 'config')
                 self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
-    def test_44_disconnect_xpdra2(self):
+    def test_49_disconnect_xpdra2(self):
         response = test_utils.unmount_device("XPDR-A2")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
-    def test_45_disconnect_xpdrc2(self):
+    def test_50_disconnect_xpdrc2(self):
         response = test_utils.unmount_device("XPDR-C2")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
-    def test_46_disconnect_roadmA(self):
+    def test_51_disconnect_roadmA(self):
         response = test_utils.unmount_device("ROADM-A1")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
-    def test_47_disconnect_roadmB(self):
+    def test_52_disconnect_roadmB(self):
         response = test_utils.unmount_device("ROADM-B1")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
-    def test_48_disconnect_roadmC(self):
+    def test_53_disconnect_roadmC(self):
         response = test_utils.unmount_device("ROADM-C1")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))