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