2  * ============LICENSE_START=======================================================
 
   3  * ONAP : ccsdk features
 
   4  * ================================================================================
 
   5  * Copyright (C) 2021 highstreet technologies GmbH Intellectual Property.
 
   7  * ================================================================================
 
   8  * Licensed under the Apache License, Version 2.0 (the "License");
 
   9  * you may not use this file except in compliance with the License.
 
  10  * You may obtain a copy of the License at
 
  12  *     http://www.apache.org/licenses/LICENSE-2.0
 
  14  * Unless required by applicable law or agreed to in writing, software
 
  15  * distributed under the License is distributed on an "AS IS" BASIS,
 
  16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  17  * See the License for the specific language governing permissions and
 
  18  * limitations under the License.
 
  19  * ============LICENSE_END=========================================================
 
  22 package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.vesmapper;
 
  24 import java.time.Instant;
 
  25 import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.util.ORanDMDOMUtility;
 
  26 import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.yangspecs.ORANFM;
 
  27 import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.VESCollectorService;
 
  28 import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.VESCommonEventHeaderPOJO;
 
  29 import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.VESFaultFieldsPOJO;
 
  30 import org.opendaylight.mdsal.dom.api.DOMNotification;
 
  31 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
 
  32 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 
  33 import org.slf4j.Logger;
 
  34 import org.slf4j.LoggerFactory;
 
  38 * Maps ORAN Fault fields to VES fault domain fields and VES commonEventHeader fields
 
  44 *      eventId                     "nt:network-topology/nt:topology/nt:node/nt:node-id"
 
  45 *      eventName                   "nt:network-topology/nt:topology/nt:node/nt:node-id"
 
  46 *      eventType                   "O-RAN-RU-Fault"
 
  47 *      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.
 
  48 *      nfcNamingCode               always ""
 
  49 *      nfNamingCode                always ""
 
  50 *      nfVendorName                /ietf-hardware:hardware/component[not(parent)][1]/mfg-name
 
  52 *      reportingEntityId           The OAM-Controller identifier with in the SMO - e.g. the fully qualified domain name or IP-Address.
 
  53 *      reportingEntityName         as configured by helm charts for the OpenDaylight cluster name ??????
 
  54 *      sequence                    As per NetConf notification increasing sequence number as unsigned integer 32 bits. The value is reused in the eventId field.
 
  55 *      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.
 
  56 *      sourceName                  "nt:network-topology/nt:topology/nt:node/nt:node-id"
 
  57 *      startEpochMicrosec          Current OAM-Controller Node timestamp in unix time format - as microseconds elapsed since 1 Jan 1970 not including leap seconds.
 
  58 *      timeZoneOffset              Static text: "+00:00"
 
  60 *      vesEventListenerVersion     "7.2.1"
 
  63 *      alarmAdditionalInformation
 
  64 *      alarmCondition              Value of "o-ran-fm:alarm-notif/fault-id"
 
  65 *      alarmInterfaceA             Value of "o-ran-fm:alarm-notif/fault-source"
 
  66 *      eventCategory               Static text "O-RU failure"
 
  67 *      eventSeverity               Value of "o-ran-fm:alarm-notif/fault-severity". But if "o-ran-fm:alarm-notif/is-cleared" then "NORMAL"
 
  68 *      eventSourceType             The value of ietf-hardware (RFC8348) /hardware/component[not(parent)][1]/model-name or "O-RU" if not found.
 
  69 *      faultFieldsVersion          "4.0"
 
  70 *      specificProblem             A mapping of the fault-id to its description according to O-RAN OpenFronthaul specification.
 
  76 public class ORanDOMFaultToVESFaultMapper {
 
  77     @SuppressWarnings("unused")
 
  78     private static final Logger LOG = LoggerFactory.getLogger(ORanDOMFaultToVESFaultMapper.class);
 
  79     private static final String VES_EVENT_DOMAIN = "fault";
 
  80     private static final String VES_EVENTTYPE = "ORAN_Fault";
 
  81     private static final String VES_EVENT_PRIORITY = "Normal";
 
  82     private static final String VES_EVENT_CATEGORY = "O-RU Failure";
 
  83     private static final String VES_FAULT_FIELDS_VERSION = "4.0";
 
  84     private static final String VES_FAULT_FIELDS_VFSTATUS = "Active"; //virtual function status
 
  86     private final VESCollectorService vesProvider;
 
  87     private final String notifName; // Name
 
  88     private final String nodeIdString; // Sourcename
 
  89     //Initialized during registration
 
  90     private String mfgName;
 
  92     private String modelName;
 
  94     public ORanDOMFaultToVESFaultMapper(NodeId nodeId, VESCollectorService vesCollectorService, String notifName) {
 
  95         this.nodeIdString = nodeId.getValue();
 
  96         this.vesProvider = vesCollectorService;
 
  97         this.notifName = notifName;
 
 100     public void setMfgName(String mfgName) {
 
 101         this.mfgName = mfgName;
 
 104     public void setUuid(String uuid) {
 
 108     public void setModelName(String modelName) {
 
 109         this.modelName = modelName;
 
 112     public VESCommonEventHeaderPOJO mapCommonEventHeader(DOMNotification notification, Instant eventTime,
 
 114         VESCommonEventHeaderPOJO vesCEH = new VESCommonEventHeaderPOJO();
 
 115         vesCEH.setDomain(VES_EVENT_DOMAIN);
 
 116         vesCEH.setEventName(notifName);
 
 117         vesCEH.setEventType(VES_EVENTTYPE);
 
 118         vesCEH.setPriority(VES_EVENT_PRIORITY);
 
 120         String eventId = notifName + "-" + Long.toUnsignedString(sequenceNo);
 
 122         vesCEH.setEventId(eventId);
 
 123         vesCEH.setStartEpochMicrosec(eventTime.toEpochMilli() * 1000);
 
 124         vesCEH.setLastEpochMicrosec(eventTime.toEpochMilli() * 1000);
 
 125         vesCEH.setNfVendorName(mfgName);
 
 126         vesCEH.setReportingEntityName(vesProvider.getConfig().getReportingEntityName());
 
 127         vesCEH.setSequence(sequenceNo);
 
 128         vesCEH.setSourceId(uuid);
 
 129         vesCEH.setSourceName(nodeIdString);
 
 134     public VESFaultFieldsPOJO mapFaultFields(DOMNotification alarmNotif, ORANFM oranfm) {
 
 135         VESFaultFieldsPOJO vesFaultFields = new VESFaultFieldsPOJO();
 
 136         ContainerNode cn = alarmNotif.getBody();
 
 137         vesFaultFields.setAlarmCondition(ORanDMDOMUtility.getLeafValue(cn, oranfm.getFaultIdQName()));
 
 138         vesFaultFields.setAlarmInterfaceA(ORanDMDOMUtility.getLeafValue(cn, oranfm.getFaultSourceQName()));
 
 139         vesFaultFields.setEventCategory(VES_EVENT_CATEGORY);
 
 140         if (ORanDMDOMUtility.getLeafValue(cn, oranfm.getFaultIsClearedQName()).equals("true")) {
 
 141             vesFaultFields.setEventSeverity("NORMAL");
 
 143             vesFaultFields.setEventSeverity(ORanDMDOMUtility.getLeafValue(cn, oranfm.getFaultSeverityQName()));
 
 145         vesFaultFields.setEventSourceType(modelName);
 
 146         vesFaultFields.setFaultFieldsVersion(VES_FAULT_FIELDS_VERSION);
 
 147         vesFaultFields.setSpecificProblem(ORanDMDOMUtility.getLeafValue(cn, oranfm.getFaultTextQName()));
 
 148         vesFaultFields.setVfStatus(VES_FAULT_FIELDS_VFSTATUS);
 
 150         return vesFaultFields;