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;
* @return a builder for AtoZDirection object
*/
private AToZDirectionBuilder buildAtoZDirection(Map<AToZKey, AToZ> 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:
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:
* @return a builder for ZtoADirection object
*/
private ZToADirectionBuilder buildZtoADirection(Map<ZToAKey, ZToA> 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:
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:
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;
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;
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;
}
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<SupportingServiceHierarchyKey, SupportingServiceHierarchy> supportingServiceHierarchyMap = new HashMap<>();
+ Map<NmcCtpKey, NmcCtp> 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())
.setServiceZEnd(
new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210
.service.ServiceZEndBuilder(tempServiceCreateInput.getServiceZEnd()).build())
+ .setSupportingServiceHierarchy(supportingServiceHierarchyMap)
.build();
}
private void onPathComputationResult(ServicePathRpcResult notification) {
LOG.info("PCE '{}' Notification received : {}", servicePathRpcResult.getNotificationType().getName(),
notification);
+
if (!checkStatus(notification)) {
return;
}
}
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 !");
}
*
* @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<ServicePathList> getServicePaths();
}
@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<org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.temp.service.list
.Services.class, new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.temp
.service.list.ServicesKey(tempServiceCreateInput.getCommonId()));
org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.temp.service.list
- .Services service = ModelMappingUtils.mappingServices(tempServiceCreateInput);
+ .Services service = ModelMappingUtils.mappingServices(tempServiceCreateInput, pathDescription);
WriteTransaction writeTx = this.dataBroker.newWriteOnlyTransaction();
writeTx.put(LogicalDatastoreType.OPERATIONAL, iid, service);
writeTx.commit().get(Timeouts.DATASTORE_WRITE, TimeUnit.MILLISECONDS);
.build();
}
- @Test
- //TODO : is this unit test relevant ?
- void mappingServicesNullServiceCreateInput() {
- Services services = ModelMappingUtils.mappingServices(null, null);
- assertEquals(new ServicesBuilder().withKey(new ServicesKey("unknown")).build(), services);
- }
-
@Test
void mappingServiceNotNullServiceReconfigureInput() {
Services services = ModelMappingUtils.mappingServices(null, buildServiceConfigurationInput());
import org.opendaylight.transportpce.test.AbstractTest;
import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRequestOutputBuilder;
import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220808.PathComputationRerouteRequestOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.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.ConfigurationResponseCommonBuilder;
import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.AddOpenroadmOperationalModesToCatalogInputBuilder;
@Mock
private NetworkListener networkModelListenerImpl;
+ @Mock
+ private PathDescription pathDescription;
private ServiceDataStoreOperations serviceDataStoreOperations;
private CatalogDataStoreOperations catalogDataStoreOperations;
private ServiceCreateInput serviceCreateInput;
serviceReconfigureInput = ServiceDataUtils.buildServiceReconfigureInput();
serviceRestorationInput = ServiceDataUtils.buildServiceRestorationInput();
serviceRerouteInput = ServiceDataUtils.buildServiceRerouteInput();
+ pathDescription = ServiceDataUtils.createPathDescription(0,1,0,1);
}
@Test
when(rendererServiceOperations.serviceDelete(any(), any())).thenReturn(Futures.immediateFuture(any()));
//create temp service to delete in the temp delete action
TempServiceCreateInput createInput = ServiceDataUtils.buildTempServiceCreateInput();
- serviceDataStoreOperations.createTempService(createInput);
+ serviceDataStoreOperations.createTempService(createInput, pathDescription);
ListenableFuture<RpcResult<TempServiceDeleteOutput>> 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(
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;
@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<org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.temp.service.list
.Services> optService = this.serviceDataStoreOperations.getTempService(createInput.getCommonId());
@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());
}
@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());