Remove blueprint from netconf-topology-singleton 06/106806/3
authorRobert Varga <robert.varga@pantheon.tech>
Tue, 4 Jul 2023 18:37:57 +0000 (20:37 +0200)
committerRobert Varga <nite@hq.sk>
Wed, 5 Jul 2023 00:02:05 +0000 (00:02 +0000)
We have only a single configuration knob. Convert that to OSGi Config
Admin and allow it to be manually controller. Then convert
NetconfTopologyManager to an OSGi DS Component and a
javax.inject.Singleton.

JIRA: NETCONF-1072
Change-Id: I802b51bc15ab0eb406d94471336aed34399b9cc6
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
apps/netconf-topology-singleton/pom.xml
apps/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/NetconfTopologyManager.java
apps/netconf-topology-singleton/src/main/resources/OSGI-INF/blueprint/netconf-topology-singleton.xml [deleted file]
apps/netconf-topology-singleton/src/main/yang/netconf-clustered-topology-config.yang [deleted file]
apps/netconf-topology-singleton/src/test/java/org/opendaylight/netconf/topology/singleton/impl/MountPointEndToEndTest.java
apps/netconf-topology-singleton/src/test/java/org/opendaylight/netconf/topology/singleton/impl/NetconfTopologyManagerTest.java

index b4200b62e5ae5f694303503ca1b820c15d4d18ed..99964ed46304b17194aba30d0cbaf8a735559ed7 100644 (file)
     <packaging>bundle</packaging>
 
     <dependencies>
+        <dependency>
+            <groupId>com.guicedee.services</groupId>
+            <artifactId>javax.inject</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.github.spotbugs</groupId>
+            <artifactId>spotbugs-annotations</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>jakarta.annotation</groupId>
+            <artifactId>jakarta.annotation-api</artifactId>
+            <scope>provided</scope>
+            <optional>true</optional>
+        </dependency>
         <dependency>
             <groupId>org.opendaylight.controller</groupId>
             <artifactId>repackaged-akka</artifactId>
         </dependency>
-
         <dependency>
             <groupId>org.opendaylight.netconf</groupId>
             <artifactId>netconf-client-mdsal</artifactId>
             <groupId>org.opendaylight.mdsal.model</groupId>
             <artifactId>ietf-topology</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.service.component.annotations</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.service.metatype.annotations</artifactId>
+        </dependency>
 
         <dependency>
             <groupId>org.opendaylight.mdsal</groupId>
             <groupId>com.typesafe.akka</groupId>
             <artifactId>akka-testkit_2.13</artifactId>
         </dependency>
-        <dependency>
-            <groupId>com.guicedee.services</groupId>
-            <artifactId>javax.inject</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.osgi</groupId>
-            <artifactId>org.osgi.service.component.annotations</artifactId>
-            <scope>test</scope>
-        </dependency>
     </dependencies>
 </project>
index 3c41a743f88e333e1d8a5e0642350d51719ec3c9..e89aeb1be56616b983cbc547600830d61afd86f3 100644 (file)
@@ -14,6 +14,7 @@ import akka.util.Timeout;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.MoreExecutors;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import io.netty.util.concurrent.EventExecutor;
 import java.time.Duration;
 import java.util.Collection;
@@ -21,6 +22,9 @@ import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.Executor;
 import java.util.concurrent.ScheduledExecutorService;
+import javax.annotation.PreDestroy;
+import javax.inject.Inject;
+import javax.inject.Singleton;
 import org.opendaylight.aaa.encrypt.AAAEncryptionService;
 import org.opendaylight.controller.cluster.ActorSystemProvider;
 import org.opendaylight.controller.config.threadpool.ScheduledThreadPool;
@@ -51,7 +55,6 @@ import org.opendaylight.netconf.topology.spi.NetconfNodeUtils;
 import org.opendaylight.netconf.topology.spi.NetconfTopologyRPCProvider;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev221225.NetconfNode;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev221225.NetconfNodeTopologyService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.topology.singleton.config.rev170419.Config;
 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;
