Update SH and PCE to support intermediate rates 19/99419/8
authorBalagangadhar Bathula <bb4341@att.com>
Sat, 22 Jan 2022 14:12:36 +0000 (09:12 -0500)
committerGuillaume Lambert <guillaume.lambert@orange.com>
Tue, 1 Feb 2022 06:57:51 +0000 (06:57 +0000)
- Support OTUC3 (ODUC3) and OTUC2 (ODUC2)
- Use intermediate rate OTN-link type
- Complete end-to-end service create for intermediate rates

JIRA: TRNSPRTPCE-526
Change-Id: Ied0e52ef894ff704bc94d77875a07d8be02de89b
Signed-off-by: Balagangadhar Bathula <bb4341@att.com>
12 files changed:
common/src/main/java/org/opendaylight/transportpce/common/StringConstants.java
common/src/main/java/org/opendaylight/transportpce/common/service/ServiceTypes.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelServiceImpl.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmOtnTopology.java
pce/src/main/java/org/opendaylight/transportpce/pce/PcePathDescription.java
pce/src/main/java/org/opendaylight/transportpce/pce/graph/PceGraph.java
pce/src/main/java/org/opendaylight/transportpce/pce/graph/PostAlgoPathValidator.java
pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceCalculation.java
pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceLink.java
pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceOtnNode.java
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/RendererServiceOperationsImpl.java
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/listeners/RendererListenerImpl.java

