Adapt network module to update OTU links only 00/97800/4
authorGilles Thouenon <gilles.thouenon@orange.com>
Thu, 9 Sep 2021 13:23:29 +0000 (15:23 +0200)
committerGilles Thouenon <gilles.thouenon@orange.com>
Tue, 16 Nov 2021 17:36:19 +0000 (18:36 +0100)
Add a new updateOtnLink method in NetworkModelService and implement it
to update bandwidth parameters of OTU4 links only when creating/deleting
100GE service that is not supported over a structured ODU4. This is the
case when the service is terminated on an OTN Switch.

JIRA: TRNSPRTPCE-512
Signed-off-by: Gilles Thouenon <gilles.thouenon@orange.com>
Change-Id: I9db5ecaba843093b3a9543ef9e24b03ff3a227fb

networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelService.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelServiceImpl.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmOtnTopology.java
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/listeners/RendererListenerImpl.java

index aaa515238bcdfb1578a372d3b41e229663f686e6..3e8b342f54caab1bbac2c2a9ae0e64058f82f323 100644 (file)
@@ -93,7 +93,10 @@ public interface NetworkModelService {
     void deleteOtnLinks(String nodeA, String tpA, String nodeZ, String tpZ, OtnLinkType linkType);
 
     /**
-     * update otn links from otn-topology.
+     * Update otn links from otn-topology.
+     * For services using low-order odu, updates bandwidth parameters
+     * for both the direct parent high-order odu link, and also its server
+     * otu link.
      *
      * @param link
      *     link containing termination points to be updated
@@ -110,4 +113,16 @@ public interface NetworkModelService {
      */
     void updateOtnLinks(Link link, Uint32 serviceRate, Short tribPortNb, Short minTribSoltNb, Short maxTribSoltNb,
             boolean isDeletion);
+
+    /**
+     * Update otn links from otn-topology.
+     * For services using directly a high-order odu, updates bandwidth parameters
+     * of the direct parent otu link.
+     *
+     * @param link
+     *     link containing termination points to be updated
+     * @param isDeletion
+     *       True indicates if the low-order otn service must be deleted
+     */
+    void updateOtnLinks(Link link, boolean isDeletion);
 }
