upgrade portmapping YANG to introduce OTN
[transportpce.git] / networkmodel / src / main / java / org / opendaylight / transportpce / networkmodel / util / OpenRoadmOtnTopology22.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.Collections;
13 import java.util.List;
14 import java.util.Optional;
15 import java.util.concurrent.ExecutionException;
16 import java.util.concurrent.TimeUnit;
17 import java.util.concurrent.TimeoutException;
18 import java.util.stream.Collectors;
19 import java.util.stream.IntStream;
20
21 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
22 import org.opendaylight.transportpce.common.NetworkUtils;
23 import org.opendaylight.transportpce.common.Timeouts;
24 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
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.rev200113.network.Nodes;
28 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev200113.network.nodes.Mapping;
29 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.NetworkTypes1;
30 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.NetworkTypes1Builder;
31 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.networks.network.network.types.OpenroadmCommonNetworkBuilder;
32 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev181130.State;
33 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.NodeTypes;
34 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.XpdrNodeTypes;
35 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.OrgOpenroadmDevice;
36 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.org.openroadm.device.Xponder;
37 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.org.openroadm.device.odu.switching.pools.non.blocking.list.PortList;
38 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.xponder.XpdrPort;
39 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev181130.xpdr.odu.switching.pools.OduSwitchingPools;
40 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev181130.xpdr.odu.switching.pools.OduSwitchingPoolsBuilder;
41 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev181130.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingList;
42 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev181130.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListBuilder;
43 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev181130.OpenroadmNodeType;
44 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev181130.OpenroadmTpType;
45 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev181130.ODU0;
46 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev181130.ODU2e;
47 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev181130.ODU4;
48 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev181130.Link1;
49 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev181130.Link1Builder;
50 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev181130.Node1;
51 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev181130.Node1Builder;
52 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev181130.TerminationPoint1;
53 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev181130.TerminationPoint1Builder;
54 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev181130.networks.network.node.SwitchingPoolsBuilder;
55 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev181130.networks.network.node.termination.point.XpdrTpPortConnectionAttributesBuilder;
56 import org.opendaylight.yang.gen.v1.http.org.openroadm.switching.pool.types.rev181130.SwitchingPoolTypes;
57 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
58 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
59 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
60 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network;
61 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.NetworkBuilder;
62 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.NetworkKey;
63 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.NetworkTypesBuilder;
64 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
65 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.NodeBuilder;
66 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.NodeKey;
67 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNode;
68 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNodeBuilder;
69 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNodeKey;
70 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.LinkId;
71 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Network1;
72 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Network1Builder;
73 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
74 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link;
75 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.LinkBuilder;
76 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.LinkKey;
77 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.link.DestinationBuilder;
78 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.link.SourceBuilder;
79 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
80 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointBuilder;
81 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointKey;
82 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
83 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
84 import org.slf4j.Logger;
85 import org.slf4j.LoggerFactory;
86
87 public class OpenRoadmOtnTopology22 {
88
89     private static final Logger LOG = LoggerFactory.getLogger(OpenRoadmTopology22.class);
90
91     private NetworkTransactionService networkTransactionService;
92     private final DeviceTransactionManager deviceTransactionManager;
93
94     public OpenRoadmOtnTopology22(NetworkTransactionService networkTransactionService,
95                                DeviceTransactionManager deviceTransactionManager) {
96         this.networkTransactionService = networkTransactionService;
97         this.deviceTransactionManager = deviceTransactionManager;
98     }
99
100     /**
101      * This public method creates the OTN OpenROADM Topology
102      * Layer and posts it to the controller.
103      */
104     public void createTopoLayer() {
105         try {
106             Network openRoadmOtnTopology = createOpenRoadmOtnTopology();
107             InstanceIdentifierBuilder<Network> nwIID = InstanceIdentifier.builder(Networks.class).child(Network.class,
108                     new NetworkKey(new NetworkId(NetworkUtils.OTN_NETWORK_ID)));
109
110             this.networkTransactionService.put(LogicalDatastoreType.CONFIGURATION, nwIID.build(), openRoadmOtnTopology);
111             this.networkTransactionService.commit().get(1, TimeUnit.SECONDS);
112             LOG.info("OpenRoadm-OTN-Topology created successfully.");
113         } catch (ExecutionException | TimeoutException | InterruptedException e) {
114             LOG.warn("Failed to create OpenRoadm-OTN-Topology", e);
115         }
116     }
117
118     /**
119      * Create empty OpenROADM topology.
120      */
121     private Network createOpenRoadmOtnTopology() {
122         NetworkId nwId = new NetworkId(NetworkUtils.OTN_NETWORK_ID);
123         NetworkTypes1Builder topoNetworkTypesBldr = new NetworkTypes1Builder()
124                 .setOpenroadmCommonNetwork(new OpenroadmCommonNetworkBuilder().build());
125         NetworkTypesBuilder nwTypeBuilder = new NetworkTypesBuilder()
126                 .addAugmentation(NetworkTypes1.class, topoNetworkTypesBldr.build());
127         // Array to store nodes in the topolayer of a roadm/Xponder
128         Network1Builder nwBldr1 = new Network1Builder()
129                 // adding expressLinks
130                 .setLink(Collections.emptyList());
131         NetworkBuilder nwBuilder = new NetworkBuilder()
132                 .setNetworkId(nwId)
133                 .withKey(new NetworkKey(nwId))
134                 .setNetworkTypes(nwTypeBuilder.build())
135                 .addAugmentation(Network1.class, nwBldr1.build())
136                 .setNode(Collections.emptyList());
137         return nwBuilder.build();
138     }
139
140     public TopologyShard createTopologyShard(Nodes mappingNode) {
141         List<Node> nodes = new ArrayList<>();
142
143         LOG.info("Topology create request received for Node {}",mappingNode.getNodeId());
144         InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class);
145         //  .child(Xponder.class,new XponderKey(2));
146         Optional<OrgOpenroadmDevice> deviceOptional = deviceTransactionManager
147             .getDataFromDevice(mappingNode.getNodeId(),LogicalDatastoreType.OPERATIONAL, deviceIID,
148             Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
149         OrgOpenroadmDevice device;
150         List<Xponder> xponders;
151         if (deviceOptional.isPresent()) {
152             device = deviceOptional.get();
153             xponders = device.getXponder();
154         } else {
155             LOG.error("Unable to get xponder for the device {}", mappingNode.getNodeId());
156             return null;
157         }
158         LOG.info("Xponder subtree is found and now calling create XPDR");
159         if (NodeTypes.Xpdr.getIntValue() ==  mappingNode.getNodeInfo().getNodeType().getIntValue()) {
160             // Check if node is XPONDER
161             LOG.info("creating xpdr node in openroadmotntopology for node {}", mappingNode.getNodeId());
162             if (xponders != null) {
163                 for (Xponder xponder: xponders) {
164                     LOG.info("Calling create XPDR for xponder number {}",xponder.getXpdrNumber());
165                     NodeBuilder ietfNode = createXpdr(xponder,mappingNode);
166                     nodes.add(ietfNode.build());
167                 }
168             }
169             LOG.info("Coming to return topology");
170             return new TopologyShard(nodes, null);
171         }
172         LOG.error("Device node Type not managed yet");
173         return null;
174     }
175
176     private NodeBuilder createXpdr(Xponder xponder,Nodes mappingNode) {
177         // set node-id
178         String nodeIdtopo = new StringBuilder().append(mappingNode.getNodeId()).append("-XPDR" + xponder
179             .getXpdrNumber()).toString();
180         LOG.info("Node is {}",nodeIdtopo);
181
182         // Create ietf node setting supporting-node data
183         NodeBuilder ietfNodeBldr = createOtnTopoLayerNode(mappingNode.getNodeId())
184             .setNodeId(new NodeId(nodeIdtopo))
185             .withKey((new NodeKey(new NodeId(nodeIdtopo))));
186         // Create openroadm-network-topo augmentation to set node type to Xponder
187         Node1Builder ontNode1Bldr = new Node1Builder()
188             .setNodeType(OpenroadmNodeType.XPONDER);
189         if (xponder.getXpdrType().equals(XpdrNodeTypes.Switch)) {
190             LOG.info("Xponder type is OTN switch and it is calling switching pool");
191             SwitchingPoolsBuilder switchingPoolsBuilder = new SwitchingPoolsBuilder()
192                 .setOduSwitchingPools(getSwitchingPools(mappingNode.getNodeId(), mappingNode));
193             ontNode1Bldr.setSwitchingPools(switchingPoolsBuilder.build());
194             LOG.info("Switching pool object is created {}",
195                 switchingPoolsBuilder.build().getOduSwitchingPools().size());
196         }
197         ietfNodeBldr.addAugmentation(Node1.class, ontNode1Bldr.build());
198
199         // Create tp-list
200         LOG.info("Now createing TP list");
201         List<TerminationPoint> tpList = new ArrayList<>();
202         TerminationPointBuilder ietfTpBldr;
203
204         for (XpdrPort xponderPort: xponder.getXpdrPort()) {
205             Mapping ma = mappingNode.getMapping().stream().filter(x -> x.getSupportingCircuitPackName()
206                     .equals(xponderPort.getCircuitPackName()) && x.getSupportingPort()
207                     .equals(xponderPort.getPortName())).collect(Collectors.toList()).get(0);
208             ietfTpBldr = createTpBldr(ma.getLogicalConnectionPoint());
209             TerminationPoint1Builder ontTp1Bldr = new TerminationPoint1Builder();
210             if (ma.getPortQual().equals("xpdr-network") || ma.getPortQual().equals("switch-network")) {
211                 ontTp1Bldr.setTpType(OpenroadmTpType.XPONDERNETWORK);
212                 XpdrTpPortConnectionAttributesBuilder xpdrTpBuilder = new XpdrTpPortConnectionAttributesBuilder();
213                 if (ma.getPortQual().equals("switch-network") && ma.getRate() != null) {
214                     if (ma.getRate().equals("10G")) {
215                         xpdrTpBuilder.setRate(ODU2e.class);
216                     }
217                     else if (ma.getRate().equals("1G")) {
218                         xpdrTpBuilder.setRate(ODU0.class);
219                     }
220                     else if (ma.getRate().equals("100G")) {
221                         xpdrTpBuilder.setRate(ODU4.class);
222                         List<Integer> tpSlots = new ArrayList<Integer>();
223                         IntStream.range(1, 81).forEach(nbr -> tpSlots.add(nbr));
224                         xpdrTpBuilder.setTsPool(tpSlots);
225                     }
226                 } else {
227                     LOG.warn("no rate in portmapping for lcp {} of {}", ma.getLogicalConnectionPoint(),
228                         mappingNode.getNodeId());
229                 }
230                 xpdrTpBuilder.setTailEquipmentId(ma.getConnectionMapLcp());
231                 ontTp1Bldr.setXpdrTpPortConnectionAttributes(xpdrTpBuilder.build());
232                 ietfTpBldr.addAugmentation(TerminationPoint1.class, ontTp1Bldr.build());
233                 tpList.add(ietfTpBldr.build());
234             } else if (ma.getPortQual().equals("xpdr-client") || ma.getPortQual().equals("switch-client")) {
235                 ontTp1Bldr.setTpType(OpenroadmTpType.XPONDERCLIENT);
236                 XpdrTpPortConnectionAttributesBuilder xpdrTpBuilder = new XpdrTpPortConnectionAttributesBuilder();
237                 if (ma.getPortQual().equals("switch-client") && ma.getRate() != null) {
238                     if (ma.getRate().equals("10G")) {
239                         xpdrTpBuilder.setRate(ODU2e.class);
240                     }
241                     else if (ma.getRate().equals("1G")) {
242                         xpdrTpBuilder.setRate(ODU0.class);
243                     }
244                     else if (ma.getRate().equals("100G")) {
245                         xpdrTpBuilder.setRate(ODU4.class);
246                     }
247                 } else {
248                     LOG.warn("no rate in portmapping for lcp {} of {}", ma.getLogicalConnectionPoint(),
249                         mappingNode.getNodeId());
250                 }
251                 xpdrTpBuilder.setTailEquipmentId(ma.getConnectionMapLcp());
252                 ontTp1Bldr.setXpdrTpPortConnectionAttributes(xpdrTpBuilder.build());
253                 ietfTpBldr.addAugmentation(TerminationPoint1.class, ontTp1Bldr.build());
254                 tpList.add(ietfTpBldr.build());
255             }
256         }
257         for (int i = 0;i < tpList.size();i++) {
258             LOG.info("Tps are {},{}",tpList.get(i).getTpId());
259         }
260         // Create ietf node augmentation to support ietf tp-list
261         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1Builder tpNode1 =
262             new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1Builder();
263         tpNode1.setTerminationPoint(tpList);
264         ietfNodeBldr.addAugmentation(
265             org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class,
266             tpNode1.build());
267
268         /**Node1Builder ietfNode1 = new Node1Builder();
269         ietfNodeBldr.addAugmentation(
270                 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class,
271                 ietfNode1.build());**/
272         LOG.info("Now all TPS and network node is ready and calling return");
273         return ietfNodeBldr;
274     }
275
276     private NodeBuilder createOtnTopoLayerNode(String nodeId) {
277         // Sets the value of Network-ref and Node-ref as a part of the supporting node
278         // attribute
279         LOG.info("Settting up supporting node and interface");
280         SupportingNodeBuilder supportbldr = new SupportingNodeBuilder()
281             .withKey(new SupportingNodeKey(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID), new NodeId(nodeId)))
282             .setNetworkRef(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID))
283             .setNodeRef(new NodeId(nodeId));
284         ArrayList<SupportingNode> supportlist = new ArrayList<>();
285         supportlist.add(supportbldr.build());
286         NodeBuilder nodebldr = new NodeBuilder()
287             .setSupportingNode(supportlist);
288         LOG.info("Returning node builder");
289         return nodebldr;
290     }
291
292     // This method returns a generic termination point builder for a given tpid
293     private TerminationPointBuilder createTpBldr(String tpId) {
294         return new TerminationPointBuilder()
295             .withKey(new TerminationPointKey(new TpId(tpId)))
296             .setTpId(new TpId(tpId));
297     }
298
299     private LinkBuilder createLink(String srcNode, String destNode, String srcTp, String destTp) {
300         //create source link
301         SourceBuilder ietfSrcLinkBldr = new SourceBuilder()
302             .setSourceNode(new NodeId(srcNode))
303             .setSourceTp(srcTp);
304         //create destination link
305         DestinationBuilder ietfDestLinkBldr = new DestinationBuilder()
306             .setDestNode(new NodeId(destNode))
307             .setDestTp(destTp);
308
309         LinkBuilder ietfLinkBldr = new LinkBuilder()
310             .setSource(ietfSrcLinkBldr.build())
311             .setDestination(ietfDestLinkBldr.build())
312             .setLinkId(LinkIdUtil.buildLinkId(srcNode, srcTp, destNode, destTp));
313         return ietfLinkBldr.withKey(new LinkKey(ietfLinkBldr.getLinkId()));
314     }
315
316     private List<OduSwitchingPools> getSwitchingPools(String nodeId,Nodes mappingNode) {
317         InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class);
318         //  .child(Xponder.class,new XponderKey(2));
319         Optional<OrgOpenroadmDevice> deviceOptional = deviceTransactionManager.getDataFromDevice(nodeId,
320             LogicalDatastoreType.OPERATIONAL, deviceIID, Timeouts.DEVICE_READ_TIMEOUT,
321             Timeouts.DEVICE_READ_TIMEOUT_UNIT);
322         OrgOpenroadmDevice device;
323         List<OduSwitchingPools> oduSwitchingPools = new ArrayList<>();
324         if (deviceOptional.isPresent()) {
325             device = deviceOptional.get();
326             for (org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.org
327                 .openroadm.device.OduSwitchingPools odupool:device.getOduSwitchingPools()) {
328                 OduSwitchingPoolsBuilder oduSwitchingPoolsBuilder = new OduSwitchingPoolsBuilder();
329                 List<NonBlockingList> nonBlockingLists = new ArrayList<>();
330                 for (org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.org
331                     .openroadm.device.odu.switching.pools.NonBlockingList nbList: odupool.getNonBlockingList()) {
332                     NonBlockingListBuilder nonBlockingListBuilder = new NonBlockingListBuilder()
333                         .setNblNumber(nbList.getNblNumber())
334                         .setAvailableInterconnectBandwidth(nbList.getInterconnectBandwidth())
335                         .setInterconnectBandwidthUnit(nbList.getInterconnectBandwidth());
336                     List<TpId> tpList = new ArrayList<>();
337                     if (nbList.getPortList() != null) {
338                         for (PortList portList:nbList.getPortList()) {
339                             LOG.info("Inside switching pool now collecting ports {},{},{}", portList.getPortName(),
340                                 portList.getCircuitPackName(), nbList.getNblNumber());
341                             Mapping mapping = mappingNode.getMapping().stream()
342                                 .filter(x -> x.getSupportingCircuitPackName().equals(portList.getCircuitPackName())
343                                 && x.getSupportingPort().equals(portList.getPortName()))
344                                 .collect(Collectors.toList()).get(0);
345                             LOG.info("Mapping TP is coming is {}",mapping);
346                             tpList.add(new TpId(mapping.getLogicalConnectionPoint()));
347                         }
348                         nonBlockingListBuilder.setTpList(tpList);
349                         nonBlockingLists.add(nonBlockingListBuilder.build());
350                     } else {
351                         LOG.warn("no portList for non-blocking-list {} of {}", nbList.getNblNumber(), nodeId);
352                     }
353                 }
354                 oduSwitchingPoolsBuilder.setNonBlockingList(nonBlockingLists)
355                     .setSwitchingPoolNumber(odupool.getSwitchingPoolNumber())
356                     .setSwitchingPoolType(SwitchingPoolTypes.forValue(odupool.getSwitchingPoolType().getIntValue()));
357                 oduSwitchingPools.add(oduSwitchingPoolsBuilder.build());
358             }
359             return oduSwitchingPools;
360         } else {
361             LOG.error("Unable to get xponder for the device {}", nodeId);
362             return null;
363         }
364     }
365
366     // This method returns the linkBuilder object for given source and destination
367     public static boolean deleteLink(String srcNode, String dstNode, String srcTp, String destTp,
368                                      NetworkTransactionService networkTransactionService) {
369         LOG.info("deleting link for {}-{}", srcNode, dstNode);
370         LinkId linkId = LinkIdUtil.buildLinkId(srcNode, srcTp, dstNode, destTp);
371         if (deleteLinkLinkId(linkId, networkTransactionService)) {
372             LOG.debug("Link Id {} updated to have admin state down");
373             return true;
374         } else {
375             LOG.debug("Link Id not found for Source {} and Dest {}", srcNode, dstNode);
376             return false;
377         }
378     }
379
380     // This method returns the linkBuilder object for given source and destination
381     public static boolean deleteLinkLinkId(LinkId linkId , NetworkTransactionService networkTransactionService) {
382         LOG.info("deleting link for LinkId: {}", linkId);
383         try {
384             InstanceIdentifierBuilder<Link> linkIID = InstanceIdentifier.builder(Networks.class).child(Network.class,
385                 new NetworkKey(new NetworkId(NetworkUtils.OTN_NETWORK_ID))).augmentation(Network1.class)
386                 .child(Link.class, new LinkKey(linkId));
387             java.util.Optional<Link> link =
388                 networkTransactionService.read(LogicalDatastoreType.CONFIGURATION,linkIID.build()).get();
389             if (link.isPresent()) {
390                 Link1Builder link1Builder = new Link1Builder().setAdministrativeState(State.OutOfService);
391                 LinkBuilder linkBuilder = new LinkBuilder(link.get())
392                     .removeAugmentation(Link1.class)
393                     .addAugmentation(Link1.class,link1Builder.build());
394                 networkTransactionService.merge(LogicalDatastoreType.CONFIGURATION, linkIID.build(),
395                     linkBuilder.build());
396                 networkTransactionService.commit().get(1, TimeUnit.SECONDS);
397                 return true;
398             } else {
399                 LOG.error("No link found for given LinkId: {}", linkId);
400                 return false;
401             }
402         } catch (InterruptedException | ExecutionException | TimeoutException e) {
403             LOG.error(e.getMessage(), e);
404             return false;
405         }
406     }
407 }