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.impl.dom;
24 import static org.junit.Assert.assertEquals;
25 import static org.mockito.Mockito.mock;
26 import static org.mockito.Mockito.when;
27 import java.io.IOException;
28 import java.io.InputStream;
29 import java.net.URISyntaxException;
30 import java.time.Instant;
31 import java.util.List;
32 import java.util.Optional;
33 import javax.xml.stream.XMLStreamException;
34 import javax.xml.stream.XMLStreamReader;
35 import org.eclipse.jdt.annotation.NonNull;
36 import org.junit.AfterClass;
37 import org.junit.BeforeClass;
38 import org.junit.Test;
39 import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.dataprovider.ORanDOMToInternalDataModel;
40 import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl.dom.util.TestYangParserUtil;
41 import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.yangspecs.ORANFM;
42 import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.yangspecs.OnapSystem;
43 import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.Capabilities;
44 import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfDomAccessor;
45 import org.opendaylight.mdsal.dom.api.DOMEvent;
46 import org.opendaylight.mdsal.dom.api.DOMNotification;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.FaultlogEntity;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Guicutthrough;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Inventory;
50 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
51 import org.opendaylight.yangtools.util.xml.UntrustedXML;
52 import org.opendaylight.yangtools.yang.common.QName;
53 import org.opendaylight.yangtools.yang.common.QNameModule;
54 import org.opendaylight.yangtools.yang.common.Revision;
55 import org.opendaylight.yangtools.yang.common.XMLNamespace;
56 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
57 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
58 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
59 import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode;
60 import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode;
61 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizationResult;
62 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
63 import org.opendaylight.yangtools.yang.data.codec.xml.XmlParserStream;
64 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
65 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
66 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter;
67 import org.opendaylight.yangtools.yang.data.impl.schema.NormalizationResultHolder;
68 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
69 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
70 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack.Inference;
71 import org.xml.sax.SAXException;
73 public class TestORanDOMToInternalDataModel {
75 private static final QNameModule IETF_HARDWARE_MODULE =
76 QNameModule.create(XMLNamespace.of("urn:ietf:params:xml:ns:yang:ietf-hardware"), Revision.of("2018-03-13"));
77 private static final QName HW_CONTAINER = QName.create(IETF_HARDWARE_MODULE, "hardware");
79 private static final QNameModule IETF_SYSTEM_MODULE =
80 QNameModule.create(XMLNamespace.of("urn:ietf:params:xml:ns:yang:ietf-system"), Revision.of("2014-08-06"));
81 private static final QName IETF_CONTAINER = QName.create(IETF_SYSTEM_MODULE, "system");
83 private static final QNameModule ORAN_MODULE =
84 QNameModule.create(XMLNamespace.of("urn:o-ran:fm:1.0"), Revision.of("2022-08-15"));
85 private static final QName ORAN_ACTIVE_ALARM_CONTAINER = QName.create(ORAN_MODULE, "active-alarm-list");
87 private static EffectiveModelContext schemaContext;
88 private static Inference hwContainerSchema;
89 private static Inference systemSchema;
90 private static Inference activeAlarmSchema;
91 private static Capabilities capabilities;
92 private static Optional<OnapSystem> onapSystem;
93 private static Optional<ORANFM> oranfm;
94 private static NetconfDomAccessor domAccessor;
96 private static final NodeId nodeId = new NodeId("nSky");
99 public static void setup() throws IOException {
100 schemaContext = TestYangParserUtil.parseYangResourceDirectory("/");
101 hwContainerSchema = Inference.ofDataTreePath(schemaContext, HW_CONTAINER);
102 systemSchema = Inference.ofDataTreePath(schemaContext, IETF_CONTAINER);
103 activeAlarmSchema = Inference.ofDataTreePath(schemaContext, ORAN_ACTIVE_ALARM_CONTAINER);
105 capabilities = mock(Capabilities.class);
106 domAccessor = mock(NetconfDomAccessor.class);
107 when(domAccessor.getCapabilites()).thenReturn(capabilities);
108 when(capabilities.isSupportingNamespaceAndRevision(
109 QNameModule.create(XMLNamespace.of(OnapSystem.NAMESPACE), Revision.of("2022-11-04")))).thenReturn(true);
110 onapSystem = OnapSystem.getModule(domAccessor);
111 when(capabilities.isSupportingNamespaceAndRevision(
112 QNameModule.create(XMLNamespace.of(ORANFM.NAMESPACE), Revision.of("2022-08-15")))).thenReturn(true);
113 oranfm = ORANFM.getModule(domAccessor);
118 public static void cleanup() {
119 schemaContext = null;
120 hwContainerSchema = null;
122 activeAlarmSchema = null;
126 public void testIetfHardwareFromXML() throws XMLStreamException, URISyntaxException, IOException, SAXException {
128 final InputStream resourceAsStream =
129 TestORanDOMToInternalDataModel.class.getResourceAsStream("/ietf-hardware.xml");
132 * final XMLInputFactory factory = XMLInputFactory.newInstance();
133 * XMLStreamReader reader = factory.createXMLStreamReader(resourceAsStream);
135 final XMLStreamReader reader = UntrustedXML.createXMLStreamReader(resourceAsStream);
137 final NormalizationResultHolder result = new NormalizationResultHolder();
138 final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
140 final XmlParserStream xmlParser = XmlParserStream.create(streamWriter, hwContainerSchema);
141 xmlParser.parse(reader);
146 NormalizedNode transformedInput = result.getResult().data();
148 List<Inventory> inventoryList = ORanDOMToInternalDataModel.getInventoryList(nodeId, transformedInput);
149 assertEquals("All elements", 27, inventoryList.size());
150 assertEquals("Treelevel always there", 0,
151 inventoryList.stream().filter(inventory -> inventory.getTreeLevel() == null).count());
155 public void testIetfSystemFromXML() throws XMLStreamException, URISyntaxException, IOException, SAXException {
157 final InputStream resourceAsStream =
158 TestORanDOMToInternalDataModel.class.getResourceAsStream("/onap-system.xml");
160 final XMLStreamReader reader = UntrustedXML.createXMLStreamReader(resourceAsStream);
162 final NormalizationResultHolder result = new NormalizationResultHolder();
163 final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
165 final XmlParserStream xmlParser = XmlParserStream.create(streamWriter, systemSchema);
166 xmlParser.parse(reader);
171 NormalizedNode transformedInput = result.getResult().data();
172 ContainerNode cn = (ContainerNode) transformedInput;
173 Optional<Guicutthrough> gc = ORanDOMToInternalDataModel.getGuicutthrough(cn, onapSystem.get());
174 assertEquals(gc.isPresent(), true);
178 public void testORANFault() {
179 ContainerNode cn = createORANDOMFault();
180 NetconfDeviceNotification faultNotif = new NetconfDeviceNotification(cn, Instant.now());
181 FaultlogEntity fle = ORanDOMToInternalDataModel.getFaultLog(faultNotif, oranfm.get(), nodeId);
182 assertEquals(fle.getId(), "47");
186 public void testORANActiveAlarms() throws XMLStreamException, URISyntaxException, IOException, SAXException {
187 final InputStream resourceAsStream =
188 TestORanDOMToInternalDataModel.class.getResourceAsStream("/oran-fm-active-alarm.xml");
190 final XMLStreamReader reader = UntrustedXML.createXMLStreamReader(resourceAsStream);
191 final NormalizationResultHolder result = new NormalizationResultHolder();
192 final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
194 final XmlParserStream xmlParser = XmlParserStream.create(streamWriter, activeAlarmSchema);
195 xmlParser.parse(reader);
199 @NonNull NormalizationResult<?> transformedInput = result.getResult();
200 ContainerNode cn = (ContainerNode) transformedInput.data();
202 UnkeyedListNode activeAlarmsList =
203 (UnkeyedListNode) cn.childByArg(new NodeIdentifier(oranfm.get().getFaultActiveAlarmsQName()));
204 for (UnkeyedListEntryNode activeAlarmEntry : activeAlarmsList.body())
205 ORanDOMToInternalDataModel.getFaultLog(activeAlarmEntry, oranfm.get(), new NodeId("nSky"));
208 public static ContainerNode createORANDOMFault() {
209 return Builders.containerBuilder().withNodeIdentifier(NodeIdentifier.create(oranfm.get().getAlarmNotifQName()))
210 .withChild(ImmutableNodes.leafNode(oranfm.get().getFaultIdQName(), "47"))
211 .withChild(ImmutableNodes.leafNode(oranfm.get().getFaultSourceQName(), "Slot-2-Port-B"))
212 .withChild(ImmutableNodes.leafNode(oranfm.get().getFaultSeverityQName(), "MAJOR"))
213 .withChild(ImmutableNodes.leafNode(oranfm.get().getFaultIsClearedQName(), "true"))
214 .withChild(ImmutableNodes.leafNode(oranfm.get().getFaultTextQName(), "CPRI Port Down"))
216 ImmutableNodes.leafNode(oranfm.get().getFaultEventTimeQName(), "2024-02-29T09:33:31.000+00:00"))
220 public static class NetconfDeviceNotification implements DOMNotification, DOMEvent {
221 private final ContainerNode content;
222 private final Absolute schemaPath;
223 private final Instant eventTime;
225 NetconfDeviceNotification(final ContainerNode content, final Instant eventTime) {
226 this.content = content;
227 this.eventTime = eventTime;
228 this.schemaPath = Absolute.of(content.getIdentifier().getNodeType());
231 NetconfDeviceNotification(final ContainerNode content, final Absolute schemaPath, final Instant eventTime) {
232 this.content = content;
233 this.eventTime = eventTime;
234 this.schemaPath = schemaPath;
238 public Absolute getType() {
243 public ContainerNode getBody() {
248 public Instant getEventInstant() {