import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
+import java.util.stream.Collectors;
import org.opendaylight.mdsal.binding.api.DataBroker;
import org.opendaylight.mdsal.binding.api.NotificationPublishService;
import org.opendaylight.mdsal.binding.api.ReadTransaction;
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.rev210618.Action;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev210618.OtnServicePathInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.Action;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.OtnServicePathInput;
import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.GetPmInputBuilder;
import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.GetPmOutput;
import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerSetupInput;
import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerTurndownOutput;
import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.TransportpceOlmService;
import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.get.pm.output.Measurements;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210618.RendererRpcResultSp;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210618.RendererRpcResultSpBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210618.ServiceDeleteInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210618.ServiceDeleteOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210618.ServiceImplementationRequestInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210618.ServiceImplementationRequestOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210618.link._for.notif.ATerminationBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210618.link._for.notif.ZTerminationBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210618.renderer.rpc.result.sp.Link;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210618.renderer.rpc.result.sp.LinkBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.RendererRpcResultSp;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.RendererRpcResultSpBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceImplementationRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceImplementationRequestOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.link._for.notif.ATerminationBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.link._for.notif.ZTerminationBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.renderer.rpc.result.sp.Link;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.renderer.rpc.result.sp.LinkBuilder;
import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.NodeTypes;
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.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;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210618.link.tp.LinkTp;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210618.olm.get.pm.input.ResourceIdentifierBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210618.optical.renderer.nodes.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.link.tp.LinkTp;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.olm.get.pm.input.ResourceIdentifierBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.optical.renderer.nodes.Nodes;
+import org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.OtnLinkType;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.opendaylight.yangtools.yang.binding.Notification;
import org.opendaylight.yangtools.yang.common.RpcResult;
sendNotifications(ServicePathNotificationTypes.ServiceImplementationRequest, input.getServiceName(),
RpcStatusEx.Pending, "Service compliant, submitting service implementation Request ...");
Uint32 serviceRate = getServiceRate(input);
+ LOG.info("Using {}G rate", serviceRate);
+ org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220114.network.Nodes
+ mappingNode = portMapping.isNodeExist(input.getServiceAEnd().getNodeId())
+ ? portMapping.getNode(input.getServiceAEnd().getNodeId())
+ : null;
String serviceType = ServiceTypes.getServiceType(
input.getServiceAEnd().getServiceFormat().getName(),
serviceRate,
- (NodeTypes.Xpdr.equals(portMapping.getNode(input.getServiceAEnd().getNodeId())
- .getNodeInfo().getNodeType())
+ (mappingNode != null
+ && NodeTypes.Xpdr.equals(mappingNode.getNodeInfo().getNodeType())
&& input.getServiceAEnd().getTxDirection() != null
&& input.getServiceAEnd().getTxDirection().getPort() != null
&& input.getServiceAEnd().getTxDirection().getPort().getPortName() != null)
case StringConstants.SERVICE_TYPE_100GE_T:
case StringConstants.SERVICE_TYPE_400GE:
case StringConstants.SERVICE_TYPE_OTU4:
+ case StringConstants.SERVICE_TYPE_OTUC2:
+ case StringConstants.SERVICE_TYPE_OTUC3:
case StringConstants.SERVICE_TYPE_OTUC4:
if (!manageServicePathCreation(input, serviceType)) {
return ModelMappingUtils.createServiceImplResponse(ResponseCodes.RESPONSE_FAILED,
case StringConstants.SERVICE_TYPE_100GE_M:
case StringConstants.SERVICE_TYPE_100GE_S:
case StringConstants.SERVICE_TYPE_ODU4:
+ case StringConstants.SERVICE_TYPE_ODUC2:
+ case StringConstants.SERVICE_TYPE_ODUC3:
case StringConstants.SERVICE_TYPE_ODUC4:
if (!manageOtnServicePathCreation(input, serviceType, serviceRate)) {
return ModelMappingUtils.createServiceImplResponse(ResponseCodes.RESPONSE_FAILED,
OPERATION_FAILED);
}
PathDescription pathDescription = pathDescriptionOpt.get();
- Mapping mapping = portMapping.getMapping(service.getServiceAEnd().getNodeId().getValue(),
- service.getServiceAEnd().getTxDirection().getPort().getPortName());
- String serviceType = ServiceTypes.getServiceType(service.getServiceAEnd().getServiceFormat().getName(),
- service.getServiceAEnd().getServiceRate(), mapping);
+ String serviceType =
+ ServiceTypes.getServiceType(
+ service.getServiceAEnd().getServiceFormat().getName(),
+ service.getServiceAEnd().getServiceRate(),
+ service.getServiceAEnd().getTxDirection() == null
+ || service.getServiceAEnd().getTxDirection().getPort() == null
+ || service.getServiceAEnd().getTxDirection().getPort().getPortName() == null
+ ? null
+ : portMapping.getMapping(
+ service.getServiceAEnd().getNodeId().getValue(),
+ service.getServiceAEnd().getTxDirection().getPort().getPortName()));
switch (serviceType) {
case StringConstants.SERVICE_TYPE_100GE_T:
case StringConstants.SERVICE_TYPE_400GE:
case StringConstants.SERVICE_TYPE_OTU4:
+ case StringConstants.SERVICE_TYPE_OTUC2:
+ case StringConstants.SERVICE_TYPE_OTUC3:
case StringConstants.SERVICE_TYPE_OTUC4:
if (!manageServicePathDeletion(serviceName, pathDescription, serviceType)) {
return ModelMappingUtils.createServiceDeleteResponse(ResponseCodes.RESPONSE_FAILED,
case StringConstants.SERVICE_TYPE_100GE_M:
case StringConstants.SERVICE_TYPE_100GE_S:
case StringConstants.SERVICE_TYPE_ODU4:
+ case StringConstants.SERVICE_TYPE_ODUC2:
+ case StringConstants.SERVICE_TYPE_ODUC3:
case StringConstants.SERVICE_TYPE_ODUC4:
if (!manageOtnServicePathDeletion(serviceName, pathDescription, service, serviceType)) {
return ModelMappingUtils.createServiceDeleteResponse(ResponseCodes.RESPONSE_FAILED,
if (input.getServiceAEnd().getServiceRate() != null) {
return input.getServiceAEnd().getServiceRate();
}
+ LOG.warn("Input should have rate if you are using 200 or 300G");
+ // TODO: missing 200, and 300G rates here, OTUCn cannot always be 400G
Map<ServiceFormat, Map<String, Uint32>> formatRateMap = Map.of(
ServiceFormat.OTU, Map.of(
"OTUCn", Uint32.valueOf(400),
RollbackProcessor rollbackProcessor = new RollbackProcessor();
List<DeviceRenderingResult> renderingResults =
deviceRendering(rollbackProcessor, servicePathInputDataAtoZ, servicePathInputDataZtoA);
- if (rollbackProcessor.rollbackAllIfNecessary() > 0) {
+ if (rollbackProcessor.rollbackAllIfNecessary() > 0 || renderingResults.isEmpty()) {
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(),
- notifLink, serviceType);
+ notifLink, null, serviceType);
return true;
}
Link notifLink = createLinkForNotif(otnLinkTerminationPoints);
sendNotificationsWithPathDescription(ServicePathNotificationTypes.ServiceDelete,
- serviceName, RpcStatusEx.Successful, OPERATION_SUCCESSFUL, pathDescription, notifLink, serviceType);
+ serviceName, RpcStatusEx.Successful, OPERATION_SUCCESSFUL, pathDescription, notifLink, null, serviceType);
return true;
}
List<LinkTp> otnLinkTerminationPoints = new ArrayList<>();
renderingResults.forEach(rr -> otnLinkTerminationPoints.addAll(rr.getOtnLinkTps()));
Link notifLink = createLinkForNotif(otnLinkTerminationPoints);
+ List<String> allSupportLinks = ModelMappingUtils.getLinksFromServicePathDescription(input.getPathDescription());
+ List<String> supportedLinks = getSupportedLinks(allSupportLinks, serviceType);
sendNotificationsWithPathDescription(ServicePathNotificationTypes.ServiceImplementationRequest,
input.getServiceName(), RpcStatusEx.Successful, OPERATION_SUCCESSFUL, input.getPathDescription(),
- notifLink, serviceType);
+ notifLink, supportedLinks, serviceType);
return true;
}
List<LinkTp> otnLinkTerminationPoints = new ArrayList<>();
renderingResults.forEach(rr -> otnLinkTerminationPoints.addAll(rr.getOtnLinkTps()));
Link notifLink = createLinkForNotif(otnLinkTerminationPoints);
+ List<String> allSupportLinks = ModelMappingUtils.getLinksFromServicePathDescription(pathDescription);
+ List<String> supportedLinks = getSupportedLinks(allSupportLinks, serviceType);
sendNotificationsWithPathDescription(ServicePathNotificationTypes.ServiceDelete,
- serviceName, RpcStatusEx.Successful, OPERATION_SUCCESSFUL, pathDescription, notifLink, serviceType);
+ serviceName, RpcStatusEx.Successful, OPERATION_SUCCESSFUL, pathDescription, notifLink, supportedLinks,
+ serviceType);
return true;
}
private void sendNotifications(ServicePathNotificationTypes servicePathNotificationTypes, String serviceName,
RpcStatusEx rpcStatusEx, String message) {
Notification notification = buildNotification(servicePathNotificationTypes, serviceName, rpcStatusEx, message,
- null, null, null);
+ null, null, null, null);
send(notification);
}
*/
private void sendNotificationsWithPathDescription(ServicePathNotificationTypes servicePathNotificationTypes,
String serviceName, RpcStatusEx rpcStatusEx, String message, PathDescription pathDescription,
- Link notifLink, String serviceType) {
+ Link notifLink, List<String> supportedLinks, String serviceType) {
Notification notification = buildNotification(servicePathNotificationTypes, serviceName, rpcStatusEx, message,
- pathDescription, notifLink, serviceType);
+ pathDescription, notifLink, supportedLinks, serviceType);
send(notification);
}
*/
private RendererRpcResultSp buildNotification(ServicePathNotificationTypes servicePathNotificationTypes,
String serviceName, RpcStatusEx rpcStatusEx, String message, PathDescription pathDescription,
- Link notifLink, String serviceType) {
+ Link notifLink, List<String> supportedLinks, String serviceType) {
RendererRpcResultSpBuilder builder = new RendererRpcResultSpBuilder()
.setNotificationType(servicePathNotificationTypes).setServiceName(serviceName).setStatus(rpcStatusEx)
.setStatusMessage(message)
if (notifLink != null) {
builder.setLink(notifLink);
}
+ if (supportedLinks != null) {
+ builder.setLinkId(supportedLinks);
+ }
return builder.build();
}
.build())
.build();
}
+
+ private List<String> getSupportedLinks(List<String> allSupportLinks, String serviceType) {
+ switch (serviceType) {
+ case StringConstants.SERVICE_TYPE_10GE:
+ case StringConstants.SERVICE_TYPE_1GE:
+ return allSupportLinks.stream()
+ .filter(lk -> lk.startsWith(OtnLinkType.ODTU4.getName())).collect(Collectors.toList());
+ case StringConstants.SERVICE_TYPE_100GE_M:
+ return allSupportLinks.stream()
+ .filter(lk -> lk.startsWith(OtnLinkType.ODUC4.getName())).collect(Collectors.toList());
+ case StringConstants.SERVICE_TYPE_ODU4:
+ case StringConstants.SERVICE_TYPE_100GE_S:
+ return allSupportLinks.stream()
+ .filter(lk -> lk.startsWith(OtnLinkType.OTU4.getName())).collect(Collectors.toList());
+ case StringConstants.SERVICE_TYPE_ODUC4:
+ return allSupportLinks.stream()
+ .filter(lk -> lk.startsWith(OtnLinkType.OTUC4.getName())).collect(Collectors.toList());
+ default:
+ return null;
+ }
+ }
}