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