2 * ============LICENSE_START=======================================================
3 * ONAP : ccsdk features
4 * ================================================================================
5 * Copyright (C) 2021 highstreet technologies GmbH Intellectual Property.
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
12 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
22 package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.dataprovider;
24 import java.util.ArrayList;
25 import java.util.Collection;
26 import java.util.List;
27 import java.util.Objects;
28 import java.util.Optional;
29 import org.eclipse.jdt.annotation.NonNull;
30 import org.eclipse.jdt.annotation.Nullable;
31 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.NetconfTimeStampImpl;
32 import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.util.ORanDMDOMUtility;
33 import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.util.ORanDeviceManagerQNames;
34 import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.yangspecs.ORANFM;
35 import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.yangspecs.OnapSystem;
36 import org.opendaylight.mdsal.dom.api.DOMNotification;
37 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.FaultlogBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.FaultlogEntity;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Guicutthrough;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.GuicutthroughBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Inventory;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.InventoryBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.SeverityType;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.SourceType;
46 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
47 import org.opendaylight.yangtools.yang.binding.CodeHelpers;
48 import org.opendaylight.yangtools.yang.common.Uint32;
49 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
50 import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode;
51 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
52 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
53 import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
54 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
55 import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode;
56 import org.slf4j.Logger;
57 import org.slf4j.LoggerFactory;
59 public class ORanDOMToInternalDataModel {
61 private static final Logger LOG = LoggerFactory.getLogger(ORanDOMToInternalDataModel.class);
63 public static List<Inventory> getInventoryList(NodeId nodeId, NormalizedNode hwData) {
65 List<Inventory> inventoryResultList = new ArrayList<Inventory>();
66 ContainerNode hwContainer = (ContainerNode) hwData;
67 MapNode componentMap =
68 (MapNode) hwContainer.getChildByArg(new NodeIdentifier(ORanDeviceManagerQNames.IETF_HW_COMPONENT_LIST));
69 Collection<MapEntryNode> componentMapEntries = componentMap.body();
71 for (MapEntryNode componentMapEntryNode : getRootComponents(componentMapEntries)) {
73 recurseGetInventory(nodeId, componentMapEntryNode, componentMapEntries, 0, inventoryResultList);
75 // Verify if result is complete
76 if (componentMapEntries.size() != inventoryResultList.size()) {
78 "Not all data were written to the Inventory. Potential entries with missing "
79 + "contained-child. Node Id = {}, Components Found = {}, Entries written to Database = {}",
80 nodeId.getValue(), componentMapEntries.size(), inventoryResultList.size());
82 return inventoryResultList;
85 private static List<Inventory> recurseGetInventory(NodeId nodeId, MapEntryNode component,
86 Collection<MapEntryNode> componentList, int treeLevel, List<Inventory> inventoryResultList) {
87 //Add element to list, if conversion successfull
88 Optional<Inventory> oInventory = getInternalEquipment(nodeId, component, treeLevel);
89 if (oInventory.isPresent()) {
90 inventoryResultList.add(oInventory.get());
92 //Walk through list of child keys and add to list
93 for (String childUuid : CodeHelpers.nonnull(new ArrayList<>(ORanDMDOMUtility.getLeafListValue(component,
94 ORanDeviceManagerQNames.IETF_HW_COMPONENT_LIST_CONTAINS_CHILD)))) {
95 for (MapEntryNode c : getComponentsByName(childUuid, componentList)) {
96 inventoryResultList = recurseGetInventory(nodeId, c, componentList, treeLevel + 1, inventoryResultList);
99 return inventoryResultList;
102 public static List<MapEntryNode> getRootComponents(Collection<MapEntryNode> componentMapEntries) {
103 List<MapEntryNode> resultList = new ArrayList<>();
104 for (MapEntryNode componentMapEntryNode : componentMapEntries) {
105 if (ORanDMDOMUtility.getLeafValue(componentMapEntryNode,
106 ORanDeviceManagerQNames.IETF_HW_COMPONENT_LIST_PARENT) == null) { // Root elements do not have a parent
107 resultList.add(componentMapEntryNode);
113 private static List<MapEntryNode> getComponentsByName(String name, Collection<MapEntryNode> componentList) {
114 List<MapEntryNode> resultList = new ArrayList<>();
115 for (MapEntryNode c : componentList) {
116 if (name.equals(ORanDMDOMUtility.getKeyValue(c))) { // <-- Component list is flat search for child's of name
123 public static Optional<Inventory> getInternalEquipment(NodeId nodeId, MapEntryNode component, int treeLevel) {
125 // Make sure that expected data are not null
126 Objects.requireNonNull(nodeId);
127 Objects.requireNonNull(component);
129 // Read mandatory data
132 String nodeIdString = nodeId.getValue();
134 String uuid = ORanDMDOMUtility.getKeyValue(component);
137 ORanDMDOMUtility.getLeafValue(component, ORanDeviceManagerQNames.IETF_HW_COMPONENT_LIST_PARENT);
139 String uuidParent = idParent != null ? idParent : uuid; //<- Passt nicht
141 // do consistency check if all mandatory parameters are there
142 if (treeLevel >= 0 && nodeIdString != null && uuid != null && uuidParent != null) {
145 InventoryBuilder inventoryBuilder = new InventoryBuilder();
147 // General assumed as mandatory
148 inventoryBuilder.setNodeId(nodeIdString);
149 inventoryBuilder.setUuid(uuid);
150 inventoryBuilder.setParentUuid(uuidParent);
151 inventoryBuilder.setTreeLevel(Uint32.valueOf(treeLevel));
153 // -- String list with ids of holders (optional)
154 inventoryBuilder.setContainedHolder(ORanDMDOMUtility.getLeafListValue(component,
155 ORanDeviceManagerQNames.IETF_HW_COMPONENT_LIST_CONTAINS_CHILD));
157 // -- Manufacturer related things (optional)
160 ORanDMDOMUtility.getLeafValue(component, ORanDeviceManagerQNames.IETF_HW_COMPONENT_LIST_MFG_NAME);
161 inventoryBuilder.setManufacturerName(mfgName);
162 inventoryBuilder.setManufacturerIdentifier(mfgName);
164 // Equipment type (optional)
165 inventoryBuilder.setDescription(
166 ORanDMDOMUtility.getLeafValue(component, ORanDeviceManagerQNames.IETF_HW_COMPONENT_LIST_DESC));
167 inventoryBuilder.setModelIdentifier(ORanDMDOMUtility.getLeafValue(component,
168 ORanDeviceManagerQNames.IETF_HW_COMPONENT_LIST_MODEL_NAME));
170 inventoryBuilder.setPartTypeId(
171 ORanDMDOMUtility.getLeafValue(component, ORanDeviceManagerQNames.IETF_HW_COMPONENT_LIST_CLASS));
173 inventoryBuilder.setTypeName(ORanDMDOMUtility.getKeyValue(component));
174 inventoryBuilder.setVersion(
175 ORanDMDOMUtility.getLeafValue(component, ORanDeviceManagerQNames.IETF_HW_COMPONENT_LIST_HW_REV));
177 // Equipment instance (optional)
180 ORanDMDOMUtility.getLeafValue(component, ORanDeviceManagerQNames.IETF_HW_COMPONENT_LIST_MFG_DATE);
181 if (mfgDate != null) {
182 inventoryBuilder.setDate(mfgDate);
184 inventoryBuilder.setSerial(
185 ORanDMDOMUtility.getLeafValue(component, ORanDeviceManagerQNames.IETF_HW_COMPONENT_LIST_SER_NUM));
187 return Optional.of(inventoryBuilder.build());
189 return Optional.empty();
193 * If system data is available convert
198 public static Optional<Guicutthrough> getGuicutthrough(@Nullable AugmentationNode onapSysAugData,
199 @NonNull OnapSystem onapSys) {
201 if (onapSysAugData != null) {
202 String name = ORanDMDOMUtility.getLeafValue(onapSysAugData, onapSys.getName());
204 Uri uri = new Uri(ORanDMDOMUtility.getLeafValue(onapSysAugData, onapSys.getWebUi()));
205 if (uri.getValue() != null) {
206 GuicutthroughBuilder gcBuilder = new GuicutthroughBuilder();
208 gcBuilder.setName(name);
210 gcBuilder.setWeburi(uri.getValue());
211 return Optional.of(gcBuilder.build());
213 LOG.warn("Uri not set to invoke a Gui cut through session to the device. Please set the Uri in the device");
215 LOG.warn("Retrieving augmented System details failed. Gui cut through information not available");
216 return Optional.empty();
220 * Convert fault notification into data-provider FaultLogEntity
222 * @param notification with O-RAN notification
224 * @param nodeId of node to handle
225 * @param counter to be integrated into data
226 * @return FaultlogEntity with data
228 public static FaultlogEntity getFaultLog(DOMNotification notification, @NonNull ORANFM oranfm, NodeId nodeId) {
229 ContainerNode cn = notification.getBody();
230 FaultlogBuilder faultAlarm = new FaultlogBuilder();
231 faultAlarm.setNodeId(nodeId.getValue());
232 faultAlarm.setObjectId(ORanDMDOMUtility.getLeafValue(cn, oranfm.getFaultSourceQName()));
233 faultAlarm.setProblem(ORanDMDOMUtility.getLeafValue(cn, oranfm.getFaultTextQName()));
234 faultAlarm.setSeverity(getSeverityType(ORanDMDOMUtility.getLeafValue(cn, oranfm.getFaultSeverityQName()),
235 ORanDMDOMUtility.getLeafValue(cn, oranfm.getFaultIsClearedQName()).equals("true")));
236 faultAlarm.setCounter(Integer.parseInt(ORanDMDOMUtility.getLeafValue(cn, oranfm.getFaultIdQName())));
237 faultAlarm.setId(ORanDMDOMUtility.getLeafValue(cn, oranfm.getFaultIdQName()));
238 faultAlarm.setSourceType(SourceType.Netconf);
239 faultAlarm.setTimestamp(NetconfTimeStampImpl.getConverter()
240 .getTimeStamp(ORanDMDOMUtility.getLeafValue(cn, oranfm.getFaultEventTimeQName())));
241 return faultAlarm.build();
244 public static FaultlogEntity getFaultLog(UnkeyedListEntryNode activeAlarmEntry, ORANFM oranfm, NodeId nodeId) {
245 FaultlogBuilder faultAlarm = new FaultlogBuilder();
246 faultAlarm.setNodeId(nodeId.getValue());
247 faultAlarm.setObjectId(ORanDMDOMUtility.getLeafValue(activeAlarmEntry, oranfm.getFaultSourceQName()));
248 faultAlarm.setProblem(ORanDMDOMUtility.getLeafValue(activeAlarmEntry, oranfm.getFaultTextQName()));
249 faultAlarm.setSeverity(getSeverityType(
250 ORanDMDOMUtility.getLeafValue(activeAlarmEntry, oranfm.getFaultSeverityQName()),
251 ORanDMDOMUtility.getLeafValue(activeAlarmEntry, oranfm.getFaultIsClearedQName()).equals("true")));
252 faultAlarm.setCounter(
253 Integer.parseInt(ORanDMDOMUtility.getLeafValue(activeAlarmEntry, oranfm.getFaultIdQName())));
254 faultAlarm.setId(ORanDMDOMUtility.getLeafValue(activeAlarmEntry, oranfm.getFaultIdQName()));
255 faultAlarm.setSourceType(SourceType.Netconf);
256 faultAlarm.setTimestamp(NetconfTimeStampImpl.getConverter()
257 .getTimeStamp(ORanDMDOMUtility.getLeafValue(activeAlarmEntry, oranfm.getFaultEventTimeQName())));
258 return faultAlarm.build();
262 * Convert O-RAN specific severity into data-provider severity
264 * @param faultSeverity O-RAN severity
265 * @param isCleared clear indicator
266 * @return data-provider severity type
267 * @throws IllegalArgumentException if conversion not possible.
269 private static SeverityType getSeverityType(@Nullable String faultSeverity, @Nullable Boolean isCleared)
270 throws IllegalArgumentException {
271 if (isCleared != null && isCleared) {
272 return SeverityType.NonAlarmed;
274 if (faultSeverity != null) {
275 switch (faultSeverity) {
277 return SeverityType.Critical;
279 return SeverityType.Major;
281 return SeverityType.Minor;
283 return SeverityType.Warning;
286 throw new IllegalArgumentException("Unknown Alarm state represent as Critical. isCleared=" + isCleared
287 + " faultSeverity=" + faultSeverity);