2 * Copyright © 2017 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;
10 import com.google.common.util.concurrent.ListenableFuture;
11 import java.util.Optional;
12 import java.util.concurrent.ExecutionException;
13 import org.opendaylight.mdsal.binding.api.DataBroker;
14 import org.opendaylight.mdsal.binding.api.ReadTransaction;
15 import org.opendaylight.mdsal.binding.api.RpcProviderService;
16 import org.opendaylight.mdsal.binding.api.WriteTransaction;
17 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
18 import org.opendaylight.transportpce.common.NetworkUtils;
19 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.DeleteLink;
20 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.DeleteLinkInput;
21 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.DeleteLinkOutput;
22 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.DeleteLinkOutputBuilder;
23 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.InitRdmXpdrLinks;
24 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.InitRdmXpdrLinksInput;
25 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.InitRdmXpdrLinksOutput;
26 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.InitRdmXpdrLinksOutputBuilder;
27 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.InitRoadmNodes;
28 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.InitRoadmNodesInput;
29 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.InitRoadmNodesOutput;
30 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.InitRoadmNodesOutputBuilder;
31 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.InitXpdrRdmLinks;
32 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.InitXpdrRdmLinksInput;
33 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.InitXpdrRdmLinksOutput;
34 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.InitXpdrRdmLinksOutputBuilder;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
36 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
37 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network;
38 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.NetworkKey;
39 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.LinkId;
40 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Network1;
41 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link;
42 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.LinkKey;
43 import org.opendaylight.yangtools.concepts.Registration;
44 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
45 import org.opendaylight.yangtools.yang.common.RpcResult;
46 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
47 import org.osgi.service.component.annotations.Activate;
48 import org.osgi.service.component.annotations.Component;
49 import org.osgi.service.component.annotations.Deactivate;
50 import org.osgi.service.component.annotations.Reference;
51 import org.slf4j.Logger;
52 import org.slf4j.LoggerFactory;
55 public class NetworkUtilsImpl {
57 private static final Logger LOG = LoggerFactory.getLogger(NetworkUtilsImpl.class);
58 private final DataBroker dataBroker;
59 private final Registration rpcReg;
62 public NetworkUtilsImpl(@Reference DataBroker dataBroker, @Reference RpcProviderService rpcProvider) {
63 this.dataBroker = dataBroker;
64 rpcReg = rpcProvider.registerRpcImplementations(
65 (DeleteLink) this::deleteLink,
66 (InitRoadmNodes) this::initRoadmNodes,
67 (InitXpdrRdmLinks) this::initXpdrRdmLinks,
68 (InitRdmXpdrLinks) this::initRdmXpdrLinks
70 LOG.info("NetworkUtilsImpl instanciated");
77 LOG.info("{} closed", getClass().getSimpleName());
80 private ListenableFuture<RpcResult<DeleteLinkOutput>> deleteLink(DeleteLinkInput input) {
82 LinkId linkId = new LinkId(input.getLinkId());
83 // Building link instance identifier
84 InstanceIdentifier.Builder<Link> linkIID = InstanceIdentifier.builder(Networks.class)
85 .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
86 .augmentation(Network1.class).child(Link.class, new LinkKey(linkId));
89 //Check if link exists
91 ReadTransaction readOnlyTransaction = dataBroker.newReadOnlyTransaction();
92 Optional<Link> linkOptional = readOnlyTransaction.read(LogicalDatastoreType.CONFIGURATION, linkIID.build())
94 if (!linkOptional.isPresent()) {
95 LOG.info("Link not present");
96 return RpcResultBuilder
97 .success(new DeleteLinkOutputBuilder().setResult("Fail").build())
100 } catch (ExecutionException | InterruptedException e) {
101 LOG.error("readMdSal: Error reading link {}", input.getLinkId());
102 return RpcResultBuilder
103 .success(new DeleteLinkOutputBuilder().setResult("Fail").build())
107 WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();
108 writeTransaction.delete(LogicalDatastoreType.CONFIGURATION, linkIID.build());
110 writeTransaction.commit().get();
111 LOG.info("Link with linkId: {} deleted from {} layer.",
112 input.getLinkId(), NetworkUtils.OVERLAY_NETWORK_ID);
113 return RpcResultBuilder
114 .success(new DeleteLinkOutputBuilder().setResult("Link {} deleted successfully").build())
116 } catch (InterruptedException | ExecutionException e) {
117 return RpcResultBuilder.<DeleteLinkOutput>failed().buildFuture();
121 private ListenableFuture<RpcResult<InitRoadmNodesOutput>> initRoadmNodes(InitRoadmNodesInput input) {
122 boolean createRdmLinks = OrdLink.createRdm2RdmLinks(input, this.dataBroker);
123 if (createRdmLinks) {
124 return RpcResultBuilder
125 .success(new InitRoadmNodesOutputBuilder()
126 .setResult("Unidirectional Roadm-to-Roadm Link created successfully")
130 return RpcResultBuilder.<InitRoadmNodesOutput>failed().buildFuture();
134 private ListenableFuture<RpcResult<InitXpdrRdmLinksOutput>> initXpdrRdmLinks(InitXpdrRdmLinksInput input) {
135 // Assigns user provided input in init-network-view RPC to nodeId
136 LOG.info("Xpdr to Roadm links rpc called");
137 boolean createXpdrRdmLinks = Rdm2XpdrLink.createXpdrRdmLinks(input.getLinksInput(), this.dataBroker);
138 if (createXpdrRdmLinks) {
139 return RpcResultBuilder
140 .success(new InitXpdrRdmLinksOutputBuilder()
141 .setResult("Xponder Roadm Link created successfully")
145 LOG.error("init-xpdr-rdm-links rpc failed due to a bad input parameter");
146 return RpcResultBuilder.<InitXpdrRdmLinksOutput>failed().buildFuture();
150 private ListenableFuture<RpcResult<InitRdmXpdrLinksOutput>> initRdmXpdrLinks(InitRdmXpdrLinksInput input) {
151 LOG.info("Roadm to Xpdr links rpc called");
152 boolean createRdmXpdrLinks = Rdm2XpdrLink.createRdmXpdrLinks(input.getLinksInput(), this.dataBroker);
153 if (createRdmXpdrLinks) {
154 return RpcResultBuilder
155 .success(new InitRdmXpdrLinksOutputBuilder()
156 .setResult("Roadm Xponder links created successfully")
160 LOG.error("init-rdm-xpdr-links rpc failed due to a bad input parameter");
161 return RpcResultBuilder.<InitRdmXpdrLinksOutput>failed().buildFuture();