X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;ds=sidebyside;f=renderer%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Ftransportpce%2Frenderer%2Fprovisiondevice%2FRendererServiceOperationsImpl.java;h=a3c3e390adaa262de36b37321b00d8769f62d2cb;hb=refs%2Fchanges%2F44%2F94544%2F5;hp=67e550cf24c831f8c974e4065d50b56ff0b02fd6;hpb=797d5ccc6286b70eb64c7a0e79f6625a67fa0bbf;p=transportpce.git diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/RendererServiceOperationsImpl.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/RendererServiceOperationsImpl.java index 67e550cf2..a3c3e390a 100644 --- a/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/RendererServiceOperationsImpl.java +++ b/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/RendererServiceOperationsImpl.java @@ -36,7 +36,10 @@ import org.opendaylight.transportpce.renderer.provisiondevice.tasks.DeviceRender import org.opendaylight.transportpce.renderer.provisiondevice.tasks.DeviceRenderingTask; import org.opendaylight.transportpce.renderer.provisiondevice.tasks.OlmPowerSetupRollbackTask; import org.opendaylight.transportpce.renderer.provisiondevice.tasks.OlmPowerSetupTask; +import org.opendaylight.transportpce.renderer.provisiondevice.tasks.OtnDeviceRenderingTask; import org.opendaylight.transportpce.renderer.provisiondevice.tasks.RollbackProcessor; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev200128.OtnServicePathInput; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev200128.OtnServicePathOutput; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev170418.GetPmInputBuilder; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev170418.GetPmOutput; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev170418.ServicePowerSetupInput; @@ -44,17 +47,22 @@ import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev17 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev170418.ServicePowerTurndownOutput; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev170418.TransportpceOlmService; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev170418.get.pm.output.Measurements; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev200520.ServiceDeleteInput; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev200520.ServiceDeleteOutput; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev200520.ServiceImplementationRequestInput; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev200520.ServiceImplementationRequestOutput; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev200520.ServiceRpcResultSp; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev200520.ServiceRpcResultSpBuilder; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev201125.RendererRpcResultSp; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev201125.RendererRpcResultSpBuilder; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev201125.ServiceDeleteInput; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev201125.ServiceDeleteOutput; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev201125.ServiceImplementationRequestInput; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev201125.ServiceImplementationRequestOutput; +import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev190531.ConnectionType; +import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODU4; +import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.OTU4; import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev161014.PmGranularity; import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev161014.ResourceTypeEnum; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.format.rev190531.ServiceFormat; +import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev190531.service.list.Services; +import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev200629.PathDescription; import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev200128.RpcStatusEx; import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev200128.ServicePathNotificationTypes; -import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev200128.service.path.PathDescription; import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.ServicePathList; import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.service.path.list.ServicePaths; import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.service.path.list.ServicePathsKey; @@ -62,6 +70,7 @@ import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev200615 import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev200615.olm.renderer.input.Nodes; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.common.Uint32; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -73,6 +82,7 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations private static final String OLM_ROLL_BACK_MSG = "OLM power setup was not successful! Rendering and OLM will be rolled back."; private static final String RENDERING_DEVICES_A_Z_MSG = "Rendering devices A-Z"; + private static final String RENDERING_DEVICES_Z_A_MSG = "Rendering device Z-A"; private static final String TURNING_DOWN_POWER_ON_A_TO_Z_PATH_MSG = "Turning down power on A-to-Z path"; private static final Logger LOG = LoggerFactory.getLogger(RendererServiceOperationsImpl.class); private static final String FAILED = "Failed"; @@ -81,17 +91,20 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations private static final int NUMBER_OF_THREADS = 4; private final DeviceRendererService deviceRenderer; + private final OtnDeviceRendererService otnDeviceRenderer; private final TransportpceOlmService olmService; private final DataBroker dataBroker; private final NotificationPublishService notificationPublishService; private ListeningExecutorService executor; private NetworkModelWavelengthService networkModelWavelengthService; - private ServiceRpcResultSp notification = null; + private RendererRpcResultSp notification = null; - public RendererServiceOperationsImpl(DeviceRendererService deviceRenderer, TransportpceOlmService olmService, + public RendererServiceOperationsImpl(DeviceRendererService deviceRenderer, + OtnDeviceRendererService otnDeviceRenderer, TransportpceOlmService olmService, DataBroker dataBroker, NetworkModelWavelengthService networkModelWavelengthService, NotificationPublishService notificationPublishService) { this.deviceRenderer = deviceRenderer; + this.otnDeviceRenderer = otnDeviceRenderer; this.olmService = olmService; this.dataBroker = dataBroker; this.networkModelWavelengthService = networkModelWavelengthService; @@ -101,7 +114,7 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations private void sendNotifications(ServicePathNotificationTypes servicePathNotificationTypes, String serviceName, RpcStatusEx rpcStatusEx, String message) { - this.notification = new ServiceRpcResultSpBuilder() + this.notification = new RendererRpcResultSpBuilder() .setNotificationType(servicePathNotificationTypes) .setServiceName(serviceName) .setStatus(rpcStatusEx) @@ -124,58 +137,102 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations public ServiceImplementationRequestOutput call() throws Exception { sendNotifications(ServicePathNotificationTypes.ServiceImplementationRequest, input.getServiceName(), RpcStatusEx.Pending, "Service compliant, submitting service implementation Request ..."); - RollbackProcessor rollbackProcessor = new RollbackProcessor(); - ServicePathInputData servicePathInputDataAtoZ = ModelMappingUtils - .rendererCreateServiceInputAToZ(input.getServiceName(), input.getPathDescription()); - ServicePathInputData servicePathInputDataZtoA = ModelMappingUtils - .rendererCreateServiceInputZToA(input.getServiceName(), input.getPathDescription()); - List renderingResults = - deviceRendering(rollbackProcessor, servicePathInputDataAtoZ, servicePathInputDataZtoA); - if (rollbackProcessor.rollbackAllIfNecessary() > 0) { - sendNotifications(ServicePathNotificationTypes.ServiceImplementationRequest, input.getServiceName(), - RpcStatusEx.Failed, DEVICE_RENDERING_ROLL_BACK_MSG); - return ModelMappingUtils.createServiceImplResponse(ResponseCodes.RESPONSE_FAILED, OPERATION_FAILED); + // Here is the switch statement that distinguishes on the connection-type + LOG.info("Connection-type is {} for {}", input.getConnectionType(), input.getServiceName()); + switch (input.getConnectionType()) { + case Service: case RoadmLine: // This takes into account of Ethernet 100G, 1G, 10G and ODU4 + LOG.info("RPC implementation for {}", input.getConnectionType()); + if (((input.getServiceAEnd().getServiceRate() != null) + && (input.getServiceAEnd().getServiceRate().intValue() == 100)) + && ((input.getServiceAEnd().getServiceFormat().getName().equals("Ethernet")) + || (input.getServiceAEnd().getServiceFormat().getName().equals("OC")))) { + LOG.info("Service format for {} is {} and rate is {}", input.getServiceName(), + input.getServiceAEnd().getServiceFormat(), input.getServiceAEnd().getServiceRate()); + if (!createServicepathInput(input)) { + return ModelMappingUtils.createServiceImplResponse(ResponseCodes.RESPONSE_FAILED, + OPERATION_FAILED); + } + } else { // This implies, service-rate is 1 or 10G + // This includes the lower-order odu (1G, 10G) and this is A-Z side + LOG.info("RPC implementation for LO-ODU"); + String serviceRate = ""; // Assuming service at A-side and Z-side has same service rate + if (input.getServiceAEnd().getServiceRate() != null) { + serviceRate = input.getServiceAEnd().getServiceRate().toString() + "G"; + } + LOG.info("Start rendering for {} service with {} rate and {} format", + input.getServiceName(), serviceRate, + input.getServiceAEnd().getServiceFormat()); + // This is A-Z side + OtnServicePathInput otnServicePathInputAtoZ = ModelMappingUtils + .rendererCreateOtnServiceInput(input.getServiceName(), + input.getServiceAEnd().getServiceFormat().getName(), + serviceRate, (PathDescription) input.getPathDescription(), true); + // Rollback should be same for all conditions, so creating a new one + RollbackProcessor rollbackProcessor = new RollbackProcessor(); + List otnRenderingResults = otnDeviceRendering(rollbackProcessor, + otnServicePathInputAtoZ, null); + if (rollbackProcessor.rollbackAllIfNecessary() > 0) { + sendNotifications(ServicePathNotificationTypes.ServiceImplementationRequest, + input.getServiceName(), RpcStatusEx.Failed, DEVICE_RENDERING_ROLL_BACK_MSG); + return ModelMappingUtils.createServiceImplResponse(ResponseCodes.RESPONSE_FAILED, + OPERATION_FAILED); + } + LOG.info("OTN rendering result size {}", otnRenderingResults.size()); + sendNotifications(ServicePathNotificationTypes.ServiceImplementationRequest, + input.getServiceName(), RpcStatusEx.Successful, OPERATION_SUCCESSFUL); + } + break; + case Infrastructure: + LOG.info("RPC implementation for {}", input.getConnectionType()); + if ((input.getServiceAEnd().getOtuServiceRate() != null) + && (input.getServiceAEnd().getOtuServiceRate().equals(OTU4.class))) { + // For the service of OTU4 infrastructure + // First create the OCH and OTU interfaces + String serviceRate = "100G"; // For OtnDeviceRendererServiceImpl + if (!createServicepathInput(input)) { + return ModelMappingUtils.createServiceImplResponse(ResponseCodes.RESPONSE_FAILED, + OPERATION_FAILED); + } + } + if ((input.getServiceAEnd().getOduServiceRate() != null) + && (input.getServiceAEnd().getOduServiceRate().equals(ODU4.class))) { + // For the service of OTU4 infrastructure + String serviceRate = "100G"; // For OtnDeviceRendererServiceImpl + LOG.info("Service format for {} is {} and rate is {}", input.getServiceName(), + input.getServiceAEnd().getOduServiceRate(), serviceRate); + // Now start rendering ODU4 interface + // This is A-Z side + OtnServicePathInput otnServicePathInputAtoZ = ModelMappingUtils + .rendererCreateOtnServiceInput(input.getServiceName(), + input.getServiceAEnd().getServiceFormat().getName(), + serviceRate, + input.getPathDescription(), true); + // This is Z-A side + OtnServicePathInput otnServicePathInputZtoA = ModelMappingUtils + .rendererCreateOtnServiceInput(input.getServiceName(), + input.getServiceZEnd().getServiceFormat().getName(), + serviceRate, + input.getPathDescription(), false); + // Rollback should be same for all conditions, so creating a new one + RollbackProcessor rollbackProcessor = new RollbackProcessor(); + List otnRenderingResults = otnDeviceRendering(rollbackProcessor, + otnServicePathInputAtoZ, otnServicePathInputZtoA); + if (rollbackProcessor.rollbackAllIfNecessary() > 0) { + sendNotifications(ServicePathNotificationTypes.ServiceImplementationRequest, + input.getServiceName(), RpcStatusEx.Failed, DEVICE_RENDERING_ROLL_BACK_MSG); + return ModelMappingUtils.createServiceImplResponse(ResponseCodes.RESPONSE_FAILED, + OPERATION_FAILED); + } + LOG.info("OTN rendering result size {}", otnRenderingResults.size()); + sendNotifications(ServicePathNotificationTypes.ServiceImplementationRequest, + input.getServiceName(), RpcStatusEx.Successful, OPERATION_SUCCESSFUL); + } + break; + default: + LOG.warn("Unsupported connection type {}", input.getConnectionType()); } - ServicePowerSetupInput olmPowerSetupInputAtoZ = - ModelMappingUtils.createServicePowerSetupInput(renderingResults.get(0).getOlmList(), input); - ServicePowerSetupInput olmPowerSetupInputZtoA = - ModelMappingUtils.createServicePowerSetupInput(renderingResults.get(1).getOlmList(), input); - olmPowerSetup(rollbackProcessor, olmPowerSetupInputAtoZ, olmPowerSetupInputZtoA); - if (rollbackProcessor.rollbackAllIfNecessary() > 0) { - sendNotifications(ServicePathNotificationTypes.ServiceImplementationRequest, input.getServiceName(), - RpcStatusEx.Failed, - OLM_ROLL_BACK_MSG); - return ModelMappingUtils.createServiceImplResponse(ResponseCodes.RESPONSE_FAILED, OPERATION_FAILED); - } - // run service activation test twice - once on source node and once on - // destination node - List nodes = servicePathInputDataAtoZ.getServicePathInput().getNodes(); - Nodes sourceNode = nodes.get(0); - Nodes destNode = nodes.get(nodes.size() - 1); - String srcNetworkTp; - String dstNetowrkTp; - if (sourceNode.getDestTp().contains(StringConstants.NETWORK_TOKEN)) { - srcNetworkTp = sourceNode.getDestTp(); - } else { - srcNetworkTp = sourceNode.getSrcTp(); - } - if (destNode.getDestTp().contains(StringConstants.NETWORK_TOKEN)) { - dstNetowrkTp = destNode.getDestTp(); - } else { - dstNetowrkTp = destNode.getSrcTp(); - } - if (!isServiceActivated(sourceNode.getNodeId(), srcNetworkTp) - || !isServiceActivated(destNode.getNodeId(), dstNetowrkTp)) { - rollbackProcessor.rollbackAll(); - sendNotifications(ServicePathNotificationTypes.ServiceImplementationRequest, input.getServiceName(), - RpcStatusEx.Failed, "Service activation test failed."); - return ModelMappingUtils.createServiceImplResponse(ResponseCodes.RESPONSE_FAILED, OPERATION_FAILED); - } - // If Service activation is success update Network ModelMappingUtils - networkModelWavelengthService.useWavelengths(input.getPathDescription()); - sendNotifications(ServicePathNotificationTypes.ServiceImplementationRequest, input.getServiceName(), - RpcStatusEx.Successful, OPERATION_SUCCESSFUL); - return ModelMappingUtils.createServiceImplResponse(ResponseCodes.RESPONSE_OK, OPERATION_SUCCESSFUL); + return ModelMappingUtils.createServiceImplResponse(ResponseCodes.RESPONSE_OK, + OPERATION_SUCCESSFUL); } }); } @@ -207,78 +264,69 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations } @Override - public ListenableFuture serviceDelete(ServiceDeleteInput input) { + public ListenableFuture serviceDelete(ServiceDeleteInput input, Services service) { String serviceName = input.getServiceName(); - LOG.info("Calling service delete request {}", input.getServiceName()); + LOG.info("Calling service delete request {}", serviceName); return executor.submit(new Callable() { @Override public ServiceDeleteOutput call() throws Exception { - sendNotifications(ServicePathNotificationTypes.ServiceDelete, input.getServiceName(), + sendNotifications(ServicePathNotificationTypes.ServiceDelete, serviceName, RpcStatusEx.Pending, "Service compliant, submitting service delete Request ..."); // Obtain path description - Optional pathDescriptionOpt = getPathDescriptionFromDatastore(serviceName); + Optional< + org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev200128.service + .path.PathDescription> pathDescriptionOpt = getPathDescriptionFromDatastore(serviceName); PathDescription pathDescription; if (pathDescriptionOpt.isPresent()) { pathDescription = pathDescriptionOpt.get(); } else { LOG.error("Unable to get path description for service {}!", serviceName); - sendNotifications(ServicePathNotificationTypes.ServiceDelete, input.getServiceName(), + sendNotifications(ServicePathNotificationTypes.ServiceDelete, serviceName, RpcStatusEx.Failed, "Unable to get path description for service"); return ModelMappingUtils.createServiceDeleteResponse(ResponseCodes.RESPONSE_FAILED, OPERATION_FAILED); } - ServicePathInputData servicePathInputDataAtoZ = - ModelMappingUtils.rendererCreateServiceInputAToZ(serviceName, pathDescription); - ServicePathInputData servicePathInputDataZtoA = - ModelMappingUtils.rendererCreateServiceInputZToA(serviceName, pathDescription); - // OLM turn down power - try { - LOG.debug(TURNING_DOWN_POWER_ON_A_TO_Z_PATH_MSG); - sendNotifications(ServicePathNotificationTypes.ServiceDelete, - input.getServiceName(), RpcStatusEx.Pending, TURNING_DOWN_POWER_ON_A_TO_Z_PATH_MSG); - ServicePowerTurndownOutput atozPowerTurndownOutput = olmPowerTurndown(servicePathInputDataAtoZ); - // TODO add some flag rather than string - if (FAILED.equals(atozPowerTurndownOutput.getResult())) { - LOG.error("Service power turndown failed on A-to-Z path for service {}!", serviceName); - sendNotifications(ServicePathNotificationTypes.ServiceDelete, - input.getServiceName(), RpcStatusEx.Failed, - "Service power turndown failed on A-to-Z path for service"); - return ModelMappingUtils.createServiceDeleteResponse(ResponseCodes.RESPONSE_FAILED, - OPERATION_FAILED); - } - LOG.debug("Turning down power on Z-to-A path"); - sendNotifications(ServicePathNotificationTypes.ServiceDelete, input.getServiceName(), - RpcStatusEx.Pending, "Turning down power on Z-to-A path"); - ServicePowerTurndownOutput ztoaPowerTurndownOutput = olmPowerTurndown(servicePathInputDataZtoA); - // TODO add some flag rather than string - if (FAILED.equals(ztoaPowerTurndownOutput.getResult())) { - LOG.error("Service power turndown failed on Z-to-A path for service {}!", serviceName); - sendNotifications(ServicePathNotificationTypes.ServiceDelete, - input.getServiceName(), RpcStatusEx.Failed, - "Service power turndown failed on Z-to-A path for service"); - return ModelMappingUtils.createServiceDeleteResponse(ResponseCodes.RESPONSE_FAILED, - OPERATION_FAILED); + switch (service.getConnectionType()) { + case RoadmLine: + case Service: + if ((ServiceFormat.Ethernet.equals(service.getServiceAEnd().getServiceFormat()) + || ServiceFormat.OC.equals(service.getServiceAEnd().getServiceFormat())) + && Uint32.valueOf("100").equals(service.getServiceAEnd().getServiceRate())) { + if (!manageServicePathDeletion(serviceName, pathDescription)) { + return ModelMappingUtils.createServiceDeleteResponse(ResponseCodes.RESPONSE_FAILED, + OPERATION_FAILED); + } + } + if (ServiceFormat.Ethernet.equals(service.getServiceAEnd().getServiceFormat()) + && (Uint32.valueOf("10").equals(service.getServiceAEnd().getServiceRate()) + || Uint32.valueOf("1").equals(service.getServiceAEnd().getServiceRate()))) { + if (!manageOtnServicePathDeletion(serviceName, pathDescription, service)) { + return ModelMappingUtils.createServiceDeleteResponse(ResponseCodes.RESPONSE_FAILED, + OPERATION_FAILED); + } + } + break; + case Infrastructure: + if (ServiceFormat.OTU.equals(service.getServiceAEnd().getServiceFormat())) { + if (!manageServicePathDeletion(serviceName, pathDescription)) { + return ModelMappingUtils.createServiceDeleteResponse(ResponseCodes.RESPONSE_FAILED, + OPERATION_FAILED); + } + } else if (ServiceFormat.ODU.equals(service.getServiceAEnd().getServiceFormat())) { + if (!manageOtnServicePathDeletion(serviceName, pathDescription, service)) { + return ModelMappingUtils.createServiceDeleteResponse(ResponseCodes.RESPONSE_FAILED, + OPERATION_FAILED); + } + } + break; + default: + LOG.error("Unmanaged connection-type for deletion of service {}", serviceName); + break; } - } catch (InterruptedException | ExecutionException | TimeoutException e) { - LOG.error("Error while turning down power!", e); - return ModelMappingUtils.createServiceDeleteResponse(ResponseCodes.RESPONSE_FAILED, - OPERATION_FAILED); - } - // delete service path with renderer - LOG.debug("Deleting service path via renderer"); - sendNotifications(ServicePathNotificationTypes.ServiceDelete, input.getServiceName(), - RpcStatusEx.Pending, "Deleting service path via renderer"); - deviceRenderer.deleteServicePath(servicePathInputDataAtoZ.getServicePathInput()); - deviceRenderer.deleteServicePath(servicePathInputDataZtoA.getServicePathInput()); - networkModelWavelengthService.freeWavelengths(pathDescription); - sendNotifications(ServicePathNotificationTypes.ServiceDelete, input.getServiceName(), - RpcStatusEx.Successful, OPERATION_SUCCESSFUL); return ModelMappingUtils.createServiceDeleteResponse(ResponseCodes.RESPONSE_OK, OPERATION_SUCCESSFUL); } }); - - } @edu.umd.cs.findbugs.annotations.SuppressFBWarnings( @@ -295,9 +343,13 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations @edu.umd.cs.findbugs.annotations.SuppressFBWarnings( value = "UPM_UNCALLED_PRIVATE_METHOD", justification = "call in call() method") - private Optional getPathDescriptionFromDatastore(String serviceName) { - InstanceIdentifier pathDescriptionIID = InstanceIdentifier.create(ServicePathList.class) - .child(ServicePaths.class, new ServicePathsKey(serviceName)).child(PathDescription.class); + private Optional getPathDescriptionFromDatastore(String serviceName) { + InstanceIdentifier pathDescriptionIID = InstanceIdentifier.create(ServicePathList.class) + .child(ServicePaths.class, new ServicePathsKey(serviceName)) + .child(org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev200128 + .service.path.PathDescription.class); ReadTransaction pathDescReadTx = this.dataBroker.newReadOnlyTransaction(); try { LOG.debug("Getting path description for service {}", serviceName); @@ -325,8 +377,8 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations LOG.info("Rendering devices Z-A"); sendNotifications(ServicePathNotificationTypes.ServiceImplementationRequest, - servicePathDataAtoZ.getServicePathInput().getServiceName(), RpcStatusEx.Pending, - RENDERING_DEVICES_A_Z_MSG); + servicePathDataZtoA.getServicePathInput().getServiceName(), RpcStatusEx.Pending, + RENDERING_DEVICES_Z_A_MSG); ListenableFuture ztoarenderingFuture = this.executor.submit(new DeviceRenderingTask(this.deviceRenderer, servicePathDataZtoA, ServicePathDirection.Z_TO_A)); @@ -355,6 +407,49 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations return renderingResults; } + @edu.umd.cs.findbugs.annotations.SuppressFBWarnings( + value = "UPM_UNCALLED_PRIVATE_METHOD", + justification = "call in call() method") + private List otnDeviceRendering(RollbackProcessor rollbackProcessor, + OtnServicePathInput otnServicePathAtoZ, OtnServicePathInput otnServicePathZtoA) { + LOG.info(RENDERING_DEVICES_A_Z_MSG); + sendNotifications(ServicePathNotificationTypes.ServiceImplementationRequest, + otnServicePathAtoZ.getServiceName(), RpcStatusEx.Pending, + RENDERING_DEVICES_A_Z_MSG); + ListenableFuture atozrenderingFuture = + this.executor.submit(new OtnDeviceRenderingTask(this.otnDeviceRenderer, otnServicePathAtoZ)); + ListenableFuture> renderingCombinedFuture; + if (otnServicePathZtoA != null) { + LOG.info("Rendering devices Z-A"); + sendNotifications(ServicePathNotificationTypes.ServiceImplementationRequest, + otnServicePathZtoA.getServiceName(), RpcStatusEx.Pending, + RENDERING_DEVICES_Z_A_MSG); + ListenableFuture ztoarenderingFuture = + this.executor.submit(new OtnDeviceRenderingTask(this.otnDeviceRenderer, otnServicePathZtoA)); + renderingCombinedFuture = Futures.allAsList(atozrenderingFuture, ztoarenderingFuture); + } else { + renderingCombinedFuture = Futures.allAsList(atozrenderingFuture); + } + List otnRenderingResults = new ArrayList<>(2); + try { + LOG.info("Waiting for A-Z and Z-A device renderers ..."); + otnRenderingResults = renderingCombinedFuture.get(Timeouts.RENDERING_TIMEOUT, TimeUnit.MILLISECONDS); + } catch (InterruptedException | ExecutionException | TimeoutException e) { + LOG.warn(DEVICE_RENDERING_ROLL_BACK_MSG, e); + sendNotifications(ServicePathNotificationTypes.ServiceImplementationRequest, + otnServicePathAtoZ.getServiceName(), RpcStatusEx.Pending, + DEVICE_RENDERING_ROLL_BACK_MSG); + //FIXME we can't do rollback here, because we don't have rendering results. + return otnRenderingResults; + } + for (int i = 0; i < otnRenderingResults.size(); i++) { + rollbackProcessor.addTask(new DeviceRenderingRollbackTask("DeviceTask n° " + i + 1, + ! otnRenderingResults.get(i).isSuccess(), otnRenderingResults.get(i).getRenderedNodeInterfaces(), + this.deviceRenderer)); + } + return otnRenderingResults; + } + @edu.umd.cs.findbugs.annotations.SuppressFBWarnings( value = "UPM_UNCALLED_PRIVATE_METHOD", justification = "call in call() method") @@ -447,7 +542,6 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations return null; } - private boolean verifyPreFecBer(List measurements) { double preFecCorrectedErrors = Double.MIN_VALUE; double fecUncorrectableBlocks = Double.MIN_VALUE; @@ -476,4 +570,142 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations } } + @edu.umd.cs.findbugs.annotations.SuppressFBWarnings( + value = "UPM_UNCALLED_PRIVATE_METHOD", + justification = "call in call() method") + private boolean createServicepathInput(ServiceImplementationRequestInput input) { + ServicePathInputData servicePathInputDataAtoZ = ModelMappingUtils + .rendererCreateServiceInputAToZ(input.getServiceName(), input.getPathDescription()); + ServicePathInputData servicePathInputDataZtoA = ModelMappingUtils + .rendererCreateServiceInputZToA(input.getServiceName(), input.getPathDescription()); + // Rollback should be same for all conditions, so creating a new one + RollbackProcessor rollbackProcessor = new RollbackProcessor(); + List renderingResults = + deviceRendering(rollbackProcessor, servicePathInputDataAtoZ, servicePathInputDataZtoA); + if (rollbackProcessor.rollbackAllIfNecessary() > 0) { + sendNotifications(ServicePathNotificationTypes.ServiceImplementationRequest, + input.getServiceName(), RpcStatusEx.Failed, DEVICE_RENDERING_ROLL_BACK_MSG); + return false; + } + ServicePowerSetupInput olmPowerSetupInputAtoZ = + ModelMappingUtils.createServicePowerSetupInput(renderingResults.get(0).getOlmList(), input); + ServicePowerSetupInput olmPowerSetupInputZtoA = + ModelMappingUtils.createServicePowerSetupInput(renderingResults.get(1).getOlmList(), input); + olmPowerSetup(rollbackProcessor, olmPowerSetupInputAtoZ, olmPowerSetupInputZtoA); + if (rollbackProcessor.rollbackAllIfNecessary() > 0) { + sendNotifications(ServicePathNotificationTypes.ServiceImplementationRequest, + input.getServiceName(), RpcStatusEx.Failed, OLM_ROLL_BACK_MSG); + return false; + } + // run service activation test twice - once on source node and once on + // destination node + List nodes = servicePathInputDataAtoZ.getServicePathInput().getNodes(); + if ((nodes == null) || (nodes.isEmpty())) { + return false; + } + + Nodes sourceNode = nodes.get(0); + Nodes destNode = nodes.get(nodes.size() - 1); + String srcNetworkTp; + String dstNetowrkTp; + if (sourceNode.getDestTp().contains(StringConstants.NETWORK_TOKEN)) { + srcNetworkTp = sourceNode.getDestTp(); + } else { + srcNetworkTp = sourceNode.getSrcTp(); + } + if (destNode.getDestTp().contains(StringConstants.NETWORK_TOKEN)) { + dstNetowrkTp = destNode.getDestTp(); + } else { + dstNetowrkTp = destNode.getSrcTp(); + } + if (!isServiceActivated(sourceNode.getNodeId(), srcNetworkTp) + || !isServiceActivated(destNode.getNodeId(), dstNetowrkTp)) { + rollbackProcessor.rollbackAll(); + sendNotifications(ServicePathNotificationTypes.ServiceImplementationRequest, + input.getServiceName(), RpcStatusEx.Failed, + "Service activation test failed."); + return false; + } + // If Service activation is success update Network ModelMappingUtils + networkModelWavelengthService.useWavelengths(input.getPathDescription()); + sendNotifications(ServicePathNotificationTypes.ServiceImplementationRequest, + input.getServiceName(), RpcStatusEx.Successful, OPERATION_SUCCESSFUL); + return true; + } + + @edu.umd.cs.findbugs.annotations.SuppressFBWarnings( + value = "UPM_UNCALLED_PRIVATE_METHOD", + justification = "call in call() method") + private boolean manageServicePathDeletion(String serviceName, PathDescription pathDescription) { + ServicePathInputData servicePathInputDataAtoZ = + ModelMappingUtils.rendererCreateServiceInputAToZ(serviceName, pathDescription); + ServicePathInputData servicePathInputDataZtoA = + ModelMappingUtils.rendererCreateServiceInputZToA(serviceName, pathDescription); + // OLM turn down power + try { + LOG.debug(TURNING_DOWN_POWER_ON_A_TO_Z_PATH_MSG); + sendNotifications(ServicePathNotificationTypes.ServiceDelete, serviceName, + RpcStatusEx.Pending, TURNING_DOWN_POWER_ON_A_TO_Z_PATH_MSG); + ServicePowerTurndownOutput atozPowerTurndownOutput = olmPowerTurndown(servicePathInputDataAtoZ); + // TODO add some flag rather than string + if (FAILED.equals(atozPowerTurndownOutput.getResult())) { + LOG.error("Service power turndown failed on A-to-Z path for service {}!", serviceName); + sendNotifications(ServicePathNotificationTypes.ServiceDelete, serviceName, RpcStatusEx.Failed, + "Service power turndown failed on A-to-Z path for service"); + return false; + } + LOG.debug("Turning down power on Z-to-A path"); + sendNotifications(ServicePathNotificationTypes.ServiceDelete, serviceName, RpcStatusEx.Pending, + "Turning down power on Z-to-A path"); + ServicePowerTurndownOutput ztoaPowerTurndownOutput = olmPowerTurndown(servicePathInputDataZtoA); + // TODO add some flag rather than string + if (FAILED.equals(ztoaPowerTurndownOutput.getResult())) { + LOG.error("Service power turndown failed on Z-to-A path for service {}!", serviceName); + sendNotifications(ServicePathNotificationTypes.ServiceDelete, serviceName, RpcStatusEx.Failed, + "Service power turndown failed on Z-to-A path for service"); + return false; + } + } catch (InterruptedException | ExecutionException | TimeoutException e) { + LOG.error("Error while turning down power!", e); + return false; + } + // delete service path with renderer + LOG.info("Deleting service path via renderer"); + sendNotifications(ServicePathNotificationTypes.ServiceDelete, serviceName, RpcStatusEx.Pending, + "Deleting service path via renderer"); + deviceRenderer.deleteServicePath(servicePathInputDataAtoZ.getServicePathInput()); + deviceRenderer.deleteServicePath(servicePathInputDataZtoA.getServicePathInput()); + networkModelWavelengthService.freeWavelengths(pathDescription); + sendNotifications(ServicePathNotificationTypes.ServiceDelete, serviceName, RpcStatusEx.Successful, + OPERATION_SUCCESSFUL); + return true; + } + + @edu.umd.cs.findbugs.annotations.SuppressFBWarnings( + value = "UPM_UNCALLED_PRIVATE_METHOD", + justification = "call in call() method") + private boolean manageOtnServicePathDeletion(String serviceName, PathDescription pathDescription, + Services service) { + OtnServicePathInput ospi = null; + if (ConnectionType.Infrastructure.equals(service.getConnectionType())) { + ospi = ModelMappingUtils.rendererCreateOtnServiceInput( + serviceName, service.getServiceAEnd().getServiceFormat().getName(), "100G", pathDescription, true); + } else if (ConnectionType.Service.equals(service.getConnectionType())) { + ospi = ModelMappingUtils.rendererCreateOtnServiceInput(serviceName, + service.getServiceAEnd().getServiceFormat().getName(), + service.getServiceAEnd().getServiceRate().toString() + "G", pathDescription, true); + } + LOG.info("Deleting otn-service path {} via renderer", serviceName); + sendNotifications(ServicePathNotificationTypes.ServiceDelete, serviceName, RpcStatusEx.Pending, + "Deleting otn-service path via renderer"); + OtnServicePathOutput result = otnDeviceRenderer.deleteOtnServicePath(ospi); + if (result.isSuccess()) { + sendNotifications(ServicePathNotificationTypes.ServiceDelete, serviceName, RpcStatusEx.Successful, + OPERATION_SUCCESSFUL); + return true; + } else { + return false; + } + } + }