Refactor SupportedIfCapability usage
[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.ArrayList;
11 import java.util.List;
12 import java.util.Map;
13 import java.util.concurrent.ExecutionException;
14 import java.util.concurrent.TimeUnit;
15 import java.util.concurrent.TimeoutException;
16 import java.util.stream.Collectors;
17 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
18 import org.opendaylight.transportpce.common.NetworkUtils;
19 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
20 import org.opendaylight.transportpce.networkmodel.dto.TopologyShard;
21 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
22 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1;
23 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1Builder;
24 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1;
25 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1Builder;
26 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
27 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
31 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.NetworkKey;
33 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.NodeKey;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.LinkId;
36 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Network1;
37 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1;
38 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
39 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link;
40 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.LinkBuilder;
41 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.LinkKey;
42 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.link.DestinationBuilder;
43 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.link.SourceBuilder;
44 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
45 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointBuilder;
46 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointKey;
47 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
48 import org.slf4j.Logger;
49 import org.slf4j.LoggerFactory;
50
51 public final class TopologyUtils {
52
53     private static final Logger LOG = LoggerFactory.getLogger(TopologyUtils.class);
54
55     private TopologyUtils() {
56     }
57
58     // This method returns the linkBuilder object for given source and destination
59     public static LinkBuilder createLink(String srcNode, String dstNode, String srcTp, String destTp,
60         String otnPrefix) {
61
62         // Create Destination for link
63         DestinationBuilder dstNodeBldr = new DestinationBuilder()
64             .setDestTp(new TpId(destTp))
65             .setDestNode(new NodeId(dstNode));
66
67         // Create Source for the link
68         SourceBuilder srcNodeBldr = new SourceBuilder()
69             .setSourceNode(new NodeId(srcNode))
70             .setSourceTp(new TpId(srcTp));
71
72         LinkId linkId;
73         LinkId oppositeLinkId;
74         if (otnPrefix == null) {
75             linkId = LinkIdUtil.buildLinkId(srcNode, srcTp, dstNode, destTp);
76             oppositeLinkId = LinkIdUtil.buildLinkId(dstNode, destTp, srcNode, srcTp);
77         } else {
78             linkId = LinkIdUtil.buildOtnLinkId(srcNode, srcTp, dstNode, destTp, otnPrefix);
79             oppositeLinkId = LinkIdUtil.buildOtnLinkId(dstNode, destTp, srcNode, srcTp, otnPrefix);
80         }
81         //set opposite link
82         Link1 lnk1 = new Link1Builder().setOppositeLink(oppositeLinkId).build();
83
84         // set link builder attribute
85         LinkBuilder lnkBldr = new LinkBuilder()
86             .setDestination(dstNodeBldr.build())
87             .setSource(srcNodeBldr.build())
88             .setLinkId(linkId)
89             .withKey(new LinkKey(linkId))
90             .addAugmentation(lnk1);
91         return lnkBldr;
92     }
93
94     // This method returns the linkBuilder object for given source and destination
95     public static boolean deleteLink(String srcNode, String dstNode, String srcTp, String destTp,
96                                      NetworkTransactionService networkTransactionService) {
97         LOG.info("deleting link for {}-{}", srcNode, dstNode);
98         LinkId linkId = LinkIdUtil.buildLinkId(srcNode, srcTp, dstNode, destTp);
99         if (deleteLinkLinkId(linkId, networkTransactionService)) {
100             LOG.debug("Link Id {} updated to have admin state down", linkId);
101             return true;
102         } else {
103             LOG.debug("Link Id not found for Source {} and Dest {}", srcNode, dstNode);
104             return false;
105         }
106     }
107
108     // This method returns the linkBuilder object for given source and destination
109     public static boolean deleteLinkLinkId(LinkId linkId , NetworkTransactionService networkTransactionService) {
110         LOG.info("deleting link for LinkId: {}", linkId.getValue());
111         try {
112             InstanceIdentifier.InstanceIdentifierBuilder<Link> linkIID = InstanceIdentifier.builder(Networks.class)
113                 .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
114                 .augmentation(Network1.class).child(Link.class, new LinkKey(linkId));
115             java.util.Optional<Link> link =
116                 networkTransactionService.read(LogicalDatastoreType.CONFIGURATION,linkIID.build()).get();
117             if (link.isPresent()) {
118                 LinkBuilder linkBuilder = new LinkBuilder(link.get());
119                 Link1Builder link1Builder = new Link1Builder(linkBuilder.augmentation(Link1.class));
120                 linkBuilder.removeAugmentation(Link1.class);
121                 linkBuilder.addAugmentation(link1Builder.build());
122                 networkTransactionService.merge(LogicalDatastoreType.CONFIGURATION, linkIID.build(),
123                     linkBuilder.build());
124                 networkTransactionService.commit().get(1, TimeUnit.SECONDS);
125                 return true;
126             } else {
127                 LOG.error("No link found for given LinkId: {}",
128                     linkId);
129                 return false;
130             }
131
132         } catch (InterruptedException | ExecutionException | TimeoutException e) {
133             LOG.error("Error deleting link {}", linkId.getValue(), e);
134             return false;
135         }
136     }
137
138     public static AdminStates setNetworkAdminState(String adminState) {
139         if (adminState == null) {
140             return null;
141         }
142         switch (adminState) {
143             case "InService":
144                 return AdminStates.InService;
145             case "OutOfService":
146                 return AdminStates.OutOfService;
147             case "Maintenance":
148                 return AdminStates.Maintenance;
149             default:
150                 return null;
151         }
152     }
153
154     public static State setNetworkOperState(String operState) {
155         if (operState == null) {
156             return null;
157         }
158         switch (operState) {
159             case "InService":
160                 return State.InService;
161             case "OutOfService":
162                 return State.OutOfService;
163             case "Degraded":
164                 return State.Degraded;
165             default:
166                 return null;
167         }
168     }
169
170     public static TopologyShard updateTopologyShard(String abstractNodeid, Mapping mapping, Map<NodeKey, Node> nodes,
171             Map<LinkKey, Link> links) {
172         // update termination-point corresponding to the mapping
173         List<TerminationPoint> topoTps = new ArrayList<>();
174         TerminationPoint tp = nodes.get(new NodeKey(new NodeId(abstractNodeid))).augmentation(Node1.class)
175             .getTerminationPoint().get(new TerminationPointKey(new TpId(mapping.getLogicalConnectionPoint())));
176         TerminationPoint1Builder tp1Bldr = new TerminationPoint1Builder(tp.augmentation(TerminationPoint1.class));
177         if (!tp1Bldr.getAdministrativeState().getName().equals(mapping.getPortAdminState())) {
178             tp1Bldr.setAdministrativeState(AdminStates.valueOf(mapping.getPortAdminState()));
179         }
180         if (!tp1Bldr.getOperationalState().getName().equals(mapping.getPortOperState())) {
181             tp1Bldr.setOperationalState(State.valueOf(mapping.getPortOperState()));
182         }
183         TerminationPointBuilder tpBldr = new TerminationPointBuilder(tp).addAugmentation(tp1Bldr.build());
184         topoTps.add(tpBldr.build());
185
186         if (links == null) {
187             return new TopologyShard(null, null, topoTps);
188         }
189         String tpId = tpBldr.getTpId().getValue();
190         // update links terminating on the given termination-point
191         List<Link> filteredTopoLinks = links.values().stream()
192             .filter(l1 -> (l1.getSource().getSourceNode().getValue().equals(abstractNodeid)
193                 && l1.getSource().getSourceTp().getValue().equals(tpId))
194                 || (l1.getDestination().getDestNode().getValue().equals(abstractNodeid)
195                 && l1.getDestination().getDestTp().getValue().equals(tpId)))
196             .collect(Collectors.toList());
197         List<Link> topoLinks = new ArrayList<>();
198         for (Link link : filteredTopoLinks) {
199             TerminationPoint otherLinkTp;
200             if (link.getSource().getSourceNode().getValue().equals(abstractNodeid)) {
201                 otherLinkTp = nodes
202                     .get(new NodeKey(new NodeId(link.getDestination().getDestNode().getValue())))
203                     .augmentation(Node1.class)
204                     .getTerminationPoint()
205                     .get(new TerminationPointKey(new TpId(link.getDestination().getDestTp().getValue())));
206             } else {
207                 otherLinkTp = nodes
208                     .get(new NodeKey(new NodeId(link.getSource().getSourceNode().getValue())))
209                     .augmentation(Node1.class)
210                     .getTerminationPoint()
211                     .get(new TerminationPointKey(new TpId(link.getSource().getSourceTp().getValue())));
212             }
213             Link1Builder link1Bldr = new Link1Builder(link.augmentation(Link1.class));
214             if (tpBldr.augmentation(TerminationPoint1.class).getAdministrativeState().equals(AdminStates.InService)
215                 && otherLinkTp.augmentation(TerminationPoint1.class)
216                     .getAdministrativeState().equals(AdminStates.InService)) {
217                 link1Bldr.setAdministrativeState(AdminStates.InService);
218             } else {
219                 link1Bldr.setAdministrativeState(AdminStates.OutOfService);
220             }
221             if (tpBldr.augmentation(TerminationPoint1.class).getOperationalState().equals(State.InService)
222                 && otherLinkTp.augmentation(TerminationPoint1.class)
223                     .getOperationalState().equals(State.InService)) {
224                 link1Bldr.setOperationalState(State.InService);
225             } else {
226                 link1Bldr.setOperationalState(State.OutOfService);
227             }
228             topoLinks.add(new LinkBuilder(link).addAugmentation(link1Bldr.build()).build());
229         }
230         return new TopologyShard(null, topoLinks, topoTps);
231     }
232 }