From 82c8dcb18fd78b876fbdceb40c9f6a14259f2c98 Mon Sep 17 00:00:00 2001 From: "Balagangadhar (Bala) Bathula" Date: Mon, 1 May 2023 14:42:12 -0400 Subject: [PATCH] Update path-description data for temp service list - When a temp-service is created, the temp-service list should indicate the transport assigment details. - Using path description data of the temp-service, update transport assignment details such as min-freq, max-freq, spectral-width and central-frquency. Change-Id: If59a863eee3cd5419ee97490fee8fbfde6ab18cd Signed-off-by: Balagangadhar (Bala) Bathula --- .../transportpce/pce/PcePathDescription.java | 34 ++++++++++----- .../servicehandler/ModelMappingUtils.java | 41 ++++++++++++++++++- .../listeners/PceListenerImpl.java | 5 ++- .../service/ServiceDataStoreOperations.java | 5 ++- .../ServiceDataStoreOperationsImpl.java | 7 +++- .../servicehandler/ModelMappingUtilsTest.java | 7 ---- .../impl/ServicehandlerImplTest.java | 16 +++++--- .../ServiceDataStoreOperationsImplTest.java | 13 ++++-- 8 files changed, 96 insertions(+), 32 deletions(-) diff --git a/pce/src/main/java/org/opendaylight/transportpce/pce/PcePathDescription.java b/pce/src/main/java/org/opendaylight/transportpce/pce/PcePathDescription.java index d1aee6ed4..f25313278 100644 --- a/pce/src/main/java/org/opendaylight/transportpce/pce/PcePathDescription.java +++ b/pce/src/main/java/org/opendaylight/transportpce/pce/PcePathDescription.java @@ -14,6 +14,7 @@ import java.util.Map; import org.opendaylight.transportpce.common.ResponseCodes; import org.opendaylight.transportpce.common.StringConstants; import org.opendaylight.transportpce.common.fixedflex.GridConstant; +import org.opendaylight.transportpce.common.fixedflex.GridUtils; import org.opendaylight.transportpce.pce.networkanalyzer.PceLink; import org.opendaylight.transportpce.pce.networkanalyzer.PceResult; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev211210.FrequencyTHz; @@ -87,10 +88,11 @@ public class PcePathDescription { * @return a builder for AtoZDirection object */ private AToZDirectionBuilder buildAtoZDirection(Map atozMap) { + ModulationFormat modulationFormat = GridConstant.RATE_MODULATION_FORMAT_MAP + .getOrDefault(Uint32.valueOf(rc.getRate()), ModulationFormat.DpQpsk); AToZDirectionBuilder atoZDirectionBldr = new AToZDirectionBuilder() .setRate(Uint32.valueOf(rc.getRate())) - .setModulationFormat(GridConstant.RATE_MODULATION_FORMAT_MAP - .getOrDefault(Uint32.valueOf(rc.getRate()), ModulationFormat.DpQpsk).getName()) + .setModulationFormat(modulationFormat.getName()) .setAToZ(atozMap); switch (rc.getServiceType()) { case StringConstants.SERVICE_TYPE_400GE: @@ -99,9 +101,15 @@ public class PcePathDescription { case StringConstants.SERVICE_TYPE_OTUC4: case StringConstants.SERVICE_TYPE_100GE_T: case StringConstants.SERVICE_TYPE_OTU4: - atoZDirectionBldr.setAToZMaxFrequency(new FrequencyTHz(Decimal64.valueOf(rc.getMaxFreq()))); - atoZDirectionBldr.setAToZMinFrequency(new FrequencyTHz(Decimal64.valueOf(rc.getMinFreq()))); - atoZDirectionBldr.setAToZWavelengthNumber(Uint32.valueOf(rc.getResultWavelength())); + atoZDirectionBldr + .setAToZMaxFrequency(new FrequencyTHz(Decimal64.valueOf(rc.getMaxFreq()))) + .setAToZMinFrequency(new FrequencyTHz(Decimal64.valueOf(rc.getMinFreq()))) + .setAToZWavelengthNumber(Uint32.valueOf(rc.getResultWavelength())) + // Used precision 5 to get the exact decimal values of the frequency + .setCentralFrequency(new FrequencyTHz(GridUtils.getCentralFrequencyWithPrecision( + rc.getMinFreq(), rc.getMaxFreq(), 5).getValue())) + .setWidth(GridUtils.getWidthFromRateAndModulationFormat( + Uint32.valueOf(rc.getRate()), modulationFormat)); break; case StringConstants.SERVICE_TYPE_100GE_M: case StringConstants.SERVICE_TYPE_100GE_S: @@ -135,9 +143,10 @@ public class PcePathDescription { * @return a builder for ZtoADirection object */ private ZToADirectionBuilder buildZtoADirection(Map ztoaMap) { + ModulationFormat modulationFormat = GridConstant.RATE_MODULATION_FORMAT_MAP + .getOrDefault(Uint32.valueOf(rc.getRate()), ModulationFormat.DpQpsk); ZToADirectionBuilder ztoADirectionBldr = new ZToADirectionBuilder().setRate(Uint32.valueOf(rc.getRate())) - .setModulationFormat(GridConstant.RATE_MODULATION_FORMAT_MAP - .getOrDefault(Uint32.valueOf(rc.getRate()), ModulationFormat.DpQpsk).getName()) + .setModulationFormat(modulationFormat.getName()) .setZToA(ztoaMap); switch (rc.getServiceType()) { case StringConstants.SERVICE_TYPE_400GE: @@ -146,9 +155,14 @@ public class PcePathDescription { case StringConstants.SERVICE_TYPE_OTUC4: case StringConstants.SERVICE_TYPE_100GE_T: case StringConstants.SERVICE_TYPE_OTU4: - ztoADirectionBldr.setZToAMaxFrequency(new FrequencyTHz(Decimal64.valueOf(rc.getMaxFreq()))); - ztoADirectionBldr.setZToAMinFrequency(new FrequencyTHz(Decimal64.valueOf(rc.getMinFreq()))); - ztoADirectionBldr.setZToAWavelengthNumber(Uint32.valueOf(rc.getResultWavelength())); + ztoADirectionBldr + .setZToAMaxFrequency(new FrequencyTHz(Decimal64.valueOf(rc.getMaxFreq()))) + .setZToAMinFrequency(new FrequencyTHz(Decimal64.valueOf(rc.getMinFreq()))) + .setZToAWavelengthNumber(Uint32.valueOf(rc.getResultWavelength())) + .setCentralFrequency(new FrequencyTHz(GridUtils.getCentralFrequencyWithPrecision( + rc.getMinFreq(), rc.getMaxFreq(), 4).getValue())) + .setWidth(GridUtils.getWidthFromRateAndModulationFormat( + Uint32.valueOf(rc.getRate()), modulationFormat)); break; case StringConstants.SERVICE_TYPE_100GE_M: case StringConstants.SERVICE_TYPE_100GE_S: 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 302227797..59d9f9c51 100644 --- a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/ModelMappingUtils.java +++ b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/ModelMappingUtils.java @@ -9,6 +9,8 @@ package org.opendaylight.transportpce.servicehandler; import com.google.common.collect.ImmutableMap; import com.google.common.util.concurrent.ListenableFuture; +import java.util.HashMap; +import java.util.Map; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestOutput; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.path.computation.request.input.ServiceAEnd; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.path.computation.request.input.ServiceAEndBuilder; @@ -22,6 +24,11 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.common.node.types.rev2105 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ServiceEndpoint; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.configuration.response.common.ConfigurationResponseCommonBuilder; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.response.parameters.ResponseParametersBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.hierarchy.TransportAssignmentBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.hierarchy.transport.assignment.McTtpBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.hierarchy.transport.assignment.NmcCtp; +import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.hierarchy.transport.assignment.NmcCtpBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.hierarchy.transport.assignment.NmcCtpKey; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.LifecycleState; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State; import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates; @@ -79,6 +86,9 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempSer import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.list.Services; import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.list.ServicesBuilder; import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.list.ServicesKey; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.temp.service.list.services.SupportingServiceHierarchy; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.temp.service.list.services.SupportingServiceHierarchyBuilder; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.temp.service.list.services.SupportingServiceHierarchyKey; import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.endpoint.sp.RxDirection; import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.endpoint.sp.RxDirectionBuilder; import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.endpoint.sp.TxDirection; @@ -517,7 +527,35 @@ public final class ModelMappingUtils { } public static org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210 - .temp.service.list.Services mappingServices(TempServiceCreateInput tempServiceCreateInput) { + .temp.service.list.Services mappingServices(TempServiceCreateInput tempServiceCreateInput, + PathDescription pathDescription) { + Map supportingServiceHierarchyMap = new HashMap<>(); + Map nmcCtpMap = new HashMap<>(); + SupportingServiceHierarchyKey supportingServiceHierarchyKey = new SupportingServiceHierarchyKey( + tempServiceCreateInput.getCommonId()); + // TODO: here we assume the A-Z and Z-A has parameters + LOG.info("Min and Max frequencies are {} {}", pathDescription.getAToZDirection().getAToZMinFrequency(), + pathDescription.getAToZDirection().getAToZMinFrequency()); + nmcCtpMap.put( + new NmcCtpKey("1"), + new NmcCtpBuilder() + .setId("1") + .setFrequency(pathDescription.getAToZDirection().getCentralFrequency()) + .setWidth(pathDescription.getAToZDirection().getWidth()) + .build()); + supportingServiceHierarchyMap.put( + supportingServiceHierarchyKey, + new SupportingServiceHierarchyBuilder().setServiceIdentifier(tempServiceCreateInput.getCommonId()) + .setTransportAssignment( + new TransportAssignmentBuilder() + .setMcTtp( + new McTtpBuilder() + .setMaxFreq(pathDescription.getAToZDirection().getAToZMaxFrequency()) + .setMinFreq(pathDescription.getAToZDirection().getAToZMinFrequency()) + .build()) + .setNmcCtp(nmcCtpMap) + .build()) + .build()); return new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210 .temp.service.list.ServicesBuilder() .setServiceName(tempServiceCreateInput.getCommonId()) @@ -537,6 +575,7 @@ public final class ModelMappingUtils { .setServiceZEnd( new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210 .service.ServiceZEndBuilder(tempServiceCreateInput.getServiceZEnd()).build()) + .setSupportingServiceHierarchy(supportingServiceHierarchyMap) .build(); } diff --git a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/listeners/PceListenerImpl.java b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/listeners/PceListenerImpl.java index cc0037390..8d1b4a35f 100644 --- a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/listeners/PceListenerImpl.java +++ b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/listeners/PceListenerImpl.java @@ -96,6 +96,7 @@ public class PceListenerImpl implements TransportpcePceListener, PceListener { private void onPathComputationResult(ServicePathRpcResult notification) { LOG.info("PCE '{}' Notification received : {}", servicePathRpcResult.getNotificationType().getName(), notification); + if (!checkStatus(notification)) { return; } @@ -119,7 +120,9 @@ public class PceListenerImpl implements TransportpcePceListener, PceListener { } OperationResult operationResult = null; if (tempService) { - operationResult = this.serviceDataStoreOperations.createTempService(input.getTempServiceCreateInput()); + operationResult = + this.serviceDataStoreOperations.createTempService( + input.getTempServiceCreateInput(), pathDescription); if (!operationResult.isSuccess()) { LOG.error("Temp Service not created in datastore !"); } diff --git a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/service/ServiceDataStoreOperations.java b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/service/ServiceDataStoreOperations.java index ced0f3969..a58d9e4f9 100644 --- a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/service/ServiceDataStoreOperations.java +++ b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/service/ServiceDataStoreOperations.java @@ -124,9 +124,12 @@ public interface ServiceDataStoreOperations { * * @param tempServiceCreateInput tempServiceCreateInput data for creation of * service + * @param pathDescription data to update the transport-assignment of the service * @return result of createTempService operation */ - OperationResult createTempService(TempServiceCreateInput tempServiceCreateInput); + OperationResult createTempService(TempServiceCreateInput tempServiceCreateInput, + org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808 + .service.path.rpc.result.PathDescription pathDescription); Optional getServicePaths(); diff --git a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/service/ServiceDataStoreOperationsImpl.java b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/service/ServiceDataStoreOperationsImpl.java index bd0697bed..aa905f080 100644 --- a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/service/ServiceDataStoreOperationsImpl.java +++ b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/service/ServiceDataStoreOperationsImpl.java @@ -276,7 +276,10 @@ public class ServiceDataStoreOperationsImpl implements ServiceDataStoreOperation } @Override - public OperationResult createTempService(TempServiceCreateInput tempServiceCreateInput) { + public OperationResult createTempService( + TempServiceCreateInput tempServiceCreateInput, + org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808 + .service.path.rpc.result.PathDescription pathDescription) { LOG.debug("Writing '{}' Temp Service", tempServiceCreateInput.getCommonId()); try { InstanceIdentifier> result = - new ServicehandlerImpl( - pathComputationService, rendererServiceOperations, notificationPublishService, - pceListenerImpl, rendererListenerImpl, networkModelListenerImpl, - serviceDataStoreOperations, catalogDataStoreOperations) - .tempServiceDelete(ServiceDataUtils.buildTempServiceDeleteInput(createInput.getCommonId())); + new ServicehandlerImpl( + pathComputationService, rendererServiceOperations, notificationPublishService, + pceListenerImpl, rendererListenerImpl, networkModelListenerImpl, + serviceDataStoreOperations, catalogDataStoreOperations) + .tempServiceDelete(ServiceDataUtils.buildTempServiceDeleteInput(createInput.getCommonId())); result.addListener(() -> endSignal.countDown(), executorService); endSignal.await(); assertEquals( diff --git a/servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/service/ServiceDataStoreOperationsImplTest.java b/servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/service/ServiceDataStoreOperationsImplTest.java index 3d84b2580..2dee1f3c1 100644 --- a/servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/service/ServiceDataStoreOperationsImplTest.java +++ b/servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/service/ServiceDataStoreOperationsImplTest.java @@ -24,6 +24,7 @@ import org.opendaylight.transportpce.servicehandler.utils.ServiceDataUtils; import org.opendaylight.transportpce.test.AbstractTest; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestOutput; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestOutputBuilder; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.service.path.rpc.result.PathDescription; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.configuration.response.common.ConfigurationResponseCommon; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.configuration.response.common.ConfigurationResponseCommonBuilder; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State; @@ -182,14 +183,16 @@ public class ServiceDataStoreOperationsImplTest extends AbstractTest { @Test void createTempServiceShouldBeSuccessForValidInput() { TempServiceCreateInput createInput = ServiceDataUtils.buildTempServiceCreateInput(); - OperationResult result = this.serviceDataStoreOperations.createTempService(createInput); + PathDescription pathDescription = ServiceDataUtils.createPathDescription(0,1, 0, 1); + OperationResult result = this.serviceDataStoreOperations.createTempService(createInput, pathDescription); assertTrue(result.isSuccess()); } @Test void getTempServiceShouldReturnTheCorrectTempServiceForTheCreatedService() { TempServiceCreateInput createInput = ServiceDataUtils.buildTempServiceCreateInput(); - this.serviceDataStoreOperations.createTempService(createInput); + PathDescription pathDescription = ServiceDataUtils.createPathDescription(0,1, 0, 1); + this.serviceDataStoreOperations.createTempService(createInput, pathDescription); Optional optService = this.serviceDataStoreOperations.getTempService(createInput.getCommonId()); @@ -200,7 +203,8 @@ public class ServiceDataStoreOperationsImplTest extends AbstractTest { @Test void deleteTempServiceShouldBeSuccessfulForDeletingTempService() { TempServiceCreateInput createInput = ServiceDataUtils.buildTempServiceCreateInput(); - this.serviceDataStoreOperations.createTempService(createInput); + PathDescription pathDescription = ServiceDataUtils.createPathDescription(0,1, 0, 1); + this.serviceDataStoreOperations.createTempService(createInput, pathDescription); OperationResult result = this.serviceDataStoreOperations.deleteTempService(createInput.getCommonId()); assertTrue(result.isSuccess()); } @@ -208,7 +212,8 @@ public class ServiceDataStoreOperationsImplTest extends AbstractTest { @Test void modifyTempServiceIsSuccessfulForPresentTempService() { TempServiceCreateInput createInput = ServiceDataUtils.buildTempServiceCreateInput(); - this.serviceDataStoreOperations.createTempService(createInput); + PathDescription pathDescription = ServiceDataUtils.createPathDescription(0,1, 0, 1); + this.serviceDataStoreOperations.createTempService(createInput, pathDescription); OperationResult result = this.serviceDataStoreOperations.modifyTempService( createInput.getCommonId(), State.InService, AdminStates.InService); assertTrue(result.isSuccess()); -- 2.36.6