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.base.Optional;
11 import com.google.common.util.concurrent.ListenableFuture;
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.OpenRoadmTopology;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.Network;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.NetworkId;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.NetworkKey;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.LinkId;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.Network1;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.network.Link;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.network.LinkKey;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.networkutils.rev170818.DeleteLinkInput;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.networkutils.rev170818.DeleteLinkOutput;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.networkutils.rev170818.DeleteLinkOutputBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.networkutils.rev170818.InitRdmXpdrLinksInput;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.networkutils.rev170818.InitRdmXpdrLinksOutput;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.networkutils.rev170818.InitRdmXpdrLinksOutputBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.networkutils.rev170818.InitRoadmNodesInput;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.networkutils.rev170818.InitRoadmNodesOutput;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.networkutils.rev170818.InitRoadmNodesOutputBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.networkutils.rev170818.InitXpdrRdmLinksInput;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.networkutils.rev170818.InitXpdrRdmLinksOutput;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.networkutils.rev170818.InitXpdrRdmLinksOutputBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.networkutils.rev170818.NetworkutilsService;
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;
46 public class NetworkUtilsImpl implements NetworkutilsService {
48 private static final Logger LOG = LoggerFactory.getLogger(NetworkUtilsImpl.class);
49 private final DataBroker dataBroker;
50 private final OpenRoadmTopology openRoadmTopology;
52 public NetworkUtilsImpl(DataBroker dataBroker, OpenRoadmTopology openRoadmTopology) {
53 this.dataBroker = dataBroker;
54 this.openRoadmTopology = openRoadmTopology;
58 public ListenableFuture<RpcResult<DeleteLinkOutput>> deleteLink(DeleteLinkInput input) {
60 LinkId linkId = new LinkId(input.getLinkId());
61 // Building link instance identifier
62 InstanceIdentifier.InstanceIdentifierBuilder<Link> linkIID = InstanceIdentifier.builder(Network.class,
63 new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
64 .augmentation(Network1.class).child(Link.class, new LinkKey(linkId));
66 //Check if link exists
68 ReadOnlyTransaction readOnlyTransaction = dataBroker.newReadOnlyTransaction();
69 Optional<Link> linkOptional = readOnlyTransaction.read(LogicalDatastoreType.CONFIGURATION, linkIID.build())
71 if (!linkOptional.isPresent()) {
72 LOG.info("Link not present");
73 return RpcResultBuilder
74 .success(new DeleteLinkOutputBuilder().setResult(
78 } catch (ExecutionException | InterruptedException e) {
79 LOG.error("readMdSal: Error reading link {}", input.getLinkId());
80 return RpcResultBuilder
81 .success(new DeleteLinkOutputBuilder().setResult(
86 WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();
87 writeTransaction.delete(LogicalDatastoreType.CONFIGURATION, linkIID.build());
89 writeTransaction.submit().get();
90 LOG.info("Link with linkId: {} deleted from {} layer.",
91 input.getLinkId(), NetworkUtils.OVERLAY_NETWORK_ID);
92 return RpcResultBuilder
93 .success(new DeleteLinkOutputBuilder().setResult(
94 "Link {} deleted successfully"))
96 } catch (InterruptedException | ExecutionException e) {
97 return RpcResultBuilder.<DeleteLinkOutput>failed().buildFuture();
101 public ListenableFuture<RpcResult<InitRoadmNodesOutput>> initRoadmNodes(InitRoadmNodesInput input) {
102 boolean createRdmLinks = OrdLink.createRdm2RdmLinks(input,
103 this.openRoadmTopology,this.dataBroker);
104 if (createRdmLinks) {
105 return RpcResultBuilder
106 .success(new InitRoadmNodesOutputBuilder().setResult(
107 "Unidirectional Roadm-to-Roadm Link created successfully"))
110 return RpcResultBuilder.<InitRoadmNodesOutput>failed().buildFuture();
115 public ListenableFuture<RpcResult<InitXpdrRdmLinksOutput>> initXpdrRdmLinks(InitXpdrRdmLinksInput input) {
116 // Assigns user provided input in init-network-view RPC to nodeId
117 boolean createXpdrRdmLinks = Rdm2XpdrLink.createXpdrRdmLinks(input.getLinksInput(),
118 this.openRoadmTopology,this.dataBroker);
119 if (createXpdrRdmLinks) {
120 return RpcResultBuilder
121 .success(new InitXpdrRdmLinksOutputBuilder().setResult("Xponder Roadm Link created successfully"))
124 return RpcResultBuilder.<InitXpdrRdmLinksOutput>failed().buildFuture();
129 public ListenableFuture<RpcResult<InitRdmXpdrLinksOutput>> initRdmXpdrLinks(InitRdmXpdrLinksInput input) {
130 boolean createRdmXpdrLinks = Rdm2XpdrLink.createRdmXpdrLinks(input.getLinksInput(),
131 this.openRoadmTopology,this.dataBroker);
132 if (createRdmXpdrLinks) {
133 return RpcResultBuilder
134 .success(new InitRdmXpdrLinksOutputBuilder().setResult("Roadm Xponder links created successfully"))
137 return RpcResultBuilder.<InitRdmXpdrLinksOutput>failed().buildFuture();