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