Use base64 encoding for netconf device passwords
[netconf.git] / apps / netconf-topology-impl / src / test / java / org / opendaylight / netconf / topology / impl / NetconfTopologyImplTest.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
3  *
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
7  */
8 package org.opendaylight.netconf.topology.impl;
9
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;
14
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.rev231121.credentials.credentials.LoginPwUnencryptedBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev231121.credentials.credentials.login.pw.unencrypted.LoginPasswordUnencryptedBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev231121.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;
59
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();
65
66     @Mock
67     private NetconfClientFactory mockedClientFactory;
68     @Mock
69     private Timer mockedTimer;
70     @Mock
71     private SchemaResourceManager mockedResourceManager;
72     @Mock
73     private DataBroker dataBroker;
74     @Mock
75     private DOMMountPointService mountPointService;
76     @Mock
77     private AAAEncryptionService encryptionService;
78     @Mock
79     private RpcProviderService rpcProviderService;
80     @Mock
81     private NetconfClientConfigurationBuilderFactory builderFactory;
82     @Mock
83     private WriteTransaction wtx;
84     @Mock
85     private DataObjectModification<Node> objMod;
86     @Mock
87     private DataTreeModification<Node> treeMod;
88
89     private TestingNetconfTopologyImpl topology;
90     private TestingNetconfTopologyImpl spyTopology;
91
92     @Test
93     void testOnDataTreeChange() throws Exception {
94         doReturn(wtx).when(dataBroker).newWriteOnlyTransaction();
95         doReturn(CommitInfo.emptyFluentFuture()).when(wtx).commit();
96
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());
104
105         spyTopology = spy(topology);
106
107         final var key = new NodeKey(new NodeId("testing-node"));
108         final var node = new NodeBuilder()
109             .withKey(key)
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))
118                 .setTcpOnly(true)
119                 .setCredentials(new LoginPwUnencryptedBuilder()
120                     .setLoginPasswordUnencrypted(new LoginPasswordUnencryptedBuilder()
121                         .setUsername("testuser")
122                         .setPassword("testpassword")
123                         .build())
124                     .build())
125                 .build())
126             .build();
127
128         doReturn(DataObjectModification.ModificationType.WRITE).when(objMod).getModificationType();
129         doReturn(node).when(objMod).getDataAfter();
130
131         doReturn(DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION, TOPOLOGY_PATH.child(Node.class, key)))
132             .when(treeMod).getRootPath();
133         final var changes = List.of(treeMod);
134
135         doReturn(objMod).when(treeMod).getRootNode();
136         spyTopology.onDataTreeChanged(changes);
137         verify(spyTopology).ensureNode(node);
138
139         doReturn(DataObjectModification.ModificationType.DELETE).when(objMod).getModificationType();
140         spyTopology.onDataTreeChanged(changes);
141         verify(spyTopology).deleteNode(key.getNodeId());
142
143         doReturn(DataObjectModification.ModificationType.SUBTREE_MODIFIED).when(objMod).getModificationType();
144         spyTopology.onDataTreeChanged(changes);
145
146         // one in previous creating and deleting node and one in updating
147         verify(spyTopology, times(2)).ensureNode(node);
148     }
149
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);
159         }
160
161         @Override
162         public void ensureNode(final Node configNode) {
163             // No-op
164         }
165
166         @Override
167         public void deleteNode(final NodeId nodeId) {
168             // No-op
169         }
170     }
171 }