Include missing mapping of O-RAN fault fields 42/121942/1
authorRavi Pendurty <ravi.pendurty@highstreet-technologies.com>
Wed, 16 Jun 2021 04:52:36 +0000 (10:22 +0530)
committerRavi Pendurty <ravi.pendurty@highstreet-technologies.com>
Wed, 16 Jun 2021 04:53:34 +0000 (10:23 +0530)
Refactor O-RAN devicemanager and correct VES fault fields characteristics

Issue-ID: CCSDK-3309
Change-Id: I01441cb9c84660c0ee6931d6bbe3f28993cfd054
Signed-off-by: Ravi Pendurty <ravi.pendurty@highstreet-technologies.com>
31 files changed:
sdnr/wt/devicemanager-core/installer/pom.xml
sdnr/wt/devicemanager-core/model/pom.xml
sdnr/wt/devicemanager-core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/service/VESEventMapper.java [deleted file]
sdnr/wt/devicemanager-core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/types/VESCommonEventHeaderPOJO.java
sdnr/wt/devicemanager-core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/types/VESPNFRegistrationFieldsPOJO.java
sdnr/wt/devicemanager-core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/vescollectorconnector/impl/VESCollectorServiceImpl.java
sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/installer/pom.xml
sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/pom.xml
sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/ORanChangeNotificationListener.java
sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/ORanFaultNotificationListener.java
sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/ORanFaultToVESFaultMapper.java
sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/ORanNetworkElement.java
sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/ORanNetworkElementFactory.java
sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/ORanRegistrationToVESpnfRegistrationMapper.java
sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/ORanToInternalDataModel.java
sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/ComponentHelper.java [moved from sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/test/ComponentHelper.java with 99% similarity]
sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/TestAlarmNotif.java [moved from sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/test/TestAlarmNotif.java with 95% similarity]
sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/TestDeviceManagerORanImpl.java [moved from sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/test/TestDeviceManagerORanImpl.java with 96% similarity]
sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/TestHardwareClass.java [moved from sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/test/TestHardwareClass.java with 95% similarity]
sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/TestORanChangeNotificationListener.java [moved from sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/test/TestORanChangeNotificationListener.java with 88% similarity]
sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/TestORanFaultNotificationListener.java [new file with mode: 0644]
sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/TestORanNetworkElement.java [moved from sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/test/TestORanNetworkElement.java with 79% similarity]
sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/TestORanNetworkElementFactory.java [moved from sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/test/TestORanNetworkElementFactory.java with 67% similarity]
sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/TestORanRegistrationToVESpnfRegistration.java [moved from sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/test/TestORanRegistrationToVESpnfRegistration.java with 62% similarity]
sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/TestORanToInternalDataModel.java [moved from sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/test/TestORanToInternalDataModel.java with 98% similarity]
sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/test/TestORanFaultNotificationListener.java [deleted file]
sdnr/wt/netconfnode-state-service/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/NetconfBindingAccessor.java
sdnr/wt/netconfnode-state-service/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/NetconfDomAccessor.java
sdnr/wt/netconfnode-state-service/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/impl/access/binding/NetconfBindingAccessorImpl.java
sdnr/wt/netconfnode-state-service/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/impl/access/dom/NetconfDomAccessorImpl.java
sdnr/wt/netconfnode-state-service/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/netconfnodestateservice/test/TestNetconfNodeStateService.java

index 33067af..40d9363 100755 (executable)
@@ -47,7 +47,7 @@
 
     <dependencies>
         <dependency>
-            <groupId>org.onap.ccsdk.features.sdnr.wt</groupId>
+            <groupId>${project.groupId}</groupId>
             <artifactId>${application.name}-feature</artifactId>
             <version>${project.version}</version>
             <type>xml</type>
@@ -60,7 +60,7 @@
             </exclusions>
         </dependency>
         <dependency>
-            <groupId>org.onap.ccsdk.features.sdnr.wt</groupId>
+            <groupId>${project.groupId}</groupId>
             <artifactId>${application.name}-provider</artifactId>
             <version>${project.version}</version>
         </dependency>
index 3de2415..21aebf6 100644 (file)
             <scope>provided</scope>
         </dependency>
         <dependency>
-            <groupId>org.onap.ccsdk.features.sdnr.wt</groupId>
+            <groupId>${project.groupId}</groupId>
             <artifactId>sdnr-wt-data-provider-model</artifactId>
             <version>${project.version}</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
-            <groupId>org.onap.ccsdk.features.sdnr.wt</groupId>
+            <groupId>${project.groupId}</groupId>
             <artifactId>sdnr-wt-websocketmanager-model</artifactId>
             <version>${project.version}</version>
         </dependency>
         <dependency>
-            <groupId>org.onap.ccsdk.features.sdnr.wt</groupId>
+            <groupId>${project.groupId}</groupId>
             <artifactId>sdnr-wt-netconfnode-state-service-model</artifactId>
             <version>${project.version}</version>
             <scope>provided</scope>
