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