Use version 13.1.0 of openroadm-service models
[transportpce.git] / servicehandler / src / main / java / org / opendaylight / transportpce / servicehandler / listeners / NetworkModelListenerImpl.java
index 6a87f56199bf88d6a08438a9ac7253e7ea8b2b42..1aace331bbcf72b5b91f72ef417560fe39ab9eb5 100644 (file)
@@ -23,37 +23,41 @@ import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkmo
 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.service.rev211210.service.list.Services;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.AToZDirection;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.AToZDirectionBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ZToADirection;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ZToADirectionBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZ;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZKey;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ztoa.direction.ZToA;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ztoa.direction.ZToABuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ztoa.direction.ZToAKey;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.Resource;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.ResourceBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.resource.resource.TerminationPoint;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.Services;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.AToZDirection;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.AToZDirectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ZToADirection;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ZToADirectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZ;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZKey;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ztoa.direction.ZToA;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ztoa.direction.ZToABuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ztoa.direction.ZToAKey;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.Resource;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.ResourceBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.resource.resource.Link;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.resource.resource.TerminationPoint;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.path.PathDescription;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.path.PathDescriptionBuilder;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.ServicePathList;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.service.path.list.ServicePaths;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class NetworkModelListenerImpl implements TransportpceNetworkmodelListener {
+@Component
+public class NetworkModelListenerImpl implements TransportpceNetworkmodelListener, NetworkListener {
 
     private static final Logger LOG = LoggerFactory.getLogger(NetworkModelListenerImpl.class);
-    private final NotificationPublishService notificationPublishService; // to be used for T-API notification
     private ServiceDataStoreOperations serviceDataStoreOperations;
     private TopologyUpdateResult topologyUpdateResult;
 
-    public NetworkModelListenerImpl(NotificationPublishService notificationPublishService,
-                                    ServiceDataStoreOperations serviceDataStoreOperations) {
-        this.notificationPublishService = notificationPublishService;
+    @Activate
+    public NetworkModelListenerImpl(@Reference NotificationPublishService notificationPublishService,
+            @Reference ServiceDataStoreOperations serviceDataStoreOperations) {
         this.serviceDataStoreOperations = serviceDataStoreOperations;
     }
 
@@ -64,8 +68,9 @@ public class NetworkModelListenerImpl implements TransportpceNetworkmodelListene
             LOG.warn("TopologyUpdateResult already wired !");
             return;
         }
-        topologyUpdateResult = new TopologyUpdateResultBuilder().setTopologyChanges(
-                new HashMap<>(notification.getTopologyChanges())).build();
+        topologyUpdateResult = new TopologyUpdateResultBuilder()
+                .setTopologyChanges(new HashMap<>(notification.getTopologyChanges()))
+                .build();
         // Update service datastore and service path description
         updateServicePaths(notification);
     }
@@ -82,7 +87,7 @@ public class NetworkModelListenerImpl implements TransportpceNetworkmodelListene
             LOG.warn("Enable to retrieve service path list");
             return;
         }
-        ServicePathList servicePathList = servicePathListOptional.get();
+        ServicePathList servicePathList = servicePathListOptional.orElseThrow();
         for (ServicePaths servicePaths : servicePathList.getServicePaths().values()) {
             String serviceName = servicePaths.getServicePathName();
             PathDescription pathDescription = servicePaths.getPathDescription();
@@ -102,45 +107,40 @@ public class NetworkModelListenerImpl implements TransportpceNetworkmodelListene
                 LOG.error("Couldn't retrieve service");
                 continue;
             }
-            Services services = serviceOptional.get();
-            OperationResult operationResult1 = null;
+            Services services = serviceOptional.orElseThrow();
+            State newState;
             switch (services.getOperationalState()) {
                 case InService:
-                    if (!allElementsinPathinService(updatedAtoZ, updatedZtoA)) {
-                        LOG.debug("Service={} needs to be updated to outOfService", serviceName);
-                        //if (operationResult1 != null && operationResult1.isSuccess()) {
-                        //null check probably no more needed
-                        if (this.serviceDataStoreOperations
-                                .modifyService(serviceName, State.OutOfService, services.getAdministrativeState())
-                                .isSuccess()) {
-                            LOG.info("Service state of {} correctly updated to outOfService in datastore", serviceName);
-                            continue;
-                        } else {
-                            LOG.error("Service state of {} cannot be updated to outOfService in datastore",
-                                serviceName);
-                        }
+                    if (allElementsinPathinService(updatedAtoZ, updatedZtoA)) {
+                        LOG.debug("Service {} state does not need to be modified", serviceName);
+                        continue;
                     }
+                    newState = State.OutOfService;
                     break;
                 case OutOfService:
-                    if (allElementsinPathinService(updatedAtoZ, updatedZtoA)) {
-                        LOG.debug("Service={} needs to be updated to inService", serviceName);
-                        //if (operationResult1 != null && operationResult1.isSuccess()) {
-                        //null check probably no more needed
-                        if (this.serviceDataStoreOperations
-                                .modifyService(serviceName, State.InService, services.getAdministrativeState())
-                                .isSuccess()) {
-                            LOG.info("Service state of {} correctly updated to inService in datastore", serviceName);
-                            continue;
-                        } else {
-                            LOG.error("Service state of {} cannot be updated to inService in datastore", serviceName);
-                        }
+                    if (!allElementsinPathinService(updatedAtoZ, updatedZtoA)) {
+                        LOG.debug("Service {} state does not need to be modified", serviceName);
+                        continue;
                     }
+                    newState = State.InService;
                     break;
                 default:
                     LOG.warn("Service {} state not managed", serviceName);
                     continue;
             }
-            LOG.debug("Service {} state does not need to be modified", serviceName);
+
+
+            LOG.debug("Service={} needs to be updated to {}", serviceName, newState);
+            //if (operationResult1 != null && operationResult1.isSuccess()) {
+            //null check probably no more needed
+            if (this.serviceDataStoreOperations
+                    .modifyService(serviceName, newState, services.getAdministrativeState())
+                    .isSuccess()) {
+                LOG.info("Service state of {} correctly updated to {} in datastore", serviceName, newState);
+                continue;
+            }
+            LOG.error("Service state of {} cannot be updated to {} in datastore", serviceName, newState);
+
         }
     }
 