diff --git a/sdnr/wt/devicemanager-core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/service/VESEventMapper.java b/sdnr/wt/devicemanager-core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/service/VESEventMapper.java
deleted file mode 100644 (file)
index 76c8305..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * ============LICENSE_START=======================================================
- * ONAP : ccsdk features
- * ================================================================================
- * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property.
- * All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- *
- */
-package org.onap.ccsdk.features.sdnr.wt.devicemanager.service;
-
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import java.time.Instant;
-import java.util.HashMap;
-import java.util.Map;
-import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.VESCommonEventHeaderPOJO;
-import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.VESFaultFieldsPOJO;
-import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.VESNotificationFieldsPOJO;
-import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.VESPNFRegistrationFieldsPOJO;
-import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfBindingAccessor;
-import org.opendaylight.yangtools.yang.binding.Notification;
-
-/*
- * Interface for mapping ODL notification to VES event fields grouped by event type.
- * Also includes the commonEventHeader which is applicable for all events.
- * Ex: fault event, notification event.
- *
- * No base implementation exists for this interface. Clients that need to map their data into VES formats must implement this interface.
- */
-
-public abstract class VESEventMapper<N extends Notification,F extends Notification,T extends Notification> {
-
-    /**
-     * Creates VESEvent mapping
-     */
-    public abstract String createMapping(NetconfBindingAccessor netconfAccessor,
-            VESCollectorService vesCollectorService, Notification notification, String notifName, int sequenceNo,
-            Instant eventTime);
-
-    /**
-     * Returns VES commonEventHeader fields
-     */
-    public abstract VESCommonEventHeaderPOJO mapCommonEventHeader(N notification);
-
-    /**
-     * Returns VES faultFields
-     */
-    public abstract VESFaultFieldsPOJO mapFaultFields(F notification);
-
-    /**
-     * Returns VES Notification Fields
-     */
-    public abstract VESNotificationFieldsPOJO mapNotificationFields(T notification);
-
-    /**
-     * Returns VES pnfRegistration domain fields
-     *
-     * @return
-     */
-    public abstract VESPNFRegistrationFieldsPOJO mapPNFRegistrationFields();
-
-    /**
-     * Generates VES Event JSON containing commonEventHeader and notificationFields fields
-     *
-     * @param commonEventHeader
-     * @param notifFields
-     * @return String - representing the VESEvent JSON
-     */
-    String generateVESEvent(VESCommonEventHeaderPOJO commonEventHeader, VESNotificationFieldsPOJO notifFields) {
-        Map<String, Object> innerEvent = new HashMap<String, Object>();
-        innerEvent.put("commonEventHeader", commonEventHeader);
-        innerEvent.put("notificationFields", notifFields);
-
-        Map<String, Object> outerEvent = new HashMap<String, Object>();
-        outerEvent.put("event", innerEvent);
-        try {
-            ObjectMapper objMapper = new ObjectMapper();
-            return objMapper.writeValueAsString(outerEvent);
-        } catch (JsonProcessingException e) {
-            e.printStackTrace();
-        }
-        return null;
-    }
-
-    /**
-     * Generates VES Event JSON containing commonEventHeader and faultFields fields
-     *
-     * @param commonEventHeader
-     * @param faultFields
-     * @return String - representing the VES Event JSON
-     */
-    String generateVESEvent(VESCommonEventHeaderPOJO commonEventHeader, VESFaultFieldsPOJO faultFields) {
-        Map<String, Object> innerEvent = new HashMap<String, Object>();
-        innerEvent.put("commonEventHeader", commonEventHeader);
-        innerEvent.put("faultFields", faultFields);
-
-        Map<String, Object> outerEvent = new HashMap<String, Object>();
-        outerEvent.put("event", innerEvent);
-        try {
-            ObjectMapper objMapper = new ObjectMapper();
-            return objMapper.writeValueAsString(outerEvent);
-        } catch (JsonProcessingException e) {
-            e.printStackTrace();
-        }
-        return null;
-    }
-
-}
index db76b84..272e4a9 100644 (file)
@@ -48,7 +48,7 @@ public class VESCommonEventHeaderPOJO {
     private String nfVendorName = "";
     private String timeZoneOffset = "+00:00";
     private String version = "4.1";
-    private String vesEventListenerVersion = "7.1.1";
+    private String vesEventListenerVersion = "7.2.1";
 
     public String getDomain() {
         return domain;
index e564914..111a8fd 100644 (file)
@@ -24,21 +24,25 @@ package org.onap.ccsdk.features.sdnr.wt.devicemanager.types;
 import java.util.HashMap;
 import java.util.Map;
 
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+
+@JsonInclude(Include.NON_NULL)
 public class VESPNFRegistrationFieldsPOJO {
 
     private Map<String, String> additionalFields = new HashMap<String, String>();
-    private String lastServiceDate = "";
-    private String macAddress = "";
-    private String manufactureDate = "";
-    private String modelNumber = "";
-    private String oamV4IpAddress = "";
-    private String oamV6IpAddress = "";
-    private String pnfRegistrationFieldsVersion = "2.0";
-    private String serialNumber = "";
-    private String softwareVersion = "";
-    private String unitFamily = "";
-    private String unitType = "";
-    private String vendorName = "";
+    private String lastServiceDate;
+    private String macAddress;
+    private String manufactureDate;
+    private String modelNumber;
+    private String oamV4IpAddress;
+    private String oamV6IpAddress;
+    private String pnfRegistrationFieldsVersion = "2.0"; // This is the only mandatory field as per the VES Event schema definition
+    private String serialNumber;
+    private String softwareVersion;
+    private String unitFamily;
+    private String unitType;
+    private String vendorName;
 
     public Map<String, String> getAdditionalFields() {
         return additionalFields;
index 47ac9c7..f1538fb 100644 (file)
@@ -197,7 +197,7 @@ public class VESCollectorServiceImpl implements VESCollectorService, IConfigChan
     public VESMessage generateVESEvent(VESCommonEventHeaderPOJO commonEventHeader, VESPNFRegistrationFieldsPOJO pnfRegistrationFields) throws JsonProcessingException {
         Map<String, Object> innerEvent = new HashMap<String, Object>();
         innerEvent.put("commonEventHeader", commonEventHeader);
-        innerEvent.put("pnfRegistration", pnfRegistrationFields);
+        innerEvent.put("pnfRegistrationFields", pnfRegistrationFields);
 
         Map<String, Object> outerEvent = new HashMap<String, Object>();
         outerEvent.put("event", innerEvent);
index 91f6897..3f89a2a 100755 (executable)
@@ -47,7 +47,7 @@
 
     <dependencies>
         <dependency>
-            <groupId>org.onap.ccsdk.features.sdnr.wt</groupId>
+            <groupId>${project.groupId}</groupId>
             <artifactId>${application.name}-feature</artifactId>
             <version>${project.version}</version>
             <type>xml</type>
@@ -60,7 +60,7 @@
             </exclusions>
         </dependency>
         <dependency>
-            <groupId>org.onap.ccsdk.features.sdnr.wt</groupId>
+            <groupId>${project.groupId}</groupId>
             <artifactId>${application.name}-provider</artifactId>
             <version>${project.version}</version>
         </dependency>
index 3074e80..2e81627 100644 (file)
             <scope>test</scope>
         </dependency>
         <dependency>
-            <groupId>org.json</groupId>
-            <artifactId>json</artifactId>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>sdnr-wt-devicemanager-core-provider</artifactId>
+            <version>${project.version}</version>
             <scope>test</scope>
         </dependency>
-
         <!-- end for testing -->
+        <dependency>
+            <groupId>org.json</groupId>
+            <artifactId>json</artifactId>
+        </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
             <artifactId>sdnr-wt-devicemanager-o-ran-sc-oran-model</artifactId>
             <scope>provided</scope>
         </dependency>
         <dependency>
-            <groupId>org.onap.ccsdk.features.sdnr.wt</groupId>
+            <groupId>${project.groupId}</groupId>
             <artifactId>rfc7317-ietf-system</artifactId>
             <version>${project.version}</version>
         </dependency>
         <dependency>
-            <groupId>org.onap.ccsdk.features.sdnr.wt</groupId>
+            <groupId>${project.groupId}</groupId>
             <artifactId>onap-system</artifactId>
             <version>${project.version}</version>
         </dependency>
index 63d8f27..c0aa0ac 100644 (file)
@@ -20,7 +20,10 @@ package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import java.util.List;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.NetconfTimeStampImpl;
+import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.DeviceManagerServiceProvider;
 import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.NotificationProxyParser;
+import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.NotificationService;
 import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.VESCollectorService;
 import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.VESCommonEventHeaderPOJO;
 import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.VESNotificationFieldsPOJO;
@@ -33,6 +36,8 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.not
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.NetconfSessionStart;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.netconf.config.change.Edit;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.EventlogBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.EventlogEntity;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.SourceType;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument;
 import org.slf4j.Logger;
@@ -47,18 +52,20 @@ public class ORanChangeNotificationListener implements IetfNetconfNotificationsL
 
     private final NetconfBindingAccessor netconfAccessor;
     private final DataProvider databaseService;
+    private final NotificationService notificationService;
     private final VESCollectorService vesCollectorService;
     private final NotificationProxyParser notificationProxyParser;
     private ORanNotifToVESEventAssembly mapper = null;
 
     private static int sequenceNo = 0;
 
-    public ORanChangeNotificationListener(NetconfBindingAccessor netconfAccessor, DataProvider databaseService,
-            VESCollectorService vesCollectorService, NotificationProxyParser notificationProxyParser) {
+    public ORanChangeNotificationListener(NetconfBindingAccessor netconfAccessor,
+            DeviceManagerServiceProvider serviceProvider) {
         this.netconfAccessor = netconfAccessor;
-        this.databaseService = databaseService;
-        this.vesCollectorService = vesCollectorService;
-        this.notificationProxyParser = notificationProxyParser;
+        this.databaseService = serviceProvider.getDataProvider();
+        this.notificationService = serviceProvider.getNotificationService();
+        this.vesCollectorService = serviceProvider.getVESCollectorService();
+        this.notificationProxyParser = vesCollectorService.getNotificationProxyParser();
     }
 
     @Override
@@ -83,8 +90,8 @@ public class ORanChangeNotificationListener implements IetfNetconfNotificationsL
 
     @Override
     public void onNetconfConfigChange(NetconfConfigChange notification) {
-        log.info("onNetconfConfigChange (1) {}", notification);
-        sequenceNo++;
+        log.info("onNetconfConfigChange (1) {}", notification.toString());
+
         StringBuffer sb = new StringBuffer();
         List<Edit> editList = notification.nonnullEdit();
         for (Edit edit : editList) {
@@ -93,19 +100,19 @@ public class ORanChangeNotificationListener implements IetfNetconfNotificationsL
             }
             sb.append(edit);
 
-            EventlogBuilder eventlogBuilder = new EventlogBuilder();
-
             InstanceIdentifier<?> target = edit.getTarget();
             if (target != null) {
-                eventlogBuilder.setObjectId(target.toString());
-                log.info("TARGET: {} {} {}", target.getClass(), target.getTargetType());
+                log.info("TARGET: {} {}", target.getClass(), target.getTargetType());
                 for (PathArgument pa : target.getPathArguments()) {
-                    log.info("PathArgument {}", pa);
+                    log.info("PathArgument {} Type {}", pa, pa.getType().getFields());
                 }
+
+                EventlogEntity eventLogEntity1 = new EventlogBuilder().setNodeId(netconfAccessor.getNodeId().getValue())
+                        .setCounter(sequenceNo++).setTimestamp(NetconfTimeStampImpl.getConverter().getTimeStamp())
+                        .setObjectId(target.getTargetType().getCanonicalName()).setAttributeName("N.A")
+                        .setSourceType(SourceType.Netconf).setNewValue(String.valueOf(edit.getOperation())).build();
+                databaseService.writeEventLog(eventLogEntity1);
             }
-            eventlogBuilder.setNodeId(netconfAccessor.getNodeId().getValue());
-            eventlogBuilder.setNewValue(String.valueOf(edit.getOperation()));
-            databaseService.writeEventLog(eventlogBuilder.build());
         }
         log.info("onNetconfConfigChange (2) {}", sb);
 
@@ -113,8 +120,9 @@ public class ORanChangeNotificationListener implements IetfNetconfNotificationsL
             if (mapper == null) {
                 this.mapper = new ORanNotifToVESEventAssembly(netconfAccessor, vesCollectorService);
             }
-            VESCommonEventHeaderPOJO header = mapper.createVESCommonEventHeader(notificationProxyParser.getTime(notification),
-                    NetconfConfigChange.class.getSimpleName(), sequenceNo);
+            VESCommonEventHeaderPOJO header =
+                    mapper.createVESCommonEventHeader(notificationProxyParser.getTime(notification),
+                            NetconfConfigChange.class.getSimpleName(), sequenceNo);
             VESNotificationFieldsPOJO body =
                     mapper.createVESNotificationFields(notificationProxyParser.parseNotificationProxy(notification),
                             NetconfConfigChange.class.getSimpleName());
index 6f5de96..a17dcd7 100644 (file)
@@ -20,91 +20,147 @@ package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import java.time.Instant;
 import java.time.format.DateTimeParseException;
-import org.eclipse.jdt.annotation.Nullable;
+import java.util.Collection;
+import java.util.Date;
+import java.util.Objects;
+import org.eclipse.jdt.annotation.NonNull;
+import org.json.JSONException;
+import org.json.JSONObject;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.NetconfTimeStamp;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.NetconfTimeStampImpl;
+import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.FaultService;
 import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.VESCollectorService;
 import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.VESCommonEventHeaderPOJO;
 import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.VESFaultFieldsPOJO;
+import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.VESMessage;
 import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfBindingAccessor;
+import org.onap.ccsdk.features.sdnr.wt.websocketmanager.model.WebsocketManagerService;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.hardware.rev180313.hardware.Component;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime;
-import org.opendaylight.yang.gen.v1.urn.o.ran.fm._1._0.rev190204.Alarm.FaultSeverity;
 import org.opendaylight.yang.gen.v1.urn.o.ran.fm._1._0.rev190204.AlarmNotif;
 import org.opendaylight.yang.gen.v1.urn.o.ran.fm._1._0.rev190204.ORanFmListener;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.FaultcurrentBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.SeverityType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.EventlogBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.SourceType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-/**
- * @author herbert
- *
- */
 public class ORanFaultNotificationListener implements ORanFmListener {
 
-    private static final Logger log = LoggerFactory.getLogger(ORanFaultNotificationListener.class);
-    private NetconfBindingAccessor netconfAccessor;
-    private DataProvider databaseService;
-    private VESCollectorService vesCollectorService;
-    private int counter = 0;
-    private ORanFaultToVESFaultMapper mapper = null;
-
-    public ORanFaultNotificationListener(NetconfBindingAccessor netconfAccessor, DataProvider databaseService,
-            VESCollectorService vesCollectorService) {
-        this.netconfAccessor = netconfAccessor;
-        this.databaseService = databaseService;
-        this.vesCollectorService = vesCollectorService;
+    private static final Logger LOG = LoggerFactory.getLogger(ORanFaultNotificationListener.class);
+
+    private final @NonNull NetconfBindingAccessor netconfAccessor;
+    private final @NonNull VESCollectorService vesCollectorService;
+    private final @NonNull ORanFaultToVESFaultMapper mapper;
+    private final @NonNull FaultService faultService;
+    private final @NonNull WebsocketManagerService websocketManagerService;
+    private final @NonNull DataProvider databaseService;
+    private static final NetconfTimeStamp NETCONFTIME_CONVERTER = NetconfTimeStampImpl.getConverter();
+
+    private Integer counter; //Local counter is assigned to Notifications
+
+    public ORanFaultNotificationListener(@NonNull NetconfBindingAccessor netconfAccessor,
+            @NonNull VESCollectorService vesCollectorService, @NonNull FaultService faultService,
+            @NonNull WebsocketManagerService websocketManagerService, @NonNull DataProvider databaseService) {
+        this.netconfAccessor = Objects.requireNonNull(netconfAccessor);
+        this.vesCollectorService = Objects.requireNonNull(vesCollectorService);
+        this.faultService = Objects.requireNonNull(faultService);
+        this.websocketManagerService = Objects.requireNonNull(websocketManagerService);
+        this.databaseService = Objects.requireNonNull(databaseService);
+
+        this.mapper = new ORanFaultToVESFaultMapper(netconfAccessor.getNodeId(), vesCollectorService,
+                AlarmNotif.class.getSimpleName());
+        this.counter = 0;
+    }
+
+    /**
+     * Gets the mfg name, mode-name and Uuid of the root component (Ex: Chassis.)
+     * In cases where there are multiple root components i.e., components with no parent,
+     * the Uuid of the last occurred component from the componentList will be considered.
+     * Till now we haven't seen Uuid set for root components, so not an issue for now.
+     * @param componentList
+     */
+    public void setComponentList(Collection<Component> componentList) {
+        for (Component component : ORanToInternalDataModel.getRootComponents(componentList)) {
+            mapper.setMfgName(component.getMfgName());
+            mapper.setUuid(component.getUuid()!=null?component.getUuid().getValue():netconfAccessor.getNodeId().getValue());
+            mapper.setModelName(component.getModelName());
+        }
     }
 
     @Override
     public void onAlarmNotif(AlarmNotif notification) {
 
-        log.info("onAlarmNotif {}", notification.getClass().getSimpleName());
-        @Nullable
-        DateAndTime eventTime = notification.getEventTime();
-        try {
-            Instant eventTimeInstant = Instant.parse(eventTime.getValue());
-
-            FaultcurrentBuilder faultCurrent = new FaultcurrentBuilder();
-            faultCurrent.setNodeId(netconfAccessor.getNodeId().getValue());
-            faultCurrent.setObjectId(notification.getFaultSource());
-            faultCurrent.setProblem(notification.getFaultText());
-            faultCurrent.setSeverity(getSeverityType(notification.getFaultSeverity()));
-            faultCurrent.setCounter(Integer.valueOf(counter++));
-            faultCurrent.setId(notification.getFaultId().toString());
-            faultCurrent.setTimestamp(eventTime);
+        LOG.debug("onAlarmNotif {}", notification.getClass().getSimpleName());
+        counter++;
 
-            databaseService.updateFaultCurrent(faultCurrent.build());
+        // Send devicemanager specific notification for database and ODLUX
+        Instant eventTimeInstant = ORanToInternalDataModel.getInstantTime(notification.getEventTime());
+        faultService.faultNotification(
+                ORanToInternalDataModel.getFaultLog(notification, netconfAccessor.getNodeId(), counter));
+        // Send model specific notification to WebSocketManager
+        websocketManagerService.sendNotification(notification, netconfAccessor.getNodeId(), AlarmNotif.QNAME);
 
+        try {
             if (vesCollectorService.getConfig().isVESCollectorEnabled()) {
-                if (mapper == null) {
-                    this.mapper = new ORanFaultToVESFaultMapper(netconfAccessor.getNodeId(), vesCollectorService,
-                            AlarmNotif.class.getSimpleName());
-                }
-                VESCommonEventHeaderPOJO header =
-                        mapper.mapCommonEventHeader(notification, eventTimeInstant, counter);
+                VESCommonEventHeaderPOJO header = mapper.mapCommonEventHeader(notification, eventTimeInstant, counter);
                 VESFaultFieldsPOJO body = mapper.mapFaultFields(notification);
-                vesCollectorService.publishVESMessage(vesCollectorService.generateVESEvent(header, body));
+                VESMessage vesMsg = vesCollectorService.generateVESEvent(header, body);
+                vesCollectorService.publishVESMessage(vesMsg);
+                LOG.info("VES Message is  {}",vesMsg.getMessage());
+                writeToEventLog(vesMsg.getMessage(), eventTimeInstant, AlarmNotif.QNAME.toString(), counter);
             }
         } catch (JsonProcessingException | DateTimeParseException e) {
-            log.debug("Can not convert event into VES message {}", notification, e);
+            LOG.debug("Can not convert event into VES message {}", notification, e);
+        }
+    }
+
+    private void writeToEventLog(String data, Instant instant, String notificationName,
+            int sequenceNo) {
+        EventlogBuilder eventlogBuilder = new EventlogBuilder();
+
+        eventlogBuilder.setObjectId("Device");
+        eventlogBuilder.setCounter(sequenceNo);
+        eventlogBuilder.setAttributeName(notificationName);
+        eventlogBuilder.setNodeId(netconfAccessor.getNodeId().getValue());
+        String eventLogMsgLvl = vesCollectorService.getConfig().getEventLogMsgDetail();
+        if (eventLogMsgLvl.equalsIgnoreCase("SHORT")) {
+            data = getShortEventLogMessage(data);
+        } else if (eventLogMsgLvl.equalsIgnoreCase("MEDIUM")) {
+            data = getMediumEventLogMessage(data);
+        } else if (eventLogMsgLvl.equalsIgnoreCase("LONG")) {
+            // do nothing, data already contains long message
+        } else { // Unknown value, default to "SHORT"
+            data = getShortEventLogMessage(data);
         }
+        eventlogBuilder.setNewValue(data);
+        eventlogBuilder.setSourceType(SourceType.Netconf);
 
+        Date eventDate = Date.from(instant);
+        eventlogBuilder.setTimestamp(new DateAndTime(NETCONFTIME_CONVERTER.getTimeStamp(eventDate)));
+
+        databaseService.writeEventLog(eventlogBuilder.build());
     }
 
-    private SeverityType getSeverityType(FaultSeverity faultSeverity) {
-        String severity = faultSeverity.getName();
-        switch (severity) {
-            case "CRITICAL":
-                return SeverityType.Critical;
-            case "MAJOR":
-                return SeverityType.Major;
-            case "MINOR":
-                return SeverityType.Minor;
-            case "WARNING":
-                return SeverityType.Warning;
-            default:
-                return SeverityType.NonAlarmed;
+    private String getShortEventLogMessage(String data) {
+        try {
+            JSONObject jsonObj = new JSONObject(data);
+            String domain = jsonObj.getJSONObject("event").getJSONObject("commonEventHeader").getString("domain");
+            String eventId = jsonObj.getJSONObject("event").getJSONObject("commonEventHeader").getString("eventId");
+            return "domain:" + domain + " eventId:" + eventId;
+        } catch (JSONException e) {
+            LOG.debug("{}", e);
+            return "Invalid message received";
         }
     }
 
+    private String getMediumEventLogMessage(String data) {
+        try {
+            JSONObject jsonObj = new JSONObject(data);
+            return jsonObj.getJSONObject("event").getJSONObject("commonEventHeader").toString();
+        } catch (JSONException e) {
+            LOG.debug("{}", e);
+            return "Invalid message received";
+        }
+    }
 }
index 1790f82..0d68bdb 100644 (file)
@@ -36,6 +36,7 @@ import org.slf4j.LoggerFactory;
  *
  *
  *      VES Fields                  Mapping
+ *      ----------                  -------
  *      domain                      "fault"
  *      eventId                     "nt:network-topology/nt:topology/nt:node/nt:node-id"
  *      eventName                   "nt:network-topology/nt:topology/nt:node/nt:node-id"
@@ -43,17 +44,17 @@ import org.slf4j.LoggerFactory;
  *      lastEpochMicrosec           TimeStamp represented by <eventTime> field in NetConf notification header in unix time format - as microseconds elapsed since 1 Jan 1970 not including leap seconds.
  *      nfcNamingCode               always ""
  *      nfNamingCode                always ""
- *      nfVendorName                ???
+ *      nfVendorName                /ietf-hardware:hardware/component[not(parent)][1]/mfg-name
  *      priority                    "Normal"
  *      reportingEntityId           The OAM-Controller identifier with in the SMO - e.g. the fully qualified domain name or IP-Address.
  *      reportingEntityName         as configured by helm charts for the OpenDaylight cluster name ??????
  *      sequence                    As per NetConf notification increasing sequence number as unsigned integer 32 bits. The value is reused in the eventId field.
- *      sourceId                    ?????
+ *      sourceId                    Value of ietf-hardware (RFC8348) /hardware/component[not(parent)][1]/uuid or 'nt:network-topology/nt:topology/nt:node/nt:node-id' if ietf component not found.
  *      sourceName                  "nt:network-topology/nt:topology/nt:node/nt:node-id"
- *      startEpochMicrosec
- *      timeZoneOffset
+ *      startEpochMicrosec          Current OAM-Controller Node timestamp in unix time format - as microseconds elapsed since 1 Jan 1970 not including leap seconds.
+ *      timeZoneOffset              Static text: "+00:00"
  *      version                     "4.1"
- *      vesEventListenerVersion     "7.2"
+ *      vesEventListenerVersion     "7.2.1"
  *
  *
  *      alarmAdditionalInformation
@@ -61,7 +62,7 @@ import org.slf4j.LoggerFactory;
  *      alarmInterfaceA             Value of "o-ran-fm:alarm-notif/fault-source"
  *      eventCategory               Static text "O-RU failure"
  *      eventSeverity               Value of "o-ran-fm:alarm-notif/fault-severity". But if "o-ran-fm:alarm-notif/is-cleared" then "NORMAL"
- *      eventSourceType             The value of ietf-hardware (RFC8348) /hardware/component[not(parent)][1]/mfg-model or "O-RU" if not found.
+ *      eventSourceType             The value of ietf-hardware (RFC8348) /hardware/component[not(parent)][1]/model-name or "O-RU" if not found.
  *      faultFieldsVersion          "4.0"
  *      specificProblem             A mapping of the fault-id to its description according to O-RAN OpenFronthaul specification.
  *      vfStatus                    "Active"
@@ -71,6 +72,7 @@ import org.slf4j.LoggerFactory;
 
 public class ORanFaultToVESFaultMapper {
 
+    @SuppressWarnings("unused")
     private static final Logger LOG = LoggerFactory.getLogger(ORanFaultToVESFaultMapper.class);
     private static final String VES_EVENT_DOMAIN = "fault";
     private static final String VES_EVENTTYPE = "ORAN_Fault";
@@ -82,7 +84,9 @@ public class ORanFaultToVESFaultMapper {
     private final VESCollectorService vesProvider;
     private final String notifName;    // Name
     private final String nodeIdString; // Sourcename
-
+    private String mfgName;
+    private String uuid;
+    private String modelName;
 
     public ORanFaultToVESFaultMapper(NodeId nodeId, VESCollectorService vesCollectorService,
             String notifName) {
@@ -91,6 +95,30 @@ public class ORanFaultToVESFaultMapper {
         this.notifName = notifName;
     }
 
+    public void setMfgName(String mfgName) {
+        this.mfgName= mfgName;
+    }
+
+    private String getMfgName() {
+        return mfgName;
+    }
+
+    public void setUuid(String uuid) {
+        this.uuid = uuid;
+    }
+
+    private String getUuid() {
+        return uuid;
+    }
+
+    public void setModelName(String modelName) {
+        this.modelName = modelName;
+    }
+
+    private String getModelName() {
+        return modelName;
+    }
+
     public VESCommonEventHeaderPOJO mapCommonEventHeader(AlarmNotif notification, Instant eventTime, int sequenceNo) {
         VESCommonEventHeaderPOJO vesCEH = new VESCommonEventHeaderPOJO();
         vesCEH.setDomain(VES_EVENT_DOMAIN);
@@ -105,10 +133,10 @@ public class ORanFaultToVESFaultMapper {
         vesCEH.setEventId(eventId);
         vesCEH.setStartEpochMicrosec(eventTime.toEpochMilli() * 1000);
         vesCEH.setLastEpochMicrosec(eventTime.toEpochMilli() * 1000);
-        vesCEH.setNfVendorName("ORAN");
+        vesCEH.setNfVendorName(getMfgName());
         vesCEH.setReportingEntityName(vesProvider.getConfig().getReportingEntityName());
         vesCEH.setSequence(sequenceNo);
-        vesCEH.setSourceId("ORAN");
+        vesCEH.setSourceId(getUuid());
         vesCEH.setSourceName(nodeIdString);
 
         return vesCEH;
@@ -121,6 +149,7 @@ public class ORanFaultToVESFaultMapper {
         vesFaultFields.setAlarmInterfaceA(alarmNotif.getFaultSource());
         vesFaultFields.setEventCategory(VES_EVENT_CATEGORY);
         vesFaultFields.setEventSeverity(alarmNotif.getFaultSeverity().getName());
+        vesFaultFields.setEventSourceType(getModelName());
         vesFaultFields.setFaultFieldsVersion(VES_FAULT_FIELDS_VERSION);
         vesFaultFields.setSpecificProblem(alarmNotif.getFaultText());
         vesFaultFields.setVfStatus(VES_FAULT_FIELDS_VFSTATUS);
index 0bb7f87..05f1e6d 100644 (file)
@@ -19,21 +19,23 @@ package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
 import org.onap.ccsdk.features.sdnr.wt.common.YangHelper;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider;
 import org.onap.ccsdk.features.sdnr.wt.devicemanager.ne.service.NetworkElement;
 import org.onap.ccsdk.features.sdnr.wt.devicemanager.ne.service.NetworkElementService;
-import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.NotificationProxyParser;
+import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.DeviceManagerServiceProvider;
 import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.VESCollectorService;
 import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.VESCommonEventHeaderPOJO;
 import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.VESPNFRegistrationFieldsPOJO;
+import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.Capabilities;
 import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfAccessor;
 import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfBindingAccessor;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netmod.notification.rev080714.netconf.streams.Stream;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.hardware.rev180313.Hardware;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.hardware.rev180313.hardware.Component;
 import org.opendaylight.yang.gen.v1.urn.onap.system.rev201026.System1;
@@ -47,59 +49,67 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.NotificationListener;
+import org.opendaylight.yangtools.yang.common.QName;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class ORanNetworkElement implements NetworkElement {
 
-    private static final Logger log = LoggerFactory.getLogger(ORanNetworkElement.class);
+    private static final Logger LOG = LoggerFactory.getLogger(ORanNetworkElement.class);
 
-    private final NetconfBindingAccessor netconfAccessor;
+    public static final QName ONAP_SYSTEM =
+            org.opendaylight.yang.gen.v1.urn.onap.system.rev201026.$YangModuleInfoImpl.getInstance().getName();
+    private static final InstanceIdentifier<System1> SYSTEM1_IID = InstanceIdentifier
+            .builder(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.system.rev140806.System.class)
+            .augmentation(System1.class).build();
 
+    private final NetconfBindingAccessor netconfAccessor;
     private final DataProvider databaseService;
-
-    @SuppressWarnings("unused")
+    private final ORanRegistrationToVESpnfRegistrationMapper mapper;
     private final VESCollectorService vesCollectorService;
 
     private ListenerRegistration<NotificationListener> oRanListenerRegistrationResult;
     private @NonNull final ORanChangeNotificationListener oRanListener;
     private ListenerRegistration<NotificationListener> oRanFaultListenerRegistrationResult;
     private @NonNull final ORanFaultNotificationListener oRanFaultListener;
-    private final NotificationProxyParser notificationProxyParser;
-    private @NonNull ORanRegistrationToVESpnfRegistrationMapper mapper;
-    private Collection<Component> componentList;
-    private static int sequenceNo = 0;
-
-    ORanNetworkElement(NetconfBindingAccessor netconfAccess, DataProvider databaseService,
-            VESCollectorService vesCollectorService) {
-        log.info("Create {}", ORanNetworkElement.class.getSimpleName());
+
+    ORanNetworkElement(NetconfBindingAccessor netconfAccess, DeviceManagerServiceProvider serviceProvider) {
+        LOG.info("Create {}", ORanNetworkElement.class.getSimpleName());
+        // Read parameters
         this.netconfAccessor = netconfAccess;
-        this.databaseService = databaseService;
-        this.vesCollectorService = vesCollectorService;
-        this.notificationProxyParser = vesCollectorService.getNotificationProxyParser();
 
+        // Get services
+        this.databaseService = serviceProvider.getDataProvider();
+        this.vesCollectorService = serviceProvider.getVESCollectorService();
+
+        this.mapper = new ORanRegistrationToVESpnfRegistrationMapper(netconfAccessor, vesCollectorService);
+
+        // Register callbacks
         this.oRanListenerRegistrationResult = null;
-        this.oRanListener = new ORanChangeNotificationListener(netconfAccessor, databaseService, vesCollectorService,
-                notificationProxyParser);
+        this.oRanListener = new ORanChangeNotificationListener(netconfAccessor, serviceProvider);
 
         this.oRanFaultListenerRegistrationResult = null;
-        this.oRanFaultListener =
-                new ORanFaultNotificationListener(netconfAccessor, databaseService, vesCollectorService);
+        this.oRanFaultListener = new ORanFaultNotificationListener(netconfAccessor, vesCollectorService,
+                serviceProvider.getFaultService(), serviceProvider.getWebsocketService(), databaseService);
     }
 
-    private void initialReadFromNetworkElement() {
+    private Collection<Component> initialReadFromNetworkElement() {
+        Collection<Component> componentList;
         Hardware hardware = readHardware();
         if (hardware != null) {
             componentList = YangHelper.getCollection(hardware.nonnullComponent());
             List<Inventory> inventoryList =
                     ORanToInternalDataModel.getInventoryList(netconfAccessor.getNodeId(), componentList);
             databaseService.writeInventory(netconfAccessor.getNodeId().getValue(), inventoryList);
+        } else {
+            componentList = Collections.emptyList();
         }
 
         Optional<Guicutthrough> oGuicutthrough = ORanToInternalDataModel.getGuicutthrough(getOnapSystemData());
         if (oGuicutthrough.isPresent()) {
             databaseService.writeGuiCutThroughData(oGuicutthrough.get(), netconfAccessor.getNodeId().getValue());
         }
+        return componentList;
     }
 
     @Override
@@ -109,21 +119,18 @@ public class ORanNetworkElement implements NetworkElement {
 
     @Override
     public void register() {
-        initialReadFromNetworkElement();
+        // Read data from device
+        Collection<Component> componentList = initialReadFromNetworkElement();
+        oRanFaultListener.setComponentList(componentList);
         // Publish the mountpoint to VES if enabled
-        publishMountpointToVES();
+        publishMountpointToVES(componentList);
         // Register call back class for receiving notifications
-            this.oRanListenerRegistrationResult = netconfAccessor.doRegisterNotificationListener(oRanListener);
-            this.oRanFaultListenerRegistrationResult =
-                    netconfAccessor.doRegisterNotificationListener(oRanFaultListener);
-            // Register notifications stream
-            if (netconfAccessor.isNotificationsRFC5277Supported()) {
-                List<Stream> streamList = netconfAccessor.getNotificationStreams();
-                netconfAccessor.registerNotificationsStream(NetconfBindingAccessor.DefaultNotificationsStream); // Always register first to default stream
-                netconfAccessor.registerNotificationsStream(streamList);
-            } else {
-                netconfAccessor.registerNotificationsStream(NetconfBindingAccessor.DefaultNotificationsStream);
-            }
+        this.oRanListenerRegistrationResult = netconfAccessor.doRegisterNotificationListener(oRanListener);
+        this.oRanFaultListenerRegistrationResult = netconfAccessor.doRegisterNotificationListener(oRanFaultListener);
+        // Register notifications stream
+        if (netconfAccessor.isNotificationsRFC5277Supported()) {
+            netconfAccessor.registerNotificationsStream();
+        }
     }
 
     @Override
@@ -136,7 +143,6 @@ public class ORanNetworkElement implements NetworkElement {
         } ;
     }
 
-
     @Override
     public NodeId getNodeId() {
         return netconfAccessor.getNodeId();
@@ -155,82 +161,96 @@ public class ORanNetworkElement implements NetworkElement {
         return Optional.of(netconfAccessor);
     }
 
+    // Private functions
+
+    private String getMountpointId() {
+        return getNodeId().getValue();
+    }
+
     // Read from device
-    private System1 getOnapSystemData() {
-        log.info("Get System1 for class {} from mountpoint {}", netconfAccessor.getNodeId().getValue());
-
-        InstanceIdentifier<System1> system1IID = InstanceIdentifier
-                .builder(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.system.rev140806.System.class)
-                .augmentation(System1.class).build();
-        System1 res = netconfAccessor.getTransactionUtils().readData(netconfAccessor.getDataBroker(),
-                LogicalDatastoreType.OPERATIONAL, system1IID);
-        log.debug("Result of System1 = {}", res);
-        return res;
+    /**
+     * Read system data with GUI cut through information from device if ONAP_SYSTEM YANG is supported.
+     *
+     * @return System1 data with GUI cut through information or null if not available.
+     */
+    private @Nullable System1 getOnapSystemData() {
+        LOG.info("Get System1 for class {} from mountpoint {}", netconfAccessor.getNodeId().getValue());
+        Capabilities x = netconfAccessor.getCapabilites();
+        LOG.info("Capabilites: {}", x);
+        if (x.isSupportingNamespace(ONAP_SYSTEM)) {
+            @Nullable
+            System1 res = netconfAccessor.getTransactionUtils().readData(netconfAccessor.getDataBroker(),
+                    LogicalDatastoreType.OPERATIONAL, SYSTEM1_IID);
+            LOG.debug("Result of System1 = {}", res);
+            return res;
+        } else {
+            LOG.debug("No GUI cut through support");
+            return null;
+        }
     }
 
     private Hardware readHardware() {
         final Class<Hardware> clazzPac = Hardware.class;
-        log.info("DBRead Get hardware for class {} from mountpoint {}", clazzPac.getSimpleName(),
+        LOG.info("DBRead Get hardware for class {} from mountpoint {}", clazzPac.getSimpleName(),
                 netconfAccessor.getNodeId().getValue());
         InstanceIdentifier<Hardware> hardwareIID = InstanceIdentifier.builder(clazzPac).build();
         Hardware res = netconfAccessor.getTransactionUtils().readData(netconfAccessor.getDataBroker(),
                 LogicalDatastoreType.OPERATIONAL, hardwareIID);
-        log.debug("Result of Hardware = {}", res);
+        LOG.debug("Result of Hardware = {}", res);
         return res;
     }
 
-    private void publishMountpointToVES() {
-        log.debug("In publishMountpointToVES()");
+    // VES related
+    private void publishMountpointToVES(Collection<Component> componentList) {
+
+        LOG.debug("In publishMountpointToVES()");
 
-        /**
-         * 1. Check if this device is in the list of allowed-devices.
-         * 2. If device exists in allowed-devices, then create VES pnfRegistration event and publish to VES
+        /*
+         * 1. Check if this device is in the list of allowed-devices. 2. If device
+         * exists in allowed-devices, then create VES pnfRegistration event and publish
+         * to VES
          */
-        if (inAllowedDevices(netconfAccessor.getNodeId().getValue())) {
+        if (inAllowedDevices(getMountpointId())) {
             if (vesCollectorService.getConfig().isVESCollectorEnabled()) {
-
                 for (Component component : ORanToInternalDataModel.getRootComponents(componentList)) {
-                    //Just get one component. At the moment we don't care which one. Also since there is only one management address, we assume there will be only one chassis.
-                    //If the device supports subtended configuration then it is assumed that the Chassis containing the management interface will be the root component and there will be only one root.
-                    this.mapper = new ORanRegistrationToVESpnfRegistrationMapper(netconfAccessor,
-                            vesCollectorService, component);
-                    VESCommonEventHeaderPOJO header =
-                            mapper.mapCommonEventHeader(sequenceNo++);
-                    VESPNFRegistrationFieldsPOJO body = mapper.mapPNFRegistrationFields();
+                    // Just get one component. At the moment we don't care which one. Also since
+                    // there is only one management address, we assume there will be only one
+                    // chassis.
+                    // If the device supports subtended configuration then it is assumed that the
+                    // Chassis containing the management interface will be the root component and
+                    // there will be only one root.
+                    VESCommonEventHeaderPOJO header = mapper.mapCommonEventHeader(component);
+                    VESPNFRegistrationFieldsPOJO body = mapper.mapPNFRegistrationFields(component);
                     try {
                         vesCollectorService.publishVESMessage(vesCollectorService.generateVESEvent(header, body));
                     } catch (JsonProcessingException e) {
-                        log.warn("Error while serializing VES Event to String ", e);
+                        LOG.warn("Error while serializing VES Event to String ", e);
                         e.printStackTrace();
                     }
-
                 }
             }
-
         }
-
     }
 
     private boolean inAllowedDevices(String mountpointName) {
         final InstanceIdentifier<AllowedDevices> ALL_DEVICES =
                 InstanceIdentifier.create(NetconfCallhomeServer.class).child(AllowedDevices.class);
 
-        AllowedDevices allowedDevices;
-        allowedDevices = netconfAccessor.getTransactionUtils().readData(
+        AllowedDevices allowedDevices = netconfAccessor.getTransactionUtils().readData(
                 netconfAccessor.getControllerBindingDataBroker(), LogicalDatastoreType.CONFIGURATION, ALL_DEVICES);
 
         if (allowedDevices != null) {
             Collection<Device> deviceList = YangHelper.getCollection(allowedDevices.nonnullDevice());
             for (Device device : deviceList) {
-                log.info("Device in allowed-devices is - {}", device.getUniqueId());
+                LOG.info("Device in allowed-devices is - {}", device.getUniqueId());
                 if (device.getUniqueId().equals(netconfAccessor.getNodeId().getValue())) {
-                    log.info("Mountpoint is part of allowed-devices list");
+                    LOG.info("Mountpoint is part of allowed-devices list");
                     return true;
                 }
             }
         }
 
-        log.info("Mountpoint {} is not part of allowed-devices list", mountpointName);
+        LOG.info("Mountpoint {} is not part of allowed-devices list", mountpointName);
         return false;
     }
 
index 55b2eea..fff1fba 100644 (file)
@@ -47,8 +47,7 @@ public class ORanNetworkElementFactory implements NetworkElementFactory {
                 log.info("Create device {} ", ORanNetworkElement.class.getName());
                 Optional<NetconfBindingAccessor> bindingAccessor = accessor.getNetconfBindingAccessor();
                 if (bindingAccessor.isPresent()) {
-                    return Optional.of(new ORanNetworkElement(bindingAccessor.get(), serviceProvider.getDataProvider(),
-                            serviceProvider.getVESCollectorService()));
+                    return Optional.of(new ORanNetworkElement(bindingAccessor.get(), serviceProvider));
                 }
             }
         }
index 81605e4..3524383 100644 (file)
@@ -22,7 +22,6 @@
 package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl;
 
 import java.time.Instant;
-import org.eclipse.jdt.annotation.NonNull;
 import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.VESCollectorService;
 import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.VESCommonEventHeaderPOJO;
 import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.VESPNFRegistrationFieldsPOJO;
@@ -33,6 +32,7 @@ import org.slf4j.LoggerFactory;
 
 public class ORanRegistrationToVESpnfRegistrationMapper {
 
+    @SuppressWarnings("unused")
     private static final Logger LOG = LoggerFactory.getLogger(ORanFaultToVESFaultMapper.class);
     //CommonEventHeader fields
     private static final String VES_EVENT_DOMAIN = "pnfRegistration";
@@ -40,17 +40,20 @@ public class ORanRegistrationToVESpnfRegistrationMapper {
     private static final String VES_EVENT_PRIORITY = "Normal";
 
     private final VESCollectorService vesProvider;
-    private final @NonNull Component component;
     private final NetconfAccessor netconfAccessor;
 
+    private Integer sequenceNo;
+
+
     public ORanRegistrationToVESpnfRegistrationMapper(NetconfAccessor netconfAccessor,
-            VESCollectorService vesCollectorService, Component component) {
+            VESCollectorService vesCollectorService) {
         this.netconfAccessor = netconfAccessor;
         this.vesProvider = vesCollectorService;
-        this.component = component;
+
+        this.sequenceNo = 0;
     }
 
-    public VESCommonEventHeaderPOJO mapCommonEventHeader(int sequenceNo) {
+    public VESCommonEventHeaderPOJO mapCommonEventHeader(Component component) {
         VESCommonEventHeaderPOJO vesCEH = new VESCommonEventHeaderPOJO();
         vesCEH.setDomain(VES_EVENT_DOMAIN);
         vesCEH.setEventId(netconfAccessor.getNodeId().getValue());
@@ -62,24 +65,24 @@ public class ORanRegistrationToVESpnfRegistrationMapper {
         vesCEH.setLastEpochMicrosec(Instant.now().toEpochMilli() * 1000);
         vesCEH.setNfVendorName(component.getMfgName());
         vesCEH.setReportingEntityName(vesProvider.getConfig().getReportingEntityName());
-        vesCEH.setSequence(sequenceNo);
-        vesCEH.setSourceId(component.getUuid().toString());
+        vesCEH.setSequence(sequenceNo++);
+        vesCEH.setSourceId(component.getUuid() != null ? component.getUuid().toString():netconfAccessor.getNodeId().getValue());
         vesCEH.setSourceName(netconfAccessor.getNodeId().getValue());
 
         return vesCEH;
     }
 
-    public VESPNFRegistrationFieldsPOJO mapPNFRegistrationFields() {
+    public VESPNFRegistrationFieldsPOJO mapPNFRegistrationFields(Component component) {
         VESPNFRegistrationFieldsPOJO vesPnfFields = new VESPNFRegistrationFieldsPOJO();
         vesPnfFields.setModelNumber(component.getModelName());
-        vesPnfFields.setOamV4IpAddress(netconfAccessor.getNetconfNode().getHost().getIpAddress().toString());
-        //vesPnfFields.setOamV6IpAddress(oamV6IpAddress); // Check if IP address in V6 format and then include it. Same with v4 address also
+        vesPnfFields.setOamV4IpAddress(netconfAccessor.getNetconfNode().getHost().getIpAddress().getIpv4Address()!=null?netconfAccessor.getNetconfNode().getHost().getIpAddress().getIpv4Address().getValue():null);
+        vesPnfFields.setOamV6IpAddress(netconfAccessor.getNetconfNode().getHost().getIpAddress().getIpv6Address()!=null?netconfAccessor.getNetconfNode().getHost().getIpAddress().getIpv6Address().getValue():null);
         vesPnfFields.setSerialNumber(component.getSerialNum());
         vesPnfFields.setVendorName(component.getMfgName());
         vesPnfFields.setSoftwareVersion(component.getSoftwareRev());
         vesPnfFields.setUnitType(component.getAlias());
         vesPnfFields.setUnitFamily(component.getXmlClass().toString());
-        vesPnfFields.setManufactureDate(component.getMfgDate().toString());
+        vesPnfFields.setManufactureDate(component.getMfgDate()!=null?component.getMfgDate().toString():"Unknown");
         //vesPnfFields.setLastServiceDate(component.getLastChange());
 
         return vesPnfFields;
index 1f84db4..71ab613 100644 (file)
@@ -17,6 +17,7 @@
  */
 package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl;
 
+import java.time.Instant;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -27,11 +28,17 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana.hardware.re
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.hardware.rev180313.hardware.Component;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime;
+import org.opendaylight.yang.gen.v1.urn.o.ran.fm._1._0.rev190204.Alarm.FaultSeverity;
+import org.opendaylight.yang.gen.v1.urn.o.ran.fm._1._0.rev190204.AlarmNotif;
 import org.opendaylight.yang.gen.v1.urn.onap.system.rev201026.System1;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.FaultlogBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.FaultlogEntity;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Guicutthrough;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.GuicutthroughBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Inventory;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.InventoryBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.SeverityType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.SourceType;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
 import org.opendaylight.yangtools.yang.binding.CodeHelpers;
 import org.opendaylight.yangtools.yang.common.Uint32;
@@ -111,8 +118,8 @@ public class ORanToInternalDataModel {
     }
 
     /**
-     * Convert equipment into Inventory. Decide if inventory can by created from content or not.
-     * Public for test case.
+     * Convert equipment into Inventory. Decide if inventory can by created from content or not. Public for test case.
+     *
      * @param nodeId of node (Similar to mountpointId)
      * @param component to handle
      * @param treeLevel of components
@@ -181,6 +188,12 @@ public class ORanToInternalDataModel {
         return Optional.empty();
     }
 
+    /**
+     * If system data is available convert
+     *
+     * @param sys
+     * @return
+     */
     public static Optional<Guicutthrough> getGuicutthrough(@Nullable System1 sys) {
         if (sys != null) {
             String name = sys.getName();
@@ -200,4 +213,64 @@ public class ORanToInternalDataModel {
         return Optional.empty();
     }
 
+    /**
+     * Convert netconf time into Instant
+     *
+     * @param eventTime with netconf time
+     * @return Instant with converted time. If not convertable provide Instant.Min
+     */
+    public static Instant getInstantTime(@Nullable DateAndTime eventTime) {
+        return eventTime != null ? Instant.parse(eventTime.getValue()) : Instant.MIN;
+    }
+
+    /**
+     * Convert fault notification into data-provider FaultLogEntity
+     *
+     * @param notification with O-RAN notification
+     * @param nodeId of node to handle
+     * @param counter to be integrated into data
+     * @return FaultlogEntity with data
+     */
+    public static FaultlogEntity getFaultLog(AlarmNotif notification, NodeId nodeId, Integer counter) {
+        FaultlogBuilder faultAlarm = new FaultlogBuilder();
+        faultAlarm.setNodeId(nodeId.getValue());
+        faultAlarm.setObjectId(notification.getFaultSource());
+        faultAlarm.setProblem(notification.getFaultText());
+        faultAlarm.setSeverity(getSeverityType(notification.getFaultSeverity(), notification.isIsCleared()));
+        faultAlarm.setCounter(counter);
+        faultAlarm.setId(String.valueOf(notification.getFaultId()));
+        faultAlarm.setSourceType(SourceType.Netconf);
+        faultAlarm.setTimestamp(notification.getEventTime());
+        return faultAlarm.build();
+    }
+
+    /**
+     * Convert O-RAN specific severity into data-provider severity
+     *
+     * @param faultSeverity O-RAN severity
+     * @param isCleared clear indicator
+     * @return data-provider severity type
+     * @throws IllegalArgumentException if conversion not possible.
+     */
+    public static SeverityType getSeverityType(@Nullable FaultSeverity faultSeverity, @Nullable Boolean isCleared)
+            throws IllegalArgumentException {
+        if (isCleared != null && isCleared) {
+            return SeverityType.NonAlarmed;
+        }
+        if (faultSeverity != null) {
+            switch (faultSeverity) {
+                case CRITICAL:
+                    return SeverityType.Critical;
+                case MAJOR:
+                    return SeverityType.Major;
+                case MINOR:
+                    return SeverityType.Minor;
+                case WARNING:
+                    return SeverityType.Warning;
+            }
+        }
+        throw new IllegalArgumentException("Unknown Alarm state represent as Critical. isCleared=" + isCleared
+                + " faultSeverity=" + faultSeverity);
+    }
+
 }
@@ -19,7 +19,7 @@
  * ============LICENSE_END=========================================================
  *
  */
-package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.test;
+package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl;
 
 import java.util.Map;
 import org.eclipse.jdt.annotation.NonNull;
@@ -77,11 +77,13 @@ public class TestAlarmNotif implements AlarmNotif {
 
     @Override
     public @NonNull Map<Class<? extends Augmentation<AlarmNotif>>, Augmentation<AlarmNotif>> augmentations() {
+        // TODO Auto-generated method stub
         return null;
     }
 
     @Override
     public Boolean getIsCleared() {
+        // TODO Auto-generated method stub
         return null;
     }
 
@@ -16,8 +16,9 @@
  * ============LICENSE_END==========================================================================
  */
 
-package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.test;
+package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl;
 
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 import java.time.Instant;
@@ -29,7 +30,7 @@ import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider;
-import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl.ORanChangeNotificationListener;
+import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.DeviceManagerServiceProvider;
 import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.NotificationProxyParser;
 import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.VESCollectorCfgService;
 import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.VESCollectorService;
@@ -38,7 +39,6 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.re
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.NetconfConfigChange;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.netconf.config.change.Edit;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.netconf.config.change.EditBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.EventlogBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.EventlogEntity;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
 import org.opendaylight.yangtools.yang.binding.DataObject;
@@ -50,6 +50,8 @@ public class TestORanChangeNotificationListener {
 
     private static final String NODEID = "node1";
 
+    @Mock
+    DeviceManagerServiceProvider serviceProvider;
     @Mock
     NetconfBindingAccessor netconfAccessor;
     @Mock
@@ -69,9 +71,12 @@ public class TestORanChangeNotificationListener {
         when(vesCollectorService.getConfig()).thenReturn(vesCfgService);
         when(netconfAccessor.getNodeId()).thenReturn(new NodeId(NODEID));
         when(vesCfgService.isVESCollectorEnabled()).thenReturn(true);
+        when(serviceProvider.getDataProvider()).thenReturn(databaseService);
+        when(serviceProvider.getVESCollectorService()).thenReturn(vesCollectorService);
+        when(vesCollectorService.getNotificationProxyParser()).thenReturn(notifProxyParser);
 
         ORanChangeNotificationListener notifListener =
-                new ORanChangeNotificationListener(netconfAccessor, databaseService, vesCollectorService, notifProxyParser);
+                new ORanChangeNotificationListener(netconfAccessor, serviceProvider);
 
         Iterable<? extends PathArgument> pathArguments = Arrays.asList(new PathArgument() {
 
@@ -89,10 +94,7 @@ public class TestORanChangeNotificationListener {
         NetconfConfigChange confChangeNotification = createNotification(EditOperationType.Create, target);
         when(notifProxyParser.getTime(confChangeNotification)).thenReturn(Instant.now());
         notifListener.onNetconfConfigChange(confChangeNotification);
-        EventlogEntity event = new EventlogBuilder().setNodeId(NODEID)
-                .setNewValue(String.valueOf(EditOperationType.Create)).setObjectId(target.toString()).build();
-        verify(databaseService).writeEventLog(event);
-
+        verify(databaseService).writeEventLog(any(EventlogEntity.class));
     }
 
     /**
diff --git a/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/TestORanFaultNotificationListener.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/impl/TestORanFaultNotificationListener.java
new file mode 100644 (file)
index 0000000..af2515c
--- /dev/null
@@ -0,0 +1,114 @@
+/*
+ * ============LICENSE_START========================================================================
+ * ONAP : ccsdk feature sdnr wt
+ * =================================================================================================
+ * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
+ * =================================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ * ============LICENSE_END==========================================================================
+ */
+package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl;
+
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import com.google.common.io.Files;
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.onap.ccsdk.features.sdnr.wt.common.configuration.ConfigurationFileRepresentation;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider;
+import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.DeviceManagerServiceProvider;
+import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.FaultService;
+import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.VESCollectorService;
+import org.onap.ccsdk.features.sdnr.wt.devicemanager.vescollectorconnector.impl.VESCollectorServiceImpl;
+import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfBindingAccessor;
+import org.onap.ccsdk.features.sdnr.wt.websocketmanager.model.WebsocketManagerService;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.FaultlogBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.FaultlogEntity;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.SeverityType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.SourceType;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@RunWith(MockitoJUnitRunner.class)
+public class TestORanFaultNotificationListener {
+
+    private static final Logger LOG = LoggerFactory.getLogger(TestORanFaultNotificationListener.class);
+    private static final String TESTFILENAME = "configFile.txt";
+
+    // @formatter:off
+    private static final String TESTCONFIG_CONTENT = "[VESCollector]\n"
+            + "VES_COLLECTOR_ENABLED=true\n"
+            + "VES_COLLECTOR_TLS_ENABLED=true\n"
+            + "VES_COLLECTOR_TRUST_ALL_CERTS=true\n"
+            + "VES_COLLECTOR_USERNAME=sample1\n"
+            + "VES_COLLECTOR_PASSWORD=sample1\n"
+            + "VES_COLLECTOR_IP=[2001:db8:1:1::1]\n"
+            + "VES_COLLECTOR_PORT=8443\n"
+            + "VES_COLLECTOR_VERSION=v7\n"
+            + "REPORTING_ENTITY_NAME=ONAP SDN-R\n"
+            + "EVENTLOG_MSG_DETAIL=SHORT\n"
+            + "";
+    // @formatter:on
+
+    @Mock NetconfBindingAccessor bindingAccessor;
+    @Mock DataProvider dataProvider;
+    @Mock FaultService faultService;
+    @Mock DeviceManagerServiceProvider serviceProvider;
+    @Mock WebsocketManagerService websocketManagerService;
+    @Mock DataProvider databaseService;
+    VESCollectorService vesCollectorService;
+
+    @After
+    @Before
+    public void afterAndBefore() {
+        File f = new File(TESTFILENAME);
+        if (f.exists()) {
+            LOG.info("Remove {}", f.getAbsolutePath());
+            f.delete();
+        }
+    }
+
+    @Test
+    public void test() throws IOException {
+        Files.asCharSink(new File(TESTFILENAME), StandardCharsets.UTF_8).write(TESTCONFIG_CONTENT);
+        vesCollectorService =
+                new VESCollectorServiceImpl(new ConfigurationFileRepresentation(TESTFILENAME));
+        when(bindingAccessor.getNodeId()).thenReturn(new NodeId("nSky"));
+        ORanFaultNotificationListener faultListener = new ORanFaultNotificationListener(bindingAccessor,
+                vesCollectorService, faultService, websocketManagerService, databaseService);
+        faultListener.onAlarmNotif(new TestAlarmNotif());
+
+        verify(faultService).faultNotification(getFaultLog());
+    }
+
+    private FaultlogEntity getFaultLog() {
+        FaultlogBuilder faultAlarm = new FaultlogBuilder();
+        faultAlarm.setNodeId("nSky");
+        faultAlarm.setObjectId("ORAN-RU-FH");
+        faultAlarm.setProblem("CPRI Port Down");
+        faultAlarm.setSeverity(SeverityType.NonAlarmed);
+        faultAlarm.setCounter(1);
+        faultAlarm.setId("123");
+        faultAlarm.setSourceType(SourceType.Netconf);
+        faultAlarm.setTimestamp(new DateAndTime("2021-03-23T18:19:42.326144Z"));
+        return faultAlarm.build();
+    }
+
+}
@@ -15,7 +15,7 @@
  * the License.
  * ============LICENSE_END==========================================================================
  */
-package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.test;
+package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
@@ -23,12 +23,13 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 import java.io.IOException;
 import java.util.Optional;
+import org.eclipse.jdt.annotation.NonNull;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider;
 import org.onap.ccsdk.features.sdnr.wt.devicemanager.ne.service.NetworkElement;
-import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl.ORanNetworkElementFactory;
 import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.DeviceManagerServiceProvider;
+import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.FaultService;
 import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.NotificationProxyParser;
 import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.VESCollectorCfgService;
 import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.VESCollectorService;
@@ -36,6 +37,7 @@ import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.Capabilities;
 import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfAccessor;
 import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfBindingAccessor;
 import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.TransactionUtils;
+import org.onap.ccsdk.features.sdnr.wt.websocketmanager.model.WebsocketManagerService;
 import org.opendaylight.yang.gen.v1.urn.o.ran.hardware._1._0.rev190328.ORANHWCOMPONENT;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
 import org.opendaylight.yangtools.yang.common.QName;
@@ -44,18 +46,19 @@ public class TestORanNetworkElement {
 
     private static final QName OneCell =
             QName.create("urn:onf:otcc:wireless:yang:radio-access:commscope-onecell", "2020-06-22", "onecell").intern();
+    private static final @NonNull QName OnapSystem = QName.create("urn:onap:system", "2020-10-26", "onap-system").intern();
     private static String NODEIDSTRING = "nSky";
     private static NodeId nodeId = new NodeId(NODEIDSTRING);
-    private static NodeId nNodeId = new NodeId("nSky");
 
     private static NetconfAccessor accessor;
     private static DeviceManagerServiceProvider serviceProvider;
     private static Capabilities capabilities;
     private static TransactionUtils transactionUtils;
-    private static NetconfBindingAccessor bindingCommunicator;
+    private static NetconfBindingAccessor bindingAccessor;
     private static VESCollectorService vesCollectorService;
     private static NotificationProxyParser notificationProxyParser;
     private static VESCollectorCfgService vesCfgService;
+    private static WebsocketManagerService websocketManagerService;
 
     @BeforeClass
     public static void init() throws InterruptedException, IOException {
@@ -63,19 +66,24 @@ public class TestORanNetworkElement {
         accessor = mock(NetconfAccessor.class);
         serviceProvider = mock(DeviceManagerServiceProvider.class);
         transactionUtils = mock(TransactionUtils.class);
-        bindingCommunicator = mock(NetconfBindingAccessor.class);
+        bindingAccessor = mock(NetconfBindingAccessor.class);
         vesCollectorService = mock(VESCollectorService.class);
         notificationProxyParser = mock(NotificationProxyParser.class);
         vesCfgService = mock(VESCollectorCfgService.class);
+        websocketManagerService = mock(WebsocketManagerService.class);
 
         when(accessor.getCapabilites()).thenReturn(capabilities);
-        when(accessor.getNodeId()).thenReturn(nNodeId);
-        when(accessor.getNetconfBindingAccessor()).thenReturn(Optional.of(bindingCommunicator));
-        when(bindingCommunicator.getTransactionUtils()).thenReturn(transactionUtils);
-        when(bindingCommunicator.getNodeId()).thenReturn(nodeId);
+        when(accessor.getNodeId()).thenReturn(nodeId);
+        when(accessor.getNetconfBindingAccessor()).thenReturn(Optional.of(bindingAccessor));
+        when(bindingAccessor.getCapabilites()).thenReturn(capabilities);
+        when(bindingAccessor.getTransactionUtils()).thenReturn(transactionUtils);
+        when(bindingAccessor.getNodeId()).thenReturn(nodeId);
         when(vesCollectorService.getNotificationProxyParser()).thenReturn(notificationProxyParser);
 
         DataProvider dataProvider = mock(DataProvider.class);
+        FaultService faultService = mock(FaultService.class);
+        when(serviceProvider.getWebsocketService()).thenReturn(websocketManagerService);
+        when(serviceProvider.getFaultService()).thenReturn(faultService);
         when(serviceProvider.getDataProvider()).thenReturn(dataProvider);
         when(serviceProvider.getVESCollectorService()).thenReturn(vesCollectorService);
         when(vesCollectorService.getConfig()).thenReturn(vesCfgService);
@@ -85,14 +93,11 @@ public class TestORanNetworkElement {
 
     @Test
     public void test() {
-
-        NodeId nodeId = new NodeId(NODEIDSTRING);
-        when(bindingCommunicator.getTransactionUtils()).thenReturn(mock(TransactionUtils.class));
-        when(bindingCommunicator.getNodeId()).thenReturn(nodeId);
-
         Optional<NetworkElement> oRanNe;
         when(capabilities.isSupportingNamespace(ORANHWCOMPONENT.QNAME)).thenReturn(true);
         when(capabilities.isSupportingNamespace(OneCell)).thenReturn(false);
+        when(capabilities.isSupportingNamespace(OnapSystem)).thenReturn(false);
+
         ORanNetworkElementFactory factory = new ORanNetworkElementFactory();
         oRanNe = factory.create(accessor, serviceProvider);
         assertTrue(factory.create(accessor, serviceProvider).isPresent());
  * the License.
  * ============LICENSE_END==========================================================================
  */
-package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.test;
+package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl;
 
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 import java.io.IOException;
 import java.util.Optional;
-import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl.ORanNetworkElementFactory;
+import org.junit.After;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider;
 import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.DeviceManagerServiceProvider;
+import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.FaultService;
+import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.VESCollectorService;
 import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.Capabilities;
 import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfBindingAccessor;
 import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.TransactionUtils;
+import org.onap.ccsdk.features.sdnr.wt.websocketmanager.model.WebsocketManagerService;
 import org.opendaylight.yang.gen.v1.urn.o.ran.hardware._1._0.rev190328.ORANHWCOMPONENT;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
 
@@ -37,40 +43,50 @@ public class TestORanNetworkElementFactory {
     private static NetconfBindingAccessor accessor;
     private static DeviceManagerServiceProvider serviceProvider;
     private static Capabilities capabilities;
+    private static VESCollectorService vesCollectorService;
+    private static FaultService faultService;
+    private static WebsocketManagerService notificationService;
+    private static DataProvider databaseService;
 
-   // @BeforeClass
+    @BeforeClass
     public static void init() throws InterruptedException, IOException {
-        NetconfBindingAccessor bindingCommunicator = mock(NetconfBindingAccessor.class);
+        NetconfBindingAccessor bindingAccessor = mock(NetconfBindingAccessor.class);
         NodeId nodeId = new NodeId(NODEIDSTRING);
-        when(bindingCommunicator.getTransactionUtils()).thenReturn(mock(TransactionUtils.class));
-        when(bindingCommunicator.getNodeId()).thenReturn(nodeId);
+        when(bindingAccessor.getTransactionUtils()).thenReturn(mock(TransactionUtils.class));
+        when(bindingAccessor.getNodeId()).thenReturn(nodeId);
 
         capabilities = mock(Capabilities.class);
         accessor = mock(NetconfBindingAccessor.class);
         serviceProvider = mock(DeviceManagerServiceProvider.class);
+        vesCollectorService = mock(VESCollectorService.class);
+        faultService = mock(FaultService.class);
+        notificationService = mock(WebsocketManagerService.class);
+        databaseService = mock(DataProvider.class);
 
         when(accessor.getCapabilites()).thenReturn(capabilities);
-        when(accessor.getNetconfBindingAccessor()).thenReturn(Optional.of(bindingCommunicator));
-        when(serviceProvider.getDataProvider()).thenReturn(null);
-
+        when(accessor.getNetconfBindingAccessor()).thenReturn(Optional.of(bindingAccessor));
+        when(serviceProvider.getFaultService()).thenReturn(faultService);
+        when(serviceProvider.getWebsocketService()).thenReturn(notificationService);
+        when(serviceProvider.getDataProvider()).thenReturn(databaseService);
+        when(serviceProvider.getVESCollectorService()).thenReturn(vesCollectorService);
 
     }
 
-    //@Test
+    @Test
     public void testCreateORANHWComponent() throws Exception {
         when(accessor.getCapabilites().isSupportingNamespace(ORANHWCOMPONENT.QNAME)).thenReturn(true);
         ORanNetworkElementFactory factory = new ORanNetworkElementFactory();
         assertTrue((factory.create(accessor, serviceProvider)).isPresent());
     }
 
-    //@Test
+    @Test
     public void testCreateNone() throws Exception {
         when(accessor.getCapabilites().isSupportingNamespace(ORANHWCOMPONENT.QNAME)).thenReturn(false);
         ORanNetworkElementFactory factory = new ORanNetworkElementFactory();
         assertTrue(!(factory.create(accessor, serviceProvider).isPresent()));
     }
 
-    //@After
+    @After
     public void cleanUp() throws Exception {
 
     }
  * ============LICENSE_END=========================================================
  *
  */
-package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.test;
+package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl;
 
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
-import java.math.BigDecimal;
-import org.eclipse.jdt.annotation.Nullable;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -37,22 +35,8 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.hardware.re
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Host;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.optional.rev190614.netconf.node.augmented.optional.fields.IgnoreMissingSchemaSources;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.parameters.NonModuleCapabilities;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.parameters.OdlHelloMessageCapabilities;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.parameters.Protocol;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.parameters.YangModuleCapabilities;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.AvailableCapabilities;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.ClusteredConnectionStatus;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.PassThrough;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.UnavailableCapabilities;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.credentials.Credentials;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.schema.storage.YangLibrary;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
-import org.opendaylight.yangtools.yang.common.Uint16;
-import org.opendaylight.yangtools.yang.common.Uint32;
 
 @RunWith(MockitoJUnitRunner.class)
 public class TestORanRegistrationToVESpnfRegistration {
@@ -73,16 +57,16 @@ public class TestORanRegistrationToVESpnfRegistration {
 
         NetconfNode testNetconfNode = mock(NetconfNode.class);
         when(testNetconfNode.getHost()).thenReturn(new Host(new IpAddress(new Ipv4Address("10.10.10.10"))));
-        
+
         when(netconfAccessor.getNodeId()).thenReturn(new NodeId("nSky"));
         when(netconfAccessor.getNetconfNode()).thenReturn(testNetconfNode);
         when(vesCollectorService.getConfig()).thenReturn(vesCfgService);
         when(vesCfgService.getReportingEntityName()).thenReturn("SDN-R");
         Component testComponent = ComponentHelper.get(name, dateTimeString);
 
-        ORanRegistrationToVESpnfRegistrationMapper mapper = new ORanRegistrationToVESpnfRegistrationMapper(netconfAccessor, vesCollectorService, testComponent);
-        mapper.mapCommonEventHeader(SEQUENCE_NO);
-        mapper.mapPNFRegistrationFields();
+        ORanRegistrationToVESpnfRegistrationMapper mapper = new ORanRegistrationToVESpnfRegistrationMapper(netconfAccessor, vesCollectorService);
+        mapper.mapCommonEventHeader(testComponent);
+        mapper.mapPNFRegistrationFields(testComponent);
     }
 
 }
diff --git a/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/test/TestORanFaultNotificationListener.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/test/TestORanFaultNotificationListener.java
deleted file mode 100644 (file)
index b536460..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * ============LICENSE_START========================================================================
- * ONAP : ccsdk feature sdnr wt
- * =================================================================================================
- * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved.
- * =================================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- * ============LICENSE_END==========================================================================
- */
-package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.test;
-
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnitRunner;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider;
-import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl.ORanFaultNotificationListener;
-import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.VESCollectorCfgService;
-import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.VESCollectorService;
-import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfBindingAccessor;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.FaultcurrentBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.SeverityType;
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
-
-@RunWith(MockitoJUnitRunner.class)
-public class TestORanFaultNotificationListener {
-
-    @Mock
-    NetconfBindingAccessor bindingAccessor;
-    @Mock
-    DataProvider dataProvider;
-    @Mock
-    VESCollectorService vesCollectorService;
-    @Mock
-    VESCollectorCfgService vesCfgService;
-
-    @Test
-    public void test() {
-        when(bindingAccessor.getNodeId()).thenReturn(new NodeId("nSky"));
-        when(vesCollectorService.getConfig()).thenReturn(vesCfgService);
-        when(vesCfgService.isVESCollectorEnabled()).thenReturn(true);
-
-        ORanFaultNotificationListener faultListener = new ORanFaultNotificationListener(bindingAccessor, dataProvider, vesCollectorService);
-        faultListener.onAlarmNotif(new TestAlarmNotif());
-        verify(dataProvider).updateFaultCurrent(new FaultcurrentBuilder().setCounter(0)
-                                                        .setNodeId("nSky")
-                                                        .setId("123")
-                                                        .setProblem("CPRI Port Down")
-                                                        .setSeverity(SeverityType.Critical)
-                                                        .setObjectId("ORAN-RU-FH")
-                                                        .setTimestamp(new DateAndTime("2021-03-23T18:19:42.326144Z"))
-                                                        .build());
-    }
-}
index c77cf5f..fe4f683 100644 (file)
@@ -64,7 +64,16 @@ public interface NetconfBindingAccessor extends NetconfAccessor {
     void registerNotificationsStream(List<Stream> streamList);
 
     /**
-     * Register notifications stream for the connection.
+     * Register default notifications stream for the connection.
+     * @See <a href="https://tools.ietf.org/html/rfc5277">https://tools.ietf.org/html/rfc5277</a>
+     *
+     * @return progress indication
+     */
+    ListenableFuture<RpcResult<CreateSubscriptionOutput>> registerNotificationsStream();
+
+    /**
+     * Register specific notifications stream for the connection.
+     * @See <a href="https://tools.ietf.org/html/rfc5277">https://tools.ietf.org/html/rfc5277</a>
      *
      * @param streamName that should be "NETCONF" as default.
      * @return progress indication
@@ -81,4 +90,5 @@ public interface NetconfBindingAccessor extends NetconfAccessor {
     <T extends NotificationListener> ListenerRegistration<NotificationListener> doRegisterNotificationListener(
             @NonNull T listener);
 
+
 }
index aac6813..e78579a 100644 (file)
@@ -80,7 +80,7 @@ public interface NetconfDomAccessor extends NetconfAccessor {
      *
      * @param <T> specific child class of DOMNotificationListener
      * @param listener listener to be called
-     * @param types as list of Absolute
+     * @param types as list of SchemaPath
      * @return handler to manager registration
      */
     <T extends DOMNotificationListener> @NonNull ListenerRegistration<DOMNotificationListener> doRegisterNotificationListener(
@@ -92,7 +92,7 @@ public interface NetconfDomAccessor extends NetconfAccessor {
      * @See <a href="https://tools.ietf.org/html/rfc5277">https://tools.ietf.org/html/rfc5277</a>
      * @param <T>
      * @param listener to be registers
-     * @param types as array of Absolute
+     * @param types as array of SchemaPath
      * @return Object to close and access
      */
     <T extends DOMNotificationListener> @NonNull ListenerRegistration<DOMNotificationListener> doRegisterNotificationListener(
index 9c10f0b..6f3a592 100644 (file)
@@ -18,7 +18,6 @@
 package org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.impl.access.binding;
 
 import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.SettableFuture;
 import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
@@ -34,7 +33,6 @@ import org.opendaylight.mdsal.binding.api.MountPoint;
 import org.opendaylight.mdsal.binding.api.NotificationService;
 import org.opendaylight.mdsal.binding.api.RpcConsumerRegistry;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.CreateSubscriptionInput;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.CreateSubscriptionInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.CreateSubscriptionOutput;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.NotificationsService;
@@ -45,9 +43,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netmod.notification.r
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.NotificationListener;
-import org.opendaylight.yangtools.yang.common.RpcError.ErrorType;
 import org.opendaylight.yangtools.yang.common.RpcResult;
-import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -59,19 +55,29 @@ public class NetconfBindingAccessorImpl extends NetconfAccessorImpl implements N
 
     private final DataBroker dataBroker;
     private final MountPoint mountpoint;
+    final NotificationsService mountpointNotificationService;
 
     /**
-     * Contains all data to access and manage netconf device
+     * Contains all data to access and manage NETCONF device
      *
-     * @param nodeId of managed netconf node
-     * @param netconfNode information
+     * @param accessor with basic mountpoint information
      * @param dataBroker to access node
      * @param mountpoint of netconfNode
+     * @throws IllegalArgumentException
      */
-    public NetconfBindingAccessorImpl(NetconfAccessorImpl accessor, DataBroker dataBroker, MountPoint mountpoint) {
+    public NetconfBindingAccessorImpl(NetconfAccessorImpl accessor, DataBroker dataBroker, MountPoint mountpoint)
+            throws IllegalArgumentException {
         super(accessor);
         this.dataBroker = Objects.requireNonNull(dataBroker);
         this.mountpoint = Objects.requireNonNull(mountpoint);
+
+        final Optional<RpcConsumerRegistry> optionalRpcConsumerService =
+                mountpoint.getService(RpcConsumerRegistry.class);
+        if (optionalRpcConsumerService.isPresent()) {
+            mountpointNotificationService = optionalRpcConsumerService.get().getRpcService(NotificationsService.class);
+        } else {
+            throw new IllegalArgumentException("Can not process without rpcConsumerService service");
+        }
     }
 
     @Override
@@ -103,41 +109,20 @@ public class NetconfBindingAccessorImpl extends NetconfAccessorImpl implements N
         return ranListenerRegistration;
     }
 
-
     @Override
     public ListenableFuture<RpcResult<CreateSubscriptionOutput>> registerNotificationsStream(
             @NonNull String streamName) {
-        String failMessage = "";
-        final Optional<RpcConsumerRegistry> optionalRpcConsumerService =
-                getMountpoint().getService(RpcConsumerRegistry.class);
-        if (optionalRpcConsumerService.isPresent()) {
-            final NotificationsService rpcService =
-                    optionalRpcConsumerService.get().getRpcService(NotificationsService.class);
-
-            final CreateSubscriptionInputBuilder createSubscriptionInputBuilder = new CreateSubscriptionInputBuilder();
+        final CreateSubscriptionInputBuilder createSubscriptionInputBuilder = new CreateSubscriptionInputBuilder();
+        if (streamName != null) {
             createSubscriptionInputBuilder.setStream(new StreamNameType(streamName));
-            log.info("Event listener triggering notification stream {} for node {}", streamName, getNodeId());
-            try {
-                CreateSubscriptionInput createSubscriptionInput = createSubscriptionInputBuilder.build();
-                if (createSubscriptionInput == null) {
-                    failMessage = "createSubscriptionInput is null for mountpoint " + getNodeId();
-                } else {
-                    // Regular case, return value
-                    return rpcService.createSubscription(createSubscriptionInput);
-                }
-            } catch (NullPointerException e) {
-                failMessage = "createSubscription failed";
-            }
-        } else {
-            failMessage = "No RpcConsumerRegistry avaialble.";
         }
-        //Be here only in case of problem and return failed indication
-        log.warn(failMessage);
-        RpcResultBuilder<CreateSubscriptionOutput> result = RpcResultBuilder.failed();
-        result.withError(ErrorType.APPLICATION, failMessage);
-        SettableFuture<RpcResult<CreateSubscriptionOutput>> future = SettableFuture.create();
-        future.set(result.build());
-        return future;
+        log.info("Event listener triggering notification stream '{}' for node {}", streamName, getNodeId());
+        return mountpointNotificationService.createSubscription(createSubscriptionInputBuilder.build());
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<CreateSubscriptionOutput>> registerNotificationsStream() {
+        return registerNotificationsStream((String)null);
     }
 
     @Override
index 3212eac..b6843fb 100644 (file)
@@ -52,7 +52,6 @@ import org.opendaylight.mdsal.dom.api.DOMNotificationListener;
 import org.opendaylight.mdsal.dom.api.DOMNotificationService;
 import org.opendaylight.mdsal.dom.api.DOMRpcResult;
 import org.opendaylight.mdsal.dom.api.DOMRpcService;
-import org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.CreateSubscriptionInput;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.CreateSubscriptionInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.create.subscription.input.Filter;
index 46b2e76..b6d7314 100644 (file)
@@ -48,7 +48,6 @@ import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.impl.NetconfNodeS
 import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.impl.rpc.NetconfnodeStateServiceRpcApiImpl;
 import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.test.example.ExampleConfig;
 import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.test.example.TestNetconfHelper;
-import org.opendaylight.mdsal.binding.runtime.spi.BindingRuntimeHelpers;
 import org.opendaylight.mdsal.binding.api.ClusteredDataTreeChangeListener;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.DataObjectModification;
@@ -60,6 +59,7 @@ import org.opendaylight.mdsal.binding.api.NotificationPublishService;
 import org.opendaylight.mdsal.binding.api.RpcProviderService;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
 import org.opendaylight.mdsal.binding.dom.codec.impl.BindingCodecContext;
+import org.opendaylight.mdsal.binding.runtime.spi.BindingRuntimeHelpers;
 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeBuilder;