8bb53215cca9dbb3353468e99ec73723f19f70ef
[transportpce.git] / pce / src / main / java / org / opendaylight / transportpce / pce / gnpy / GnpyTopoImpl.java
1 /*
2  * Copyright © 2019 Orange, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.transportpce.pce.gnpy;
10
11 import java.math.BigDecimal;
12 import java.math.RoundingMode;
13 import java.util.ArrayList;
14 import java.util.Collection;
15 import java.util.HashMap;
16 import java.util.List;
17 import java.util.Map;
18 import java.util.concurrent.ExecutionException;
19 import java.util.stream.IntStream;
20 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
21 import org.opendaylight.transportpce.common.NetworkUtils;
22 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
23 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.Coordinate;
24 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.Km;
25 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.edfa.params.Operational;
26 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.edfa.params.OperationalBuilder;
27 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.element.type.choice.element.type.Edfa;
28 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.element.type.choice.element.type.EdfaBuilder;
29 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.element.type.choice.element.type.FiberRoadmBuilder;
30 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.element.type.choice.element.type.Transceiver;
31 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.element.type.choice.element.type.TransceiverBuilder;
32 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.element.type.choice.element.type.fiberroadm.Params;
33 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.element.type.choice.element.type.fiberroadm.ParamsBuilder;
34 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.element.type.choice.element.type.fiberroadm.params.fiberroadmfused.Fiber;
35 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.element.type.choice.element.type.fiberroadm.params.fiberroadmfused.FiberBuilder;
36 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.element.type.choice.element.type.fiberroadm.params.fiberroadmfused.Roadm;
37 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.element.type.choice.element.type.fiberroadm.params.fiberroadmfused.RoadmBuilder;
38 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.location.attributes.Location;
39 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.location.attributes.LocationBuilder;
40 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.topo.Connections;
41 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.topo.ConnectionsBuilder;
42 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.topo.Elements;
43 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.topo.ElementsBuilder;
44 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.topo.ElementsKey;
45 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.topo.elements.Metadata;
46 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.topo.elements.MetadataBuilder;
47 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1;
48 import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.SpanAttributes;
49 import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.amplified.link.attributes.AmplifiedLink;
50 import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.amplified.link.attributes.amplified.link.section.element.section.element.Span;
51 import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.amplified.link.attributes.amplified.link.section.element.section.element.ila.Ila;
52 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.rev211210.Node1;
53 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.link.OMSAttributes;
54 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmLinkType;
55 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.link.concatenation.LinkConcatenation;
56 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
57 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
58 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network;
59 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.NetworkKey;
60 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
61 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNode;
62 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Network1;
63 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link;
64 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
65 import org.opendaylight.yangtools.yang.common.Decimal64;
66 import org.slf4j.Logger;
67 import org.slf4j.LoggerFactory;
68
69 /**
70  * Class to create the topology corresponding to GNPy requirements.
71  *
72  * @author Ahmed Triki ( ahmed.triki@orange.com )
73  *
74  */
75
76 public class GnpyTopoImpl {
77     private static final Logger LOG = LoggerFactory.getLogger(GnpyTopoImpl.class);
78     private final NetworkTransactionService networkTransactionService;
79     //List of elements
80     private Map<ElementsKey, Elements> elements = new HashMap<>();
81     private List<Connections> connections = new ArrayList<>();
82     private List<String> elementsList = new ArrayList<>();
83     //Mapping elements
84     //Mapping between the ord-topo and ord-ntw node
85     private Map<String, String> mapDisgNodeRefNode = new HashMap<>();
86     //Mapping between the ROADM-ROADM linkId/secElement and the linkId
87     private Map<String, List<String>> mapLinkFiber = new HashMap<>();
88     //List of Xponders
89     private List<String> trxList = new ArrayList<>();
90     private static final double LATITUDE = 0;
91     private static final double LONGITUTE = 0;
92     private static final String REGION = "N/A";
93     private static final String CITY = "N/A";
94     private static final int CONVERT_KM_M = 1000;
95     private static final double TARGET_PCH_OUT_DB = -20;
96
97     /*
98      * Construct the ExtractTopoDataStoreImpl.
99      */
100     public GnpyTopoImpl(final NetworkTransactionService networkTransactionService) throws GnpyException {
101         this.networkTransactionService = networkTransactionService;
102         extractTopo();
103     }
104
105     /*
106      * extract the topology
107      *
108      */
109     private void extractTopo() throws GnpyException {
110         // Define the instance identifier of the OpenRoadm topology
111         InstanceIdentifier<Network> insIdOpenRoadmTopo = InstanceIdentifier
112                 .builder(Networks.class)
113                 .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))).build();
114         // Define the instance identifier of the OpenRoadm network
115         InstanceIdentifier<Network> insIdrOpenRoadmNet = InstanceIdentifier
116                 .builder(Networks.class)
117                 .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID))).build();
118         try {
119             // Initialize the reading of the networkTransactionService
120             // read the configuration part of the data broker that concerns the openRoadm topology and get all the nodes
121             java.util.Optional<Network> openRoadmTopo = this.networkTransactionService
122                     .read(LogicalDatastoreType.CONFIGURATION, insIdOpenRoadmTopo).get();
123             java.util.Optional<Network> openRoadmNet = this.networkTransactionService
124                     .read(LogicalDatastoreType.CONFIGURATION, insIdrOpenRoadmNet).get();
125             if (openRoadmNet.isPresent() && openRoadmTopo.isPresent()) {
126                 extractElements(openRoadmTopo,openRoadmNet);
127                 extractConnections(openRoadmTopo);
128                 LOG.debug("In GnpyTopoImpl : elements and connections are well extracted");
129             }
130             else {
131                 throw new GnpyException(
132                     "In GnpyTopoImpl : openroadm topology network or openroadm network are not well mounted ...");
133             }
134         } catch (InterruptedException | ExecutionException e) {
135             this.networkTransactionService.close();
136             throw new GnpyException("In gnpyTopoImpl: error in reading the topology", e);
137         }
138         this.networkTransactionService.close();
139     }
140
141     private void extractElements(java.util.Optional<Network> openRoadmTopo,
142             java.util.Optional<Network> openRoadmNet) throws GnpyException {
143         if ((!openRoadmNet.isPresent()) || (!openRoadmTopo.isPresent())) {
144             throw new GnpyException("In gnpyTopoImpl: openRoadmNet or openRoadmTopo is not present");
145         }
146         // Create the list of nodes
147         Collection<Node> openRoadmNetNodeList = openRoadmNet.get().nonnullNode().values();
148         Collection<Node> openRoadmTopoNodeList = openRoadmTopo.get().nonnullNode().values();
149
150         if (openRoadmTopoNodeList.isEmpty() || openRoadmNetNodeList.isEmpty()) {
151             throw new GnpyException("In gnpyTopoImpl: no nodes in the openradm topology or openroadm network");
152         }
153         // Create elements
154         for (Node openRoadmTopoNode : openRoadmTopoNodeList) {
155             // Retrieve the supporting node and the type of the node in openRoadm network
156             Collection<SupportingNode> supportingNodeList = openRoadmTopoNode.nonnullSupportingNode().values();
157
158             for (SupportingNode supportingNode : supportingNodeList) {
159                 if (!supportingNode.getNetworkRef().getValue().equals("openroadm-network")) {
160                     continue;
161                 }
162                 String nodeRef = supportingNode.getNodeRef().getValue();
163                 if (nodeRef == null) {
164                     throw new GnpyException("In gnpyTopoImpl: nodeRef is null");
165                 }
166                 // Retrieve the mapping between the openRoadm topology and openRoadm network
167                 mapDisgNodeRefNode.put(openRoadmTopoNode.getNodeId().getValue(), nodeRef);
168                 Node1 openRoadmNetNode1 = null;
169                 org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210
170                     .Node1 commonNetworkNode1 = null;
171                 for (Node openRoadmNetNode : openRoadmNetNodeList) {
172                     if (openRoadmNetNode.getNodeId().getValue().equals(nodeRef)) {
173                         openRoadmNetNode1 = openRoadmNetNode.augmentation(Node1.class);
174                         commonNetworkNode1 = openRoadmNetNode.augmentation(org.opendaylight.yang.gen.v1
175                             .http.org.openroadm.common.network.rev211210.Node1.class);
176                         break;
177                     }
178                 }
179                 if (commonNetworkNode1 == null) {
180                     throw new GnpyException(String.format("In gnpyTopoImpl: the node type of %s is null",nodeRef));
181                 }
182                 if (commonNetworkNode1.getNodeType().getName().equals("ROADM")) {
183                     if (!elementsList.contains(nodeRef)) {
184                         Elements element = createElementsRoadm(LATITUDE, LONGITUTE, nodeRef,
185                                 openRoadmNetNode1.getShelf(),TARGET_PCH_OUT_DB, nodeRef);
186                         this.elements.put(element.key(),element);
187                         elementsList.add(nodeRef);
188                     }
189                 } else if (commonNetworkNode1.getNodeType().getName().equals("XPONDER")) {
190                     if (!elementsList.contains(nodeRef)) {
191                         Elements element = createElementsTransceiver(LATITUDE, LONGITUTE, nodeRef,
192                                 openRoadmNetNode1.getShelf(), nodeRef);
193                         this.elements.put(element.key(),element);
194                         elementsList.add(nodeRef);
195                         trxList.add(nodeRef);
196                     }
197                 } else {
198                     throw new GnpyException("In gnpyTopoImpl: the type is not implemented");
199                 }
200             }
201         }
202     }
203
204     private void extractConnections(java.util.Optional<Network> openRoadmTopo) throws GnpyException {
205         // Create the list of connections
206         if (!openRoadmTopo.isPresent()) {
207             throw new GnpyException("In gnpyTopoImpl: openroadmTopo is not present");
208         }
209         Network1 nw1 = openRoadmTopo.get().augmentation(Network1.class);
210         Collection<Link> linksList = nw1.nonnullLink().values();
211         // 1:EXPRESS-LINK    2:ADD-LINK       3:DROP-LINK
212         // 4:ROADM-To-ROADM  5:XPONDER-INPUT  6:XPONDER-OUTPUT
213         int[] externalLink = {OpenroadmLinkType.ROADMTOROADM.getIntValue(),OpenroadmLinkType.XPONDERINPUT.getIntValue(),
214             OpenroadmLinkType.XPONDEROUTPUT.getIntValue()};
215
216         if (linksList.isEmpty()) {
217             throw new GnpyException("In gnpyTopoImpl: no links in the network");
218         }
219
220         for (Link link : linksList) {
221             Link1 link1 = link.augmentation(Link1.class);
222             org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210
223                 .Link1 openroadmNetworkLink1 = link.augmentation(org.opendaylight.yang.gen.v1.http
224                         .org.openroadm.network.topology.rev211210.Link1.class);
225             if (link1.getLinkType() == null) {
226                 throw new GnpyException("In gnpyTopoImpl: the link type is null");
227             }
228             int linkType = link1.getLinkType().getIntValue();
229             if (! IntStream.of(externalLink).anyMatch(x -> x == linkType)) {
230                 continue;
231             }
232
233             String srcId = mapDisgNodeRefNode.get(link.getSource().getSourceNode().getValue());
234             String linkId = link.getLinkId().getValue();
235             String destId = null;
236             if (linkType == OpenroadmLinkType.ROADMTOROADM.getIntValue()) {
237                 OMSAttributes omsAttributes = openroadmNetworkLink1.getOMSAttributes();
238                 if (omsAttributes == null) {
239                     throw new GnpyException(String.format(
240                         "In gnpyTopoImpl: OMS attributes do not exit for ROADM to ROADM link: %s",linkId));
241                 }
242                 //Case of amplified link
243                 if (omsAttributes.getAmplifiedLink() != null) {
244                     srcId = extractAmplifiedLink(omsAttributes, linkId, srcId);
245                 }
246                 //Case of one span link
247                 if (omsAttributes.getSpan() != null) {
248                     srcId = extractSpanLink(omsAttributes, linkId, srcId);
249                 }
250             }
251             // Create a new link
252             destId = mapDisgNodeRefNode.get(link.getDestination().getDestNode().getValue());
253             createNewConnection(srcId,destId);
254         }
255     }
256
257     private String extractAmplifiedLink(OMSAttributes omsAttributes, String linkId, String srcId)
258         throws GnpyException {
259
260         List<AmplifiedLink> amplifiedLinkList = new ArrayList<>(omsAttributes.getAmplifiedLink()
261             .nonnullAmplifiedLink().values());
262         String destId = null;
263         if (!amplifiedLinkList.isEmpty()) {
264             for (AmplifiedLink amplifiedLink: amplifiedLinkList) {
265                 String secElt = amplifiedLink .getSectionEltNumber().toString();
266                 //Case of ILA
267                 if (amplifiedLink.getSectionElement().getSectionElement() instanceof Ila) {
268                     Ila ila = (Ila) amplifiedLink.getSectionElement().getSectionElement();
269                     destId = extractILAFromAmpLink(ila);
270                 }
271                 //Case of Span
272                 if (amplifiedLink.getSectionElement().getSectionElement() instanceof Span) {
273                     Span span = (Span) amplifiedLink.getSectionElement().getSectionElement();
274                     destId = extractSpan(span.getSpan(), linkId, secElt);
275                 }
276                 // Create a new link
277                 if (createNewConnection(srcId,destId)) {
278                     srcId = destId;
279                 }
280             }
281         }
282         return srcId;
283     }
284
285     private String extractSpanLink(OMSAttributes omsAttributes, String linkId, String srcId)
286         throws GnpyException {
287
288         SpanAttributes span = omsAttributes.getSpan();
289         String destId = extractSpan(span, linkId, linkId);
290         if (createNewConnection(srcId, destId)) {
291             return destId;
292         }
293         return srcId;
294     }
295
296     private String extractILAFromAmpLink(Ila ila) throws GnpyException {
297         String nodeId = ila.getNodeId().getValue();
298         mapDisgNodeRefNode.put(nodeId, nodeId);
299         Elements element = createElementsEdfa(LATITUDE, LONGITUTE, REGION, CITY,
300                 ila.getGain().getValue().decimalValue(), ila.getTilt().getValue().decimalValue(),
301                 ila.getOutVoaAtt().getValue().decimalValue(), "std_medium_gain",
302                 nodeId);
303         this.elements.put(element.key(),element);
304         return nodeId;
305     }
306
307     private String extractSpan(SpanAttributes span, String linkId, String subLinkId) throws GnpyException {
308         if (!mapLinkFiber.containsKey(linkId)) {
309             mapLinkFiber.put(linkId, new ArrayList<>());
310         }
311         mapLinkFiber.get(linkId).add(subLinkId);
312         //mapFiberIp.put(subLinkId, ipFiber);
313         //fiberId = incrementIdentifier(fiberId);
314         double attIn = 0;
315         double connIn = 0;
316         double connOut = 0;
317         String typeVariety = "SSMF";
318         double length = 0;
319         // Compute the length of the link
320         for (LinkConcatenation linkConcatenation : span.nonnullLinkConcatenation().values()) {
321             double srlgLength = linkConcatenation.getSRLGLength().doubleValue();
322             //convert to kilometer
323             length += srlgLength / CONVERT_KM_M;
324         }
325         if (length == 0) {
326             throw new GnpyException(String.format(
327                 "In gnpyTopoImpl: length of the link %s is equal to zero",linkId));
328         }
329         double lossCoef = span.getSpanlossCurrent().getValue().doubleValue() / length;
330         Elements element = createElementsFiber(LATITUDE, LONGITUTE, REGION, CITY,
331                 subLinkId, length, attIn, lossCoef, connIn, connOut, typeVariety);
332         this.elements.put(element.key(),element);
333         return subLinkId;
334     }
335
336     /*
337      * Method to create Fiber
338      */
339     private Elements createElementsFiber(double latitude, double longitude, String region, String city, String uidFiber,
340             double length, double attIn, double lossCoef, double connIn, double connOut, String typeVariety) {
341         // Create an amplifier after the ROADM
342         Coordinate c1 = new Coordinate(Decimal64.valueOf(String.valueOf(latitude)));
343         Coordinate c2 = new Coordinate(Decimal64.valueOf(String.valueOf(longitude)));
344         Location location1 = new LocationBuilder().setRegion(region).setCity(city).setLatitude(c1).setLongitude(c2)
345                 .build();
346         Metadata metadata1 = new MetadataBuilder().setLocation(location1).build();
347         Fiber fiber = new FiberBuilder()
348             .setLength(Decimal64.valueOf(String.valueOf(length)))
349             .setLengthUnits(Km.VALUE)
350             .setAttIn(Decimal64.valueOf(String.valueOf(attIn)))
351             .setLossCoef(Decimal64.valueOf(String.valueOf(lossCoef)).scaleTo(5, RoundingMode.CEILING))
352             .setConIn(Decimal64.valueOf(String.valueOf(connIn)))
353             .setConOut(Decimal64.valueOf(String.valueOf(connOut)))
354             .build();
355         Params params1 = new ParamsBuilder().setFiberroadmfused(fiber).build();
356         return new ElementsBuilder().setUid(uidFiber)
357                 .setType(org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.Fiber.VALUE)
358                 .setTypeVariety(typeVariety).setMetadata(metadata1)
359                 .setElementType(new FiberRoadmBuilder().setParams(params1).build()).build();
360     }
361
362     /*
363      * Method to create EDFA
364      */
365     private Elements createElementsEdfa(double latitude, double longitude, String region, String city,
366             BigDecimal gainTarget, BigDecimal tiltTarget, BigDecimal outVoa, String typeVariety, String uidEdfa) {
367         // Create an amplifier after the ROADM
368         Coordinate c1 = new Coordinate(Decimal64.valueOf(String.valueOf(latitude)));
369         Coordinate c2 = new Coordinate(Decimal64.valueOf(String.valueOf(longitude)));
370         Location location1 = new LocationBuilder().setRegion(region).setCity(city).setLatitude(c1).setLongitude(c2)
371                 .build();
372         Metadata metadata1 = new MetadataBuilder().setLocation(location1).build();
373         Operational operational = new OperationalBuilder()
374             .setGainTarget(Decimal64.valueOf(gainTarget))
375             .setTiltTarget(Decimal64.valueOf(tiltTarget))
376             .setOutVoa(Decimal64.valueOf(outVoa))
377             .build();
378         Edfa edfa = new EdfaBuilder()
379                 .setOperational(operational).build();
380         return new ElementsBuilder().setUid(uidEdfa)
381                 .setType(org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.Edfa.VALUE)
382                 .setMetadata(metadata1).setElementType(edfa).setTypeVariety(typeVariety).build();
383     }
384
385     /*
386      * Method to create ROADM
387      */
388     private Elements createElementsRoadm(double latitude, double longitude, String region, String city,
389             double targetPchOutDb, String uidRoadm) {
390         Coordinate c1 = new Coordinate(Decimal64.valueOf(String.valueOf(latitude)));
391         Coordinate c2 = new Coordinate(Decimal64.valueOf(String.valueOf(longitude)));
392         Location location1 = new LocationBuilder().setRegion(region).setCity(city).setLatitude(c1).setLongitude(c2)
393                 .build();
394         Metadata metadata1 = new MetadataBuilder().setLocation(location1).build();
395         Roadm roadm = new RoadmBuilder()
396             .setTargetPchOutDb(Decimal64.valueOf(String.valueOf(targetPchOutDb)))
397             .build();
398         Params params1 = new ParamsBuilder().setFiberroadmfused(roadm).build();
399         return new ElementsBuilder().setUid(uidRoadm)
400                 .setType(org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.Roadm.VALUE)
401                 .setMetadata(metadata1).setElementType(new FiberRoadmBuilder().setParams(params1).build()).build();
402     }
403
404     /*
405      * Method to create Transceiver
406      */
407     private Elements createElementsTransceiver(double latitude, double longitude, String region, String city,
408             String uidTrans) {
409         Coordinate c1 = new Coordinate(Decimal64.valueOf(String.valueOf(latitude)));
410         Coordinate c2 = new Coordinate(Decimal64.valueOf(String.valueOf(longitude)));
411         Location location1 = new LocationBuilder().setRegion(region).setCity(city).setLatitude(c1).setLongitude(c2)
412                 .build();
413         Metadata metadata1 = new MetadataBuilder().setLocation(location1).build();
414         Transceiver transceiver = new TransceiverBuilder().build();
415         return new ElementsBuilder().setUid(uidTrans)
416                 .setType(org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.Transceiver.VALUE)
417                 .setMetadata(metadata1).setElementType(transceiver).build();
418     }
419
420     /*
421      * Method to create Connection
422      */
423     private boolean createNewConnection(String fromNode, String toNode) throws GnpyException {
424         if (fromNode == null || toNode == null) {
425             throw new GnpyException("create new connection : null node IpAddress");
426         }
427         if (fromNode.equals(toNode)) {
428             return false;
429         }
430         Connections connection = new ConnectionsBuilder().setFromNode(fromNode).setToNode(toNode).build();
431         this.connections.add(connection);
432         return true;
433     }
434
435     public Map<ElementsKey, Elements> getElements() {
436         return elements;
437     }
438
439     public void setElements(Map<ElementsKey, Elements> elements) {
440         this.elements = elements;
441     }
442
443     public List<Connections> getConnections() {
444         return connections;
445     }
446
447     public void setConnections(List<Connections> connections) {
448         this.connections = connections;
449     }
450
451     public List<String> getElementsList() {
452         return elementsList;
453     }
454
455     public void setElementsList(List<String> elementsList) {
456         this.elementsList = elementsList;
457     }
458
459     public Map<String, String> getMapDisgNodeRefNode() {
460         return mapDisgNodeRefNode;
461     }
462
463     public void setMapDisgNodeRefNode(Map<String, String> mapDisgNodeRefNode) {
464         this.mapDisgNodeRefNode = mapDisgNodeRefNode;
465     }
466
467     public Map<String, List<String>> getMapLinkFiber() {
468         return mapLinkFiber;
469     }
470
471     public void setMapLinkFiber(Map<String, List<String>> mapLinkFiber) {
472         this.mapLinkFiber = mapLinkFiber;
473     }
474
475     public List<String> getTrxList() {
476         return trxList;
477     }
478
479     public void setTrxList(List<String> trxList) {
480         this.trxList = trxList;
481     }
482 }