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