2 * Copyright © 2019 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
8 package org.opendaylight.transportpce.networkmodel.util;
10 import java.util.ArrayList;
11 import java.util.List;
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.rev220114.mapping.Mapping;
22 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1;
23 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1Builder;
24 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.TerminationPoint1;
25 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.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;
51 public final class TopologyUtils {
53 private static final Logger LOG = LoggerFactory.getLogger(TopologyUtils.class);
55 private TopologyUtils() {
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,
62 // Create Destination for link
63 DestinationBuilder dstNodeBldr = new DestinationBuilder()
64 .setDestTp(new TpId(destTp))
65 .setDestNode(new NodeId(dstNode));
67 // Create Source for the link
68 SourceBuilder srcNodeBldr = new SourceBuilder()
69 .setSourceNode(new NodeId(srcNode))
70 .setSourceTp(new TpId(srcTp));
73 LinkId oppositeLinkId;
74 if (otnPrefix == null) {
75 linkId = LinkIdUtil.buildLinkId(srcNode, srcTp, dstNode, destTp);
76 oppositeLinkId = LinkIdUtil.buildLinkId(dstNode, destTp, srcNode, srcTp);
78 linkId = LinkIdUtil.buildOtnLinkId(srcNode, srcTp, dstNode, destTp, otnPrefix);
79 oppositeLinkId = LinkIdUtil.buildOtnLinkId(dstNode, destTp, srcNode, srcTp, otnPrefix);
82 Link1 lnk1 = new Link1Builder().setOppositeLink(oppositeLinkId).build();
84 // set link builder attribute
85 LinkBuilder lnkBldr = new LinkBuilder()
86 .setDestination(dstNodeBldr.build())
87 .setSource(srcNodeBldr.build())
89 .withKey(new LinkKey(linkId))
90 .addAugmentation(lnk1);
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);
103 LOG.debug("Link Id not found for Source {} and Dest {}", srcNode, dstNode);
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());
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);
127 LOG.error("No link found for given LinkId: {}",
132 } catch (InterruptedException | ExecutionException | TimeoutException e) {
133 LOG.error("Error deleting link {}", linkId.getValue(), e);
138 public static AdminStates setNetworkAdminState(String adminState) {
139 if (adminState == null) {
142 switch (adminState) {
144 return AdminStates.InService;
146 return AdminStates.OutOfService;
148 return AdminStates.Maintenance;
154 public static State setNetworkOperState(String operState) {
155 if (operState == null) {
160 return State.InService;
162 return State.OutOfService;
164 return State.Degraded;
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()));
180 if (!tp1Bldr.getOperationalState().getName().equals(mapping.getPortOperState())) {
181 tp1Bldr.setOperationalState(State.valueOf(mapping.getPortOperState()));
183 TerminationPointBuilder tpBldr = new TerminationPointBuilder(tp).addAugmentation(tp1Bldr.build());
184 topoTps.add(tpBldr.build());
187 return new TopologyShard(null, null, topoTps);
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)) {
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())));
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())));
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);
219 link1Bldr.setAdministrativeState(AdminStates.OutOfService);
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);
226 link1Bldr.setOperationalState(State.OutOfService);
228 topoLinks.add(new LinkBuilder(link).addAugmentation(link1Bldr.build()).build());
230 return new TopologyShard(null, topoLinks, topoTps);