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