BUG 8839: Revert "Make netconf utilize encrypted passwords only"
[netconf.git] / netconf / netconf-topology / 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
9 package org.opendaylight.netconf.topology.impl;
10
11 import static org.mockito.Matchers.any;
12 import static org.mockito.Mockito.doNothing;
13 import static org.mockito.Mockito.mock;
14 import static org.mockito.Mockito.spy;
15 import static org.mockito.Mockito.times;
16 import static org.mockito.Mockito.verify;
17 import static org.mockito.Mockito.when;
18
19 import com.google.common.collect.Sets;
20 import com.google.common.util.concurrent.Futures;
21 import com.google.common.util.concurrent.ListenableFuture;
22 import com.google.common.util.concurrent.MoreExecutors;
23 import io.netty.util.concurrent.EventExecutor;
24 import io.netty.util.concurrent.Future;
25 import io.netty.util.concurrent.ImmediateEventExecutor;
26 import io.netty.util.concurrent.SucceededFuture;
27 import java.util.Collection;
28 import org.junit.Before;
29 import org.junit.Test;
30 import org.mockito.Mock;
31 import org.mockito.MockitoAnnotations;
32 import org.opendaylight.controller.config.threadpool.ScheduledThreadPool;
33 import org.opendaylight.controller.config.threadpool.ThreadPool;
34 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
35 import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
36 import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
37 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
38 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
39 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
40 import org.opendaylight.controller.md.sal.dom.api.DOMMountPointService;
41 import org.opendaylight.netconf.client.NetconfClientDispatcher;
42 import org.opendaylight.netconf.client.conf.NetconfReconnectingClientConfiguration;
43 import org.opendaylight.netconf.sal.connect.netconf.listener.NetconfDeviceCapabilities;
44 import org.opendaylight.netconf.topology.api.SchemaRepositoryProvider;
45 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Host;
46 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
47 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
48 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.credentials.credentials.LoginPasswordBuilder;
52 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
53 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopologyBuilder;
54 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
55 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
56 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
57 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyBuilder;
58 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
59 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
60 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder;
61 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
62 import org.opendaylight.yangtools.yang.binding.DataObject;
63 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
64 import org.opendaylight.yangtools.yang.parser.repo.SharedSchemaRepository;
65
66 public class NetconfTopologyImplTest {
67
68     private static final NodeId NODE_ID = new NodeId("testing-node");
69     private static final String TOPOLOGY_ID = "testing-topology";
70
71     @Mock
72     private NetconfClientDispatcher mockedClientDispatcher;
73
74     @Mock
75     private EventExecutor mockedEventExecutor;
76
77     @Mock
78     private ScheduledThreadPool mockedKeepaliveExecutor;
79
80     @Mock
81     private ThreadPool mockedProcessingExecutor;
82
83     @Mock
84     private SchemaRepositoryProvider mockedSchemaRepositoryProvider;
85
86     @Mock
87     private DataBroker dataBroker;
88
89     @Mock
90     private DOMMountPointService mountPointService;
91
92     private TestingNetconfTopologyImpl topology;
93     private TestingNetconfTopologyImpl spyTopology;
94
95     @Before
96     public void setUp() {
97         MockitoAnnotations.initMocks(this);
98
99         when(mockedSchemaRepositoryProvider.getSharedSchemaRepository()).thenReturn(new SharedSchemaRepository("testingSharedSchemaRepo"));
100         when(mockedProcessingExecutor.getExecutor()).thenReturn(MoreExecutors.newDirectExecutorService());
101         final Future future = new SucceededFuture(ImmediateEventExecutor.INSTANCE, new NetconfDeviceCapabilities());
102         when(mockedClientDispatcher.createReconnectingClient(any(NetconfReconnectingClientConfiguration.class))).thenReturn(future);
103
104         topology = new TestingNetconfTopologyImpl(TOPOLOGY_ID, mockedClientDispatcher,
105                 mockedEventExecutor, mockedKeepaliveExecutor, mockedProcessingExecutor, mockedSchemaRepositoryProvider,
106                 dataBroker, mountPointService);
107
108         spyTopology = spy(topology);
109     }
110
111     @Test
112     public void testInit() {
113         final WriteTransaction wtx = mock(WriteTransaction.class);
114         when(dataBroker.newWriteOnlyTransaction()).thenReturn(wtx);
115         doNothing().when(wtx).merge(any(LogicalDatastoreType.class), any(InstanceIdentifier.class), any(DataObject.class));
116         when(wtx.submit()).thenReturn(Futures.<Void, TransactionCommitFailedException>immediateCheckedFuture(null));
117         topology.init();
118
119         //verify initialization of topology
120         final InstanceIdentifier<NetworkTopology> networkTopologyId = InstanceIdentifier.builder(NetworkTopology.class).build();
121         final Topology topo = new TopologyBuilder().setTopologyId(new TopologyId(TOPOLOGY_ID)).build();
122         final NetworkTopology networkTopology = new NetworkTopologyBuilder().build();
123         verify(wtx).merge(LogicalDatastoreType.CONFIGURATION, networkTopologyId, networkTopology);
124         verify(wtx).merge(LogicalDatastoreType.OPERATIONAL, networkTopologyId, networkTopology);
125         verify(wtx).merge(LogicalDatastoreType.CONFIGURATION, networkTopologyId.child(Topology.class, new TopologyKey(new TopologyId(TOPOLOGY_ID))), topo);
126         verify(wtx).merge(LogicalDatastoreType.OPERATIONAL, networkTopologyId.child(Topology.class, new TopologyKey(new TopologyId(TOPOLOGY_ID))), topo);
127     }
128
129     @Test
130     public void testOnDataTreeChange() {
131
132         final DataObjectModification<Node> newNode = mock(DataObjectModification.class);
133         when(newNode.getModificationType()).thenReturn(DataObjectModification.ModificationType.WRITE);
134
135         InstanceIdentifier.PathArgument pa = null;
136
137         for (final InstanceIdentifier.PathArgument p : TopologyUtil.createTopologyListPath(TOPOLOGY_ID).child(Node.class, new NodeKey(NODE_ID)).getPathArguments()) {
138             pa = p;
139         }
140
141         when(newNode.getIdentifier()).thenReturn(pa);
142
143
144         final NetconfNode testingNode = new NetconfNodeBuilder()
145                 .setHost(new Host(new IpAddress(new Ipv4Address("127.0.0.1"))))
146                 .setPort(new PortNumber(9999))
147                 .setReconnectOnChangedSchema(true)
148                 .setDefaultRequestTimeoutMillis(1000L)
149                 .setBetweenAttemptsTimeoutMillis(100)
150                 .setKeepaliveDelay(1000L)
151                 .setTcpOnly(true)
152                 .setCredentials(new LoginPasswordBuilder().setUsername("testuser").setPassword("testpassword").build())
153                 .build();
154
155         final NodeBuilder nn = new NodeBuilder().addAugmentation(NetconfNode.class, testingNode);
156
157         when(newNode.getDataAfter()).thenReturn(nn.build());
158
159
160         final Collection<DataTreeModification<Node>> changes = Sets.newHashSet();
161         final DataTreeModification<Node> ch = mock(DataTreeModification.class);
162         when(ch.getRootNode()).thenReturn(newNode);
163         changes.add(ch);
164         spyTopology.onDataTreeChanged(changes);
165         verify(spyTopology).connectNode(TopologyUtil.getNodeId(pa), nn.build());
166
167         when(newNode.getModificationType()).thenReturn(DataObjectModification.ModificationType.DELETE);
168         spyTopology.onDataTreeChanged(changes);
169         verify(spyTopology).disconnectNode(TopologyUtil.getNodeId(pa));
170
171         when(newNode.getModificationType()).thenReturn(DataObjectModification.ModificationType.SUBTREE_MODIFIED);
172         spyTopology.onDataTreeChanged(changes);
173
174         //one in previous creating and deleting node and one in updating
175         verify(spyTopology, times(2)).disconnectNode(TopologyUtil.getNodeId(pa));
176         verify(spyTopology, times(2)).connectNode(TopologyUtil.getNodeId(pa), nn.build());
177
178
179     }
180
181     public static class TestingNetconfTopologyImpl extends NetconfTopologyImpl {
182
183         public TestingNetconfTopologyImpl(final String topologyId, final NetconfClientDispatcher clientDispatcher,
184                                           final EventExecutor eventExecutor, final ScheduledThreadPool keepaliveExecutor,
185                                           final ThreadPool processingExecutor, final SchemaRepositoryProvider schemaRepositoryProvider,
186                                           final DataBroker dataBroker, final DOMMountPointService mountPointService) {
187             super(topologyId, clientDispatcher, eventExecutor, keepaliveExecutor,
188                     processingExecutor, schemaRepositoryProvider, dataBroker, mountPointService);
189         }
190
191         @Override
192         public ListenableFuture<NetconfDeviceCapabilities> connectNode(final NodeId nodeId, final Node configNode) {
193             return Futures.immediateFuture(new NetconfDeviceCapabilities());
194         }
195
196         @Override
197         public ListenableFuture<Void> disconnectNode(final NodeId nodeId) {
198             return Futures.immediateFuture(null);
199         }
200     }
201
202 }