+ @edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
+ value = "UPM_UNCALLED_PRIVATE_METHOD",
+ justification = "call in call() method")
+ private boolean manageOtnServicePathCreation(
+ ServiceImplementationRequestInput input,
+ String serviceType,
+ Uint32 serviceRate) {
+ // Rollback should be same for all conditions, so creating a new one
+ RollbackProcessor rollbackProcessor = new RollbackProcessor();
+ List<OtnDeviceRenderingResult> renderingResults =
+ otnDeviceRendering(
+ rollbackProcessor,
+ // This is A-Z side
+ ModelMappingUtils
+ .rendererCreateOtnServiceInput(
+ input.getServiceName(),
+ Action.Create,
+ input.getServiceAEnd().getServiceFormat().getName(),
+ serviceRate,
+ input.getPathDescription(),
+ true),
+ // This is Z-A side
+ ModelMappingUtils
+ .rendererCreateOtnServiceInput(
+ input.getServiceName(),
+ Action.Create,
+ input.getServiceZEnd().getServiceFormat().getName(),
+ serviceRate,
+ input.getPathDescription(),
+ false),
+ serviceType);
+ if (rollbackProcessor.rollbackAllIfNecessary() > 0) {
+ rollbackProcessor.rollbackAll();
+ sendNotifications(
+ ServicePathNotificationTypes.ServiceImplementationRequest,
+ input.getServiceName(),
+ RpcStatusEx.Failed,
+ DEVICE_RENDERING_ROLL_BACK_MSG);
+ return false;
+ }
+ sendNotificationsWithPathDescription(
+ ServicePathNotificationTypes.ServiceImplementationRequest,
+ input.getServiceName(),
+ RpcStatusEx.Successful, OPERATION_SUCCESSFUL,
+ input.getPathDescription(),
+ createLinkForNotif(
+ renderingResults.stream()
+ .flatMap(rr -> rr.getOtnLinkTps().stream())
+ .collect(Collectors.toList())),
+ getSupportedLinks(
+ ModelMappingUtils.getLinksFromServicePathDescription(input.getPathDescription()),
+ serviceType),
+ serviceType);
+ 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,
+ String serviceType) {
+ LOG.info("Deleting otn-service path {} via renderer", serviceName);
+ sendNotifications(
+ ServicePathNotificationTypes.ServiceDelete,
+ serviceName,
+ RpcStatusEx.Pending,
+ "Deleting otn-service path via renderer");
+ List<OtnDeviceRenderingResult> renderingResults =
+ otnDeviceRendering(
+ new RollbackProcessor(),
+ // This is A-Z side
+ ModelMappingUtils
+ .rendererCreateOtnServiceInput(
+ serviceName,
+ Action.Delete,
+ service.getServiceAEnd().getServiceFormat().getName(),
+ service.getServiceAEnd().getServiceRate(),
+ pathDescription,
+ true),
+ // This is Z-A side
+ ModelMappingUtils
+ .rendererCreateOtnServiceInput(
+ serviceName,
+ Action.Delete,
+ service.getServiceZEnd().getServiceFormat().getName(),
+ service.getServiceAEnd().getServiceRate(),
+ pathDescription,
+ false),
+ serviceType);
+ sendNotificationsWithPathDescription(
+ ServicePathNotificationTypes.ServiceDelete,
+ serviceName,
+ RpcStatusEx.Successful,
+ OPERATION_SUCCESSFUL,
+ pathDescription,
+ createLinkForNotif(
+ renderingResults.stream()
+ .flatMap(rr -> rr.getOtnLinkTps().stream())
+ .collect(Collectors.toList())),
+ getSupportedLinks(
+ ModelMappingUtils.getLinksFromServicePathDescription(pathDescription),
+ serviceType),
+ serviceType);
+ return true;
+ }
+
+ /**
+ * Send renderer notification.
+ * @param servicePathNotificationTypes ServicePathNotificationTypes
+ * @param serviceName String
+ * @param rpcStatusEx RpcStatusEx
+ * @param message String
+ */
+ private void sendNotifications(
+ ServicePathNotificationTypes servicePathNotificationTypes,
+ String serviceName,
+ RpcStatusEx rpcStatusEx,
+ String message) {
+ send(
+ buildNotification(servicePathNotificationTypes, serviceName, rpcStatusEx, message,
+ null, null, null, null));
+ }
+
+ /**
+ * Send renderer notification with path description information.
+ * @param servicePathNotificationTypes ServicePathNotificationTypes
+ * @param serviceName String
+ * @param rpcStatusEx RpcStatusEx
+ * @param message String
+ * @param pathDescription PathDescription
+ */
+ private void sendNotificationsWithPathDescription(
+ ServicePathNotificationTypes servicePathNotificationTypes,
+ String serviceName,
+ RpcStatusEx rpcStatusEx,
+ String message,
+ PathDescription pathDescription,
+ Link notifLink,
+ Set<String> supportedLinks,
+ String serviceType) {
+ send(
+ buildNotification(servicePathNotificationTypes, serviceName, rpcStatusEx, message,
+ pathDescription, notifLink, supportedLinks, serviceType));
+ }
+
+ /**
+ * Build notification containing path description information.
+ * @param servicePathNotificationTypes ServicePathNotificationTypes
+ * @param serviceName String
+ * @param rpcStatusEx RpcStatusEx
+ * @param message String
+ * @param pathDescription PathDescription
+ * @return notification with RendererRpcResultSp type.
+ */
+ private RendererRpcResultSp buildNotification(
+ ServicePathNotificationTypes servicePathNotificationTypes,
+ String serviceName,
+ RpcStatusEx rpcStatusEx,
+ String message,
+ PathDescription pathDescription,
+ Link notifLink,
+ Set<String> supportedLinks,
+ String serviceType) {
+ RendererRpcResultSpBuilder builder =
+ new RendererRpcResultSpBuilder()
+ .setNotificationType(servicePathNotificationTypes).setServiceName(serviceName).setStatus(rpcStatusEx)
+ .setStatusMessage(message)
+ .setServiceType(serviceType);
+ if (pathDescription != null) {
+ builder
+ .setAToZDirection(pathDescription.getAToZDirection())
+ .setZToADirection(pathDescription.getZToADirection());
+ }
+ if (notifLink != null) {
+ builder.setLink(notifLink);
+ }
+ if (supportedLinks != null) {
+ builder.setLinkId(supportedLinks);
+ }
+ return builder.build();
+ }
+
+ /**
+ * Send renderer notification.
+ * @param notification Notification
+ */
+ private void send(Notification notification) {
+ try {
+ LOG.info("Sending notification {}", notification);
+ notificationPublishService.putNotification(notification);
+ } catch (InterruptedException e) {
+ LOG.info("notification offer rejected: ", e);
+ Thread.currentThread().interrupt();
+ }
+ }
+
+ private Link createLinkForNotif(List<LinkTp> otnLinkTerminationPoints) {
+ return
+ otnLinkTerminationPoints == null || otnLinkTerminationPoints.size() != 2
+ ? null
+ : new LinkBuilder()
+ .setATermination(
+ new ATerminationBuilder()
+ .setNodeId(otnLinkTerminationPoints.get(0).getNodeId())
+ .setTpId(otnLinkTerminationPoints.get(0).getTpId())
+ .build())
+ .setZTermination(
+ new ZTerminationBuilder()
+ .setNodeId(otnLinkTerminationPoints.get(1).getNodeId())
+ .setTpId(otnLinkTerminationPoints.get(1).getTpId())
+ .build())
+ .build();
+ }
+
+ private Set<String> getSupportedLinks(Set<String> allSupportLinks, String serviceType) {
+ //TODO a Map might be more indicated here
+ switch (serviceType) {
+ case StringConstants.SERVICE_TYPE_10GE:
+ case StringConstants.SERVICE_TYPE_1GE:
+ return allSupportLinks.stream()
+ .filter(lk -> lk.startsWith(OtnLinkType.ODTU4.getName())).collect(Collectors.toSet());
+ case StringConstants.SERVICE_TYPE_100GE_M:
+ return allSupportLinks.stream()
+ .filter(lk -> lk.startsWith(OtnLinkType.ODUC4.getName())).collect(Collectors.toSet());
+ case StringConstants.SERVICE_TYPE_ODU4:
+ case StringConstants.SERVICE_TYPE_100GE_S:
+ return allSupportLinks.stream()
+ .filter(lk -> lk.startsWith(OtnLinkType.OTU4.getName())).collect(Collectors.toSet());
+ case StringConstants.SERVICE_TYPE_ODUC4:
+ return allSupportLinks.stream()
+ .filter(lk -> lk.startsWith(OtnLinkType.OTUC4.getName())).collect(Collectors.toSet());
+ default:
+ return null;
+ }
+ }