Prepare NetworkModel to support ordm 2.2.x devices
[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 org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
13 import org.opendaylight.transportpce.common.NetworkUtils;
14 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
15 import org.opendaylight.transportpce.common.mapping.PortMapping;
16 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
17 import org.opendaylight.transportpce.networkmodel.dto.TopologyShard;
18 import org.opendaylight.transportpce.networkmodel.util.ClliNetwork;
19 import org.opendaylight.transportpce.networkmodel.util.OpenRoadmFactory;
20 import org.opendaylight.transportpce.networkmodel.util.OpenRoadmNetwork;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.Network;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.NetworkId;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.NetworkKey;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.network.Node;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.Network1;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.network.Link;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus;
28 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
29 import org.slf4j.Logger;
30 import org.slf4j.LoggerFactory;
31
32 public class NetworkModelServiceImpl implements NetworkModelService {
33
34     private static final Logger LOG = LoggerFactory.getLogger(NetworkModelServiceImpl.class);
35     private static final boolean CREATE_MISSING_PARENTS = true;
36
37     private NetworkTransactionService networkTransactionService;
38     //private final R2RLinkDiscoveryFactoryMethod linkDiscovery;
39     private final DeviceTransactionManager deviceTransactionManager;
40     private final OpenRoadmFactory openRoadmFactory;
41     private final PortMapping portMapping;
42     private HashMap<String,TopologyShard> topologyShardMountedDevice;
43
44     public NetworkModelServiceImpl(final NetworkTransactionService networkTransactionService,
45                                    DeviceTransactionManager deviceTransactionManager,
46                                    OpenRoadmFactory openRoadmFactory, PortMapping portMapping) {
47
48         this.networkTransactionService = networkTransactionService;
49         //this.linkDiscovery = linkDiscovery;
50         this.deviceTransactionManager = deviceTransactionManager;
51         this.openRoadmFactory = openRoadmFactory;
52         this.portMapping = portMapping;
53         this.topologyShardMountedDevice = new HashMap<String,TopologyShard>();
54     }
55
56     public void init() {
57         LOG.info("init ...");
58     }
59
60     public void close() {
61     }
62
63     @Override
64     public void createOpenROADMnode(String nodeId, String openRoadmVersion) {
65         try {
66             LOG.info("createOpenROADMNode: {} ", nodeId);
67
68             if (!portMapping.createMappingData(nodeId,openRoadmVersion)) {
69                 LOG.warn("Could not generate port mapping for {} skipping network model creation",nodeId);
70                 return;
71             }
72             //this.linkDiscovery.readLLDP(new NodeId(nodeId));
73
74             Node clliNode = ClliNetwork.createNode(this.deviceTransactionManager, nodeId,openRoadmVersion);
75             if (clliNode == null) {
76                 LOG.error("Unable to create clli node! Node id: {}", nodeId);
77                 return;
78             }
79
80             InstanceIdentifier<Node> iiClliNode = InstanceIdentifier
81                 .builder(Network.class, new NetworkKey(new
82                             NetworkId(NetworkUtils.CLLI_NETWORK_ID)))
83                 .child(Node.class, clliNode.key())
84                 .build();
85
86
87             LOG.info("creating node in {}", NetworkUtils.CLLI_NETWORK_ID);
88             networkTransactionService.merge(LogicalDatastoreType.CONFIGURATION, iiClliNode, clliNode,
89                 CREATE_MISSING_PARENTS);
90
91             Node openRoadmNode = OpenRoadmNetwork.createNode(nodeId, this.deviceTransactionManager,openRoadmVersion);
92             if (openRoadmNode == null) {
93                 LOG.error("Unable to create OpenRoadm node! Node id: {}", nodeId);
94                 return;
95             }
96             InstanceIdentifier<Node> iiOpenRoadmNode = InstanceIdentifier
97                 .builder(Network.class, new NetworkKey(new
98                             NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID)))
99                 .child(Node.class, openRoadmNode.key())
100                 .build();
101
102             LOG.info("creating node in {}", NetworkUtils.UNDERLAY_NETWORK_ID);
103             networkTransactionService.merge(LogicalDatastoreType.CONFIGURATION, iiOpenRoadmNode, openRoadmNode,
104                 CREATE_MISSING_PARENTS);
105
106
107             TopologyShard topologyShard = openRoadmFactory.createTopologyShardVersionControl(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
119                     .builder(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
129                     .builder(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             LOG.info("deleteOpenROADMnode: {} ", nodeId);
166             this.portMapping.deleteMappingData(nodeId);
167
168             NodeKey nodeIdKey = new NodeKey(new NodeId(nodeId));
169             WriteTransaction writeTransaction = this.dataBroker.newWriteOnlyTransaction();
170             LOG.info("deleting node in {}", NetworkUtils.CLLI_NETWORK_ID);
171             InstanceIdentifier<Node> iiClliNode = InstanceIdentifier
172                 .builder(Networks.class)
173                 .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.CLLI_NETWORK_ID)))
174                 .child(Node.class, nodeIdKey)
175                 .build();
176             writeTransaction.delete(LogicalDatastoreType.CONFIGURATION, iiClliNode);
177             LOG.info("deleting node in {}", NetworkUtils.UNDERLAY_NETWORK_ID);
178             InstanceIdentifier<Node> iiOpenRoadmNode = InstanceIdentifier
179                 .builder(Networks.class)
180                 .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID)))
181                 .child(Node.class, nodeIdKey)
182                 .build();
183             writeTransaction.delete(LogicalDatastoreType.CONFIGURATION, iiOpenRoadmNode);
184             TopologyShard topologyShard = this.topologyShardMountedDevice.get(nodeId);
185             if (topologyShard != null) {
186                 LOG.info("TopologyShard for node '{}' is present", nodeId);
187                 for (Node openRoadmTopologyNode: topologyShard .getNodes()) {
188                     LOG.info("deleting node {} in {}", openRoadmTopologyNode.getNodeId().getValue(),
189                             NetworkUtils.OVERLAY_NETWORK_ID);
190                     InstanceIdentifier<Node> iiOpenRoadmTopologyNode = InstanceIdentifier
191                         .builder(Networks.class)
192                         .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
193                         .child(Node.class, openRoadmTopologyNode.key())
194                         .build();
195                     writeTransaction.delete(LogicalDatastoreType.CONFIGURATION, iiOpenRoadmTopologyNode);
196                 }
197                 for (Link openRoadmTopologyLink: topologyShard.getLinks()) {
198                     LOG.info("deleting link {} in {}", openRoadmTopologyLink.getLinkId().getValue(),
199                             NetworkUtils.OVERLAY_NETWORK_ID);
200                     InstanceIdentifier<Link> iiOpenRoadmTopologyLink = InstanceIdentifier
201                         .builder(Networks.class)
202                         .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
203                         .augmentation(Network1.class)
204                         .child(Link.class, openRoadmTopologyLink.key())
205                         .build();
206                     writeTransaction.delete(LogicalDatastoreType.CONFIGURATION, iiOpenRoadmTopologyLink);
207                 }
208             } else {
209                 LOG.warn("TopologyShard for node '{}' is not present", nodeId);
210             }
211             writeTransaction.submit().get();
212             LOG.info("all nodes and links deleted ! ");
213         } catch (InterruptedException | ExecutionException e) {
214             LOG.error("Error when trying to delete node : {}", nodeId, e);
215         }*/
216     }
217 }