Prepare NetworkModel to support ordm 2.2.x devices
[transportpce.git] / networkmodel / src / main / java / org / opendaylight / transportpce / networkmodel / util / OpenRoadmNetwork.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
9 package org.opendaylight.transportpce.networkmodel.util;
10
11 import com.google.common.collect.ImmutableList;
12 import java.util.concurrent.ExecutionException;
13 import java.util.concurrent.TimeUnit;
14 import java.util.concurrent.TimeoutException;
15 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
16 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
17 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
18 import org.opendaylight.transportpce.common.NetworkUtils;
19 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
20 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.rev170929.Node1;
21 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.rev170929.Node1Builder;
22 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev170929.NetworkTypes1;
23 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev170929.NetworkTypes1Builder;
24 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev170929.network.network.types.OpenroadmTopologyBuilder;
25 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev170929.OpenroadmNodeType;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.Network;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.NetworkBuilder;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.NetworkId;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.NetworkKey;
31 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.NodeId;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.network.NetworkTypesBuilder;
33 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.network.Node;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.network.NodeBuilder;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.network.NodeKey;
36 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.network.node.SupportingNodeBuilder;
37 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.network.node.SupportingNodeKey;
38 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
39 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
40 import org.slf4j.Logger;
41 import org.slf4j.LoggerFactory;
42
43
44 public final class OpenRoadmNetwork {
45
46     private static final Logger LOG = LoggerFactory.getLogger(OpenRoadmNetwork.class);
47
48     private OpenRoadmNetwork() {
49         // utility class
50     }
51
52     /**
53      * This public method creates the OpenRoadmNetwork Layer and posts it to the
54      * controller.
55      *
56      * @param controllerdb controller databroker
57      */
58     public static void createOpenRoadmNetworkLayer(DataBroker controllerdb) {
59         try {
60             Network openRoadmNetwork = createOpenRoadmNetwork();
61             InstanceIdentifierBuilder<Network> nwIID = InstanceIdentifier.builder(Network.class,
62                 new NetworkKey(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID)));
63             WriteTransaction wrtx = controllerdb.newWriteOnlyTransaction();
64             wrtx.put(LogicalDatastoreType.CONFIGURATION, nwIID.build(), openRoadmNetwork);
65             wrtx.submit().get(1, TimeUnit.SECONDS);
66             LOG.info("OpenRoadm-Network created successfully.");
67         } catch (ExecutionException | TimeoutException | InterruptedException e) {
68             LOG.warn("Failed to create OpenRoadm-Network", e);
69         }
70     }
71
72     /**
73      * Create single node entry for OpenRoadmNetwork.
74      *
75      * @param nodeId node ID
76      * @param deviceTransactionManager device transaction manager
77      *
78      * @return node builder status
79      */
80     public static Node createNode(String nodeId, DeviceTransactionManager deviceTransactionManager,
81                                   String openRoadmVersion) {
82
83         InfoSubtree infoSubtree = new InfoSubtree(openRoadmVersion);
84         String clli;
85         String vendor;
86         String model;
87         IpAddress ipAddress;
88         int nodeType;
89
90         if (infoSubtree.getDeviceInfo(nodeId,deviceTransactionManager)) {
91
92             clli = infoSubtree.getClli();
93
94             /**
95              * TODO : Uncomment when real when testing on real device
96              * vendor = infoSubtree.getVendor();
97              * model = infoSubtree.getModel();
98              **/
99             vendor = infoSubtree.getVendor();
100             clli = infoSubtree.getClli();
101             model = infoSubtree.getModel();
102             ipAddress = infoSubtree.getIpAddress();
103             nodeType = infoSubtree.getNodeType();
104
105         } else {
106             return null;
107         }
108
109         // Uses the Node Builder to set the nodeId and Key
110         NodeBuilder nodeBldr = new NodeBuilder();
111         NodeId nwNodeId = new NodeId(nodeId);
112         nodeBldr.setNodeId(nwNodeId);
113         nodeBldr.withKey(new NodeKey(nwNodeId));
114         Node1Builder node1bldr = new Node1Builder();
115
116         /*
117          * Recognize the node type: 1:ROADM, 2:XPONDER
118          */
119         switch (nodeType) {
120             case 1:
121                 node1bldr.setNodeType(OpenroadmNodeType.ROADM);
122                 break;
123             case 2:
124                 node1bldr.setNodeType(OpenroadmNodeType.XPONDER);
125                 break;
126             default:
127                 LOG.error("No correponsding type for the value: {}", nodeType);
128                 break;
129         }
130
131
132         // Sets IP, Model and Vendor information fetched from the deviceInfo
133         node1bldr.setIp(ipAddress);
134         node1bldr.setModel(model);
135         node1bldr.setVendor(vendor);
136
137         // Sets the value of Network-ref and Node-ref as a part of the supporting node
138         // attribute
139
140         SupportingNodeBuilder supportbldr = new SupportingNodeBuilder();
141         supportbldr.withKey(new SupportingNodeKey(new NetworkId(NetworkUtils.CLLI_NETWORK_ID), new NodeId(clli)));
142         supportbldr.setNetworkRef(new NetworkId(NetworkUtils.CLLI_NETWORK_ID));
143         supportbldr.setNodeRef(new NodeId(clli));
144         nodeBldr.setSupportingNode(ImmutableList.of(supportbldr.build()));
145
146         // Augment to the main node builder
147         nodeBldr.addAugmentation(Node1.class, node1bldr.build());
148         return nodeBldr.build();
149     }
150
151     /**
152      * Create empty OpenROADM network.
153      */
154     private static Network createOpenRoadmNetwork() {
155         NetworkBuilder openrdmnwBuilder = new NetworkBuilder();
156         NetworkId nwId = new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID);
157         openrdmnwBuilder.setNetworkId(nwId);
158         openrdmnwBuilder.withKey(new NetworkKey(nwId));
159         // sets network type to OpenRoadmNetwork
160         NetworkTypes1Builder openRoadmNetworkTypesBldr = new NetworkTypes1Builder();
161         openRoadmNetworkTypesBldr.setOpenroadmTopology(new OpenroadmTopologyBuilder().build());
162         NetworkTypesBuilder openrdmnwTypeBuilder = new NetworkTypesBuilder();
163         openrdmnwTypeBuilder.addAugmentation(NetworkTypes1.class, openRoadmNetworkTypesBldr.build());
164         openrdmnwBuilder.setNetworkTypes(openrdmnwTypeBuilder.build());
165         return openrdmnwBuilder.build();
166     }
167 }