--- /dev/null
+diff --git a/servicehandler/pom.xml b/servicehandler/pom.xml
+index 43085f6..8a9699a 100644
+--- a/servicehandler/pom.xml
++++ b/servicehandler/pom.xml
+@@ -67,6 +67,11 @@ Author: Martial Coulibaly <martial.coulibaly@gfi.com> on behalf of Orange
+ <artifactId>transportpce-pce</artifactId>
+ <version>${project.version}</version>
+ </dependency>
++ <dependency>
++ <groupId>${project.groupId}</groupId>
++ <artifactId>transportpce-stubrenderer</artifactId>
++ <version>${project.version}</version>
++ </dependency>
+
+ <!-- Testing Dependencies -->
+ <dependency>
+diff --git a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/ModelMappingUtils.java b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/ModelMappingUtils.java
+index 2b0ee83..2899617 100644
+--- a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/ModelMappingUtils.java
++++ b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/ModelMappingUtils.java
+@@ -7,8 +7,6 @@
+ */
+ package org.opendaylight.transportpce.servicehandler;
+
+-import java.util.ArrayList;
+-import java.util.List;
+ import java.util.concurrent.Future;
+ import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev170426.PathComputationRequestOutput;
+ import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev170426.path.computation.request.input.ServiceAEnd;
+@@ -18,8 +16,6 @@ import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev17
+ import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev161014.configuration.response.common.ConfigurationResponseCommon;
+ import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev161014.configuration.response.common.ConfigurationResponseCommonBuilder;
+ import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev161014.response.parameters.ResponseParametersBuilder;
+-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev161014.service.Topology;
+-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev161014.service.TopologyBuilder;
+ import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.LifecycleState;
+ import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.State;
+ import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev161014.ServiceCreateInput;
+@@ -31,12 +27,6 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev161014.Service
+ import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev161014.ServiceReconfigureInput;
+ import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev161014.service.list.Services;
+ import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev161014.service.list.ServicesBuilder;
+-import org.opendaylight.yang.gen.v1.http.org.openroadm.topology.rev161014.topology.AToZ;
+-import org.opendaylight.yang.gen.v1.http.org.openroadm.topology.rev161014.topology.AToZBuilder;
+-import org.opendaylight.yang.gen.v1.http.org.openroadm.topology.rev161014.topology.AToZKey;
+-import org.opendaylight.yang.gen.v1.http.org.openroadm.topology.rev161014.topology.ZToA;
+-import org.opendaylight.yang.gen.v1.http.org.openroadm.topology.rev161014.topology.ZToABuilder;
+-import org.opendaylight.yang.gen.v1.http.org.openroadm.topology.rev161014.topology.ZToAKey;
+ import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.routing.constraints.rev170426.routing.constraints.sp.HardConstraintsBuilder;
+ import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.routing.constraints.rev170426.routing.constraints.sp.SoftConstraintsBuilder;
+ import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev170426.service.endpoint.sp.RxDirection;
+@@ -237,42 +227,6 @@ public final class ModelMappingUtils {
+ .setSoftConstraints(serviceReconfigureInput.getSoftConstraints())
+ .setLifecycleState(LifecycleState.Planned).setServiceAEnd(aend).setServiceZEnd(zend);
+ }
+-
+- org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev170426.response
+- .parameters.sp.ResponseParameters responseParameters = output.getResponseParameters();
+- if (responseParameters != null) {
+- // service.setPceMetric(responseParameters.getPceMetric());
+- org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev170426
+- .response.parameters.sp.response.parameters.PathDescription pathDescription =
+- responseParameters.getPathDescription();
+- if (pathDescription != null) {
+- List<AToZ> atozList = new ArrayList<>();
+- List<ZToA> ztoaList = new ArrayList<>();
+-
+- for (org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev170426
+- .path.description.atoz.direction.AToZ tmp : pathDescription.getAToZDirection().getAToZ()) {
+-
+- AToZKey key = new AToZKey(tmp.getKey().getId());
+- AToZ atoz = new AToZBuilder().setId(tmp.getId()).setKey(key)
+- // .setResource(tmp.getResource())
+- .build();
+- atozList.add(atoz);
+- }
+-
+- for (org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev170426
+- .path.description.ztoa.direction.ZToA
+- tmp : pathDescription.getZToADirection().getZToA()) {
+- ZToAKey key = new ZToAKey(tmp.getKey().getId());
+- ZToA ztoa = new ZToABuilder().setId(tmp.getId()).setKey(key)
+- // .setResource(tmp.getResource())
+- .build();
+- ztoaList.add(ztoa);
+- }
+-
+- Topology topology = new TopologyBuilder().setAToZ(atozList).setZToA(ztoaList).build();
+- service.setTopology(topology);
+- }
+- }
+ return service.build();
+ }
+
+diff --git a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/ServicehandlerImpl.java b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/ServicehandlerImpl.java
+index 5dc24b3..714e2b3 100644
+--- a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/ServicehandlerImpl.java
++++ b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/ServicehandlerImpl.java
+@@ -12,7 +12,6 @@ import java.time.format.DateTimeFormatter;
+ import java.util.Optional;
+ import java.util.concurrent.ExecutionException;
+ import java.util.concurrent.Future;
+-
+ import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+ import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
+ import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+@@ -27,6 +26,7 @@ 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.ServicehandlerCompliancyCheck;
++import org.opendaylight.transportpce.stubrenderer.SendingRendererRPCs;
+ import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev170426.PathComputationRequestOutput;
+ import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev161014.RpcActions;
+ import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev161014.sdnc.request.header.SdncRequestHeaderBuilder;
+@@ -89,6 +89,7 @@ public class ServicehandlerImpl implements OrgOpenroadmServiceService {
+ private ServiceDataStoreOperations serviceDataStoreOperations;
+ private RendererServiceOperations rendererServiceOperations;
+ private PCEServiceWrapper pceServiceWrapper;
++ private SendingRendererRPCs stubrendererService;
+
+ //TODO: remove private request fields as they are in global scope
+
+@@ -145,8 +146,12 @@ public class ServicehandlerImpl implements OrgOpenroadmServiceService {
+
+ ServiceImplementationRequestInput serviceImplementationRequest =
+ ModelMappingUtils.createServiceImplementationRequest(input, pceResponse);
++// org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev170426
++// .ServiceImplementationRequestOutput serviceImplementationRequestOutput = this.rendererServiceOperations
++// .serviceImplementation(serviceImplementationRequest);
++ this.stubrendererService = new SendingRendererRPCs();
+ org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev170426
+- .ServiceImplementationRequestOutput serviceImplementationRequestOutput = this.rendererServiceOperations
++ .ServiceImplementationRequestOutput serviceImplementationRequestOutput = this.stubrendererService
+ .serviceImplementation(serviceImplementationRequest);
+ if (ResponseCodes.RESPONSE_OK
+ .equals(serviceImplementationRequestOutput.getConfigurationResponseCommon().getResponseCode())) {
+@@ -215,9 +220,11 @@ public class ServicehandlerImpl implements OrgOpenroadmServiceService {
+ LOG.debug("Service '{}' present in datastore !", serviceName);
+ org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev170426.ServiceDeleteInput
+ serviceDeleteInput = ModelMappingUtils.createServiceDeleteInput(input);
++// org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev170426
++// .ServiceDeleteOutput output = this.rendererServiceOperations.serviceDelete(serviceDeleteInput);
++ this.stubrendererService = new SendingRendererRPCs();
+ org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev170426
+- .ServiceDeleteOutput output = this.rendererServiceOperations.serviceDelete(serviceDeleteInput);
+-
++ .ServiceDeleteOutput output = this.stubrendererService.serviceDelete(serviceDeleteInput);
+ if (!ResponseCodes.RESPONSE_OK
+ .equals(output.getConfigurationResponseCommon().getResponseCode())) {
+ message = "Service delete failed!";
+diff --git a/servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/stub/StubRendererServiceOperations.java b/servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/stub/StubRendererServiceOperations.java
+index 6db468c..76e4a26 100644
+--- a/servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/stub/StubRendererServiceOperations.java
++++ b/servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/stub/StubRendererServiceOperations.java
+@@ -9,13 +9,8 @@ package org.opendaylight.transportpce.servicehandler.stub;
+
+ import java.util.concurrent.ExecutionException;
+ import java.util.concurrent.Future;
+-
+ import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService;
+ import org.opendaylight.transportpce.renderer.provisiondevice.RendererServiceOperations;
+-import org.opendaylight.transportpce.servicehandler.mappers.ServiceDeleteInputConverter;
+-import org.opendaylight.transportpce.servicehandler.mappers.ServiceDeleteOutputConverter;
+-import org.opendaylight.transportpce.servicehandler.mappers.ServiceImplementationRequestInputConverter;
+-import org.opendaylight.transportpce.servicehandler.mappers.ServiceImplementationRequestOutputConverter;
+ import org.opendaylight.transportpce.stubrenderer.impl.StubrendererImpl;
+ import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev170426.ServiceDeleteInput;
+ import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev170426.ServiceDeleteOutput;
+@@ -30,16 +25,15 @@ public class StubRendererServiceOperations implements RendererServiceOperations
+ private StubrendererImpl stubrenderer;
+
+ public StubRendererServiceOperations(NotificationPublishService notificationPublishService) {
+- this.stubrenderer = new StubrendererImpl(notificationPublishService);
++ this.stubrenderer = new StubrendererImpl();
+ }
+
+ @Override
+ public ServiceImplementationRequestOutput serviceImplementation(ServiceImplementationRequestInput input) {
+- Future<RpcResult<org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.stubrenderer.rev170426
+- .ServiceImplementationRequestOutput>> rpcResultFuture = this.stubrenderer
+- .serviceImplementationRequest(ServiceImplementationRequestInputConverter.getStub(input));
++ Future<RpcResult<ServiceImplementationRequestOutput>> rpcResultFuture = this.stubrenderer
++ .serviceImplementationRequest(input);
+ try {
+- return ServiceImplementationRequestOutputConverter.getConcrete(rpcResultFuture.get().getResult());
++ return rpcResultFuture.get().getResult();
+ } catch (InterruptedException e) {
+ LOG.error("RPC serviceImplementation failed !",e);
+ } catch (ExecutionException e) {
+@@ -50,11 +44,10 @@ public class StubRendererServiceOperations implements RendererServiceOperations
+
+ @Override
+ public ServiceDeleteOutput serviceDelete(ServiceDeleteInput input) {
+- Future<RpcResult<org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.stubrenderer.rev170426
+- .ServiceDeleteOutput>> rpcResultFuture = this.stubrenderer
+- .serviceDelete(ServiceDeleteInputConverter.getStub(input));
++ Future<RpcResult<ServiceDeleteOutput>> rpcResultFuture = this.stubrenderer
++ .serviceDelete(input);
+ try {
+- return ServiceDeleteOutputConverter.getConcrete(rpcResultFuture.get().getResult());
++ return rpcResultFuture.get().getResult();
+ } catch (InterruptedException e) {
+ LOG.error("RPC serviceDelete failed !",e);
+ } catch (ExecutionException e) {
+diff --git a/tests/stubrenderer/src/main/java/org/opendaylight/transportpce/stubrenderer/SendingRendererRPCs.java b/tests/stubrenderer/src/main/java/org/opendaylight/transportpce/stubrenderer/SendingRendererRPCs.java
+index cdcdc0e..7c7a825 100644
+--- a/tests/stubrenderer/src/main/java/org/opendaylight/transportpce/stubrenderer/SendingRendererRPCs.java
++++ b/tests/stubrenderer/src/main/java/org/opendaylight/transportpce/stubrenderer/SendingRendererRPCs.java
+@@ -8,16 +8,18 @@
+
+ package org.opendaylight.transportpce.stubrenderer;
+
+-import com.google.common.util.concurrent.ListenableFuture;
+-import com.google.common.util.concurrent.ListeningExecutorService;
+-
+ import java.util.ArrayList;
+ import java.util.List;
+-import java.util.concurrent.Callable;
+-
++import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev161014.configuration.response.common.ConfigurationResponseCommonBuilder;
+ import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev161014.service.TopologyBuilder;
+ import org.opendaylight.yang.gen.v1.http.org.openroadm.topology.rev161014.topology.AToZ;
+ import org.opendaylight.yang.gen.v1.http.org.openroadm.topology.rev161014.topology.ZToA;
++import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev170426.ServiceDeleteInput;
++import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev170426.ServiceDeleteOutput;
++import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev170426.ServiceDeleteOutputBuilder;
++import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev170426.ServiceImplementationRequestInput;
++import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev170426.ServiceImplementationRequestOutput;
++import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev170426.ServiceImplementationRequestOutputBuilder;
+ import org.slf4j.Logger;
+ import org.slf4j.LoggerFactory;
+
+@@ -41,73 +43,78 @@ public class SendingRendererRPCs {
+ private List<AToZ> atoz;
+ private List<ZToA> ztoa;
+ private String error;
+- private final ListeningExecutorService executor;
+
+- public SendingRendererRPCs(ListeningExecutorService executor) {
+- success = true;
++ public SendingRendererRPCs() {
++ this.success = true;
+ setTopology(null);
+- this.executor = executor;
+ setError("");
+ }
+
+ private void buildAtoZ() {
+- atoz = new ArrayList<AToZ>();
++ this.atoz = new ArrayList<AToZ>();
+ }
+
+ private void buildZtoA() {
+- ztoa = new ArrayList<ZToA>();
++ this.ztoa = new ArrayList<ZToA>();
+ }
+
+- public ListenableFuture<Boolean> serviceDelete() {
++ public ServiceDeleteOutput serviceDelete(ServiceDeleteInput input) {
++ String message = "Service deleted !";
++ String responseCode = "200";
+ LOG.info("ServiceDelete request ...");
+- success = false;
+- return executor.submit(new Callable<Boolean>() {
+- @Override
+- public Boolean call() throws Exception {
+- Boolean output = true;
+- LOG.info("Wait for 10s til beginning the Renderer serviceDelete request");
+- try {
+- Thread.sleep(10000); //sleep for 10s
+- } catch (InterruptedException e) {
+- output = false;
+- LOG.error("Thread.sleep failed : {}", e.toString());
+- }
+- buildAtoZ();
+- buildZtoA();
+- success = true;
+- return output;
+- }
+- });
++ LOG.info("Wait for 10s til beginning the Renderer serviceDelete request");
++ try {
++ Thread.sleep(1000); //sleep for 10s
++ } catch (InterruptedException e) {
++ message = "deleting service failed !";
++ LOG.error(message);
++ responseCode = "500";
++ setError(message);
++ }
++ ConfigurationResponseCommonBuilder configurationResponseCommon = new ConfigurationResponseCommonBuilder()
++ .setAckFinalIndicator("yes")
++ .setRequestId(input.getServiceHandlerHeader().getRequestId())
++ .setResponseCode(responseCode)
++ .setResponseMessage(message);
++ ServiceDeleteOutput output = new ServiceDeleteOutputBuilder()
++ .setConfigurationResponseCommon(configurationResponseCommon.build())
++ .build();
++ return output;
+ }
+
+- public ListenableFuture<Boolean> serviceImplementation() {
++ public ServiceImplementationRequestOutput serviceImplementation(ServiceImplementationRequestInput input) {
++ String message = "Service implemented !";
++ String responseCode = "200";
++ setSuccess(true);
+ LOG.info("serviceImplementation request ...");
+- success = false;
+- return executor.submit(new Callable<Boolean>() {
+- @Override
+- public Boolean call() throws Exception {
+- Boolean output = true;
+- LOG.info("Wait for 10s til beginning the Renderer serviceDelete request");
+- try {
+- Thread.sleep(10000); //sleep for 10s
+- } catch (InterruptedException e) {
+- output = false;
+- LOG.error("Thread.sleep failed : {}", e.toString());
+- }
+- buildAtoZ();
+- buildZtoA();
+- setTopology(new TopologyBuilder()
+- .setAToZ(atoz)
+- .setZToA(ztoa));
+- output = true;
+- success = true;
+- return output;
+- }
+- });
++ LOG.info("Wait for 10s til beginning the Renderer serviceDelete request");
++ try {
++ Thread.sleep(2000); //sleep for 1s
++ } catch (InterruptedException e) {
++ message = "implementing service failed !";
++ LOG.error(message);
++ setError(message);
++ responseCode = "500";
++ setSuccess(false);
++ }
++ buildAtoZ();
++ buildZtoA();
++ setTopology(new TopologyBuilder()
++ .setAToZ(SendingRendererRPCs.this.atoz)
++ .setZToA(SendingRendererRPCs.this.ztoa));
++ ConfigurationResponseCommonBuilder configurationResponseCommon = new ConfigurationResponseCommonBuilder()
++ .setAckFinalIndicator("yes")
++ .setRequestId(input.getServiceHandlerHeader().getRequestId())
++ .setResponseCode(responseCode)
++ .setResponseMessage(message);
++ ServiceImplementationRequestOutput output = new ServiceImplementationRequestOutputBuilder()
++ .setConfigurationResponseCommon(configurationResponseCommon.build())
++ .build();
++ return output;
+ }
+
+ public Boolean getSuccess() {
+- return success;
++ return this.success;
+ }
+
+ public void setSuccess(Boolean success) {
+@@ -115,7 +122,7 @@ public class SendingRendererRPCs {
+ }
+
+ public TopologyBuilder getTopology() {
+- return topology;
++ return this.topology;
+ }
+
+ public void setTopology(TopologyBuilder topo) {
+@@ -123,7 +130,7 @@ public class SendingRendererRPCs {
+ }
+
+ public String getError() {
+- return error;
++ return this.error;
+ }
+
+ public void setError(String error) {
+diff --git a/tests/stubrenderer/src/main/java/org/opendaylight/transportpce/stubrenderer/impl/StubrendererImpl.java b/tests/stubrenderer/src/main/java/org/opendaylight/transportpce/stubrenderer/impl/StubrendererImpl.java
+index 23ae976..4187f96 100644
+--- a/tests/stubrenderer/src/main/java/org/opendaylight/transportpce/stubrenderer/impl/StubrendererImpl.java
++++ b/tests/stubrenderer/src/main/java/org/opendaylight/transportpce/stubrenderer/impl/StubrendererImpl.java
+@@ -9,33 +9,21 @@
+
+ package org.opendaylight.transportpce.stubrenderer.impl;
+
+-import com.google.common.util.concurrent.FutureCallback;
+-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.Executors;
+ import java.util.concurrent.Future;
+-
+-import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService;
+ import org.opendaylight.transportpce.stubrenderer.SendingRendererRPCs;
+ import org.opendaylight.transportpce.stubrenderer.StubrendererCompliancyCheck;
+-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.stubrenderer.rev170426.ServiceDeleteInput;
+-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.stubrenderer.rev170426.ServiceDeleteOutput;
+-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.stubrenderer.rev170426.ServiceDeleteOutputBuilder;
+-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.stubrenderer.rev170426.ServiceImplementationRequestInput;
+-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.stubrenderer.rev170426.ServiceImplementationRequestOutput;
+-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.stubrenderer.rev170426.ServiceImplementationRequestOutputBuilder;
+-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.stubrenderer.rev170426.ServiceRpcResultSp;
+-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.stubrenderer.rev170426.ServiceRpcResultSpBuilder;
+-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.stubrenderer.rev170426.StubrendererService;
+-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.stubrenderer.rev170426.service.rpc.result.sp.PathTopology;
+-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.stubrenderer.rev170426.service.rpc.result.sp.PathTopologyBuilder;
+ import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev161014.configuration.response.common.ConfigurationResponseCommonBuilder;
+-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev161014.service.TopologyBuilder;
+-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev170426.RpcStatusEx;
+-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev170426.ServicePathNotificationTypes;
++import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev170426.CancelResourceReserveInput;
++import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev170426.CancelResourceReserveOutput;
++import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev170426.PathComputationRequestInput;
++import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev170426.PathComputationRequestOutput;
++import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev170426.ServiceDeleteInput;
++import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev170426.ServiceDeleteOutput;
++import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev170426.ServiceDeleteOutputBuilder;
++import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev170426.ServiceImplementationRequestInput;
++import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev170426.ServiceImplementationRequestOutput;
++import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev170426.ServiceImplementationRequestOutputBuilder;
++import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev170426.TransportpceServicepathService;
+ import org.opendaylight.yangtools.yang.common.RpcResult;
+ import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+ import org.slf4j.Logger;
+@@ -48,21 +36,12 @@ import org.slf4j.LoggerFactory;
+ * @author Martial Coulibaly ( martial.coulibaly@gfi.com ) on behalf of Orange
+ *
+ */
+-public class StubrendererImpl implements StubrendererService {
++public class StubrendererImpl implements TransportpceServicepathService {
+ /** Logging. */
+ private static final Logger LOG = LoggerFactory.getLogger(StubrendererImpl.class);
+- /** send notification. */
+- private NotificationPublishService notificationPublishService;
+- private ServiceRpcResultSp notification;
+- private final ListeningExecutorService executor = MoreExecutors
+- .listeningDecorator(Executors.newFixedThreadPool(10));
+ /** check service sdnc-request-header compliancy. */
+ private StubrendererCompliancyCheck compliancyCheck;
+
+- public StubrendererImpl(NotificationPublishService notificationPublishService) {
+- this.notificationPublishService = notificationPublishService;
+- }
+-
+ @Override
+ public Future<RpcResult<ServiceImplementationRequestOutput>> serviceImplementationRequest(
+ ServiceImplementationRequestInput input) {
+@@ -71,121 +50,37 @@ public class StubrendererImpl implements StubrendererService {
+ String message = "";
+ ConfigurationResponseCommonBuilder configurationResponseCommon = null;
+
+- compliancyCheck = new StubrendererCompliancyCheck(input.getServiceName(), input.getServiceHandlerHeader());
+- if (compliancyCheck.check(false, true)) {
++ this.compliancyCheck = new StubrendererCompliancyCheck(input.getServiceName(), input.getServiceHandlerHeader());
++ if (this.compliancyCheck.check(false, true)) {
+ LOG.info("Service compliant !");
+ /**
+ * If compliant, service-request parameters are verified in order to
+ * check if there is no missing parameter that prevents calculating
+ * a path and implement a service.
+ */
+-
+- notification = new ServiceRpcResultSpBuilder()
+- .setNotificationType(ServicePathNotificationTypes.ServiceImplementationRequest)
+- .setServiceName(input.getServiceName())
+- .setStatus(RpcStatusEx.Pending)
+- .setStatusMessage("Service compliant, submitting serviceImplementation Request ...")
+- .build();
+- try {
+- notificationPublishService.putNotification(notification);
+- } catch (InterruptedException e) {
+- LOG.info("notification offer rejected : {}", e);
++ SendingRendererRPCs sendingRenderer = new SendingRendererRPCs();
++ sendingRenderer.serviceImplementation(input);
++ if (sendingRenderer.getSuccess()) {
++ message = "Service implemented !";
++ LOG.info(message);
++ responseCode = "200";
++ } else {
++ message = "Service implementation failed : " + sendingRenderer.getError();
++ LOG.error(message);
++ responseCode = "500";
+ }
+-
+- SendingRendererRPCs sendingRenderer = new SendingRendererRPCs(executor);
+- FutureCallback<Boolean> rendererCallback =
+- new FutureCallback<Boolean>() {
+- String message = "";
+- ServiceRpcResultSp notification = null;
+-
+- @Override
+- public void onFailure(Throwable arg0) {
+- LOG.error("Failure message : {}", arg0.toString());
+- LOG.error("Service implementation failed !");
+- notification = new ServiceRpcResultSpBuilder()
+- .setNotificationType(ServicePathNotificationTypes.ServiceImplementationRequest)
+- .setServiceName(input.getServiceName()).setStatus(RpcStatusEx.Failed)
+- .setStatusMessage("PCR Request failed : {}" + arg0.getMessage()).build();
+- try {
+- notificationPublishService.putNotification(notification);
+- } catch (InterruptedException e) {
+- LOG.info("notification offer rejected : {}", e);
+- }
+- }
+-
+- @Override
+- public void onSuccess(Boolean response) {
+- LOG.info("response : {}", response);
+- if (response) {
+- message = "Service implemented !";
+- TopologyBuilder topo = sendingRenderer.getTopology();
+- ServiceRpcResultSpBuilder tmp = new ServiceRpcResultSpBuilder()
+- .setNotificationType(ServicePathNotificationTypes.ServiceImplementationRequest)
+- .setServiceName(input.getServiceName())
+- .setStatus(RpcStatusEx.Successful)
+- .setStatusMessage(message);
+- if (topo != null) {
+- PathTopology value = new PathTopologyBuilder()
+- .setAToZ(topo.getAToZ())
+- .setZToA(topo.getZToA())
+- .build();
+- tmp.setPathTopology(value);
+- }
+- notification = tmp.build();
+- } else {
+- message = "Service implementation failed : " + sendingRenderer.getError();
+- notification = new ServiceRpcResultSpBuilder()
+- .setNotificationType(ServicePathNotificationTypes.ServiceImplementationRequest)
+- .setServiceName("")
+- .setStatus(RpcStatusEx.Failed).setStatusMessage(message)
+- .build();
+- }
+- LOG.info(notification.toString());
+- try {
+- notificationPublishService.putNotification(notification);
+- } catch (InterruptedException e) {
+- LOG.info("notification offer rejected : {}", e);
+- }
+- LOG.info(message);
+- }
+- };
+- ListenableFuture<Boolean> renderer = sendingRenderer.serviceImplementation();
+- Futures.addCallback(renderer, rendererCallback, executor);
+- LOG.info("Service implmentation Request in progress ");
+- configurationResponseCommon = new ConfigurationResponseCommonBuilder()
+- .setAckFinalIndicator("Yes")
+- .setRequestId(input.getServiceHandlerHeader().getRequestId())
+- .setResponseCode("200")
+- .setResponseMessage("Service implementation Request in progress ");
+-
+- ServiceImplementationRequestOutput output = new ServiceImplementationRequestOutputBuilder()
+- .setConfigurationResponseCommon(configurationResponseCommon.build())
+- .build();
+- return RpcResultBuilder.success(output).buildFuture();
+ } else {
+- message = compliancyCheck.getMessage();
++ message = "Service not compliant";
+ responseCode = "500";
+- LOG.info("Service not compliant caused by : {}", message);
+- notification = new ServiceRpcResultSpBuilder()
+- .setNotificationType(ServicePathNotificationTypes.ServiceDelete)
+- .setServiceName(input.getServiceName()).setStatus(RpcStatusEx.Failed)
+- .setStatusMessage("Service not compliant caused by : " + message)
+- .build();
+- try {
+- notificationPublishService.putNotification(notification);
+- } catch (InterruptedException e) {
+- LOG.info("notification offer rejected : {}", e);
+- }
+ }
+ configurationResponseCommon = new ConfigurationResponseCommonBuilder()
+- .setAckFinalIndicator("yes")
+- .setRequestId(input.getServiceHandlerHeader().getRequestId())
+- .setResponseCode(responseCode)
+- .setResponseMessage(message);
++ .setAckFinalIndicator("yes")
++ .setRequestId(input.getServiceHandlerHeader().getRequestId())
++ .setResponseCode(responseCode)
++ .setResponseMessage(message);
+ ServiceImplementationRequestOutput output = new ServiceImplementationRequestOutputBuilder()
+- .setConfigurationResponseCommon(configurationResponseCommon.build())
+- .build();
+-
++ .setConfigurationResponseCommon(configurationResponseCommon.build())
++ .build();
+ return RpcResultBuilder.success(output).buildFuture();
+ }
+
+@@ -195,108 +90,55 @@ public class StubrendererImpl implements StubrendererService {
+ LOG.info("RPC serviceDelete request received");
+ String responseCode = "";
+ ConfigurationResponseCommonBuilder configurationResponseCommon = null;
+- compliancyCheck = new StubrendererCompliancyCheck(input.getServiceName(), input.getServiceHandlerHeader());
+- if (compliancyCheck.check(false, true)) {
++ this.compliancyCheck = new StubrendererCompliancyCheck(input.getServiceName(), input.getServiceHandlerHeader());
++ if (this.compliancyCheck.check(false, true)) {
+ LOG.info("Service compliant !");
+ /**
+ * If compliant, service-request parameters are verified in order to
+ * check if there is no missing parameter that prevents calculating
+ * a path and implement a service.
+ */
+-
+- notification = new ServiceRpcResultSpBuilder()
+- .setNotificationType(ServicePathNotificationTypes.ServiceDelete)
+- .setServiceName(input.getServiceName())
+- .setStatus(RpcStatusEx.Pending)
+- .setStatusMessage("Service compliant, submitting serviceDelete Request ...")
+- .build();
+- try {
+- notificationPublishService.putNotification(notification);
+- } catch (InterruptedException e) {
+- LOG.info("notification offer rejected : {}", e);
++ SendingRendererRPCs sendingRenderer = new SendingRendererRPCs();
++ sendingRenderer.serviceDelete(input);
++ if (sendingRenderer.getSuccess()) {
++ message = "Service deleted !";
++ responseCode = "200";
++ LOG.info(message);
++ } else {
++ message = "Service implementation failed : " + sendingRenderer.getError();
++ LOG.error(message);
++ responseCode = "500";
+ }
+- SendingRendererRPCs sendingRenderer = new SendingRendererRPCs(executor);
+- FutureCallback<Boolean> rendererCallback = new FutureCallback<Boolean>() {
+- String message = "";
+- ServiceRpcResultSp notification = null;
+-
+- @Override
+- public void onFailure(Throwable arg0) {
+- LOG.error("Failure message : {}", arg0.toString());
+- LOG.error("Service delete failed !");
+- notification = new ServiceRpcResultSpBuilder()
+- .setNotificationType(ServicePathNotificationTypes.ServiceDelete)
+- .setServiceName(input.getServiceName()).setStatus(RpcStatusEx.Failed)
+- .setStatusMessage("PCR Request failed : " + arg0.getMessage()).build();
+- try {
+- notificationPublishService.putNotification(notification);
+- } catch (InterruptedException e) {
+- LOG.info("notification offer rejected : {}", e);
+- }
+- }
+-
+- @Override
+- public void onSuccess(Boolean response) {
+- LOG.info("response : {}", response);
+- if (response) {
+- message = "Service deleted !";
+- notification = new ServiceRpcResultSpBuilder()
+- .setNotificationType(ServicePathNotificationTypes.ServiceDelete)
+- .setServiceName(input.getServiceName()).setStatus(RpcStatusEx.Successful)
+- .setStatusMessage(message).build();
+- } else {
+- message = "Service delete failed : " + sendingRenderer.getError();
+- notification = new ServiceRpcResultSpBuilder()
+- .setNotificationType(ServicePathNotificationTypes.ServiceDelete)
+- .setServiceName("")
+- .setStatus(RpcStatusEx.Failed).setStatusMessage(message)
+- .build();
+- }
+- LOG.info(notification.toString());
+- try {
+- notificationPublishService.putNotification(notification);
+- } catch (InterruptedException e) {
+- LOG.info("notification offer rejected : {}", e);
+- }
+- LOG.info(message);
+- }
+- };
+- ListenableFuture<Boolean> renderer = sendingRenderer.serviceDelete();
+- Futures.addCallback(renderer, rendererCallback, executor);
+- message = "Service delete Request in progress ...";
+- LOG.info(message);
+- configurationResponseCommon = new ConfigurationResponseCommonBuilder()
+- .setAckFinalIndicator("Yes")
+- .setRequestId(input.getServiceHandlerHeader().getRequestId())
+- .setResponseCode("200")
+- .setResponseMessage(message);
+- ServiceDeleteOutput output = new ServiceDeleteOutputBuilder()
+- .setConfigurationResponseCommon(configurationResponseCommon.build())
+- .build();
+- return RpcResultBuilder.success(output).buildFuture();
+ } else {
+- message = compliancyCheck.getMessage();
+- LOG.info("Service not compliant caused by : {}", message);
++ message = "Service not compliant";
+ responseCode = "500";
+- notification = new ServiceRpcResultSpBuilder()
+- .setNotificationType(ServicePathNotificationTypes.ServiceDelete)
+- .setServiceName(input.getServiceName()).setStatus(RpcStatusEx.Failed)
+- .setStatusMessage("Service not compliant caused by : " + message)
+- .build();
+- try {
+- notificationPublishService.putNotification(notification);
+- } catch (InterruptedException e) {
+- LOG.info("notification offer rejected : {}", e);
+- }
+ }
+ configurationResponseCommon = new ConfigurationResponseCommonBuilder()
+- .setAckFinalIndicator("yes")
+- .setRequestId(input.getServiceHandlerHeader().getRequestId())
+- .setResponseCode(responseCode)
+- .setResponseMessage(message);
++ .setAckFinalIndicator("yes")
++ .setRequestId(input.getServiceHandlerHeader().getRequestId())
++ .setResponseCode(responseCode)
++ .setResponseMessage(message);
+ ServiceDeleteOutput output = new ServiceDeleteOutputBuilder()
+- .setConfigurationResponseCommon(configurationResponseCommon.build())
+- .build();
++ .setConfigurationResponseCommon(configurationResponseCommon.build())
++ .build();
+ return RpcResultBuilder.success(output).buildFuture();
+ }
++
++ /* (non-Javadoc)
++ * @see org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev170426.TransportpceServicepathService#cancelResourceReserve(org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev170426.CancelResourceReserveInput)
++ */
++ @Override
++ public Future<RpcResult<CancelResourceReserveOutput>> cancelResourceReserve(CancelResourceReserveInput input) {
++ // TODO Auto-generated method stub
++ return null;
++ }
++
++ /* (non-Javadoc)
++ * @see org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev170426.TransportpceServicepathService#pathComputationRequest(org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev170426.PathComputationRequestInput)
++ */
++ @Override
++ public Future<RpcResult<PathComputationRequestOutput>> pathComputationRequest(PathComputationRequestInput input) {
++ // TODO Auto-generated method stub
++ return null;
++ }
+ }
+diff --git a/tests/stubrenderer/src/main/java/org/opendaylight/transportpce/stubrenderer/impl/StubrendererProvider.java b/tests/stubrenderer/src/main/java/org/opendaylight/transportpce/stubrenderer/impl/StubrendererProvider.java
+index 6dcdb8e..92b20f5 100644
+--- a/tests/stubrenderer/src/main/java/org/opendaylight/transportpce/stubrenderer/impl/StubrendererProvider.java
++++ b/tests/stubrenderer/src/main/java/org/opendaylight/transportpce/stubrenderer/impl/StubrendererProvider.java
+@@ -13,9 +13,7 @@ import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService
+ import org.opendaylight.controller.md.sal.binding.api.NotificationService;
+ import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
+ import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
+-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.stubrenderer.rev170426.StubrendererListener;
+-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.stubrenderer.rev170426.StubrendererService;
+-import org.opendaylight.yangtools.concepts.ListenerRegistration;
++import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev170426.TransportpceServicepathService;
+ import org.slf4j.Logger;
+ import org.slf4j.LoggerFactory;
+
+@@ -27,17 +25,13 @@ import org.slf4j.LoggerFactory;
+ public class StubrendererProvider {
+ private static final Logger LOG = LoggerFactory.getLogger(StubrendererProvider.class);
+ private final RpcProviderRegistry rpcRegistry;
+- private final NotificationPublishService notificationPublishService;
+
+-
+- private BindingAwareBroker.RpcRegistration<StubrendererService> rpcRegistration;
+- private ListenerRegistration<StubrendererListener> stubRendererlistenerRegistration;
++ private BindingAwareBroker.RpcRegistration<TransportpceServicepathService> rpcRegistration;
+
+ public StubrendererProvider(RpcProviderRegistry rpcProviderRegistry,
+ NotificationService notificationService,
+ NotificationPublishService notificationPublishService) {
+ this.rpcRegistry = rpcProviderRegistry;
+- this.notificationPublishService = notificationPublishService;
+ }
+
+ /**
+@@ -45,8 +39,8 @@ public class StubrendererProvider {
+ */
+ public void init() {
+ LOG.info("StubrendererProvider Session Initiated");
+- final StubrendererImpl consumer = new StubrendererImpl(notificationPublishService);
+- rpcRegistration = rpcRegistry.addRpcImplementation(StubrendererService.class, consumer);
++ final StubrendererImpl consumer = new StubrendererImpl();
++ this.rpcRegistration = this.rpcRegistry.addRpcImplementation(TransportpceServicepathService.class, consumer);
+ }
+
+ /**
+@@ -54,7 +48,6 @@ public class StubrendererProvider {
+ */
+ public void close() {
+ LOG.info("StubrendererProvider Closed");
+- rpcRegistration.close();
+- stubRendererlistenerRegistration.close();
++ this.rpcRegistration.close();
+ }
+ }
--- /dev/null
+<network xmlns="urn:ietf:params:xml:ns:yang:ietf-network">
+ <network-id>openroadm-topology</network-id>
+ <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <link-id>ROADMA-DEG2-DEG2-CTP-TXRXtoROADMA-DEG1-DEG1-CTP-TXRX</link-id>
+ <opposite-link xmlns="http://org/openroadm/opposite/links">ROADMA-DEG1-DEG1-CTP-TXRXtoROADMA-DEG2-DEG2-CTP-TXRX</opposite-link>
+ <destination>
+ <dest-tp>DEG1-CTP-TXRX</dest-tp>
+ <dest-node>ROADMA-DEG1</dest-node>
+ </destination>
+ <source>
+ <source-node>ROADMA-DEG2</source-node>
+ <source-tp>DEG2-CTP-TXRX</source-tp>
+ </source>
+ <link-type xmlns="http://org/openroadm/network/topology">EXPRESS-LINK</link-type>
+ </link>
+ <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <link-id>ROADMC-SRG1-SRG1-CP-TXRXtoROADMC-DEG2-DEG2-CTP-TXRX</link-id>
+ <opposite-link xmlns="http://org/openroadm/opposite/links">ROADMC-DEG2-DEG2-CTP-TXRXtoROADMC-SRG1-SRG1-CP-TXRX</opposite-link>
+ <destination>
+ <dest-tp>DEG2-CTP-TXRX</dest-tp>
+ <dest-node>ROADMC-DEG2</dest-node>
+ </destination>
+ <source>
+ <source-node>ROADMC-SRG1</source-node>
+ <source-tp>SRG1-CP-TXRX</source-tp>
+ </source>
+ <link-type xmlns="http://org/openroadm/network/topology">ADD-LINK</link-type>
+ </link>
+ <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <link-id>ROADMA-SRG1-SRG1-CP-TXRXtoROADMA-DEG1-DEG1-CTP-TXRX</link-id>
+ <opposite-link xmlns="http://org/openroadm/opposite/links">ROADMA-DEG1-DEG1-CTP-TXRXtoROADMA-SRG1-SRG1-CP-TXRX</opposite-link>
+ <destination>
+ <dest-tp>DEG1-CTP-TXRX</dest-tp>
+ <dest-node>ROADMA-DEG1</dest-node>
+ </destination>
+ <source>
+ <source-node>ROADMA-SRG1</source-node>
+ <source-tp>SRG1-CP-TXRX</source-tp>
+ </source>
+ <link-type xmlns="http://org/openroadm/network/topology">ADD-LINK</link-type>
+ </link>
+ <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <link-id>XPDRA-XPDR1-XPDR1-NETWORK1toROADMA-SRG1-SRG1-PP1-TXRX</link-id>
+ <opposite-link xmlns="http://org/openroadm/opposite/links">ROADMA-SRG1-SRG1-PP1-TXRXtoXPDRA-XPDR1-XPDR1-NETWORK1</opposite-link>
+ <destination>
+ <dest-tp>SRG1-PP1-TXRX</dest-tp>
+ <dest-node>ROADMA-SRG1</dest-node>
+ </destination>
+ <source>
+ <source-node>XPDRA-XPDR1</source-node>
+ <source-tp>XPDR1-NETWORK1</source-tp>
+ </source>
+ <link-type xmlns="http://org/openroadm/network/topology">XPONDER-OUTPUT</link-type>
+ </link>
+ <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <link-id>ROADMA-DEG1-DEG1-CTP-TXRXtoROADMA-DEG2-DEG2-CTP-TXRX</link-id>
+ <opposite-link xmlns="http://org/openroadm/opposite/links">ROADMA-DEG2-DEG2-CTP-TXRXtoROADMA-DEG1-DEG1-CTP-TXRX</opposite-link>
+ <destination>
+ <dest-tp>DEG2-CTP-TXRX</dest-tp>
+ <dest-node>ROADMA-DEG2</dest-node>
+ </destination>
+ <source>
+ <source-node>ROADMA-DEG1</source-node>
+ <source-tp>DEG1-CTP-TXRX</source-tp>
+ </source>
+ <link-type xmlns="http://org/openroadm/network/topology">EXPRESS-LINK</link-type>
+ </link>
+ <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <link-id>ROADMC-DEG2-DEG2-CTP-TXRXtoROADMC-DEG1-DEG1-CTP-TXRX</link-id>
+ <opposite-link xmlns="http://org/openroadm/opposite/links">ROADMC-DEG1-DEG1-CTP-TXRXtoROADMC-DEG2-DEG2-CTP-TXRX</opposite-link>
+ <destination>
+ <dest-tp>DEG1-CTP-TXRX</dest-tp>
+ <dest-node>ROADMC-DEG1</dest-node>
+ </destination>
+ <source>
+ <source-node>ROADMC-DEG2</source-node>
+ <source-tp>DEG2-CTP-TXRX</source-tp>
+ </source>
+ <link-type xmlns="http://org/openroadm/network/topology">EXPRESS-LINK</link-type>
+ </link>
+ <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <link-id>ROADMC-DEG1-DEG1-CTP-TXRXtoROADMC-DEG2-DEG2-CTP-TXRX</link-id>
+ <opposite-link xmlns="http://org/openroadm/opposite/links">ROADMC-DEG2-DEG2-CTP-TXRXtoROADMC-DEG1-DEG1-CTP-TXRX</opposite-link>
+ <destination>
+ <dest-tp>DEG2-CTP-TXRX</dest-tp>
+ <dest-node>ROADMC-DEG2</dest-node>
+ </destination>
+ <source>
+ <source-node>ROADMC-DEG1</source-node>
+ <source-tp>DEG1-CTP-TXRX</source-tp>
+ </source>
+ <link-type xmlns="http://org/openroadm/network/topology">EXPRESS-LINK</link-type>
+ </link>
+ <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <link-id>ROADMA-DEG1-DEG1-CTP-TXRXtoROADMA-SRG1-SRG1-CP-TXRX</link-id>
+ <opposite-link xmlns="http://org/openroadm/opposite/links">ROADMA-SRG1-SRG1-CP-TXRXtoROADMA-DEG1-DEG1-CTP-TXRX</opposite-link>
+ <destination>
+ <dest-tp>SRG1-CP-TXRX</dest-tp>
+ <dest-node>ROADMA-SRG1</dest-node>
+ </destination>
+ <source>
+ <source-node>ROADMA-DEG1</source-node>
+ <source-tp>DEG1-CTP-TXRX</source-tp>
+ </source>
+ <link-type xmlns="http://org/openroadm/network/topology">DROP-LINK</link-type>
+ </link>
+ <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <link-id>ROADMA-DEG2-DEG2-CTP-TXRXtoROADMA-SRG1-SRG1-CP-TXRX</link-id>
+ <opposite-link xmlns="http://org/openroadm/opposite/links">ROADMA-SRG1-SRG1-CP-TXRXtoROADMA-DEG2-DEG2-CTP-TXRX</opposite-link>
+ <destination>
+ <dest-tp>SRG1-CP-TXRX</dest-tp>
+ <dest-node>ROADMA-SRG1</dest-node>
+ </destination>
+ <source>
+ <source-node>ROADMA-DEG2</source-node>
+ <source-tp>DEG2-CTP-TXRX</source-tp>
+ </source>
+ <link-type xmlns="http://org/openroadm/network/topology">DROP-LINK</link-type>
+ </link>
+ <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <link-id>ROADMA-DEG1-DEG1-TTP-TXRXtoROADMC-DEG2-DEG2-TTP-TXRX</link-id>
+ <opposite-link xmlns="http://org/openroadm/opposite/links">ROADMC-DEG2-DEG2-TTP-TXRXtoROADMA-DEG1-DEG1-TTP-TXRX</opposite-link>
+ <destination>
+ <dest-tp>DEG2-TTP-TXRX</dest-tp>
+ <dest-node>ROADMC-DEG2</dest-node>
+ </destination>
+ <source>
+ <source-node>ROADMA-DEG1</source-node>
+ <source-tp>DEG1-TTP-TXRX</source-tp>
+ </source>
+ <OMS-attributes xmlns="http://org/openroadm/network/topology">
+ <opposite-link>ROADMC-DEG2-DEG2-TTP-TXRXtoROADMA-DEG1-DEG1-TTP-TXRX</opposite-link>
+ </OMS-attributes>
+ <link-type xmlns="http://org/openroadm/network/topology">ROADM-TO-ROADM</link-type>
+ </link>
+ <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <link-id>ROADMA-SRG1-SRG1-PP1-TXRXtoXPDRA-XPDR1-XPDR1-NETWORK1</link-id>
+ <opposite-link xmlns="http://org/openroadm/opposite/links">XPDRA-XPDR1-XPDR1-NETWORK1toROADMA-SRG1-SRG1-PP1-TXRX</opposite-link>
+ <destination>
+ <dest-tp>XPDR1-NETWORK1</dest-tp>
+ <dest-node>XPDRA-XPDR1</dest-node>
+ </destination>
+ <source>
+ <source-node>ROADMA-SRG1</source-node>
+ <source-tp>SRG1-PP1-TXRX</source-tp>
+ </source>
+ <link-type xmlns="http://org/openroadm/network/topology">XPONDER-INPUT</link-type>
+ </link>
+ <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <link-id>ROADMC-DEG2-DEG2-TTP-TXRXtoROADMA-DEG1-DEG1-TTP-TXRX</link-id>
+ <opposite-link xmlns="http://org/openroadm/opposite/links">ROADMA-DEG1-DEG1-TTP-TXRXtoROADMC-DEG2-DEG2-TTP-TXRX</opposite-link>
+ <destination>
+ <dest-tp>DEG1-TTP-TXRX</dest-tp>
+ <dest-node>ROADMA-DEG1</dest-node>
+ </destination>
+ <source>
+ <source-node>ROADMC-DEG2</source-node>
+ <source-tp>DEG2-TTP-TXRX</source-tp>
+ </source>
+ <OMS-attributes xmlns="http://org/openroadm/network/topology">
+ <opposite-link>ROADMA-DEG1-DEG1-TTP-TXRXtoROADMC-DEG2-DEG2-TTP-TXRX</opposite-link>
+ </OMS-attributes>
+ <link-type xmlns="http://org/openroadm/network/topology">ROADM-TO-ROADM</link-type>
+ </link>
+ <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <link-id>ROADMC-DEG1-DEG1-CTP-TXRXtoROADMC-SRG1-SRG1-CP-TXRX</link-id>
+ <opposite-link xmlns="http://org/openroadm/opposite/links">ROADMC-SRG1-SRG1-CP-TXRXtoROADMC-DEG1-DEG1-CTP-TXRX</opposite-link>
+ <destination>
+ <dest-tp>SRG1-CP-TXRX</dest-tp>
+ <dest-node>ROADMC-SRG1</dest-node>
+ </destination>
+ <source>
+ <source-node>ROADMC-DEG1</source-node>
+ <source-tp>DEG1-CTP-TXRX</source-tp>
+ </source>
+ <link-type xmlns="http://org/openroadm/network/topology">DROP-LINK</link-type>
+ </link>
+ <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <link-id>ROADMC-SRG1-SRG1-CP-TXRXtoROADMC-DEG1-DEG1-CTP-TXRX</link-id>
+ <opposite-link xmlns="http://org/openroadm/opposite/links">ROADMC-DEG1-DEG1-CTP-TXRXtoROADMC-SRG1-SRG1-CP-TXRX</opposite-link>
+ <destination>
+ <dest-tp>DEG1-CTP-TXRX</dest-tp>
+ <dest-node>ROADMC-DEG1</dest-node>
+ </destination>
+ <source>
+ <source-node>ROADMC-SRG1</source-node>
+ <source-tp>SRG1-CP-TXRX</source-tp>
+ </source>
+ <link-type xmlns="http://org/openroadm/network/topology">ADD-LINK</link-type>
+ </link>
+ <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <link-id>ROADMC-DEG2-DEG2-CTP-TXRXtoROADMC-SRG1-SRG1-CP-TXRX</link-id>
+ <opposite-link xmlns="http://org/openroadm/opposite/links">ROADMC-SRG1-SRG1-CP-TXRXtoROADMC-DEG2-DEG2-CTP-TXRX</opposite-link>
+ <destination>
+ <dest-tp>SRG1-CP-TXRX</dest-tp>
+ <dest-node>ROADMC-SRG1</dest-node>
+ </destination>
+ <source>
+ <source-node>ROADMC-DEG2</source-node>
+ <source-tp>DEG2-CTP-TXRX</source-tp>
+ </source>
+ <link-type xmlns="http://org/openroadm/network/topology">DROP-LINK</link-type>
+ </link>
+ <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <link-id>ROADMC-SRG1-SRG1-PP1-TXRXtoXPDRC-XPDR1-XPDR1-NETWORK1</link-id>
+ <opposite-link xmlns="http://org/openroadm/opposite/links">XPDRC-XPDR1-XPDR1-NETWORK1toROADMC-SRG1-SRG1-PP1-TXRX</opposite-link>
+ <destination>
+ <dest-tp>XPDR1-NETWORK1</dest-tp>
+ <dest-node>XPDRC-XPDR1</dest-node>
+ </destination>
+ <source>
+ <source-node>ROADMC-SRG1</source-node>
+ <source-tp>SRG1-PP1-TXRX</source-tp>
+ </source>
+ <link-type xmlns="http://org/openroadm/network/topology">XPONDER-INPUT</link-type>
+ </link>
+ <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <link-id>ROADMA-SRG1-SRG1-CP-TXRXtoROADMA-DEG2-DEG2-CTP-TXRX</link-id>
+ <opposite-link xmlns="http://org/openroadm/opposite/links">ROADMA-DEG2-DEG2-CTP-TXRXtoROADMA-SRG1-SRG1-CP-TXRX</opposite-link>
+ <destination>
+ <dest-tp>DEG2-CTP-TXRX</dest-tp>
+ <dest-node>ROADMA-DEG2</dest-node>
+ </destination>
+ <source>
+ <source-node>ROADMA-SRG1</source-node>
+ <source-tp>SRG1-CP-TXRX</source-tp>
+ </source>
+ <link-type xmlns="http://org/openroadm/network/topology">ADD-LINK</link-type>
+ </link>
+ <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <link-id>XPDRC-XPDR1-XPDR1-NETWORK1toROADMC-SRG1-SRG1-PP1-TXRX</link-id>
+ <opposite-link xmlns="http://org/openroadm/opposite/links">ROADMC-SRG1-SRG1-PP1-TXRXtoXPDRC-XPDR1-XPDR1-NETWORK1</opposite-link>
+ <destination>
+ <dest-tp>SRG1-PP1-TXRX</dest-tp>
+ <dest-node>ROADMC-SRG1</dest-node>
+ </destination>
+ <source>
+ <source-node>XPDRC-XPDR1</source-node>
+ <source-tp>XPDR1-NETWORK1</source-tp>
+ </source>
+ <link-type xmlns="http://org/openroadm/network/topology">XPONDER-OUTPUT</link-type>
+ </link>
+ <network-types>
+ <openroadm-topology xmlns="http://org/openroadm/network/topology"></openroadm-topology>
+ </network-types>
+ <node>
+ <node-id>ROADMC-SRG1</node-id>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>SRG1-PP12-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">SRG-TXRX-PP</tp-type>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>SRG1-PP15-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">SRG-TXRX-PP</tp-type>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>SRG1-PP1-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">SRG-TXRX-PP</tp-type>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>SRG1-PP2-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">SRG-TXRX-PP</tp-type>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>SRG1-CP-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">SRG-TXRX-CP</tp-type>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>SRG1-PP5-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">SRG-TXRX-PP</tp-type>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>SRG1-PP8-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">SRG-TXRX-PP</tp-type>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>SRG1-PP6-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">SRG-TXRX-PP</tp-type>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>SRG1-PP9-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">SRG-TXRX-PP</tp-type>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>SRG1-PP3-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">SRG-TXRX-PP</tp-type>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>SRG1-PP10-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">SRG-TXRX-PP</tp-type>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>SRG1-PP14-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">SRG-TXRX-PP</tp-type>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>SRG1-PP16-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">SRG-TXRX-PP</tp-type>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>SRG1-PP7-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">SRG-TXRX-PP</tp-type>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>SRG1-PP11-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">SRG-TXRX-PP</tp-type>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>SRG1-PP13-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">SRG-TXRX-PP</tp-type>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>SRG1-PP4-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">SRG-TXRX-PP</tp-type>
+ </termination-point>
+ <supporting-node>
+ <network-ref>openroadm-network</network-ref>
+ <node-ref>ROADMC</node-ref>
+ </supporting-node>
+ <srg-attributes xmlns="http://org/openroadm/network/topology">
+ <available-wavelengths>
+ <index>93</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>94</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>95</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>96</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>29</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>30</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>31</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>32</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>33</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>34</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>35</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>36</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>37</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>38</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>39</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>40</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>41</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>42</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>43</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>44</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>45</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>46</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>47</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>48</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>49</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>50</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>51</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>52</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>53</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>54</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>55</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>56</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>57</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>58</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>59</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>60</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>61</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>62</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>63</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>64</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>65</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>66</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>67</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>68</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>69</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>70</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>71</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>72</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>73</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>74</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>75</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>76</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>77</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>78</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>79</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>80</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>81</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>82</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>83</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>84</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>85</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>86</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>87</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>88</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>89</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>90</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>91</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>92</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>1</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>2</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>3</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>4</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>5</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>6</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>7</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>8</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>9</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>10</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>11</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>12</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>13</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>14</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>15</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>16</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>17</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>18</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>19</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>20</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>21</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>22</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>23</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>24</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>25</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>26</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>27</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>28</index>
+ </available-wavelengths>
+ </srg-attributes>
+ <node-type xmlns="http://org/openroadm/network/topology">SRG</node-type>
+ </node>
+ <node>
+ <node-id>ROADMC-DEG1</node-id>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>DEG1-CTP-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">DEGREE-TXRX-CTP</tp-type>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>DEG1-TTP-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">DEGREE-TXRX-TTP</tp-type>
+ </termination-point>
+ <supporting-node>
+ <network-ref>openroadm-network</network-ref>
+ <node-ref>ROADMC</node-ref>
+ </supporting-node>
+ <node-type xmlns="http://org/openroadm/network/topology">DEGREE</node-type>
+ <degree-attributes xmlns="http://org/openroadm/network/topology">
+ <degree-number>1</degree-number>
+ <available-wavelengths>
+ <index>93</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>94</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>95</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>96</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>29</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>30</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>31</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>32</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>33</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>34</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>35</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>36</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>37</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>38</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>39</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>40</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>41</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>42</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>43</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>44</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>45</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>46</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>47</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>48</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>49</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>50</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>51</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>52</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>53</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>54</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>55</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>56</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>57</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>58</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>59</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>60</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>61</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>62</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>63</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>64</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>65</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>66</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>67</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>68</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>69</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>70</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>71</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>72</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>73</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>74</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>75</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>76</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>77</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>78</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>79</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>80</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>81</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>82</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>83</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>84</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>85</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>86</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>87</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>88</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>89</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>90</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>91</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>92</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>1</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>2</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>3</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>4</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>5</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>6</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>7</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>8</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>9</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>10</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>11</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>12</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>13</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>14</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>15</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>16</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>17</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>18</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>19</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>20</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>21</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>22</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>23</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>24</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>25</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>26</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>27</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>28</index>
+ </available-wavelengths>
+ </degree-attributes>
+ </node>
+ <node>
+ <node-id>ROADMC-DEG2</node-id>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>DEG2-TTP-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">DEGREE-TXRX-TTP</tp-type>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>DEG2-CTP-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">DEGREE-TXRX-CTP</tp-type>
+ </termination-point>
+ <supporting-node>
+ <network-ref>openroadm-network</network-ref>
+ <node-ref>ROADMC</node-ref>
+ </supporting-node>
+ <node-type xmlns="http://org/openroadm/network/topology">DEGREE</node-type>
+ <degree-attributes xmlns="http://org/openroadm/network/topology">
+ <degree-number>2</degree-number>
+ <available-wavelengths>
+ <index>93</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>94</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>95</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>96</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>29</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>30</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>31</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>32</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>33</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>34</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>35</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>36</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>37</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>38</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>39</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>40</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>41</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>42</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>43</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>44</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>45</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>46</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>47</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>48</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>49</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>50</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>51</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>52</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>53</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>54</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>55</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>56</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>57</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>58</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>59</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>60</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>61</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>62</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>63</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>64</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>65</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>66</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>67</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>68</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>69</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>70</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>71</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>72</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>73</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>74</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>75</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>76</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>77</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>78</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>79</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>80</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>81</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>82</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>83</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>84</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>85</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>86</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>87</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>88</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>89</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>90</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>91</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>92</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>1</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>2</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>3</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>4</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>5</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>6</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>7</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>8</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>9</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>10</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>11</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>12</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>13</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>14</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>15</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>16</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>17</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>18</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>19</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>20</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>21</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>22</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>23</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>24</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>25</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>26</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>27</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>28</index>
+ </available-wavelengths>
+ </degree-attributes>
+ </node>
+ <node>
+ <node-id>ROADMA-SRG1</node-id>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>SRG1-PP12-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">SRG-TXRX-PP</tp-type>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>SRG1-PP15-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">SRG-TXRX-PP</tp-type>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>SRG1-PP1-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">SRG-TXRX-PP</tp-type>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>SRG1-PP2-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">SRG-TXRX-PP</tp-type>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>SRG1-CP-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">SRG-TXRX-CP</tp-type>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>SRG1-PP5-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">SRG-TXRX-PP</tp-type>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>SRG1-PP8-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">SRG-TXRX-PP</tp-type>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>SRG1-PP6-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">SRG-TXRX-PP</tp-type>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>SRG1-PP9-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">SRG-TXRX-PP</tp-type>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>SRG1-PP3-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">SRG-TXRX-PP</tp-type>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>SRG1-PP10-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">SRG-TXRX-PP</tp-type>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>SRG1-PP14-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">SRG-TXRX-PP</tp-type>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>SRG1-PP16-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">SRG-TXRX-PP</tp-type>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>SRG1-PP7-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">SRG-TXRX-PP</tp-type>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>SRG1-PP11-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">SRG-TXRX-PP</tp-type>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>SRG1-PP13-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">SRG-TXRX-PP</tp-type>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>SRG1-PP4-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">SRG-TXRX-PP</tp-type>
+ </termination-point>
+ <supporting-node>
+ <network-ref>openroadm-network</network-ref>
+ <node-ref>ROADMA</node-ref>
+ </supporting-node>
+ <srg-attributes xmlns="http://org/openroadm/network/topology">
+ <available-wavelengths>
+ <index>93</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>94</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>95</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>96</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>29</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>30</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>31</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>32</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>33</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>34</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>35</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>36</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>37</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>38</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>39</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>40</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>41</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>42</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>43</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>44</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>45</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>46</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>47</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>48</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>49</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>50</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>51</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>52</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>53</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>54</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>55</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>56</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>57</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>58</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>59</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>60</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>61</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>62</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>63</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>64</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>65</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>66</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>67</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>68</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>69</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>70</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>71</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>72</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>73</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>74</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>75</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>76</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>77</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>78</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>79</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>80</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>81</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>82</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>83</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>84</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>85</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>86</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>87</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>88</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>89</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>90</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>91</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>92</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>1</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>2</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>3</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>4</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>5</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>6</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>7</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>8</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>9</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>10</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>11</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>12</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>13</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>14</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>15</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>16</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>17</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>18</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>19</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>20</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>21</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>22</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>23</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>24</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>25</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>26</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>27</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>28</index>
+ </available-wavelengths>
+ </srg-attributes>
+ <node-type xmlns="http://org/openroadm/network/topology">SRG</node-type>
+ </node>
+ <node>
+ <node-id>XPDRA-XPDR1</node-id>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>XPDR1-NETWORK2</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">XPONDER-NETWORK</tp-type>
+ <xpdr-client-attributes xmlns="http://org/openroadm/network/topology">
+ <tail-equipment-id>XPDR1-NETWORK1</tail-equipment-id>
+ </xpdr-client-attributes>
+ <xpdr-network-attributes xmlns="http://org/openroadm/network/topology">
+ <tail-equipment-id>XPDR1-CLIENT2</tail-equipment-id>
+ </xpdr-network-attributes>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>XPDR1-CLIENT2</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">XPONDER-CLIENT</tp-type>
+ <xpdr-client-attributes xmlns="http://org/openroadm/network/topology">
+ <tail-equipment-id>XPDR1-NETWORK2</tail-equipment-id>
+ </xpdr-client-attributes>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>XPDR1-CLIENT1</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">XPONDER-CLIENT</tp-type>
+ <xpdr-client-attributes xmlns="http://org/openroadm/network/topology">
+ <tail-equipment-id>XPDR1-NETWORK1</tail-equipment-id>
+ </xpdr-client-attributes>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>XPDR1-NETWORK1</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">XPONDER-NETWORK</tp-type>
+ <xpdr-client-attributes xmlns="http://org/openroadm/network/topology">
+ <tail-equipment-id>XPDR1-NETWORK1</tail-equipment-id>
+ </xpdr-client-attributes>
+ <xpdr-network-attributes xmlns="http://org/openroadm/network/topology">
+ <tail-equipment-id>XPDR1-CLIENT1</tail-equipment-id>
+ </xpdr-network-attributes>
+ </termination-point>
+ <supporting-node>
+ <network-ref>openroadm-network</network-ref>
+ <node-ref>XPDRA</node-ref>
+ </supporting-node>
+ <node-type xmlns="http://org/openroadm/network/topology">XPONDER</node-type>
+ </node>
+ <node>
+ <node-id>ROADMA-DEG2</node-id>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>DEG2-TTP-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">DEGREE-TXRX-TTP</tp-type>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>DEG2-CTP-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">DEGREE-TXRX-CTP</tp-type>
+ </termination-point>
+ <supporting-node>
+ <network-ref>openroadm-network</network-ref>
+ <node-ref>ROADMA</node-ref>
+ </supporting-node>
+ <node-type xmlns="http://org/openroadm/network/topology">DEGREE</node-type>
+ <degree-attributes xmlns="http://org/openroadm/network/topology">
+ <degree-number>2</degree-number>
+ <available-wavelengths>
+ <index>93</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>94</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>95</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>96</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>29</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>30</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>31</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>32</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>33</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>34</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>35</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>36</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>37</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>38</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>39</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>40</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>41</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>42</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>43</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>44</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>45</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>46</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>47</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>48</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>49</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>50</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>51</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>52</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>53</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>54</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>55</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>56</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>57</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>58</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>59</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>60</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>61</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>62</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>63</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>64</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>65</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>66</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>67</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>68</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>69</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>70</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>71</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>72</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>73</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>74</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>75</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>76</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>77</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>78</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>79</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>80</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>81</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>82</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>83</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>84</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>85</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>86</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>87</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>88</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>89</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>90</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>91</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>92</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>1</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>2</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>3</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>4</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>5</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>6</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>7</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>8</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>9</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>10</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>11</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>12</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>13</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>14</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>15</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>16</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>17</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>18</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>19</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>20</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>21</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>22</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>23</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>24</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>25</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>26</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>27</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>28</index>
+ </available-wavelengths>
+ </degree-attributes>
+ </node>
+ <node>
+ <node-id>XPDRC-XPDR1</node-id>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>XPDR1-NETWORK2</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">XPONDER-NETWORK</tp-type>
+ <xpdr-client-attributes xmlns="http://org/openroadm/network/topology">
+ <tail-equipment-id>XPDR1-NETWORK1</tail-equipment-id>
+ </xpdr-client-attributes>
+ <xpdr-network-attributes xmlns="http://org/openroadm/network/topology">
+ <tail-equipment-id>XPDR1-CLIENT2</tail-equipment-id>
+ </xpdr-network-attributes>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>XPDR1-CLIENT2</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">XPONDER-CLIENT</tp-type>
+ <xpdr-client-attributes xmlns="http://org/openroadm/network/topology">
+ <tail-equipment-id>XPDR1-NETWORK2</tail-equipment-id>
+ </xpdr-client-attributes>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>XPDR1-CLIENT1</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">XPONDER-CLIENT</tp-type>
+ <xpdr-client-attributes xmlns="http://org/openroadm/network/topology">
+ <tail-equipment-id>XPDR1-NETWORK1</tail-equipment-id>
+ </xpdr-client-attributes>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>XPDR1-NETWORK1</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">XPONDER-NETWORK</tp-type>
+ <xpdr-client-attributes xmlns="http://org/openroadm/network/topology">
+ <tail-equipment-id>XPDR1-NETWORK1</tail-equipment-id>
+ </xpdr-client-attributes>
+ <xpdr-network-attributes xmlns="http://org/openroadm/network/topology">
+ <tail-equipment-id>XPDR1-CLIENT1</tail-equipment-id>
+ </xpdr-network-attributes>
+ </termination-point>
+ <supporting-node>
+ <network-ref>openroadm-network</network-ref>
+ <node-ref>XPDRC</node-ref>
+ </supporting-node>
+ <node-type xmlns="http://org/openroadm/network/topology">XPONDER</node-type>
+ </node>
+ <node>
+ <node-id>ROADMA-DEG1</node-id>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>DEG1-CTP-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">DEGREE-TXRX-CTP</tp-type>
+ </termination-point>
+ <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
+ <tp-id>DEG1-TTP-TXRX</tp-id>
+ <tp-type xmlns="http://org/openroadm/network/topology">DEGREE-TXRX-TTP</tp-type>
+ </termination-point>
+ <supporting-node>
+ <network-ref>openroadm-network</network-ref>
+ <node-ref>ROADMA</node-ref>
+ </supporting-node>
+ <node-type xmlns="http://org/openroadm/network/topology">DEGREE</node-type>
+ <degree-attributes xmlns="http://org/openroadm/network/topology">
+ <degree-number>1</degree-number>
+ <available-wavelengths>
+ <index>93</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>94</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>95</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>96</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>29</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>30</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>31</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>32</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>33</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>34</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>35</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>36</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>37</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>38</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>39</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>40</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>41</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>42</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>43</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>44</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>45</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>46</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>47</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>48</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>49</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>50</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>51</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>52</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>53</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>54</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>55</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>56</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>57</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>58</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>59</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>60</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>61</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>62</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>63</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>64</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>65</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>66</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>67</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>68</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>69</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>70</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>71</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>72</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>73</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>74</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>75</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>76</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>77</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>78</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>79</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>80</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>81</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>82</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>83</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>84</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>85</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>86</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>87</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>88</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>89</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>90</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>91</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>92</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>1</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>2</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>3</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>4</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>5</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>6</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>7</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>8</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>9</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>10</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>11</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>12</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>13</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>14</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>15</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>16</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>17</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>18</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>19</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>20</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>21</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>22</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>23</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>24</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>25</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>26</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>27</index>
+ </available-wavelengths>
+ <available-wavelengths>
+ <index>28</index>
+ </available-wavelengths>
+ </degree-attributes>
+ </node>
+</network>
\ No newline at end of file
#!/usr/bin/env python
##############################################################################
-#Copyright (c) 2017 Orange, Inc. and others. All rights reserved.
+# Copyright (c) 2017 Orange, Inc. and others. All rights reserved.
#
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Apache License, Version 2.0
class TransportPCEtesting(unittest.TestCase):
odl_process = None
- restconf_baseurl = "http://127.0.0.1:8181/restconf"
+ honeynode_topology = None
+ restconf_baseurl = "http://localhost:8181/restconf"
+
+ @classmethod
+ def _get_file(cls):
+ honeynode_topology_file = "sample_configs/honeynode-topo.xml"
+ if os.path.isfile(honeynode_topology_file):
+ with open(honeynode_topology_file, 'r') as honeynode_file:
+ cls.honeynode_topo = honeynode_file.read();
@classmethod
def __start_odl(cls):
stdin=open(os.devnull))
@classmethod
- def setUpClass(cls): #a class method called before tests in an individual class run.
+ def setUpClass(cls): # a class method called before tests in an individual class run.
+ cls._get_file()
cls.__start_odl()
time.sleep(90)
cls.odl_process.send_signal(signal.SIGINT)
cls.odl_process.wait()
- def setUp(self): #instruction executed before each test method
+ def setUp(self): # instruction executed before each test method
+ print ("execution of {}".format(self.id().split(".")[-1]))
+
+ def test_01_restconfAPI(self):
+ url = ("{}/operational/network-topology:network-topology/topology/"
+ "topology-netconf/node/controller-config".format(self.restconf_baseurl))
+ headers = {'content-type': 'application/json'}
+ response = requests.request("GET", url, headers=headers, auth=('admin', 'admin'))
+ self.assertEqual(response.status_code, requests.codes.ok)
+ res = response.json()
+ self.assertEqual(res['node'] [0] ['netconf-node-topology:connection-status'],
+ 'connected')
time.sleep(1)
- #Get existing PathDesciption
- def test_01_get_pathdescriptions(self):
- url = ("{}/operational/stubpce:path-description-list/pathDescriptions/NodeAToNodeZ_direct_1"
+ # Load honeynode topology
+ def test_02_load_honeynode_topology(self):
+ url = ("{}/config/ietf-network:network/openroadm-topology"
.format(self.restconf_baseurl))
- headers = {'content-type': 'application/json',
+ body = self.honeynode_topo
+ headers = {'content-type': 'application/xml',
"Accept": "application/json"}
response = requests.request(
- "GET", url, headers=headers, auth=('admin', 'admin'))
+ "PUT", url, data=body, headers=headers,
+ auth=('admin', 'admin'))
+ self.assertEqual(response.status_code, requests.codes.ok)
+ time.sleep(2)
+
+ def test_03_check_link_xpdra_roadma(self):
+ url = ("{}/config/ietf-network:network/openroadm-topology/link/"
+ "XPDRA-XPDR1-XPDR1-NETWORK1toROADMA-SRG1-SRG1-PP1-TXRX".format(self.restconf_baseurl))
+ headers = {'content-type': 'application/json'}
+ response = requests.request("GET", url, headers=headers, auth=('admin', 'admin'))
self.assertEqual(response.status_code, requests.codes.ok)
res = response.json()
- self.assertEqual(
- res['pathDescriptions'][0]['path-name'],
- 'NodeAToNodeZ_direct_1')
time.sleep(1)
- #Get non existing PathDesciption
- def test_02_get_pathdescriptions(self):
- url = ("{}/operational/stubpce:path-description-list/pathDescriptions/Node"
- .format(self.restconf_baseurl))
- headers = {'content-type': 'application/json',
- "Accept": "application/json"}
- response = requests.request(
- "GET", url, headers=headers, auth=('admin', 'admin'))
- self.assertEqual(response.status_code, 404)
+ def test_04_check_link_xpdrc_roadmc(self):
+ url = ("{}/config/ietf-network:network/openroadm-topology/link/"
+ "XPDRC-XPDR1-XPDR1-NETWORK1toROADMC-SRG1-SRG1-PP1-TXRX".format(self.restconf_baseurl))
+ headers = {'content-type': 'application/json'}
+ response = requests.request("GET", url, headers=headers, auth=('admin', 'admin'))
+ self.assertEqual(response.status_code, requests.codes.ok)
+ res = response.json()
time.sleep(1)
- #Create Service 'test' with correct parameters
- def test_03_create_service(self):
+ def test_05_check_link_roadma_xpdra(self):
+ url = ("{}/config/ietf-network:network/openroadm-topology/link/"
+ "ROADMA-SRG1-SRG1-PP1-TXRXtoXPDRA-XPDR1-XPDR1-NETWORK1".format(self.restconf_baseurl))
+ headers = {'content-type': 'application/json'}
+ response = requests.request("GET", url, headers=headers, auth=('admin', 'admin'))
+ self.assertEqual(response.status_code, requests.codes.ok)
+ res = response.json()
+ time.sleep(1)
+
+ def test_06_check_link_roadmc_xpdrc(self):
+ url = ("{}/config/ietf-network:network/openroadm-topology/link/"
+ "ROADMC-SRG1-SRG1-PP1-TXRXtoXPDRC-XPDR1-XPDR1-NETWORK1".format(self.restconf_baseurl))
+ headers = {'content-type': 'application/json'}
+ response = requests.request("GET", url, headers=headers, auth=('admin', 'admin'))
+ self.assertEqual(response.status_code, requests.codes.ok)
+ res = response.json()
+ time.sleep(1)
+
+ # Create Service 'test' with correct parameters
+ def test_07_create_service(self):
url = ("{}/operations/org-openroadm-service:service-create"
.format(self.restconf_baseurl))
data = {"input": {
auth=('admin', 'admin'))
self.assertEqual(response.status_code, requests.codes.ok)
res = response.json()
- self.assertIn('in progress',
+ self.assertIn('Service rendered successfully !',
res['output']['configuration-response-common']['response-message'])
- time.sleep(30)
+ time.sleep(10)
- #Create Service 'test' with not compliant parameter : no 'sdnc-request-header' parameter
- def test_04_create_service(self):
+ # Create Service 'test' with not compliant parameter : no 'sdnc-request-header' parameter
+ def test_08_create_service(self):
url = ("{}/operations/org-openroadm-service:service-create"
.format(self.restconf_baseurl))
data = {"input": {
auth=('admin', 'admin'))
self.assertEqual(response.status_code, requests.codes.ok)
res = response.json()
- self.assertIn('Service not compliant',
+ self.assertIn('Service sndc-request-header is not set',
res['output']['configuration-response-common']['response-message'])
time.sleep(5)
- #Create Service 'test' with not compliant parameter : no 'tx-direction' for serviceAEnd
- def test_05_create_service(self):
+ # Create Service 'test' with not compliant parameter : no 'tx-direction' for serviceAEnd
+ def test_09_create_service(self):
url = ("{}/operations/org-openroadm-service:service-create"
.format(self.restconf_baseurl))
data = {"input": {
auth=('admin', 'admin'))
self.assertEqual(response.status_code, requests.codes.ok)
res = response.json()
- self.assertIn('Service not compliant',
+ self.assertIn('Service TxDirection is not correctly set',
res['output']['configuration-response-common']['response-message'])
time.sleep(5)
- #Get 'test' service created
- def test_06_get_service(self):
+ # Get 'test' service created
+ def test_10_get_service(self):
url = ("{}/operational/org-openroadm-service:service-list/services/test"
.format(self.restconf_baseurl))
headers = {'content-type': 'application/json',
'inService')
time.sleep(1)
- #get non existing service
- def test_07_get_service(self):
+ # get non existing service
+ def test_11_get_service(self):
url = ("{}/operational/org-openroadm-service:service-list/services/test1"
.format(self.restconf_baseurl))
headers = {'content-type': 'application/json',
self.assertEqual(response.status_code, 404)
time.sleep(1)
- #reconfigure 'test' to be 'test-new'
- def test_08_reconfigure_service(self):
- url = ("{}/operations/org-openroadm-service:service-reconfigure"
- .format(self.restconf_baseurl))
- data = {"input": {
- "service-name": "test",
- "new-service-name": "test-new",
- "common-id": "ASATT1234567",
- "connection-type": "infrastructure",
- "service-a-end": {
- "service-rate": "100",
- "node-id": "XPDRA",
- "service-format": "Ethernet",
- "clli": "SNJSCAMCJP8",
- "tx-direction": {
- "port": {
- "port-device-name": "ROUTER_SNJSCAMCJP8_000000.00_00",
- "port-type": "router",
- "port-name": "Gigabit Ethernet_Tx.ge-5/0/0.0",
- "port-rack": "000000.00",
- "port-shelf": "00"
- },
- "lgx": {
- "lgx-device-name": "LGX Panel_SNJSCAMCJP8_000000.00_00",
- "lgx-port-name": "LGX Back.3",
- "lgx-port-rack": "000000.00",
- "lgx-port-shelf": "00"
- }
- },
- "rx-direction": {
- "port": {
- "port-device-name": "ROUTER_SNJSCAMCJP8_000000.00_00",
- "port-type": "router",
- "port-name": "Gigabit Ethernet_Rx.ge-5/0/0.0",
- "port-rack": "000000.00",
- "port-shelf": "00"
- },
- "lgx": {
- "lgx-device-name": "LGX Panel_SNJSCAMCJP8_000000.00_00",
- "lgx-port-name": "LGX Back.4",
- "lgx-port-rack": "000000.00",
- "lgx-port-shelf": "00"
- }
- },
- "optic-type": "gray"
- },
- "service-z-end": {
- "service-rate": "100",
- "node-id": "XPDRC",
- "service-format": "Ethernet",
- "clli": "SNJSCAMCJT4",
- "tx-direction": {
- "port": {
- "port-device-name": "ROUTER_SNJSCAMCJT4_000000.00_00",
- "port-type": "router",
- "port-name": "Gigabit Ethernet_Tx.ge-1/0/0.0",
- "port-rack": "000000.00",
- "port-shelf": "00"
- },
- "lgx": {
- "lgx-device-name": "LGX Panel_SNJSCAMCJT4_000000.00_00",
- "lgx-port-name": "LGX Back.29",
- "lgx-port-rack": "000000.00",
- "lgx-port-shelf": "00"
- }
- },
- "rx-direction": {
- "port": {
- "port-device-name": "ROUTER_SNJSCAMCJT4_000000.00_00",
- "port-type": "router",
- "port-name": "Gigabit Ethernet_Rx.ge-1/0/0.0",
- "port-rack": "000000.00",
- "port-shelf": "00"
- },
- "lgx": {
- "lgx-device-name": "LGX Panel_SNJSCAMCJT4_000000.00_00",
- "lgx-port-name": "LGX Back.30",
- "lgx-port-rack": "000000.00",
- "lgx-port-shelf": "00"
- }
- },
- "optic-type": "gray"
- },
- "hard-constraints": {
- "diversity": {
- "existing-service": [
- "104/GE100/SNJSCAMCJP8/SNJSCAMCJT4"
- ],
- "existing-service-applicability": {
- "node": "true"
- }
- },
- "exclude": {
- "fiber-bundle": [
- "l(string)"
- ],
- "node-id": [
- "SNJSCAMCJP8_000000.00"
- ]
- },
- "latency": {
- "max-latency": "30"
- }
- }
- }
- }
- headers = {'content-type': 'application/json',
- "Accept": "application/json"}
- response = requests.request(
- "POST", url, data=json.dumps(data), headers=headers,
- auth=('admin', 'admin'))
- self.assertEqual(response.status_code, requests.codes.ok)
- res = response.json()
- self.assertIn('in progress',
- res['output']['status-message'])
- time.sleep(30)
-
-
- #get new service 'test-new'
- def test_09_get_service(self):
- url = ("{}/operational/org-openroadm-service:service-list/services/test-new"
- .format(self.restconf_baseurl))
- headers = {'content-type': 'application/json',
- "Accept": "application/json"}
- response = requests.request(
- "GET", url, headers=headers, auth=('admin', 'admin'))
- res = response.json()
- self.assertEqual(
- res['services'][0]['operational-state'],
- 'inService')
- time.sleep(1)
-
-
- #Modify 'test-new' state
- def test_10_modify_service_state(self):
- url = ("{}/operations/servicehandler:service-state-modify"
- .format(self.restconf_baseurl))
- data = {"input": {
- "service-name": "test-new",
- "operational-state": "outOfService"
- }
- }
- headers = {'content-type': 'application/json'}
- response = requests.request(
- "POST", url, data=json.dumps(data), headers=headers,
- auth=('admin', 'admin'))
- res = response.json()
- self.assertIn('Service state modified',
- res['output']['configuration-response-common']['response-message'])
- time.sleep(5)
-
-
- #get new service 'test-new' state
- def test_11_get_service(self):
- url = ("{}/operational/org-openroadm-service:service-list/services/test-new"
- .format(self.restconf_baseurl))
- headers = {'content-type': 'application/json',
- "Accept": "application/json"}
- response = requests.request(
- "GET", url, headers=headers, auth=('admin', 'admin'))
- res = response.json()
- self.assertEqual(
- res['services'][0]['operational-state'],
- 'outOfService')
- time.sleep(1)
-
-
- #restore service 'test-new'
- def test_12_restore_service(self):
- url = ("{}/operations/org-openroadm-service:service-restoration"
- .format(self.restconf_baseurl))
- data = {"input": {
- "service-name": "test-new",
- "option": "permanent"
- }
- }
- headers = {'content-type': 'application/json'}
- response = requests.request(
- "POST", url, data=json.dumps(data), headers=headers,
- auth=('admin', 'admin'))
- res = response.json()
- self.assertIn('in progress',
- res['output']['status-message'])
- time.sleep(60)
-
-
- #get new service 'test-new' state
- def test_13_get_service(self):
- url = ("{}/operational/org-openroadm-service:service-list/services/test-new"
- .format(self.restconf_baseurl))
- headers = {'content-type': 'application/json',
- "Accept": "application/json"}
- response = requests.request(
- "GET", url, headers=headers, auth=('admin', 'admin'))
- res = response.json()
- self.assertEqual(
- res['services'][0]['operational-state'],
- 'inService')
- time.sleep(1)
-
-
- #Delete 'test-new' service
- def test_14_delete_service(self):
- url = ("{}/operations/org-openroadm-service:service-delete"
- .format(self.restconf_baseurl))
- data = {"input": {
- "sdnc-request-header": {
- "request-id": "e3028bae-a90f-4ddd-a83f-cf224eba0e58",
- "rpc-action": "service-delete",
- "request-system-id": "appname",
- "notification-url": "http://localhost:8585/NotificationServer/notify"
- },
- "service-delete-req-info": {
- "service-name": "test-new",
- "due-date": "2016-11-28T00:00:01Z",
- "tail-retention": "no"
- }
- }
- }
- headers = {'content-type': 'application/json'}
- response = requests.request(
- "POST", url, data=json.dumps(data), headers=headers,
- auth=('admin', 'admin'))
- res = response.json()
- self.assertIn('in progress',
- res['output']['configuration-response-common']['response-message'])
- time.sleep(30)
-
-
- #Delete non existing service
- def test_15_delete_service(self):
+# These tests is not available in this commit (cf commit message )
+# reconfigure 'test' to be 'test-new'
+# def test_08_reconfigure_service(self):
+# url = ("{}/operations/org-openroadm-service:service-reconfigure"
+# .format(self.restconf_baseurl))
+# data = {"input": {
+# "service-name": "test",
+# "new-service-name": "test-new",
+# "common-id": "ASATT1234567",
+# "connection-type": "infrastructure",
+# "service-a-end": {
+# "service-rate": "100",
+# "node-id": "XPDRA",
+# "service-format": "Ethernet",
+# "clli": "SNJSCAMCJP8",
+# "tx-direction": {
+# "port": {
+# "port-device-name": "ROUTER_SNJSCAMCJP8_000000.00_00",
+# "port-type": "router",
+# "port-name": "Gigabit Ethernet_Tx.ge-5/0/0.0",
+# "port-rack": "000000.00",
+# "port-shelf": "00"
+# },
+# "lgx": {
+# "lgx-device-name": "LGX Panel_SNJSCAMCJP8_000000.00_00",
+# "lgx-port-name": "LGX Back.3",
+# "lgx-port-rack": "000000.00",
+# "lgx-port-shelf": "00"
+# }
+# },
+# "rx-direction": {
+# "port": {
+# "port-device-name": "ROUTER_SNJSCAMCJP8_000000.00_00",
+# "port-type": "router",
+# "port-name": "Gigabit Ethernet_Rx.ge-5/0/0.0",
+# "port-rack": "000000.00",
+# "port-shelf": "00"
+# },
+# "lgx": {
+# "lgx-device-name": "LGX Panel_SNJSCAMCJP8_000000.00_00",
+# "lgx-port-name": "LGX Back.4",
+# "lgx-port-rack": "000000.00",
+# "lgx-port-shelf": "00"
+# }
+# },
+# "optic-type": "gray"
+# },
+# "service-z-end": {
+# "service-rate": "100",
+# "node-id": "XPDRC",
+# "service-format": "Ethernet",
+# "clli": "SNJSCAMCJT4",
+# "tx-direction": {
+# "port": {
+# "port-device-name": "ROUTER_SNJSCAMCJT4_000000.00_00",
+# "port-type": "router",
+# "port-name": "Gigabit Ethernet_Tx.ge-1/0/0.0",
+# "port-rack": "000000.00",
+# "port-shelf": "00"
+# },
+# "lgx": {
+# "lgx-device-name": "LGX Panel_SNJSCAMCJT4_000000.00_00",
+# "lgx-port-name": "LGX Back.29",
+# "lgx-port-rack": "000000.00",
+# "lgx-port-shelf": "00"
+# }
+# },
+# "rx-direction": {
+# "port": {
+# "port-device-name": "ROUTER_SNJSCAMCJT4_000000.00_00",
+# "port-type": "router",
+# "port-name": "Gigabit Ethernet_Rx.ge-1/0/0.0",
+# "port-rack": "000000.00",
+# "port-shelf": "00"
+# },
+# "lgx": {
+# "lgx-device-name": "LGX Panel_SNJSCAMCJT4_000000.00_00",
+# "lgx-port-name": "LGX Back.30",
+# "lgx-port-rack": "000000.00",
+# "lgx-port-shelf": "00"
+# }
+# },
+# "optic-type": "gray"
+# },
+# "hard-constraints": {
+# "diversity": {
+# "existing-service": [
+# "104/GE100/SNJSCAMCJP8/SNJSCAMCJT4"
+# ],
+# "existing-service-applicability": {
+# "node": "true"
+# }
+# },
+# "exclude": {
+# "fiber-bundle": [
+# "l(string)"
+# ],
+# "node-id": [
+# "SNJSCAMCJP8_000000.00"
+# ]
+# },
+# "latency": {
+# "max-latency": "30"
+# }
+# }
+# }
+# }
+# headers = {'content-type': 'application/json',
+# "Accept": "application/json"}
+# response = requests.request(
+# "POST", url, data=json.dumps(data), headers=headers,
+# auth=('admin', 'admin'))
+# self.assertEqual(response.status_code, requests.codes.ok)
+# res = response.json()
+# self.assertIn('in progress',
+# res['output']['status-message'])
+# time.sleep(30)
+#
+# # get new service 'test-new'
+# def test_09_get_service(self):
+# url = ("{}/operational/org-openroadm-service:service-list/services/test-new"
+# .format(self.restconf_baseurl))
+# headers = {'content-type': 'application/json',
+# "Accept": "application/json"}
+# response = requests.request(
+# "GET", url, headers=headers, auth=('admin', 'admin'))
+# res = response.json()
+# self.assertEqual(
+# res['services'][0]['operational-state'],
+# 'inService')
+# time.sleep(1)
+#
+# # Modify 'test-new' state
+# def test_10_modify_service_state(self):
+# url = ("{}/operations/servicehandler:service-state-modify"
+# .format(self.restconf_baseurl))
+# data = {"input": {
+# "service-name": "test-new",
+# "operational-state": "outOfService"
+# }
+# }
+# headers = {'content-type': 'application/json'}
+# response = requests.request(
+# "POST", url, data=json.dumps(data), headers=headers,
+# auth=('admin', 'admin'))
+# res = response.json()
+# self.assertIn('Service state modified',
+# res['output']['configuration-response-common']['response-message'])
+# time.sleep(5)
+#
+# # get new service 'test-new' state
+# def test_11_get_service(self):
+# url = ("{}/operational/org-openroadm-service:service-list/services/test-new"
+# .format(self.restconf_baseurl))
+# headers = {'content-type': 'application/json',
+# "Accept": "application/json"}
+# response = requests.request(
+# "GET", url, headers=headers, auth=('admin', 'admin'))
+# res = response.json()
+# self.assertEqual(
+# res['services'][0]['operational-state'],
+# 'outOfService')
+# time.sleep(1)
+#
+# # restore service 'test-new'
+# def test_12_restore_service(self):
+# url = ("{}/operations/org-openroadm-service:service-restoration"
+# .format(self.restconf_baseurl))
+# data = {"input": {
+# "service-name": "test-new",
+# "option": "permanent"
+# }
+# }
+# headers = {'content-type': 'application/json'}
+# response = requests.request(
+# "POST", url, data=json.dumps(data), headers=headers,
+# auth=('admin', 'admin'))
+# res = response.json()
+# self.assertIn('in progress',
+# res['output']['status-message'])
+# time.sleep(60)
+#
+# # get new service 'test-new' state
+# def test_13_get_service(self):
+# url = ("{}/operational/org-openroadm-service:service-list/services/test-new"
+# .format(self.restconf_baseurl))
+# headers = {'content-type': 'application/json',
+# "Accept": "application/json"}
+# response = requests.request(
+# "GET", url, headers=headers, auth=('admin', 'admin'))
+# res = response.json()
+# self.assertEqual(
+# res['services'][0]['operational-state'],
+# 'inService')
+# time.sleep(1)
+
+ # Delete non existing service
+ def test_12_delete_service(self):
url = ("{}/operations/org-openroadm-service:service-delete"
.format(self.restconf_baseurl))
data = {"input": {
auth=('admin', 'admin'))
self.assertEqual(response.status_code, requests.codes.ok)
res = response.json()
- self.assertIn('not exists in datastore',
+ self.assertIn('Service delete was successful!',
res['output']['configuration-response-common']['response-message'])
time.sleep(1)
-
- #Verify 'test' service deleted
- def test_16_get_service(self):
+ # Verify 'test' service deleted
+ def test_13_get_service(self):
url = ("{}/operational/org-openroadm-service:service-list/services/test-new"
.format(self.restconf_baseurl))
headers = {'content-type': 'application/json',
self.assertEqual(response.status_code, 404)
time.sleep(1)
+
if __name__ == "__main__":
unittest.main(verbosity=2)