@@ -62,10 +65,33 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.Uint16;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+@Singleton
+@Component(service = { }, configurationPid = "org.opendaylight.netconf.topology.singleton")
+@Designate(ocd = NetconfTopologyManager.Configuration.class)
+// Non-final for testing
 public class NetconfTopologyManager implements ClusteredDataTreeChangeListener<Node>, AutoCloseable {
+    @ObjectClassDefinition
+    public @interface Configuration {
+        @AttributeDefinition(min = "1", description = "Name of the Network Topology instance to manage")
+        String topology$_$id() default "topology-netconf";
+
+        @AttributeDefinition(min = "0", max = "65535",
+            description = "Idle time in seconds after which write transaction is cancelled automatically. If 0, "
+                + "automatic cancellation is turned off.")
+        int write$_$transaction$_$idle$_$timeout() default 0;
+    }
+
     private static final Logger LOG = LoggerFactory.getLogger(NetconfTopologyManager.class);
 
     private final Map<InstanceIdentifier<Node>, NetconfTopologyContext> contexts = new ConcurrentHashMap<>();
@@ -75,8 +101,8 @@ public class NetconfTopologyManager implements ClusteredDataTreeChangeListener<N
     private final BaseNetconfSchemas baseSchemas;
     private final DataBroker dataBroker;
     private final ClusterSingletonServiceProvider clusterSingletonServiceProvider;
-    private final ScheduledExecutorService keepaliveExecutorService;
-    private final Executor processingExecutorService;
+    private final ScheduledExecutorService keepaliveExecutor;
+    private final Executor processingExecutor;
     private final ActorSystem actorSystem;
     private final EventExecutor eventExecutor;
     private final NetconfClientDispatcher clientDispatcher;
@@ -92,39 +118,73 @@ public class NetconfTopologyManager implements ClusteredDataTreeChangeListener<N
     private ListenerRegistration<NetconfTopologyManager> dataChangeListenerRegistration;
     private Registration rpcReg;
 
+    @Activate
+    public NetconfTopologyManager(@Reference final BaseNetconfSchemas baseSchemas,
+            @Reference final DataBroker dataBroker,
+            @Reference final ClusterSingletonServiceProvider clusterSingletonServiceProvider,
+            @Reference(target = "(type=global-netconf-ssh-scheduled-executor)")
+                final ScheduledThreadPool keepaliveExecutor,
+            @Reference(target = "(type=global-netconf-processing-executor)") final ThreadPool processingExecutor,
+            @Reference final ActorSystemProvider actorSystemProvider,
+            @Reference(target = "(type=global-event-executor)") final EventExecutor eventExecutor,
+            @Reference(target = "(type=netconf-client-dispatcher)") final NetconfClientDispatcher clientDispatcher,
+            @Reference final DOMMountPointService mountPointService,
+            @Reference final AAAEncryptionService encryptionService,
+            @Reference final RpcProviderService rpcProviderService,
+            @Reference final DeviceActionFactory deviceActionFactory,
+            @Reference final SchemaResourceManager resourceManager,
+            @Reference final NetconfClientConfigurationBuilderFactory builderFactory,
+            final Configuration configuration) {
+        this(baseSchemas, dataBroker, clusterSingletonServiceProvider, keepaliveExecutor.getExecutor(),
+            processingExecutor.getExecutor(), actorSystemProvider.getActorSystem(), eventExecutor, clientDispatcher,
+            mountPointService, encryptionService, rpcProviderService, deviceActionFactory, resourceManager,
+            builderFactory, configuration.topology$_$id(),
+            Uint16.valueOf(configuration.write$_$transaction$_$idle$_$timeout()));
+    }
+
+    @Inject
+    public NetconfTopologyManager(final BaseNetconfSchemas baseSchemas, final DataBroker dataBroker,
+            final ClusterSingletonServiceProvider clusterSingletonServiceProvider,
+            final ScheduledThreadPool keepaliveExecutor, final ThreadPool processingExecutor,
+            final ActorSystemProvider actorSystemProvider, final EventExecutor eventExecutor,
+            final NetconfClientDispatcher clientDispatcher, final DOMMountPointService mountPointService,
+            final AAAEncryptionService encryptionService, final RpcProviderService rpcProviderService,
+            final DeviceActionFactory deviceActionFactory, final SchemaResourceManager resourceManager,
+            final NetconfClientConfigurationBuilderFactory builderFactory) {
+        this(baseSchemas, dataBroker, clusterSingletonServiceProvider, keepaliveExecutor.getExecutor(),
+            processingExecutor.getExecutor(), actorSystemProvider.getActorSystem(), eventExecutor, clientDispatcher,
+            mountPointService, encryptionService, rpcProviderService, deviceActionFactory, resourceManager,
+            builderFactory, NetconfNodeUtils.DEFAULT_TOPOLOGY_NAME, Uint16.ZERO);
+    }
 
+    @SuppressFBWarnings(value = "MC_OVERRIDABLE_METHOD_CALL_IN_CONSTRUCTOR",
+        justification = "Non-final for mocking, but we register for DTCL and that leaks 'this'")
     public NetconfTopologyManager(final BaseNetconfSchemas baseSchemas, final DataBroker dataBroker,
-                                  final ClusterSingletonServiceProvider clusterSingletonServiceProvider,
-                                  final ScheduledThreadPool keepaliveExecutor, final ThreadPool processingExecutor,
-                                  final ActorSystemProvider actorSystemProvider,
-                                  final EventExecutor eventExecutor, final NetconfClientDispatcher clientDispatcher,
-                                  final String topologyId, final Config config,
-                                  final DOMMountPointService mountPointService,
-                                  final AAAEncryptionService encryptionService,
-                                  final RpcProviderService rpcProviderService,
-                                  final DeviceActionFactory deviceActionFactory,
-                                  final SchemaResourceManager resourceManager,
-                                  final NetconfClientConfigurationBuilderFactory builderFactory) {
+            final ClusterSingletonServiceProvider clusterSingletonServiceProvider,
+            final ScheduledExecutorService keepaliveExecutor, final Executor processingExecutor,
+            final ActorSystem actorSystem, final EventExecutor eventExecutor,
+            final NetconfClientDispatcher clientDispatcher, final DOMMountPointService mountPointService,
+            final AAAEncryptionService encryptionService, final RpcProviderService rpcProviderService,
+            final DeviceActionFactory deviceActionFactory, final SchemaResourceManager resourceManager,
+            final NetconfClientConfigurationBuilderFactory builderFactory, final String topologyId,
+            final Uint16 writeTransactionIdleTimeout) {
         this.baseSchemas = requireNonNull(baseSchemas);
         this.dataBroker = requireNonNull(dataBroker);
         this.clusterSingletonServiceProvider = requireNonNull(clusterSingletonServiceProvider);
-        keepaliveExecutorService = keepaliveExecutor.getExecutor();
-        processingExecutorService = processingExecutor.getExecutor();
-        actorSystem = requireNonNull(actorSystemProvider).getActorSystem();
+        this.keepaliveExecutor = requireNonNull(keepaliveExecutor);
+        this.processingExecutor = requireNonNull(processingExecutor);
+        this.actorSystem = requireNonNull(actorSystem);
         this.eventExecutor = requireNonNull(eventExecutor);
         this.clientDispatcher = requireNonNull(clientDispatcher);
         this.topologyId = requireNonNull(topologyId);
-        writeTxIdleTimeout = Duration.ofSeconds(config.getWriteTransactionIdleTimeout().toJava());
+        writeTxIdleTimeout = Duration.ofSeconds(writeTransactionIdleTimeout.toJava());
         this.mountPointService = mountPointService;
         this.encryptionService = requireNonNull(encryptionService);
         this.rpcProviderService = requireNonNull(rpcProviderService);
         this.deviceActionFactory = requireNonNull(deviceActionFactory);
         this.resourceManager = requireNonNull(resourceManager);
         this.builderFactory = requireNonNull(builderFactory);
-    }
 
-    // Blueprint init method
-    public void init() {
         dataChangeListenerRegistration = registerDataTreeChangeListener();
         rpcReg = rpcProviderService.registerRpcImplementation(NetconfNodeTopologyService.class,
             new NetconfTopologyRPCProvider(dataBroker, encryptionService, topologyId));
@@ -219,6 +279,8 @@ public class NetconfTopologyManager implements ClusteredDataTreeChangeListener<N
             actorResponseWaitTime, serviceGroupIdent, setup);
     }
 
