Network topology and inventory init
[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.concurrent.ExecutionException;
11
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.topology.rev150608.Network1;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev150608.network.Link;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus;
31 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
34
35 public class NetworkModelServiceImpl implements NetworkModelService {
36
37     private static final Logger LOG = LoggerFactory.getLogger(NetworkModelServiceImpl.class);
38     private static final boolean CREATE_MISSING_PARENTS = true;
39
40     private final DataBroker dataBroker;
41     private final R2RLinkDiscovery linkDiscovery;
42     private final DeviceTransactionManager deviceTransactionManager;
43     private final OpenRoadmTopology openRoadmTopology;
44     private final PortMapping portMapping;
45
46     public NetworkModelServiceImpl(final DataBroker dataBroker, final R2RLinkDiscovery linkDiscovery,
47             DeviceTransactionManager deviceTransactionManager,
48             OpenRoadmTopology openRoadmTopology, PortMapping portMapping) {
49         this.dataBroker = dataBroker;
50         this.linkDiscovery = linkDiscovery;
51         this.deviceTransactionManager = deviceTransactionManager;
52         this.openRoadmTopology = openRoadmTopology;
53         this.portMapping = portMapping;
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) {
65         try {
66             LOG.info("createOpenROADMNode: {} ", nodeId);
67
68             this.portMapping.createMappingData(nodeId);
69             this.linkDiscovery.readLLDP(new NodeId(nodeId));
70
71             Node clliNode = ClliNetwork.createNode(this.deviceTransactionManager, nodeId);
72             if (clliNode == null) {
73                 LOG.error("Unable to create clli node! Node id: {}", nodeId);
74                 return;
75             }
76
77             Node openRoadmNode = OpenRoadmNetwork.createNode(nodeId, this.deviceTransactionManager);
78             if (openRoadmNode == null) {
79                 LOG.error("Unable to create OpenRoadm node! Node id: {}", nodeId);
80                 return;
81             }
82
83             TopologyShard topologyShard = this.openRoadmTopology.createTopologyShard(nodeId);
84             if (topologyShard == null) {
85                 LOG.error("Unable to create topology shard for node {}!", nodeId);
86                 return;
87             }
88
89             WriteTransaction writeTransaction = this.dataBroker.newWriteOnlyTransaction();
90             LOG.info("creating node in {}", NetworkUtils.CLLI_NETWORK_ID);
91             InstanceIdentifier<Node> iiClliNode = InstanceIdentifier
92                     .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.CLLI_NETWORK_ID)))
93                     .child(Node.class, clliNode.getKey())
94                     .build();
95             writeTransaction.merge(LogicalDatastoreType.CONFIGURATION, iiClliNode, clliNode,
96                     CREATE_MISSING_PARENTS);
97             LOG.info("creating node in {}", NetworkUtils.UNDERLAY_NETWORK_ID);
98             InstanceIdentifier<Node> iiOpenRoadmNode = InstanceIdentifier
99                     .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID)))
100                     .child(Node.class, openRoadmNode.getKey())
101                     .build();
102             writeTransaction.merge(LogicalDatastoreType.CONFIGURATION, iiOpenRoadmNode, openRoadmNode,
103                     CREATE_MISSING_PARENTS);
104             for (Node openRoadmTopologyNode: topologyShard.getNodes()) {
105                 LOG.info("creating node {} in {}", openRoadmTopologyNode.getNodeId().getValue(),
106                         NetworkUtils.OVERLAY_NETWORK_ID);
107                 InstanceIdentifier<Node> iiOpenRoadmTopologyNode = InstanceIdentifier
108                         .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
109                         .child(Node.class, openRoadmTopologyNode.getKey())
110                         .build();
111                 writeTransaction.merge(LogicalDatastoreType.CONFIGURATION, iiOpenRoadmTopologyNode,
112                         openRoadmTopologyNode, CREATE_MISSING_PARENTS);
113             }
114             for (Link openRoadmTopologyLink: topologyShard.getLinks()) {
115                 LOG.info("creating link {} in {}", openRoadmTopologyLink.getLinkId().getValue(),
116                         NetworkUtils.OVERLAY_NETWORK_ID);
117                 InstanceIdentifier<Link> iiOpenRoadmTopologyLink = InstanceIdentifier
118                         .builder(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
119                         .augmentation(Network1.class)
120                         .child(Link.class, openRoadmTopologyLink.getKey())
121                         .build();
122                 writeTransaction.merge(LogicalDatastoreType.CONFIGURATION, iiOpenRoadmTopologyLink,
123                         openRoadmTopologyLink, CREATE_MISSING_PARENTS);
124             }
125             writeTransaction.submit().get();
126             LOG.info("all nodes and links created");
127         } catch (InterruptedException | ExecutionException e) {
128             LOG.error("ERROR: ", e);
129         }
130     }
131
132     @Override
133     public void setOpenROADMnodeStatus(String nodeId, NetconfNodeConnectionStatus.ConnectionStatus connectionStatus) {
134         LOG.info("setOpenROADMNodeStatus: {} {}", nodeId, connectionStatus.name());
135         /*
136           TODO: set connection status of the device in model,
137           TODO: so we don't need to keep it in memory (Set<String> currentMountedDevice)
138           TODO: unfortunately there is no connection status OpenROADM in network models
139           TODO: waiting for new model version
140          */
141     }
142
143 }