index 539707d5132ce856f7476b0dd99c92d0806a4723..40595ef6731e3808c83d89a55024a8986cda051c 100644 (file)
@@ -30,6 +30,8 @@ public final class StringConstants {
     public static final String SERVICE_TYPE_100GE_S = "100GEs";
 
     public static final String SERVICE_TYPE_OTU4 = "OTU4";
+    public static final String SERVICE_TYPE_OTUC2 = "OTUC2";
+    public static final String SERVICE_TYPE_OTUC3 = "OTUC3";
     public static final String SERVICE_TYPE_OTUC4 = "OTUC4";
 
     public static final String SERVICE_TYPE_400GE = "400GE";
index 90e8887853ad82320fabee6ac6a3edfad4f66762..607637c9f792062f08d3cd841eac7b72c78f87f4 100644 (file)
@@ -62,6 +62,8 @@ public final class ServiceTypes {
                     Uint32.valueOf(100), StringConstants.SERVICE_TYPE_100GE_M),
             "OTU", Map.of(
                     Uint32.valueOf(100), StringConstants.SERVICE_TYPE_OTU4,
+                    Uint32.valueOf(200), StringConstants.SERVICE_TYPE_OTUC2,
+                    Uint32.valueOf(300), StringConstants.SERVICE_TYPE_OTUC3,
                     Uint32.valueOf(400), StringConstants.SERVICE_TYPE_OTUC4),
             "ODU", Map.of(
                     Uint32.valueOf(100), StringConstants.SERVICE_TYPE_ODU4,
index 9fc0d6c0cf00030b7079aea4fea376af8d8e12e5..6bfdb0397cab61cb6a38c45e122be3e6c615f235 100644 (file)
@@ -398,10 +398,14 @@ public class NetworkModelServiceImpl implements NetworkModelService {
         TopologyShard otnTopologyShard;
         switch (linkType) {
             case OTU4:
+            case OTUC2:
+            case OTUC3:
             case OTUC4:
                 otnTopologyShard = OpenRoadmOtnTopology.createOtnLinks(notifLink, null, null, linkType);
                 break;
             case ODTU4:
+            case ODUC2:
+            case ODUC3:
             case ODUC4:
                 List<LinkId> linkIdList = new ArrayList<>();
                 if (suppLinks != null) {
@@ -470,6 +474,8 @@ public class NetworkModelServiceImpl implements NetworkModelService {
         List<LinkId> linkIdList = new ArrayList<>();
         switch (linkType) {
             case OTU4:
+            case OTUC2:
+            case OTUC3:
             case OTUC4:
                 linkIdList.add(LinkIdUtil.buildOtnLinkId(nodeTopoA, tpA, nodeTopoZ, tpZ, linkType.getName()));
                 linkIdList.add(LinkIdUtil.buildOtnLinkId(nodeTopoZ, tpZ, nodeTopoA, tpA, linkType.getName()));
@@ -482,6 +488,8 @@ public class NetworkModelServiceImpl implements NetworkModelService {
                 otnTopologyShard = new TopologyShard(null, null);
                 break;
             case ODTU4:
+            case ODUC2:
+            case ODUC3:
             case ODUC4:
                 linkIdList.add(LinkIdUtil.buildOtnLinkId(nodeTopoA, tpA, nodeTopoZ, tpZ, linkType.getName()));
                 linkIdList.add(LinkIdUtil.buildOtnLinkId(nodeTopoZ, tpZ, nodeTopoA, tpA, linkType.getName()));
index 4c81a24c448b27894eaee704f25d6e9a29ca6cbc..135819767a5f5ea3c27a4fdd304d181d9f817825 100644 (file)
@@ -175,15 +175,27 @@ public final class OpenRoadmOtnTopology {
             OtnLinkType linkType) {
         List<Link> links = new ArrayList<>();
         for (Link link : suppOtuLinks) {
-            if (OtnLinkType.ODTU4.equals(linkType) && link.augmentation(Link1.class) != null
+            if (link.augmentation(Link1.class) == null) {
+                LOG.error("Error with otn parameters of supported link {}", link.getLinkId().getValue());
+                continue;
+            }
+            if (OtnLinkType.ODTU4.equals(linkType)
                 && link.augmentation(Link1.class).getAvailableBandwidth().equals(Uint32.valueOf(100000))) {
                 links.add(updateOtnLinkBwParameters(link, 0L, 100000L));
-            } else if (OtnLinkType.ODUC4.equals(linkType) && link.augmentation(Link1.class) != null
+            } else if (OtnLinkType.ODUC4.equals(linkType)
                 && link.augmentation(Link1.class).getAvailableBandwidth().equals(Uint32.valueOf(400000))) {
                 links.add(updateOtnLinkBwParameters(link, 0L, 400000L));
+            } else if (OtnLinkType.ODUC3.equals(linkType)
+                && link.augmentation(Link1.class).getAvailableBandwidth().equals(Uint32.valueOf(300000))) {
+                links.add(updateOtnLinkBwParameters(link, 0L, 300000L));
+            } else if (OtnLinkType.ODUC2.equals(linkType)
+                && link.augmentation(Link1.class).getAvailableBandwidth().equals(Uint32.valueOf(200000))) {
+                links.add(updateOtnLinkBwParameters(link, 0L, 200000L));
             } else {
-                LOG.error("Error with otn parameters of supported link {}", link.getLinkId().getValue());
+                LOG.error("Unsupported OTN Link Type link or unsufficient available bandwith: {}",
+                    link.getLinkId().getValue());
             }
+            //TODO use a Map here instead of multiple else-if-blocks
         }
         if (links.size() == 2) {
             links.addAll(initialiseOtnLinks(suppOtuLinks.get(0).getSource().getSourceNode().getValue(),
index e483796f180310aa595ae03b7dcab8b0a0d7e4d9..3049f7c527d20acee3314e65cef5c88a18615149 100644 (file)
@@ -93,6 +93,8 @@ public class PcePathDescription {
             .setAToZ(atozMap);
         switch (rc.getServiceType()) {
             case StringConstants.SERVICE_TYPE_400GE:
+            case StringConstants.SERVICE_TYPE_OTUC2:
+            case StringConstants.SERVICE_TYPE_OTUC3:
             case StringConstants.SERVICE_TYPE_OTUC4:
             case StringConstants.SERVICE_TYPE_100GE_T:
             case StringConstants.SERVICE_TYPE_OTU4:
@@ -105,6 +107,8 @@ public class PcePathDescription {
             case StringConstants.SERVICE_TYPE_10GE:
             case StringConstants.SERVICE_TYPE_1GE:
             case StringConstants.SERVICE_TYPE_ODU4:
+            case StringConstants.SERVICE_TYPE_ODUC2:
+            case StringConstants.SERVICE_TYPE_ODUC3:
             case StringConstants.SERVICE_TYPE_ODUC4:
                 if (rc.getResultTribPortTribSlot() != null && rc.getResultTribPortTribSlot().get(0) != null
                     && rc.getResultTribPortTribSlot().get(1) != null) {
@@ -136,6 +140,8 @@ public class PcePathDescription {
                 .setZToA(ztoaMap);
         switch (rc.getServiceType()) {
             case StringConstants.SERVICE_TYPE_400GE:
+            case StringConstants.SERVICE_TYPE_OTUC2:
+            case StringConstants.SERVICE_TYPE_OTUC3:
             case StringConstants.SERVICE_TYPE_OTUC4:
             case StringConstants.SERVICE_TYPE_100GE_T:
             case StringConstants.SERVICE_TYPE_OTU4:
@@ -148,6 +154,9 @@ public class PcePathDescription {
             case StringConstants.SERVICE_TYPE_10GE:
             case StringConstants.SERVICE_TYPE_1GE:
             case StringConstants.SERVICE_TYPE_ODU4:
+            case StringConstants.SERVICE_TYPE_ODUC2:
+            case StringConstants.SERVICE_TYPE_ODUC3:
+            case StringConstants.SERVICE_TYPE_ODUC4:
                 if (rc.getResultTribPortTribSlot() != null && rc.getResultTribPortTribSlot().get(0) != null
                     && rc.getResultTribPortTribSlot().get(1) != null) {
                     ztoADirectionBldr.setZToAWavelengthNumber(Uint32.valueOf(0))
index 918d1b6e20ee6104190130cc479b8caf52c3aa04..a7a45e765709f05028509b5be8c5f3bdf7965cb3 100644 (file)
@@ -111,6 +111,8 @@ public class PceGraph {
             switch (serviceType) {
 
                 case StringConstants.SERVICE_TYPE_100GE_T:
+                case StringConstants.SERVICE_TYPE_OTUC2:
+                case StringConstants.SERVICE_TYPE_OTUC3:
                 case StringConstants.SERVICE_TYPE_OTUC4:
                 case StringConstants.SERVICE_TYPE_400GE:
                 case StringConstants.SERVICE_TYPE_OTU4:
index 479fb5bd7de5442ebc4933d81f7f49006552cb64..bb7b7e42bb05a76f3d57addf63ef395613f618ce 100644 (file)
@@ -61,6 +61,8 @@ public class PostAlgoPathValidator {
         SpectrumAssignment spectrumAssignment = null;
         //variable to deal with 1GE (Nb=1) and 10GE (Nb=10) cases
         switch (serviceType) {
+            case StringConstants.SERVICE_TYPE_OTUC2:
+            case StringConstants.SERVICE_TYPE_OTUC3:
             case StringConstants.SERVICE_TYPE_OTUC4:
             case StringConstants.SERVICE_TYPE_400GE:
                 spectralWidthSlotNumber = GridConstant.SPECTRAL_WIDTH_SLOT_NUMBER_MAP
@@ -139,11 +141,13 @@ public class PostAlgoPathValidator {
                 }
                 break;
             case StringConstants.SERVICE_TYPE_ODU4:
+            case StringConstants.SERVICE_TYPE_ODUC2:
+            case StringConstants.SERVICE_TYPE_ODUC3:
             case StringConstants.SERVICE_TYPE_ODUC4:
             case StringConstants.SERVICE_TYPE_100GE_S:
                 pceResult.setRC(ResponseCodes.RESPONSE_OK);
                 pceResult.setServiceType(serviceType);
-                LOG.info("In PostAlgoPathValidator: ODU4/ODUC4 path found {}", path);
+                LOG.info("In PostAlgoPathValidator: ODU4/ODUCn path found {}", path);
                 break;
             default:
                 pceResult.setRC(ResponseCodes.RESPONSE_FAILED);
index 5aa2d29050548a6489845d75076309a0f1337a75..d2f3305f1c321ff37bf23f323d9cc78dfee70329 100644 (file)
@@ -158,6 +158,8 @@ public class PceCalculation {
     private void getAZnodeId() {
         switch (serviceType) {
             case StringConstants.SERVICE_TYPE_ODU4:
+            case StringConstants.SERVICE_TYPE_ODUC2:
+            case StringConstants.SERVICE_TYPE_ODUC3:
             case StringConstants.SERVICE_TYPE_ODUC4:
             case StringConstants.SERVICE_TYPE_100GE_M:
             case StringConstants.SERVICE_TYPE_100GE_S:
@@ -179,6 +181,8 @@ public class PceCalculation {
             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:
                 LOG.info("readMdSal: network {}", NetworkUtils.OVERLAY_NETWORK_ID);
                 nwInstanceIdentifier = InstanceIdentifier.builder(Networks.class)
@@ -187,6 +191,8 @@ public class PceCalculation {
             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:
             case StringConstants.SERVICE_TYPE_10GE:
             case StringConstants.SERVICE_TYPE_1GE:
@@ -259,6 +265,8 @@ public class PceCalculation {
             case StringConstants.SERVICE_TYPE_100GE_T:
             case  StringConstants.SERVICE_TYPE_OTU4:
             case  StringConstants.SERVICE_TYPE_400GE:
+            case StringConstants.SERVICE_TYPE_OTUC2:
+            case StringConstants.SERVICE_TYPE_OTUC3:
             case  StringConstants.SERVICE_TYPE_OTUC4:
                 // 100GE service and OTU4 service are handled at the openroadm-topology layer
                 for (Node node : allNodes) {
@@ -386,6 +394,8 @@ public class PceCalculation {
         switch (serviceType) {
             case StringConstants.SERVICE_TYPE_100GE_T:
             case StringConstants.SERVICE_TYPE_OTU4:
+            case StringConstants.SERVICE_TYPE_OTUC2:
+            case StringConstants.SERVICE_TYPE_OTUC3:
             case StringConstants.SERVICE_TYPE_OTUC4:
             case StringConstants.SERVICE_TYPE_400GE:
                 return processPceLink(link, sourceId, destId, source, dest);
@@ -393,6 +403,8 @@ public class PceCalculation {
             case StringConstants.SERVICE_TYPE_10GE:
             case StringConstants.SERVICE_TYPE_100GE_M:
             case StringConstants.SERVICE_TYPE_100GE_S:
+            case StringConstants.SERVICE_TYPE_ODUC2:
+            case StringConstants.SERVICE_TYPE_ODUC3:
             case StringConstants.SERVICE_TYPE_ODUC4:
             case StringConstants.SERVICE_TYPE_1GE:
                 return processPceOtnLink(link, source, dest);
index cda77d137b2c0dc9a6866ffbcbbc7b26a98805ad..01b392e7b7e790e9942b0b88beaa87465c765eae 100644 (file)
@@ -327,6 +327,22 @@ public class PceLink implements Serializable {
         long neededBW;
         OtnLinkType neededType = null;
         switch (serviceType) {
+            case "ODUC2":
+                if (this.usedBandwidth != 0L) {
+                    return false;
+                }
+                neededBW = 200000L;
+                // Add intermediate rate otn-link-type
+                neededType = OtnLinkType.OTUC2;
+                break;
+            case "ODUC3":
+                if (this.usedBandwidth != 0L) {
+                    return false;
+                }
+                neededBW = 300000L;
+                // hange otn-link-type
+                neededType = OtnLinkType.OTUC3;
+                break;
             case "ODUC4":
                 if (this.usedBandwidth != 0L) {
                     return false;
@@ -354,6 +370,7 @@ public class PceLink implements Serializable {
                 break;
             case "100GEm":
                 neededBW = 100000L;
+                // TODO: Here link type needs to be changed, based on the line-rate
                 neededType = OtnLinkType.ODUC4;
                 break;
             case "10GE":
index 3dc362796a5560d58c12093b694d8974119730a2..b2cc9356aac33bf476240d258b3b8e4e2ed52345 100644 (file)
@@ -139,6 +139,8 @@ public class PceOtnNode implements PceNode {
                     case StringConstants.SERVICE_TYPE_100GE_S:
                         // TODO verify the capability of network port to support ODU4 CTP interface creation
                     case StringConstants.SERVICE_TYPE_ODU4:
+                    case StringConstants.SERVICE_TYPE_ODUC2:
+                    case StringConstants.SERVICE_TYPE_ODUC3:
                     case StringConstants.SERVICE_TYPE_ODUC4:
                         if (!checkTpForOdtuTermination(ontTp1)) {
                             LOG.error("TP {} of {} does not allow ODU4 termination creation",
@@ -198,7 +200,9 @@ public class PceOtnNode implements PceNode {
         }
 
         if ((StringConstants.SERVICE_TYPE_ODU4.equals(this.otnServiceType)
-                || StringConstants.SERVICE_TYPE_ODUC4.equals(this.otnServiceType))
+                || StringConstants.SERVICE_TYPE_ODUC4.equals(this.otnServiceType)
+                || StringConstants.SERVICE_TYPE_ODUC3.equals(this.otnServiceType)
+                || StringConstants.SERVICE_TYPE_ODUC2.equals(this.otnServiceType))
             || ((StringConstants.SERVICE_TYPE_10GE.equals(this.otnServiceType)
                     || StringConstants.SERVICE_TYPE_100GE_M.equals(this.otnServiceType)
                     || StringConstants.SERVICE_TYPE_1GE.equals(this.otnServiceType))
index aa781606fdc7c2fe04ead0f5dd8d5b62fe8d2cc4..652aea92c8c6867c98a30a8e73d415cb2848b42f 100644 (file)
@@ -129,6 +129,7 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations
                 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())
@@ -149,6 +150,8 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations
                     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,
@@ -160,6 +163,8 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations
                     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,
@@ -207,6 +212,8 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations
                     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,
@@ -218,6 +225,8 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations
                     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,
@@ -245,6 +254,8 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations
         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),
index d85dfc0df56d41186dba4a5346f42891c528f2ea..3a4038b452b5411361ecdfa39b1d4cb229ef05bf 100644 (file)
@@ -311,13 +311,23 @@ public class RendererListenerImpl implements TransportpceRendererListener {
         String serviceType = notification.getServiceType();
         switch (serviceType) {
             case StringConstants.SERVICE_TYPE_OTU4:
+            case StringConstants.SERVICE_TYPE_OTUC2:
+            case StringConstants.SERVICE_TYPE_OTUC3:
             case StringConstants.SERVICE_TYPE_OTUC4:
             case StringConstants.SERVICE_TYPE_ODU4:
+            case StringConstants.SERVICE_TYPE_ODUC2:
+            case StringConstants.SERVICE_TYPE_ODUC3:
             case StringConstants.SERVICE_TYPE_ODUC4:
                 Map<String, OtnLinkType> otnLinkTypeMap = Map.of(
                     StringConstants.SERVICE_TYPE_OTU4, OtnLinkType.OTU4,
+                    // TODO: need to change it when OtnLinkType is updated with enum
+                    StringConstants.SERVICE_TYPE_OTUC2, OtnLinkType.OTUC4,
+                    StringConstants.SERVICE_TYPE_OTUC3, OtnLinkType.OTUC4,
                     StringConstants.SERVICE_TYPE_OTUC4, OtnLinkType.OTUC4,
                     StringConstants.SERVICE_TYPE_ODU4, OtnLinkType.ODTU4,
+                    // TODO: need to change it when OtnLinkType is updated with enum
+                    StringConstants.SERVICE_TYPE_ODUC2, OtnLinkType.ODUC4,
+                    StringConstants.SERVICE_TYPE_ODUC3, OtnLinkType.ODUC4,
                     StringConstants.SERVICE_TYPE_ODUC4, OtnLinkType.ODUC4);
                 if (isDeletion) {
                     LOG.info("updating otn-topology removing links");