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