Fix few code issues
[transportpce.git] / pce / src / main / java / org / opendaylight / transportpce / pce / gnpy / GnpyTopoImpl.java
index f0f55dca73a8f10c8df7d6fc698114f9e9062a38..abdcb703801eff7f0d6571f09edd7c4cf663dddd 100644 (file)
@@ -10,50 +10,48 @@ package org.opendaylight.transportpce.pce.gnpy;
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ExecutionException;
-import java.util.regex.Pattern;
 import java.util.stream.IntStream;
-
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.NetworkUtils;
 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.Coordinate;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.Km;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.edfa.params.Operational;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.edfa.params.OperationalBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.element.type.choice.element.type.Edfa;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.element.type.choice.element.type.EdfaBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.element.type.choice.element.type.FiberRoadmBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.element.type.choice.element.type.Transceiver;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.element.type.choice.element.type.TransceiverBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.element.type.choice.element.type.fiberroadm.Params;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.element.type.choice.element.type.fiberroadm.ParamsBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.element.type.choice.element.type.fiberroadm.params.fiberroadm.Fiber;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.element.type.choice.element.type.fiberroadm.params.fiberroadm.FiberBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.element.type.choice.element.type.fiberroadm.params.fiberroadm.Roadm;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.element.type.choice.element.type.fiberroadm.params.fiberroadm.RoadmBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.location.attributes.Location;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.location.attributes.LocationBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.topo.Connections;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.topo.ConnectionsBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.topo.Elements;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.topo.ElementsBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.topo.elements.Metadata;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.topo.elements.MetadataBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Link1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev181130.SpanAttributes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev181130.amplified.link.attributes.AmplifiedLink;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev181130.amplified.link.attributes.amplified.link.section.element.section.element.Span;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev181130.amplified.link.attributes.amplified.link.section.element.section.element.ila.Ila;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev181130.span.attributes.LinkConcatenation;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.rev181130.Node1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130.networks.network.link.OMSAttributes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev181130.OpenroadmLinkType;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.Coordinate;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.Km;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.edfa.params.Operational;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.edfa.params.OperationalBuilder;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.element.type.choice.element.type.Edfa;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.element.type.choice.element.type.EdfaBuilder;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.element.type.choice.element.type.FiberRoadmBuilder;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.element.type.choice.element.type.Transceiver;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.element.type.choice.element.type.TransceiverBuilder;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.element.type.choice.element.type.fiberroadm.Params;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.element.type.choice.element.type.fiberroadm.ParamsBuilder;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.element.type.choice.element.type.fiberroadm.params.fiberroadmfused.Fiber;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.element.type.choice.element.type.fiberroadm.params.fiberroadmfused.FiberBuilder;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.element.type.choice.element.type.fiberroadm.params.fiberroadmfused.Roadm;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.element.type.choice.element.type.fiberroadm.params.fiberroadmfused.RoadmBuilder;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.location.attributes.Location;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.location.attributes.LocationBuilder;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.topo.Connections;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.topo.ConnectionsBuilder;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.topo.Elements;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.topo.ElementsBuilder;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.topo.ElementsKey;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.topo.elements.Metadata;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.topo.elements.MetadataBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.SpanAttributes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.amplified.link.attributes.AmplifiedLink;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.amplified.link.attributes.amplified.link.section.element.section.element.Span;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.amplified.link.attributes.amplified.link.section.element.section.element.ila.Ila;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.rev211210.Node1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.link.OMSAttributes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmLinkType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.link.concatenation.LinkConcatenation;
 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.networks.Network;
