<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>
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;
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;
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;
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<>();
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;
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));
actorResponseWaitTime, serviceGroupIdent, setup);
}
+ @PreDestroy
+ @Deactivate
@Override
public void close() {
if (rpcReg != null) {
.setNode(node)
.setActorSystem(actorSystem)
.setEventExecutor(eventExecutor)
- .setKeepaliveExecutor(keepaliveExecutorService)
- .setProcessingExecutor(processingExecutorService)
+ .setKeepaliveExecutor(keepaliveExecutor)
+ .setProcessingExecutor(processingExecutor)
.setTopologyId(topologyId)
.setNetconfClientDispatcher(clientDispatcher)
.setSchemaResourceDTO(resourceManager.getSchemaResources(netconfNode.getSchemaCacheDirectory(),
+++ /dev/null
-<?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>
+++ /dev/null
-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
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;
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;
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;
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;
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);
@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;
private volatile SettableFuture<MasterSalFacade> masterSalFacadeFuture = SettableFuture.create();
- @Mock private ActorSystemProvider mockSlaveActorSystemProvider;
@Mock private ClusterSingletonServiceProvider mockSlaveClusterSingletonServiceProvider;
@Mock private ClusterSingletonServiceRegistration mockSlaveClusterSingletonServiceReg;
@Mock private DOMMountPointListener slaveMountPointListener;
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;
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,
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,
}
};
- masterNetconfTopologyManager.init();
-
verifyTopologyNodesCreated(masterDataBroker);
}
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,
}
};
- slaveNetconfTopologyManager.init();
-
verifyTopologyNodesCreated(slaveDataBroker);
slaveTxChain = slaveDataBroker.createTransactionChain(new TransactionChainListener() {
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;
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;
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;
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);
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,
"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,
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,
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,
// 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)));
return newMockContext1;
});
- netconfTopologyManager.onDataTreeChanged(Arrays.asList(
+ netconfTopologyManager.onDataTreeChanged(List.of(
new CustomTreeModification(DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION,
nodeInstanceId1), dataObjectModification1)));
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)));