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