@@ -77,24 +75,16 @@ public class GnpyTopoImpl {
     private static final Logger LOG = LoggerFactory.getLogger(GnpyTopoImpl.class);
     private final NetworkTransactionService networkTransactionService;
     //List of elements
-    private List<Elements> elements = new ArrayList<>();
+    private Map<ElementsKey, Elements> elements = new HashMap<>();
     private List<Connections> connections = new ArrayList<>();
+    private List<String> elementsList = new ArrayList<>();
     //Mapping elements
     //Mapping between the ord-topo and ord-ntw node
-    private Map<String, String> mapDisgNodeRefNode = new HashMap<String, String>();
-    //Mapping between the ord-ntw and node ip
-    private Map<String, IpAddress> mapNodeRefIp = new HashMap<String, IpAddress>();
+    private Map<String, String> mapDisgNodeRefNode = new HashMap<>();
     //Mapping between the ROADM-ROADM linkId/secElement and the linkId
-    private Map<String, List<String>> mapLinkFiber = new HashMap<String, List<String>>();
-    //Mapping between the ROADM-ROADM linkId/secElement and ipAddress
-    private Map<String, IpAddress> mapFiberIp = new HashMap<String, IpAddress>();
+    private Map<String, List<String>> mapLinkFiber = new HashMap<>();
     //List of Xponders
     private List<String> trxList = new ArrayList<>();
-    //Initialize the 32 bit identifiers for the edfa and the fiber.
-    //These 32-bit identifiers are not ipv4 addresses (despite having ipv4Adresses format, dotted-decimal notation).
-    //They are imposed by the GNPy yang model to identify network elements and not used for any routing purposes.
-    private Ipv4Address edfaId;
-    private Ipv4Address fiberId;
     private static final double LATITUDE = 0;
     private static final double LONGITUTE = 0;
     private static final String REGION = "N/A";
@@ -107,20 +97,11 @@ public class GnpyTopoImpl {
      */
     public GnpyTopoImpl(final NetworkTransactionService networkTransactionService) throws GnpyException {
         this.networkTransactionService = networkTransactionService;
-        //32-bit identifier for the fiber. The dotted decimal notation has the format 243.x.x.x (0<=x<=255)
-        fiberId = new Ipv4Address("243.0.0.1");
-        //32-bit identifier for the edfa. The dotted decimal notation has the format 244.x.x.x (0<=x<=255)
-        edfaId = new Ipv4Address("244.0.0.1");
-        try {
-            extractTopo();
-        } catch (NullPointerException e) {
-            throw new GnpyException("In GnpyTopoImpl: one of the elements is null",e);
-        }
+        extractTopo();
     }
 
     /*
-     * extract the topology: all the elements have ipAddress as uid and maintain
-     * a mapping structure to map between the nodeId and the ipAddress (uid)
+     * extract the topology
      *
      */
     private void extractTopo() throws GnpyException {
@@ -141,7 +122,7 @@ public class GnpyTopoImpl {
                     .read(LogicalDatastoreType.CONFIGURATION, insIdrOpenRoadmNet).get();
             if (openRoadmNet.isPresent() && openRoadmTopo.isPresent()) {
                 extractElements(openRoadmTopo,openRoadmNet);
-                extractConnections(openRoadmTopo,openRoadmNet);
+                extractConnections(openRoadmTopo);
                 LOG.debug("In GnpyTopoImpl : elements and connections are well extracted");
             }
             else {
@@ -157,10 +138,12 @@ public class GnpyTopoImpl {
 
     private void extractElements(java.util.Optional<Network> openRoadmTopo,
             java.util.Optional<Network> openRoadmNet) throws GnpyException {
+        if ((!openRoadmNet.isPresent()) || (!openRoadmTopo.isPresent())) {
+            throw new GnpyException("In gnpyTopoImpl: openRoadmNet or openRoadmTopo is not present");
+        }
         // Create the list of nodes
-        List<Node> openRoadmNetNodeList = openRoadmNet.get().getNode();
-        List<Node> openRoadmTopoNodeList = openRoadmTopo.get().getNode();
-        List<String> nodesList = new ArrayList<>();
+        Collection<Node> openRoadmNetNodeList = openRoadmNet.get().nonnullNode().values();
+        Collection<Node> openRoadmTopoNodeList = openRoadmTopo.get().nonnullNode().values();
 
         if (openRoadmTopoNodeList.isEmpty() || openRoadmNetNodeList.isEmpty()) {
             throw new GnpyException("In gnpyTopoImpl: no nodes in the openradm topology or openroadm network");
@@ -168,39 +151,45 @@ public class GnpyTopoImpl {
         // Create elements
         for (Node openRoadmTopoNode : openRoadmTopoNodeList) {
             // Retrieve the supporting node and the type of the node in openRoadm network
-            List<SupportingNode> supportingNodeList = openRoadmTopoNode.getSupportingNode();
+            Collection<SupportingNode> supportingNodeList = openRoadmTopoNode.nonnullSupportingNode().values();
+
             for (SupportingNode supportingNode : supportingNodeList) {
-                IpAddress ipAddress = null;
+                if (!supportingNode.getNetworkRef().getValue().equals("openroadm-network")) {
+                    continue;
+                }
                 String nodeRef = supportingNode.getNodeRef().getValue();
+                if (nodeRef == null) {
+                    throw new GnpyException("In gnpyTopoImpl: nodeRef is null");
+                }
                 // Retrieve the mapping between the openRoadm topology and openRoadm network
                 mapDisgNodeRefNode.put(openRoadmTopoNode.getNodeId().getValue(), nodeRef);
                 Node1 openRoadmNetNode1 = null;
-                org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130
+                org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210
                     .Node1 commonNetworkNode1 = null;
                 for (Node openRoadmNetNode : openRoadmNetNodeList) {
                     if (openRoadmNetNode.getNodeId().getValue().equals(nodeRef)) {
                         openRoadmNetNode1 = openRoadmNetNode.augmentation(Node1.class);
                         commonNetworkNode1 = openRoadmNetNode.augmentation(org.opendaylight.yang.gen.v1
-                            .http.org.openroadm.common.network.rev181130.Node1.class);
-                        ipAddress = openRoadmNetNode1.getIp();
-                        mapNodeRefIp.put(nodeRef, ipAddress);
+                            .http.org.openroadm.common.network.rev211210.Node1.class);
                         break;
                     }
                 }
+                if (commonNetworkNode1 == null) {
+                    throw new GnpyException(String.format("In gnpyTopoImpl: the node type of %s is null",nodeRef));
+                }
                 if (commonNetworkNode1.getNodeType().getName().equals("ROADM")) {
-                    if (!nodesList.contains(nodeRef)) {
+                    if (!elementsList.contains(nodeRef)) {
                         Elements element = createElementsRoadm(LATITUDE, LONGITUTE, nodeRef,
-                                openRoadmNetNode1.getShelf(),TARGET_PCH_OUT_DB, ipAddress.getIpv4Address().getValue()
-                                .toString());
-                        this.elements.add(element);
-                        nodesList.add(nodeRef);
+                                openRoadmNetNode1.getShelf(),TARGET_PCH_OUT_DB, nodeRef);
+                        this.elements.put(element.key(),element);
+                        elementsList.add(nodeRef);
                     }
                 } else if (commonNetworkNode1.getNodeType().getName().equals("XPONDER")) {
-                    if (!nodesList.contains(nodeRef)) {
+                    if (!elementsList.contains(nodeRef)) {
                         Elements element = createElementsTransceiver(LATITUDE, LONGITUTE, nodeRef,
-                                openRoadmNetNode1.getShelf(),ipAddress.getIpv4Address().getValue().toString());
-                        this.elements.add(element);
-                        nodesList.add(nodeRef);
+                                openRoadmNetNode1.getShelf(), nodeRef);
+                        this.elements.put(element.key(),element);
+                        elementsList.add(nodeRef);
                         trxList.add(nodeRef);
                     }
                 } else {
@@ -210,11 +199,13 @@ public class GnpyTopoImpl {
         }
     }
 
-    private void extractConnections(java.util.Optional<Network> openRoadmTopo,
-            java.util.Optional<Network> openRoadmNet) throws GnpyException {
+    private void extractConnections(java.util.Optional<Network> openRoadmTopo) throws GnpyException {
         // Create the list of connections
+        if (!openRoadmTopo.isPresent()) {
+            throw new GnpyException("In gnpyTopoImpl: openroadmTopo is not present");
+        }
         Network1 nw1 = openRoadmTopo.get().augmentation(Network1.class);
-        List<Link> linksList = nw1.getLink();
+        Collection<Link> linksList = nw1.nonnullLink().values();
         // 1:EXPRESS-LINK    2:ADD-LINK       3:DROP-LINK
         // 4:ROADM-To-ROADM  5:XPONDER-INPUT  6:XPONDER-OUTPUT
         int[] externalLink = {OpenroadmLinkType.ROADMTOROADM.getIntValue(),OpenroadmLinkType.XPONDERINPUT.getIntValue(),
@@ -226,19 +217,20 @@ public class GnpyTopoImpl {
 
         for (Link link : linksList) {
             Link1 link1 = link.augmentation(Link1.class);
-            org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev181130
-                .Link1 openroadmNetworkLink1 = link.augmentation(org.opendaylight.yang.gen.v1.http.org
-                .openroadm.network.topology.rev181130.Link1.class);
+            org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210
+                .Link1 openroadmNetworkLink1 = link.augmentation(org.opendaylight.yang.gen.v1.http
+                        .org.openroadm.network.topology.rev211210.Link1.class);
+            if (link1.getLinkType() == null) {
+                throw new GnpyException("In gnpyTopoImpl: the link type is null");
+            }
             int linkType = link1.getLinkType().getIntValue();
             if (! IntStream.of(externalLink).anyMatch(x -> x == linkType)) {
                 continue;
             }
 
             String srcId = mapDisgNodeRefNode.get(link.getSource().getSourceNode().getValue());
-            IpAddress srcIp = mapNodeRefIp.get(srcId);
             String linkId = link.getLinkId().getValue();
             String destId = null;
-            IpAddress destIp = null;
             if (linkType == OpenroadmLinkType.ROADMTOROADM.getIntValue()) {
                 OMSAttributes omsAttributes = openroadmNetworkLink1.getOMSAttributes();
                 if (omsAttributes == null) {
@@ -247,100 +239,96 @@ public class GnpyTopoImpl {
                 }
                 //Case of amplified link
                 if (omsAttributes.getAmplifiedLink() != null) {
-                    srcIp = extractAmplifiedLink(omsAttributes, linkId, srcIp);
+                    srcId = extractAmplifiedLink(omsAttributes, linkId, srcId);
                 }
                 //Case of one span link
                 if (omsAttributes.getSpan() != null) {
-                    srcIp = extractSpanLink(omsAttributes, linkId, srcIp);
+                    srcId = extractSpanLink(omsAttributes, linkId, srcId);
                 }
             }
             // Create a new link
             destId = mapDisgNodeRefNode.get(link.getDestination().getDestNode().getValue());
-            destIp = mapNodeRefIp.get(destId);
-            createNewConnection(srcIp,destIp);
+            createNewConnection(srcId,destId);
         }
     }
 
-    private IpAddress extractAmplifiedLink(OMSAttributes omsAttributes, String linkId, IpAddress srcIp)
+    private String extractAmplifiedLink(OMSAttributes omsAttributes, String linkId, String srcId)
         throws GnpyException {
 
-        List<AmplifiedLink> amplifiedLinkList = omsAttributes.getAmplifiedLink()
-            .getAmplifiedLink();
-        IpAddress destIp = null;
+        List<AmplifiedLink> amplifiedLinkList = new ArrayList<>(omsAttributes.getAmplifiedLink()
+            .nonnullAmplifiedLink().values());
+        String destId = null;
         if (!amplifiedLinkList.isEmpty()) {
-            for (AmplifiedLink amplifiedLink : amplifiedLinkList) {
-                String secElt = amplifiedLink.getSectionEltNumber().toString();
+            for (AmplifiedLink amplifiedLink: amplifiedLinkList) {
+                String secElt = amplifiedLink .getSectionEltNumber().toString();
                 //Case of ILA
                 if (amplifiedLink.getSectionElement().getSectionElement() instanceof Ila) {
                     Ila ila = (Ila) amplifiedLink.getSectionElement().getSectionElement();
-                    destIp = extractILAFromAmpLink(ila);
+                    destId = extractILAFromAmpLink(ila);
                 }
                 //Case of Span
                 if (amplifiedLink.getSectionElement().getSectionElement() instanceof Span) {
                     Span span = (Span) amplifiedLink.getSectionElement().getSectionElement();
-                    destIp = extractSpan((SpanAttributes) span.getSpan(), linkId, secElt);
+                    destId = extractSpan(span.getSpan(), linkId, secElt);
                 }
                 // Create a new link
-                if (createNewConnection(srcIp,destIp)) {
-                    srcIp = destIp;
+                if (createNewConnection(srcId,destId)) {
+                    srcId = destId;
                 }
             }
         }
-        return srcIp;
+        return srcId;
     }
 
-    private IpAddress extractSpanLink(OMSAttributes omsAttributes, String linkId, IpAddress srcIp)
+    private String extractSpanLink(OMSAttributes omsAttributes, String linkId, String srcId)
         throws GnpyException {
 
         SpanAttributes span = omsAttributes.getSpan();
-        IpAddress destIp = extractSpan((SpanAttributes) span, linkId, linkId);
-        if (createNewConnection(srcIp, destIp)) {
-            return destIp;
+        String destId = extractSpan(span, linkId, linkId);
+        if (createNewConnection(srcId, destId)) {
+            return destId;
         }
-        return srcIp;
+        return srcId;
     }
 
-    private IpAddress extractILAFromAmpLink(Ila ila) throws GnpyException {
+    private String extractILAFromAmpLink(Ila ila) throws GnpyException {
         String nodeId = ila.getNodeId().getValue();
-        IpAddress ipEdfa = new IpAddress(edfaId);
-        edfaId = incrementIdentifier(edfaId);
         mapDisgNodeRefNode.put(nodeId, nodeId);
-        mapNodeRefIp.put(nodeId, ipEdfa);
         Elements element = createElementsEdfa(LATITUDE, LONGITUTE, REGION, CITY,
                 ila.getGain().getValue(), ila.getTilt().getValue(),
                 ila.getOutVoaAtt().getValue(), "std_medium_gain",
-                ipEdfa.getIpv4Address().getValue().toString());
-        this.elements.add(element);
-        return ipEdfa;
+                nodeId);
+        this.elements.put(element.key(),element);
+        return nodeId;
     }
 
-    private IpAddress extractSpan(SpanAttributes span, String linkId, String subLinkId) throws GnpyException {
-        IpAddress ipFiber = new IpAddress(fiberId);
-
+    private String extractSpan(SpanAttributes span, String linkId, String subLinkId) throws GnpyException {
         if (!mapLinkFiber.containsKey(linkId)) {
-            mapLinkFiber.put(linkId, new ArrayList<String>());
+            mapLinkFiber.put(linkId, new ArrayList<>());
         }
         mapLinkFiber.get(linkId).add(subLinkId);
-        mapFiberIp.put(subLinkId, ipFiber);
-        fiberId = incrementIdentifier(fiberId);
+        //mapFiberIp.put(subLinkId, ipFiber);
+        //fiberId = incrementIdentifier(fiberId);
         double attIn = 0;
         double connIn = 0;
         double connOut = 0;
         String typeVariety = "SSMF";
         double length = 0;
         // Compute the length of the link
-        List<LinkConcatenation> linkConcatenationList = span.getLinkConcatenation();
-        for (LinkConcatenation linkConcatenation : linkConcatenationList) {
-            double srlgLength = linkConcatenation.getSRLGLength();
+        for (LinkConcatenation linkConcatenation : span.nonnullLinkConcatenation().values()) {
+            double srlgLength = linkConcatenation.getSRLGLength().doubleValue();
             //convert to kilometer
             length += srlgLength / CONVERT_KM_M;
         }
+        if (length == 0) {
+            throw new GnpyException(String.format(
+                "In gnpyTopoImpl: length of the link %s is equal to zero",linkId));
+        }
         double lossCoef = span.getSpanlossCurrent().getValue().doubleValue() / length;
         Elements element = createElementsFiber(LATITUDE, LONGITUTE, REGION, CITY,
-            ipFiber.getIpv4Address().getValue(), length, attIn, lossCoef, connIn, connOut, typeVariety);
-        this.elements.add(element);
-        return ipFiber;
-
+                subLinkId, length, attIn, lossCoef, connIn, connOut, typeVariety);
+        this.elements.put(element.key(),element);
+        return subLinkId;
     }
 
     /*
@@ -349,20 +337,20 @@ public class GnpyTopoImpl {
     private Elements createElementsFiber(double latitude, double longitude, String region, String city, String uidFiber,
             double length, double attIn, double lossCoef, double connIn, double connOut, String typeVariety) {
         // Create an amplifier after the ROADM
-        Coordinate c1 = new Coordinate(new BigDecimal(latitude));
-        Coordinate c2 = new Coordinate(new BigDecimal(longitude));
+        Coordinate c1 = new Coordinate(BigDecimal.valueOf(latitude));
+        Coordinate c2 = new Coordinate(BigDecimal.valueOf(longitude));
         Location location1 = new LocationBuilder().setRegion(region).setCity(city).setLatitude(c1).setLongitude(c2)
                 .build();
         Metadata metadata1 = new MetadataBuilder().setLocation(location1).build();
-        Fiber fiber = new FiberBuilder().setLength(new BigDecimal(length)).setLengthUnits(Km.class)
-                .setAttIn(new BigDecimal(attIn)).setLossCoef(new BigDecimal(lossCoef)).setConIn(new BigDecimal(connIn))
-                .setConOut(new BigDecimal(connOut)).build();
-        Params params1 = new ParamsBuilder().setFiberroadm(fiber).build();
-        Elements element1 = new ElementsBuilder().setUid(uidFiber)
-                .setType(org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.Fiber.class)
+        Fiber fiber = new FiberBuilder().setLength(BigDecimal.valueOf(length)).setLengthUnits(Km.class)
+                .setAttIn(BigDecimal.valueOf(attIn)).setLossCoef(BigDecimal.valueOf(lossCoef))
+                .setConIn(BigDecimal.valueOf(connIn))
+                .setConOut(BigDecimal.valueOf(connOut)).build();
+        Params params1 = new ParamsBuilder().setFiberroadmfused(fiber).build();
+        return new ElementsBuilder().setUid(uidFiber)
+                .setType(org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.Fiber.class)
                 .setTypeVariety(typeVariety).setMetadata(metadata1)
                 .setElementType(new FiberRoadmBuilder().setParams(params1).build()).build();
-        return element1;
     }
 
     /*
@@ -371,8 +359,8 @@ public class GnpyTopoImpl {
     private Elements createElementsEdfa(double latitude, double longitude, String region, String city,
             BigDecimal gainTarget, BigDecimal tiltTarget, BigDecimal outVoa, String typeVariety, String uidEdfa) {
         // Create an amplifier after the ROADM
-        Coordinate c1 = new Coordinate(new BigDecimal(latitude));
-        Coordinate c2 = new Coordinate(new BigDecimal(longitude));
+        Coordinate c1 = new Coordinate(BigDecimal.valueOf(latitude));
+        Coordinate c2 = new Coordinate(BigDecimal.valueOf(longitude));
         Location location1 = new LocationBuilder().setRegion(region).setCity(city).setLatitude(c1).setLongitude(c2)
                 .build();
         Metadata metadata1 = new MetadataBuilder().setLocation(location1).build();
@@ -380,10 +368,9 @@ public class GnpyTopoImpl {
                 .setOutVoa(outVoa).build();
         Edfa edfa = new EdfaBuilder()
                 .setOperational(operational).build();
-        Elements element1 = new ElementsBuilder().setUid(uidEdfa)
-                .setType(org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.Edfa.class)
+        return new ElementsBuilder().setUid(uidEdfa)
+                .setType(org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.Edfa.class)
                 .setMetadata(metadata1).setElementType(edfa).setTypeVariety(typeVariety).build();
-        return element1;
     }
 
     /*
@@ -391,18 +378,16 @@ public class GnpyTopoImpl {
      */
     private Elements createElementsRoadm(double latitude, double longitude, String region, String city,
             double targetPchOutDb, String uidRoadm) {
-
-        Coordinate c1 = new Coordinate(new BigDecimal(latitude));
-        Coordinate c2 = new Coordinate(new BigDecimal(longitude));
+        Coordinate c1 = new Coordinate(BigDecimal.valueOf(latitude));
+        Coordinate c2 = new Coordinate(BigDecimal.valueOf(longitude));
         Location location1 = new LocationBuilder().setRegion(region).setCity(city).setLatitude(c1).setLongitude(c2)
                 .build();
         Metadata metadata1 = new MetadataBuilder().setLocation(location1).build();
-        Roadm roadm = new RoadmBuilder().setTargetPchOutDb(new BigDecimal(targetPchOutDb)).build();
-        Params params1 = new ParamsBuilder().setFiberroadm(roadm).build();
-        Elements element1 = new ElementsBuilder().setUid(uidRoadm)
-                .setType(org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.Roadm.class)
+        Roadm roadm = new RoadmBuilder().setTargetPchOutDb(BigDecimal.valueOf(targetPchOutDb)).build();
+        Params params1 = new ParamsBuilder().setFiberroadmfused(roadm).build();
+        return new ElementsBuilder().setUid(uidRoadm)
+                .setType(org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.Roadm.class)
                 .setMetadata(metadata1).setElementType(new FiberRoadmBuilder().setParams(params1).build()).build();
-        return element1;
     }
 
     /*
@@ -410,28 +395,25 @@ public class GnpyTopoImpl {
      */
     private Elements createElementsTransceiver(double latitude, double longitude, String region, String city,
             String uidTrans) {
-        Coordinate c1 = new Coordinate(new BigDecimal(latitude));
-        Coordinate c2 = new Coordinate(new BigDecimal(longitude));
+        Coordinate c1 = new Coordinate(BigDecimal.valueOf(latitude));
+        Coordinate c2 = new Coordinate(BigDecimal.valueOf(longitude));
         Location location1 = new LocationBuilder().setRegion(region).setCity(city).setLatitude(c1).setLongitude(c2)
                 .build();
         Metadata metadata1 = new MetadataBuilder().setLocation(location1).build();
         Transceiver transceiver = new TransceiverBuilder().build();
-        Elements element1 = new ElementsBuilder().setUid(uidTrans)
-                .setType(org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev181214.Transceiver.class)
+        return new ElementsBuilder().setUid(uidTrans)
+                .setType(org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.Transceiver.class)
                 .setMetadata(metadata1).setElementType(transceiver).build();
-        return element1;
     }
 
     /*
      * Method to create Connection
      */
-    private boolean createNewConnection(IpAddress srcIp, IpAddress destIp) throws GnpyException {
-        if (srcIp == null || destIp == null) {
+    private boolean createNewConnection(String fromNode, String toNode) throws GnpyException {
+        if (fromNode == null || toNode == null) {
             throw new GnpyException("create new connection : null node IpAddress");
         }
-        String fromNode = srcIp.getIpv4Address().getValue();
-        String toNode = destIp.getIpv4Address().getValue();
-        if (fromNode == toNode) {
+        if (fromNode.equals(toNode)) {
             return false;
         }
         Connections connection = new ConnectionsBuilder().setFromNode(fromNode).setToNode(toNode).build();
@@ -439,44 +421,11 @@ public class GnpyTopoImpl {
         return true;
     }
 
-    /*
-     * Increment 32-bit identifier
-     */
-    private Ipv4Address incrementIdentifier(Ipv4Address id)  throws GnpyException {
-        String ips = id.getValue();
-        String [] fields = ips.split(Pattern.quote("."));
-        int intF1 = Integer.parseInt(fields[1]);
-        int intF2 = Integer.parseInt(fields[2]);
-        int intF3 = Integer.parseInt(fields[3]);
-        if (intF3 < 255) {
-            intF3++;
-        } else {
-            if (intF2 < 255) {
-                intF2++;
-                intF3 = 0;
-            } else {
-                if (intF1 < 255) {
-                    intF1++;
-                    intF2 = 0;
-                    intF3 = 0;
-                } else {
-                    throw new GnpyException("GnpyTopoImpl : the topology is not supported by gnpy");
-                }
-                fields[1] = Integer.toString(intF1);
-            }
-            fields[2] = Integer.toString(intF2);
-        }
-        fields[3] = Integer.toString(intF3);
-        String nidString = fields[0] + "." + fields[1] + "." + fields[2] + "." + fields[3];
-        Ipv4Address nid = new Ipv4Address(nidString);
-        return nid;
-    }
-
-    public List<Elements> getElements() {
+    public Map<ElementsKey, Elements> getElements() {
         return elements;
     }
 
-    public void setElements(List<Elements> elements) {
+    public void setElements(Map<ElementsKey, Elements> elements) {
         this.elements = elements;
     }
 
@@ -488,20 +437,20 @@ public class GnpyTopoImpl {
         this.connections = connections;
     }
 
-    public Map<String, String> getMapDisgNodeRefNode() {
-        return mapDisgNodeRefNode;
+    public List<String> getElementsList() {
+        return elementsList;
     }
 
-    public void setMapDisgNodeRefNode(Map<String, String> mapDisgNodeRefNode) {
-        this.mapDisgNodeRefNode = mapDisgNodeRefNode;
+    public void setElementsList(List<String> elementsList) {
+        this.elementsList = elementsList;
     }
 
-    public Map<String, IpAddress> getMapNodeRefIp() {
-        return mapNodeRefIp;
+    public Map<String, String> getMapDisgNodeRefNode() {
+        return mapDisgNodeRefNode;
     }
 
-    public void setMapNodeRefIp(Map<String, IpAddress> mapNodeRefIp) {
-        this.mapNodeRefIp = mapNodeRefIp;
+    public void setMapDisgNodeRefNode(Map<String, String> mapDisgNodeRefNode) {
+        this.mapDisgNodeRefNode = mapDisgNodeRefNode;
     }
 
     public Map<String, List<String>> getMapLinkFiber() {
@@ -512,14 +461,6 @@ public class GnpyTopoImpl {
         this.mapLinkFiber = mapLinkFiber;
     }
 
-    public Map<String, IpAddress> getMapFiberIp() {
-        return mapFiberIp;
-    }
-
-    public void setMapFiberIp(Map<String, IpAddress> mapFiberIp) {
-        this.mapFiberIp = mapFiberIp;
-    }
-
     public List<String> getTrxList() {
         return trxList;
     }