X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=networkmodel%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Ftransportpce%2Fnetworkmodel%2Fservice%2FNetworkModelServiceImpl.java;h=fb8059c2ff3ed08225ebe2dd24f4d80fe4bd415a;hb=73478a3a5354a2a557520fec6314532bf0ad6a29;hp=66e5460d1936f8150104e17c68b8ae29da813212;hpb=e999f1d6d03d98e48ac7d47554699ec270bdf33f;p=transportpce.git 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..fb8059c2f 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,13 +33,20 @@ 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.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; +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.rev210426.OpenroadmNodeVersion; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.mapping.Mapping; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.network.nodes.NodeInfo; import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.NodeTypes; import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.Link1; import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev200529.TerminationPoint1; -import org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.OtnLinkType; +import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210618.link.tp.LinkTp; +import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210618.link.tp.LinkTpBuilder; +import org.opendaylight.yang.gen.v1.http.transportpce.topology.rev210511.OtnLinkType; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId; @@ -70,6 +78,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 +92,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 +269,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 +321,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 +362,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); } @@ -478,10 +516,24 @@ public class NetworkModelServiceImpl implements NetworkModelService { } @Override - public void updateOtnLinks(List nodeTps, String serviceRate, Short tribPortNb, Short tribSoltNb, - boolean isDeletion) { - List supportedOdu4Links = getSupportingOdu4Links(nodeTps); - List tps = getOtnNodeTps(nodeTps); + public void updateOtnLinks( + org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210618.renderer.rpc.result.sp.Link + notifLink, Uint32 serviceRate, Short tribPortNb, Short tribSoltNb, boolean isDeletion) { + + LinkTp atermination = new LinkTpBuilder() + .setNodeId(notifLink.getATermination().getNodeId()) + .setTpId(notifLink.getATermination().getTpId()) + .build(); + LinkTp ztermination = new LinkTpBuilder() + .setNodeId(notifLink.getZTermination().getNodeId()) + .setTpId(notifLink.getZTermination().getTpId()) + .build(); + List linkTerminations = new ArrayList<>(); + linkTerminations.add(atermination); + linkTerminations.add(ztermination); + + List supportedOdu4Links = getSupportingOdu4Links(linkTerminations); + List tps = getOtnNodeTps(linkTerminations); TopologyShard otnTopologyShard; otnTopologyShard = OpenRoadmOtnTopology.updateOtnLinks(supportedOdu4Links, tps, serviceRate, tribPortNb, tribSoltNb, isDeletion); @@ -612,11 +664,12 @@ public class NetworkModelServiceImpl implements NetworkModelService { return tps; } - private List getOtnNodeTps(List nodeTopoTps) { + private List getOtnNodeTps(List linkTerminations) { List tps = new ArrayList<>(); - for (String str : nodeTopoTps) { - String nodeId = str.split("--")[0]; - String tp = str.split("--")[1]; + for (LinkTp linkTp : linkTerminations) { + String tp = linkTp.getTpId(); + String nodeId = new StringBuilder(linkTp.getNodeId()).append("-") + .append(tp.split("-")[0]).toString(); InstanceIdentifier iiTp = InstanceIdentifier.builder(Networks.class) .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OTN_NETWORK_ID))) .child(Node.class, new NodeKey(new NodeId(nodeId))) @@ -664,7 +717,7 @@ public class NetworkModelServiceImpl implements NetworkModelService { } } - private List getSupportingOdu4Links(List nodesTopoTps) { + private List getSupportingOdu4Links(List nodesTopoTps) { InstanceIdentifier iiOtnTopologyLinks = InstanceIdentifier.builder(Networks.class) .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OTN_NETWORK_ID))) .augmentation(Network1.class) @@ -689,21 +742,19 @@ public class NetworkModelServiceImpl implements NetworkModelService { } List links = new ArrayList<>(); if (odu4links != null) { - for (String str : nodesTopoTps) { - String[] nodeAndTp = str.split("--"); - if (nodeAndTp.length >= 2) { - String nodeId = nodeAndTp[0]; - String tp = nodeAndTp[1]; - Link slink = odu4links.stream().filter(lk -> lk.getSource().getSourceNode().getValue() - .equals(nodeId) && lk.getSource().getSourceTp().toString().equals(tp)).findFirst().get(); - if (!links.contains(slink)) { - links.add(slink); - } - Link dlink = odu4links.stream().filter(lk -> lk.getDestination().getDestNode().getValue() - .equals(nodeId) && lk.getDestination().getDestTp().toString().equals(tp)).findFirst().get(); - if (!links.contains(dlink)) { - links.add(dlink); - } + for (LinkTp linkTp : nodesTopoTps) { + String tp = linkTp.getTpId(); + String nodeId = new StringBuilder(linkTp.getNodeId()).append("-") + .append(tp.split("-")[0]).toString(); + Link slink = odu4links.stream().filter(lk -> lk.getSource().getSourceNode().getValue() + .equals(nodeId) && lk.getSource().getSourceTp().toString().equals(tp)).findFirst().get(); + if (!links.contains(slink)) { + links.add(slink); + } + Link dlink = odu4links.stream().filter(lk -> lk.getDestination().getDestNode().getValue() + .equals(nodeId) && lk.getDestination().getDestTp().toString().equals(tp)).findFirst().get(); + if (!links.contains(dlink)) { + links.add(dlink); } } LOG.debug("odu4links = {}", links.toString()); @@ -740,4 +791,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()); + } + } }