Align initial alarms and notifications parsing
[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 / dom / TestORanDOMToInternalDataModel.java
1 /*
2  * ============LICENSE_START=======================================================
3  * ONAP : ccsdk features
4  * ================================================================================
5  * Copyright (C) 2021 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.dom;
23
24 import static org.junit.Assert.assertEquals;
25 import static org.mockito.Mockito.mock;
26 import static org.mockito.Mockito.when;
27 import com.google.common.collect.Sets;
28 import java.io.IOException;
29 import java.io.InputStream;
30 import java.net.URISyntaxException;
31 import java.time.Instant;
32 import java.util.List;
33 import java.util.Optional;
34 import javax.xml.stream.XMLStreamException;
35 import javax.xml.stream.XMLStreamReader;
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;
57 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
58 import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode;
59 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
60 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
61 import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode;
62 import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode;
63 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
64 import org.opendaylight.yangtools.yang.data.codec.xml.XmlParserStream;
65 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
66 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
67 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter;
68 import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult;
69 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
70 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
71 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack.Inference;
72 import org.xml.sax.SAXException;
73
74 public class TestORanDOMToInternalDataModel {
75
76     private static final QNameModule IETF_HARDWARE_MODULE =
77             QNameModule.create(XMLNamespace.of("urn:ietf:params:xml:ns:yang:ietf-hardware"), Revision.of("2018-03-13"));
78     private static final QName HW_CONTAINER = QName.create(IETF_HARDWARE_MODULE, "hardware");
79
80     private static final QNameModule IETF_SYSTEM_MODULE =
81             QNameModule.create(XMLNamespace.of("urn:ietf:params:xml:ns:yang:ietf-system"), Revision.of("2014-08-06"));
82     private static final QName IETF_CONTAINER = QName.create(IETF_SYSTEM_MODULE, "system");
83
84     private static final QNameModule ORAN_MODULE =
85             QNameModule.create(XMLNamespace.of("urn:o-ran:fm:1.0"), Revision.of("2022-08-15"));
86     private static final QName ORAN_ACTIVE_ALARM_CONTAINER = QName.create(ORAN_MODULE, "active-alarm-list");
87
88     private static EffectiveModelContext schemaContext;
89     private static Inference hwContainerSchema;
90     private static Inference systemSchema;
91     private static Inference activeAlarmSchema;
92     private static Capabilities capabilities;
93     private static Optional<OnapSystem> onapSystem;
94     private static Optional<ORANFM> oranfm;
95     private static NetconfDomAccessor domAccessor;
96
97     private static final NodeId nodeId = new NodeId("nSky");
98
99     @BeforeClass
100     public static void setup() throws IOException {
101         schemaContext = TestYangParserUtil.parseYangResourceDirectory("/");
102         hwContainerSchema = Inference.ofDataTreePath(schemaContext, HW_CONTAINER);
103         systemSchema = Inference.ofDataTreePath(schemaContext, IETF_CONTAINER);
104         activeAlarmSchema = Inference.ofDataTreePath(schemaContext, ORAN_ACTIVE_ALARM_CONTAINER);
105
106         capabilities = mock(Capabilities.class);
107         domAccessor = mock(NetconfDomAccessor.class);
108         when(domAccessor.getCapabilites()).thenReturn(capabilities);
109         when(capabilities.isSupportingNamespaceAndRevision(
110                 QNameModule.create(XMLNamespace.of(OnapSystem.NAMESPACE), Revision.of("2022-11-04")))).thenReturn(true);
111         onapSystem = OnapSystem.getModule(domAccessor);
112         when(capabilities.isSupportingNamespaceAndRevision(
113                 QNameModule.create(XMLNamespace.of(ORANFM.NAMESPACE), Revision.of("2022-08-15")))).thenReturn(true);
114         oranfm = ORANFM.getModule(domAccessor);
115
116     }
117
118     @AfterClass
119     public static void cleanup() {
120         schemaContext = null;
121         hwContainerSchema = null;
122         systemSchema = null;
123         activeAlarmSchema = null;
124     }
125
126     @Test
127     public void testIetfHardwareFromXML() throws XMLStreamException, URISyntaxException, IOException, SAXException {
128
129         final InputStream resourceAsStream =
130                 TestORanDOMToInternalDataModel.class.getResourceAsStream("/ietf-hardware.xml");
131
132         /*
133          * final XMLInputFactory factory = XMLInputFactory.newInstance();
134          * XMLStreamReader reader = factory.createXMLStreamReader(resourceAsStream);
135          */
136         final XMLStreamReader reader = UntrustedXML.createXMLStreamReader(resourceAsStream);
137
138         final NormalizedNodeResult result = new NormalizedNodeResult();
139         final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
140
141         final XmlParserStream xmlParser = XmlParserStream.create(streamWriter, hwContainerSchema);
142         xmlParser.parse(reader);
143
144         xmlParser.flush();
145         xmlParser.close();
146
147         NormalizedNode transformedInput = result.getResult();
148
149         List<Inventory> inventoryList = ORanDOMToInternalDataModel.getInventoryList(nodeId, transformedInput);
150         assertEquals("All elements", 27, inventoryList.size());
151         assertEquals("Treelevel always there", 0,
152                 inventoryList.stream().filter(inventory -> inventory.getTreeLevel() == null).count());
153     }
154
155     @Test
156     public void testIetfSystemFromXML() throws XMLStreamException, URISyntaxException, IOException, SAXException {
157
158         final InputStream resourceAsStream =
159                 TestORanDOMToInternalDataModel.class.getResourceAsStream("/onap-system.xml");
160
161         final XMLStreamReader reader = UntrustedXML.createXMLStreamReader(resourceAsStream);
162
163         final NormalizedNodeResult result = new NormalizedNodeResult();
164         final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
165
166         final XmlParserStream xmlParser = XmlParserStream.create(streamWriter, systemSchema);
167         xmlParser.parse(reader);
168
169         xmlParser.flush();
170         xmlParser.close();
171
172         NormalizedNode transformedInput = result.getResult();
173         ContainerNode cn = (ContainerNode) transformedInput;
174         AugmentationNode gcData = (AugmentationNode) cn.childByArg(
175                 YangInstanceIdentifier.AugmentationIdentifier.create(Sets.newHashSet(onapSystem.get().getName(),
176                         onapSystem.get().getWebUi(), onapSystem.get().getGeoLocation())));
177         Optional<Guicutthrough> gc = ORanDOMToInternalDataModel.getGuicutthrough(gcData, onapSystem.get());
178         assertEquals(gc.isPresent(), true);
179
180     }
181
182     @Test
183     public void testORANFault() {
184         ContainerNode cn = createORANDOMFault();
185         NetconfDeviceNotification faultNotif = new NetconfDeviceNotification(cn, Instant.now());
186         FaultlogEntity fle = ORanDOMToInternalDataModel.getFaultLog(faultNotif, oranfm.get(), nodeId);
187         assertEquals(fle.getId(), "47");
188     }
189
190     @Test
191     public void testORANActiveAlarms() throws XMLStreamException, URISyntaxException, IOException, SAXException {
192         final InputStream resourceAsStream =
193                 TestORanDOMToInternalDataModel.class.getResourceAsStream("/oran-fm-active-alarm.xml");
194
195         final XMLStreamReader reader = UntrustedXML.createXMLStreamReader(resourceAsStream);
196         final NormalizedNodeResult result = new NormalizedNodeResult();
197         final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
198
199         final XmlParserStream xmlParser = XmlParserStream.create(streamWriter, activeAlarmSchema);
200         xmlParser.parse(reader);
201
202         xmlParser.flush();
203         xmlParser.close();
204         NormalizedNode transformedInput = result.getResult();
205         ContainerNode cn = (ContainerNode) transformedInput;
206
207         UnkeyedListNode activeAlarmsList =
208                 (UnkeyedListNode) cn.childByArg(new NodeIdentifier(oranfm.get().getFaultActiveAlarmsQName()));
209         for (UnkeyedListEntryNode activeAlarmEntry : activeAlarmsList.body())
210             ORanDOMToInternalDataModel.getFaultLog(activeAlarmEntry, oranfm.get(), new NodeId("nSky"));
211     }
212
213     public static ContainerNode createORANDOMFault() {
214         return Builders.containerBuilder().withNodeIdentifier(NodeIdentifier.create(oranfm.get().getAlarmNotifQName()))
215                 .withChild(ImmutableNodes.leafNode(oranfm.get().getFaultIdQName(), "47"))
216                 .withChild(ImmutableNodes.leafNode(oranfm.get().getFaultSourceQName(), "Slot-2-Port-B"))
217                 .withChild(ImmutableNodes.leafNode(oranfm.get().getFaultSeverityQName(), "MAJOR"))
218                 .withChild(ImmutableNodes.leafNode(oranfm.get().getFaultIsClearedQName(), "true"))
219                 .withChild(ImmutableNodes.leafNode(oranfm.get().getFaultTextQName(), "CPRI Port Down")).build();
220     }
221
222     public static class NetconfDeviceNotification implements DOMNotification, DOMEvent {
223         private final ContainerNode content;
224         private final Absolute schemaPath;
225         private final Instant eventTime;
226
227         NetconfDeviceNotification(final ContainerNode content, final Instant eventTime) {
228             this.content = content;
229             this.eventTime = eventTime;
230             this.schemaPath = Absolute.of(content.getIdentifier().getNodeType());
231         }
232
233         NetconfDeviceNotification(final ContainerNode content, final Absolute schemaPath, final Instant eventTime) {
234             this.content = content;
235             this.eventTime = eventTime;
236             this.schemaPath = schemaPath;
237         }
238
239         @Override
240         public Absolute getType() {
241             return schemaPath;
242         }
243
244         @Override
245         public ContainerNode getBody() {
246             return content;
247         }
248
249         @Override
250         public Instant getEventInstant() {
251             return eventTime;
252         }
253     }
254 }