Prepare NetworkModel to support ordm 2.2.x devices
[transportpce.git] / networkmodel / src / main / java / org / opendaylight / transportpce / networkmodel / util / TopologyUtils.java
1 /*
2  * Copyright © 2019 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 package org.opendaylight.transportpce.networkmodel.util;
9
10 import java.util.concurrent.ExecutionException;
11 import java.util.concurrent.TimeUnit;
12 import java.util.concurrent.TimeoutException;
13
14 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
15 import org.opendaylight.transportpce.common.NetworkUtils;
16 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
17 //import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev181130.Link1;
18 //import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev181130.State;
19 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev170929.State;
20 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev170929.Link1;
21 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev170929.Link1Builder;
22 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev170929.network.link.OMSAttributesBuilder;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.Network;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.NetworkId;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.NetworkKey;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.NodeId;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.LinkId;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.Network1;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.network.Link;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.network.LinkBuilder;
31 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.network.LinkKey;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.network.link.DestinationBuilder;
33 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.network.link.SourceBuilder;
34 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
37
38 public  final class TopologyUtils {
39
40     private static final Logger LOG = LoggerFactory.getLogger(TopologyUtils.class);
41
42     private TopologyUtils() {
43     }
44
45     // This method returns the linkBuilder object for given source and destination
46     public static LinkBuilder createLink(String srcNode, String dstNode, String srcTp, String destTp) {
47
48         // Create Destination for link
49         DestinationBuilder dstNodeBldr = new DestinationBuilder();
50         dstNodeBldr.setDestTp(destTp);
51         dstNodeBldr.setDestNode(new NodeId(dstNode));
52
53         // Create Source for the link
54         SourceBuilder srcNodeBldr = new SourceBuilder();
55         srcNodeBldr.setSourceNode(new NodeId(srcNode));
56         srcNodeBldr.setSourceTp(srcTp);
57
58         // set link builder attribute
59         LinkBuilder lnkBldr = new LinkBuilder();
60
61         lnkBldr.setDestination(dstNodeBldr.build());
62         lnkBldr.setSource(srcNodeBldr.build());
63         lnkBldr.setLinkId(LinkIdUtil.buildLinkId(srcNode, srcTp, dstNode, destTp));
64         lnkBldr.withKey(new LinkKey(lnkBldr.getLinkId()));
65
66         //set Oms Attributes
67         Link1Builder lnk1Bldr =
68             new Link1Builder();
69         OMSAttributesBuilder omsAttributesBuilder = new OMSAttributesBuilder();
70         LinkId oppositeLinkId = LinkIdUtil.getOppositeLinkId(srcNode, srcTp, dstNode, destTp);
71         omsAttributesBuilder.setOppositeLink(oppositeLinkId);
72         lnk1Bldr.setOMSAttributes(omsAttributesBuilder.build());
73         lnkBldr.addAugmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev170929
74                 .Link1.class,lnk1Bldr.build());
75
76         return lnkBldr;
77     }
78
79     // This method returns the linkBuilder object for given source and destination
80     public static boolean deleteLink(String srcNode, String dstNode, String srcTp, String destTp,
81                                      NetworkTransactionService networkTransactionService) {
82         LOG.info("deleting link for {}-{}", srcNode, dstNode);
83         LinkId linkId = LinkIdUtil.buildLinkId(srcNode, srcTp, dstNode, destTp);
84         if (deleteLinkLinkId(linkId, networkTransactionService)) {
85             LOG.debug("Link Id {} updated to have admin state down");
86             return true;
87         } else {
88             LOG.debug("Link Id not found for Source {} and Dest {}", srcNode, dstNode);
89             return false;
90         }
91     }
92
93     // This method returns the linkBuilder object for given source and destination
94     public static boolean deleteLinkLinkId(LinkId linkId , NetworkTransactionService networkTransactionService) {
95         LOG.info("deleting link for LinkId: {}", linkId);
96         try {
97             InstanceIdentifier.InstanceIdentifierBuilder<Link> linkIID = InstanceIdentifier.builder(Network.class,
98                 new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))).augmentation(Network1.class)
99                 .child(Link.class, new LinkKey(linkId));
100             com.google.common.base.Optional<Link> link =
101                 networkTransactionService.read(LogicalDatastoreType.CONFIGURATION,linkIID.build()).get();
102             if (link.isPresent()) {
103                 LinkBuilder linkBuilder = new LinkBuilder(link.get());
104                 Link1Builder link1Builder = new Link1Builder(linkBuilder.augmentation(org.opendaylight.yang.gen.v1
105                         .http.org.openroadm.network.topology.rev170929.Link1.class));
106                 link1Builder.setAdministrativeState(State.OutOfService);
107                 linkBuilder.removeAugmentation(Link1.class);
108                 linkBuilder.addAugmentation(Link1.class,link1Builder.build());
109                 networkTransactionService.merge(LogicalDatastoreType.CONFIGURATION, linkIID.build(),
110                     linkBuilder.build());
111                 networkTransactionService.submit().get(1, TimeUnit.SECONDS);
112                 return true;
113             } else {
114                 LOG.error("No link found for given LinkId: {}",
115                     linkId);
116                 return false;
117             }
118
119         } catch (InterruptedException | ExecutionException | TimeoutException e) {
120             LOG.error(e.getMessage(), e);
121             return false;
122         }
123     }
124 }