Bugs correction in NetworkModelService
[transportpce.git] / networkmodel / src / main / java / org / opendaylight / transportpce / networkmodel / service / NetworkModelServiceImpl.java
1 /*
2  * Copyright © 2016 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.service;
9
10 import java.util.HashMap;
11 import java.util.concurrent.ExecutionException;
12
13 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
14 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
15 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
16 import org.opendaylight.transportpce.common.NetworkUtils;
17 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
18 import org.opendaylight.transportpce.common.mapping.PortMapping;
19 import org.opendaylight.transportpce.networkmodel.R2RLinkDiscovery;
20 import org.opendaylight.transportpce.networkmodel.dto.TopologyShard;
21 import org.opendaylight.transportpce.networkmodel.util.ClliNetwork;
22 import org.opendaylight.transportpce.networkmodel.util.OpenRoadmNetwork;
23 import org.opendaylight.transportpce.networkmodel.util.OpenRoadmTopology;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.Network;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.NetworkId;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.NetworkKey;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.NodeId;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.network.Node;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.network.NodeKey;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.Network1;
31 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.network.Link;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus;
33 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
34 import org.slf4j.Logger;
35 import org.slf4j.LoggerFactory;
36
37 public class NetworkModelServiceImpl implements NetworkModelService {
38
39     private static final Logger LOG = LoggerFactory.getLogger(NetworkModelServiceImpl.class);
40     private static final boolean CREATE_MISSING_PARENTS = true;
41
42     private final DataBroker dataBroker;
43     private final R2RLinkDiscovery linkDiscovery;
44     private final DeviceTransactionManager deviceTransactionManager;
45     private final OpenRoadmTopology openRoadmTopology;
46     private final PortMapping portMapping;
47     private HashMap<String,TopologyShard> topologyShardMountedDevice;
48
49     public NetworkModelServiceImpl(final DataBroker dataBroker, final R2RLinkDiscovery linkDiscovery,
50             DeviceTransactionManager deviceTransactionManager,
51             OpenRoadmTopology openRoadmTopology, PortMapping portMapping) {
52         this.dataBroker = dataBroker;
53         this.linkDiscovery = linkDiscovery;
54         this.deviceTransactionManager = deviceTransactionManager;
55         this.openRoadmTopology = openRoadmTopology;
56         this.portMapping = portMapping;
57         this.topologyShardMountedDevice = new HashMap<String,TopologyShard>();
58     }
59
60     public void init() {
61         LOG.info("init ...");
62     }
63
64     public void close() {
65     }
66
67     @Override
68     public void createOpenROADMnode(String nodeId) {
69         try {
70             LOG.info("createOpenROADMNode: {} ", nodeId);
71
72             this.portMapping.createMappingData(nodeId);
73             this.linkDiscovery.readLLDP(new NodeId(nodeId));
74
75             Node clliNode = ClliNetwork.createNode(this.deviceTransactionManager, nodeId);
76             if (clliNode == null) {
77                 LOG.error("Unable to create clli node! Node id: {}", nodeId);
78                 return;
79             }
80
81             Node openRoadmNode = OpenRoadmNetwork.createNode(nodeId, this.deviceTransactionManager);
82             if (openRoadmNode == null) {
83                 LOG.error("Unable to create OpenRoadm node! Node id: {}", nodeId);
84                 return;
85             }
86
87             TopologyShard topologyShard = this.openRoadmTopology.createTopologyShard(nodeId);
88             if (topologyShard == null) {
89                 LOG.error("Unable to create topology shard for node {}!", nodeId);
90                 return;
91             }
92             this.topologyShardMountedDevice.put(nodeId, topologyShard);
93
94             WriteTransaction writeTransaction = this.dataBroker.newWriteOnlyTransaction();
95             LOG.info("creating node in {}", NetworkUtils.CLLI_NETWORK_ID);
96             InstanceIdentifier<Node> iiClliNode = InstanceIdentifier
97                     .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.CLLI_NETWORK_ID)))
98                     .child(Node.class, clliNode.getKey())
99                     .build();
100             writeTransaction.merge(LogicalDatastoreType.CONFIGURATION, iiClliNode, clliNode,
101                     CREATE_MISSING_PARENTS);
102             LOG.info("creating node in {}", NetworkUtils.UNDERLAY_NETWORK_ID);
103             InstanceIdentifier<Node> iiOpenRoadmNode = InstanceIdentifier
104                     .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID)))
105                     .child(Node.class, openRoadmNode.getKey())
106                     .build();
107             writeTransaction.merge(LogicalDatastoreType.CONFIGURATION, iiOpenRoadmNode, openRoadmNode,
108                     CREATE_MISSING_PARENTS);
109             for (Node openRoadmTopologyNode: topologyShard.getNodes()) {
110                 LOG.info("creating node {} in {}", openRoadmTopologyNode.getNodeId().getValue(),
111                         NetworkUtils.OVERLAY_NETWORK_ID);
112                 InstanceIdentifier<Node> iiOpenRoadmTopologyNode = InstanceIdentifier
113                         .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
114                         .child(Node.class, openRoadmTopologyNode.getKey())
115                         .build();
116                 writeTransaction.merge(LogicalDatastoreType.CONFIGURATION, iiOpenRoadmTopologyNode,
117                         openRoadmTopologyNode, CREATE_MISSING_PARENTS);
118             }
119             for (Link openRoadmTopologyLink: topologyShard.getLinks()) {
120                 LOG.info("creating link {} in {}", openRoadmTopologyLink.getLinkId().getValue(),
121                         NetworkUtils.OVERLAY_NETWORK_ID);
122                 InstanceIdentifier<Link> iiOpenRoadmTopologyLink = InstanceIdentifier
123                         .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
124                         .augmentation(Network1.class)
125                         .child(Link.class, openRoadmTopologyLink.getKey())
126                         .build();
127                 writeTransaction.merge(LogicalDatastoreType.CONFIGURATION, iiOpenRoadmTopologyLink,
128                         openRoadmTopologyLink, CREATE_MISSING_PARENTS);
129             }
130             writeTransaction.submit().get();
131             LOG.info("all nodes and links created");
132         } catch (InterruptedException | ExecutionException e) {
133             LOG.error("ERROR: ", e);
134         }
135     }
136
137     @Override
138     public void setOpenROADMnodeStatus(String nodeId, NetconfNodeConnectionStatus.ConnectionStatus connectionStatus) {
139         LOG.info("setOpenROADMNodeStatus: {} {}", nodeId, connectionStatus.name());
140         /*
141           TODO: set connection status of the device in model,
142           TODO: so we don't need to keep it in memory (Set<String> currentMountedDevice)
143           TODO: unfortunately there is no connection status OpenROADM in network models
144           TODO: waiting for new model version
145          */
146     }
147
148     /* (non-Javadoc)
149      * @see org.opendaylight.transportpce.networkmodel.service.NetworkModelService#deleteOpenROADMnode(java.lang.String)
150      */
151     @Override
152     public void deleteOpenROADMnode(String nodeId) {
153         try {
154             LOG.info("deleteOpenROADMnode: {} ", nodeId);
155             this.portMapping.deleteMappingData(nodeId);
156
157             NodeKey nodeIdKey = new NodeKey(new NodeId(nodeId));
158             WriteTransaction writeTransaction = this.dataBroker.newWriteOnlyTransaction();
159             LOG.info("deleting node in {}", NetworkUtils.CLLI_NETWORK_ID);
160             InstanceIdentifier<Node> iiClliNode = InstanceIdentifier
161                     .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.CLLI_NETWORK_ID)))
162                     .child(Node.class, nodeIdKey)
163                     .build();
164             writeTransaction.delete(LogicalDatastoreType.CONFIGURATION, iiClliNode);
165             LOG.info("deleting node in {}", NetworkUtils.UNDERLAY_NETWORK_ID);
166             InstanceIdentifier<Node> iiOpenRoadmNode = InstanceIdentifier
167                     .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID)))
168                     .child(Node.class, nodeIdKey)
169                     .build();
170             writeTransaction.delete(LogicalDatastoreType.CONFIGURATION, iiOpenRoadmNode);
171             TopologyShard topologyShard = this.topologyShardMountedDevice.get(nodeId);
172             if (topologyShard != null) {
173                 LOG.info("TopologyShard for node '{}' is present", nodeId);
174                 for (Node openRoadmTopologyNode: topologyShard .getNodes()) {
175                     LOG.info("deleting node {} in {}", openRoadmTopologyNode.getNodeId().getValue(),
176                             NetworkUtils.OVERLAY_NETWORK_ID);
177                     InstanceIdentifier<Node> iiOpenRoadmTopologyNode = InstanceIdentifier
178                             .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
179                             .child(Node.class, openRoadmTopologyNode.getKey())
180                             .build();
181                     writeTransaction.delete(LogicalDatastoreType.CONFIGURATION, iiOpenRoadmTopologyNode);
182                 }
183                 for (Link openRoadmTopologyLink: topologyShard.getLinks()) {
184                     LOG.info("deleting link {} in {}", openRoadmTopologyLink.getLinkId().getValue(),
185                             NetworkUtils.OVERLAY_NETWORK_ID);
186                     InstanceIdentifier<Link> iiOpenRoadmTopologyLink = InstanceIdentifier
187                             .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
188                             .augmentation(Network1.class)
189                             .child(Link.class, openRoadmTopologyLink.getKey())
190                             .build();
191                     writeTransaction.delete(LogicalDatastoreType.CONFIGURATION, iiOpenRoadmTopologyLink);
192                 }
193             } else {
194                 LOG.warn("TopologyShard for node '{}' is not present", nodeId);
195             }
196             writeTransaction.submit().get();
197             LOG.info("all nodes and links deleted ! ");
198         } catch (InterruptedException | ExecutionException e) {
199             LOG.error("Error when trying to delete node : {}", nodeId, e);
200         }
201     }
202 }