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.TimeUnit;
import java.util.function.Function;
+import org.junit.After;
import org.junit.Before;
import org.junit.Test;
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;
import org.opendaylight.mdsal.binding.api.ReadTransaction;
import org.opendaylight.mdsal.binding.api.RpcProviderService;
import org.opendaylight.mdsal.binding.dom.adapter.test.AbstractDataBrokerTest;
-import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections;
+import org.opendaylight.mdsal.binding.runtime.spi.BindingRuntimeHelpers;
import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
-import org.opendaylight.mdsal.dom.api.DOMActionProviderService;
import org.opendaylight.mdsal.dom.api.DOMMountPointService;
-import org.opendaylight.mdsal.dom.api.DOMRpcProviderService;
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.netconf.client.NetconfClientDispatcher;
-import org.opendaylight.netconf.client.mdsal.api.CredentialProvider;
+import org.opendaylight.netconf.client.NetconfClientFactory;
import org.opendaylight.netconf.client.mdsal.api.DeviceActionFactory;
-import org.opendaylight.netconf.client.mdsal.api.KeyStoreProvider;
import org.opendaylight.netconf.client.mdsal.impl.DefaultSchemaResourceManager;
+import org.opendaylight.netconf.common.NetconfTimer;
import org.opendaylight.netconf.topology.singleton.impl.utils.NetconfTopologySetup;
import org.opendaylight.netconf.topology.singleton.impl.utils.NetconfTopologyUtils;
+import org.opendaylight.netconf.topology.spi.NetconfClientConfigurationBuilderFactory;
+import org.opendaylight.netconf.topology.spi.NetconfTopologySchemaAssembler;
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.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.opendaylight.netconf.node.topology.rev231121.NetconfNode;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev231121.NetconfNodeBuilder;
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;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.concepts.Registration;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
import org.opendaylight.yangtools.yang.common.Uint16;
@RunWith(MockitoJUnitRunner.StrictStubs.class)
public class NetconfTopologyManagerTest extends AbstractBaseSchemasTest {
- private static final Uint16 ACTOR_RESPONSE_WAIT_TIME = Uint16.valueOf(10);
+ private static final Uint16 ACTOR_RESPONSE_WAIT_TIME = Uint16.TEN;
private static final String TOPOLOGY_ID = "topologyID";
private NetconfTopologyManager netconfTopologyManager;
@Mock
private ClusterSingletonServiceProvider clusterSingletonServiceProvider;
-
@Mock
private ListenerRegistration<?> mockListenerReg;
+ @Mock
+ private Registration mockRpcReg;
+ @Mock
+ private NetconfTimer timer;
+ @Mock
+ private ExecutorService processingService;
+ @Mock
+ private ActorSystem actorSystem;
+ @Mock
+ private NetconfClientFactory clientFactory;
+ @Mock
+ private DOMMountPointService mountPointService;
+ @Mock
+ private AAAEncryptionService encryptionService;
+ @Mock
+ private DeviceActionFactory actionFactory;
+ @Mock
+ private RpcProviderService rpcProviderService;
+ @Mock
+ private NetconfClientConfigurationBuilderFactory builderFactory;
+ private NetconfTopologySchemaAssembler schemaAssembler;
private DataBroker dataBroker;
private final Map<InstanceIdentifier<Node>, Function<NetconfTopologySetup, NetconfTopologyContext>>
@Before
public void setUp() throws Exception {
+ schemaAssembler = new NetconfTopologySchemaAssembler(1, 1, 0, TimeUnit.SECONDS);
+
AbstractDataBrokerTest dataBrokerTest = new AbstractDataBrokerTest() {
@Override
protected Set<YangModuleInfo> getModuleInfos() throws Exception {
- return Set.of(BindingReflections.getModuleInfo(NetworkTopology.class));
+ return Set.of(BindingRuntimeHelpers.getYangModuleInfo(NetworkTopology.class));
}
};
dataBrokerTest.setup();
dataBroker = spy(dataBrokerTest.getDataBroker());
- final DOMRpcProviderService rpcProviderRegistry = mock(DOMRpcProviderService.class);
- final ScheduledThreadPool keepaliveExecutor = mock(ScheduledThreadPool.class);
- final DOMActionProviderService actionProviderRegistry = mock(DOMActionProviderService.class);
- final ThreadPool processingThreadPool = mock(ThreadPool.class);
- final ExecutorService processingService = mock(ExecutorService.class);
- doReturn(processingService).when(processingThreadPool).getExecutor();
- final ActorSystemProvider actorSystemProvider = mock(ActorSystemProvider.class);
- final EventExecutor eventExecutor = mock(EventExecutor.class);
- final NetconfClientDispatcher clientDispatcher = mock(NetconfClientDispatcher.class);
- final DOMMountPointService mountPointService = mock(DOMMountPointService.class);
- final AAAEncryptionService encryptionService = mock(AAAEncryptionService.class);
- final DeviceActionFactory deviceActionFactory = mock(DeviceActionFactory.class);
- final RpcProviderService rpcProviderService = mock(RpcProviderService.class);
- final CredentialProvider credentialProvider = mock(CredentialProvider.class);
- final KeyStoreProvider keyStoreProvider = mock(KeyStoreProvider.class);
-
- final Config config = new ConfigBuilder().setWriteTransactionIdleTimeout(Uint16.ZERO).build();
- netconfTopologyManager = new NetconfTopologyManager(BASE_SCHEMAS, dataBroker, rpcProviderRegistry,
- actionProviderRegistry, clusterSingletonServiceProvider, keepaliveExecutor, processingThreadPool,
- actorSystemProvider, eventExecutor, clientDispatcher, TOPOLOGY_ID, config,
- mountPointService, encryptionService, rpcProviderService, deviceActionFactory,
- new DefaultSchemaResourceManager(new DefaultYangParserFactory()), credentialProvider,
- keyStoreProvider) {
+ doNothing().when(mockListenerReg).close();
+ doReturn(mockListenerReg).when(dataBroker).registerDataTreeChangeListener(any(), any());
+ doReturn(mockRpcReg).when(rpcProviderService).registerRpcImplementations(any());
+
+ netconfTopologyManager = new NetconfTopologyManager(BASE_SCHEMAS, dataBroker, clusterSingletonServiceProvider,
+ timer, schemaAssembler, actorSystem, clientFactory, mountPointService, encryptionService,
+ rpcProviderService, actionFactory, 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());
+ @After
+ public void after() {
+ schemaAssembler.close();
}
@Test
public void testRegisterDataTreeChangeListener() throws Exception {
-
- netconfTopologyManager.init();
-
await().atMost(5, TimeUnit.SECONDS).until(() -> {
try (ReadTransaction readTx = dataBroker.newReadOnlyTransaction()) {
return readTx.exists(LogicalDatastoreType.OPERATIONAL,
@SuppressWarnings("unchecked")
@Test
- public void testOnDataTreeChanged() throws Exception {
-
+ public void testOnDataTreeChanged() {
// Notify of 2 created Node objects.
-
final NodeId nodeId1 = new NodeId("node-id-1");
final InstanceIdentifier<Node> nodeInstanceId1 = NetconfTopologyUtils.createTopologyNodeListPath(
new NodeKey(nodeId1), TOPOLOGY_ID);
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,
verify(clusterSingletonServiceProvider).registerClusterSingletonService(mockContext2);
// Notify of Node 1 replaced and Node 2 subtree modified.
-
mockContextMap.clear();
final NetconfNode updatedNetconfNode1 = new NetconfNodeBuilder(netconfNode1)
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,
verifyNoMoreInteractions(clusterSingletonServiceProvider);
// 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)));
verifyNoMoreInteractions(clusterSingletonServiceProvider, mockClusterRegistration2, mockContext2);
// Notify of Node 1 created again.
-
reset(clusterSingletonServiceProvider);
final NetconfTopologyContext newMockContext1 = mock(NetconfTopologyContext.class);
return newMockContext1;
});
- netconfTopologyManager.onDataTreeChanged(Arrays.asList(
+ netconfTopologyManager.onDataTreeChanged(List.of(
new CustomTreeModification(DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION,
nodeInstanceId1), dataObjectModification1)));
verify(clusterSingletonServiceProvider, times(2)).registerClusterSingletonService(newMockContext1);
-
verifyNoMoreInteractions(mockClusterRegistration1, mockContext1, mockClusterRegistration2, mockContext2,
newMockContext1, newMockClusterRegistration1, clusterSingletonServiceProvider);
// Test close.
-
netconfTopologyManager.close();
verify(newMockClusterRegistration1).close();
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)));