Add bounds to sphinx requirement
[ccsdk/features.git] / sdnr / wt / devicemanager-o-ran-sc / o-ran / ru-fh / provider / src / test / java / org / onap / ccsdk / features / sdnr / wt / devicemanager / oran / impl / binding / ComponentHelper.java
1 /*
2  * ============LICENSE_START=======================================================
3  * ONAP : ccsdk features
4  * ================================================================================
5  * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property.
6  * All rights reserved.
7  * ================================================================================
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *     http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  * ============LICENSE_END=========================================================
20  *
21  */
22 package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl.binding;
23
24 import java.util.Arrays;
25 import java.util.List;
26 import java.util.Scanner;
27 import java.util.stream.Collectors;
28 import java.util.stream.IntStream;
29 import org.json.JSONArray;
30 import org.json.JSONObject;
31 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana.hardware.rev180313.Fan;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana.hardware.rev180313.HardwareClass;
33 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana.hardware.rev180313.Port;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana.hardware.rev180313.Sensor;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.hardware.rev180313.AdminState;
36 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.hardware.rev180313.OperState;
37 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.hardware.rev180313.SensorStatus;
38 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.hardware.rev180313.SensorValue;
39 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.hardware.rev180313.SensorValueType;
40 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.hardware.rev180313.hardware.Component;
41 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.hardware.rev180313.hardware.ComponentBuilder;
42 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.hardware.rev180313.hardware.component.SensorData;
43 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.hardware.rev180313.hardware.component.SensorDataBuilder;
44 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.hardware.rev180313.hardware.component.State;
45 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.hardware.rev180313.hardware.component.StateBuilder;
46 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime;
47 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
48
49 public class ComponentHelper {
50
51     public static Component get(String name, String dateTimeString) {
52         DateAndTime dateTime = new DateAndTime(dateTimeString);
53         Uuid uuid = new Uuid("0Aabcdef-0abc-0cfD-0abC-0123456789AB");
54
55         ComponentBuilder componentBuilder = new ComponentBuilder();
56         componentBuilder.setParent("Shelf").setName("Slot-0").setParentRelPos(0);
57         componentBuilder.setUuid(uuid);
58         componentBuilder.setContainsChild(Arrays.asList("Card-01A", "Card-01B"));
59         componentBuilder.setDescription("ORAN Network Element NO-456");
60         componentBuilder.setXmlClass(TestHardwareClass.class);
61         componentBuilder.setMfgName("Nokia");
62         componentBuilder.setMfgDate(dateTime);
63         return componentBuilder.build();
64     }
65
66     public static List<Component> getComponentList(String resourceName) {
67         try (Scanner scanner = new Scanner(ComponentHelper.class.getResourceAsStream(resourceName), "UTF-8")) {
68             String jsonString = scanner.useDelimiter("\\A").next();
69             JSONObject jsonHardware = new JSONObject(jsonString).getJSONObject("hardware");
70             JSONArray jsonComponentArray = jsonHardware.getJSONArray("component");
71             return IntStream.range(0, jsonComponentArray.length())
72                     .mapToObj(idx -> ComponentHelper.get(jsonComponentArray.getJSONObject(idx)))
73                     .collect(Collectors.toList());
74         }
75     }
76
77     public static Component get(JSONObject jsonComponent) {
78         ComponentBuilder componentBuilder = new ComponentBuilder();
79         componentBuilder.setName(getString(jsonComponent, "name"));
80         componentBuilder.setParent(getString(jsonComponent, "parent"));
81         componentBuilder.setParentRelPos(getInteger(jsonComponent, "parent-rel-pos"));
82         componentBuilder.setAlias(getString(jsonComponent, "alias"));
83         componentBuilder.setXmlClass(getXmlClass(jsonComponent, "class"));
84         componentBuilder.setState(getState(jsonComponent, "state"));
85         componentBuilder.setDescription(getString(jsonComponent, "description"));
86         componentBuilder.setContainsChild(getStringArray(jsonComponent, "contains-child"));
87         componentBuilder.setSensorData(getSensorData(jsonComponent, "sensor-data"));
88         componentBuilder.setFirmwareRev(getString(jsonComponent, "firmware-rev"));
89         componentBuilder.setSerialNum(getString(jsonComponent, "serial-num"));
90         componentBuilder.setSoftwareRev(getString(jsonComponent, "software-rev"));
91         return componentBuilder.build();
92     }
93
94     // Private
95
96     private static State getState(JSONObject jsonComponent, String key) {
97         if (jsonComponent.has(key)) {
98             JSONObject jsonState = jsonComponent.getJSONObject(key);
99             StateBuilder stateBuilder = new StateBuilder();
100             stateBuilder.setOperState(getString(jsonState, "oper-state", value -> OperState.forName(value)).get());
101             stateBuilder.setAdminState(getString(jsonState, "admin-state", value -> AdminState.forName(value)).get());
102             return stateBuilder.build();
103         }
104         return null;
105     }
106
107     private static SensorData getSensorData(JSONObject jsonComponent, String key) {
108         if (jsonComponent.has(key)) {
109             JSONObject jsonSonsor = jsonComponent.getJSONObject(key);
110             SensorDataBuilder sensorBuilder = new SensorDataBuilder();
111             sensorBuilder.setValueTimestamp(getString(jsonSonsor, "value-timestamp", value -> new DateAndTime(value)));
112             sensorBuilder.setValue(getInteger(jsonSonsor, "value", value -> new SensorValue(value)));
113             sensorBuilder
114                     .setValueType(getString(jsonSonsor, "value-type", value -> SensorValueType.forName(value).get()));
115             sensorBuilder
116                     .setOperStatus(getString(jsonSonsor, "oper-status", value -> SensorStatus.forName(value).get()));
117             return sensorBuilder.build();
118         }
119         return null;
120     }
121
122     // Get data types
123     private static Class<? extends HardwareClass> getXmlClass(JSONObject jsonComponent, String key) {
124         return getString(jsonComponent, key, value -> {
125             switch (value) {
126                 case "iana-hardware:sensor":
127                     return Sensor.class;
128                 case "iana-hardware:port":
129                     return Port.class;
130                 case "iana-hardware:fan":
131                     return Fan.class;
132                 default:
133                     return HardwareClass.class;
134             }
135         });
136     }
137
138     private static String getString(JSONObject jsonObject, String key) {
139         return getString(jsonObject, key, value -> value);
140     }
141
142     private static Integer getInteger(JSONObject jsonObject, String key) {
143         return getInteger(jsonObject, key, value -> value);
144     }
145
146     private interface ConvertString<T> {
147         T convert(String value);
148     }
149
150     private static <T> T getString(JSONObject jsonObject, String key, ConvertString<T> convert) {
151         if (jsonObject.has(key)) {
152             String value = jsonObject.getString(key);
153             return convert.convert(value);
154         }
155         return null;
156     }
157
158     private interface ConvertInteger<T> {
159         T convert(int value);
160     }
161
162     private static <T> T getInteger(JSONObject jsonObject, String key, ConvertInteger<T> convert) {
163         if (jsonObject.has(key)) {
164             int value = jsonObject.getInt(key);
165             return convert.convert(value);
166         }
167         return null;
168     }
169
170     private static List<String> getStringArray(JSONObject jsonComponent, String key) {
171         if (jsonComponent.has(key)) {
172             JSONArray stringArray = jsonComponent.getJSONArray(key);
173             return IntStream.range(0, stringArray.length()).mapToObj(idx -> stringArray.getString(idx))
174                     .collect(Collectors.toList());
175         }
176         return null;
177     }
178
179 }