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.TopologyUpdateResultBuilder;
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.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.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.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;
+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;
}
@Override
public void onTopologyUpdateResult(TopologyUpdateResult notification) {
- LOG.debug("Topology update notification: {}", notification.toString());
+ LOG.debug("Topology update notification: {}", notification);
if (compareTopologyUpdateResult(notification)) {
LOG.warn("TopologyUpdateResult already wired !");
return;
}
- topologyUpdateResult = notification;
+ topologyUpdateResult = new TopologyUpdateResultBuilder()
+ .setTopologyChanges(new HashMap<>(notification.getTopologyChanges()))
+ .build();
// Update service datastore and service path description
updateServicePaths(notification);
}
* Process topology update result.
* @param notification the result notification.
*/
- private void updateServicePaths(TopologyUpdateResult notification) {
+ protected void updateServicePaths(TopologyUpdateResult notification) {
@Nullable
Map<TopologyChangesKey, TopologyChanges> topologyChanges = notification.getTopologyChanges();
Optional<ServicePathList> servicePathListOptional = this.serviceDataStoreOperations.getServicePaths();
- ServicePathList servicePathList = null;
- if (!servicePathListOptional.isPresent()) {
+ if (servicePathListOptional.isEmpty()) {
LOG.warn("Enable to retrieve service path list");
return;
}
- servicePathList = servicePathListOptional.get();
+ ServicePathList servicePathList = servicePathListOptional.orElseThrow();
for (ServicePaths servicePaths : servicePathList.getServicePaths().values()) {
String serviceName = servicePaths.getServicePathName();
PathDescription pathDescription = servicePaths.getPathDescription();
// update service in the datastore. Only path description with all elements in service can have a service
// in service. Therefore we check if all the states of the path description resources are inService
Optional<Services> serviceOptional = this.serviceDataStoreOperations.getService(serviceName);
- Services services = null;
- if (!serviceOptional.isPresent()) {
+ if (serviceOptional.isEmpty()) {
LOG.error("Couldn't retrieve service");
continue;
}
- services = serviceOptional.get();
- OperationResult operationResult1 = null;
- 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 (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.debug("Service {} state doesnt need to be modified", serviceName);
+ Services services = serviceOptional.orElseThrow();
+ State newState;
+ switch (services.getOperationalState()) {
+ case InService:
+ 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 {} state does not need to be modified", serviceName);
+ continue;
+ }
+ newState = State.InService;
+ break;
+ default:
+ LOG.warn("Service {} state not managed", serviceName);
+ continue;
}
- if (operationResult1 != null && operationResult1.isSuccess()) {
- LOG.info("Service state of {} correctly updated in datastore", 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);
+
}
}
- private Map<ZToAKey, ZToA> changePathElementStateZA(Map<TopologyChangesKey, TopologyChanges> topologyChanges,
+ protected 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"))
+ .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();
.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;
}
- private Map<AToZKey, AToZ> changePathElementStateAZ(Map<TopologyChangesKey,
+ protected 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"))
+ .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();
.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;
.build();
}
- private boolean allElementsinPathinService(Map<AToZKey, AToZ> updatedAtoZ, Map<ZToAKey, ZToA> updatedZtoA) {
+ protected boolean allElementsinPathinService(Map<AToZKey, AToZ> updatedAtoZ, Map<ZToAKey, ZToA> updatedZtoA) {
boolean allEleminService = true;
Iterator<AToZ> i1 = updatedAtoZ.values().iterator();
Iterator<ZToA> i2 = updatedZtoA.values().iterator();
}
private boolean compareTopologyUpdateResult(TopologyUpdateResult notification) {
- if (topologyUpdateResult == null) {
- return false;
- }
- if (topologyUpdateResult.getTopologyChanges().values()
- .equals(notification.getTopologyChanges().values())) {
- return false;
- }
- return true;
+ return topologyUpdateResult != null
+ && topologyUpdateResult.getTopologyChanges().equals(notification.getTopologyChanges());
}
+ @Override
public void setserviceDataStoreOperations(ServiceDataStoreOperations serviceData) {
this.serviceDataStoreOperations = serviceData;
}