index 5c1ab9dac131cc22163d74cf4e1d260e1377c340..74567811e46a2f346f2eaba8fc1721e7960e9eb3 100644 (file)
@@ -400,8 +400,6 @@ public class NetworkModelServiceImpl implements NetworkModelService {
                 break;
             case ODTU4:
             case ODUC4:
-                String nodeTopoA = new StringBuilder(nodeA).append("-").append(tpA.split("-")[0]).toString();
-                String nodeTopoZ = new StringBuilder(nodeZ).append("-").append(tpZ.split("-")[0]).toString();
                 List<LinkId> linkIdList = new ArrayList<>();
                 String prefix;
                 if (OtnLinkType.ODTU4.equals(linkType)) {
@@ -409,10 +407,13 @@ public class NetworkModelServiceImpl implements NetworkModelService {
                 } else {
                     prefix = OtnLinkType.OTUC4.getName();
                 }
-                linkIdList.add(LinkIdUtil.buildOtnLinkId(nodeTopoA, tpA, nodeTopoZ, tpZ, prefix));
-                linkIdList.add(LinkIdUtil.buildOtnLinkId(nodeTopoZ, tpZ, nodeTopoA, tpA, prefix));
+                linkIdList.add(LinkIdUtil.buildOtnLinkId(convertNetconfNodeIdToTopoNodeId(nodeA, tpA), tpA,
+                    convertNetconfNodeIdToTopoNodeId(nodeZ, tpZ), tpZ, prefix));
+                linkIdList.add(LinkIdUtil.buildOtnLinkId(convertNetconfNodeIdToTopoNodeId(nodeZ, tpZ), tpZ,
+                    convertNetconfNodeIdToTopoNodeId(nodeA, tpA), tpA, prefix));
                 List<Link> supportedOtu4links = getOtnLinks(linkIdList);
-                List<TerminationPoint> tps = getOtnNodeTps(nodeTopoA, tpA, nodeTopoZ, tpZ);
+                List<TerminationPoint> tps = getOtnNodeTps(convertNetconfNodeIdToTopoNodeId(nodeA, tpA), tpA,
+                    convertNetconfNodeIdToTopoNodeId(nodeZ, tpZ), tpZ);
                 otnTopologyShard = OpenRoadmOtnTopology.createOtnLinks(supportedOtu4links, tps, linkType);
                 break;
             default:
@@ -604,6 +605,43 @@ public class NetworkModelServiceImpl implements NetworkModelService {
         }
     }
 
+    @Override
+    public void updateOtnLinks(
+        org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210618.renderer.rpc.result.sp.Link
+            notifLink, boolean isDeletion) {
+
+        List<LinkId> linkIdList = new ArrayList<>();
+        String nodeTopoA = convertNetconfNodeIdToTopoNodeId(notifLink.getATermination().getNodeId(),
+            notifLink.getATermination().getTpId());
+        String nodeTopoZ = convertNetconfNodeIdToTopoNodeId(notifLink.getZTermination().getNodeId(),
+            notifLink.getZTermination().getTpId());
+        linkIdList.add(LinkIdUtil.buildOtnLinkId(nodeTopoA, notifLink.getATermination().getTpId(),
+            nodeTopoZ, notifLink.getZTermination().getTpId(), OtnLinkType.OTU4.getName()));
+        linkIdList.add(LinkIdUtil.buildOtnLinkId(nodeTopoZ, notifLink.getZTermination().getTpId(),
+            nodeTopoA, notifLink.getATermination().getTpId(), OtnLinkType.OTU4.getName()));
+        List<Link> supportedOtu4links = getOtnLinks(linkIdList);
+
+        TopologyShard otnTopologyShard = OpenRoadmOtnTopology.updateOtnLinks(supportedOtu4links, isDeletion);
+        if (otnTopologyShard.getLinks() != null) {
+            for (Link otnTopologyLink : otnTopologyShard.getLinks()) {
+                LOG.info("creating and updating otn links {} in {}", otnTopologyLink.getLinkId().getValue(),
+                    NetworkUtils.OVERLAY_NETWORK_ID);
+                InstanceIdentifier<Link> iiOtnTopologyLink = InstanceIdentifier.builder(Networks.class)
+                    .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OTN_NETWORK_ID)))
+                    .augmentation(Network1.class)
+                    .child(Link.class, otnTopologyLink.key())
+                    .build();
+                networkTransactionService.merge(LogicalDatastoreType.CONFIGURATION, iiOtnTopologyLink, otnTopologyLink);
+            }
+        }
+        try {
+            networkTransactionService.commit().get();
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.error("Error adding OTN links in otn-topology", e);
+        }
+        LOG.info("OTN links updated");
+    }
+
     private List<Link> getOtnLinks(List<LinkId> linkIds) {
         List<Link> links = new ArrayList<>();
         for (LinkId linkId : linkIds) {
@@ -821,6 +859,10 @@ public class NetworkModelServiceImpl implements NetworkModelService {
         }
     }
 
+    private String convertNetconfNodeIdToTopoNodeId(String nodeId, String tpId) {
+        return new StringBuilder(nodeId).append("-").append(tpId.split("-")[0]).toString();
+    }
+
     @SuppressFBWarnings(
             value = "UPM_UNCALLED_PRIVATE_METHOD",
             justification = "false positive, this method is used by public updateOpenRoadmNetworkTopology")
index dd5325563b63418553daa1dddc46c4217a871d8a..4f65190f7a3e650e9b9955b4b1a5c9df9481d7d8 100644 (file)
@@ -213,6 +213,29 @@ public final class OpenRoadmOtnTopology {
         }
     }
 
+    public static TopologyShard updateOtnLinks(List<Link> suppOtuLinks, boolean isDeletion) {
+        List<Link> links = new ArrayList<>();
+        for (Link link : suppOtuLinks) {
+            if (link.augmentation(Link1.class) == null
+                || link.augmentation(Link1.class).getAvailableBandwidth() == null
+                || link.augmentation(Link1.class).getUsedBandwidth() == null) {
+                LOG.error("Error with otn parameters of supported link {}", link.getLinkId().getValue());
+            } else {
+                if (isDeletion) {
+                    links.add(updateOtnLinkBwParameters(link, Long.valueOf(100000), Long.valueOf(0)));
+                } else {
+                    links.add(updateOtnLinkBwParameters(link, Long.valueOf(0), Long.valueOf(100000)));
+                }
+            }
+        }
+        if (links.isEmpty()) {
+            LOG.error("unable to update otn links");
+            return new TopologyShard(null, null, null);
+        } else {
+            return new TopologyShard(null, links, null);
+        }
+    }
+
     public static TopologyShard deleteOtnLinks(List<Link> suppOtuLinks, List<TerminationPoint> oldTps,
             OtnLinkType linkType) {
         List<Link> links = new ArrayList<>();
index 0a6e6f1e6862469b09f2e7d26183f4aac4cc6a80..27bbff5f85efe2ee09c56810f017398659d2e44b 100644 (file)
@@ -342,7 +342,11 @@ public class RendererListenerImpl implements TransportpceRendererListener {
                 this.networkModelService.updateOtnLinks(link, notification.getAToZDirection().getRate(),
                     tribPort, minTribSlot, maxTribSlot, isDeletion);
                 break;
+            case StringConstants.SERVICE_TYPE_100GE_S:
+                this.networkModelService.updateOtnLinks(link, isDeletion);
+                break;
             default:
+                LOG.warn("service-type {} not managed yet", serviceType);
                 break;
         }
     }