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 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.Ignore;
 
  37 import org.junit.Test;
 
  38 import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl.dom.util.TestYangParserUtil;
 
  39 import org.opendaylight.mdsal.dom.api.DOMEvent;
 
  40 import org.opendaylight.mdsal.dom.api.DOMNotification;
 
  41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.FaultlogEntity;
 
  42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Guicutthrough;
 
  43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Inventory;
 
  44 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
 
  45 import org.opendaylight.yangtools.util.xml.UntrustedXML;
 
  46 import org.opendaylight.yangtools.yang.common.QName;
 
  47 import org.opendaylight.yangtools.yang.common.QNameModule;
 
  48 import org.opendaylight.yangtools.yang.common.Revision;
 
  49 import org.opendaylight.yangtools.yang.common.XMLNamespace;
 
  50 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 
  51 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier;
 
  52 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
 
  53 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 
  54 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 
  55 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
 
  56 import org.opendaylight.yangtools.yang.data.codec.xml.XmlParserStream;
 
  57 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
 
  58 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
 
  59 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter;
 
  60 import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult;
 
  61 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 
  62 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 
  63 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack.Inference;
 
  64 import org.xml.sax.SAXException;
 
  66 public class TestORanDOMToInternalDataModel {
 
  68     private static final QNameModule IETF_HARDWARE_MODULE =
 
  69             QNameModule.create(XMLNamespace.of("urn:ietf:params:xml:ns:yang:ietf-hardware"), Revision.of("2018-03-13"));
 
  70     private static final QName HW_CONTAINER = QName.create(IETF_HARDWARE_MODULE, "hardware");
 
  72     private static final QNameModule IETF_SYSTEM_MODULE =
 
  73             QNameModule.create(XMLNamespace.of("urn:ietf:params:xml:ns:yang:ietf-system"), Revision.of("2014-08-06"));
 
  74     private static final QName IETF_CONTAINER = QName.create(IETF_SYSTEM_MODULE, "system");
 
  76     private static EffectiveModelContext schemaContext;
 
  77     private static Inference hwContainerSchema;
 
  78     private static Inference systemSchema;
 
  80     private static final NodeId nodeId = new NodeId("nSky");
 
  83     public static void setup() throws IOException {
 
  84         schemaContext = TestYangParserUtil.parseYangResourceDirectory("/");
 
  85         hwContainerSchema = Inference.ofDataTreePath(schemaContext, HW_CONTAINER);
 
  86         systemSchema = Inference.ofDataTreePath(schemaContext, IETF_CONTAINER);
 
  90     public static void cleanup() {
 
  92         hwContainerSchema = null;
 
  97     public void testIetfHardwareFromXML() throws XMLStreamException, URISyntaxException, IOException, SAXException {
 
  99         final InputStream resourceAsStream = TestORanDOMToInternalDataModel.class.getResourceAsStream("/ietf-hardware.xml");
 
 102          * final XMLInputFactory factory = XMLInputFactory.newInstance();
 
 103          * XMLStreamReader reader = factory.createXMLStreamReader(resourceAsStream);
 
 105         final XMLStreamReader reader = UntrustedXML.createXMLStreamReader(resourceAsStream);
 
 107         final NormalizedNodeResult result = new NormalizedNodeResult();
 
 108         final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
 
 110         final XmlParserStream xmlParser = XmlParserStream.create(streamWriter, hwContainerSchema);
 
 111         xmlParser.parse(reader);
 
 116         NormalizedNode transformedInput = result.getResult();
 
 118         List<Inventory> inventoryList = ORanDOMToInternalDataModel.getInventoryList(nodeId, transformedInput);
 
 119         assertEquals("All elements", 27, inventoryList.size());
 
 120         assertEquals("Treelevel always there", 0,
 
 121                 inventoryList.stream().filter(inventory -> inventory.getTreeLevel() == null).count());
 
 126     public void testIetfSystemFromXML() throws XMLStreamException, URISyntaxException, IOException, SAXException {
 
 128         final InputStream resourceAsStream = TestORanDOMToInternalDataModel.class.getResourceAsStream("/onap-system.xml");
 
 130         final XMLStreamReader reader = UntrustedXML.createXMLStreamReader(resourceAsStream);
 
 132         final NormalizedNodeResult result = new NormalizedNodeResult();
 
 133         final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
 
 135         final XmlParserStream xmlParser = XmlParserStream.create(streamWriter, systemSchema);
 
 136         xmlParser.parse(reader);
 
 141         NormalizedNode transformedInput = result.getResult();
 
 142         ContainerNode cn = (ContainerNode) transformedInput;
 
 143         AugmentationIdentifier onapSystemIID = YangInstanceIdentifier.AugmentationIdentifier.create(
 
 144                 Sets.newHashSet(ORanDeviceManagerQNames.ONAP_SYSTEM_NAME, ORanDeviceManagerQNames.ONAP_SYSTEM_WEB_UI));
 
 145         Optional<Guicutthrough> gc = ORanDOMToInternalDataModel.getGuicutthrough(cn.getChildByArg(onapSystemIID));
 
 146         assertEquals(gc.isPresent(), true);
 
 151     public void testORANFault() {
 
 152         ContainerNode cn = createORANDOMFault();
 
 153         NetconfDeviceNotification faultNotif = new NetconfDeviceNotification(cn, Instant.now());
 
 154         FaultlogEntity fle = ORanDOMToInternalDataModel.getFaultLog(faultNotif, nodeId, 1);
 
 155         assertEquals(fle.getId(), "47");
 
 158     public static ContainerNode createORANDOMFault() {
 
 159         final QName fault_id = QName.create(ORanDeviceManagerQNames.ORAN_FM_FAULT_ID, "fault-id");
 
 160         final QName fault_source = QName.create(ORanDeviceManagerQNames.ORAN_FM_FAULT_SOURCE, "fault-source");
 
 161         final QName fault_severity = QName.create(ORanDeviceManagerQNames.ORAN_FM_FAULT_SEVERITY, "fault-severity");
 
 162         final QName is_cleared = QName.create(ORanDeviceManagerQNames.ORAN_FM_FAULT_IS_CLEARED, "is-cleared");
 
 163         final QName fault_text = QName.create(ORanDeviceManagerQNames.ORAN_FM_FAULT_TEXT, "fault-text");
 
 164         return Builders.containerBuilder()
 
 165                 .withNodeIdentifier(NodeIdentifier.create(ORanDeviceManagerQNames.ORAN_FM_ALARM_NOTIF))
 
 166                 .withChild(ImmutableNodes.leafNode(fault_id, "47"))
 
 167                 .withChild(ImmutableNodes.leafNode(fault_source, "Slot-2-Port-B"))
 
 168                 .withChild(ImmutableNodes.leafNode(fault_severity, "MAJOR"))
 
 169                 .withChild(ImmutableNodes.leafNode(is_cleared, "true"))
 
 170                 .withChild(ImmutableNodes.leafNode(fault_text, "CPRI Port Down")).build();
 
 173     public static class NetconfDeviceNotification implements DOMNotification, DOMEvent {
 
 174         private final ContainerNode content;
 
 175         private final Absolute schemaPath;
 
 176         private final Instant eventTime;
 
 178         NetconfDeviceNotification(final ContainerNode content, final Instant eventTime) {
 
 179             this.content = content;
 
 180             this.eventTime = eventTime;
 
 181             this.schemaPath = Absolute.of(content.getIdentifier().getNodeType());
 
 184         NetconfDeviceNotification(final ContainerNode content, final Absolute schemaPath, final Instant eventTime) {
 
 185             this.content = content;
 
 186             this.eventTime = eventTime;
 
 187             this.schemaPath = schemaPath;
 
 191         public Absolute getType() {
 
 196         public ContainerNode getBody() {
 
 201         public Instant getEventInstant() {