From 17fd7d683b0b38a401481ae85cc5927679e20ce3 Mon Sep 17 00:00:00 2001 From: Ravi Pendurty Date: Wed, 16 Jun 2021 10:22:36 +0530 Subject: Include missing mapping of O-RAN fault fields Refactor O-RAN devicemanager and correct VES fault fields characteristics Issue-ID: CCSDK-3309 Change-Id: I01441cb9c84660c0ee6931d6bbe3f28993cfd054 Signed-off-by: Ravi Pendurty --- .../oran/impl/ORanChangeNotificationListener.java | 42 +++--- .../oran/impl/ORanFaultNotificationListener.java | 168 ++++++++++++++------- .../oran/impl/ORanFaultToVESFaultMapper.java | 47 ++++-- .../oran/impl/ORanNetworkElement.java | 162 +++++++++++--------- .../oran/impl/ORanNetworkElementFactory.java | 3 +- ...ORanRegistrationToVESpnfRegistrationMapper.java | 25 +-- .../oran/impl/ORanToInternalDataModel.java | 77 +++++++++- 7 files changed, 356 insertions(+), 168 deletions(-) (limited to 'sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main') diff --git a/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 b/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 index 63d8f2787..c0aa0ac9b 100644 --- a/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 +++ b/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 @@ -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 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()); diff --git a/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 b/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 index 6f5de9677..a17dcd726 100644 --- a/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 +++ b/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 @@ -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 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"; + } + } } diff --git a/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 b/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 index 1790f82c7..0d68bdbf5 100644 --- a/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 +++ b/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 @@ -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 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); diff --git a/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 b/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 index 0bb7f872b..05f1e6dd5 100644 --- a/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 +++ b/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 @@ -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_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 oRanListenerRegistrationResult; private @NonNull final ORanChangeNotificationListener oRanListener; private ListenerRegistration oRanFaultListenerRegistrationResult; private @NonNull final ORanFaultNotificationListener oRanFaultListener; - private final NotificationProxyParser notificationProxyParser; - private @NonNull ORanRegistrationToVESpnfRegistrationMapper mapper; - private Collection 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 initialReadFromNetworkElement() { + Collection componentList; Hardware hardware = readHardware(); if (hardware != null) { componentList = YangHelper.getCollection(hardware.nonnullComponent()); List inventoryList = ORanToInternalDataModel.getInventoryList(netconfAccessor.getNodeId(), componentList); databaseService.writeInventory(netconfAccessor.getNodeId().getValue(), inventoryList); + } else { + componentList = Collections.emptyList(); } Optional 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 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 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 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 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 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 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 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 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; } diff --git a/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 b/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 index 55b2eea34..fff1fba79 100644 --- a/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 +++ b/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 @@ -47,8 +47,7 @@ public class ORanNetworkElementFactory implements NetworkElementFactory { log.info("Create device {} ", ORanNetworkElement.class.getName()); Optional 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)); } } } diff --git a/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 b/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 index 81605e450..3524383f2 100644 --- a/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 +++ b/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 @@ -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; diff --git a/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 b/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 index 1f84db41c..71ab613d2 100644 --- a/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 +++ b/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 @@ -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 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); + } + } -- cgit 1.2.3-korg