Refactor network topologies listener of SH 46/95546/13
authorGilles Thouenon <gilles.thouenon@orange.com>
Thu, 18 Mar 2021 10:55:48 +0000 (11:55 +0100)
committerguillaume.lambert <guillaume.lambert@orange.com>
Tue, 13 Apr 2021 09:11:52 +0000 (11:11 +0200)
- refactor the topology-update-result notification in
transportpce-networkmodel.yang model to be compatible with the new
topology updates implementation, and remove
transportpce-common-ord-topology-types yang module which is no longer
necessary
- refactor the NetworkModelListenerImpl class to be adapted to the new
notification format
- review version of State and AdminStates enums used in Service Handler
- convert incompatible versions of State and AdminStates in
ServiceDataStoreOperationsImpl class

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

api/src/main/yang/service_path/transportpce-common-ord-topology-types@2020-11-16.yang [deleted file]
api/src/main/yang/service_path/transportpce-networkmodel@2020-11-16.yang
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelServiceImpl.java
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/listeners/NetworkModelListenerImpl.java
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/listeners/RendererListenerImpl.java
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/service/ServiceDataStoreOperations.java
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/service/ServiceDataStoreOperationsImpl.java
servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/service/ServiceDataStoreOperationsImplTest.java

diff --git a/api/src/main/yang/service_path/transportpce-common-ord-topology-types@2020-11-16.yang b/api/src/main/yang/service_path/transportpce-common-ord-topology-types@2020-11-16.yang
deleted file mode 100644 (file)
index c87f4ea..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-module transportpce-common-ord-topology-types {
-  namespace "http://org/transportpce/D-interface/ord/topology/types";
-  prefix transportpce-common-ord-topology-types;
-
-  organization
-    "transportPCE";
-  contact
-    "transportPCE committers - ODL";
-  description
-    "YANG definitions of D interface (transportPCE). Adapted from network topology definition (openroadm)
-     Copyright ©  2020 Nokia, Inc. and others.  All rights reserved.
-
-     openroadm copyright:
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      AT&T Intellectual Property.  All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2020-11-16 {
-    description
-      "Version 1.5";
-  }
-
-  typedef topology-notification-types {
-    type enumeration {
-      enum openroadm-topology-update {
-        value 1;
-      }
-      enum openroadm-network-update {
-        value 2;
-      }
-      enum clli-network-update {
-        value 3;
-      }
-      enum otn-topology-update {
-        value 4;
-      }
-    }
-  }
-}
\ No newline at end of file
index de06306cc6b7776d600a29b7afdc161214e136b9..3f725124e0c17a61f48e5eeebb4eaf8c2c0e3eb3 100644 (file)
@@ -2,11 +2,6 @@ module transportpce-networkmodel {
   namespace "http://org/opendaylight/transportpce/networkmodel";
   prefix org-opendaylight-transportpce-networkmodel;
 
-  import transportpce-common-ord-topology-types {
-    prefix transportpce-common-ord-topology-types;
-    revision-date 2020-11-16;
-  }
-
   import org-openroadm-common-state-types {
     prefix org-openroadm-common-state-types;
     revision-date 2019-11-29;
@@ -52,28 +47,30 @@ module transportpce-networkmodel {
       "Initial revision of network model version 1.5";
   }
 
-  grouping element-change {
-    leaf id {
-      type string;
-      mandatory true;
-      description "Id of abstracted element that changed in the topology";
-    }
-    leaf state {
-      type org-openroadm-common-state-types:state;
-      mandatory true;
-      description "Operational state of the affected element";
-    }
-  }
-
   notification topology-update-result {
     description
-      "This Notification indicates result of an update in the openroadm topology";
-    leaf notification-type {
-      type transportpce-common-ord-topology-types:topology-notification-types;
-    }
-    list ord-topology-changes {
-      key "id";
-      uses element-change;
+      "This Notification indicates result of any termination-point updates in
+       openroadm and/or otn topologies";
+    list topology-changes {
+      key "node-id tp-id";
+      description
+        "Node and tp modified in openroadm or otn topology";
+      leaf tp-id {
+        type string;
+        description
+          "Id of the termination-point changed in the topology";
+      }
+      leaf node-id {
+        type string;
+        description
+          "Node Id supporting the changed termination-point as identified
+           in openroadm and otn topolgoies";
+      }
+      leaf state {
+        type org-openroadm-common-state-types:state;
+        description
+          "New administrative state of the modified termination-point";
+      }
     }
   }
 }
\ No newline at end of file
index 66e5460d1936f8150104e17c68b8ae29da813212..ea386f363e80c3e9d53d9f53bd6bdd31b2b0ff87 100644 (file)
@@ -8,6 +8,7 @@
 package org.opendaylight.transportpce.networkmodel.service;
 
 import com.google.common.util.concurrent.ListenableFuture;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -32,6 +33,11 @@ import org.opendaylight.transportpce.networkmodel.util.OpenRoadmNetwork;
 import org.opendaylight.transportpce.networkmodel.util.OpenRoadmOtnTopology;
 import org.opendaylight.transportpce.networkmodel.util.OpenRoadmTopology;
 import org.opendaylight.transportpce.networkmodel.util.TopologyUtils;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkmodel.rev201116.TopologyUpdateResult;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkmodel.rev201116.TopologyUpdateResultBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkmodel.rev201116.topology.update.result.TopologyChanges;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkmodel.rev201116.topology.update.result.TopologyChangesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkmodel.rev201116.topology.update.result.TopologyChangesKey;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210315.OpenroadmNodeVersion;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210315.mapping.Mapping;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210315.network.nodes.NodeInfo;
@@ -70,6 +76,10 @@ public class NetworkModelServiceImpl implements NetworkModelService {
     private final PortMapping portMapping;
     private Map<String, TopologyShard> topologyShardMountedDevice;
     private Map<String, TopologyShard> otnTopologyShardMountedDevice;
+    // Variables for creating and sending topology update notification
+    private final NotificationPublishService notificationPublishService;
+    private Map<TopologyChangesKey, TopologyChanges> topologyChanges;
+    private TopologyUpdateResult notification = null;
 
     public NetworkModelServiceImpl(final NetworkTransactionService networkTransactionService,
             final R2RLinkDiscovery linkDiscovery, PortMapping portMapping,
@@ -80,6 +90,8 @@ public class NetworkModelServiceImpl implements NetworkModelService {
         this.portMapping = portMapping;
         this.topologyShardMountedDevice = new HashMap<String, TopologyShard>();
         this.otnTopologyShardMountedDevice = new HashMap<String, TopologyShard>();
+        this.notificationPublishService = notificationPublishService;
+        this.topologyChanges = new HashMap<TopologyChangesKey, TopologyChanges>();
     }
 
     public void init() {
@@ -255,6 +267,7 @@ public class NetworkModelServiceImpl implements NetworkModelService {
     @Override
     public void updateOpenRoadmTopologies(String nodeId, Mapping mapping) {
         LOG.info("update OpenRoadm topologies after change update from: {} ", nodeId);
+        this.topologyChanges.clear();
         Network openroadmTopology = null;
         Network otnTopology = null;
         Map<LinkKey, Link> openroadmTopologyLinks = null;
@@ -306,6 +319,17 @@ public class NetworkModelServiceImpl implements NetworkModelService {
                         .child(TerminationPoint.class, new TerminationPointKey(tp.getTpId()))
                         .build();
                     networkTransactionService.merge(LogicalDatastoreType.CONFIGURATION, iiTopologyTp, tp);
+                    TopologyChanges tc = new TopologyChangesBuilder()
+                        .withKey(new TopologyChangesKey(abstractNodeid, tp.getTpId().getValue()))
+                        .setNodeId(abstractNodeid)
+                        .setTpId(tp.getTpId().getValue())
+                        .setState(tp.augmentation(
+                            org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1
+                                .class).getOperationalState())
+                        .build();
+                    if (!this.topologyChanges.containsKey(tc.key())) {
+                        this.topologyChanges.put(tc.key(), tc);
+                    }
                 }
             }
         }
@@ -336,12 +360,24 @@ public class NetworkModelServiceImpl implements NetworkModelService {
                         .child(TerminationPoint.class, new TerminationPointKey(tp.getTpId()))
                         .build();
                     networkTransactionService.merge(LogicalDatastoreType.CONFIGURATION, iiTopologyTp, tp);
+                    TopologyChanges tc = new TopologyChangesBuilder()
+                        .withKey(new TopologyChangesKey(abstractNodeid, tp.getTpId().getValue()))
+                        .setNodeId(abstractNodeid)
+                        .setTpId(tp.getTpId().getValue())
+                        .setState(tp.augmentation(
+                            org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1
+                                .class).getOperationalState())
+                        .build();
+                    if (!this.topologyChanges.containsKey(tc.key())) {
+                        this.topologyChanges.put(tc.key(), tc);
+                    }
                 }
             }
         }
         // commit datastore updates
         try {
             networkTransactionService.commit().get();
+            sendNotification();
         } catch (InterruptedException | ExecutionException e) {
             LOG.error("Error updating openroadm-topology", e);
         }
@@ -740,4 +776,22 @@ public class NetworkModelServiceImpl implements NetworkModelService {
             LOG.error("Unable to create OTN topology shard for node {}!", nodeId);
         }
     }
+
+    @SuppressFBWarnings(
+            value = "UPM_UNCALLED_PRIVATE_METHOD",
+            justification = "false positive, this method is used by public updateOpenRoadmNetworkTopology")
+    private void sendNotification() {
+        if (topologyChanges.isEmpty()) {
+            LOG.warn("Empty Topology Change List. No updates in topology");
+            return;
+        }
+        this.notification = new TopologyUpdateResultBuilder()
+            .setTopologyChanges(topologyChanges)
+            .build();
+        try {
+            notificationPublishService.putNotification(this.notification);
+        } catch (InterruptedException e) {
+            LOG.error("Notification offer rejected. Error={}", e.getMessage());
+        }
+    }
 }
index be0eb888d3b59228ba353a0cd27f2bcd5758c2d6..a9a9f02995d586276b554eba0d51fed2a133a86e 100644 (file)
@@ -7,20 +7,22 @@
  */
 package org.opendaylight.transportpce.servicehandler.listeners;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import java.util.stream.Collectors;
+import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.mdsal.binding.api.NotificationPublishService;
 import org.opendaylight.transportpce.common.OperationResult;
 import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkmodel.rev201116.TopologyUpdateResult;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkmodel.rev201116.TransportpceNetworkmodelListener;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkmodel.rev201116.topology.update.result.OrdTopologyChanges;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkmodel.rev201116.topology.update.result.OrdTopologyChangesKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev181130.State;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev181130.AdminStates;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkmodel.rev201116.topology.update.result.TopologyChanges;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkmodel.rev201116.topology.update.result.TopologyChangesKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev190531.service.list.Services;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev201210.path.description.AToZDirection;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev201210.path.description.AToZDirectionBuilder;
@@ -34,8 +36,6 @@ import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdes
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev201210.path.description.ztoa.direction.ZToAKey;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev201210.pce.resource.Resource;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev201210.pce.resource.ResourceBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev201210.pce.resource.resource.resource.Link;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev201210.pce.resource.resource.resource.Node;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev201210.pce.resource.resource.resource.TerminationPoint;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev200128.service.path.PathDescription;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev200128.service.path.PathDescriptionBuilder;
@@ -59,30 +59,14 @@ public class NetworkModelListenerImpl implements TransportpceNetworkmodelListene
 
     @Override
     public void onTopologyUpdateResult(TopologyUpdateResult notification) {
-        LOG.info("Topology update notification: {}", notification.toString());
+        LOG.debug("Topology update notification: {}", notification.toString());
         if (compareTopologyUpdateResult(notification)) {
             LOG.warn("TopologyUpdateResult already wired !");
             return;
         }
         topologyUpdateResult = notification;
-        switch (topologyUpdateResult.getNotificationType().getIntValue()) {
-            case 1:
-                // Update service datastore and service path description
-                LOG.info("openroadm-topology update");
-                updateServicePaths(notification);
-                break;
-            case 2:
-                LOG.info("openroadm-network update");
-                break;
-            case 3:
-                LOG.info("clli-network update");
-                break;
-            case 4:
-                LOG.info("otn-topology update");
-                break;
-            default:
-                break;
-        }
+        // Update service datastore and service path description
+        updateServicePaths(notification);
     }
 
     /**
@@ -90,23 +74,21 @@ public class NetworkModelListenerImpl implements TransportpceNetworkmodelListene
      * @param notification the result notification.
      */
     private void updateServicePaths(TopologyUpdateResult notification) {
-        Map<OrdTopologyChangesKey, OrdTopologyChanges> ordTopologyChanges = notification.getOrdTopologyChanges();
+        @Nullable
+        Map<TopologyChangesKey, TopologyChanges> topologyChanges = notification.getTopologyChanges();
         Optional<ServicePathList> servicePathListOptional = this.serviceDataStoreOperations.getServicePaths();
         ServicePathList servicePathList = null;
         if (!servicePathListOptional.isPresent()) {
-            LOG.error("Couldn't retrieve service path list");
+            LOG.warn("Enable to retrieve service path list");
             return;
         }
         servicePathList = servicePathListOptional.get();
-        if (servicePathList.getServicePaths().isEmpty()) {
-            return;
-        }
         for (ServicePaths servicePaths : servicePathList.getServicePaths().values()) {
             String serviceName = servicePaths.getServicePathName();
             PathDescription pathDescription = servicePaths.getPathDescription();
             // update path descriptions in the datastore
-            Map<AToZKey, AToZ> updatedAtoZ = changePathElementStateAZ(ordTopologyChanges, pathDescription);
-            Map<ZToAKey, ZToA> updatedZtoA = changePathElementStateZA(ordTopologyChanges, pathDescription);
+            Map<AToZKey, AToZ> updatedAtoZ = changePathElementStateAZ(topologyChanges, pathDescription);
+            Map<ZToAKey, ZToA> updatedZtoA = changePathElementStateZA(topologyChanges, pathDescription);
             OperationResult operationResult = this.serviceDataStoreOperations
                     .modifyServicePath(buildNewPathDescription(pathDescription, updatedAtoZ, updatedZtoA), serviceName);
             if (!operationResult.isSuccess()) {
@@ -123,169 +105,86 @@ public class NetworkModelListenerImpl implements TransportpceNetworkmodelListene
             }
             services = serviceOptional.get();
             OperationResult operationResult1 = null;
-            if (State.InService.equals(services.getOperationalState())
-                    && !allElementsinPathinService(updatedAtoZ, updatedZtoA)) {
-                LOG.info("Service={} needs to be updated to outOfService", serviceName);
+            if (org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev181130.State.InService
+                    .equals(services.getOperationalState())
+                && !allElementsinPathinService(updatedAtoZ, updatedZtoA)) {
+                LOG.debug("Service={} needs to be updated to outOfService", serviceName);
                 operationResult1 = this.serviceDataStoreOperations.modifyService(serviceName, State.OutOfService,
                         AdminStates.OutOfService);
-            } else if (State.OutOfService.equals(services.getOperationalState())
-                    && allElementsinPathinService(updatedAtoZ, updatedZtoA)) {
-                LOG.info("Service={} needs to be updated to inService", serviceName);
+            } else if (org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev181130.State.OutOfService
+                    .equals(services.getOperationalState())
+                && allElementsinPathinService(updatedAtoZ, updatedZtoA)) {
+                LOG.debug("Service={} needs to be updated to inService", serviceName);
                 operationResult1 = this.serviceDataStoreOperations.modifyService(serviceName, State.InService,
                         AdminStates.InService);
             } else {
-                LOG.info("Service {} state doesnt need to be modified", serviceName);
+                LOG.debug("Service {} state doesnt need to be modified", serviceName);
             }
             if (operationResult1 != null && operationResult1.isSuccess()) {
-                LOG.info("Service state correctly updated in datastore");
+                LOG.info("Service state of {} correctly updated in datastore", serviceName);
             }
         }
     }
 
-    private Map<ZToAKey, ZToA> changePathElementStateZA(Map<OrdTopologyChangesKey,
-            OrdTopologyChanges> ordTopologyChanges, PathDescription pathDescription) {
-        Map<ZToAKey, ZToA> ztoaMap = pathDescription.getZToADirection().getZToA();
-        // Needed as ztoaMap is immutable
-        Map<ZToAKey, ZToA> newztoaMap = new HashMap<ZToAKey, ZToA>();
-        for (ZToA element : ztoaMap.values()) {
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State elementState
-                    = element.getResource().getState();
-            String elementType = element.getResource().getResource().implementedInterface().getSimpleName();
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State updatedState = null;
-            ZToAKey elementKey = null;
-            Resource elementResource = null;
-            switch (elementType) {
-                case "TerminationPoint":
-                    TerminationPoint tp = (TerminationPoint) element.getResource().getResource();
-                    // for the tps we need to merge nodeId and tpId
-                    String tpId = tp.getTpNodeId() + "-" + tp.getTpId();
-                    if (!(ordTopologyChanges.containsKey(new OrdTopologyChangesKey(tpId))
-                            && !ordTopologyChanges.get(new OrdTopologyChangesKey(tpId)).getState()
-                            .equals(elementState))) {
-                        newztoaMap.put(element.key(), element);
-                        continue;
-                    }
-                    updatedState = ordTopologyChanges.get(new OrdTopologyChangesKey(tpId)).getState();
-                    LOG.info("Updating path element {} to {}", tpId, updatedState.getName());
-                    // Create new resource element and replace on map
-                    elementKey = new ZToAKey(element.getId());
-                    elementResource = new ResourceBuilder().setResource(tp).setState(updatedState).build();
-                    ZToA tpResource = new ZToABuilder().setId(tp.getTpId()).withKey(elementKey)
-                            .setResource(elementResource).build();
-                    newztoaMap.put(elementKey, tpResource);
-                    break;
-                case "Link":
-                    Link link = (Link) element.getResource().getResource();
-                    if (!(ordTopologyChanges.containsKey(new OrdTopologyChangesKey(link.getLinkId()))
-                            && !ordTopologyChanges.get(new OrdTopologyChangesKey(link.getLinkId())).getState()
-                            .equals(elementState))) {
-                        newztoaMap.put(element.key(), element);
-                        continue;
-                    }
-                    updatedState = ordTopologyChanges.get(new OrdTopologyChangesKey(link.getLinkId())).getState();
-                    LOG.info("Updating path element {} to {}", link.getLinkId(), updatedState.getName());
-                    // Create new resource element and replace on map
-                    elementKey = new ZToAKey(element.getId());
-                    elementResource = new ResourceBuilder().setResource(link).setState(updatedState).build();
-                    ZToA linkResource = new ZToABuilder().setId(link.getLinkId()).withKey(elementKey)
-                            .setResource(elementResource).build();
-                    newztoaMap.put(elementKey, linkResource);
-                    break;
-                case "Node":
-                    Node node = (Node) element.getResource().getResource();
-                    if (!(ordTopologyChanges.containsKey(new OrdTopologyChangesKey(node.getNodeId()))
-                            && !ordTopologyChanges.get(new OrdTopologyChangesKey(node.getNodeId())).getState()
-                            .equals(elementState))) {
-                        newztoaMap.put(element.key(), element);
-                        continue;
-                    }
-                    updatedState = ordTopologyChanges.get(new OrdTopologyChangesKey(node.getNodeId())).getState();
-                    LOG.info("Updating path element {} to {}", node.getNodeId(), updatedState.getName());
-                    // Create new resource element and replace on map
-                    elementKey = new ZToAKey(element.getId());
-                    elementResource = new ResourceBuilder().setResource(node).setState(updatedState).build();
-                    ZToA nodeResource = new ZToABuilder().setId(node.getNodeId()).withKey(elementKey)
-                            .setResource(elementResource).build();
-                    newztoaMap.put(elementKey, nodeResource);
-                    break;
-                default:
-                    LOG.warn("Element type {} not recognized", elementType);
-                    break;
+    private Map<ZToAKey, ZToA> changePathElementStateZA(Map<TopologyChangesKey, TopologyChanges> topologyChanges,
+        PathDescription pathDescription) {
+
+        Map<ZToAKey, ZToA> newztoaMap = new HashMap<>(pathDescription.getZToADirection().getZToA());
+        List<ZToA> tpResources = pathDescription.getZToADirection().getZToA().values().stream()
+            .filter(ele -> ele.getResource().getResource().implementedInterface().getSimpleName()
+                .equals("TerminationPoint"))
+            .collect(Collectors.toList());
+        for (ZToA ztoA : tpResources) {
+            String ztoAid = ztoA.getId();
+            State ztoAState = ztoA.getResource().getState();
+            TerminationPoint tp = (TerminationPoint) ztoA.getResource().getResource();
+            if (topologyChanges.containsKey(new TopologyChangesKey(tp.getTpNodeId(), tp.getTpId()))
+                && !topologyChanges.get(new TopologyChangesKey(tp.getTpNodeId(), tp.getTpId())).getState()
+                .equals(ztoAState)) {
+                LOG.debug("updating ztoa tp {}", ztoA);
+                State updatedState = topologyChanges.get(new TopologyChangesKey(tp.getTpNodeId(), tp.getTpId()))
+                    .getState();
+                Resource updatedResource = new ResourceBuilder()
+                    .setResource(tp)
+                    .setState(updatedState)
+                    .build();
+                ZToA updatedZToA = new ZToABuilder(ztoA)
+                    .setId(ztoAid)
+                    .setResource(updatedResource)
+                    .build();
+                newztoaMap.put(updatedZToA.key(), updatedZToA);
             }
         }
         return newztoaMap;
     }
 
-    private Map<AToZKey, AToZ> changePathElementStateAZ(Map<OrdTopologyChangesKey,
-            OrdTopologyChanges> ordTopologyChanges, PathDescription pathDescription) {
-        Map<AToZKey, AToZ> atozMap = pathDescription.getAToZDirection().getAToZ();
-        // Needed as atozMap is immutable
-        Map<AToZKey, AToZ> newatozMap = new HashMap<AToZKey, AToZ>();
-        for (AToZ element : atozMap.values()) {
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State elementState
-                = element.getResource().getState();
-            String elementType = element.getResource().getResource().implementedInterface().getSimpleName();
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State updatedState = null;
-            AToZKey elementKey = null;
-            Resource elementResource = null;
-            switch (elementType) {
-                case "TerminationPoint":
-                    TerminationPoint tp = (TerminationPoint) element.getResource().getResource();
-                    // for the tps we need to merge nodeId and tpId
-                    String tpId = tp.getTpNodeId() + "-" + tp.getTpId();
-                    if (!(ordTopologyChanges.containsKey(new OrdTopologyChangesKey(tpId))
-                            && !ordTopologyChanges.get(new OrdTopologyChangesKey(tpId)).getState()
-                            .equals(elementState))) {
-                        newatozMap.put(element.key(), element);
-                        continue;
-                    }
-                    updatedState = ordTopologyChanges.get(new OrdTopologyChangesKey(tpId)).getState();
-                    LOG.info("Updating path element {} to {}", tpId, updatedState.getName());
-                    // Create new resource element and replace on map
-                    elementKey = new AToZKey(element.getId());
-                    elementResource = new ResourceBuilder().setResource(tp).setState(updatedState).build();
-                    AToZ tpResource = new AToZBuilder().setId(tp.getTpId()).withKey(elementKey)
-                            .setResource(elementResource).build();
-                    newatozMap.put(elementKey, tpResource);
-                    break;
-                case "Link":
-                    Link link = (Link) element.getResource().getResource();
-                    if (!(ordTopologyChanges.containsKey(new OrdTopologyChangesKey(link.getLinkId()))
-                            && !ordTopologyChanges.get(new OrdTopologyChangesKey(link.getLinkId())).getState()
-                            .equals(elementState))) {
-                        newatozMap.put(element.key(), element);
-                        continue;
-                    }
-                    updatedState = ordTopologyChanges.get(new OrdTopologyChangesKey(link.getLinkId()))
-                            .getState();
-                    LOG.info("Updating path element {} to {}", link.getLinkId(), updatedState.getName());
-                    // Create new resource element and replace on map
-                    elementKey = new AToZKey(element.getId());
-                    elementResource = new ResourceBuilder().setResource(link).setState(updatedState).build();
-                    AToZ linkResource = new AToZBuilder().setId(link.getLinkId()).withKey(elementKey)
-                            .setResource(elementResource).build();
-                    newatozMap.put(elementKey, linkResource);
-                    break;
-                case "Node":
-                    Node node = (Node) element.getResource().getResource();
-                    if (!(ordTopologyChanges.containsKey(new OrdTopologyChangesKey(node.getNodeId()))
-                            && !ordTopologyChanges.get(new OrdTopologyChangesKey(node.getNodeId())).getState()
-                            .equals(elementState))) {
-                        newatozMap.put(element.key(), element);
-                        continue;
-                    }
-                    updatedState = ordTopologyChanges.get(new OrdTopologyChangesKey(node.getNodeId())).getState();
-                    LOG.info("Updating path element {} to {}", node.getNodeId(), updatedState.getName());
-                    // Create new resource element and replace on map
-                    elementKey = new AToZKey(element.getId());
-                    elementResource = new ResourceBuilder().setResource(node).setState(updatedState).build();
-                    AToZ nodeResource = new AToZBuilder().setId(node.getNodeId()).withKey(elementKey)
-                            .setResource(elementResource).build();
-                    newatozMap.put(elementKey, nodeResource);
-                    break;
-                default:
-                    LOG.warn("Element type {} not recognized", elementType);
-                    break;
+    private Map<AToZKey, AToZ> changePathElementStateAZ(Map<TopologyChangesKey,
+            TopologyChanges> topologyChanges, PathDescription pathDescription) {
+
+        Map<AToZKey, AToZ> newatozMap = new HashMap<>(pathDescription.getAToZDirection().getAToZ());
+        List<AToZ> tpResources = pathDescription.getAToZDirection().getAToZ().values().stream()
+            .filter(ele -> ele.getResource().getResource().implementedInterface().getSimpleName()
+                .equals("TerminationPoint"))
+            .collect(Collectors.toList());
+        for (AToZ atoZ : tpResources) {
+            String atoZid = atoZ.getId();
+            State atoZState = atoZ.getResource().getState();
+            TerminationPoint tp = (TerminationPoint) atoZ.getResource().getResource();
+            if (topologyChanges.containsKey(new TopologyChangesKey(tp.getTpNodeId(), tp.getTpId()))
+                && !topologyChanges.get(new TopologyChangesKey(tp.getTpNodeId(), tp.getTpId())).getState()
+                .equals(atoZState)) {
+                LOG.debug("updating atoz tp {}", atoZ);
+                State updatedState = topologyChanges.get(new TopologyChangesKey(tp.getTpNodeId(), tp.getTpId()))
+                    .getState();
+                Resource updatedResource = new ResourceBuilder()
+                    .setResource(tp)
+                    .setState(updatedState)
+                    .build();
+                AToZ updatedAToZ = new AToZBuilder(atoZ)
+                    .setId(atoZid)
+                    .setResource(updatedResource)
+                    .build();
+                newatozMap.put(updatedAToZ.key(), updatedAToZ);
             }
         }
         return newatozMap;
@@ -293,25 +192,16 @@ public class NetworkModelListenerImpl implements TransportpceNetworkmodelListene
 
     private PathDescription buildNewPathDescription(PathDescription pathDescription, Map<AToZKey, AToZ> updatedAtoZ,
                                                     Map<ZToAKey, ZToA> updatedZtoA) {
-        // A to Z
-        AToZDirection atozDir = new AToZDirectionBuilder()
+        AToZDirection atozDir = new AToZDirectionBuilder(pathDescription.getAToZDirection())
                 .setAToZ(updatedAtoZ)
-                .setAToZWavelengthNumber(pathDescription.getAToZDirection().getAToZWavelengthNumber())
-                .setModulationFormat(pathDescription.getAToZDirection().getModulationFormat())
-                .setRate(pathDescription.getAToZDirection().getRate())
-                .setTribPortNumber(pathDescription.getAToZDirection().getTribPortNumber())
-                .setTribSlotNumber(pathDescription.getAToZDirection().getTribSlotNumber())
                 .build();
-        // Z to A
-        ZToADirection ztoaDir = new ZToADirectionBuilder()
+        ZToADirection ztoaDir = new ZToADirectionBuilder(pathDescription.getZToADirection())
                 .setZToA(updatedZtoA)
-                .setZToAWavelengthNumber(pathDescription.getZToADirection().getZToAWavelengthNumber())
-                .setModulationFormat(pathDescription.getZToADirection().getModulationFormat())
-                .setRate(pathDescription.getAToZDirection().getRate())
-                .setTribPortNumber(pathDescription.getAToZDirection().getTribPortNumber())
-                .setTribSlotNumber(pathDescription.getAToZDirection().getTribSlotNumber())
                 .build();
-        return new PathDescriptionBuilder().setAToZDirection(atozDir).setZToADirection(ztoaDir).build();
+        return new PathDescriptionBuilder()
+            .setAToZDirection(atozDir)
+            .setZToADirection(ztoaDir)
+            .build();
     }
 
     private boolean allElementsinPathinService(Map<AToZKey, AToZ> updatedAtoZ, Map<ZToAKey, ZToA> updatedZtoA) {
@@ -330,18 +220,12 @@ public class NetworkModelListenerImpl implements TransportpceNetworkmodelListene
         return allEleminService;
     }
 
-    @SuppressFBWarnings(
-            value = "ES_COMPARING_STRINGS_WITH_EQ",
-            justification = "false positives, not strings but real object references comparisons")
     private boolean compareTopologyUpdateResult(TopologyUpdateResult notification) {
         if (topologyUpdateResult == null) {
             return false;
         }
-        if (topologyUpdateResult.getNotificationType() != notification.getNotificationType()) {
-            return false;
-        }
-        if (topologyUpdateResult.getOrdTopologyChanges().values()
-                .equals(notification.getOrdTopologyChanges().values())) {
+        if (topologyUpdateResult.getTopologyChanges().values()
+                .equals(notification.getTopologyChanges().values())) {
             return false;
         }
         return true;
index 38a054917d87801f1532290d3a528d71c88a0885..9a420e14ea6d13f18e95761c462b47e2bd3140ae 100644 (file)
@@ -19,8 +19,8 @@ import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.servicehandler.rev201125.ServiceRpcResultSh;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.servicehandler.rev201125.ServiceRpcResultShBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev190531.ServiceNotificationTypes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev181130.State;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev181130.AdminStates;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev190531.service.list.Services;
 import org.opendaylight.yang.gen.v1.nbi.notifications.rev201130.PublishNotificationService;
 import org.opendaylight.yang.gen.v1.nbi.notifications.rev201130.PublishNotificationServiceBuilder;
index 3d6966d7c4ab078cfc3e2c4308a8e1d20ae0a38c..d84cf2345c4065f11236d27ede21a2cbfd2c75c3 100644 (file)
@@ -11,8 +11,8 @@ import java.util.Optional;
 import org.opendaylight.transportpce.common.OperationResult;
 import org.opendaylight.transportpce.servicehandler.ServiceInput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev200128.PathComputationRequestOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev181130.State;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev181130.AdminStates;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev190531.ServiceCreateInput;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev190531.TempServiceCreateInput;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev190531.service.list.Services;
index e88436fde864b4ce049ac6d689c05f3763a4a242..c9a4990833a42b5cfada29fb7485efee519679fd 100644 (file)
@@ -24,8 +24,8 @@ import org.opendaylight.transportpce.common.Timeouts;
 import org.opendaylight.transportpce.servicehandler.ModelMappingUtils;
 import org.opendaylight.transportpce.servicehandler.ServiceInput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev200128.PathComputationRequestOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev181130.State;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev181130.AdminStates;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev190531.ServiceCreateInput;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev190531.ServiceList;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev190531.ServiceListBuilder;
@@ -192,9 +192,10 @@ public class ServiceDataStoreOperationsImpl implements ServiceDataStoreOperation
             WriteTransaction writeTx = this.dataBroker.newWriteOnlyTransaction();
             InstanceIdentifier<Services> iid = InstanceIdentifier.create(ServiceList.class)
                     .child(Services.class, new ServicesKey(serviceName));
-            Services services = new ServicesBuilder(readService.get()).setOperationalState(operationalState)
-                    .setAdministrativeState(administrativeState)
-                    .build();
+            Services services = new ServicesBuilder(readService.get())
+                .setOperationalState(convertOperState(operationalState))
+                .setAdministrativeState(convertAdminState(administrativeState))
+                .build();
             writeTx.merge(LogicalDatastoreType.OPERATIONAL, iid, services);
             writeTx.commit().get(Timeouts.DATASTORE_WRITE, TimeUnit.MILLISECONDS);
             return OperationResult.ok(LogMessages.SUCCESSFUL_MESSAGE);
@@ -221,11 +222,12 @@ public class ServiceDataStoreOperationsImpl implements ServiceDataStoreOperation
                     .child(org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev190531.temp.service.list
                             .Services.class, new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev190531
                                 .temp.service.list.ServicesKey(serviceName));
-            org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev190531.temp.service.list
-                .Services services = new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev190531.temp
-                    .service.list.ServicesBuilder(readService.get()).setOperationalState(operationalState)
-                        .setAdministrativeState(administrativeState)
-                        .build();
+            org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev190531.temp.service.list.Services services =
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev190531.temp.service.list.ServicesBuilder(
+                    readService.get())
+                .setOperationalState(convertOperState(operationalState))
+                .setAdministrativeState(convertAdminState(administrativeState))
+                .build();
             writeTx.merge(LogicalDatastoreType.OPERATIONAL, iid, services);
             writeTx.commit().get(Timeouts.DATASTORE_WRITE, TimeUnit.MILLISECONDS);
             return OperationResult.ok(LogMessages.SUCCESSFUL_MESSAGE);
@@ -429,7 +431,8 @@ public class ServiceDataStoreOperationsImpl implements ServiceDataStoreOperation
         switch (choice) {
             case 0 : /* Modify. */
                 LOG.debug("Modifying '{}' Service", serviceName);
-                service.setOperationalState(State.InService).setAdministrativeState(AdminStates.InService);
+                service.setOperationalState(convertOperState(State.InService))
+                    .setAdministrativeState(convertAdminState(AdminStates.InService));
                 writeTx.merge(LogicalDatastoreType.OPERATIONAL, iid, service.build());
                 action = "modifyService";
                 break;
@@ -451,4 +454,16 @@ public class ServiceDataStoreOperationsImpl implements ServiceDataStoreOperation
 
         return null;
     }
+
+    private org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev181130.AdminStates
+        convertAdminState(AdminStates adminState61) {
+        return org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev181130.AdminStates
+            .valueOf(adminState61.name());
+    }
+
+    private org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev181130.State
+        convertOperState(State operState61) {
+        return org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev181130.State
+            .valueOf(operState61.name());
+    }
 }
index 9b4848c2481b2ae0fdd56687fb65e0afa3bbede2..cca4bc4a86073a5e2ccb80a799b32def73e77f39 100644 (file)
@@ -23,8 +23,8 @@ import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev20
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev200128.PathComputationRequestOutputBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev190531.configuration.response.common.ConfigurationResponseCommon;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev190531.configuration.response.common.ConfigurationResponseCommonBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev181130.State;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev181130.AdminStates;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev190531.ServiceCreateInput;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev190531.TempServiceCreateInput;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev190531.service.list.Services;