diff options
author | highstreetherbert <herbert.eiselt@highstreet-technologies.com> | 2020-07-16 16:50:21 +0200 |
---|---|---|
committer | highstreetherbert <herbert.eiselt@highstreet-technologies.com> | 2020-07-17 08:22:52 +0200 |
commit | 240073b8341f4141ee7bd01e4f0fd691a932579f (patch) | |
tree | 602abb1904a343429e7cff5348e689730c20aeed /sdnr/wt/devicemanager/provider/src/main | |
parent | 96aeff5a753e008add7a879198ba3229f4b6016b (diff) |
SDN-R Sodium compliant netconfnode-state-service and devicemanager
Adapted tests
Issue-ID: CCSDK-2570
Signed-off-by: highstreetherbert <herbert.eiselt@highstreet-technologies.com>
Change-Id: I38e6f987f022a530e9e2851dd09eed32e7273fef
Signed-off-by: highstreetherbert <herbert.eiselt@highstreet-technologies.com>
Diffstat (limited to 'sdnr/wt/devicemanager/provider/src/main')
18 files changed, 541 insertions, 249 deletions
diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/aaiconnector/impl/AaiProviderClient.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/aaiconnector/impl/AaiProviderClient.java index 91a00772d..193b96a44 100644 --- a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/aaiconnector/impl/AaiProviderClient.java +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/aaiconnector/impl/AaiProviderClient.java @@ -63,7 +63,8 @@ public class AaiProviderClient implements AaiService, AutoCloseable { if (this.config.isOff()) { return; } - NetworkElement ne = this.deviceManager != null ? this.deviceManager.getNeByMountpoint(mountPointName) : null; + NetworkElement ne = + this.deviceManager != null ? this.deviceManager.getConnectedNeByMountpoint(mountPointName) : null; Optional<InventoryProvider> oip = ne != null ? ne.getService(InventoryProvider.class) : Optional.empty(); this.onDeviceRegistered(mountPointName, oip.isPresent() ? oip.get().getInventoryInformation("MWPS") : InventoryInformationDcae.getDefault()); diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/aaiconnector/impl/AaiWebApiClient.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/aaiconnector/impl/AaiWebApiClient.java index 44a5c9688..5a366a839 100644 --- a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/aaiconnector/impl/AaiWebApiClient.java +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/aaiconnector/impl/AaiWebApiClient.java @@ -21,7 +21,6 @@ import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; - import org.onap.ccsdk.features.sdnr.wt.common.http.BaseHTTPClient; import org.onap.ccsdk.features.sdnr.wt.common.http.BaseHTTPResponse; import org.slf4j.Logger; @@ -30,31 +29,29 @@ import org.slf4j.LoggerFactory; public class AaiWebApiClient extends BaseHTTPClient { private static Logger LOG = LoggerFactory.getLogger(AaiWebApiClient.class); - private static final String PNF_JSON_INTERFACE_TEMPLATE = " {\n" - + " \"interface-name\": \"@interface@\",\n" + " \"speed-value\": \"300\",\n" + // @formatter:off + private static final String PNF_JSON_INTERFACE_TEMPLATE = + " {\n" + + " \"interface-name\": \"@interface@\",\n" + + " \"speed-value\": \"300\",\n" + " \"speed-units\": \"MBit/s\",\n" + " \"port-description\": \"Air Interface (MWPS)\",\n" + " \"equipment-identifier\": \"@pnfId@-@interface@\",\n" + " \"interface-role\": \"Wireless\",\n" - + " \"interface-type\": \"Air Interface (MWPS)\",\n" - + " \"resource-version\": \"@model@\",\n" + " \"relationship-list\": [\n" - + " {\n" - + " \"related-to\": \"A keyword provided by A&AI to indicate type of node.\",\n" - + " \"related-link\": \"URL to the object in A&AI.\",\n" - + " \"relationship-data\": [\n" + " {\n" - + " \"relationship-key\": \"A keyword provided by A&AI to indicate an attribute.\",\n" - + " \"relationship-value\": \"Value of the attribute\"\n" - + " }\n" + " ],\n" - + " \"related-to-property\": [\n" + " {\n" - + " \"property-key\": \"Key part of a key/value pair\",\n" - + " \"property-value\": \"Value part of a key/value pair\"\n" - + " }\n" + " ]\n" + " }\n" + " ]\n" + + " \"interface-type\": \"Air Interface (MWPS)\"\n" + " }\n"; - private static final String PNF_JSON_TEMPLATE = "{\n" + " \"pnf-name\": \"@pnfId@\",\n" - + " \"pnf-id\": \"@pnfId@\",\n" + " \"equip-type\": \"@type@\",\n" - + " \"equip-model\": \"@model@\",\n" + " \"equip-vendor\": \"@vendor@\",\n" - + " \"ipaddress-v4-oam\": \"@oamIp@\",\n" + " \"in-maint\": false,\n" - + " \"prov-status\":\"PROV\",\n" + " \"p-interfaces\": @interface-list@\n" + "}\n" + ""; + private static final String PNF_JSON_TEMPLATE = "{\n" + + " \"pnf-name\": \"@pnfId@\",\n" + + " \"pnf-id\": \"@pnfId@\",\n" + + " \"equip-type\": \"@type@\",\n" + + " \"equip-model\": \"@model@\",\n" + + " \"equip-vendor\": \"@vendor@\",\n" + + " \"ipaddress-v4-oam\": \"@oamIp@\",\n" + + " \"in-maint\": false,\n" + + " \"prov-status\":\"PROV\",\n" + + " \"p-interfaces\": @interface-list@\n" + + "}\n" + ""; + // @formatter:on private static final String PNF_URI = "network/pnfs/pnf/"; private static final String EMPTY_MESSAGE = ""; @@ -77,7 +74,7 @@ public class AaiWebApiClient extends BaseHTTPClient { /** * Create and specify defition parametrs of pnf - * + * * @param pnfId name * @param type type * @param model model @@ -95,7 +92,7 @@ public class AaiWebApiClient extends BaseHTTPClient { /** * Unregister - * + * * @param pnfId name * @return true if http response code was 200 or false if not. */ @@ -106,7 +103,7 @@ public class AaiWebApiClient extends BaseHTTPClient { /** * Send registration request - * + * * @param pnfId name * @return error accoring to http response code or -1 */ diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/archiveservice/ArchiveCleanService.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/archiveservice/ArchiveCleanService.java index 88848a5c3..d84764e89 100644 --- a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/archiveservice/ArchiveCleanService.java +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/archiveservice/ArchiveCleanService.java @@ -24,11 +24,12 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import org.eclipse.jdt.annotation.NonNull; -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.ArchiveCleanProvider; import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.IEsConfig; import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService; +import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider; +import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration; import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -49,8 +50,11 @@ public class ArchiveCleanService implements AutoCloseable, IConfigChangedListene private final IEsConfig esConfig; private Future<?> taskReference; private boolean isMaster; + private final ClusterSingletonServiceRegistration cssRegistration; + + public ArchiveCleanService(IEsConfig config, ClusterSingletonServiceProvider clusterSingletonServiceProvider, + ArchiveCleanProvider... indexCleanList) { - public ArchiveCleanService(IEsConfig config, ArchiveCleanProvider... indexCleanList) { this.esConfig = config; this.esConfig.registerConfigChangedListener(this); @@ -59,6 +63,9 @@ public class ArchiveCleanService implements AutoCloseable, IConfigChangedListene this.taskReference = null; this.reinit(); + + this.cssRegistration = clusterSingletonServiceProvider.registerClusterSingletonService(this); + } private void reinit() { @@ -125,6 +132,7 @@ public class ArchiveCleanService implements AutoCloseable, IConfigChangedListene public void close() throws Exception { this.esConfig.unregisterConfigChangedListener(this); this.scheduler.shutdown(); + this.cssRegistration.close(); } @Override diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/dcaeconnector/impl/DcaeMessages.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/dcaeconnector/impl/DcaeMessages.java index a79e4ad05..de62af08e 100644 --- a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/dcaeconnector/impl/DcaeMessages.java +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/dcaeconnector/impl/DcaeMessages.java @@ -251,7 +251,7 @@ public class DcaeMessages { } NetworkElement optionalNe = - deviceManager != null ? deviceManager.getNeByMountpoint(mountpointName) : null; + deviceManager != null ? deviceManager.getConnectedNeByMountpoint(mountpointName) : null; InventoryInformationDcae neInventory = InventoryInformationDcae.getDefault(); if (optionalNe != null) { Optional<InventoryProvider> inventoryProvider = optionalNe.getService(InventoryProvider.class); diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/devicemonitor/impl/DeviceMonitor.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/devicemonitor/impl/DeviceMonitor.java index 18fcba714..c2c8b3d6b 100644 --- a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/devicemonitor/impl/DeviceMonitor.java +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/devicemonitor/impl/DeviceMonitor.java @@ -17,7 +17,6 @@ */ package org.onap.ccsdk.features.sdnr.wt.devicemanager.devicemonitor.impl; -import org.onap.ccsdk.features.sdnr.wt.devicemanager.ne.service.DeviceMonitoredNe; import org.onap.ccsdk.features.sdnr.wt.devicemanager.ne.service.NetworkElement; public interface DeviceMonitor extends AutoCloseable { @@ -35,7 +34,8 @@ public interface DeviceMonitor extends AutoCloseable { void removeMountpointIndication(String mountPointNodeName); /** - * Notify of device state change to "disconnected" Mount point supervision + * Notify of device state change to "disconnected" or "connecting". For mountpoint creation or leaving connected + * state. Mount point supervision * * @param mountPointNodeName to deregister */ @@ -47,14 +47,6 @@ public interface DeviceMonitor extends AutoCloseable { * @param mountPointNodeName name of mount point * @param ne to monitor */ - void deviceConnectMasterIndication(String mountPointNodeName, DeviceMonitoredNe ne); - - /** - * Notify of device state changes to "connected" - * - * @param mountPointNodeName name of mount point - * @param ne to monitor - */ void deviceConnectMasterIndication(String mountPointNodeName, NetworkElement ne); /** diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/devicemonitor/impl/DeviceMonitorEmptyImpl.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/devicemonitor/impl/DeviceMonitorEmptyImpl.java index 2b9a18ccc..fbd8e0f40 100644 --- a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/devicemonitor/impl/DeviceMonitorEmptyImpl.java +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/devicemonitor/impl/DeviceMonitorEmptyImpl.java @@ -17,7 +17,6 @@ */ package org.onap.ccsdk.features.sdnr.wt.devicemanager.devicemonitor.impl; -import org.onap.ccsdk.features.sdnr.wt.devicemanager.ne.service.DeviceMonitoredNe; import org.onap.ccsdk.features.sdnr.wt.devicemanager.ne.service.NetworkElement; public class DeviceMonitorEmptyImpl implements DeviceMonitor { @@ -29,7 +28,7 @@ public class DeviceMonitorEmptyImpl implements DeviceMonitor { public void removeMountpointIndication(String mountPointNodeName) {} @Override - public void deviceConnectMasterIndication(String mountPointNodeName, DeviceMonitoredNe ne) {} + public void deviceConnectMasterIndication(String mountPointNodeName, NetworkElement ne) {} @Override public void deviceDisconnectIndication(String mountPointNodeName) {} @@ -40,8 +39,4 @@ public class DeviceMonitorEmptyImpl implements DeviceMonitor { @Override public void close() throws Exception {} - @Override - public void deviceConnectMasterIndication(String mountPointNodeName, NetworkElement ne) {} - - } diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/devicemonitor/impl/DeviceMonitorImpl.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/devicemonitor/impl/DeviceMonitorImpl.java index 3f5fdac6b..55e223c79 100644 --- a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/devicemonitor/impl/DeviceMonitorImpl.java +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/devicemonitor/impl/DeviceMonitorImpl.java @@ -26,6 +26,7 @@ import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; +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.devicemanager.devicemonitor.impl.config.DmConfig; @@ -158,8 +159,7 @@ public class DeviceMonitorImpl implements DeviceMonitor, IConfigChangedListener * @param mountPointNodeName name of mount point * @param ne to monitor */ - @Override - synchronized public void deviceConnectMasterIndication(String mountPointNodeName, DeviceMonitoredNe ne) { + synchronized private void deviceConnectMasterIndication(String mountPointNodeName, @Nullable DeviceMonitoredNe ne) { LOG.debug("ne changes to connected state {}", mountPointNodeName); createMonitoringTask(mountPointNodeName); diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/devicemonitor/impl/DeviceMonitorTask.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/devicemonitor/impl/DeviceMonitorTask.java index e967317d2..ea5f7da87 100644 --- a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/devicemonitor/impl/DeviceMonitorTask.java +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/devicemonitor/impl/DeviceMonitorTask.java @@ -132,7 +132,7 @@ public class DeviceMonitorTask implements Runnable { * @param neParam that connected */ - public void deviceConnectIndication(DeviceMonitoredNe neParam) { + public void deviceConnectIndication(@Nullable DeviceMonitoredNe neParam) { LOG.info("{} {} Connect {} and stop.", LOGMARKER, tickCounter, mountPointName); clear(DeviceMonitorProblems.connectionLossOAM); synchronized (lockNe) { diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/eventdatahandler/ODLEventListenerHandler.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/eventdatahandler/ODLEventListenerHandler.java index 68177d373..7d1c4825b 100644 --- a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/eventdatahandler/ODLEventListenerHandler.java +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/eventdatahandler/ODLEventListenerHandler.java @@ -17,6 +17,10 @@ */ package org.onap.ccsdk.features.sdnr.wt.devicemanager.eventdatahandler; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + 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; @@ -50,19 +54,26 @@ import org.slf4j.LoggerFactory; * @author herbert */ -public class ODLEventListenerHandler implements EventHandlingService { +@SuppressWarnings("deprecation") +public class ODLEventListenerHandler implements EventHandlingService, AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(ODLEventListenerHandler.class); private static final NetconfTimeStamp NETCONFTIME_CONVERTER = NetconfTimeStampImpl.getConverter(); + /** + * if update NE failed delay before retrying to write data into database + */ + private static final long DBWRITE_RETRY_DELAY_MS = 3000; + private final String ownKeyName; private final WebSocketServiceClientInternal webSocketService; private final DataProvider databaseService; private final DcaeForwarderInternal aotsDcaeForwarder; - + private final ExecutorService executor = Executors.newFixedThreadPool(5); private int eventNumber; + /*--------------------------------------------------------------- * Construct */ @@ -86,7 +97,6 @@ public class ODLEventListenerHandler implements EventHandlingService { this.aotsDcaeForwarder = dcaeForwarder; this.eventNumber = 0; - } /*--------------------------------------------------------------- @@ -94,7 +104,7 @@ public class ODLEventListenerHandler implements EventHandlingService { */ /** - * A registration of a mountpoint occured, that is in connect state + * (NonConnected) A registration after creation of a mountpoint occured * * @param registrationName of device (mountpoint name) * @param nNode with mountpoint data @@ -115,18 +125,7 @@ public class ODLEventListenerHandler implements EventHandlingService { } /** - * mountpoint created, connection state not connected - * - * @param mountpointNodeName uuid that is nodeId or mountpointId - * @param netconfNode - */ - public void mountpointCreatedIndication(String mountpointNodeName, NetconfNode netconfNode) { - LOG.debug("mountpoint create indication for {}", mountpointNodeName); - this.registration(mountpointNodeName, netconfNode); - } - - /** - * After registration + * (Connected) mountpoint state moves to connected * * @param mountpointNodeName uuid that is nodeId or mountpointId * @param deviceType according to assessement @@ -138,7 +137,10 @@ public class ODLEventListenerHandler implements EventHandlingService { LOG.debug("updating networkelement-connection devicetype for {} with {}", mountpointNodeName, deviceType); NetworkElementConnectionEntity e = NetworkElementConnectionEntitiyUtil.getNetworkConnectionDeviceTpe(deviceType); - databaseService.updateNetworkConnectionDeviceType(e, mountpointNodeName); + //if updating db entry for ne connection fails retry later on (due elasticsearch max script executions error) + if (!databaseService.updateNetworkConnectionDeviceType(e, mountpointNodeName)) { + this.updateNeConnectionRetryWithDelay(e, mountpointNodeName); + } AttributeValueChangedNotificationXml notificationXml = new AttributeValueChangedNotificationXml(ownKeyName, popEvntNumber(), InternalDateAndTime.valueOf(NETCONFTIME_CONVERTER.getTimeStamp()), mountpointNodeName, @@ -147,10 +149,10 @@ public class ODLEventListenerHandler implements EventHandlingService { } /** - * mountpoint state changed + * (NonConnected) mountpoint state changed. * - * @param mountpointNodeName - * @param netconfNode + * @param mountpointNodeName nodeid + * @param netconfNode node */ public void onStateChangeIndication(String mountpointNodeName, NetconfNode netconfNode) { LOG.debug("mountpoint state changed indication for {}", mountpointNodeName); @@ -161,10 +163,11 @@ public class ODLEventListenerHandler implements EventHandlingService { } /** - * A deregistration of a mountpoint occured. + * (NonConnected) A deregistration after removal of a mountpoint occured. * * @param registrationName Name of the event that is used as key in the database. */ + @SuppressWarnings("null") @Override public void deRegistration(String registrationName) { @@ -193,11 +196,40 @@ public class ODLEventListenerHandler implements EventHandlingService { NetworkElementConnectionEntitiyUtil.getNetworkConnection(registrationName, nNode); LOG.debug("updating networkelement-connection for {} with status {}", registrationName, e.getStatus()); - databaseService.updateNetworkConnection22(e, registrationName); + //if updating db entry for ne connection fails retry later on (due elasticsearch max script executions error) + if (!databaseService.updateNetworkConnection22(e, registrationName)) { + this.updateNeConnectionRetryWithDelay(nNode, registrationName); + } databaseService.writeConnectionLog(notificationXml.getConnectionlogEntity()); webSocketService.sendViaWebsockets(registrationName, notificationXml); } + private void updateNeConnectionRetryWithDelay(NetconfNode nNode, String registrationName) { + LOG.debug("try to rewrite networkelement-connection in {} for node {}", DBWRITE_RETRY_DELAY_MS, + registrationName); + executor.execute(new DelayedThread(DBWRITE_RETRY_DELAY_MS) { + @Override + public void run() { + super.run(); + databaseService.updateNetworkConnection22( + NetworkElementConnectionEntitiyUtil.getNetworkConnection(registrationName, nNode), + registrationName); + } + }); + } + + private void updateNeConnectionRetryWithDelay(NetworkElementConnectionEntity e, String registrationName) { + LOG.debug("try to rewrite networkelement-connection in {} for node {}", DBWRITE_RETRY_DELAY_MS, + registrationName); + executor.execute(new DelayedThread(DBWRITE_RETRY_DELAY_MS) { + @Override + public void run() { + super.run(); + databaseService.updateNetworkConnection22(e, registrationName); + } + }); + } + /** * At a mountpoint a problem situation is indicated * @@ -260,6 +292,12 @@ public class ODLEventListenerHandler implements EventHandlingService { return ownKeyName; } + @Override + public void close() throws Exception { + executor.shutdown(); + executor.awaitTermination(DBWRITE_RETRY_DELAY_MS * 3, TimeUnit.SECONDS); + } + /*--------------------------------------------------------------- * Private */ @@ -267,6 +305,20 @@ public class ODLEventListenerHandler implements EventHandlingService { return eventNumber++; } - - + private class DelayedThread extends Thread { + private final long delay; + + public DelayedThread(long delayms) { + this.delay = delayms; + } + + @Override + public void run() { + try { + Thread.sleep(this.delay); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + } } diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/housekeeping/ConnectionStatusHousekeepingService.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/housekeeping/ConnectionStatusHousekeepingService.java index 0761299b0..860b6ca35 100644 --- a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/housekeeping/ConnectionStatusHousekeepingService.java +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/housekeeping/ConnectionStatusHousekeepingService.java @@ -24,7 +24,6 @@ import com.google.common.util.concurrent.FluentFuture; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; -import java.util.ArrayList; import java.util.List; import java.util.NoSuchElementException; import java.util.Optional; @@ -33,22 +32,28 @@ import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; 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.impl.util.NetworkElementConnectionEntitiyUtil; +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.types.InternalConnectionStatus; import org.opendaylight.mdsal.binding.api.DataBroker; import org.opendaylight.mdsal.binding.api.ReadTransaction; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService; +import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider; +import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration; import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.network.topology.topology.topology.types.TopologyNetconf; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ConnectionLogStatus; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.EventlogBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.NetworkElementConnectionBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.NetworkElementConnectionEntity; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.SourceType; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId; @@ -60,7 +65,8 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class ConnectionStatusHousekeepingService implements ClusterSingletonService, AutoCloseable { +public class ConnectionStatusHousekeepingService + implements ClusterSingletonService, AutoCloseable, IConfigChangedListener { private static final Logger LOG = LoggerFactory.getLogger(ConnectionStatusHousekeepingService.class); @@ -74,31 +80,59 @@ public class ConnectionStatusHousekeepingService implements ClusterSingletonServ private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(3); private final DataBroker dataBroker; private final DataProvider dataProvider; + private final Runnable runner = () -> doClean(); + private final HouseKeepingConfig config; + private final ConfigurationFileRepresentation cfg; + + private final ClusterSingletonServiceRegistration cssRegistration2; private boolean isMaster; private Future<?> taskReference; + private int eventNumber; + private volatile boolean enabled; - private final Runnable runner = () -> doClean(); - - public ConnectionStatusHousekeepingService(DataBroker dataBroker, DataProvider dataProvider) { + public ConnectionStatusHousekeepingService(ConfigurationFileRepresentation cfg, + ClusterSingletonServiceProvider clusterSingletonServiceProvider, DataBroker dataBroker, + DataProvider dataProvider) { + this.config = new HouseKeepingConfig(cfg); + this.cfg = cfg; + cfg.registerConfigChangedListener(this); this.dataBroker = dataBroker; this.dataProvider = dataProvider; + this.eventNumber = 0; + + setEnabled(this.config.isEnabled()); this.start(); + + this.cssRegistration2 = clusterSingletonServiceProvider.registerClusterSingletonService(this); } - public void start() { + private void setEnabled(boolean pEnabled) { + LOG.info("ConnectionStatusHousekeepingService status change from {} to {}", enabled, pEnabled); + this.enabled = pEnabled; + } + + private boolean isEnabled() { + return this.enabled; + } + + private void start() { if (taskReference != null) { taskReference.cancel(false); } if (!isMaster) { - LOG.info("do not start. not the master node"); - return; + LOG.info("Do not start. not the master node"); + } else { + LOG.info("Starting scheduler with interval {}", INTERVAL_SECONDS); + this.taskReference = + this.scheduler.scheduleAtFixedRate(runner, INTERVAL_SECONDS, INTERVAL_SECONDS, TimeUnit.SECONDS); } - LOG.info("starting scheduler with interval {}", INTERVAL_SECONDS); - this.taskReference = - this.scheduler.scheduleAtFixedRate(runner, INTERVAL_SECONDS, INTERVAL_SECONDS, TimeUnit.SECONDS); } private void doClean() { + if (!isEnabled()) { + LOG.debug("service is disabled by config"); + return; + } LOG.debug("start housekeeping"); // get all devices from networkelement-connection index try { @@ -110,6 +144,7 @@ public class ConnectionStatusHousekeepingService implements ClusterSingletonServ if (list == null || list.size() <= 0) { LOG.trace("no items in list."); } else { + NetconfTimeStamp ts = NetconfTimeStampImpl.getConverter(); //check all db entries and sync connection status for (NetworkElementConnectionEntity item : list) { @@ -125,39 +160,26 @@ public class ConnectionStatusHousekeepingService implements ClusterSingletonServ // if different then update db if (dbStatus != mdsalStatus) { LOG.trace("status is inconsistent db={}, mdsal={}. updating db", dbStatus, mdsalStatus); + this.dataProvider.writeEventLog(new EventlogBuilder().setNodeId("SDN-Controller") + .setTimestamp(new DateAndTime(ts.getTimeStamp())).setObjectId(item.getNodeId()) + .setAttributeName("status").setNewValue(String.valueOf(mdsalStatus)) + .setCounter(popEvntNumber()).setSourceType(SourceType.Controller).build()); if ((item.isIsRequired() == null || item.isIsRequired() == false) && mdsalStatus == ConnectionLogStatus.Disconnected) { LOG.info("removing entry for node {} ({}) from database due missing MD-SAL entry", item.getNodeId(), mdsalStatus); this.dataProvider.removeNetworkConnection(nodeId); } else { - this.dataProvider.updateNetworkConnectionDeviceType( - new NetworkElementConnectionBuilder().setStatus(mdsalStatus).build(), nodeId); + NetworkElementConnectionBuilder ne = + new NetworkElementConnectionBuilder().setStatus(mdsalStatus); + + this.dataProvider.updateNetworkConnection22(ne.build(), nodeId); } } else { LOG.trace("no difference"); } - } } - //check all md-sal entries and add non-existing to db - // List<Node> mdsalNodes = this.getMDSalNodes(); - // NodeId nid; - // for (Node mdsalNode : mdsalNodes) { - // nid = mdsalNode.getNodeId(); - // if (nid == null) { - // continue; - // } - // nodeId = nid.getValue(); - // if (nodeId == null) { - // continue; - // } - // if (contains(list, nodeId)) { - // LOG.debug("found mountpoint for {} without db entry. creating.",nodeId); - // this.dataProvider.updateNetworkConnection22(NetworkElementConnectionEntitiyUtil - // .getNetworkConnection(nodeId, mdsalNode.augmentation(NetconfNode.class)), nodeId); - // } - // } } catch (Exception e) { LOG.warn("problem executing housekeeping task: {}", e); @@ -165,39 +187,10 @@ public class ConnectionStatusHousekeepingService implements ClusterSingletonServ LOG.debug("finish housekeeping"); } - /** - * @param list - * @param nodeId - * @return - */ - // private boolean contains(List<NetworkElementConnectionEntity> list, @NonNull String nodeId) { - // if(list==null || list.size()<=0) { - // return false; - // } - // for(NetworkElementConnectionEntity item:list) { - // if(item!=null && nodeId.equals(item.getNodeId())) { - // return true; - // } - // } - // return false; - // } - // - // private List<Node> getMDSalNodes(){ - // ReadTransaction trans = this.dataBroker.newReadOnlyTransaction(); - // FluentFuture<Optional<Topology>> optionalTopology =trans.read(LogicalDatastoreType.OPERATIONAL, NETCONF_TOPO_IID); - // List<Node> nodes = new ArrayList<>(); - // try { - // Topology topo = optionalTopology.get(20, TimeUnit.SECONDS).get(); - // List<Node> topoNodes=topo.getNode(); - // if(topoNodes!=null){ - // nodes.addAll(topoNodes); - // } - // } - // catch(Exception e) { - // LOG.warn("unable to read netconf topology for housekeeping: {}",e); - // } - // return nodes; - // } + private Integer popEvntNumber() { + return eventNumber++; + } + private ConnectionLogStatus getMDSalConnectionStatus(String nodeId) { @SuppressWarnings("null") @@ -207,7 +200,8 @@ public class ConnectionStatusHousekeepingService implements ClusterSingletonServ ReadTransaction trans = this.dataBroker.newReadOnlyTransaction(); FluentFuture<Optional<Node>> optionalNode = trans.read(LogicalDatastoreType.OPERATIONAL, instanceIdentifier); try { - Node node = optionalNode.get(5, TimeUnit.SECONDS).get(); + //Node node = optionalNode.get(5, TimeUnit.SECONDS).get(); + Node node = optionalNode.get().get(); LOG.debug("node is {}", node); NetconfNode nNode = node.augmentation(NetconfNode.class); LOG.debug("nnode is {}", nNode); @@ -216,7 +210,7 @@ public class ConnectionStatusHousekeepingService implements ClusterSingletonServ } } catch (NoSuchElementException e) { return ConnectionLogStatus.Disconnected; - } catch (ExecutionException | InterruptedException | TimeoutException e) { + } catch (ExecutionException | InterruptedException e) {// | TimeoutException e) { LOG.warn("unable to get node info: {}", e); } finally { trans.close(); @@ -230,7 +224,11 @@ public class ConnectionStatusHousekeepingService implements ClusterSingletonServ if (taskReference != null) { taskReference.cancel(false); } + if (this.cfg != null) { + this.cfg.unregisterConfigChangedListener(this); + } this.scheduler.shutdown(); + this.cssRegistration2.close(); } @SuppressWarnings("null") @@ -253,4 +251,10 @@ public class ConnectionStatusHousekeepingService implements ClusterSingletonServ this.start(); return Futures.immediateFuture(null); } + + @Override + public void onConfigChanged() { + + setEnabled(this.config.isEnabled()); + } } diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/housekeeping/HouseKeepingConfig.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/housekeeping/HouseKeepingConfig.java new file mode 100644 index 000000000..230488a09 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/housekeeping/HouseKeepingConfig.java @@ -0,0 +1,63 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. + * All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + */ +package org.onap.ccsdk.features.sdnr.wt.devicemanager.housekeeping; + +import org.onap.ccsdk.features.sdnr.wt.common.configuration.Configuration; +import org.onap.ccsdk.features.sdnr.wt.common.configuration.ConfigurationFileRepresentation; + +/** + * @author Michael Dürre + * + */ +public class HouseKeepingConfig implements Configuration { + + private static final String SECTION_MARKER_HK = "housekeeping"; + + private static final String PROPERTY_KEY_ENABLED = "hkEnabled"; + + private static final boolean DEFAULT_VALUE_ENABLED = false; + + private final ConfigurationFileRepresentation configuration; + + public HouseKeepingConfig(ConfigurationFileRepresentation configuration) { + this.configuration = configuration; + this.configuration.addSection(SECTION_MARKER_HK); + defaults(); + } + + public boolean isEnabled() { + return configuration.getPropertyBoolean(SECTION_MARKER_HK, PROPERTY_KEY_ENABLED); + } + + + @Override + public String getSectionName() { + return SECTION_MARKER_HK; + } + + @Override + public void defaults() { + //Add default if not available + configuration.setPropertyIfNotAvailable(SECTION_MARKER_HK, PROPERTY_KEY_ENABLED, DEFAULT_VALUE_ENABLED); + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/housekeeping/ResyncNetworkElementHouskeepingService.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/housekeeping/ResyncNetworkElementHouskeepingService.java index 4b9c32021..50b0215d6 100644 --- a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/housekeeping/ResyncNetworkElementHouskeepingService.java +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/housekeeping/ResyncNetworkElementHouskeepingService.java @@ -133,7 +133,7 @@ public class ResyncNetworkElementHouskeepingService implements ResyncNetworkElem this.databaseClientEvents.clearFaultsCurrentOfNode(mountpointName); nodeNamesHandled.add(mountpointName); } else { - if (deviceManager.getNeByMountpoint(mountpointName) != null) { + if (deviceManager.getConnectedNeByMountpoint(mountpointName) != null) { LOG.info("At node known mountpoint {}", mountpointName); nodeNamesHandled.add(mountpointName); } else { @@ -152,7 +152,7 @@ public class ResyncNetworkElementHouskeepingService implements ResyncNetworkElem LOG.info("Start refresh mountpoint task {}", refreshCounter); // for(String nodeName:nodeNamesOutput) { for (String nodeName : nodeNamesHandled) { - NetworkElement ne = deviceManager.getNeByMountpoint(nodeName); + NetworkElement ne = deviceManager.getConnectedNeByMountpoint(nodeName); if (ne != null) { LOG.info("Refresh mountpoint {}", nodeName); ne.warmstart(); diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerImpl.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerImpl.java index 53ba09a45..4d731a5c9 100644 --- a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerImpl.java +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerImpl.java @@ -39,7 +39,6 @@ package org.onap.ccsdk.features.sdnr.wt.devicemanager.impl; import java.util.List; -import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; @@ -81,7 +80,6 @@ import org.opendaylight.mdsal.binding.api.MountPointService; import org.opendaylight.mdsal.binding.api.NotificationPublishService; import org.opendaylight.mdsal.binding.api.RpcProviderService; import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider; -import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.websocketmanager.rev150105.WebsocketmanagerService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -127,15 +125,12 @@ public class DeviceManagerImpl implements NetconfNetworkElementService, DeviceMa private DataProvider dataProvider; // Handler - private DeviceManagerNetconfConnectHandler forTest; + private DeviceManagerNetconfConnectHandler deviceManagerNetconfConnectHandler; // Attributes - private final ConcurrentHashMap<String, NetworkElement> networkElementRepresentations; private final List<NetworkElementFactory> factoryList; private DeviceManagerDatabaseNotificationService deviceManagerDatabaseAndNotificationService; - private ClusterSingletonServiceRegistration cssRegistration; - private ClusterSingletonServiceRegistration cssRegistration2; ConfigurationFileRepresentation config; private Boolean devicemanagerInitializationOk; @@ -145,7 +140,6 @@ public class DeviceManagerImpl implements NetconfNetworkElementService, DeviceMa LOG.info("Creating provider for {}", APPLICATION_NAME); this.devicemanagerInitializationOk = false; this.factoryList = new CopyOnWriteArrayList<>(); - this.networkElementRepresentations = new ConcurrentHashMap<>(); this.dataBroker = null; this.mountPointService = null; @@ -223,12 +217,10 @@ public class DeviceManagerImpl implements NetconfNetworkElementService, DeviceMa new RpcPushNotificationsHandler(webSocketService, dataProvider, aotsDcaeForwarder); this.odlEventListenerHandler = new ODLEventListenerHandler(myDbKeyNameExtended, webSocketService, dataProvider, aotsDcaeForwarder); - this.archiveCleanService = new ArchiveCleanService(iEntityDataProvider.getEsConfig(), dataProvider); - this.housekeepingService = new ConnectionStatusHousekeepingService(this.dataBroker, dataProvider); - this.cssRegistration = - this.clusterSingletonServiceProvider.registerClusterSingletonService(this.archiveCleanService); - this.cssRegistration2 = - this.clusterSingletonServiceProvider.registerClusterSingletonService(this.housekeepingService); + this.archiveCleanService = new ArchiveCleanService(iEntityDataProvider.getEsConfig(), + clusterSingletonServiceProvider, dataProvider); + this.housekeepingService = new ConnectionStatusHousekeepingService(config, clusterSingletonServiceProvider, + this.dataBroker, dataProvider); // PM this.performanceManager = new PerformanceManagerImpl(60, this, dataProvider, config); // DM @@ -251,8 +243,8 @@ public class DeviceManagerImpl implements NetconfNetworkElementService, DeviceMa // service LOG.debug("start NetconfSubscriptionManager Service"); - this.forTest = new DeviceManagerNetconfConnectHandler(netconfNodeStateService, odlEventListenerHandler, - deviceMonitor, this, factoryList); + this.deviceManagerNetconfConnectHandler = new DeviceManagerNetconfConnectHandler(netconfNodeStateService, + clusterSingletonServiceProvider, odlEventListenerHandler, deviceMonitor, this, factoryList); writeToEventLog(APPLICATION_NAME, "startup", "done"); this.devicemanagerInitializationOk = true; @@ -275,8 +267,7 @@ public class DeviceManagerImpl implements NetconfNetworkElementService, DeviceMa close(notificationDelayService); close(archiveCleanService); close(housekeepingService); - close(forTest); - close(cssRegistration, cssRegistration2); + close(deviceManagerNetconfConnectHandler); LOG.info("DeviceManagerImpl closing done"); } @@ -406,9 +397,9 @@ public class DeviceManagerImpl implements NetconfNetworkElementService, DeviceMa * @param mountpoint mount point name * @return null or NE specific data */ - public @Nullable NetworkElement getNeByMountpoint(String mountpoint) { + public @Nullable NetworkElement getConnectedNeByMountpoint(String mountpoint) { - return networkElementRepresentations.get(mountpoint); + return this.deviceManagerNetconfConnectHandler.getConnectedNeByMountpoint(mountpoint); } diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerNetconfConnectHandler.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerNetconfConnectHandler.java index fbcded801..bb61a82b4 100644 --- a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerNetconfConnectHandler.java +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerNetconfConnectHandler.java @@ -19,10 +19,12 @@ package org.onap.ccsdk.features.sdnr.wt.devicemanager.impl; import java.util.List; +import java.util.Objects; import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; +import javax.annotation.concurrent.GuardedBy; import org.eclipse.jdt.annotation.NonNull; -import org.onap.ccsdk.features.sdnr.wt.common.HtAssert; +import org.eclipse.jdt.annotation.Nullable; import org.onap.ccsdk.features.sdnr.wt.devicemanager.devicemonitor.impl.DeviceMonitor; import org.onap.ccsdk.features.sdnr.wt.devicemanager.eventdatahandler.ODLEventListenerHandler; import org.onap.ccsdk.features.sdnr.wt.devicemanager.ne.factory.NetworkElementFactory; @@ -30,8 +32,8 @@ import org.onap.ccsdk.features.sdnr.wt.devicemanager.ne.service.NetworkElement; import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.DeviceManagerServiceProvider; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfAccessor; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfNodeConnectListener; -import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfNodeStateListener; import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfNodeStateService; +import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus.ConnectionStatus; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId; @@ -39,34 +41,30 @@ import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class DeviceManagerNetconfConnectHandler implements NetconfNodeConnectListener, NetconfNodeStateListener { +public class DeviceManagerNetconfConnectHandler extends DeviceManagerNetconfNotConnectHandler + implements NetconfNodeConnectListener { private static final Logger LOG = LoggerFactory.getLogger(DeviceManagerNetconfConnectHandler.class); - private final @NonNull ListenerRegistration<DeviceManagerNetconfConnectHandler> registerNetconfNodeConnectListener; - private final @NonNull ListenerRegistration<NetconfNodeStateListener> registerNetconfNodeStateListener; - - private final @NonNull ODLEventListenerHandler odlEventListenerHandler; - private final @NonNull DeviceMonitor deviceMonitor; - private final @NonNull List<NetworkElementFactory> factoryList; - private final @NonNull DeviceManagerServiceProvider serviceProvider; - private final Object networkelementLock; - private final ConcurrentHashMap<String, NetworkElement> networkElementRepresentations; + /** Contains all connected devices */ + @GuardedBy("networkelementLock") + private final ConcurrentHashMap<String, NetworkElement> connectedNetworkElementRepresentations; + + private final @NonNull ListenerRegistration<DeviceManagerNetconfConnectHandler> registerNetconfNodeConnectListener; public DeviceManagerNetconfConnectHandler(@NonNull NetconfNodeStateService netconfNodeStateService, + @NonNull ClusterSingletonServiceProvider clusterSingletonServiceProvider, @NonNull ODLEventListenerHandler odlEventListenerHandler, @NonNull DeviceMonitor deviceMonitor, @NonNull DeviceManagerServiceProvider serviceProvider, @NonNull List<NetworkElementFactory> factoryList) { - HtAssert.nonnull(netconfNodeStateService, this.odlEventListenerHandler = odlEventListenerHandler, - this.deviceMonitor = deviceMonitor, this.serviceProvider = serviceProvider, - this.factoryList = factoryList); + super(netconfNodeStateService, clusterSingletonServiceProvider, odlEventListenerHandler, deviceMonitor, + serviceProvider, factoryList); this.networkelementLock = new Object(); - this.networkElementRepresentations = new ConcurrentHashMap<>(); + this.connectedNetworkElementRepresentations = new ConcurrentHashMap<>(); this.registerNetconfNodeConnectListener = netconfNodeStateService.registerNetconfNodeConnectListener(this); - this.registerNetconfNodeStateListener = netconfNodeStateService.registerNetconfNodeStateListener(this); } @Override @@ -84,26 +82,19 @@ public class DeviceManagerNetconfConnectHandler implements NetconfNodeConnectLis // times for same mountPointNodeName. // networkElementRepresentations contains handled NEs at master node. - synchronized (networkelementLock) { - if (networkElementRepresentations.containsKey(mountPointNodeName)) { - LOG.warn("Mountpoint {} already registered. Leave startup procedure.", mountPointNodeName); - return; - } + if (isInNetworkElementRepresentations(mountPointNodeName)) { + LOG.warn("Mountpoint {} already registered. Leave startup procedure.", mountPointNodeName); + return; } // update db with connect status NetconfNode netconfNode = acessor.getNetconfNode(); sendUpdateNotification(mountPointNodeName, netconfNode.getConnectionStatus(), netconfNode); - for (NetworkElementFactory f : factoryList) { - Optional<NetworkElement> optionalNe = f.create(acessor, serviceProvider); + for (NetworkElementFactory f : getFactoryList()) { + Optional<NetworkElement> optionalNe = f.create(acessor, getServiceProvider()); if (optionalNe.isPresent()) { // sendUpdateNotification(mountPointNodeName, nNode.getConnectionStatus(), nNode); - NetworkElement inNe = optionalNe.get(); - LOG.info("NE Management for {} with {}", mountPointNodeName, inNe.getClass().getName()); - putToNetworkElementRepresentations(mountPointNodeName, inNe); - deviceMonitor.deviceConnectMasterIndication(mountPointNodeName, inNe); - - inNe.register(); + handleNeStartup(mountPointNodeName, optionalNe.get()); break; // Use the first provided } } @@ -123,40 +114,21 @@ public class DeviceManagerNetconfConnectHandler implements NetconfNodeConnectLis // Handling if mountpoint exist. connected -> connecting/UnableToConnect stopListenerOnNodeForConnectedState(mountPointNodeName); - deviceMonitor.deviceDisconnectIndication(mountPointNodeName); - } - - @Override - public void onCreated(NodeId nNodeId, NetconfNode netconfNode) { - LOG.info("onCreated {}", nNodeId); - odlEventListenerHandler.mountpointCreatedIndication(nNodeId.getValue(), netconfNode); - - } - - @Override - public void onStateChange(NodeId nNodeId, NetconfNode netconfNode) { - LOG.info("onStateChange {}", nNodeId); - odlEventListenerHandler.onStateChangeIndication(nNodeId.getValue(), netconfNode); - } - - @Override - public void onRemoved(NodeId nNodeId) { - String mountPointNodeName = nNodeId.getValue(); - LOG.info("mountpointNodeRemoved {}", nNodeId.getValue()); - - stopListenerOnNodeForConnectedState(mountPointNodeName); - deviceMonitor.removeMountpointIndication(mountPointNodeName); - odlEventListenerHandler.deRegistration(mountPointNodeName); //Additional indication for log + if (isDeviceMonitorEnabled()) { + getDeviceMonitor().deviceDisconnectIndication(mountPointNodeName); + } } @Override public void close() { - if (registerNetconfNodeConnectListener != null) { + if (Objects.nonNull(registerNetconfNodeConnectListener)) { registerNetconfNodeConnectListener.close(); } - if (registerNetconfNodeStateListener != null) { - registerNetconfNodeStateListener.close(); - } + super.close(); + } + + public @Nullable NetworkElement getConnectedNeByMountpoint(String mountpoint) { + return this.connectedNetworkElementRepresentations.get(mountpoint); } /*-------------------------------------------- @@ -167,32 +139,49 @@ public class DeviceManagerNetconfConnectHandler implements NetconfNodeConnectLis * Do all tasks necessary to move from mountpoint state connected -> connecting * * @param mountPointNodeName provided - * @param ne representing the device connected to mountpoint */ private void stopListenerOnNodeForConnectedState(String mountPointNodeName) { - NetworkElement ne = networkElementRepresentations.remove(mountPointNodeName); + NetworkElement ne = connectedNetworkElementRepresentations.remove(mountPointNodeName); if (ne != null) { ne.deregister(); } } - private void putToNetworkElementRepresentations(String mountPointNodeName, NetworkElement ne) { + private boolean isInNetworkElementRepresentations(String mountPointNodeName) { + synchronized (networkelementLock) { + return connectedNetworkElementRepresentations.contains(mountPointNodeName); + } + } + + + private void handleNeStartup(String mountPointNodeName, NetworkElement inNe) { + + LOG.info("NE Management for {} with {}", mountPointNodeName, inNe.getClass().getName()); NetworkElement result; synchronized (networkelementLock) { - result = networkElementRepresentations.put(mountPointNodeName, ne); + result = connectedNetworkElementRepresentations.put(mountPointNodeName, inNe); } if (result != null) { LOG.warn("NE list was not empty as expected, but contained {} ", result.getNodeId()); } else { - LOG.debug("refresh necon entry for {} with type {}", mountPointNodeName, ne.getDeviceType()); - odlEventListenerHandler.connectIndication(mountPointNodeName, ne.getDeviceType()); + LOG.debug("refresh necon entry for {} with type {}", mountPointNodeName, inNe.getDeviceType()); + if (isOdlEventListenerHandlerEnabled()) { + getOdlEventListenerHandler().connectIndication(mountPointNodeName, inNe.getDeviceType()); + } + } + if (isDeviceMonitorEnabled()) { + getDeviceMonitor().deviceConnectMasterIndication(mountPointNodeName, inNe); } + + inNe.register(); } private void sendUpdateNotification(String mountPointNodeName, ConnectionStatus csts, NetconfNode nNode) { LOG.info("update ConnectedState for device :: Name : {} ConnectionStatus {}", mountPointNodeName, csts); - odlEventListenerHandler.updateRegistration(mountPointNodeName, ConnectionStatus.class.getSimpleName(), - csts != null ? csts.getName() : "null", nNode); + if (isOdlEventListenerHandlerEnabled()) { + getOdlEventListenerHandler().updateRegistration(mountPointNodeName, ConnectionStatus.class.getSimpleName(), + csts != null ? csts.getName() : "null", nNode); + } } } diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerNetconfNotConnectHandler.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerNetconfNotConnectHandler.java new file mode 100644 index 000000000..df833018d --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerNetconfNotConnectHandler.java @@ -0,0 +1,146 @@ +/* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + */ + +package org.onap.ccsdk.features.sdnr.wt.devicemanager.impl; + +import java.util.List; +import java.util.Objects; +import org.eclipse.jdt.annotation.NonNull; +import org.onap.ccsdk.features.sdnr.wt.common.HtAssert; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.devicemonitor.impl.DeviceMonitor; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.eventdatahandler.ODLEventListenerHandler; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.util.OdlClusterSingleton; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.ne.factory.NetworkElementFactory; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.service.DeviceManagerServiceProvider; +import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfNodeStateListener; +import org.onap.ccsdk.features.sdnr.wt.netconfnodestateservice.NetconfNodeStateService; +import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId; +import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DeviceManagerNetconfNotConnectHandler implements NetconfNodeStateListener { + + private static final Logger LOG = LoggerFactory.getLogger(DeviceManagerNetconfNotConnectHandler.class); + + private final @NonNull ListenerRegistration<NetconfNodeStateListener> registerNetconfNodeStateListener; + + private final @NonNull ODLEventListenerHandler odlEventListenerHandler; + private final @NonNull DeviceMonitor deviceMonitor; + private final @NonNull List<NetworkElementFactory> factoryList; + private final @NonNull DeviceManagerServiceProvider serviceProvider; + + + private final boolean odlEventListenerHandlerEnabled; + private final boolean deviceMonitorEnabled; + + private final OdlClusterSingleton singleton; + + public DeviceManagerNetconfNotConnectHandler(@NonNull NetconfNodeStateService netconfNodeStateService, + @NonNull ClusterSingletonServiceProvider clusterSingletonServiceProvider, + @NonNull ODLEventListenerHandler odlEventListenerHandler, @NonNull DeviceMonitor deviceMonitor, + @NonNull DeviceManagerServiceProvider serviceProvider, @NonNull List<NetworkElementFactory> factoryList) { + + HtAssert.nonnull(netconfNodeStateService, this.odlEventListenerHandler = odlEventListenerHandler, + this.deviceMonitor = deviceMonitor, this.serviceProvider = serviceProvider, + this.factoryList = factoryList, odlEventListenerHandler); + + /* Used for debug purpose */ + this.odlEventListenerHandlerEnabled = true; + this.deviceMonitorEnabled = false; + + this.singleton = new OdlClusterSingleton(clusterSingletonServiceProvider); + this.registerNetconfNodeStateListener = netconfNodeStateService.registerNetconfNodeStateListener(this); + + } + + @Override + public void onCreated(NodeId nNodeId, NetconfNode netconfNode) { + LOG.info("onCreated {}", nNodeId); + if (isOdlEventListenerHandlerMaster()) { + odlEventListenerHandler.registration(nNodeId.getValue(), netconfNode); + } + if (deviceMonitorEnabled) { + deviceMonitor.deviceDisconnectIndication(nNodeId.getValue()); + } + } + + @Override + public void onStateChange(NodeId nNodeId, NetconfNode netconfNode) { + LOG.info("onStateChange {}", nNodeId); + if (isOdlEventListenerHandlerMaster()) { + odlEventListenerHandler.onStateChangeIndication(nNodeId.getValue(), netconfNode); + } + } + + @Override + public void onRemoved(NodeId nNodeId) { + String mountPointNodeName = nNodeId.getValue(); + LOG.info("mountpointNodeRemoved {}", nNodeId.getValue()); + + if (deviceMonitorEnabled) { + deviceMonitor.removeMountpointIndication(mountPointNodeName); + } + if (isOdlEventListenerHandlerMaster()) { + odlEventListenerHandler.deRegistration(mountPointNodeName); //Additional indication for log + } + } + + @Override + public void close() { + if (Objects.nonNull(registerNetconfNodeStateListener)) { + registerNetconfNodeStateListener.close(); + } + } + + /*-------------------------------------------- + * Private functions + */ + + private boolean isOdlEventListenerHandlerMaster() { + return odlEventListenerHandlerEnabled && singleton.isMaster(); + } + + protected @NonNull DeviceManagerServiceProvider getServiceProvider() { + return serviceProvider; + } + + protected @NonNull List<NetworkElementFactory> getFactoryList() { + return factoryList; + } + + + protected boolean isDeviceMonitorEnabled() { + return deviceMonitorEnabled; + } + + protected @NonNull DeviceMonitor getDeviceMonitor() { + return deviceMonitor; + } + + protected boolean isOdlEventListenerHandlerEnabled() { + return odlEventListenerHandlerEnabled; + } + + protected @NonNull ODLEventListenerHandler getOdlEventListenerHandler() { + return odlEventListenerHandler; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/util/NetworkElementConnectionEntitiyUtil.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/util/NetworkElementConnectionEntitiyUtil.java index 61ab2df6e..789930c0a 100644 --- a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/util/NetworkElementConnectionEntitiyUtil.java +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/util/NetworkElementConnectionEntitiyUtil.java @@ -15,9 +15,6 @@ * the License. * ============LICENSE_END========================================================================== */ -/** - * - */ package org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.util; import javax.annotation.Nonnull; @@ -45,10 +42,9 @@ public class NetworkElementConnectionEntitiyUtil { private static final QName QNAME_COREMODEL = QName.create("urn:onf:params:xml:ns:yang:core-model", "2017-03-20", "core-model").intern(); - /** * Update devicetype and let all other field empty - * + * * @param deviceType that should be updated * @return NetworkElementConnectionEntity with related parameter */ @@ -60,7 +56,7 @@ public class NetworkElementConnectionEntitiyUtil { /** * Provide device specific data - * + * * @param nodeId mountpoint id * @param nNode data * @return NetworkElementConnectionEntity specific information diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/util/OdlClusterSingleton.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/util/OdlClusterSingleton.java new file mode 100644 index 000000000..49c04016a --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/util/OdlClusterSingleton.java @@ -0,0 +1,72 @@ +/* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + */ +package org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.util; + +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.ListenableFuture; +import org.eclipse.jdt.annotation.NonNull; +import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService; +import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider; +import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration; +import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class OdlClusterSingleton implements ClusterSingletonService, AutoCloseable { + + private static final Logger LOG = LoggerFactory.getLogger(OdlClusterSingleton.class); + private final @NonNull ServiceGroupIdentifier ident; + private final ClusterSingletonServiceRegistration cssRegistration; + private volatile boolean master; + + @SuppressWarnings("null") + public OdlClusterSingleton(ClusterSingletonServiceProvider clusterSingletonServiceProvider) { + this.ident = ServiceGroupIdentifier.create("ODLEventListenerHandler"); + this.cssRegistration = clusterSingletonServiceProvider.registerClusterSingletonService(this); + this.master = false; + } + + @Override + public @NonNull ServiceGroupIdentifier getIdentifier() { + return ident; + } + + @Override + public void instantiateServiceInstance() { + LOG.debug("We take Leadership"); + this.master = true; + } + + @Override + public ListenableFuture<? extends Object> closeServiceInstance() { + LOG.debug("We lost Leadership"); + this.master = false; + return Futures.immediateFuture(null); + } + + public boolean isMaster() { + return master; + } + + @Override + public void close() throws Exception { + if (cssRegistration != null) { + cssRegistration.close(); + } + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/xml/WebSocketServiceClientImpl2.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/xml/WebSocketServiceClientImpl2.java index 878e22613..81a740305 100644 --- a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/xml/WebSocketServiceClientImpl2.java +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/xml/WebSocketServiceClientImpl2.java @@ -18,10 +18,9 @@ package org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml; import java.util.concurrent.Future; + import org.eclipse.jdt.annotation.NonNull; import org.onap.ccsdk.features.sdnr.wt.devicemanager.eventdatahandler.ODLEventListenerHandler; -import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.EventlogEntity; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.websocketmanager.rev150105.WebsocketEventInputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.websocketmanager.rev150105.WebsocketEventOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.websocketmanager.rev150105.WebsocketmanagerService; @@ -32,7 +31,6 @@ import org.slf4j.LoggerFactory; /** * Wrapper for forwarding web-socket notifications to the web-socket service, that is running as bundle. */ -@SuppressWarnings("deprecation") public class WebSocketServiceClientImpl2 implements WebSocketServiceClientInternal { private static final Logger LOG = LoggerFactory.getLogger(ODLEventListenerHandler.class); @@ -41,18 +39,6 @@ public class WebSocketServiceClientImpl2 implements WebSocketServiceClientIntern private final XmlMapper xmlMapper; /** - * Implementation of Websocket notification processor. - * - * @param rpcProviderRegistry to get MDSAL services. - */ - @Deprecated - public WebSocketServiceClientImpl2(@NonNull RpcProviderRegistry rpcProviderRegistry) { - super(); - this.websocketmanagerService = rpcProviderRegistry.getRpcService(WebsocketmanagerService.class); - this.xmlMapper = new XmlMapper(); - } - - /** * New: Implementation of Websocket notification processor. * * @param websocketmanagerService2 to be used |