+    @PreDestroy
+    @Deactivate
     @Override
     public void close() {
         if (rpcReg != null) {
@@ -283,8 +345,8 @@ public class NetconfTopologyManager implements ClusteredDataTreeChangeListener<N
                 .setNode(node)
                 .setActorSystem(actorSystem)
                 .setEventExecutor(eventExecutor)
-                .setKeepaliveExecutor(keepaliveExecutorService)
-                .setProcessingExecutor(processingExecutorService)
+                .setKeepaliveExecutor(keepaliveExecutor)
+                .setProcessingExecutor(processingExecutor)
                 .setTopologyId(topologyId)
                 .setNetconfClientDispatcher(clientDispatcher)
                 .setSchemaResourceDTO(resourceManager.getSchemaResources(netconfNode.getSchemaCacheDirectory(),
diff --git a/apps/netconf-topology-singleton/src/main/resources/OSGI-INF/blueprint/netconf-topology-singleton.xml b/apps/netconf-topology-singleton/src/main/resources/OSGI-INF/blueprint/netconf-topology-singleton.xml
deleted file mode 100644 (file)
index 1b463d5..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- vi: set et smarttab sw=4 tabstop=4: -->
-<!--
-Copyright © 2016 Cisco Systems, Inc. and others. All rights reserved.
-
-This program and the accompanying materials are made available under the
-terms of the Eclipse Public License v1.0 which accompanies this distribution,
-and is available at http://www.eclipse.org/legal/epl-v10.html
--->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
-           xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0"
-           odl:use-default-for-reference-types="true">
-
-    <reference id="dataBroker"
-               interface="org.opendaylight.mdsal.binding.api.DataBroker"/>
-    <reference id="rpcProvider"
-               interface="org.opendaylight.mdsal.binding.api.RpcProviderService"/>
-    <reference id="clusterSingletonService"
-               interface="org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider"/>
-    <reference id="keepAliveExecutor"
-               interface="org.opendaylight.controller.config.threadpool.ScheduledThreadPool"
-               odl:type="global-netconf-ssh-scheduled-executor"/>
-    <reference id="processingExecutor"
-               interface="org.opendaylight.controller.config.threadpool.ThreadPool"
-               odl:type="global-netconf-processing-executor"/>
-    <reference id="actorSystemProvider"
-               interface="org.opendaylight.controller.cluster.ActorSystemProvider"/>
-    <reference id="eventExecutor"
-               interface="io.netty.util.concurrent.EventExecutor"
-               odl:type="global-event-executor"/>
-    <reference id="clientDispatcherDependency"
-               interface="org.opendaylight.netconf.client.NetconfClientDispatcher"
-               odl:type="netconf-client-dispatcher"/>
-    <reference id="mountPointService"
-               interface="org.opendaylight.mdsal.dom.api.DOMMountPointService"/>
-    <reference id="deviceActionFactory"
-               interface="org.opendaylight.netconf.client.mdsal.api.DeviceActionFactory"/>
-    <reference id="schemaManager"
-               interface="org.opendaylight.netconf.client.mdsal.api.SchemaResourceManager"/>
-    <reference id="baseSchemas"
-               interface="org.opendaylight.netconf.client.mdsal.api.BaseNetconfSchemas"/>
-    <reference id="builderFactory"
-               interface="org.opendaylight.netconf.topology.spi.NetconfClientConfigurationBuilderFactory"/>
-    <reference id="encryptionService"
-               interface="org.opendaylight.aaa.encrypt.AAAEncryptionService" />
-
-    <odl:clustered-app-config id="singletonConfig"
-        binding-class="org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.topology.singleton.config.rev170419.Config"/>
-
-    <bean id="netconfTopologyManager"
-          class="org.opendaylight.netconf.topology.singleton.impl.NetconfTopologyManager"
-          init-method="init" destroy-method="close">
-        <argument ref="baseSchemas"/>
-        <argument ref="dataBroker"/>
-        <argument ref="clusterSingletonService"/>
-        <argument ref="keepAliveExecutor"/>
-        <argument ref="processingExecutor"/>
-        <argument ref="actorSystemProvider"/>
-        <argument ref="eventExecutor"/>
-        <argument ref="clientDispatcherDependency"/>
-        <argument value="topology-netconf"/>
-        <argument ref="singletonConfig"/>
-        <argument ref="mountPointService"/>
-        <argument ref="encryptionService" />
-        <argument ref="rpcProvider" />
-        <argument ref="deviceActionFactory"/>
-        <argument ref="schemaManager"/>
-        <argument ref="builderFactory"/>
-    </bean>
-</blueprint>
diff --git a/apps/netconf-topology-singleton/src/main/yang/netconf-clustered-topology-config.yang b/apps/netconf-topology-singleton/src/main/yang/netconf-clustered-topology-config.yang
deleted file mode 100644 (file)
index b8cf643..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-module netconf-clustered-topology-config {
-    yang-version 1;
-    namespace "urn:opendaylight:netconf:topology:singleton:config";
-    prefix nctc;
-
-    description
-      "Configuration for Netconf Clustered Topology";
-
-    revision "2017-04-19" {
-        description
-            "Initial revision.";
-    }
-
-    container config {
-        leaf write-transaction-idle-timeout {
-            type uint16;
-            default 0;
-            description "Idle time in seconds after which write transaction is cancelled
-            automatically. If 0, automatic cancellation is turned off.";
-        }
-    }
-}
\ No newline at end of file
index ce90b82c2a8fd00c3d5f22fd2a682b77961ab313..0519f9b99a3fc5ee1b71968a92d75f2edde12701 100644 (file)
@@ -44,6 +44,7 @@ import java.util.Map.Entry;
 import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import org.apache.commons.io.FileUtils;
@@ -55,9 +56,6 @@ import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
 import org.opendaylight.aaa.encrypt.AAAEncryptionService;
-import org.opendaylight.controller.cluster.ActorSystemProvider;
-import org.opendaylight.controller.config.threadpool.ScheduledThreadPool;
-import org.opendaylight.controller.config.threadpool.ThreadPool;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.DataObjectModification;
 import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
@@ -111,6 +109,7 @@ import org.opendaylight.netconf.topology.singleton.impl.utils.NetconfTopologySet
 import org.opendaylight.netconf.topology.singleton.impl.utils.NetconfTopologyUtils;
 import org.opendaylight.netconf.topology.spi.DefaultNetconfClientConfigurationBuilderFactory;
 import org.opendaylight.netconf.topology.spi.NetconfClientConfigurationBuilderFactory;
+import org.opendaylight.netconf.topology.spi.NetconfNodeUtils;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Host;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
@@ -121,9 +120,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev230430.cr
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017.Keystore;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev221225.NetconfNode;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev221225.NetconfNodeBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev221225.network.topology.topology.topology.types.TopologyNetconf;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.topology.singleton.config.rev170419.Config;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.topology.singleton.config.rev170419.ConfigBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.test.list.rev140701.GetTopInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.test.list.rev140701.GetTopOutputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.test.list.rev140701.PutTopInputBuilder;
@@ -180,7 +176,7 @@ public class MountPointEndToEndTest extends AbstractBaseSchemasTest {
 
     private static final String TOP_MODULE_NAME = "opendaylight-mdsal-list-test";
     private static final String ACTOR_SYSTEM_NAME = "test";
-    private static final String TOPOLOGY_ID = TopologyNetconf.QNAME.getLocalName();
+    private static final String TOPOLOGY_ID = NetconfNodeUtils.DEFAULT_TOPOLOGY_NAME;
     private static final @NonNull KeyedInstanceIdentifier<Node, NodeKey> NODE_INSTANCE_ID =
         NetconfTopologyUtils.createTopologyNodeListPath(new NodeKey(new NodeId("node-id")), TOPOLOGY_ID);
 
@@ -190,13 +186,11 @@ public class MountPointEndToEndTest extends AbstractBaseSchemasTest {
     @Mock private RpcProviderService mockRpcProviderService;
     @Mock private NetconfClientDispatcher mockClientDispatcher;
     @Mock private AAAEncryptionService mockEncryptionService;
-    @Mock private ThreadPool mockThreadPool;
-    @Mock private ScheduledThreadPool mockKeepaliveExecutor;
+    @Mock private ScheduledExecutorService mockKeepaliveExecutor;
     @Mock private DeviceActionFactory deviceActionFactory;
     @Mock private CredentialProvider credentialProvider;
     @Mock private SslHandlerFactoryProvider sslHandlerFactoryProvider;
 
-    @Mock private ActorSystemProvider mockMasterActorSystemProvider;
     @Mock private DOMMountPointListener masterMountPointListener;
     private final DOMMountPointService masterMountPointService = new DOMMountPointServiceImpl();
     private Rpcs.Normalized deviceRpcService;
@@ -209,7 +203,6 @@ public class MountPointEndToEndTest extends AbstractBaseSchemasTest {
 
     private volatile SettableFuture<MasterSalFacade> masterSalFacadeFuture = SettableFuture.create();
 
-    @Mock private ActorSystemProvider mockSlaveActorSystemProvider;
     @Mock private ClusterSingletonServiceProvider mockSlaveClusterSingletonServiceProvider;
     @Mock private ClusterSingletonServiceRegistration mockSlaveClusterSingletonServiceReg;
     @Mock private DOMMountPointListener slaveMountPointListener;
@@ -222,7 +215,6 @@ public class MountPointEndToEndTest extends AbstractBaseSchemasTest {
 
     private NetconfClientConfigurationBuilderFactory builderFactory;
     private final EventExecutor eventExecutor = GlobalEventExecutor.INSTANCE;
-    private final Config config = new ConfigBuilder().setWriteTransactionIdleTimeout(Uint16.ZERO).build();
     private EffectiveModelContext deviceSchemaContext;
     private YangModuleInfo topModuleInfo;
     private QName putTopRpcSchemaPath;
@@ -302,10 +294,6 @@ public class MountPointEndToEndTest extends AbstractBaseSchemasTest {
         masterClusterSingletonServiceProvider = new DOMClusterSingletonServiceProviderImpl();
         masterClusterSingletonServiceProvider.initializeProvider();
 
-        doReturn(masterSystem).when(mockMasterActorSystemProvider).getActorSystem();
-
-        doReturn(MoreExecutors.newDirectExecutorService()).when(mockThreadPool).getExecutor();
-
         final var resources =  resourceManager.getSchemaResources(TEST_DEFAULT_SUBDIR, "test");
         resources.getSchemaRegistry().registerSchemaSource(
             id -> Futures.immediateFuture(YangTextSchemaSource.delegateForCharSource(id,
@@ -315,10 +303,10 @@ public class MountPointEndToEndTest extends AbstractBaseSchemasTest {
                 YangTextSchemaSource.class, 1));
 
         masterNetconfTopologyManager = new NetconfTopologyManager(BASE_SCHEMAS, masterDataBroker,
-                masterClusterSingletonServiceProvider, mockKeepaliveExecutor, mockThreadPool,
-                mockMasterActorSystemProvider, eventExecutor, mockClientDispatcher, TOPOLOGY_ID, config,
-                masterMountPointService, mockEncryptionService, mockRpcProviderService, deviceActionFactory,
-                resourceManager, builderFactory) {
+                masterClusterSingletonServiceProvider, mockKeepaliveExecutor, MoreExecutors.directExecutor(),
+                masterSystem, eventExecutor, mockClientDispatcher, masterMountPointService,
+                mockEncryptionService, mockRpcProviderService, deviceActionFactory, resourceManager, builderFactory,
+                TOPOLOGY_ID, Uint16.ZERO) {
             @Override
             protected NetconfTopologyContext newNetconfTopologyContext(final NetconfTopologySetup setup,
                     final ServiceGroupIdentifier serviceGroupIdent, final Timeout actorResponseWaitTime,
@@ -339,8 +327,6 @@ public class MountPointEndToEndTest extends AbstractBaseSchemasTest {
             }
         };
 
-        masterNetconfTopologyManager.init();
-
         verifyTopologyNodesCreated(masterDataBroker);
     }
 
@@ -350,16 +336,14 @@ public class MountPointEndToEndTest extends AbstractBaseSchemasTest {
 
         slaveSystem = ActorSystem.create(ACTOR_SYSTEM_NAME, ConfigFactory.load().getConfig("Slave"));
 
-        doReturn(slaveSystem).when(mockSlaveActorSystemProvider).getActorSystem();
-
         doReturn(mockSlaveClusterSingletonServiceReg).when(mockSlaveClusterSingletonServiceProvider)
                 .registerClusterSingletonService(any());
 
         slaveNetconfTopologyManager = new NetconfTopologyManager(BASE_SCHEMAS, slaveDataBroker,
-                mockSlaveClusterSingletonServiceProvider, mockKeepaliveExecutor, mockThreadPool,
-                mockSlaveActorSystemProvider, eventExecutor, mockClientDispatcher, TOPOLOGY_ID, config,
-                slaveMountPointService, mockEncryptionService, mockRpcProviderService, deviceActionFactory,
-                resourceManager, builderFactory) {
+                mockSlaveClusterSingletonServiceProvider, mockKeepaliveExecutor, MoreExecutors.directExecutor(),
+                slaveSystem, eventExecutor, mockClientDispatcher, slaveMountPointService,
+                mockEncryptionService, mockRpcProviderService, deviceActionFactory, resourceManager, builderFactory,
+                TOPOLOGY_ID, Uint16.ZERO) {
             @Override
             protected NetconfTopologyContext newNetconfTopologyContext(final NetconfTopologySetup setup,
                 final ServiceGroupIdentifier serviceGroupIdent, final Timeout actorResponseWaitTime,
@@ -372,8 +356,6 @@ public class MountPointEndToEndTest extends AbstractBaseSchemasTest {
             }
         };
 
-        slaveNetconfTopologyManager.init();
-
         verifyTopologyNodesCreated(slaveDataBroker);
 
         slaveTxChain = slaveDataBroker.createTransactionChain(new TransactionChainListener() {
index 68f2d7c01fccf46b0e088a85dac8a6eced468861..62e26a52011ef795246694189f0733a6e63eb22d 100644 (file)
@@ -23,14 +23,16 @@ import static org.opendaylight.mdsal.binding.api.DataObjectModification.Modifica
 import static org.opendaylight.mdsal.binding.api.DataObjectModification.ModificationType.SUBTREE_MODIFIED;
 import static org.opendaylight.mdsal.binding.api.DataObjectModification.ModificationType.WRITE;
 
+import akka.actor.ActorSystem;
 import akka.util.Timeout;
 import io.netty.util.concurrent.EventExecutor;
-import java.util.Arrays;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.ExecutorService;
+import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Function;
 import org.junit.Before;
@@ -40,9 +42,6 @@ import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
 import org.opendaylight.aaa.encrypt.AAAEncryptionService;
-import org.opendaylight.controller.cluster.ActorSystemProvider;
-import org.opendaylight.controller.config.threadpool.ScheduledThreadPool;
-import org.opendaylight.controller.config.threadpool.ThreadPool;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.DataObjectModification;
 import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
@@ -68,8 +67,6 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev221225.NetconfNode;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev221225.NetconfNodeBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.topology.singleton.config.rev170419.Config;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.topology.singleton.config.rev170419.ConfigBuilder;
 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.network.topology.topology.Node;
@@ -111,11 +108,9 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest {
         dataBrokerTest.setup();
         dataBroker = spy(dataBrokerTest.getDataBroker());
 
-        final ScheduledThreadPool keepaliveExecutor = mock(ScheduledThreadPool.class);
-        final ThreadPool processingThreadPool = mock(ThreadPool.class);
+        final ScheduledExecutorService keepaliveExecutor = mock(ScheduledExecutorService.class);
         final ExecutorService processingService = mock(ExecutorService.class);
-        doReturn(processingService).when(processingThreadPool).getExecutor();
-        final ActorSystemProvider actorSystemProvider = mock(ActorSystemProvider.class);
+        final ActorSystem actorSystem = mock(ActorSystem.class);
         final EventExecutor eventExecutor = mock(EventExecutor.class);
         final NetconfClientDispatcher clientDispatcher = mock(NetconfClientDispatcher.class);
         final DOMMountPointService mountPointService = mock(DOMMountPointService.class);
@@ -125,11 +120,14 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest {
         final NetconfClientConfigurationBuilderFactory builderFactory =
             mock(NetconfClientConfigurationBuilderFactory.class);
 
-        final Config config = new ConfigBuilder().setWriteTransactionIdleTimeout(Uint16.ZERO).build();
+        doNothing().when(mockListenerReg).close();
+        doReturn(mockListenerReg).when(dataBroker).registerDataTreeChangeListener(any(), any());
+
         netconfTopologyManager = new NetconfTopologyManager(BASE_SCHEMAS, dataBroker, clusterSingletonServiceProvider,
-                keepaliveExecutor, processingThreadPool, actorSystemProvider, eventExecutor, clientDispatcher,
-                TOPOLOGY_ID, config, mountPointService, encryptionService, rpcProviderService, deviceActionFactory,
-                new DefaultSchemaResourceManager(new DefaultYangParserFactory()), builderFactory) {
+                keepaliveExecutor, processingService, actorSystem, eventExecutor, clientDispatcher,
+                mountPointService, encryptionService, rpcProviderService, deviceActionFactory,
+                new DefaultSchemaResourceManager(new DefaultYangParserFactory()), builderFactory,
+                TOPOLOGY_ID, Uint16.ZERO) {
             @Override
             protected NetconfTopologyContext newNetconfTopologyContext(final NetconfTopologySetup setup,
                 final ServiceGroupIdentifier serviceGroupIdent, final Timeout actorResponseWaitTime,
@@ -139,16 +137,10 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest {
                         "No mock context for " + setup.getInstanceIdentifier()).apply(setup);
             }
         };
-
-        doNothing().when(mockListenerReg).close();
-        doReturn(mockListenerReg).when(dataBroker).registerDataTreeChangeListener(any(), any());
     }
 
     @Test
     public void testRegisterDataTreeChangeListener() throws Exception {
-
-        netconfTopologyManager.init();
-
         await().atMost(5, TimeUnit.SECONDS).until(() -> {
             try (ReadTransaction readTx = dataBroker.newReadOnlyTransaction()) {
                 return readTx.exists(LogicalDatastoreType.OPERATIONAL,
@@ -229,7 +221,7 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest {
         doReturn(mockClusterRegistration2).when(clusterSingletonServiceProvider)
                 .registerClusterSingletonService(mockContext2);
 
-        netconfTopologyManager.onDataTreeChanged(Arrays.asList(
+        netconfTopologyManager.onDataTreeChanged(List.of(
                 new CustomTreeModification(DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION,
                         nodeInstanceId1), dataObjectModification1),
                 new CustomTreeModification(DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION,
@@ -254,7 +246,7 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest {
         doNothing().when(mockContext1).refresh(any());
         doNothing().when(mockContext2).refresh(any());
 
-        netconfTopologyManager.onDataTreeChanged(Arrays.asList(
+        netconfTopologyManager.onDataTreeChanged(List.of(
                 new CustomTreeModification(DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION,
                         nodeInstanceId1), dataObjectModification1),
                 new CustomTreeModification(DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION,
@@ -271,7 +263,7 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest {
         // Notify of Node 1 deleted.
         doReturn(DELETE).when(dataObjectModification1).getModificationType();
 
-        netconfTopologyManager.onDataTreeChanged(Arrays.asList(
+        netconfTopologyManager.onDataTreeChanged(List.of(
                 new CustomTreeModification(DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION,
                         nodeInstanceId1), dataObjectModification1)));
 
@@ -298,7 +290,7 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest {
             return newMockContext1;
         });
 
-        netconfTopologyManager.onDataTreeChanged(Arrays.asList(
+        netconfTopologyManager.onDataTreeChanged(List.of(
                 new CustomTreeModification(DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION,
                         nodeInstanceId1), dataObjectModification1)));
 
@@ -347,9 +339,7 @@ public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest {
         doThrow(new RuntimeException("mock error")).when(clusterSingletonServiceProvider)
                 .registerClusterSingletonService(mockContext);
 
-        netconfTopologyManager.init();
-
-        netconfTopologyManager.onDataTreeChanged(Arrays.asList(
+        netconfTopologyManager.onDataTreeChanged(List.of(
                 new CustomTreeModification(DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION,
                         nodeInstanceId), dataObjectModification)));