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.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;
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;
87 public class OpenRoadmOtnTopology22 {
89 private static final Logger LOG = LoggerFactory.getLogger(OpenRoadmTopology22.class);
91 private NetworkTransactionService networkTransactionService;
92 private final DeviceTransactionManager deviceTransactionManager;
94 public OpenRoadmOtnTopology22(NetworkTransactionService networkTransactionService,
95 DeviceTransactionManager deviceTransactionManager) {
96 this.networkTransactionService = networkTransactionService;
97 this.deviceTransactionManager = deviceTransactionManager;
101 * This public method creates the OTN OpenROADM Topology
102 * Layer and posts it to the controller.
104 public void createTopoLayer() {
106 Network openRoadmOtnTopology = createOpenRoadmOtnTopology();
107 InstanceIdentifierBuilder<Network> nwIID = InstanceIdentifier.builder(Networks.class).child(Network.class,
108 new NetworkKey(new NetworkId(NetworkUtils.OTN_NETWORK_ID)));
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);
119 * Create empty OpenROADM topology.
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()
133 .withKey(new NetworkKey(nwId))
134 .setNetworkTypes(nwTypeBuilder.build())
135 .addAugmentation(Network1.class, nwBldr1.build())
136 .setNode(Collections.emptyList());
137 return nwBuilder.build();
140 public TopologyShard createTopologyShard(Nodes mappingNode) {
141 List<Node> nodes = new ArrayList<>();
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();
155 LOG.error("Unable to get xponder for the device {}", mappingNode.getNodeId());
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());
169 LOG.info("Coming to return topology");
170 return new TopologyShard(nodes, null);
172 LOG.error("Device node Type not managed yet");
176 private NodeBuilder createXpdr(Xponder xponder,Nodes mappingNode) {
178 String nodeIdtopo = new StringBuilder().append(mappingNode.getNodeId()).append("-XPDR" + xponder
179 .getXpdrNumber()).toString();
180 LOG.info("Node is {}",nodeIdtopo);
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());
197 ietfNodeBldr.addAugmentation(Node1.class, ontNode1Bldr.build());
200 LOG.info("Now createing TP list");
201 List<TerminationPoint> tpList = new ArrayList<>();
202 TerminationPointBuilder ietfTpBldr;
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);
217 else if (ma.getRate().equals("1G")) {
218 xpdrTpBuilder.setRate(ODU0.class);
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);
227 LOG.warn("no rate in portmapping for lcp {} of {}", ma.getLogicalConnectionPoint(),
228 mappingNode.getNodeId());
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);
241 else if (ma.getRate().equals("1G")) {
242 xpdrTpBuilder.setRate(ODU0.class);
244 else if (ma.getRate().equals("100G")) {
245 xpdrTpBuilder.setRate(ODU4.class);
248 LOG.warn("no rate in portmapping for lcp {} of {}", ma.getLogicalConnectionPoint(),
249 mappingNode.getNodeId());
251 xpdrTpBuilder.setTailEquipmentId(ma.getConnectionMapLcp());
252 ontTp1Bldr.setXpdrTpPortConnectionAttributes(xpdrTpBuilder.build());
253 ietfTpBldr.addAugmentation(TerminationPoint1.class, ontTp1Bldr.build());
254 tpList.add(ietfTpBldr.build());
257 for (int i = 0;i < tpList.size();i++) {
258 LOG.info("Tps are {},{}",tpList.get(i).getTpId());
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,
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");
276 private NodeBuilder createOtnTopoLayerNode(String nodeId) {
277 // Sets the value of Network-ref and Node-ref as a part of the supporting node
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");
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));
299 private LinkBuilder createLink(String srcNode, String destNode, String srcTp, String destTp) {
301 SourceBuilder ietfSrcLinkBldr = new SourceBuilder()
302 .setSourceNode(new NodeId(srcNode))
304 //create destination link
305 DestinationBuilder ietfDestLinkBldr = new DestinationBuilder()
306 .setDestNode(new NodeId(destNode))
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()));
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()));
348 nonBlockingListBuilder.setTpList(tpList);
349 nonBlockingLists.add(nonBlockingListBuilder.build());
351 LOG.warn("no portList for non-blocking-list {} of {}", nbList.getNblNumber(), nodeId);
354 oduSwitchingPoolsBuilder.setNonBlockingList(nonBlockingLists)
355 .setSwitchingPoolNumber(odupool.getSwitchingPoolNumber())
356 .setSwitchingPoolType(SwitchingPoolTypes.forValue(odupool.getSwitchingPoolType().getIntValue()));
357 oduSwitchingPools.add(oduSwitchingPoolsBuilder.build());
359 return oduSwitchingPools;
361 LOG.error("Unable to get xponder for the device {}", nodeId);
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");
375 LOG.debug("Link Id not found for Source {} and Dest {}", srcNode, dstNode);
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);
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);
399 LOG.error("No link found for given LinkId: {}", linkId);
402 } catch (InterruptedException | ExecutionException | TimeoutException e) {
403 LOG.error(e.getMessage(), e);