@@ -150,6 +150,9 @@ public class NetworkModelListenerImpl implements TransportpceNetworkmodelListene
         List<ZToA> tpResources = pathDescription.getZToADirection().getZToA().values().stream()
                 .filter(ele -> ele.getResource().getResource() instanceof TerminationPoint)
                 .collect(Collectors.toList());
+        List<ZToA> linkResources = pathDescription.getZToADirection().getZToA().values().stream()
+            .filter(ele -> ele.getResource().getResource() instanceof Link)
+            .collect(Collectors.toList());
         for (ZToA ztoA : tpResources) {
             String ztoAid = ztoA.getId();
             State ztoAState = ztoA.getResource().getState();
@@ -169,6 +172,21 @@ public class NetworkModelListenerImpl implements TransportpceNetworkmodelListene
                     .setResource(updatedResource)
                     .build();
                 newztoaMap.put(updatedZToA.key(), updatedZToA);
+                for (ZToA ztoALink : linkResources) {
+                    Link link = (Link)ztoALink.getResource().getResource();
+                    if (link.getLinkId().contains(tp.getTpNodeId())
+                            && link.getLinkId().contains(tp.getTpId())
+                            && ztoALink.getResource().getState() != updatedState) {
+                        ZToA updatedZToAlink = new ZToABuilder(ztoALink)
+                            .setId(ztoAid)
+                            .setResource(new ResourceBuilder()
+                                .setResource(link)
+                                .setState(updatedState)
+                                .build())
+                            .build();
+                        newztoaMap.put(updatedZToAlink.key(), updatedZToAlink);
+                    }
+                }
             }
         }
         return newztoaMap;
@@ -181,6 +199,9 @@ public class NetworkModelListenerImpl implements TransportpceNetworkmodelListene
         List<AToZ> tpResources = pathDescription.getAToZDirection().getAToZ().values().stream()
             .filter(ele -> ele.getResource().getResource() instanceof TerminationPoint)
             .collect(Collectors.toList());
+        List<AToZ> linkResources = pathDescription.getAToZDirection().getAToZ().values().stream()
+            .filter(ele -> ele.getResource().getResource() instanceof Link)
+            .collect(Collectors.toList());
         for (AToZ atoZ : tpResources) {
             String atoZid = atoZ.getId();
             State atoZState = atoZ.getResource().getState();
@@ -200,6 +221,21 @@ public class NetworkModelListenerImpl implements TransportpceNetworkmodelListene
                     .setResource(updatedResource)
                     .build();
                 newatozMap.put(updatedAToZ.key(), updatedAToZ);
+                for (AToZ atozLink : linkResources) {
+                    Link link = (Link)atozLink.getResource().getResource();
+                    if (link.getLinkId().contains(tp.getTpNodeId())
+                            && link.getLinkId().contains(tp.getTpId())
+                            && atozLink.getResource().getState() != updatedState) {
+                        AToZ updatedAToZlink = new AToZBuilder(atozLink)
+                            .setId(atoZid)
+                            .setResource(new ResourceBuilder()
+                                .setResource(link)
+                                .setState(updatedState)
+                                .build())
+                            .build();
+                        newatozMap.put(updatedAToZlink.key(), updatedAToZlink);
+                    }
+                }
             }
         }
         return newatozMap;
@@ -236,10 +272,11 @@ public class NetworkModelListenerImpl implements TransportpceNetworkmodelListene
     }
 
     private boolean compareTopologyUpdateResult(TopologyUpdateResult notification) {
-        return topologyUpdateResult != null && topologyUpdateResult.getTopologyChanges()
-                .equals(notification.getTopologyChanges());
+        return topologyUpdateResult != null
+                && topologyUpdateResult.getTopologyChanges().equals(notification.getTopologyChanges());
     }
 
+    @Override
     public void setserviceDataStoreOperations(ServiceDataStoreOperations serviceData) {
         this.serviceDataStoreOperations = serviceData;
     }