Keep AvailFreqMaps when netconf session restores 99/99599/3
authorJonas Mårtensson <jonas.martensson@ri.se>
Fri, 4 Feb 2022 10:28:20 +0000 (11:28 +0100)
committerGilles Thouenon <gilles.thouenon@orange.com>
Wed, 23 Feb 2022 10:15:53 +0000 (10:15 +0000)
When the netconf session with a ROADM went down and then it came up
again, the node was re-created in the openroadm topology, resetting the
available frequencies bitmaps for both degrees and SRGs. This meant
that the PCE could allocate already used spectrum for new services,
disrupting existing services.

When creating a new node, first check if it already exists in the
portmapping, and if so, don't initialize available frequencies.

JIRA: TRNSPRTPCE-594
Signed-off-by: Jonas Mårtensson <jonas.martensson@ri.se>
Change-Id: I62f581ed4247b594b14f7c3769e4053b5f23116b

networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelServiceImpl.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmTopology.java

index 6bfdb0397cab61cb6a38c45e122be3e6c615f235..81276557cda9e5d5ffeed8de0237523aac375bfc 100644 (file)
@@ -108,6 +108,14 @@ public class NetworkModelServiceImpl implements NetworkModelService {
         try {
             LOG.info("createOpenROADMNode: {} ", nodeId);
 
+            boolean firstMount;
+            if (portMapping.getNode(nodeId) == null) {
+                firstMount = true;
+            } else {
+                LOG.info("{} already exists in portmapping but was reconnected", nodeId);
+                firstMount = false;
+            }
+
             if (!portMapping.createMappingData(nodeId, openRoadmVersion)) {
                 LOG.warn("Could not generate port mapping for {} skipping network model creation", nodeId);
                 return;
@@ -133,7 +141,8 @@ public class NetworkModelServiceImpl implements NetworkModelService {
                 openroadmNetworkNode);
 
             // nodes/links creation in openroadm-topology
-            TopologyShard topologyShard = OpenRoadmTopology.createTopologyShard(portMapping.getNode(nodeId));
+            TopologyShard topologyShard = OpenRoadmTopology.createTopologyShard(portMapping.getNode(nodeId),
+                                                                                firstMount);
             if (topologyShard != null) {
                 this.topologyShardMountedDevice.put(nodeId, topologyShard);
                 for (Node openRoadmTopologyNode : topologyShard.getNodes()) {
index 2423b9af9547e19df3ecbfcf3f8787ffd3ec2835..81e5ed563d4b3629801770b409bd4600f83f2b23 100644 (file)
@@ -76,6 +76,10 @@ public final class OpenRoadmTopology {
     }
 
     public static TopologyShard createTopologyShard(Nodes mappingNode) {
+        return createTopologyShard(mappingNode, true);
+    }
+
+    public static TopologyShard createTopologyShard(Nodes mappingNode, boolean firstMount) {
         int numOfDegrees;
         int numOfSrgs;
         List<Node> nodes = new ArrayList<>();
@@ -111,13 +115,13 @@ public final class OpenRoadmTopology {
             // create degree nodes
             for (Map.Entry<String, List<Mapping>> entry : mapDeg.entrySet()) {
                 NodeBuilder ietfNode = createDegree(entry.getKey(), entry.getValue(), mappingNode.getNodeId(),
-                    mappingNode.getNodeInfo().getNodeClli());
+                    mappingNode.getNodeInfo().getNodeClli(), firstMount);
                 nodes.add(ietfNode.build());
             }
             // create srg nodes
             for (Map.Entry<String, List<Mapping>> entry : mapSrg.entrySet()) {
                 NodeBuilder ietfNode = createSrg(entry.getKey(), entry.getValue(), mappingNode.getNodeId(),
-                    mappingNode.getNodeInfo().getNodeClli());
+                    mappingNode.getNodeInfo().getNodeClli(), firstMount);
                 nodes.add(ietfNode.build());
             }
 
@@ -243,7 +247,8 @@ public final class OpenRoadmTopology {
         return ietfNodeBldr;
     }
 
-    private static NodeBuilder createDegree(String degNb, List<Mapping> degListMap, String nodeId, String clli) {
+    private static NodeBuilder createDegree(String degNb, List<Mapping> degListMap, String nodeId, String clli,
+                                            boolean firstMount) {
         // Create tp-list
         Map<TerminationPointKey,TerminationPoint> tpMap = new HashMap<>();
         TerminationPointBuilder ietfTpBldr;
@@ -286,10 +291,12 @@ public final class OpenRoadmTopology {
         TerminationPoint ietfTp = ietfTpBldr.build();
         tpMap.put(ietfTp.key(),ietfTp);
         // set degree-attributes
-        DegreeAttributes degAtt = new DegreeAttributesBuilder()
-            .setDegreeNumber(Uint16.valueOf(degNb.split("DEG")[1]))
-            .setAvailFreqMaps(GridUtils.initFreqMaps4FixedGrid2Available())
-            .build();
+        DegreeAttributesBuilder degAttBldr = new DegreeAttributesBuilder()
+            .setDegreeNumber(Uint16.valueOf(degNb.split("DEG")[1]));
+        if (firstMount) {
+            degAttBldr.setAvailFreqMaps(GridUtils.initFreqMaps4FixedGrid2Available());
+        }
+        DegreeAttributes degAtt = degAttBldr.build();
         // Create ietf node augmentation to support ietf tp-list
         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1Builder
             ietfNode1 = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
@@ -313,7 +320,8 @@ public final class OpenRoadmTopology {
             .addAugmentation(ietfNode1.build());
     }
 
-    private static NodeBuilder createSrg(String srgNb, List<Mapping> srgListMap, String nodeId, String clli) {
+    private static NodeBuilder createSrg(String srgNb, List<Mapping> srgListMap, String nodeId, String clli,
+                                         boolean firstMount) {
         // Create tp-list
         Map<TerminationPointKey,TerminationPoint> tpMap = new HashMap<>();
         TerminationPointBuilder ietfTpBldr;
@@ -363,8 +371,11 @@ public final class OpenRoadmTopology {
                     .setOperationalState(State.InService)
                     .build();
         // set srg-attributes
-        SrgAttributes srgAttr = new SrgAttributesBuilder()
-                .setAvailFreqMaps(GridUtils.initFreqMaps4FixedGrid2Available()).build();
+        SrgAttributesBuilder srgAttrBldr = new SrgAttributesBuilder();
+        if (firstMount) {
+            srgAttrBldr.setAvailFreqMaps(GridUtils.initFreqMaps4FixedGrid2Available());
+        }
+        SrgAttributes srgAttr = srgAttrBldr.build();
         Node1 ontNode1 = new Node1Builder().setSrgAttributes(srgAttr).build();
         // Create ietf node augmentation to support ietf tp-list
         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1Builder