RPC to delete link
[transportpce.git] / networkmodel / src / main / java / org / opendaylight / transportpce / networkmodel / NetworkUtilsImpl.java
1 /*
2  * Copyright © 2017 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;
9
10 import com.google.common.base.Optional;
11
12 import java.util.concurrent.ExecutionException;
13 import java.util.concurrent.Future;
14
15 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
16 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
17 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
18 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
19 import org.opendaylight.transportpce.common.NetworkUtils;
20 import org.opendaylight.transportpce.networkmodel.util.OpenRoadmTopology;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.Network;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.NetworkId;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.NetworkKey;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.LinkId;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.Network1;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.network.Link;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.network.LinkKey;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.networkutils.rev170818.DeleteLinkInput;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.networkutils.rev170818.DeleteLinkOutput;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.networkutils.rev170818.DeleteLinkOutputBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.networkutils.rev170818.InitRdmXpdrLinksInput;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.networkutils.rev170818.InitRdmXpdrLinksOutput;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.networkutils.rev170818.InitRdmXpdrLinksOutputBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.networkutils.rev170818.InitRoadmNodesInput;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.networkutils.rev170818.InitRoadmNodesOutput;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.networkutils.rev170818.InitRoadmNodesOutputBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.networkutils.rev170818.InitXpdrRdmLinksInput;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.networkutils.rev170818.InitXpdrRdmLinksOutput;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.networkutils.rev170818.InitXpdrRdmLinksOutputBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.networkutils.rev170818.NetworkutilsService;
41 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
42 import org.opendaylight.yangtools.yang.common.RpcResult;
43 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
44 import org.slf4j.Logger;
45 import org.slf4j.LoggerFactory;
46
47 public class NetworkUtilsImpl implements NetworkutilsService {
48
49     private static final Logger LOG = LoggerFactory.getLogger(NetworkUtilsImpl.class);
50     private final DataBroker dataBroker;
51     private final OpenRoadmTopology openRoadmTopology;
52
53     public NetworkUtilsImpl(DataBroker dataBroker, OpenRoadmTopology openRoadmTopology) {
54         this.dataBroker = dataBroker;
55         this.openRoadmTopology = openRoadmTopology;
56     }
57
58     @Override
59     public Future<RpcResult<DeleteLinkOutput>> deleteLink(DeleteLinkInput input) {
60
61         LinkId linkId = new LinkId(input.getLinkId());
62         // Building link instance identifier
63         InstanceIdentifier.InstanceIdentifierBuilder<Link> linkIID = InstanceIdentifier.builder(Network.class,
64             new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
65                 .augmentation(Network1.class).child(Link.class, new LinkKey(linkId));
66
67         //Check if link exists
68         try {
69             ReadOnlyTransaction readOnlyTransaction = dataBroker.newReadOnlyTransaction();
70             Optional<Link> linkOptional = readOnlyTransaction.read(LogicalDatastoreType.CONFIGURATION, linkIID.build())
71                 .get();
72             if (!linkOptional.isPresent()) {
73                 LOG.info("Link not present");
74                 return RpcResultBuilder
75                     .success(new DeleteLinkOutputBuilder().setResult(
76                         "Fail"))
77                     .buildFuture();
78             }
79         } catch (ExecutionException | InterruptedException e) {
80             LOG.error("readMdSal: Error reading link {}", input.getLinkId());
81             return RpcResultBuilder
82                 .success(new DeleteLinkOutputBuilder().setResult(
83                     "Fail"))
84                 .buildFuture();
85         }
86
87         WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();
88         writeTransaction.delete(LogicalDatastoreType.CONFIGURATION, linkIID.build());
89         try {
90             writeTransaction.submit().get();
91             LOG.info("Link with linkId: {} deleted from {} layer.",
92                 input.getLinkId(), NetworkUtils.OVERLAY_NETWORK_ID);
93             return RpcResultBuilder
94                 .success(new DeleteLinkOutputBuilder().setResult(
95                     "Link {} deleted successfully"))
96                 .buildFuture();
97         } catch (InterruptedException | ExecutionException e) {
98             return RpcResultBuilder.<DeleteLinkOutput>failed().buildFuture();
99         }
100     }
101
102     public Future<RpcResult<InitRoadmNodesOutput>> initRoadmNodes(InitRoadmNodesInput input) {
103         boolean createRdmLinks = OrdLink.createRdm2RdmLinks(input,
104             openRoadmTopology, dataBroker);
105         if (createRdmLinks) {
106             return RpcResultBuilder
107                 .success(new InitRoadmNodesOutputBuilder().setResult(
108                     "Unidirectional Roadm-to-Roadm Link created successfully"))
109                 .buildFuture();
110         } else {
111             return RpcResultBuilder.<InitRoadmNodesOutput>failed().buildFuture();
112         }
113     }
114
115     @Override
116     public Future<RpcResult<InitXpdrRdmLinksOutput>> initXpdrRdmLinks(InitXpdrRdmLinksInput input) {
117         // Assigns user provided input in init-network-view RPC to nodeId
118         boolean createXpdrRdmLinks = Rdm2XpdrLink.createXpdrRdmLinks(input.getLinksInput(),
119             openRoadmTopology, dataBroker);
120         if (createXpdrRdmLinks) {
121             return RpcResultBuilder
122                 .success(new InitXpdrRdmLinksOutputBuilder().setResult("Xponder Roadm Link created successfully"))
123                 .buildFuture();
124         } else {
125             return RpcResultBuilder.<InitXpdrRdmLinksOutput>failed().buildFuture();
126         }
127     }
128
129     public Future<RpcResult<InitRdmXpdrLinksOutput>> initRdmXpdrLinks(InitRdmXpdrLinksInput input) {
130         boolean createRdmXpdrLinks = Rdm2XpdrLink.createRdmXpdrLinks(input.getLinksInput(),
131             openRoadmTopology, dataBroker);
132         if (createRdmXpdrLinks) {
133             return RpcResultBuilder
134                 .success(new InitRdmXpdrLinksOutputBuilder().setResult("Roadm Xponder links created successfully"))
135                 .buildFuture();
136         } else {
137             return RpcResultBuilder.<InitRdmXpdrLinksOutput>failed().buildFuture();
138         }
139     }
140 }