diff options
Diffstat (limited to 'sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java')
22 files changed, 1077 insertions, 122 deletions
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/config/ORanDMConfig.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/config/ORanDMConfig.java new file mode 100644 index 000000000..11a68e5fa --- /dev/null +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/config/ORanDMConfig.java @@ -0,0 +1,83 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2023 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.config; + +import org.onap.ccsdk.features.sdnr.wt.common.configuration.Configuration; +import org.onap.ccsdk.features.sdnr.wt.common.configuration.ConfigurationFileRepresentation; + +public class ORanDMConfig implements Configuration { + + private static final String SECTION_MARKER_ORAN_SUPERVISION = "ORAN-SUPERVISION"; + private static final String PROPERTY_KEY_SUPERVISION_NOTIFICATION_INTERVAL = "supervision-notification-interval"; + private static final String PROPERTY_KEY_GUARD_TIMER_OVERHEAD = "guard-timer-overhead"; + + private static final String DEFAULT_SUPERVISION_NOTIFICATION_INTERVAL = "${O_RU_SUPERVISION_NOTIFICATION_INTERVAL}"; + private static final String DEFAULT_GUARD_TIMER_OVERHEAD = "${O_RU_GUARD_TIMER_OVERHEAD}"; + + private static final int DEFAULT_SUPERVISION_NOTIFICATION_INTERVAL_VAL = 60; + private static final int DEFAULT_GUARD_TIMER_OVERHEAD_VAL = 10; + + private ConfigurationFileRepresentation configuration; + + public ORanDMConfig(ConfigurationFileRepresentation configuration) { + this.configuration = configuration; + this.configuration.addSection(SECTION_MARKER_ORAN_SUPERVISION); + defaults(); + } + + @Override + public String getSectionName() { + return SECTION_MARKER_ORAN_SUPERVISION; + } + + @Override + public void defaults() { + configuration.setPropertyIfNotAvailable(this.getSectionName(), PROPERTY_KEY_SUPERVISION_NOTIFICATION_INTERVAL, + DEFAULT_SUPERVISION_NOTIFICATION_INTERVAL); + configuration.setPropertyIfNotAvailable(this.getSectionName(), PROPERTY_KEY_GUARD_TIMER_OVERHEAD, + DEFAULT_GUARD_TIMER_OVERHEAD); + } + + public int getNotificationInterval() { + String v = this.configuration.getProperty(SECTION_MARKER_ORAN_SUPERVISION, + PROPERTY_KEY_SUPERVISION_NOTIFICATION_INTERVAL); + return (v == null || v.equals("null") || v.isEmpty() || !isNumeric(v)) + ? DEFAULT_SUPERVISION_NOTIFICATION_INTERVAL_VAL + : Integer.parseInt(v); + } + + public int getWatchdogTimer() { + String v = this.configuration.getProperty(SECTION_MARKER_ORAN_SUPERVISION, PROPERTY_KEY_GUARD_TIMER_OVERHEAD); + return (v == null || v.equals("null") || v.isEmpty() || !isNumeric(v)) ? DEFAULT_GUARD_TIMER_OVERHEAD_VAL + : Integer.parseInt(v); + } + + private boolean isNumeric(String v) { + try { + int i = Integer.parseInt(v); + } catch (NumberFormatException nfe) { + return false; + } + return true; + } + +} 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/dom/ORanDOMToInternalDataModel.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/dataprovider/ORanDOMToInternalDataModel.java index 25a54f013..4b55f1681 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/dom/ORanDOMToInternalDataModel.java +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/dataprovider/ORanDOMToInternalDataModel.java @@ -19,7 +19,7 @@ * ============LICENSE_END========================================================= * */ -package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl.dom; +package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.dataprovider; import java.time.Instant; import java.util.ArrayList; @@ -28,9 +28,16 @@ import java.util.Date; import java.util.List; import java.util.Objects; import java.util.Optional; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; 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.oran.util.ORanDMDOMUtility; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.util.ORanDeviceManagerQNames; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.yangspecs.ORANFM; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.yangspecs.OnapSystem; import org.opendaylight.mdsal.dom.api.DOMEvent; import org.opendaylight.mdsal.dom.api.DOMNotification; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri; @@ -52,6 +59,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; import org.opendaylight.yangtools.yang.data.api.schema.MapNode; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; +import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -195,12 +203,12 @@ public class ORanDOMToInternalDataModel { * @param sys * @return */ - public static Optional<Guicutthrough> getGuicutthrough(@Nullable NormalizedNode sys) { - AugmentationNode onapSys = (AugmentationNode) sys; - if (onapSys != null) { - String name = ORanDMDOMUtility.getLeafValue(onapSys, ORanDeviceManagerQNames.ONAP_SYSTEM_NAME); + public static Optional<Guicutthrough> getGuicutthrough(@Nullable AugmentationNode onapSysAugData, @NonNull OnapSystem onapSys) { + + if (onapSysAugData != null) { + String name = ORanDMDOMUtility.getLeafValue(onapSysAugData, onapSys.getName()); @Nullable - Uri uri = new Uri(ORanDMDOMUtility.getLeafValue(onapSys, ORanDeviceManagerQNames.ONAP_SYSTEM_WEB_UI)); + Uri uri = new Uri(ORanDMDOMUtility.getLeafValue(onapSysAugData, onapSys.getWebUi())); if (uri.getValue() != null) { GuicutthroughBuilder gcBuilder = new GuicutthroughBuilder(); if (name != null) { @@ -219,27 +227,58 @@ public class ORanDOMToInternalDataModel { * Convert fault notification into data-provider FaultLogEntity * * @param notification with O-RAN notification + * @param oranfm * @param nodeId of node to handle * @param counter to be integrated into data * @return FaultlogEntity with data */ - public static FaultlogEntity getFaultLog(DOMNotification notification, NodeId nodeId, Integer counter) { + public static FaultlogEntity getFaultLog(DOMNotification notification, @NonNull ORANFM oranfm, NodeId nodeId, Integer counter) { ContainerNode cn = notification.getBody(); FaultlogBuilder faultAlarm = new FaultlogBuilder(); faultAlarm.setNodeId(nodeId.getValue()); - faultAlarm.setObjectId(ORanDMDOMUtility.getLeafValue(cn, ORanDeviceManagerQNames.ORAN_FM_FAULT_SOURCE)); - faultAlarm.setProblem(ORanDMDOMUtility.getLeafValue(cn, ORanDeviceManagerQNames.ORAN_FM_FAULT_TEXT)); + faultAlarm.setObjectId(ORanDMDOMUtility.getLeafValue(cn, oranfm.getFaultSourceQName())); + faultAlarm.setProblem(ORanDMDOMUtility.getLeafValue(cn, oranfm.getFaultTextQName())); faultAlarm.setSeverity(getSeverityType( - ORanDMDOMUtility.getLeafValue(cn, ORanDeviceManagerQNames.ORAN_FM_FAULT_SEVERITY), - ORanDMDOMUtility.getLeafValue(cn, ORanDeviceManagerQNames.ORAN_FM_FAULT_IS_CLEARED).equals("true"))); + ORanDMDOMUtility.getLeafValue(cn, oranfm.getFaultSeverityQName()), + ORanDMDOMUtility.getLeafValue(cn, oranfm.getFaultIsClearedQName()).equals("true"))); faultAlarm.setCounter(counter); - faultAlarm.setId(ORanDMDOMUtility.getLeafValue(cn, ORanDeviceManagerQNames.ORAN_FM_FAULT_ID)); + faultAlarm.setId(ORanDMDOMUtility.getLeafValue(cn, oranfm.getFaultIdQName())); faultAlarm.setSourceType(SourceType.Netconf); faultAlarm.setTimestamp(getEventTime(notification)); return faultAlarm.build(); } - public static DateAndTime getEventTime(DOMNotification notification) { + public static FaultlogEntity getFaultLog(UnkeyedListEntryNode activeAlarmEntry, ORANFM oranfm, NodeId nodeId, Integer counter) { + FaultlogBuilder faultAlarm = new FaultlogBuilder(); + faultAlarm.setNodeId(nodeId.getValue()); + faultAlarm.setObjectId(getObjectId( + ORanDMDOMUtility.getLeafValue(activeAlarmEntry, oranfm.getFaultSourceQName()))); + faultAlarm.setProblem( + ORanDMDOMUtility.getLeafValue(activeAlarmEntry, oranfm.getFaultTextQName())); + faultAlarm.setSeverity(getSeverityType( + ORanDMDOMUtility.getLeafValue(activeAlarmEntry, oranfm.getFaultSeverityQName()), + ORanDMDOMUtility.getLeafValue(activeAlarmEntry, oranfm.getFaultIsClearedQName()) + .equals("true"))); + faultAlarm.setCounter(counter); + faultAlarm.setId(ORanDMDOMUtility.getLeafValue(activeAlarmEntry, oranfm.getFaultIdQName())); + faultAlarm.setSourceType(SourceType.Netconf); + faultAlarm.setTimestamp(NetconfTimeStampImpl.getConverter().getTimeStamp( + ORanDMDOMUtility.getLeafValue(activeAlarmEntry, oranfm.getFaultEventTimeQName()))); + return faultAlarm.build(); + + } + + /** + * Convert Instant to NETCONF DateAndTime + * @param eventTimeInstant + * @return DateAndTime + */ + public static DateAndTime getDateAndTimeOfInstant(Instant eventTimeInstant) { + Date eventDate = Date.from(eventTimeInstant); + return new DateAndTime(NETCONFTIME_CONVERTER.getTimeStamp(eventDate)); + } + + private static DateAndTime getEventTime(DOMNotification notification) { DateAndTime eventTime; Instant notificationEventTime = null; if (notification instanceof DOMEvent) { @@ -259,7 +298,7 @@ public class ORanDOMToInternalDataModel { * @return data-provider severity type * @throws IllegalArgumentException if conversion not possible. */ - public static SeverityType getSeverityType(@Nullable String faultSeverity, @Nullable Boolean isCleared) + private static SeverityType getSeverityType(@Nullable String faultSeverity, @Nullable Boolean isCleared) throws IllegalArgumentException { if (isCleared != null && isCleared) { return SeverityType.NonAlarmed; @@ -280,14 +319,14 @@ public class ORanDOMToInternalDataModel { + " faultSeverity=" + faultSeverity); } - /** - * Convert Instant to NETCONF DataAndTime - * @param eventTimeInstant - * @return DateAndTime - */ - public static DateAndTime getDateAndTimeOfInstant(Instant eventTimeInstant) { - Date eventDate = Date.from(eventTimeInstant); - return new DateAndTime(NETCONFTIME_CONVERTER.getTimeStamp(eventDate)); + private static String getObjectId(String leafValue) { + // fault-source = /ietf-hardware:hardware/component[name='slot0-logical0'] + Pattern p = Pattern.compile("\\/ietf-hardware:hardware\\/component\\[name=\\'(.*)\\']"); + Matcher m = p.matcher(leafValue); + if (m.find()) { + return m.group(1); + } + return leafValue; } } 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/dom/DeviceManagerORanImpl.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/dom/DeviceManagerORanImpl.java index de018ba4e..fd9ed2afa 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/dom/DeviceManagerORanImpl.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/dom/DeviceManagerORanImpl.java @@ -17,8 +17,10 @@ */ package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl.dom; +import org.onap.ccsdk.features.sdnr.wt.common.configuration.ConfigurationFileRepresentation; import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient; import org.onap.ccsdk.features.sdnr.wt.devicemanager.ne.factory.FactoryRegistration; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.config.ORanDMConfig; import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.NetconfNetworkElementService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -27,7 +29,6 @@ public class DeviceManagerORanImpl implements AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(DeviceManagerORanImpl.class); private static final String APPLICATION_NAME = "DeviceManagerORan"; - @SuppressWarnings("unused") private static final String CONFIGURATIONFILE = "etc/devicemanager-oran.properties"; @@ -36,6 +37,7 @@ public class DeviceManagerORanImpl implements AutoCloseable { private HtDatabaseClient htDatabaseClient; private Boolean devicemanagerInitializationOk = false; private FactoryRegistration<ORanNetworkElementFactory> resORan; + private ORanDMConfig oranSupervisionConfig; // Blueprint begin public DeviceManagerORanImpl() { @@ -51,8 +53,11 @@ public class DeviceManagerORanImpl implements AutoCloseable { LOG.info("Session Initiated start {}", APPLICATION_NAME); - resORan = netconfNetworkElementService.registerBindingNetworkElementFactory(new ORanNetworkElementFactory()); + ConfigurationFileRepresentation configFileRepresentation = + new ConfigurationFileRepresentation(CONFIGURATIONFILE); + oranSupervisionConfig = new ORanDMConfig(configFileRepresentation); + resORan = netconfNetworkElementService.registerBindingNetworkElementFactory(new ORanNetworkElementFactory(configFileRepresentation, oranSupervisionConfig)); netconfNetworkElementService.writeToEventLog(APPLICATION_NAME, "startup", "done"); this.devicemanagerInitializationOk = true; 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/dom/ORanDOMNetworkElement.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/dom/ORanDOMNetworkElement.java index 5e25ce8b1..72cda1679 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/dom/ORanDOMNetworkElement.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/dom/ORanDOMNetworkElement.java @@ -22,7 +22,6 @@ package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl.dom; import com.fasterxml.jackson.core.JsonProcessingException; -import com.google.common.collect.Sets; import java.util.Collection; import java.util.Collections; import java.util.List; @@ -30,10 +29,23 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; import org.eclipse.jdt.annotation.NonNull; -import org.eclipse.jdt.annotation.Nullable; +import org.onap.ccsdk.features.sdnr.wt.common.configuration.ConfigurationFileRepresentation; +import org.onap.ccsdk.features.sdnr.wt.common.configuration.filechange.IConfigChangedListener; 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.oran.config.ORanDMConfig; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.dataprovider.ORanDOMToInternalDataModel; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.notification.ORanDOMChangeNotificationListener; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.notification.ORanDOMFaultNotificationListener; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.notification.ORanDOMSupervisionNotificationListener; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.notification.ORanNotificationObserverImpl; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.rpc.ORanSupervisionRPCImpl; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.util.ORanDMDOMUtility; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.util.ORanDeviceManagerQNames; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.vesmapper.ORanRegistrationToVESpnfRegistrationMapper; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.yangspecs.ORANFM; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.yangspecs.OnapSystem; 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.NotificationService; @@ -52,17 +64,19 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.pro import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.InstanceIdentifierBuilder; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; +import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode; import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; import org.opendaylight.yangtools.yang.data.api.schema.MapNode; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; +import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode; +import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class ORanDOMNetworkElement implements NetworkElement { +public class ORanDOMNetworkElement implements NetworkElement, IConfigChangedListener { private static final Logger LOG = LoggerFactory.getLogger(ORanDOMNetworkElement.class); @@ -72,11 +86,16 @@ public class ORanDOMNetworkElement implements NetworkElement { private final @NonNull NotificationService notificationService; private final @NonNull ORanDOMChangeNotificationListener oranDomChangeNotificationListener; private final @NonNull ORanDOMFaultNotificationListener oranDomFaultNotificationListener; + private final @NonNull ORanDOMSupervisionNotificationListener oranDomSupervisionNotificationListener; private final @NonNull VESCollectorService vesCollectorService; private final @NonNull ORanRegistrationToVESpnfRegistrationMapper mapper; + private final Optional<OnapSystem> onapSystem; + private final Optional<ORANFM> oranfm; + private ORanDMConfig oranSupervisionConfig; public ORanDOMNetworkElement(@NonNull NetconfDomAccessor netconfDomAccessor, - @NonNull DeviceManagerServiceProvider serviceProvider) { + @NonNull DeviceManagerServiceProvider serviceProvider, ORanDMConfig oranSupervisionConfig, + ConfigurationFileRepresentation configFileRepresentation) { LOG.debug("Create {}", ORanDOMNetworkElement.class.getSimpleName()); this.netconfDomAccessor = Objects.requireNonNull(netconfDomAccessor); Objects.requireNonNull(serviceProvider); @@ -84,14 +103,21 @@ public class ORanDOMNetworkElement implements NetworkElement { this.vesCollectorService = serviceProvider.getVESCollectorService(); this.faultService = serviceProvider.getFaultService(); this.notificationService = serviceProvider.getNotificationService(); + this.onapSystem = OnapSystem.getModule(netconfDomAccessor); + this.oranfm = ORANFM.getModule(netconfDomAccessor); + this.oranSupervisionConfig = oranSupervisionConfig; + configFileRepresentation.registerConfigChangedListener(this); this.oranDomChangeNotificationListener = new ORanDOMChangeNotificationListener(netconfDomAccessor, vesCollectorService, databaseService); this.oranDomFaultNotificationListener = - new ORanDOMFaultNotificationListener(netconfDomAccessor, vesCollectorService, + new ORanDOMFaultNotificationListener(netconfDomAccessor, this.oranfm, vesCollectorService, serviceProvider.getFaultService(), serviceProvider.getWebsocketService(), databaseService); + this.oranDomSupervisionNotificationListener = new ORanDOMSupervisionNotificationListener(netconfDomAccessor, + vesCollectorService, databaseService, oranSupervisionConfig); + this.mapper = new ORanRegistrationToVESpnfRegistrationMapper(netconfDomAccessor, vesCollectorService); } @@ -106,13 +132,28 @@ public class ORanDOMNetworkElement implements NetworkElement { ORanDeviceManagerQNames.IETF_NETCONF_NOTIFICATIONS_NETCONF_SESSION_END, ORanDeviceManagerQNames.IETF_NETCONF_NOTIFICATIONS_NETCONF_CAPABILITY_CHANGE}; netconfDomAccessor.doRegisterNotificationListener(oranDomChangeNotificationListener, notifications); - QName[] faultNotification = {ORanDeviceManagerQNames.ORAN_FM_ALARM_NOTIF}; + + QName[] faultNotification = {oranfm.get().getAlarmNotifQName()}; netconfDomAccessor.doRegisterNotificationListener(oranDomFaultNotificationListener, faultNotification); + + Capabilities x = netconfDomAccessor.getCapabilites(); + if (x.isSupportingNamespaceAndRevision(ORanDeviceManagerQNames.ORAN_SUPERVISION_MODULE)) { + LOG.debug("Device {} supports oran-supervision", netconfDomAccessor.getNodeId().getValue()); + oranDomSupervisionNotificationListener.setComponentList(componentList); + QName[] supervisionNotification = {ORanDeviceManagerQNames.ORAN_SUPERVISION_NOTIFICATION}; + netconfDomAccessor.doRegisterNotificationListener(oranDomSupervisionNotificationListener, + supervisionNotification); + } // Output notification streams to LOG @SuppressWarnings("unused") Map<StreamKey, Stream> streams = netconfDomAccessor.getNotificationStreamsAsMap(); // Register to default stream netconfDomAccessor.invokeCreateSubscription(); + if (x.isSupportingNamespaceAndRevision(ORanDeviceManagerQNames.ORAN_SUPERVISION_MODULE)) { + ORanSupervisionRPCImpl.invokeWatchdogReset(netconfDomAccessor, oranSupervisionConfig); + oranDomSupervisionNotificationListener.registerForNotificationReceivedEvent( + new ORanNotificationObserverImpl(netconfDomAccessor, oranSupervisionConfig)); + } } public Collection<MapEntryNode> initialReadFromNetworkElement() { @@ -133,9 +174,16 @@ public class ORanDOMNetworkElement implements NetworkElement { componentMapEntries = Collections.emptyList(); } - Optional<Guicutthrough> oGuicutthrough = ORanDOMToInternalDataModel.getGuicutthrough(getOnapSystemData()); - if (oGuicutthrough.isPresent()) { - databaseService.writeGuiCutThroughData(oGuicutthrough.get(), netconfDomAccessor.getNodeId().getValue()); + if (oranfm.isPresent()) { + getActiveAlarms(); + } + if (onapSystem.isPresent()) { + AugmentationNode gcData = (AugmentationNode) onapSystem.get().getOnapSystemData(); + Optional<Guicutthrough> oGuicutthrough = + ORanDOMToInternalDataModel.getGuicutthrough(gcData, onapSystem.get()); + if (oGuicutthrough.isPresent()) { + databaseService.writeGuiCutThroughData(oGuicutthrough.get(), netconfDomAccessor.getNodeId().getValue()); + } } return componentMapEntries; } @@ -192,36 +240,6 @@ public class ORanDOMNetworkElement implements NetworkElement { return null; } - // Read from device - /** - * Read system data with GUI cut through information from device if ONAP_SYSTEM YANG is supported. - * - * @return NormalizedNode data with GUI cut through information or null if not available. - */ - private @Nullable NormalizedNode getOnapSystemData() { - LOG.debug("Get System1 for mountpoint {}", netconfDomAccessor.getNodeId().getValue()); - @NonNull - InstanceIdentifierBuilder ietfSystemIID = - YangInstanceIdentifier.builder().node(ORanDeviceManagerQNames.IETF_SYSTEM_CONTAINER); - @NonNull - AugmentationIdentifier onapSystemIID = YangInstanceIdentifier.AugmentationIdentifier - .create(Sets.newHashSet(ORanDeviceManagerQNames.ONAP_SYSTEM_NAME, - ORanDeviceManagerQNames.ONAP_SYSTEM_WEB_UI, ORanDeviceManagerQNames.ONAP_SYSTEM_GEOLOCATION)); - InstanceIdentifierBuilder augmentedOnapSystem = - YangInstanceIdentifier.builder(ietfSystemIID.build()).node(onapSystemIID); - Capabilities x = netconfDomAccessor.getCapabilites(); - LOG.debug("Capabilites: {}", x); - if (x.isSupportingNamespace(ORanDeviceManagerQNames.ONAP_SYSTEM_QNAME)) { - Optional<NormalizedNode> res = - netconfDomAccessor.readDataNode(LogicalDatastoreType.OPERATIONAL, augmentedOnapSystem.build()); - LOG.debug("Result of System1 = {}", res); - return res.isPresent() ? res.get() : null; - } else { - LOG.debug("No GUI cut through support"); - return null; - } - } - // VES related private void publishMountpointToVES(Collection<MapEntryNode> componentList) { /* @@ -280,4 +298,27 @@ public class ORanDOMNetworkElement implements NetworkElement { return false; } + private void getActiveAlarms() { + InstanceIdentifierBuilder activeAlarmListBuilder = + YangInstanceIdentifier.builder().node(oranfm.get().getFaultActiveAlarmListQName()); + Optional<NormalizedNode> oData = + netconfDomAccessor.readDataNode(LogicalDatastoreType.OPERATIONAL, activeAlarmListBuilder.build()); + if (oData.isPresent()) { + ContainerNode cn = (ContainerNode) oData.get(); + UnkeyedListNode activeAlarmsList = + (UnkeyedListNode) cn.childByArg(new NodeIdentifier(oranfm.get().getFaultActiveAlarmsQName())); + int counter = 0; + for (UnkeyedListEntryNode activeAlarmEntry : activeAlarmsList.body()) + faultService.faultNotification(ORanDOMToInternalDataModel.getFaultLog(activeAlarmEntry, oranfm.get(), + netconfDomAccessor.getNodeId(), Integer.valueOf(counter++))); + } + + } + + @Override + public void onConfigChanged() { + LOG.info("O-RU Supervision Watchdog timers changed, resetting in O-RU via RPC"); + ORanSupervisionRPCImpl.invokeWatchdogReset(netconfDomAccessor, oranSupervisionConfig); + } + } 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/dom/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/dom/ORanNetworkElementFactory.java index 05561d2ca..1f0fa06fb 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/dom/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/dom/ORanNetworkElementFactory.java @@ -21,8 +21,11 @@ package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl.dom; import java.util.Optional; +import org.onap.ccsdk.features.sdnr.wt.common.configuration.ConfigurationFileRepresentation; import org.onap.ccsdk.features.sdnr.wt.devicemanager.ne.factory.NetworkElementFactory; import org.onap.ccsdk.features.sdnr.wt.devicemanager.ne.service.NetworkElement; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.config.ORanDMConfig; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.util.ORanDeviceManagerQNames; import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.DeviceManagerServiceProvider; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.Capabilities; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfAccessor; @@ -37,6 +40,13 @@ public class ORanNetworkElementFactory implements NetworkElementFactory { //Workaround private static final QName OneCell = QName.create("urn:onf:otcc:wireless:yang:radio-access:commscope-onecell", "2020-06-22", "onecell").intern(); + private ORanDMConfig oranSupervisionConfig; + private ConfigurationFileRepresentation configFileRepresentation; + + public ORanNetworkElementFactory(ConfigurationFileRepresentation configFileRepresentation, ORanDMConfig oranSupervisionConfig) { + this.configFileRepresentation = configFileRepresentation; + this.oranSupervisionConfig = oranSupervisionConfig; + } @Override public Optional<NetworkElement> create(NetconfAccessor accessor, DeviceManagerServiceProvider serviceProvider) { @@ -44,11 +54,9 @@ public class ORanNetworkElementFactory implements NetworkElementFactory { if (!capabilites.isSupportingNamespace(OneCell)) { if (capabilites.isSupportingNamespace(ORanDeviceManagerQNames.ORAN_HW_COMPONENT)) { log.info("Create device {} ", ORanDOMNetworkElement.class.getName()); - //Optional<NetconfBindingAccessor> bindingAccessor = accessor.getNetconfBindingAccessor(); Optional<NetconfDomAccessor> domAccessor = accessor.getNetconfDomAccessor(); if (domAccessor.isPresent()) { - //return Optional.of(new ORanNetworkElement(bindingAccessor.get(), serviceProvider)); - return Optional.of(new ORanDOMNetworkElement(domAccessor.get(), serviceProvider)); + return Optional.of(new ORanDOMNetworkElement(domAccessor.get(), serviceProvider, oranSupervisionConfig, configFileRepresentation)); } } } 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/dom/ORanDOMChangeNotificationListener.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/notification/ORanDOMChangeNotificationListener.java index f8e8b6da2..b4f0fe010 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/dom/ORanDOMChangeNotificationListener.java +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/notification/ORanDOMChangeNotificationListener.java @@ -19,13 +19,14 @@ * ============LICENSE_END========================================================= * */ -package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl.dom; +package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.notification; import com.fasterxml.jackson.core.JsonProcessingException; import java.time.Instant; import org.eclipse.jdt.annotation.NonNull; 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.oran.util.ORanDeviceManagerQNames; 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; @@ -51,7 +52,7 @@ public class ORanDOMChangeNotificationListener implements DOMNotificationListene private final NetconfDomAccessor netconfDomAccessor; private final DataProvider databaseService; private @NonNull VESCollectorService vesCollectorService; - private final DOMNotificationToXPath domNotificationXPath; + private final ORanDOMNotificationToXPath domNotificationXPath; private ORanDOMNotifToVESEventAssembly mapper = null; private static int sequenceNo = 0; @@ -60,7 +61,7 @@ public class ORanDOMChangeNotificationListener implements DOMNotificationListene this.netconfDomAccessor = netconfDomAccessor; this.databaseService = databaseService; this.vesCollectorService = vesCollectorService; - domNotificationXPath = new DOMNotificationToXPath(); + domNotificationXPath = new ORanDOMNotificationToXPath(); } @Override 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/dom/ORanDOMFaultNotificationListener.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/notification/ORanDOMFaultNotificationListener.java index 3e6921272..3e99bcd6d 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/dom/ORanDOMFaultNotificationListener.java +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/notification/ORanDOMFaultNotificationListener.java @@ -19,17 +19,23 @@ * ============LICENSE_END========================================================= * */ -package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl.dom; +package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.notification; import com.fasterxml.jackson.core.JsonProcessingException; import java.time.Instant; import java.time.format.DateTimeParseException; import java.util.Collection; import java.util.Objects; +import java.util.Optional; 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.devicemanager.oran.dataprovider.ORanDOMToInternalDataModel; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.util.ORanDMDOMUtility; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.util.ORanDeviceManagerQNames; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.vesmapper.ORanDOMFaultToVESFaultMapper; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.yangspecs.ORANFM; 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; @@ -55,10 +61,11 @@ public class ORanDOMFaultNotificationListener implements DOMNotificationListener private final @NonNull FaultService faultService; private final @NonNull WebsocketManagerService websocketManagerService; private final @NonNull DataProvider databaseService; + private final @NonNull ORANFM oranfm; private Integer counter; //Local counter is assigned to Notifications - public ORanDOMFaultNotificationListener(@NonNull NetconfDomAccessor netconfDomAccessor, + public ORanDOMFaultNotificationListener(@NonNull NetconfDomAccessor netconfDomAccessor, Optional<ORANFM> oranfm, @NonNull VESCollectorService vesCollectorService, @NonNull FaultService faultService, @NonNull WebsocketManagerService websocketManagerService, @NonNull DataProvider databaseService) { this.netconfDomAccessor = Objects.requireNonNull(netconfDomAccessor); @@ -66,7 +73,7 @@ public class ORanDOMFaultNotificationListener implements DOMNotificationListener this.faultService = Objects.requireNonNull(faultService); this.websocketManagerService = Objects.requireNonNull(websocketManagerService); this.databaseService = Objects.requireNonNull(databaseService); - + this.oranfm = oranfm.get(); this.mapper = new ORanDOMFaultToVESFaultMapper(netconfDomAccessor.getNodeId(), vesCollectorService, "AlarmNotif"); this.counter = 0; @@ -105,18 +112,18 @@ public class ORanDOMFaultNotificationListener implements DOMNotificationListener // Send devicemanager specific notification for database and ODLUX Instant eventTimeInstant = ORanDMDOMUtility.getNotificationInstant(notification); faultService.faultNotification( - ORanDOMToInternalDataModel.getFaultLog(notification, netconfDomAccessor.getNodeId(), counter)); + ORanDOMToInternalDataModel.getFaultLog(notification, oranfm, netconfDomAccessor.getNodeId(), counter)); // Send model specific notification to WebSocketManager - websocketManagerService.sendNotification(notification, netconfDomAccessor.getNodeId(), ORanDeviceManagerQNames.ORAN_FM_ALARM_NOTIF); + websocketManagerService.sendNotification(notification, netconfDomAccessor.getNodeId(), oranfm.getAlarmNotifQName()); try { if (vesCollectorService.getConfig().isVESCollectorEnabled()) { VESCommonEventHeaderPOJO header = mapper.mapCommonEventHeader(notification, eventTimeInstant, counter); - VESFaultFieldsPOJO body = mapper.mapFaultFields(notification); + VESFaultFieldsPOJO body = mapper.mapFaultFields(notification, oranfm); VESMessage vesMsg = vesCollectorService.generateVESEvent(header, body); vesCollectorService.publishVESMessage(vesMsg); LOG.debug("VES Message is {}", vesMsg.getMessage()); - writeToEventLog(vesMsg.getMessage(), eventTimeInstant, ORanDeviceManagerQNames.ORAN_FM_ALARM_NOTIF.getLocalName(), counter); + writeToEventLog(vesMsg.getMessage(), eventTimeInstant, oranfm.getAlarmNotifQName().getLocalName(), counter); } } catch (JsonProcessingException | DateTimeParseException e) { LOG.debug("Can not convert event into VES message {}", notification, e); 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/dom/ORanDOMNotifToVESEventAssembly.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/notification/ORanDOMNotifToVESEventAssembly.java index 7a2cd43cf..6c572f35c 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/dom/ORanDOMNotifToVESEventAssembly.java +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/notification/ORanDOMNotifToVESEventAssembly.java @@ -19,7 +19,7 @@ * ============LICENSE_END========================================================= * */ -package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl.dom; +package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.notification; import java.time.Instant; import java.util.ArrayList; 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/dom/DOMNotificationToXPath.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/notification/ORanDOMNotificationToXPath.java index 3d7353328..697265f01 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/dom/DOMNotificationToXPath.java +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/notification/ORanDOMNotificationToXPath.java @@ -19,7 +19,7 @@ * ============LICENSE_END========================================================= * */ -package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl.dom; +package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.notification; import com.google.common.base.VerifyException; import java.time.Instant; @@ -44,8 +44,8 @@ import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class DOMNotificationToXPath { - private static final Logger LOG = LoggerFactory.getLogger(DOMNotificationToXPath.class); +public class ORanDOMNotificationToXPath { + private static final Logger LOG = LoggerFactory.getLogger(ORanDOMNotificationToXPath.class); public HashMap<String, String> convertDomNotifToXPath(@NonNull DOMNotification domNotification) { @NonNull 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/notification/ORanDOMSupervisionNotificationListener.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/notification/ORanDOMSupervisionNotificationListener.java new file mode 100644 index 000000000..a0a075d0b --- /dev/null +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/notification/ORanDOMSupervisionNotificationListener.java @@ -0,0 +1,105 @@ +package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.notification; + +import com.fasterxml.jackson.core.JsonProcessingException; +import java.time.Instant; +import java.time.format.DateTimeParseException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import org.eclipse.jdt.annotation.NonNull; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.config.ORanDMConfig; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.dataprovider.ORanDOMToInternalDataModel; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.util.ORanDMDOMUtility; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.util.ORanDeviceManagerQNames; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.vesmapper.ORanDOMSupervisionNotifToVESMapper; +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.VESMessage; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.types.VESStndDefinedFieldsPOJO; +import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfDomAccessor; +import org.opendaylight.mdsal.dom.api.DOMNotification; +import org.opendaylight.mdsal.dom.api.DOMNotificationListener; +import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ORanDOMSupervisionNotificationListener implements DOMNotificationListener, ORanNotificationReceivedService { + private static final Logger LOG = LoggerFactory.getLogger(ORanDOMSupervisionNotificationListener.class); + + private @NonNull NetconfDomAccessor netconfDomAccessor; + private @NonNull DataProvider databaseService; + private @NonNull VESCollectorService vesCollectorService; + private List<ORanNotificationObserver> notificationObserverList; + private Integer counter; //Local counter is assigned to Notifications + + private @NonNull ORanDOMSupervisionNotifToVESMapper mapper; + + public ORanDOMSupervisionNotificationListener(@NonNull NetconfDomAccessor netconfDomAccessor, + @NonNull VESCollectorService vesCollectorService, @NonNull DataProvider databaseService, + ORanDMConfig oranSupervisionConfig) { + this.netconfDomAccessor = netconfDomAccessor; + this.databaseService = databaseService; + this.vesCollectorService = vesCollectorService; + this.mapper = new ORanDOMSupervisionNotifToVESMapper(netconfDomAccessor.getNodeId(), vesCollectorService, "o-ran-supervision"); + notificationObserverList = new ArrayList<>(); + this.counter = 0; + } + + public void setComponentList(Collection<MapEntryNode> componentList) { + for (MapEntryNode component : ORanDOMToInternalDataModel.getRootComponents(componentList)) { + mapper.setMfgName( + ORanDMDOMUtility.getLeafValue(component, ORanDeviceManagerQNames.IETF_HW_COMPONENT_LIST_MFG_NAME)); + mapper.setUuid(ORanDMDOMUtility.getLeafValue(component, + ORanDeviceManagerQNames.IETF_HW_COMPONENT_LIST_UUID) != null + ? ORanDMDOMUtility.getLeafValue(component, + ORanDeviceManagerQNames.IETF_HW_COMPONENT_LIST_UUID) + : netconfDomAccessor.getNodeId().getValue()); + mapper.setModelName(ORanDMDOMUtility.getLeafValue(component, + ORanDeviceManagerQNames.IETF_HW_COMPONENT_LIST_MODEL_NAME)); + } + } + + @Override + public void onNotification(@NonNull DOMNotification notification) { + LOG.trace("Notification Type = {}", notification.getType().toString()); + notifyObservers(); + Instant eventTimeInstant = ORanDMDOMUtility.getNotificationInstant(notification); + try { + if (vesCollectorService.getConfig().isVESCollectorEnabled()) { + VESCommonEventHeaderPOJO header = mapper.mapCommonEventHeader(notification, eventTimeInstant, counter); + VESStndDefinedFieldsPOJO body = mapper.mapStndDefinedFields(eventTimeInstant); + VESMessage vesMsg = vesCollectorService.generateVESEvent(header, body); + vesCollectorService.publishVESMessage(vesMsg); + LOG.debug("VES Message is {}", vesMsg.getMessage()); + } + } catch (JsonProcessingException | DateTimeParseException e) { + LOG.debug("Cannot convert event into VES message {}", notification, e); + } + } + + private void notifyObservers() { + Iterator<ORanNotificationObserver> it = notificationObserverList.iterator(); + while (it.hasNext()) { + ORanNotificationObserver o = it.next(); + new Thread() { + @Override + public void run() { + o.observer(); + } + }.start(); + } + } + + @Override + public void registerForNotificationReceivedEvent(ORanNotificationObserver o) { + notificationObserverList.add(o); + } + + @Override + public void deregisterNotificationReceivedEvent(ORanNotificationObserver o) { + notificationObserverList.remove(o); + } + +} 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/notification/ORanNotificationObserver.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/notification/ORanNotificationObserver.java new file mode 100644 index 000000000..ea56c983e --- /dev/null +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/notification/ORanNotificationObserver.java @@ -0,0 +1,31 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2023 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========================================================= + * + */ + +/* + * Interface to be implemented by those interested in knowing the occurrence of Notifications + */ +package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.notification; + +public interface ORanNotificationObserver { + + public void observer(); +} 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/notification/ORanNotificationObserverImpl.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/notification/ORanNotificationObserverImpl.java new file mode 100644 index 000000000..f7f840c90 --- /dev/null +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/notification/ORanNotificationObserverImpl.java @@ -0,0 +1,43 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2023 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.notification; + +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.config.ORanDMConfig; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.rpc.ORanSupervisionRPCImpl; +import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfDomAccessor; + +public class ORanNotificationObserverImpl implements ORanNotificationObserver { + + private NetconfDomAccessor netconfDomAccessor; + private ORanDMConfig oruSupervisionConfig; + + public ORanNotificationObserverImpl(NetconfDomAccessor netconfDomAccessor, ORanDMConfig oruSupervisionConfig) { + this.netconfDomAccessor = netconfDomAccessor; + this.oruSupervisionConfig = oruSupervisionConfig; + } + + @Override + public void observer() { + ORanSupervisionRPCImpl.invokeWatchdogReset(netconfDomAccessor, oruSupervisionConfig); + } + +} 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/notification/ORanNotificationReceivedService.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/notification/ORanNotificationReceivedService.java new file mode 100644 index 000000000..9c52c2daf --- /dev/null +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/notification/ORanNotificationReceivedService.java @@ -0,0 +1,33 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2023 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.notification; + +/* + * Interface for registering and de-registering for listening of occurrence of notifications + */ +public interface ORanNotificationReceivedService { + + void registerForNotificationReceivedEvent(ORanNotificationObserver o); + + void deregisterNotificationReceivedEvent(ORanNotificationObserver o); + +} 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/rpc/ORanSupervisionRPCImpl.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/rpc/ORanSupervisionRPCImpl.java new file mode 100644 index 000000000..30d413828 --- /dev/null +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/rpc/ORanSupervisionRPCImpl.java @@ -0,0 +1,82 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2023 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.rpc; + +import com.google.common.util.concurrent.ListenableFuture; +import java.util.concurrent.TimeUnit; +import org.eclipse.jdt.annotation.NonNull; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.config.ORanDMConfig; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.util.ORanDeviceManagerQNames; +import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfDomAccessor; +import org.opendaylight.mdsal.dom.api.DOMRpcResult; +import org.opendaylight.mdsal.dom.api.DOMRpcService; +import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; +import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; +import org.opendaylight.yangtools.yang.data.impl.schema.Builders; +import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ORanSupervisionRPCImpl { + + private static final Logger LOG = LoggerFactory.getLogger(ORanSupervisionRPCImpl.class); + private static NodeIdentifier inputNodeIdentifier = + NodeIdentifier.create(QName.create(ORanDeviceManagerQNames.ORAN_SUPERVISION_MODULE, "input")); + private static NodeIdentifier supervisionNotificationIntervalIdentifier = NodeIdentifier + .create(QName.create(ORanDeviceManagerQNames.ORAN_SUPERVISION_MODULE, "supervision-notification-interval")); + private static NodeIdentifier guardTimerOverheadIdentifier = NodeIdentifier + .create(QName.create(ORanDeviceManagerQNames.ORAN_SUPERVISION_MODULE, "guard-timer-overhead")); + + public static void invokeWatchdogReset(@NonNull NetconfDomAccessor netconfDomAccessor, + ORanDMConfig oruSupervisionConfig) { + + LOG.debug( + "Resetting suppervision-notification-interval and guard-timer-overhead watchdog timers with values {} and {} respectively", + oruSupervisionConfig.getNotificationInterval(), oruSupervisionConfig.getWatchdogTimer()); + ContainerNode rpcInputNode = Builders.containerBuilder().withNodeIdentifier(inputNodeIdentifier) + .withChild(ImmutableNodes.leafNode(supervisionNotificationIntervalIdentifier, + oruSupervisionConfig.getNotificationInterval())) + .withChild( + ImmutableNodes.leafNode(guardTimerOverheadIdentifier, oruSupervisionConfig.getWatchdogTimer())) + .build(); + + try { + DOMRpcService rpcService = netconfDomAccessor.getRpcService(); + QName supervisionWatchdogResetQN = + QName.create(ORanDeviceManagerQNames.ORAN_SUPERVISION_MODULE, "supervision-watchdog-reset"); + + ListenableFuture<? extends DOMRpcResult> result = + rpcService.invokeRpc(supervisionWatchdogResetQN, rpcInputNode); + DOMRpcResult rpcResult = result.get(60000, TimeUnit.MILLISECONDS); + if (rpcResult.value() != null) { + ContainerNode rpcResultCn = (ContainerNode) rpcResult.value(); + LOG.debug("Result of Supervision-Watchdog-Reset = {}", rpcResultCn.prettyTree()); + } + } catch (Exception e) { + LOG.error("{}", e); + } + return; + + } + +} 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/dom/ORanDMDOMUtility.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/util/ORanDMDOMUtility.java index a3bd14e3e..708ba8a47 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/dom/ORanDMDOMUtility.java +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/util/ORanDMDOMUtility.java @@ -19,16 +19,14 @@ * ============LICENSE_END========================================================= * */ -package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl.dom; +package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.util; +import com.google.common.base.VerifyException; import java.time.Instant; -import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; -import java.util.List; import java.util.Set; - import org.opendaylight.mdsal.dom.api.DOMEvent; import org.opendaylight.mdsal.dom.api.DOMNotification; import org.opendaylight.yangtools.yang.common.QName; @@ -42,8 +40,6 @@ import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.VerifyException; - public class ORanDMDOMUtility { public static final Logger LOG = LoggerFactory.getLogger(ORanDMDOMUtility.class); 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/dom/ORanDeviceManagerQNames.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/util/ORanDeviceManagerQNames.java index 9949a6ffc..e2ad092dc 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/dom/ORanDeviceManagerQNames.java +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/util/ORanDeviceManagerQNames.java @@ -19,7 +19,7 @@ * ============LICENSE_END========================================================= * */ -package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl.dom; +package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.util; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.yang.common.QName; @@ -33,17 +33,6 @@ public class ORanDeviceManagerQNames { QName.create(IETF_SYSTEM_NS, IETF_SYSTEM_REVISION, "ietf-system"); public static final @NonNull QName IETF_SYSTEM_CONTAINER = QName.create(IETF_SYSTEM_QNAME, "system"); - // onap-system.yang - public static final String ONAP_SYSTEM_NS = "urn:onap:system"; - public static final String ONAP_SYSTEM_REVISION = "2022-11-04"; - public static final @NonNull QName ONAP_SYSTEM_QNAME = - QName.create(ONAP_SYSTEM_NS, ONAP_SYSTEM_REVISION, "onap-system"); -// public static final @NonNull QName ONAP_SYSTEM_QNAME = -// QName.create(ONAP_SYSTEM_NS, "onap-system"); - public static final @NonNull QName ONAP_SYSTEM_NAME = QName.create(ONAP_SYSTEM_QNAME, "name"); - public static final @NonNull QName ONAP_SYSTEM_WEB_UI = QName.create(ONAP_SYSTEM_QNAME, "web-ui"); - public static final @NonNull QName ONAP_SYSTEM_GEOLOCATION = QName.create(ONAP_SYSTEM_QNAME, "geographical-location"); - //ietf-hardware.yang public static final String IETF_HW_NS = "urn:ietf:params:xml:ns:yang:ietf-hardware"; public static final String IETF_HW_REVISION = "2018-03-13"; @@ -85,18 +74,6 @@ public class ORanDeviceManagerQNames { public static final @NonNull QName ORAN_HW_MODULE = QName.create(ORAN_HW_NS, ORAN_HW_REVISION, "o-ran-hardware").intern(); public static final @NonNull QName ORAN_HW_COMPONENT = QName.create(ORAN_HW_MODULE, "O-RAN-HW-COMPONENT"); - //o-ran-fm.yang - public static final String ORAN_FM_NS = "urn:o-ran:fm:1.0"; - //public static final String ORAN_FM_REVISION = "2019-02-04"; - public static final String ORAN_FM_REVISION = "2022-08-15"; - public static final @NonNull QName ORAN_FM_MODULE = QName.create(ORAN_FM_NS, ORAN_FM_REVISION, "o-ran-fm"); - public static final @NonNull QName ORAN_FM_ALARM_NOTIF = QName.create(ORAN_FM_MODULE, "alarm-notif"); - public static final @NonNull QName ORAN_FM_FAULT_ID = QName.create(ORAN_FM_MODULE, "fault-id"); - public static final @NonNull QName ORAN_FM_FAULT_SOURCE = QName.create(ORAN_FM_MODULE, "fault-source"); - public static final @NonNull QName ORAN_FM_FAULT_SEVERITY = QName.create(ORAN_FM_MODULE, "fault-severity"); - public static final @NonNull QName ORAN_FM_FAULT_TEXT = QName.create(ORAN_FM_MODULE, "fault-text"); - public static final @NonNull QName ORAN_FM_FAULT_IS_CLEARED = QName.create(ORAN_FM_MODULE, "is-cleared"); - //ietf-netconf-notifications.yang public static final String IETF_NETCONF_NOTIFICATIONS_NS = "urn:ietf:params:xml:ns:yang:ietf-netconf-notifications"; public static final String IETF_NETCONF_NOTIFICATIONS_REVISION = "2012-02-06"; @@ -115,4 +92,10 @@ public class ORanDeviceManagerQNames { public static final @NonNull QName IETF_NETCONF_NOTIFICATIONS_TARGET = QName.create(IETF_NETCONF_NOTIFICATIONS_MODULE, "target"); public static final @NonNull QName IETF_NETCONF_NOTIFICATIONS_DATASTORE = QName.create(IETF_NETCONF_NOTIFICATIONS_MODULE, "datastore"); + //o-ran-supervision.yang + public static final String ORAN_SUPERVISION_NS = "urn:o-ran:supervision:1.0"; + public static final String ORAN_SUPERVISION_REVISION = "2022-12-05"; + public static final @NonNull QName ORAN_SUPERVISION_MODULE = QName.create(ORAN_SUPERVISION_NS, ORAN_SUPERVISION_REVISION, "o-ran-supervision"); + public static final @NonNull QName ORAN_SUPERVISION_NOTIFICATION = QName.create(ORAN_SUPERVISION_MODULE, "supervision-notification"); + } 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/dom/ORanDOMFaultToVESFaultMapper.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/vesmapper/ORanDOMFaultToVESFaultMapper.java index 77bd82d12..fabe26463 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/dom/ORanDOMFaultToVESFaultMapper.java +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/vesmapper/ORanDOMFaultToVESFaultMapper.java @@ -19,9 +19,11 @@ * ============LICENSE_END========================================================= * */ -package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl.dom; +package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.vesmapper; import java.time.Instant; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.util.ORanDMDOMUtility; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.yangspecs.ORANFM; 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; @@ -129,23 +131,20 @@ public class ORanDOMFaultToVESFaultMapper { return vesCEH; } - public VESFaultFieldsPOJO mapFaultFields(DOMNotification alarmNotif) { + public VESFaultFieldsPOJO mapFaultFields(DOMNotification alarmNotif, ORANFM oranfm) { VESFaultFieldsPOJO vesFaultFields = new VESFaultFieldsPOJO(); ContainerNode cn = alarmNotif.getBody(); - vesFaultFields.setAlarmCondition(ORanDMDOMUtility.getLeafValue(cn, ORanDeviceManagerQNames.ORAN_FM_FAULT_ID)); - vesFaultFields - .setAlarmInterfaceA(ORanDMDOMUtility.getLeafValue(cn, ORanDeviceManagerQNames.ORAN_FM_FAULT_SOURCE)); + vesFaultFields.setAlarmCondition(ORanDMDOMUtility.getLeafValue(cn, oranfm.getFaultIdQName())); + vesFaultFields.setAlarmInterfaceA(ORanDMDOMUtility.getLeafValue(cn, oranfm.getFaultSourceQName())); vesFaultFields.setEventCategory(VES_EVENT_CATEGORY); - if (ORanDMDOMUtility.getLeafValue(cn, ORanDeviceManagerQNames.ORAN_FM_FAULT_IS_CLEARED).equals("true")) { + if (ORanDMDOMUtility.getLeafValue(cn, oranfm.getFaultIsClearedQName()).equals("true")) { vesFaultFields.setEventSeverity("NORMAL"); } else { - vesFaultFields.setEventSeverity( - ORanDMDOMUtility.getLeafValue(cn, ORanDeviceManagerQNames.ORAN_FM_FAULT_SEVERITY)); + vesFaultFields.setEventSeverity(ORanDMDOMUtility.getLeafValue(cn, oranfm.getFaultSeverityQName())); } vesFaultFields.setEventSourceType(modelName); vesFaultFields.setFaultFieldsVersion(VES_FAULT_FIELDS_VERSION); - vesFaultFields - .setSpecificProblem(ORanDMDOMUtility.getLeafValue(cn, ORanDeviceManagerQNames.ORAN_FM_FAULT_TEXT)); + vesFaultFields.setSpecificProblem(ORanDMDOMUtility.getLeafValue(cn, oranfm.getFaultTextQName())); vesFaultFields.setVfStatus(VES_FAULT_FIELDS_VFSTATUS); return vesFaultFields; 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/vesmapper/ORanDOMSupervisionNotifToVESMapper.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/vesmapper/ORanDOMSupervisionNotifToVESMapper.java new file mode 100644 index 000000000..b87b93d80 --- /dev/null +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/vesmapper/ORanDOMSupervisionNotifToVESMapper.java @@ -0,0 +1,206 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2023 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.vesmapper; + +import com.fasterxml.jackson.annotation.JsonProperty; +import java.time.Instant; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.dataprovider.ORanDOMToInternalDataModel; +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.VESStndDefinedFieldsPOJO; +import org.opendaylight.mdsal.dom.api.DOMNotification; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId; + +/* + * { + "event": { + "stndDefinedFields": { + "schemaReference": "https://gerrit.o-ran-sc.org/r/gitweb?p=scp/oam/modeling.git;a=blob_plain;f=data-model/yang/published/o-ran/ru-fh/o-ran-supervision.yang#components/schemas/ofhm-event-stream", + "stndDefinedFieldsVersion": "1.0", + "data": { + "ietf:notification": { + "eventTime": "2023-06-28T07:28:55.098Z", + "o-ran-supervision:supervision-notification": { + "session-id": 999999 + } + } + } + }, + "commonEventHeader": { + "domain": "stndDefined", + "eventType": "o-ran-supervision:supervision-notification", + "eventId": "pnf2_o-ran-supervision:supervision-notification_fed2ab31f6e1da56", + "eventName": "stndDefined_o-ran-supervision:supervision-notification", + "sequence": 1687937335098, + "priority": "Low", + "reportingEntityId": "c2b7d6e9-ee35-459a-ab8e-717a6fc1fde6", + "reportingEntityName": "flows", + "sourceId": "378e9904-6d39-40ea-9994-0596fe2235a3", + "sourceName": "O-RAN-SC-OAM-Test-Component-01", + "startEpochMicrosec": 1687937335098000, + "lastEpochMicrosec": 1687937335098000, + "nfNamingCode": "pnf2", + "nfVendorName": "O-RAN-SC-OAM-Project", + "timeZoneOffset": "+00:00", + "stndDefinedNamespace": "o-ran-supervision:supervision-notification", + "version": "4.1", + "vesEventListenerVersion": "7.2.1" + } + } +} + */ +public class ORanDOMSupervisionNotifToVESMapper { + + private static final String VES_EVENT_DOMAIN = "stndDefined"; + private static final String VES_EVENTTYPE = "o-ran-supervision:supervision-notification"; + private static final String VES_EVENT_PRIORITY = "Low"; + private static final String O_RU_SUPERVISION_SCHEMA_REFERENCE = + "https://gerrit.o-ran-sc.org/r/gitweb?p=scp/oam/modeling.git;a=blob_plain;f=data-model/yang/published/o-ran/ru-fh/o-ran-supervision.yang#components/schemas/ofhm-event-stream"; + private final VESCollectorService vesProvider; + private final String notifName; + private final String nodeIdString; + //Initialized during registration + private String mfgName; + private String uuid; + private String modelName; + + public ORanDOMSupervisionNotifToVESMapper(NodeId nodeId, VESCollectorService vesCollectorService, + String notifName) { + this.nodeIdString = nodeId.getValue(); + this.vesProvider = vesCollectorService; + this.notifName = notifName; + } + + public void setMfgName(String mfgName) { + this.mfgName = mfgName; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public void setModelName(String modelName) { + this.modelName = modelName; + } + + public VESCommonEventHeaderPOJO mapCommonEventHeader(DOMNotification notification, Instant eventTime, + int sequenceNo) { + VESCommonEventHeaderPOJO vesCEH = new VESCommonEventHeaderPOJO(); + vesCEH.setDomain(VES_EVENT_DOMAIN); + vesCEH.setEventName(VES_EVENT_DOMAIN + "_" + VES_EVENTTYPE); + vesCEH.setEventType(VES_EVENTTYPE); + vesCEH.setPriority(VES_EVENT_PRIORITY); + + String eventId = notifName + "-" + Long.toUnsignedString(sequenceNo); + + vesCEH.setEventId(eventId); + vesCEH.setStartEpochMicrosec(eventTime.toEpochMilli() * 1000); + vesCEH.setLastEpochMicrosec(eventTime.toEpochMilli() * 1000); + vesCEH.setNfVendorName(mfgName); + vesCEH.setReportingEntityName(vesProvider.getConfig().getReportingEntityName()); + vesCEH.setSequence(sequenceNo); + vesCEH.setSourceId(uuid); + vesCEH.setSourceName(nodeIdString); + + return vesCEH; + } + + public VESStndDefinedFieldsPOJO mapStndDefinedFields(Instant eventTimeInstant) { + VESStndDefinedFieldsPOJO vesStndDefFields = new VESStndDefinedFieldsPOJO(); + vesStndDefFields.setSchemaReference(O_RU_SUPERVISION_SCHEMA_REFERENCE); + vesStndDefFields.setData(getSupervisionData(eventTimeInstant)); + + return vesStndDefFields; + } + + private DataObject getSupervisionData(Instant eventTimeInstant) { + ORanSupervisionNotification oruSuperNotif = new ORanSupervisionNotification(); + oruSuperNotif.setSessionId(999999); // Hardcoded due to limitation in NTS Simulator. Ideally should be NETCONF Session ID + + IetfNotification ietfNotif = new IetfNotification(); + ietfNotif.setOranSupervisionNotif(oruSuperNotif); + ietfNotif.setEventTime(ORanDOMToInternalDataModel.getDateAndTimeOfInstant(eventTimeInstant).getValue()); + + DataObject data = new DataObject(); + data.setIetfNotification(ietfNotif); + return data; + } + +} + +/* Classes for serialization of stndDefinedFields "data" object */ +class DataObject { + @JsonProperty("ietf:notification") + IetfNotification ietfNotification; + + public DataObject() {} + + public IetfNotification getIetfNotification() { + return ietfNotification; + } + + public void setIetfNotification(IetfNotification ietfNotification) { + this.ietfNotification = ietfNotification; + } +} + + +class IetfNotification { + String eventTime; + @JsonProperty("o-ran-supervision:supervision-notification") + ORanSupervisionNotification oranSupervisionNotif; + + public IetfNotification() {} + + public String getEventTime() { + return eventTime; + } + + public void setEventTime(String eventTime) { + this.eventTime = eventTime; + } + + public ORanSupervisionNotification getOranSupervisionNotif() { + return oranSupervisionNotif; + } + + public void setOranSupervisionNotif(ORanSupervisionNotification oranSupervisionNotif) { + this.oranSupervisionNotif = oranSupervisionNotif; + } + +} + + +class ORanSupervisionNotification { + @JsonProperty("session-id") + int sessionId; + + public ORanSupervisionNotification() {} + + public int getSessionId() { + return sessionId; + } + + public void setSessionId(int sessionId) { + this.sessionId = sessionId; + } +} 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/dom/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/vesmapper/ORanRegistrationToVESpnfRegistrationMapper.java index 5cad5881c..9cbb45d55 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/dom/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/vesmapper/ORanRegistrationToVESpnfRegistrationMapper.java @@ -19,10 +19,12 @@ * ============LICENSE_END========================================================= * */ -package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.impl.dom; +package org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.vesmapper; import java.time.Instant; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.util.ORanDMDOMUtility; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.oran.util.ORanDeviceManagerQNames; 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; 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/yangspecs/ORANFM.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/yangspecs/ORANFM.java new file mode 100644 index 000000000..5be18e75b --- /dev/null +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/yangspecs/ORANFM.java @@ -0,0 +1,113 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2023 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.yangspecs; + +import java.util.Arrays; +import java.util.List; +import java.util.Optional; +import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.Capabilities; +import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfDomAccessor; +import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.common.QNameModule; +import org.opendaylight.yangtools.yang.common.Revision; +import org.opendaylight.yangtools.yang.common.XMLNamespace; + +public class ORANFM extends YangModule { + + public static final String NAMESPACE = "urn:o-ran:fm:1.0"; + public static final QNameModule ORANFM_2019_02_04 = + QNameModule.create(XMLNamespace.of(NAMESPACE), Revision.of("2019-02-04")); + public static final QNameModule ORANFM_2022_08_15 = + QNameModule.create(XMLNamespace.of(NAMESPACE), Revision.of("2022-08-15")); + private static final List<QNameModule> MODULES = Arrays.asList(ORANFM_2019_02_04, ORANFM_2022_08_15); +// private final QName ORAN_FM_ALARM_NOTIF; +// private final QName ORAN_FM_FAULT_ID; +// private final QName ORAN_FM_FAULT_SOURCE; +// private final QName ORAN_FM_FAULT_SEVERITY; +// private final QName ORAN_FM_FAULT_TEXT; +// private final QName ORAN_FM_FAULT_IS_CLEARED; + + + + ORANFM(NetconfDomAccessor netconfDomAccessor, QNameModule module) { + super(netconfDomAccessor, module); +// ORAN_FM_ALARM_NOTIF = QName.create(module, "alarm-notif"); +// ORAN_FM_FAULT_ID = QName.create(module, "fault-id"); +// ORAN_FM_FAULT_SOURCE = QName.create(module, "fault-source"); +// ORAN_FM_FAULT_SEVERITY = QName.create(module, "fault-severity"); +// ORAN_FM_FAULT_TEXT = QName.create(module, "fault-text"); +// ORAN_FM_FAULT_IS_CLEARED = QName.create(module, "is-cleared"); + } + + public QName getFaultSourceQName() { + return getQName("fault-source"); + } + + public QName getFaultIdQName() { + return getQName("fault-id"); + } + + public QName getFaultSeverityQName() { + return getQName("fault-severity"); + } + + public QName getFaultTextQName() { + return getQName("fault-text"); + } + + public QName getAlarmNotifQName() { + return getQName("alarm-notif"); + } + + public QName getFaultIsClearedQName() { + return getQName("is-cleared"); + } + + public QName getFaultEventTimeQName() { + return getQName("event-time"); + } + + public QName getFaultActiveAlarmListQName() { + return getQName("active-alarm-list"); + } + + public QName getFaultActiveAlarmsQName() { + return getQName("active-alarms"); + } + + /** + * Get specific instance, depending on capabilities + * + * @param capabilities + * @return + */ + public static Optional<ORANFM> getModule(NetconfDomAccessor netconfDomAccessor) { + Capabilities capabilities = netconfDomAccessor.getCapabilites(); + for (QNameModule module : MODULES) { + if (capabilities.isSupportingNamespaceAndRevision(module)) { + return Optional.of(new ORANFM(netconfDomAccessor, module)); + } + } + return Optional.empty(); + } + +} 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/yangspecs/OnapSystem.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/yangspecs/OnapSystem.java new file mode 100644 index 000000000..03ed89111 --- /dev/null +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/yangspecs/OnapSystem.java @@ -0,0 +1,127 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2023 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.yangspecs; + +import com.google.common.collect.Sets; +import java.util.Arrays; +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.devicemanager.oran.util.ORanDeviceManagerQNames; +import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.Capabilities; +import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfDomAccessor; +import org.opendaylight.mdsal.common.api.LogicalDatastoreType; +import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.common.QNameModule; +import org.opendaylight.yangtools.yang.common.Revision; +import org.opendaylight.yangtools.yang.common.XMLNamespace; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.InstanceIdentifierBuilder; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + + +public class OnapSystem extends YangModule { + + private static final Logger LOG = LoggerFactory.getLogger(OnapSystem.class); + public static final String NAMESPACE = "urn:onap:system"; + public static final QNameModule ONAPSYSTEM_2020_10_26 = + QNameModule.create(XMLNamespace.of(NAMESPACE), Revision.of("2020-10-26")); + public static final QNameModule ONAPSYSTEM_2022_11_04 = + QNameModule.create(XMLNamespace.of(NAMESPACE), Revision.of("2022-11-04")); + private static final List<QNameModule> MODULES = Arrays.asList(ONAPSYSTEM_2020_10_26, ONAPSYSTEM_2022_11_04); + + private final QName NAME; + private final QName WEB_UI; + private final QName GEOGRAPHICAL_LOCATION; + + OnapSystem(NetconfDomAccessor netconfDomAccessor, QNameModule module) { + super(netconfDomAccessor, module); + + NAME = QName.create(module, "name"); + WEB_UI = QName.create(module, "web-ui"); + GEOGRAPHICAL_LOCATION = QName.create(module, "geographical-location"); + } + + public QName getName() { + return NAME; + } + + public QName getWebUi() { + return WEB_UI; + } + + public QName getGeoLocation() { + return GEOGRAPHICAL_LOCATION; + } + + // Read from device + /** + * Read system data with GUI cut through information from device if ONAP_SYSTEM YANG is supported. + * + * @return NormalizedNode data with GUI cut through information or null if not available. + */ + public @Nullable NormalizedNode getOnapSystemData() { + LOG.debug("Get System1 for mountpoint {}", netconfDomAccessor.getNodeId().getValue()); + @NonNull + InstanceIdentifierBuilder ietfSystemIID = + YangInstanceIdentifier.builder().node(ORanDeviceManagerQNames.IETF_SYSTEM_CONTAINER); + @NonNull + AugmentationIdentifier onapSystemIID = null; + if (netconfDomAccessor.getCapabilites().isSupportingNamespaceAndRevision(ONAPSYSTEM_2020_10_26)) + onapSystemIID = YangInstanceIdentifier.AugmentationIdentifier.create(Sets.newHashSet(NAME, WEB_UI)); + else if (netconfDomAccessor.getCapabilites().isSupportingNamespaceAndRevision(ONAPSYSTEM_2022_11_04)) + onapSystemIID = YangInstanceIdentifier.AugmentationIdentifier + .create(Sets.newHashSet(NAME, WEB_UI, GEOGRAPHICAL_LOCATION)); + + InstanceIdentifierBuilder augmentedOnapSystem = + YangInstanceIdentifier.builder(ietfSystemIID.build()).node(onapSystemIID); + + Optional<NormalizedNode> res = + netconfDomAccessor.readDataNode(LogicalDatastoreType.OPERATIONAL, augmentedOnapSystem.build()); + LOG.debug("Result of System1 = {}", res); + return res.isPresent() ? res.get() : null; + + } + + /** + * Get specific instance, depending on capabilities + * + * @param capabilities + * @return + */ + public static Optional<OnapSystem> getModule(NetconfDomAccessor netconfDomAccessor) { + Capabilities capabilities = netconfDomAccessor.getCapabilites(); + for (QNameModule module : MODULES) { + if (capabilities.isSupportingNamespaceAndRevision(module)) { + return Optional.of(new OnapSystem(netconfDomAccessor, module)); + } + } + return Optional.empty(); + } + + +} 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/yangspecs/YangModule.java b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/yangspecs/YangModule.java new file mode 100644 index 000000000..31010ab1d --- /dev/null +++ b/sdnr/wt/devicemanager-o-ran-sc/o-ran/ru-fh/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/oran/yangspecs/YangModule.java @@ -0,0 +1,51 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2023 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.yangspecs; + +import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfDomAccessor; +import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.common.QNameModule; + +public class YangModule { + + protected final NetconfDomAccessor netconfDomAccessor; + protected final QNameModule module; + + YangModule(NetconfDomAccessor netconfDomAccessor, QNameModule module) { + super(); + this.netconfDomAccessor = netconfDomAccessor; + this.module = module; + } + + NetconfDomAccessor getNetconfDomAccessor() { + return netconfDomAccessor; + } + + public QNameModule getQNameModule() { + return module; + } + + public QName getQName(String localName) { + return QName.create(module, localName); + } + +} |