2 * Copyright © 2020 Orange. 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
9 package org.opendaylight.transportpce.networkmodel;
11 import static org.mockito.Mockito.anyString;
12 import static org.mockito.Mockito.mock;
13 import static org.mockito.Mockito.never;
14 import static org.mockito.Mockito.times;
15 import static org.mockito.Mockito.verify;
16 import static org.mockito.Mockito.when;
17 import static org.opendaylight.transportpce.common.StringConstants.OPENROADM_DEVICE_VERSION_2_2_1;
19 import java.util.ArrayList;
20 import java.util.List;
22 import org.junit.jupiter.api.Test;
23 import org.junit.jupiter.api.extension.ExtendWith;
24 import org.mockito.Mock;
25 import org.mockito.junit.jupiter.MockitoExtension;
26 import org.opendaylight.mdsal.binding.api.DataBroker;
27 import org.opendaylight.mdsal.binding.api.DataObjectModification;
28 import org.opendaylight.mdsal.binding.api.DataTreeModification;
29 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
30 import org.opendaylight.transportpce.common.mapping.PortMapping;
31 import org.opendaylight.transportpce.networkmodel.dto.NodeRegistration;
32 import org.opendaylight.transportpce.networkmodel.service.NetworkModelService;
33 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Host;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
36 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev240120.ConnectionOper.ConnectionStatus;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev240120.connection.oper.AvailableCapabilities;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev240120.connection.oper.AvailableCapabilitiesBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev240120.connection.oper.available.capabilities.AvailableCapability;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev240120.connection.oper.available.capabilities.AvailableCapabilityBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev240120.credentials.credentials.LoginPwBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev240120.credentials.credentials.login.pw.LoginPasswordBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev231121.NetconfNode;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev231121.NetconfNodeBuilder;
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.network.topology.topology.Node;
48 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder;
49 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
50 import org.opendaylight.yangtools.yang.common.Uint16;
51 import org.opendaylight.yangtools.yang.common.Uint32;
53 @ExtendWith(MockitoExtension.class)
54 public class NetConfTopologyListenerTest {
57 private NetworkModelService networkModelService;
59 private DataBroker dataBroker;
61 private DeviceTransactionManager deviceTransactionManager;
63 private PortMapping portMapping;
65 private Map<String, NodeRegistration> registrations;
68 void testOnDataTreeChangedWhenDeleteNode() {
69 @SuppressWarnings("unchecked") final DataObjectModification<Node> node = mock(DataObjectModification.class);
70 final List<DataTreeModification<Node>> changes = new ArrayList<>();
71 @SuppressWarnings("unchecked") final DataTreeModification<Node> ch = mock(DataTreeModification.class);
72 final NodeRegistration nodeRegistration = mock(NodeRegistration.class);
74 when(ch.getRootNode()).thenReturn(node);
76 final Node netconfNode = getNetconfNode("netconfNode1", ConnectionStatus.Connecting,
77 OPENROADM_DEVICE_VERSION_2_2_1);
78 when(node.modificationType()).thenReturn(DataObjectModification.ModificationType.DELETE);
79 when(node.dataBefore()).thenReturn(netconfNode);
81 NetConfTopologyListener listener = new NetConfTopologyListener(networkModelService, dataBroker,
82 deviceTransactionManager, portMapping, registrations);
83 listener.onDataTreeChanged(changes);
84 verify(ch, times(1)).getRootNode();
85 verify(node, times(1)).modificationType();
86 verify(node, times(3)).dataBefore();
87 verify(networkModelService, times(1)).deleteOpenRoadmnode(anyString());
88 verify(nodeRegistration, times(0)).unregisterListeners();
92 void testOnDataTreeChangedWhenAddNode() {
93 @SuppressWarnings("unchecked") final DataObjectModification<Node> node = mock(DataObjectModification.class);
94 final List<DataTreeModification<Node>> changes = new ArrayList<>();
95 @SuppressWarnings("unchecked") final DataTreeModification<Node> ch = mock(DataTreeModification.class);
97 when(ch.getRootNode()).thenReturn(node);
99 final Node netconfNodeBefore = getNetconfNode("netconfNode1",
100 ConnectionStatus.Connecting, OPENROADM_DEVICE_VERSION_2_2_1);
101 final Node netconfNodeAfter = getNetconfNode("netconfNode1",
102 ConnectionStatus.Connected, OPENROADM_DEVICE_VERSION_2_2_1);
103 when(node.modificationType()).thenReturn(DataObjectModification.ModificationType.WRITE);
104 when(node.dataBefore()).thenReturn(netconfNodeBefore);
105 when(node.dataAfter()).thenReturn(netconfNodeAfter);
107 NetConfTopologyListener listener = new NetConfTopologyListener(networkModelService, dataBroker,
108 deviceTransactionManager, portMapping);
109 listener.onDataTreeChanged(changes);
110 verify(ch, times(1)).getRootNode();
111 verify(node, times(1)).modificationType();
112 verify(node, times(3)).dataBefore();
113 verify(node, times(1)).dataAfter();
114 verify(networkModelService, times(1)).createOpenRoadmNode(anyString(), anyString());
118 void testOnDataTreeChangedWhenDisconnectingNode() {
119 @SuppressWarnings("unchecked") final DataObjectModification<Node> node = mock(DataObjectModification.class);
120 final List<DataTreeModification<Node>> changes = new ArrayList<>();
121 @SuppressWarnings("unchecked") final DataTreeModification<Node> ch = mock(DataTreeModification.class);
123 when(ch.getRootNode()).thenReturn(node);
125 final Node netconfNodeBefore = getNetconfNode("netconfNode1",
126 ConnectionStatus.Connected, OPENROADM_DEVICE_VERSION_2_2_1);
127 final Node netconfNodeAfter = getNetconfNode("netconfNode1",
128 ConnectionStatus.Connecting, OPENROADM_DEVICE_VERSION_2_2_1);
129 when(node.modificationType()).thenReturn(DataObjectModification.ModificationType.WRITE);
130 when(node.dataBefore()).thenReturn(netconfNodeBefore);
131 when(node.dataAfter()).thenReturn(netconfNodeAfter);
133 NetConfTopologyListener listener = new NetConfTopologyListener(networkModelService, dataBroker,
134 deviceTransactionManager, portMapping);
135 listener.onDataTreeChanged(changes);
136 verify(ch, times(1)).getRootNode();
137 verify(node, times(1)).modificationType();
138 verify(node, times(3)).dataBefore();
139 verify(node, times(1)).dataAfter();
140 verify(networkModelService, never()).createOpenRoadmNode(anyString(), anyString());
141 verify(networkModelService, never()).deleteOpenRoadmnode(anyString());
145 void testOnDataTreeChangedWhenShouldNeverHappen() {
146 @SuppressWarnings("unchecked") final DataObjectModification<Node> node = mock(DataObjectModification.class);
147 final List<DataTreeModification<Node>> changes = new ArrayList<>();
148 @SuppressWarnings("unchecked") final DataTreeModification<Node> ch = mock(DataTreeModification.class);
150 when(ch.getRootNode()).thenReturn(node);
152 final Node netconfNodeBefore = getNetconfNode("netconfNode1",
153 ConnectionStatus.Connected, OPENROADM_DEVICE_VERSION_2_2_1);
154 when(node.modificationType()).thenReturn(DataObjectModification.ModificationType.SUBTREE_MODIFIED);
155 when(node.dataBefore()).thenReturn(netconfNodeBefore);
157 NetConfTopologyListener listener = new NetConfTopologyListener(networkModelService, dataBroker,
158 deviceTransactionManager, portMapping);
159 listener.onDataTreeChanged(changes);
160 verify(ch, times(1)).getRootNode();
161 verify(node, times(2)).modificationType();
162 verify(node, times(3)).dataBefore();
163 verify(node, never()).dataAfter();
164 verify(networkModelService, never()).createOpenRoadmNode(anyString(), anyString());
165 verify(networkModelService, never()).deleteOpenRoadmnode(anyString());
168 private Node getNetconfNode(final String nodeId, final ConnectionStatus cs,
169 final String openRoadmVersion) {
170 final List<AvailableCapability> avCapList = new ArrayList<>();
171 avCapList.add(new AvailableCapabilityBuilder()
172 .setCapabilityOrigin(AvailableCapability.CapabilityOrigin.UserDefined)
173 .setCapability(openRoadmVersion)
175 final AvailableCapabilities avCaps = new AvailableCapabilitiesBuilder().setAvailableCapability(avCapList)
177 final NetconfNode netconfNode = new NetconfNodeBuilder()
178 .setConnectionStatus(cs)
179 .setAvailableCapabilities(avCaps)
180 .setHost(new Host(new IpAddress(new Ipv4Address("127.0.0.1"))))
181 .setPort(new PortNumber(Uint16.valueOf(9999)))
182 .setReconnectOnChangedSchema(true)
183 .setDefaultRequestTimeoutMillis(Uint32.valueOf(1000))
184 .setKeepaliveDelay(Uint32.valueOf(1000))
186 .setCredentials(new LoginPwBuilder()
187 .setLoginPassword(new LoginPasswordBuilder()
188 .setUsername("testuser")
189 .setPassword("testpassword".getBytes())
193 return new NodeBuilder()
194 .withKey(new NodeKey(new NodeId(nodeId)))
195 .setNodeId(new NodeId(nodeId))
196 .addAugmentation(netconfNode)