migrate sdnr features to phosphorus
[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 com.google.common.collect.Sets;
26 import java.io.IOException;
27 import java.io.InputStream;
28 import java.net.URISyntaxException;
29 import java.time.Instant;
30 import java.util.List;
31 import java.util.Optional;
32 import javax.xml.stream.XMLStreamException;
33 import javax.xml.stream.XMLStreamReader;
34 import org.junit.AfterClass;
35 import org.junit.BeforeClass;
36 import org.junit.Test;
37 import org.opendaylight.mdsal.dom.api.DOMEvent;
38 import org.opendaylight.mdsal.dom.api.DOMNotification;
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.Inventory;
42 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
43 import org.opendaylight.yangtools.util.xml.UntrustedXML;
44 import org.opendaylight.yangtools.yang.common.QName;
45 import org.opendaylight.yangtools.yang.common.QNameModule;
46 import org.opendaylight.yangtools.yang.common.Revision;
47 import org.opendaylight.yangtools.yang.common.XMLNamespace;
48 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
49 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier;
50 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
51 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
52 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
53 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
54 import org.opendaylight.yangtools.yang.data.codec.xml.XmlParserStream;
55 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
56 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
57 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter;
58 import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult;
59 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
60 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
61 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack.Inference;
62 import org.xml.sax.SAXException;
63
64 public class TestORanDOMToInternalDataModel {
65
66         private static final QNameModule IETF_HARDWARE_MODULE = QNameModule
67                         .create(XMLNamespace.of("urn:ietf:params:xml:ns:yang:ietf-hardware"), Revision.of("2018-03-13"));
68         private static final QName HW_CONTAINER = QName.create(IETF_HARDWARE_MODULE, "hardware");
69
70         private static final QNameModule IETF_SYSTEM_MODULE = QNameModule
71                         .create(XMLNamespace.of("urn:ietf:params:xml:ns:yang:ietf-system"), Revision.of("2014-08-06"));
72         private static final QName IETF_CONTAINER = QName.create(IETF_SYSTEM_MODULE, "system");
73
74         private static EffectiveModelContext schemaContext;
75         private static Inference hwContainerSchema;
76         private static Inference systemSchema;
77
78         private static final NodeId nodeId = new NodeId("nSky");
79
80         @BeforeClass
81         public static void setup() throws IOException {
82                 schemaContext = YangParserTestUtils.parseYangResourceDirectory("/");
83                 hwContainerSchema = Inference.ofDataTreePath(schemaContext, HW_CONTAINER);
84                 systemSchema = Inference.ofDataTreePath(schemaContext, IETF_CONTAINER);
85         }
86
87         @AfterClass
88         public static void cleanup() {
89                 schemaContext = null;
90                 hwContainerSchema = null;
91                 systemSchema = null;
92         }
93
94         @Test
95         public void testIetfHardwareFromXML() throws XMLStreamException, URISyntaxException, IOException, SAXException {
96
97                 final InputStream resourceAsStream = TestORANReadHardware.class.getResourceAsStream("/ietf-hardware.xml");
98
99                 /*
100                  * final XMLInputFactory factory = XMLInputFactory.newInstance();
101                  * XMLStreamReader reader = factory.createXMLStreamReader(resourceAsStream);
102                  */
103                 final XMLStreamReader reader = UntrustedXML.createXMLStreamReader(resourceAsStream);
104
105                 final NormalizedNodeResult result = new NormalizedNodeResult();
106                 final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
107
108                 final XmlParserStream xmlParser = XmlParserStream.create(streamWriter, hwContainerSchema);
109                 xmlParser.parse(reader);
110
111                 xmlParser.flush();
112                 xmlParser.close();
113
114                 NormalizedNode transformedInput = result.getResult();
115
116                 List<Inventory> inventoryList = ORanDOMToInternalDataModel.getInventoryList(nodeId, transformedInput);
117                 assertEquals("All elements", 27, inventoryList.size());
118                 assertEquals("Treelevel always there", 0,
119                                 inventoryList.stream().filter(inventory -> inventory.getTreeLevel() == null).count());
120         }
121
122         @Test
123         public void testIetfSystemFromXML() throws XMLStreamException, URISyntaxException, IOException, SAXException {
124
125                 final InputStream resourceAsStream = TestORANReadHardware.class.getResourceAsStream("/onap-system.xml");
126
127                 final XMLStreamReader reader = UntrustedXML.createXMLStreamReader(resourceAsStream);
128
129                 final NormalizedNodeResult result = new NormalizedNodeResult();
130                 final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
131
132                 final XmlParserStream xmlParser = XmlParserStream.create(streamWriter, systemSchema);
133                 xmlParser.parse(reader);
134
135                 xmlParser.flush();
136                 xmlParser.close();
137
138                 NormalizedNode transformedInput = result.getResult();
139                 ContainerNode cn = (ContainerNode) transformedInput;
140                 AugmentationIdentifier onapSystemIID = YangInstanceIdentifier.AugmentationIdentifier.create(
141                                 Sets.newHashSet(ORanDeviceManagerQNames.ONAP_SYSTEM_NAME, ORanDeviceManagerQNames.ONAP_SYSTEM_WEB_UI));
142                 Optional<Guicutthrough> gc = ORanDOMToInternalDataModel.getGuicutthrough(cn.getChildByArg(onapSystemIID));
143                 assertEquals(gc.isPresent(), true);
144
145         }
146
147         @Test
148         public void testORANFault() {
149                 ContainerNode cn = createORANDOMFault();
150                 NetconfDeviceNotification faultNotif = new NetconfDeviceNotification(cn, Instant.now());
151                 FaultlogEntity fle = ORanDOMToInternalDataModel.getFaultLog(faultNotif, nodeId, 1);
152                 assertEquals(fle.getId(), "47");
153         }
154
155         public static ContainerNode createORANDOMFault() {
156                 final QName fault_id = QName.create(ORanDeviceManagerQNames.ORAN_FM_FAULT_ID, "fault-id");
157                 final QName fault_source = QName.create(ORanDeviceManagerQNames.ORAN_FM_FAULT_SOURCE, "fault-source");
158                 final QName fault_severity = QName.create(ORanDeviceManagerQNames.ORAN_FM_FAULT_SEVERITY, "fault-severity");
159                 final QName is_cleared = QName.create(ORanDeviceManagerQNames.ORAN_FM_FAULT_IS_CLEARED, "is-cleared");
160                 final QName fault_text = QName.create(ORanDeviceManagerQNames.ORAN_FM_FAULT_TEXT, "fault-text");
161                 return Builders.containerBuilder()
162                                 .withNodeIdentifier(NodeIdentifier.create(ORanDeviceManagerQNames.ORAN_FM_ALARM_NOTIF))
163                                 .withChild(ImmutableNodes.leafNode(fault_id, "47"))
164                                 .withChild(ImmutableNodes.leafNode(fault_source, "Slot-2-Port-B"))
165                                 .withChild(ImmutableNodes.leafNode(fault_severity, "MAJOR"))
166                                 .withChild(ImmutableNodes.leafNode(is_cleared, "true"))
167                                 .withChild(ImmutableNodes.leafNode(fault_text, "CPRI Port Down")).build();
168         }
169
170         public static class NetconfDeviceNotification implements DOMNotification, DOMEvent {
171                 private final ContainerNode content;
172                 private final Absolute schemaPath;
173                 private final Instant eventTime;
174
175                 NetconfDeviceNotification(final ContainerNode content, final Instant eventTime) {
176                         this.content = content;
177                         this.eventTime = eventTime;
178                         this.schemaPath = Absolute.of(content.getIdentifier().getNodeType());
179                 }
180
181                 NetconfDeviceNotification(final ContainerNode content, final Absolute schemaPath, final Instant eventTime) {
182                         this.content = content;
183                         this.eventTime = eventTime;
184                         this.schemaPath = schemaPath;
185                 }
186
187                 @Override
188                 public Absolute getType() {
189                         return schemaPath;
190                 }
191
192                 @Override
193                 public ContainerNode getBody() {
194                         return content;
195                 }
196
197                 @Override
198                 public Instant getEventInstant() {
199                         return eventTime;
200                 }
201         }
202 }