Refactor networkmodel OpenRoadmTopology Part 1
[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 static org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.XpdrNodeTypes.Tpdr;
12
13 import java.util.ArrayList;
14 import java.util.Comparator;
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.concurrent.TimeUnit;
20 import java.util.concurrent.TimeoutException;
21 import java.util.stream.Collectors;
22 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
23 import org.opendaylight.transportpce.common.NetworkUtils;
24 import org.opendaylight.transportpce.common.fixedflex.GridUtils;
25 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
26 import org.opendaylight.transportpce.networkmodel.dto.TopologyShard;
27 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
28 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes;
29 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1;
30 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1Builder;
31 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
32 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.NodeTypes;
33 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
34 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Node1;
35 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Node1Builder;
36 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.TerminationPoint1;
37 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.DegreeAttributes;
38 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.DegreeAttributesBuilder;
39 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.SrgAttributes;
40 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.SrgAttributesBuilder;
41 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmLinkType;
42 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmNodeType;
43 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmTpType;
44 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
45 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
46 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
47 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network;
48 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.NetworkKey;
49 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
50 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.NodeBuilder;
51 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.NodeKey;
52 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNode;
53 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNodeBuilder;
54 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNodeKey;
55 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.LinkId;
56 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Network1;
57 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
58 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link;
59 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.LinkBuilder;
60 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.LinkKey;
61 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.link.DestinationBuilder;
62 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.link.SourceBuilder;
63 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
64 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointBuilder;
65 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointKey;
66 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
67 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
68 import org.opendaylight.yangtools.yang.common.Uint16;
69 import org.slf4j.Logger;
70 import org.slf4j.LoggerFactory;
71
72 public final class OpenRoadmTopology {
73
74     private static final Logger LOG = LoggerFactory.getLogger(OpenRoadmTopology.class);
75
76     private OpenRoadmTopology() {
77     }
78
79     public static TopologyShard createTopologyShard(Nodes mappingNode) {
80         return createTopologyShard(mappingNode, true);
81     }
82
83     public static TopologyShard createTopologyShard(Nodes mappingNode, boolean firstMount) {
84         int numOfDegrees;
85         int numOfSrgs;
86         List<Node> nodes = new ArrayList<>();
87         List<Link> links = new ArrayList<>();
88
89         // Check if node is ROADM
90         if (NodeTypes.Rdm.getIntValue() == mappingNode.getNodeInfo().getNodeType().getIntValue()) {
91             LOG.info("creating rdm node in openroadmtopology for node {}",
92                     mappingNode.getNodeId());
93             // transform flat mapping list to per degree and per srg mapping lists
94             Map<String, List<Mapping>> mapDeg = new HashMap<>();
95             Map<String, List<Mapping>> mapSrg = new HashMap<>();
96             List<Mapping> mappingList = new ArrayList<>(mappingNode.nonnullMapping().values());
97             mappingList.sort(Comparator.comparing(Mapping::getLogicalConnectionPoint));
98             List<String> nodeShardList = new ArrayList<>();
99             for (Mapping mapping : mappingList) {
100                 String str = mapping.getLogicalConnectionPoint().split("-")[0];
101                 if (!nodeShardList.contains(str)) {
102                     nodeShardList.add(str);
103                 }
104             }
105             for (String str : nodeShardList) {
106                 List<Mapping> interList =
107                         mappingList.stream()
108                                 .filter(x -> x.getLogicalConnectionPoint().split("-")[0].equals(str))
109                                 .collect(Collectors.toList());
110                 if (str.contains("DEG")) {
111                     mapDeg.put(str, interList);
112                 } else if (str.contains("SRG")) {
113                     mapSrg.put(str, interList);
114                 } else {
115                     LOG.error("unknow element");
116                 }
117             }
118             // create degree nodes
119             for (Map.Entry<String, List<Mapping>> entry : mapDeg.entrySet()) {
120                 NodeBuilder ietfNode =
121                         createDegree(entry.getKey(), entry.getValue(), mappingNode.getNodeId(),
122                                 mappingNode.getNodeInfo().getNodeClli(), firstMount);
123                 nodes.add(ietfNode.build());
124             }
125             // create srg nodes
126             for (Map.Entry<String, List<Mapping>> entry : mapSrg.entrySet()) {
127                 NodeBuilder ietfNode =
128                         createSrg(entry.getKey(), entry.getValue(), mappingNode.getNodeId(),
129                                 mappingNode.getNodeInfo().getNodeClli(), firstMount);
130                 nodes.add(ietfNode.build());
131             }
132
133             numOfDegrees = mapDeg.size();
134             numOfSrgs = mapSrg.size();
135
136             LOG.info("adding links numOfDegrees={} numOfSrgs={}", numOfDegrees, numOfSrgs);
137             links.addAll(createNewLinks(nodes));
138             LOG.info("created nodes/links: {}/{}", nodes.size(), links.size());
139             return new TopologyShard(nodes, links);
140         } else if (NodeTypes.Xpdr.getIntValue() ==  mappingNode.getNodeInfo().getNodeType().getIntValue()) {
141             // Check if node is Xpdr is a Transponder
142             List<Mapping> networkMappings =
143                     mappingNode.nonnullMapping().values()
144                             .stream().filter(k -> k.getLogicalConnectionPoint().contains("NETWORK"))
145                             .collect(Collectors.toList());
146             List<Integer> tpdrList = new ArrayList<>();
147             for (Mapping mapping : networkMappings) {
148                 Integer xpdrNb = Integer.parseInt(mapping.getLogicalConnectionPoint().split("XPDR")[1].split("-")[0]);
149                 if (!tpdrList.contains(xpdrNb)) {
150                     tpdrList.add(xpdrNb);
151                     List<Mapping> extractedMappings = mappingNode.nonnullMapping().values().stream()
152                             .filter(lcp -> lcp.getLogicalConnectionPoint().contains("XPDR" + xpdrNb))
153                             .collect(Collectors.toList());
154                     Boolean lastArg;
155                     String xpdrType;
156                     switch (mapping.getXponderType() == null ? Tpdr : mapping.getXponderType()) {
157                         case Tpdr :
158                             lastArg = false;
159                             xpdrType = "Tpdr";
160                             break;
161                         case Mpdr :
162                         case Switch :
163                             lastArg = true;
164                             xpdrType = mapping.getXponderType().getName();
165                             break;
166                         default :
167                             LOG.warn("cannot create xpdr node {} in openroadm-topology: type {} not supported",
168                                  mappingNode.getNodeId() + "-XPDR" + xpdrNb, mapping.getXponderType().getName());
169                             continue;
170                     }
171                     LOG.info("creating xpdr node {} of type {} in openroadm-topology",
172                             mappingNode.getNodeId() + "-XPDR" + xpdrNb, xpdrType);
173                     nodes.add(createXpdr(
174                                     mappingNode.getNodeId(),
175                                     mappingNode.getNodeInfo().getNodeClli(),
176                                     xpdrNb,
177                                     extractedMappings,
178                                     lastArg)
179                               .build());
180                 }
181             }
182             return nodes.isEmpty() ? null : new TopologyShard(nodes, links);
183         }
184         LOG.error("Device node Type not managed yet");
185         return null;
186     }
187
188     private static NodeBuilder createXpdr(String nodeId, String clli, Integer xpdrNb, List<Mapping> mappings,
189                                           boolean isOtn) {
190         // Create ietf node setting supporting-node data
191         String nodeIdtopo = new StringBuilder().append(nodeId).append("-XPDR").append(xpdrNb).toString();
192         NodeBuilder ietfNodeBldr = createTopoLayerNode(nodeId, clli)
193                 .setNodeId(new NodeId(nodeIdtopo))
194                 .withKey((new NodeKey(new NodeId(nodeIdtopo))))
195                 .addAugmentation(
196                     // Create openroadm-network-topo augmentation to set node type to Xponder
197                     new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1Builder()
198                         .setNodeType(OpenroadmNodeType.XPONDER)
199                         .setAdministrativeState(AdminStates.InService)
200                         .setOperationalState(State.InService)
201                         .build());
202
203         // Create tp-map
204         Map<TerminationPointKey, TerminationPoint> tpMap = new HashMap<>();
205         for (Mapping m : mappings) {
206             if (!isOtn) {
207                 // Add openroadm-network-topology tp augmentations
208                 org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1Builder
209                         ocnTp1Bldr = new org.opendaylight.yang.gen.v1.http
210                             .org.openroadm.common.network.rev211210.TerminationPoint1Builder()
211                                 .setAdministrativeState(TopologyUtils.setNetworkAdminState(m.getPortAdminState()))
212                                 .setOperationalState(TopologyUtils.setNetworkOperState(m.getPortOperState()));
213                 if (m.getPortQual().equals("xpdr-network")) {
214                     ocnTp1Bldr.setTpType(OpenroadmTpType.XPONDERNETWORK);
215                     TerminationPoint ietfTp = createTpBldr(m.getLogicalConnectionPoint())
216                             .addAugmentation(ocnTp1Bldr.build())
217                             .addAugmentation(
218                                 new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123
219                                         .TerminationPoint1Builder()
220                                     .setAssociatedConnectionMapPort(m.getConnectionMapLcp())
221                                     .build())
222                             .build();
223                     tpMap.put(ietfTp.key(),ietfTp);
224                 } else if (m.getPortQual().equals("xpdr-client")) {
225                     ocnTp1Bldr.setTpType(OpenroadmTpType.XPONDERCLIENT);
226                     TerminationPoint ietfTp = createTpBldr(m.getLogicalConnectionPoint())
227                             .addAugmentation(ocnTp1Bldr.build())
228                             .addAugmentation(
229                                 new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123
230                                         .TerminationPoint1Builder()
231                                     .setAssociatedConnectionMapPort(m.getConnectionMapLcp())
232                                     .build())
233                             .build();
234                     tpMap.put(ietfTp.key(),ietfTp);
235                 }
236             } else {
237                 if (m.getPortQual().equals("xpdr-network") || m.getPortQual().equals("switch-network")) {
238                     TerminationPoint ietfTp = createTpBldr(m.getLogicalConnectionPoint())
239                         .addAugmentation(
240                             new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210
241                                     .TerminationPoint1Builder()
242                                 .setTpType(OpenroadmTpType.XPONDERNETWORK)
243                                 .setAdministrativeState(TopologyUtils.setNetworkAdminState(m.getPortAdminState()))
244                                 .setOperationalState(TopologyUtils.setNetworkOperState(m.getPortOperState()))
245                                 .build())
246                         .build();
247                     tpMap.put(ietfTp.key(),ietfTp);
248                 }
249             }
250         }
251         // Create ietf node augmentation to support ietf tp-list
252         return ietfNodeBldr.addAugmentation(
253             new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1Builder()
254                     .setTerminationPoint(tpMap)
255                     .build());
256     }
257
258     private static NodeBuilder createDegree(String degNb, List<Mapping> degListMap, String nodeId, String clli,
259                                             boolean firstMount) {
260         // Create tp-list
261         Map<TerminationPointKey,TerminationPoint> tpMap = new HashMap<>();
262         for (Mapping m : degListMap) {
263             // Add openroadm-common-network tp type augmentations
264             org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1Builder
265                 ocnTp1Bldr = new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210
266                     .TerminationPoint1Builder()
267                         .setAdministrativeState(TopologyUtils.setNetworkAdminState(m.getPortAdminState()))
268                         .setOperationalState(TopologyUtils.setNetworkOperState(m.getPortOperState()));
269             // Added states to degree port. TODO: add to mapping relation between abstracted and physical node states
270             switch (m.getPortDirection()) {
271                 case "bidirectional":
272                     ocnTp1Bldr.setTpType(OpenroadmTpType.DEGREETXRXTTP);
273                     break;
274                 case "tx":
275                     ocnTp1Bldr.setTpType(OpenroadmTpType.DEGREETXTTP);
276                     break;
277                 case "rx":
278                     ocnTp1Bldr.setTpType(OpenroadmTpType.DEGREERXTTP);
279                     break;
280                 default:
281                     LOG.error("impossible to set tp-type to {}", m.getLogicalConnectionPoint());
282             }
283             TerminationPoint ietfTp =  createTpBldr(m.getLogicalConnectionPoint())
284                 .addAugmentation(ocnTp1Bldr.build())
285                 .build();
286             tpMap.put(ietfTp.key(),ietfTp);
287         }
288         // Add CTP to tp-list + added states. TODO: same comment as before with the relation between states
289         TerminationPoint ietfTp = createTpBldr(degNb + "-CTP-TXRX")
290                 .addAugmentation(new org.opendaylight.yang.gen.v1.http
291                     .org.openroadm.common.network.rev211210.TerminationPoint1Builder()
292                          .setTpType(OpenroadmTpType.DEGREETXRXCTP)
293                          .setAdministrativeState(AdminStates.InService)
294                          .setOperationalState(State.InService)
295                          .build())
296                  .build();
297         tpMap.put(ietfTp.key(),ietfTp);
298         // set degree-attributes
299         DegreeAttributesBuilder degAttBldr = new DegreeAttributesBuilder()
300                 .setDegreeNumber(Uint16.valueOf(degNb.split("DEG")[1]));
301         if (firstMount) {
302             degAttBldr.setAvailFreqMaps(GridUtils.initFreqMaps4FixedGrid2Available());
303         }
304         DegreeAttributes degAtt = degAttBldr.build();
305         // set node-id
306         String nodeIdtopo = new StringBuilder().append(nodeId).append("-").append(degNb).toString();
307         // Create ietf node setting supporting-node data
308         return createTopoLayerNode(nodeId, clli)
309                 .setNodeId(new NodeId(nodeIdtopo))
310                 .withKey((new NodeKey(new NodeId(nodeIdtopo))))
311                 .addAugmentation(
312                         new Node1Builder().setDegreeAttributes(degAtt).build())
313                 .addAugmentation(
314                         new org.opendaylight.yang.gen.v1.http
315                                 .org.openroadm.common.network.rev211210.Node1Builder()
316                             .setNodeType(OpenroadmNodeType.DEGREE)
317                             .setAdministrativeState(AdminStates.InService)
318                             .setOperationalState(State.InService)
319                             .build())
320                 .addAugmentation(
321                         new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
322                                 .Node1Builder()
323                             .setTerminationPoint(tpMap)
324                             .build());
325     }
326
327     private static NodeBuilder createSrg(String srgNb, List<Mapping> srgListMap, String nodeId, String clli,
328                                          boolean firstMount) {
329         // Create tp-list
330         Map<TerminationPointKey,TerminationPoint> tpMap = new HashMap<>();
331         for (Mapping m : srgListMap) {
332             // Add openroadm-common-network tp type augmentations
333             org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210
334                 .TerminationPoint1Builder ocnTp1Bldr = new org.opendaylight.yang.gen.v1.http
335                     .org.openroadm.common.network.rev211210.TerminationPoint1Builder()
336                         .setAdministrativeState(TopologyUtils.setNetworkAdminState(m.getPortAdminState()))
337                         .setOperationalState(TopologyUtils.setNetworkOperState(m.getPortOperState()));
338             // Added states to srg port. TODO: add to mapping relation between abstracted and physical node states
339             switch (m.getPortDirection()) {
340                 case "bidirectional":
341                     ocnTp1Bldr.setTpType(OpenroadmTpType.SRGTXRXPP);
342                     break;
343                 case "tx":
344                     ocnTp1Bldr.setTpType(OpenroadmTpType.SRGTXPP);
345                     break;
346                 case "rx":
347                     ocnTp1Bldr.setTpType(OpenroadmTpType.SRGRXPP);
348                     break;
349                 default:
350                     LOG.error("impossible to set tp-type to {}", m.getLogicalConnectionPoint());
351             }
352             TerminationPoint ietfTp = createTpBldr(m.getLogicalConnectionPoint())
353                 .addAugmentation(ocnTp1Bldr.build())
354                 .build();
355             tpMap.put(ietfTp.key(),ietfTp);
356         }
357         // Add CP to tp-list + added states. TODO: same comment as before with the relation between states
358         TerminationPoint ietfTp = createTpBldr(srgNb + "-CP-TXRX")
359                 .addAugmentation(
360                         new org.opendaylight.yang.gen.v1
361                                 .http.org.openroadm.common.network.rev211210.TerminationPoint1Builder()
362                             .setTpType(OpenroadmTpType.SRGTXRXCP)
363                             .setAdministrativeState(AdminStates.InService)
364                             .setOperationalState(State.InService)
365                             .build())
366                 .build();
367         tpMap.put(ietfTp.key(),ietfTp);
368         // set srg-attributes
369         SrgAttributesBuilder srgAttrBldr = new SrgAttributesBuilder();
370         if (firstMount) {
371             srgAttrBldr.setAvailFreqMaps(GridUtils.initFreqMaps4FixedGrid2Available());
372         }
373         SrgAttributes srgAttr = srgAttrBldr.build();
374         // Create ietf node augmentation to support ietf tp-list
375         // Create ietf node setting supporting-node data
376         String nodeIdtopo = new StringBuilder().append(nodeId).append("-").append(srgNb).toString();
377         return createTopoLayerNode(nodeId, clli)
378                 .setNodeId(new NodeId(nodeIdtopo))
379                 .withKey((new NodeKey(new NodeId(nodeIdtopo))))
380                 .addAugmentation(
381                         new Node1Builder().setSrgAttributes(srgAttr).build())
382                 .addAugmentation(
383                         new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210
384                                 .Node1Builder()
385                             .setNodeType(OpenroadmNodeType.SRG)
386                             .setAdministrativeState(AdminStates.InService)
387                             .setOperationalState(State.InService)
388                             .build())
389                 .addAugmentation(
390                         new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
391                                 .Node1Builder()
392                             .setTerminationPoint(tpMap)
393                             .build());
394     }
395
396     private static NodeBuilder createTopoLayerNode(String nodeId, String clli) {
397         // Sets the value of Network-ref and Node-ref as a part of the supporting node
398         // attribute
399         SupportingNode support1 = new SupportingNodeBuilder()
400                 .withKey(new SupportingNodeKey(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID), new NodeId(nodeId)))
401                 .setNetworkRef(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID))
402                 .setNodeRef(new NodeId(nodeId))
403                 .build();
404         SupportingNode support2 = new SupportingNodeBuilder()
405                 .withKey(new SupportingNodeKey(new NetworkId(NetworkUtils.CLLI_NETWORK_ID), new NodeId(clli)))
406                 .setNetworkRef(new NetworkId(NetworkUtils.CLLI_NETWORK_ID))
407                 .setNodeRef(new NodeId(clli))
408                 .build();
409         Map<SupportingNodeKey, SupportingNode> supportlist = new HashMap<>();
410         supportlist.put(support1.key(), support1);
411         supportlist.put(support2.key(), support2);
412         return new NodeBuilder().setSupportingNode(supportlist);
413     }
414
415
416     // This method returns a generic termination point builder for a given tpid
417     private static TerminationPointBuilder createTpBldr(String tpId) {
418         TpId tp = new TpId(tpId);
419         return new TerminationPointBuilder().withKey(new TerminationPointKey(tp)).setTpId(tp);
420     }
421
422     private static LinkBuilder createLink(String srcNode, String destNode, String srcTp, String destTp) {
423         LinkId linkId = LinkIdUtil.buildLinkId(srcNode, srcTp, destNode, destTp);
424         return new LinkBuilder()
425                         .setSource(new SourceBuilder()
426                                 .setSourceNode(new NodeId(srcNode))
427                                 .setSourceTp(new TpId(srcTp))
428                         .build())
429                         .setDestination(new DestinationBuilder()
430                                 .setDestNode(new NodeId(destNode))
431                                 .setDestTp(new TpId(destTp))
432                         .build())
433                 .setLinkId(linkId)
434                 .withKey(new LinkKey(linkId));
435     }
436
437     private static List<Link> createNewLinks(List<Node> nodes) {
438         List<Link> links = new ArrayList<>();
439         String srcNode;
440         String destNode;
441         String srcTp;
442         String destTp;
443         for (int i = 0; i < nodes.size() - 1; i++) {
444             for (int j = i + 1; j < nodes.size(); j++) {
445                 srcNode = nodes.get(i).getNodeId().getValue();
446                 destNode = nodes.get(j).getNodeId().getValue();
447                 // A to Z direction
448                 srcTp = nodes.get(i)
449                         .augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
450                                 .ietf.network.topology.rev180226.Node1.class)
451                         .nonnullTerminationPoint().values().stream()
452                         .filter(tp -> tp.getTpId().getValue().contains("CP") || tp.getTpId().getValue().contains("CTP"))
453                         .findFirst().get().getTpId().getValue();
454                 destTp = nodes.get(j)
455                         .augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
456                                 .ietf.network.topology.rev180226.Node1.class)
457                         .nonnullTerminationPoint().values().stream()
458                         .filter(tp -> tp.getTpId().getValue().contains("CP") || tp.getTpId().getValue().contains("CTP"))
459                         .findFirst().get().getTpId().getValue();
460                 Link1Builder ocnAzLinkBldr = new Link1Builder();
461                 int srcNodeType = nodes.get(i).augmentation(org.opendaylight.yang.gen.v1.http
462                         .org.openroadm.common.network.rev211210.Node1.class).getNodeType().getIntValue();
463                 int destNodeType = nodes.get(j).augmentation(org.opendaylight.yang.gen.v1.http
464                         .org.openroadm.common.network.rev211210.Node1.class).getNodeType().getIntValue();
465                 if (srcNodeType == 11 && destNodeType == 11) {
466                     ocnAzLinkBldr.setLinkType(OpenroadmLinkType.EXPRESSLINK);
467                 } else if (srcNodeType == 11 && destNodeType == 12) {
468                     ocnAzLinkBldr.setLinkType(OpenroadmLinkType.DROPLINK);
469                 } else if (srcNodeType == 12 && destNodeType == 11) {
470                     ocnAzLinkBldr.setLinkType(OpenroadmLinkType.ADDLINK);
471                 } else {
472                     continue;
473                 }
474                 // Z to A direction
475                 Link1Builder ocnZaLinkBldr = new Link1Builder();
476                 if (srcNodeType == 11 && destNodeType == 11) {
477                     ocnZaLinkBldr.setLinkType(OpenroadmLinkType.EXPRESSLINK);
478                 } else if (destNodeType == 11 && srcNodeType == 12) {
479                     ocnZaLinkBldr.setLinkType(OpenroadmLinkType.DROPLINK);
480                 } else if (destNodeType == 12 && srcNodeType == 11) {
481                     ocnZaLinkBldr.setLinkType(OpenroadmLinkType.ADDLINK);
482                 } else {
483                     continue;
484                 }
485                 // Add state to link. Based on the operational state of the TPs at the edge of the link.
486                 // Similar to getting srcTp and destTp
487                 State srcTpState = nodes.get(i)
488                         .augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
489                             .ietf.network.topology.rev180226.Node1.class)
490                         .getTerminationPoint().values().stream()
491                         .filter(tp -> tp.getTpId().getValue().contains("CP") || tp.getTpId().getValue().contains("CTP"))
492                         .findFirst().get()
493                         .augmentation(org.opendaylight.yang.gen.v1.http
494                                 .org.openroadm.common.network.rev211210.TerminationPoint1.class)
495                         .getOperationalState();
496                 State destTpState = nodes.get(j)
497                         .augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
498                             .ietf.network.topology.rev180226.Node1.class)
499                         .getTerminationPoint().values().stream()
500                         .filter(tp -> tp.getTpId().getValue().contains("CP") || tp.getTpId().getValue().contains("CTP"))
501                         .findFirst().get()
502                         .augmentation(org.opendaylight.yang.gen.v1.http
503                                 .org.openroadm.common.network.rev211210.TerminationPoint1.class)
504                         .getOperationalState();
505                 if (State.InService.equals(srcTpState) && State.InService.equals(destTpState)) {
506                     ocnAzLinkBldr.setAdministrativeState(AdminStates.InService)
507                             .setOperationalState(State.InService);
508                     ocnZaLinkBldr.setAdministrativeState(AdminStates.InService)
509                             .setOperationalState(State.InService);
510                 } else {
511                     ocnAzLinkBldr.setAdministrativeState(AdminStates.OutOfService)
512                             .setOperationalState(State.OutOfService);
513                     ocnZaLinkBldr.setAdministrativeState(AdminStates.OutOfService)
514                             .setOperationalState(State.OutOfService);
515                 }
516                 // set opposite link augmentations
517                 LinkBuilder ietfAzLinkBldr = createLink(srcNode, destNode, srcTp, destTp);
518                 LinkBuilder ietfZaLinkBldr = createLink(destNode, srcNode, destTp, srcTp);
519                 ocnAzLinkBldr.setOppositeLink(ietfZaLinkBldr.getLinkId());
520                 ietfAzLinkBldr.addAugmentation(ocnAzLinkBldr.build());
521                 ocnZaLinkBldr.setOppositeLink(ietfAzLinkBldr.getLinkId());
522                 ietfZaLinkBldr.addAugmentation(ocnZaLinkBldr.build());
523                 links.add(ietfAzLinkBldr.build());
524                 links.add(ietfZaLinkBldr.build());
525             }
526         }
527         return links;
528     }
529
530     // This method returns the linkBuilder object for given source and destination
531     public static boolean deleteLink(String srcNode, String dstNode, String srcTp, String destTp,
532                                      NetworkTransactionService networkTransactionService) {
533         LOG.info("deleting link for {}-{}", srcNode, dstNode);
534         LinkId linkId = LinkIdUtil.buildLinkId(srcNode, srcTp, dstNode, destTp);
535         if (deleteLinkLinkId(linkId, networkTransactionService)) {
536             LOG.debug("Link Id {} updated to have admin state down", linkId);
537             return true;
538         } else {
539             LOG.debug("Link Id not found for Source {} and Dest {}", srcNode, dstNode);
540             return false;
541         }
542     }
543
544     // This method returns the linkBuilder object for given source and destination
545     public static boolean deleteLinkLinkId(LinkId linkId , NetworkTransactionService networkTransactionService) {
546         LOG.info("deleting link for LinkId: {}", linkId.getValue());
547         try {
548             InstanceIdentifierBuilder<Link> linkIID = InstanceIdentifier.builder(Networks.class)
549                 .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
550                 .augmentation(Network1.class)
551                 .child(Link.class, new LinkKey(linkId));
552             java.util.Optional<Link> link =
553                     networkTransactionService.read(LogicalDatastoreType.CONFIGURATION,linkIID.build()).get();
554             if (link.isPresent()) {
555                 LinkBuilder linkBuilder = new LinkBuilder(link.get());
556                 org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Link1Builder link1Builder =
557                     new org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Link1Builder(
558                         linkBuilder
559                             .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210
560                                 .Link1.class));
561                 linkBuilder.removeAugmentation(Link1.class)
562                         .addAugmentation(link1Builder.build());
563                 networkTransactionService.merge(LogicalDatastoreType.CONFIGURATION, linkIID.build(),
564                         linkBuilder.build());
565                 networkTransactionService.commit().get(1, TimeUnit.SECONDS);
566                 return true;
567             // TODO use guard clause style to decrease indentation in the previous block
568             } else {
569                 LOG.error("No link found for given LinkId: {}", linkId);
570                 return false;
571             }
572
573         } catch (InterruptedException | ExecutionException | TimeoutException e) {
574             LOG.error("Error deleting link {}", linkId.getValue(), e);
575             return false;
576         }
577     }
578
579     /**
580      * Get a builder for instance identifier related to common network termination point.
581      * @param nodeId String
582      * @param tpId String
583      * @return InstanceIdentifierBuilder
584      */
585     public static InstanceIdentifierBuilder<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210
586             .TerminationPoint1> createCommonNetworkTerminationPointIIDBuilder(String nodeId, String tpId) {
587         return InstanceIdentifier.builder(Networks.class)
588                 .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
589                 .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226
590                          .networks.network.Node.class,
591                     new NodeKey(new NodeId(nodeId)))
592                 .augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
593                     .Node1.class)
594                 .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks
595                          .network.node.TerminationPoint.class,
596                     new TerminationPointKey(new TpId(tpId)))
597                 .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210
598                         .TerminationPoint1.class);
599     }
600
601     /**
602      * Get a builder for instance identifier related to network termination point.
603      * @param nodeId String
604      * @param tpId String
605      * @return InstanceIdentifierBuilder
606      */
607     public static InstanceIdentifierBuilder<TerminationPoint1> createNetworkTerminationPointIIDBuilder(String nodeId,
608                                                                                                        String tpId) {
609         return InstanceIdentifier.builder(Networks.class)
610                 .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
611                 .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226
612                         .networks.network.Node.class,
613                     new NodeKey(new NodeId(nodeId)))
614                 .augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
615                         .Node1.class)
616                 .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
617                         .networks.network.node.TerminationPoint.class,
618                     new TerminationPointKey(new TpId(tpId)))
619                 .augmentation(TerminationPoint1.class);
620     }
621
622     /**
623      * Get an instance identifier related to network node.
624      * @param nodeId String
625      * @return InstanceIdentifier
626      */
627     public static InstanceIdentifier<Node1> createNetworkNodeIID(String nodeId) {
628         return InstanceIdentifier.builder(Networks.class)
629                 .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
630                 .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226
631                         .networks.network.Node.class,
632                      new NodeKey(new NodeId(nodeId)))
633                 .augmentation(Node1.class).build();
634     }
635
636     /**
637      * Get an instance identifier related to common network node.
638      * @param nodeId String
639      * @return InstanceIdentifier
640      */
641     public static InstanceIdentifier<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210
642             .Node1> createCommonNetworkNodeIID(String nodeId) {
643         return InstanceIdentifier.builder(Networks.class)
644                 .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
645                 .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226
646                         .networks.network.Node.class,
647                     new NodeKey(new NodeId(nodeId)))
648                 .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1.class)
649                 .build();
650     }
651 }