import org.opendaylight.transportpce.pce.service.PathComputationService;
import org.opendaylight.transportpce.renderer.NetworkModelWavelengthService;
import org.opendaylight.transportpce.renderer.provisiondevice.RendererServiceOperations;
+import org.opendaylight.transportpce.servicehandler.DowngradeConstraints;
import org.opendaylight.transportpce.servicehandler.ModelMappingUtils;
import org.opendaylight.transportpce.servicehandler.ServiceInput;
import org.opendaylight.transportpce.servicehandler.listeners.PceListenerImpl;
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.sdnc.request.header.SdncRequestHeaderBuilder;
import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.RpcStatus;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.State;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constrains.rev161014.routing.constraints.HardConstraints;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constrains.rev161014.routing.constraints.SoftConstraints;
import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev161014.EquipmentNotificationInput;
import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev161014.EquipmentNotificationOutput;
import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev161014.NetworkReOptimizationInput;
@Override
public ListenableFuture<RpcResult<ServiceFeasibilityCheckOutput>> serviceFeasibilityCheck(
ServiceFeasibilityCheckInput input) {
- throw new UnsupportedOperationException("Not implemented yet");
+ LOG.info("RPC service feasibility check received");
+ // Validation
+ ServiceInput serviceInput = new ServiceInput(input);
+ OperationResult validationResult = ServiceCreateValidation.validateServiceCreateRequest(serviceInput,
+ RpcActions.ServiceFeasibilityCheck);
+ if (! validationResult.isSuccess()) {
+ LOG.warn("Aborting service feasibility check because validation of service create request failed: {}",
+ validationResult.getResultMessage());
+ return ModelMappingUtils.createCreateServiceReply(input, ResponseCodes.FINAL_ACK_YES,
+ validationResult.getResultMessage(), ResponseCodes.RESPONSE_FAILED);
+ }
+ this.pceListenerImpl.setInput(new ServiceInput(input));
+ this.pceListenerImpl.setServiceReconfigure(false);
+ this.pceListenerImpl.setServiceFeasiblity(true);
+ this.pceListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
+ this.rendererListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
+ this.rendererListenerImpl.setServiceInput(new ServiceInput(input));
+ LOG.info("Commencing PCE");
+ PathComputationRequestOutput output = this.pceServiceWrapper.performPCE(input, true);
+ if (output != null) {
+ LOG.info("Service compliant, serviceFeasibilityCheck in progress...");
+ ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
+ return ModelMappingUtils.createCreateServiceReply(input, common.getAckFinalIndicator(),
+ common.getResponseMessage(), common.getResponseCode());
+ } else {
+ return ModelMappingUtils.createCreateServiceReply(input, ResponseCodes.FINAL_ACK_YES,
+ "PCE calculation failed", ResponseCodes.RESPONSE_FAILED);
+ }
}
@Override
public ListenableFuture<RpcResult<ServiceReconfigureOutput>> serviceReconfigure(ServiceReconfigureInput input) {
- throw new UnsupportedOperationException("Not implemented yet");
+ LOG.info("RPC service reconfigure received");
+ String message = "";
+ Optional<Services> servicesObject = this.serviceDataStoreOperations.getService(input.getServiceName());
+ if (servicesObject.isPresent()) {
+ LOG.info("Service '{}' is present", input.getServiceName());
+ OperationResult validationResult = ServiceCreateValidation
+ .validateServiceCreateRequest(new ServiceInput(input), RpcActions.ServiceReconfigure);
+ if (!validationResult.isSuccess()) {
+ LOG.warn("Aborting service reconfigure because validation of service create request failed: {}",
+ validationResult.getResultMessage());
+ return ModelMappingUtils.createCreateServiceReply(input, validationResult.getResultMessage(),
+ RpcStatus.Failed);
+ }
+ this.pceListenerImpl.setInput(new ServiceInput(input));
+ this.pceListenerImpl.setServiceReconfigure(true);
+ this.pceListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
+ this.rendererListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
+ this.rendererListenerImpl.setServiceInput(new ServiceInput(input));
+ org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev171017
+ .ServiceDeleteInput serviceDeleteInput =
+ ModelMappingUtils.createServiceDeleteInput(new ServiceInput(input));
+ org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev171017
+ .ServiceDeleteOutput output = this.rendererServiceWrapper.performRenderer(serviceDeleteInput,
+ ServiceNotificationTypes.ServiceDeleteResult);
+ if (output != null) {
+ LOG.info("Service compliant, service reconfigure in progress...");
+ ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
+ return ModelMappingUtils.createCreateServiceReply(input, common.getResponseMessage(),
+ RpcStatus.Successful);
+ } else {
+ return ModelMappingUtils.createCreateServiceReply(input, "Renderer service delete failed !",
+ RpcStatus.Successful);
+ }
+ } else {
+ LOG.error("Service '{}' is not present", input.getServiceName());
+ message = "Service '" + input.getServiceName() + "' is not present";
+ return ModelMappingUtils.createCreateServiceReply(input, message, RpcStatus.Failed);
+ }
}
@Override
public ListenableFuture<RpcResult<ServiceRestorationOutput>> serviceRestoration(ServiceRestorationInput input) {
- throw new UnsupportedOperationException("Not implemented yet");
+ LOG.info("RPC service restoration received");
+ String message = "";
+ String serviceName = input.getServiceName();
+ Optional<Services> servicesObject = this.serviceDataStoreOperations.getService(serviceName);
+ if (servicesObject.isPresent()) {
+ Services service = servicesObject.get();
+ State state = service.getOperationalState();
+ if (state != State.InService) {
+ ServiceDeleteInputBuilder deleteInputBldr = new ServiceDeleteInputBuilder();
+ DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssxxx");
+ OffsetDateTime offsetDateTime = OffsetDateTime.now(ZoneOffset.UTC);
+ DateAndTime datetime = new DateAndTime(dtf.format(offsetDateTime));
+ deleteInputBldr.setServiceDeleteReqInfo(new ServiceDeleteReqInfoBuilder()
+ .setServiceName(serviceName).setDueDate(datetime)
+ .setTailRetention(TailRetention.No).build());
+ SdncRequestHeaderBuilder sdncBuilder = new SdncRequestHeaderBuilder();
+ sdncBuilder.setNotificationUrl(service.getSdncRequestHeader().getNotificationUrl());
+ sdncBuilder.setRequestId(service.getSdncRequestHeader().getRequestId());
+ sdncBuilder.setRequestSystemId(service.getSdncRequestHeader().getRequestSystemId());
+ sdncBuilder.setRpcAction(RpcActions.ServiceDelete);
+ deleteInputBldr.setSdncRequestHeader(sdncBuilder.build());
+ ServiceInput serviceInput = new ServiceInput(deleteInputBldr.build());
+ serviceInput.setServiceAEnd(service.getServiceAEnd());
+ serviceInput.setServiceZEnd(service.getServiceZEnd());
+ serviceInput.setConnectionType(service.getConnectionType());
+ HardConstraints hardConstraints = service.getHardConstraints();
+ if (hardConstraints != null) {
+ SoftConstraints softConstraints = service.getSoftConstraints();
+ if (softConstraints != null) {
+ LOG.info("converting hard constraints to soft constraints ...");
+ serviceInput.setSoftConstraints(
+ DowngradeConstraints.updateSoftConstraints(hardConstraints, softConstraints));
+ serviceInput.setHardConstraints(DowngradeConstraints.downgradeHardConstraints(hardConstraints));
+ } else {
+ LOG.warn("service '{}' SoftConstraints is not set !", serviceName);
+ serviceInput.setSoftConstraints(DowngradeConstraints.convertToSoftConstraints(hardConstraints));
+ serviceInput.setHardConstraints(DowngradeConstraints.downgradeHardConstraints(hardConstraints));
+ }
+ } else {
+ LOG.warn("service '{}' HardConstraints is not set !", serviceName);
+ }
+ this.pceListenerImpl.setInput(serviceInput);
+ this.pceListenerImpl.setServiceReconfigure(true);
+ this.pceListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
+ this.rendererListenerImpl.setServiceInput(serviceInput);
+ this.rendererListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
+ org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev171017
+ .ServiceDeleteInput serviceDeleteInput = ModelMappingUtils.createServiceDeleteInput(
+ new ServiceInput(deleteInputBldr.build()));
+ org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev171017
+ .ServiceDeleteOutput output = this.rendererServiceWrapper.performRenderer(serviceDeleteInput,
+ ServiceNotificationTypes.ServiceDeleteResult);
+ if (output != null) {
+ LOG.info("Service present in datastore, service-restore in progress...");
+ ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
+ return ModelMappingUtils.createRestoreServiceReply(common.getResponseMessage(),
+ RpcStatus.Successful);
+ } else {
+ return ModelMappingUtils.createRestoreServiceReply("Renderer service delete failed !",
+ RpcStatus.Failed);
+ }
+ } else {
+ LOG.error("Service '{}' is in 'inService' state", input.getServiceName());
+ message = "Service '" + input.getServiceName() + "' is in 'inService' state";
+ return ModelMappingUtils.createRestoreServiceReply(message, RpcStatus.Failed);
+ }
+ } else {
+ LOG.error("Service '{}' is not present", input.getServiceName());
+ message = "Service '" + input.getServiceName() + "' is not present";
+ return ModelMappingUtils.createRestoreServiceReply(message, RpcStatus.Failed);
+ }
}
@Override