2 * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.netconf.topology.impl;
10 import static org.mockito.Mockito.doReturn;
11 import static org.mockito.Mockito.spy;
12 import static org.mockito.Mockito.times;
13 import static org.mockito.Mockito.verify;
15 import com.google.common.util.concurrent.MoreExecutors;
16 import io.netty.util.Timer;
17 import java.util.List;
18 import java.util.concurrent.Executor;
19 import org.junit.jupiter.api.Test;
20 import org.junit.jupiter.api.extension.ExtendWith;
21 import org.mockito.Mock;
22 import org.mockito.junit.jupiter.MockitoExtension;
23 import org.opendaylight.aaa.encrypt.AAAEncryptionService;
24 import org.opendaylight.mdsal.binding.api.DataBroker;
25 import org.opendaylight.mdsal.binding.api.DataObjectModification;
26 import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
27 import org.opendaylight.mdsal.binding.api.DataTreeModification;
28 import org.opendaylight.mdsal.binding.api.RpcProviderService;
29 import org.opendaylight.mdsal.binding.api.WriteTransaction;
30 import org.opendaylight.mdsal.common.api.CommitInfo;
31 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
32 import org.opendaylight.mdsal.dom.api.DOMMountPointService;
33 import org.opendaylight.netconf.client.NetconfClientFactory;
34 import org.opendaylight.netconf.client.mdsal.api.BaseNetconfSchemas;
35 import org.opendaylight.netconf.client.mdsal.api.SchemaResourceManager;
36 import org.opendaylight.netconf.client.mdsal.impl.DefaultBaseNetconfSchemas;
37 import org.opendaylight.netconf.topology.spi.NetconfClientConfigurationBuilderFactory;
38 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Host;
39 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
40 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
41 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev231025.credentials.credentials.LoginPwUnencryptedBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev231025.credentials.credentials.login.pw.unencrypted.LoginPasswordUnencryptedBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev221225.NetconfNodeBuilder;
45 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
46 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
47 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
48 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
49 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyBuilder;
50 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
51 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
52 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder;
53 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
54 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
55 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
56 import org.opendaylight.yangtools.yang.common.Uint16;
57 import org.opendaylight.yangtools.yang.common.Uint32;
58 import org.opendaylight.yangtools.yang.parser.impl.DefaultYangParserFactory;
60 @ExtendWith(MockitoExtension.class)
61 class NetconfTopologyImplTest {
62 private static final TopologyKey TOPOLOGY_KEY = new TopologyKey(new TopologyId("testing-topology"));
63 private static final KeyedInstanceIdentifier<Topology, TopologyKey> TOPOLOGY_PATH =
64 InstanceIdentifier.builder(NetworkTopology.class).child(Topology.class, TOPOLOGY_KEY).build();
67 private NetconfClientFactory mockedClientFactory;
69 private Timer mockedTimer;
71 private SchemaResourceManager mockedResourceManager;
73 private DataBroker dataBroker;
75 private DOMMountPointService mountPointService;
77 private AAAEncryptionService encryptionService;
79 private RpcProviderService rpcProviderService;
81 private NetconfClientConfigurationBuilderFactory builderFactory;
83 private WriteTransaction wtx;
85 private DataObjectModification<Node> objMod;
87 private DataTreeModification<Node> treeMod;
89 private TestingNetconfTopologyImpl topology;
90 private TestingNetconfTopologyImpl spyTopology;
93 void testOnDataTreeChange() throws Exception {
94 doReturn(wtx).when(dataBroker).newWriteOnlyTransaction();
95 doReturn(CommitInfo.emptyFluentFuture()).when(wtx).commit();
97 topology = new TestingNetconfTopologyImpl(TOPOLOGY_KEY.getTopologyId().getValue(), mockedClientFactory,
98 mockedTimer, MoreExecutors.directExecutor(), mockedResourceManager, dataBroker, mountPointService,
99 encryptionService, builderFactory, rpcProviderService,
100 new DefaultBaseNetconfSchemas(new DefaultYangParserFactory()));
101 //verify initialization of topology
102 verify(wtx).merge(LogicalDatastoreType.OPERATIONAL, TOPOLOGY_PATH,
103 new TopologyBuilder().withKey(TOPOLOGY_KEY).build());
105 spyTopology = spy(topology);
107 final var key = new NodeKey(new NodeId("testing-node"));
108 final var node = new NodeBuilder()
110 .addAugmentation(new NetconfNodeBuilder()
111 .setLockDatastore(true)
112 .setHost(new Host(new IpAddress(new Ipv4Address("127.0.0.1"))))
113 .setPort(new PortNumber(Uint16.valueOf(9999)))
114 .setReconnectOnChangedSchema(true)
115 .setDefaultRequestTimeoutMillis(Uint32.valueOf(1000))
116 .setBetweenAttemptsTimeoutMillis(Uint16.valueOf(100))
117 .setKeepaliveDelay(Uint32.valueOf(1000))
119 .setCredentials(new LoginPwUnencryptedBuilder()
120 .setLoginPasswordUnencrypted(new LoginPasswordUnencryptedBuilder()
121 .setUsername("testuser")
122 .setPassword("testpassword")
128 doReturn(DataObjectModification.ModificationType.WRITE).when(objMod).getModificationType();
129 doReturn(node).when(objMod).getDataAfter();
131 doReturn(DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION, TOPOLOGY_PATH.child(Node.class, key)))
132 .when(treeMod).getRootPath();
133 final var changes = List.of(treeMod);
135 doReturn(objMod).when(treeMod).getRootNode();
136 spyTopology.onDataTreeChanged(changes);
137 verify(spyTopology).ensureNode(node);
139 doReturn(DataObjectModification.ModificationType.DELETE).when(objMod).getModificationType();
140 spyTopology.onDataTreeChanged(changes);
141 verify(spyTopology).deleteNode(key.getNodeId());
143 doReturn(DataObjectModification.ModificationType.SUBTREE_MODIFIED).when(objMod).getModificationType();
144 spyTopology.onDataTreeChanged(changes);
146 // one in previous creating and deleting node and one in updating
147 verify(spyTopology, times(2)).ensureNode(node);
150 private static class TestingNetconfTopologyImpl extends NetconfTopologyImpl {
151 TestingNetconfTopologyImpl(final String topologyId, final NetconfClientFactory clientFactory, final Timer timer,
152 final Executor processingExecutor, final SchemaResourceManager schemaRepositoryProvider,
153 final DataBroker dataBroker, final DOMMountPointService mountPointService,
154 final AAAEncryptionService encryptionService,
155 final NetconfClientConfigurationBuilderFactory builderFactory,
156 final RpcProviderService rpcProviderService, final BaseNetconfSchemas baseSchemas) {
157 super(topologyId, clientFactory, timer, processingExecutor, schemaRepositoryProvider,
158 dataBroker, mountPointService, encryptionService, builderFactory, rpcProviderService, baseSchemas);
162 public void ensureNode(final Node configNode) {
167 public void deleteNode(final NodeId nodeId) {