From ff9991f6b14ebf5e40062f3082aec2bf8b95e67a Mon Sep 17 00:00:00 2001 From: Gilles Thouenon Date: Thu, 18 Mar 2021 11:55:48 +0100 Subject: [PATCH] Refactor network topologies listener of SH - 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 Change-Id: I9ebe45902fcbf550a0b9452cfa957225d2abfb1a --- ...-common-ord-topology-types@2020-11-16.yang | 61 ---- .../transportpce-networkmodel@2020-11-16.yang | 47 ++- .../service/NetworkModelServiceImpl.java | 54 ++++ .../listeners/NetworkModelListenerImpl.java | 290 ++++++------------ .../listeners/RendererListenerImpl.java | 4 +- .../service/ServiceDataStoreOperations.java | 4 +- .../ServiceDataStoreOperationsImpl.java | 37 ++- .../ServiceDataStoreOperationsImplTest.java | 4 +- 8 files changed, 195 insertions(+), 306 deletions(-) delete mode 100644 api/src/main/yang/service_path/transportpce-common-ord-topology-types@2020-11-16.yang 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 index c87f4eae1..000000000 --- a/api/src/main/yang/service_path/transportpce-common-ord-topology-types@2020-11-16.yang +++ /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 diff --git a/api/src/main/yang/service_path/transportpce-networkmodel@2020-11-16.yang b/api/src/main/yang/service_path/transportpce-networkmodel@2020-11-16.yang index de06306cc..3f725124e 100644 --- a/api/src/main/yang/service_path/transportpce-networkmodel@2020-11-16.yang +++ b/api/src/main/yang/service_path/transportpce-networkmodel@2020-11-16.yang @@ -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 diff --git a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelServiceImpl.java b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelServiceImpl.java index 66e5460d1..ea386f363 100644 --- a/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelServiceImpl.java +++ b/networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelServiceImpl.java @@ -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 topologyShardMountedDevice; private Map otnTopologyShardMountedDevice; + // Variables for creating and sending topology update notification + private final NotificationPublishService notificationPublishService; + private Map 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(); this.otnTopologyShardMountedDevice = new HashMap(); + this.notificationPublishService = notificationPublishService; + this.topologyChanges = new HashMap(); } 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 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()); + } + } } diff --git a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/listeners/NetworkModelListenerImpl.java b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/listeners/NetworkModelListenerImpl.java index be0eb888d..a9a9f0299 100644 --- a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/listeners/NetworkModelListenerImpl.java +++ b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/listeners/NetworkModelListenerImpl.java @@ -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 ordTopologyChanges = notification.getOrdTopologyChanges(); + @Nullable + Map topologyChanges = notification.getTopologyChanges(); Optional 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 updatedAtoZ = changePathElementStateAZ(ordTopologyChanges, pathDescription); - Map updatedZtoA = changePathElementStateZA(ordTopologyChanges, pathDescription); + Map updatedAtoZ = changePathElementStateAZ(topologyChanges, pathDescription); + Map 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 changePathElementStateZA(Map ordTopologyChanges, PathDescription pathDescription) { - Map ztoaMap = pathDescription.getZToADirection().getZToA(); - // Needed as ztoaMap is immutable - Map newztoaMap = new HashMap(); - 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 changePathElementStateZA(Map topologyChanges, + PathDescription pathDescription) { + + Map newztoaMap = new HashMap<>(pathDescription.getZToADirection().getZToA()); + List 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 changePathElementStateAZ(Map ordTopologyChanges, PathDescription pathDescription) { - Map atozMap = pathDescription.getAToZDirection().getAToZ(); - // Needed as atozMap is immutable - Map newatozMap = new HashMap(); - 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 changePathElementStateAZ(Map topologyChanges, PathDescription pathDescription) { + + Map newatozMap = new HashMap<>(pathDescription.getAToZDirection().getAToZ()); + List 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 updatedAtoZ, Map 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 updatedAtoZ, Map 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; diff --git a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/listeners/RendererListenerImpl.java b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/listeners/RendererListenerImpl.java index 38a054917..9a420e14e 100644 --- a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/listeners/RendererListenerImpl.java +++ b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/listeners/RendererListenerImpl.java @@ -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; diff --git a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/service/ServiceDataStoreOperations.java b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/service/ServiceDataStoreOperations.java index 3d6966d7c..d84cf2345 100644 --- a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/service/ServiceDataStoreOperations.java +++ b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/service/ServiceDataStoreOperations.java @@ -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; diff --git a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/service/ServiceDataStoreOperationsImpl.java b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/service/ServiceDataStoreOperationsImpl.java index e88436fde..c9a499083 100644 --- a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/service/ServiceDataStoreOperationsImpl.java +++ b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/service/ServiceDataStoreOperationsImpl.java @@ -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 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()); + } } diff --git a/servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/service/ServiceDataStoreOperationsImplTest.java b/servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/service/ServiceDataStoreOperationsImplTest.java index 9b4848c24..cca4bc4a8 100644 --- a/servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/service/ServiceDataStoreOperationsImplTest.java +++ b/servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/service/ServiceDataStoreOperationsImplTest.java @@ -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; -- 2.36.6