Upgrade to OpenROADM 7.1.0 network models
[transportpce.git] / networkmodel / src / main / java / org / opendaylight / transportpce / networkmodel / util / OpenRoadmTopology.java
1 /*
2  * Copyright © 2016 AT&T 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.networkmodel.util;
10
11 import java.util.ArrayList;
12 import java.util.Comparator;
13 import java.util.HashMap;
14 import java.util.List;
15 import java.util.Map;
16 import java.util.concurrent.ExecutionException;
17 import java.util.concurrent.TimeUnit;
18 import java.util.concurrent.TimeoutException;
19 import java.util.stream.Collectors;
20 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
21 import org.opendaylight.transportpce.common.NetworkUtils;
22 import org.opendaylight.transportpce.common.fixedflex.GridUtils;
23 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
24 import org.opendaylight.transportpce.networkmodel.dto.TopologyShard;
25 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev201012.network.Nodes;
26 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev201012.network.nodes.Mapping;
27 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1;
28 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1Builder;
29 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.NodeTypes;
30 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.XpdrNodeTypes;
31 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.Node1;
32 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.Node1Builder;
33 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.networks.network.node.DegreeAttributes;
34 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.networks.network.node.DegreeAttributesBuilder;
35 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.networks.network.node.SrgAttributes;
36 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.networks.network.node.SrgAttributesBuilder;
37 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.OpenroadmLinkType;
38 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.OpenroadmNodeType;
39 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.OpenroadmTpType;
40 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
41 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
42 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
43 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network;
44 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.NetworkKey;
45 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
46 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.NodeBuilder;
47 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.NodeKey;
48 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNode;
49 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNodeBuilder;
50 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNodeKey;
51 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.LinkId;
52 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Network1;
53 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
54 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link;
55 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.LinkBuilder;
56 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.LinkKey;
57 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.link.DestinationBuilder;
58 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.link.SourceBuilder;
59 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
60 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointBuilder;
61 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointKey;
62 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
63 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
64 import org.opendaylight.yangtools.yang.common.Uint16;
65 import org.slf4j.Logger;
66 import org.slf4j.LoggerFactory;
67
68 public final class OpenRoadmTopology {
69
70     private static final Logger LOG = LoggerFactory.getLogger(OpenRoadmTopology.class);
71
72     private OpenRoadmTopology() {
73     }
74
75     public static TopologyShard createTopologyShard(Nodes mappingNode) {
76         int numOfDegrees;
77         int numOfSrgs;
78         List<Node> nodes = new ArrayList<>();
79         List<Link> links = new ArrayList<>();
80
81         // Check if node is ROADM
82         if (NodeTypes.Rdm.getIntValue() == mappingNode.getNodeInfo().getNodeType().getIntValue()) {
83             LOG.info("creating rdm node in openroadmtopology for node {}", mappingNode.getNodeId());
84             // transform flat mapping list to per degree and per srg mapping lists
85             Map<String, List<Mapping>> mapDeg = new HashMap<>();
86             Map<String, List<Mapping>> mapSrg = new HashMap<>();
87             List<Mapping> mappingList = new ArrayList<>(mappingNode.nonnullMapping().values());
88             mappingList.sort(Comparator.comparing(Mapping::getLogicalConnectionPoint));
89
90             List<String> nodeShardList = new ArrayList<>();
91             for (Mapping mapping : mappingList) {
92                 String str = mapping.getLogicalConnectionPoint().split("-")[0];
93                 if (!nodeShardList.contains(str)) {
94                     nodeShardList.add(str);
95                 }
96             }
97             for (String str : nodeShardList) {
98                 List<Mapping> interList = mappingList.stream().filter(x -> x.getLogicalConnectionPoint().contains(str))
99                     .collect(Collectors.toList());
100                 if (str.contains("DEG")) {
101                     mapDeg.put(str, interList);
102                 } else if (str.contains("SRG")) {
103                     mapSrg.put(str,  interList);
104                 } else {
105                     LOG.error("unknown element");
106                 }
107             }
108             // create degree nodes
109             for (Map.Entry<String, List<Mapping>> entry : mapDeg.entrySet()) {
110                 NodeBuilder ietfNode = createDegree(entry.getKey(), entry.getValue(), mappingNode.getNodeId(),
111                     mappingNode.getNodeInfo().getNodeClli());
112                 nodes.add(ietfNode.build());
113             }
114             // create srg nodes
115             for (Map.Entry<String, List<Mapping>> entry : mapSrg.entrySet()) {
116                 NodeBuilder ietfNode = createSrg(entry.getKey(), entry.getValue(), mappingNode.getNodeId(),
117                     mappingNode.getNodeInfo().getNodeClli());
118                 nodes.add(ietfNode.build());
119             }
120
121             numOfDegrees = mapDeg.size();
122             numOfSrgs = mapSrg.size();
123
124             LOG.info("adding links numOfDegrees={} numOfSrgs={}", numOfDegrees, numOfSrgs);
125             links.addAll(createNewLinks(nodes));
126             LOG.info("created nodes/links: {}/{}", nodes.size(), links.size());
127             return new TopologyShard(nodes, links);
128         } else if (NodeTypes.Xpdr.getIntValue() ==  mappingNode.getNodeInfo().getNodeType().getIntValue()) {
129             // Check if node is Xpdr is a Transponder
130             List<Mapping> networkMappings = mappingNode.nonnullMapping().values()
131                     .stream().filter(k -> k.getLogicalConnectionPoint()
132                 .contains("NETWORK")).collect(Collectors.toList());
133             List<Integer> tpdrList = new ArrayList<>();
134             for (Mapping mapping : networkMappings) {
135                 List<Mapping> extractedMappings = null;
136                 Integer xpdrNb = Integer.parseInt(mapping.getLogicalConnectionPoint().split("XPDR")[1].split("-")[0]);
137                 if (!tpdrList.contains(xpdrNb)) {
138                     tpdrList.add(xpdrNb);
139                     extractedMappings = mappingNode.nonnullMapping().values().stream().filter(lcp -> lcp
140                         .getLogicalConnectionPoint().contains("XPDR" + xpdrNb)).collect(Collectors.toList());
141                     NodeBuilder ietfNode;
142                     if (mapping.getXponderType() == null
143                         || XpdrNodeTypes.Tpdr.getIntValue() == mapping.getXponderType().getIntValue()) {
144                         LOG.info("creating xpdr node {} of type Tpdr in openroadm-topology",
145                             mappingNode.getNodeId() + "-XPDR" + xpdrNb);
146                         ietfNode = createXpdr(mappingNode.getNodeId(), mappingNode.getNodeInfo().getNodeClli(), xpdrNb,
147                             extractedMappings, false);
148                         nodes.add(ietfNode.build());
149                     } else if (XpdrNodeTypes.Mpdr.getIntValue() == mapping.getXponderType().getIntValue()
150                         || XpdrNodeTypes.Switch.getIntValue() == mapping.getXponderType().getIntValue()) {
151                         LOG.info("creating xpdr node {} of type {} in openroadm-topology",
152                             mappingNode.getNodeId() + "-XPDR" + xpdrNb, mapping.getXponderType().getName());
153                         ietfNode = createXpdr(mappingNode.getNodeId(), mappingNode.getNodeInfo().getNodeClli(), xpdrNb,
154                             extractedMappings, true);
155                         nodes.add(ietfNode.build());
156                     }
157                 }
158             }
159             if (nodes.isEmpty()) {
160                 return null;
161             } else {
162                 return new TopologyShard(nodes, links);
163             }
164         }
165         LOG.error("Device node Type not managed yet");
166         return null;
167     }
168
169     private static NodeBuilder createXpdr(String nodeId, String clli, Integer xpdrNb, List<Mapping> mappings,
170         boolean isOtn) {
171         // Create openroadm-network-topo augmentation to set node type to Xponder
172         org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1 ocnNode1 =
173             new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1Builder()
174             .setNodeType(OpenroadmNodeType.XPONDER).build();
175         // Create ietf node setting supporting-node data
176         NodeBuilder ietfNodeBldr = createTopoLayerNode(nodeId, clli);
177         // set node-id
178         String nodeIdtopo = new StringBuilder().append(nodeId).append("-XPDR").append(xpdrNb).toString();
179         ietfNodeBldr.setNodeId(new NodeId(nodeIdtopo))
180             .withKey((new NodeKey(new NodeId(nodeIdtopo))))
181             .addAugmentation(ocnNode1);
182
183         // Create tp-map
184         Map<TerminationPointKey, TerminationPoint> tpMap = new HashMap<>();
185         TerminationPointBuilder ietfTpBldr;
186         for (Mapping m : mappings) {
187             if (!isOtn) {
188                 ietfTpBldr = createTpBldr(m.getLogicalConnectionPoint());
189                 // Add openroadm-network-topology tp augmentations
190                 org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529
191                     .TerminationPoint1Builder ocnTp1Bldr = new org.opendaylight.yang.gen.v1.http
192                     .org.openroadm.common.network.rev200529.TerminationPoint1Builder();
193                 if (m.getPortQual().equals("xpdr-network")) {
194                     ocnTp1Bldr.setTpType(OpenroadmTpType.XPONDERNETWORK);
195                     org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.TerminationPoint1 tpceTp1 =
196                         new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019
197                         .TerminationPoint1Builder().setAssociatedConnectionMapPort(m.getConnectionMapLcp()).build();
198                     ietfTpBldr
199                         .addAugmentation(ocnTp1Bldr.build())
200                         .addAugmentation(tpceTp1);
201                     TerminationPoint ietfTp = ietfTpBldr.build();
202                     tpMap.put(ietfTp.key(),ietfTp);
203                 } else if (m.getPortQual().equals("xpdr-client")) {
204                     ocnTp1Bldr.setTpType(OpenroadmTpType.XPONDERCLIENT);
205                     org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019.TerminationPoint1 tpceTp1 =
206                         new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev201019
207                         .TerminationPoint1Builder().setAssociatedConnectionMapPort(m.getConnectionMapLcp()).build();
208                     ietfTpBldr
209                         .addAugmentation(ocnTp1Bldr.build())
210                         .addAugmentation(tpceTp1);
211                     TerminationPoint ietfTp = ietfTpBldr.build();
212                     tpMap.put(ietfTp.key(),ietfTp);
213                 }
214             } else {
215                 if (m.getPortQual().equals("xpdr-network") || m.getPortQual().equals("switch-network")) {
216                     ietfTpBldr = createTpBldr(m.getLogicalConnectionPoint());
217                     org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529
218                         .TerminationPoint1Builder ocnTp1Bldr = new org.opendaylight.yang.gen.v1.http
219                         .org.openroadm.common.network.rev200529.TerminationPoint1Builder()
220                         .setTpType(OpenroadmTpType.XPONDERNETWORK);
221                     ietfTpBldr
222                         .addAugmentation(ocnTp1Bldr.build());
223                     TerminationPoint ietfTp = ietfTpBldr.build();
224                     tpMap.put(ietfTp.key(),ietfTp);
225                 }
226             }
227         }
228         // Create ietf node augmentation to support ietf tp-list
229         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
230             .Node1Builder ietfNode1 = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology
231             .rev180226.Node1Builder()
232             .setTerminationPoint(tpMap);
233         ietfNodeBldr.addAugmentation(ietfNode1.build());
234         return ietfNodeBldr;
235     }
236
237     private static NodeBuilder createDegree(String degNb, List<Mapping> degListMap, String nodeId, String clli) {
238         // Create tp-list
239         Map<TerminationPointKey,TerminationPoint> tpMap = new HashMap<>();
240         TerminationPointBuilder ietfTpBldr;
241         for (Mapping m : degListMap) {
242             ietfTpBldr = createTpBldr(m.getLogicalConnectionPoint());
243             // Add openroadm-common-network tp type augmentations
244             org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529
245                 .TerminationPoint1Builder ocnTp1Bldr = new org.opendaylight.yang.gen.v1.http
246                 .org.openroadm.common.network.rev200529.TerminationPoint1Builder();
247             switch (m.getPortDirection()) {
248                 case "bidirectional":
249                     ocnTp1Bldr.setTpType(OpenroadmTpType.DEGREETXRXTTP);
250                     break;
251                 case "tx":
252                     ocnTp1Bldr.setTpType(OpenroadmTpType.DEGREETXTTP);
253                     break;
254                 case "rx":
255                     ocnTp1Bldr.setTpType(OpenroadmTpType.DEGREERXTTP);
256                     break;
257                 default:
258                     LOG.error("impossible to set tp-type to {}", m.getLogicalConnectionPoint());
259             }
260             ietfTpBldr.addAugmentation(ocnTp1Bldr.build());
261             TerminationPoint ietfTp = ietfTpBldr.build();
262             tpMap.put(ietfTp.key(),ietfTp);
263         }
264         // Add CTP to tp-list
265         ietfTpBldr = createTpBldr(degNb + "-CTP-TXRX");
266         org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1 ocnTp1 =
267             new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1Builder()
268             .setTpType(OpenroadmTpType.DEGREETXRXCTP).build();
269         ietfTpBldr.addAugmentation(ocnTp1);
270         TerminationPoint ietfTp = ietfTpBldr.build();
271         tpMap.put(ietfTp.key(),ietfTp);
272         // set degree-attributes
273         DegreeAttributes degAtt = new DegreeAttributesBuilder()
274             .setDegreeNumber(Uint16.valueOf(degNb.split("DEG")[1]))
275             .setAvailFreqMaps(GridUtils.initFreqMaps4FixedGrid2Available())
276             .build();
277         // Create ietf node augmentation to support ietf tp-list
278         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
279             .Node1Builder ietfNode1 = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology
280             .rev180226.Node1Builder()
281             .setTerminationPoint(tpMap);
282         // set node-id
283         String nodeIdtopo = new StringBuilder().append(nodeId).append("-").append(degNb).toString();
284         Node1 ontNode1 = new Node1Builder().setDegreeAttributes(degAtt).build();
285         // Create openroadm-common-network augmentation to set node type to DEGREE
286         org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1 ocnNode1 =
287             new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1Builder()
288             .setNodeType(OpenroadmNodeType.DEGREE).build();
289         // Create ietf node setting supporting-node data
290         return createTopoLayerNode(nodeId, clli)
291             .setNodeId(new NodeId(nodeIdtopo))
292             .withKey((new NodeKey(new NodeId(nodeIdtopo))))
293             .addAugmentation(ontNode1)
294             .addAugmentation(ocnNode1)
295             .addAugmentation(ietfNode1.build());
296     }
297
298     private static NodeBuilder createSrg(String srgNb, List<Mapping> srgListMap, String nodeId, String clli) {
299         // Create tp-list
300         Map<TerminationPointKey,TerminationPoint> tpMap = new HashMap<>();
301         TerminationPointBuilder ietfTpBldr;
302         for (Mapping m : srgListMap) {
303             ietfTpBldr = createTpBldr(m.getLogicalConnectionPoint());
304             // Add openroadm-common-network tp type augmentations
305             org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529
306                 .TerminationPoint1Builder ocnTp1Bldr = new org.opendaylight.yang.gen.v1.http
307                 .org.openroadm.common.network.rev200529.TerminationPoint1Builder();
308             switch (m.getPortDirection()) {
309                 case "bidirectional":
310                     ocnTp1Bldr.setTpType(OpenroadmTpType.SRGTXRXPP);
311                     break;
312                 case "tx":
313                     ocnTp1Bldr.setTpType(OpenroadmTpType.SRGTXPP);
314                     break;
315                 case "rx":
316                     ocnTp1Bldr.setTpType(OpenroadmTpType.SRGRXPP);
317                     break;
318                 default:
319                     LOG.error("impossible to set tp-type to {}", m.getLogicalConnectionPoint());
320             }
321             ietfTpBldr.addAugmentation(ocnTp1Bldr.build());
322             TerminationPoint ietfTp = ietfTpBldr.build();
323             tpMap.put(ietfTp.key(),ietfTp);
324         }
325         // Add CP to tp-list
326         ietfTpBldr = createTpBldr(srgNb + "-CP-TXRX");
327         org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529
328             .TerminationPoint1 ocnTp1 = new org.opendaylight.yang.gen.v1
329             .http.org.openroadm.common.network.rev200529.TerminationPoint1Builder()
330                 .setTpType(OpenroadmTpType.SRGTXRXCP).build();
331         ietfTpBldr.addAugmentation(ocnTp1);
332         TerminationPoint ietfTp = ietfTpBldr.build();
333         tpMap.put(ietfTp.key(),ietfTp);
334         // Create openroadm-common-network augmentation to set node type to SRG
335         org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1 ocnNode1 =
336             new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1Builder()
337             .setNodeType(OpenroadmNodeType.SRG).build();
338         // set srg-attributes
339         SrgAttributes srgAttr = new SrgAttributesBuilder()
340                 .setAvailFreqMaps(GridUtils.initFreqMaps4FixedGrid2Available()).build();
341         Node1 ontNode1 = new Node1Builder().setSrgAttributes(srgAttr).build();
342         // Create ietf node augmentation to support ietf tp-list
343         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
344             .Node1Builder ietfNode1 = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology
345             .rev180226.Node1Builder()
346             .setTerminationPoint(tpMap);
347         // Create ietf node setting supporting-node data
348         String nodeIdtopo = new StringBuilder().append(nodeId).append("-").append(srgNb).toString();
349         return createTopoLayerNode(nodeId, clli)
350             .setNodeId(new NodeId(nodeIdtopo))
351             .withKey((new NodeKey(new NodeId(nodeIdtopo))))
352             .addAugmentation(ontNode1)
353             .addAugmentation(ocnNode1)
354             .addAugmentation(ietfNode1.build());
355     }
356
357     private static NodeBuilder createTopoLayerNode(String nodeId, String clli) {
358         // Sets the value of Network-ref and Node-ref as a part of the supporting node
359         // attribute
360         SupportingNodeBuilder support1bldr = new SupportingNodeBuilder()
361             .withKey(new SupportingNodeKey(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID), new NodeId(nodeId)))
362             .setNetworkRef(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID))
363             .setNodeRef(new NodeId(nodeId));
364         SupportingNodeBuilder support2bldr = new SupportingNodeBuilder()
365             .withKey(new SupportingNodeKey(new NetworkId(NetworkUtils.CLLI_NETWORK_ID), new NodeId(clli)))
366             .setNetworkRef(new NetworkId(NetworkUtils.CLLI_NETWORK_ID))
367             .setNodeRef(new NodeId(clli));
368         Map<SupportingNodeKey, SupportingNode> supportlist = new HashMap<>();
369         SupportingNode support1 = support1bldr.build();
370         supportlist.put(support1.key(),support1);
371         SupportingNode support2 = support2bldr.build();
372         supportlist.put(support2.key(),support2);
373         return new NodeBuilder().setSupportingNode(supportlist);
374     }
375
376
377     // This method returns a generic termination point builder for a given tpid
378     private static TerminationPointBuilder createTpBldr(String tpId) {
379         TpId tp = new TpId(tpId);
380         return new TerminationPointBuilder().withKey(new TerminationPointKey(tp)).setTpId(tp);
381     }
382
383     private static LinkBuilder createLink(String srcNode, String destNode, String srcTp, String destTp) {
384         //create source link
385         SourceBuilder ietfSrcLinkBldr = new SourceBuilder().setSourceNode(new NodeId(srcNode)).setSourceTp(srcTp);
386         //create destination link
387         DestinationBuilder ietfDestLinkBldr = new DestinationBuilder().setDestNode(new NodeId(destNode))
388             .setDestTp(destTp);
389         LinkId linkId = LinkIdUtil.buildLinkId(srcNode, srcTp, destNode, destTp);
390         return new LinkBuilder()
391             .setSource(ietfSrcLinkBldr.build())
392             .setDestination(ietfDestLinkBldr.build())
393             .setLinkId(linkId)
394             .withKey(new LinkKey(linkId));
395     }
396
397     private static List<Link> createNewLinks(List<Node> nodes) {
398         List<Link> links = new ArrayList<>();
399         String srcNode;
400         String destNode;
401         String srcTp;
402         String destTp;
403         for (int i = 0; i < nodes.size() - 1; i++) {
404             for (int j = i + 1; j < nodes.size(); j++) {
405                 srcNode = nodes.get(i).getNodeId().getValue();
406                 destNode = nodes.get(j).getNodeId().getValue();
407                 // A to Z direction
408                 srcTp = nodes.get(i).augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
409                     .network.topology.rev180226.Node1.class).nonnullTerminationPoint().values().stream()
410                     .filter(tp -> tp.getTpId().getValue().contains("CP") || tp.getTpId().getValue().contains("CTP"))
411                     .findFirst().get().getTpId().getValue();
412                 destTp = nodes.get(j).augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
413                     .network.topology.rev180226.Node1.class).nonnullTerminationPoint().values().stream()
414                     .filter(tp -> tp.getTpId().getValue().contains("CP") || tp.getTpId().getValue().contains("CTP"))
415                     .findFirst().get().getTpId().getValue();
416                 Link1Builder ocnAzLinkBldr = new Link1Builder();
417                 int srcNodeType = nodes.get(i).augmentation(org.opendaylight.yang.gen.v1.http
418                         .org.openroadm.common.network.rev200529.Node1.class).getNodeType().getIntValue();
419                 int destNodeType = nodes.get(j).augmentation(org.opendaylight.yang.gen.v1.http
420                         .org.openroadm.common.network.rev200529.Node1.class).getNodeType().getIntValue();
421                 if (srcNodeType == 11 && destNodeType == 11) {
422                     ocnAzLinkBldr.setLinkType(OpenroadmLinkType.EXPRESSLINK);
423                 } else if (srcNodeType == 11 && destNodeType == 12) {
424                     ocnAzLinkBldr.setLinkType(OpenroadmLinkType.DROPLINK);
425                 } else if (srcNodeType == 12 && destNodeType == 11) {
426                     ocnAzLinkBldr.setLinkType(OpenroadmLinkType.ADDLINK);
427                 } else {
428                     continue;
429                 }
430                 // Z to A direction
431                 Link1Builder ocnZaLinkBldr = new Link1Builder();
432                 if (srcNodeType == 11 && destNodeType == 11) {
433                     ocnZaLinkBldr.setLinkType(OpenroadmLinkType.EXPRESSLINK);
434                 } else if (destNodeType == 11 && srcNodeType == 12) {
435                     ocnZaLinkBldr.setLinkType(OpenroadmLinkType.DROPLINK);
436                 } else if (destNodeType == 12 && srcNodeType == 11) {
437                     ocnZaLinkBldr.setLinkType(OpenroadmLinkType.ADDLINK);
438                 } else {
439                     continue;
440                 }
441                 // set opposite link augmentations
442                 LinkBuilder ietfAzLinkBldr = createLink(srcNode, destNode, srcTp, destTp);
443                 LinkBuilder ietfZaLinkBldr = createLink(destNode, srcNode, destTp, srcTp);
444                 ocnAzLinkBldr.setOppositeLink(ietfZaLinkBldr.getLinkId());
445                 ietfAzLinkBldr.addAugmentation(ocnAzLinkBldr.build());
446                 ocnZaLinkBldr.setOppositeLink(ietfAzLinkBldr.getLinkId());
447                 ietfZaLinkBldr.addAugmentation(ocnZaLinkBldr.build());
448                 links.add(ietfAzLinkBldr.build());
449                 links.add(ietfZaLinkBldr.build());
450             }
451         }
452         return links;
453     }
454
455     // This method returns the linkBuilder object for given source and destination
456     public static boolean deleteLink(String srcNode, String dstNode, String srcTp, String destTp,
457                                      NetworkTransactionService networkTransactionService) {
458         LOG.info("deleting link for {}-{}", srcNode, dstNode);
459         LinkId linkId = LinkIdUtil.buildLinkId(srcNode, srcTp, dstNode, destTp);
460         if (deleteLinkLinkId(linkId, networkTransactionService)) {
461             LOG.debug("Link Id {} updated to have admin state down", linkId);
462             return true;
463         } else {
464             LOG.debug("Link Id not found for Source {} and Dest {}", srcNode, dstNode);
465             return false;
466         }
467     }
468
469     // This method returns the linkBuilder object for given source and destination
470     public static boolean deleteLinkLinkId(LinkId linkId , NetworkTransactionService networkTransactionService) {
471         LOG.info("deleting link for LinkId: {}", linkId.getValue());
472         try {
473             InstanceIdentifierBuilder<Link> linkIID = InstanceIdentifier.builder(Networks.class).child(Network.class,
474                 new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))).augmentation(Network1.class)
475                 .child(Link.class, new LinkKey(linkId));
476             java.util.Optional<Link> link =
477                     networkTransactionService.read(LogicalDatastoreType.CONFIGURATION,linkIID.build()).get();
478             if (link.isPresent()) {
479                 LinkBuilder linkBuilder = new LinkBuilder(link.get());
480                 org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.Link1Builder link1Builder =
481                     new org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529.Link1Builder(
482                     linkBuilder.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev200529
483                     .Link1.class));
484                 linkBuilder.removeAugmentation(Link1.class)
485                     .addAugmentation(link1Builder.build());
486                 networkTransactionService.merge(LogicalDatastoreType.CONFIGURATION, linkIID.build(),
487                         linkBuilder.build());
488                 networkTransactionService.commit().get(1, TimeUnit.SECONDS);
489                 return true;
490             } else {
491                 LOG.error("No link found for given LinkId: {}",
492                         linkId);
493                 return false;
494             }
495
496         } catch (InterruptedException | ExecutionException | TimeoutException e) {
497             LOG.error("Error deleting link {}", linkId.getValue(), e);
498             return false;
499         }
500     }
501
502 }