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.Collection;
21 import java.util.HashSet;
22 import java.util.List;
24 import org.junit.Test;
25 import org.junit.runner.RunWith;
26 import org.mockito.Mock;
27 import org.mockito.junit.MockitoJUnitRunner;
28 import org.opendaylight.mdsal.binding.api.DataBroker;
29 import org.opendaylight.mdsal.binding.api.DataObjectModification;
30 import org.opendaylight.mdsal.binding.api.DataTreeModification;
31 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
32 import org.opendaylight.transportpce.common.mapping.PortMapping;
33 import org.opendaylight.transportpce.networkmodel.dto.NodeRegistration;
34 import org.opendaylight.transportpce.networkmodel.service.NetworkModelService;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Host;
36 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
37 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
38 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.AvailableCapabilities;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.AvailableCapabilitiesBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.available.capabilities.AvailableCapability;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.available.capabilities.AvailableCapabilityBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.credentials.credentials.LoginPasswordBuilder;
47 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
48 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
49 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder;
50 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
51 import org.opendaylight.yangtools.yang.common.Uint16;
52 import org.opendaylight.yangtools.yang.common.Uint32;
54 @RunWith(MockitoJUnitRunner.StrictStubs.class)
55 public class NetConfTopologyListenerTest {
58 private NetworkModelService networkModelService;
60 private DataBroker dataBroker;
62 private DeviceTransactionManager deviceTransactionManager;
64 private PortMapping portMapping;
66 private Map<String, NodeRegistration> registrations;
69 public void testOnDataTreeChangedWhenDeleteNode() {
70 @SuppressWarnings("unchecked") final DataObjectModification<Node> node = mock(DataObjectModification.class);
71 final Collection<DataTreeModification<Node>> changes = new HashSet<>();
72 @SuppressWarnings("unchecked") final DataTreeModification<Node> ch = mock(DataTreeModification.class);
73 final NodeRegistration nodeRegistration = mock(NodeRegistration.class);
75 when(ch.getRootNode()).thenReturn(node);
77 final Node netconfNode = getNetconfNode("netconfNode1", NetconfNodeConnectionStatus.ConnectionStatus.Connecting,
78 OPENROADM_DEVICE_VERSION_2_2_1);
79 when(node.getModificationType()).thenReturn(DataObjectModification.ModificationType.DELETE);
80 when(node.getDataBefore()).thenReturn(netconfNode);
82 NetConfTopologyListener listener = new NetConfTopologyListener(networkModelService, dataBroker,
83 deviceTransactionManager, portMapping, registrations);
84 listener.onDataTreeChanged(changes);
85 verify(ch, times(1)).getRootNode();
86 verify(node, times(1)).getModificationType();
87 verify(node, times(3)).getDataBefore();
88 verify(networkModelService, times(1)).deleteOpenRoadmnode(anyString());
89 verify(nodeRegistration, times(0)).unregisterListeners();
93 public void testOnDataTreeChangedWhenAddNode() {
94 @SuppressWarnings("unchecked") final DataObjectModification<Node> node = mock(DataObjectModification.class);
95 final Collection<DataTreeModification<Node>> changes = new HashSet<>();
96 @SuppressWarnings("unchecked") final DataTreeModification<Node> ch = mock(DataTreeModification.class);
98 when(ch.getRootNode()).thenReturn(node);
100 final Node netconfNodeBefore = getNetconfNode("netconfNode1",
101 NetconfNodeConnectionStatus.ConnectionStatus.Connecting, OPENROADM_DEVICE_VERSION_2_2_1);
102 final Node netconfNodeAfter = getNetconfNode("netconfNode1",
103 NetconfNodeConnectionStatus.ConnectionStatus.Connected, OPENROADM_DEVICE_VERSION_2_2_1);
104 when(node.getModificationType()).thenReturn(DataObjectModification.ModificationType.WRITE);
105 when(node.getDataBefore()).thenReturn(netconfNodeBefore);
106 when(node.getDataAfter()).thenReturn(netconfNodeAfter);
108 NetConfTopologyListener listener = new NetConfTopologyListener(networkModelService, dataBroker,
109 deviceTransactionManager, portMapping);
110 listener.onDataTreeChanged(changes);
111 verify(ch, times(1)).getRootNode();
112 verify(node, times(1)).getModificationType();
113 verify(node, times(3)).getDataBefore();
114 verify(node, times(1)).getDataAfter();
115 verify(networkModelService, times(1)).createOpenRoadmNode(anyString(), anyString());
119 public void testOnDataTreeChangedWhenDisconnectingNode() {
120 @SuppressWarnings("unchecked") final DataObjectModification<Node> node = mock(DataObjectModification.class);
121 final Collection<DataTreeModification<Node>> changes = new HashSet<>();
122 @SuppressWarnings("unchecked") final DataTreeModification<Node> ch = mock(DataTreeModification.class);
124 when(ch.getRootNode()).thenReturn(node);
126 final Node netconfNodeBefore = getNetconfNode("netconfNode1",
127 NetconfNodeConnectionStatus.ConnectionStatus.Connected, OPENROADM_DEVICE_VERSION_2_2_1);
128 final Node netconfNodeAfter = getNetconfNode("netconfNode1",
129 NetconfNodeConnectionStatus.ConnectionStatus.Connecting, OPENROADM_DEVICE_VERSION_2_2_1);
130 when(node.getModificationType()).thenReturn(DataObjectModification.ModificationType.WRITE);
131 when(node.getDataBefore()).thenReturn(netconfNodeBefore);
132 when(node.getDataAfter()).thenReturn(netconfNodeAfter);
134 NetConfTopologyListener listener = new NetConfTopologyListener(networkModelService, dataBroker,
135 deviceTransactionManager, portMapping);
136 listener.onDataTreeChanged(changes);
137 verify(ch, times(1)).getRootNode();
138 verify(node, times(1)).getModificationType();
139 verify(node, times(3)).getDataBefore();
140 verify(node, times(1)).getDataAfter();
141 verify(networkModelService, never()).createOpenRoadmNode(anyString(), anyString());
142 verify(networkModelService, never()).deleteOpenRoadmnode(anyString());
146 public void testOnDataTreeChangedWhenShouldNeverHappen() {
147 @SuppressWarnings("unchecked") final DataObjectModification<Node> node = mock(DataObjectModification.class);
148 final Collection<DataTreeModification<Node>> changes = new HashSet<>();
149 @SuppressWarnings("unchecked") final DataTreeModification<Node> ch = mock(DataTreeModification.class);
151 when(ch.getRootNode()).thenReturn(node);
153 final Node netconfNodeBefore = getNetconfNode("netconfNode1",
154 NetconfNodeConnectionStatus.ConnectionStatus.Connected, OPENROADM_DEVICE_VERSION_2_2_1);
155 when(node.getModificationType()).thenReturn(DataObjectModification.ModificationType.SUBTREE_MODIFIED);
156 when(node.getDataBefore()).thenReturn(netconfNodeBefore);
158 NetConfTopologyListener listener = new NetConfTopologyListener(networkModelService, dataBroker,
159 deviceTransactionManager, portMapping);
160 listener.onDataTreeChanged(changes);
161 verify(ch, times(1)).getRootNode();
162 verify(node, times(2)).getModificationType();
163 verify(node, times(3)).getDataBefore();
164 verify(node, never()).getDataAfter();
165 verify(networkModelService, never()).createOpenRoadmNode(anyString(), anyString());
166 verify(networkModelService, never()).deleteOpenRoadmnode(anyString());
169 private Node getNetconfNode(final String nodeId, final NetconfNodeConnectionStatus.ConnectionStatus cs,
170 final String openRoadmVersion) {
171 final List<AvailableCapability> avCapList = new ArrayList<>();
172 avCapList.add(new AvailableCapabilityBuilder()
173 .setCapabilityOrigin(AvailableCapability.CapabilityOrigin.UserDefined)
174 .setCapability(openRoadmVersion)
176 final AvailableCapabilities avCaps = new AvailableCapabilitiesBuilder().setAvailableCapability(avCapList)
178 final NetconfNode netconfNode = new NetconfNodeBuilder()
179 .setConnectionStatus(cs)
180 .setAvailableCapabilities(avCaps)
181 .setHost(new Host(new IpAddress(new Ipv4Address("127.0.0.1"))))
182 .setPort(new PortNumber(Uint16.valueOf(9999)))
183 .setReconnectOnChangedSchema(true)
184 .setDefaultRequestTimeoutMillis(Uint32.valueOf(1000))
185 .setBetweenAttemptsTimeoutMillis(Uint16.valueOf(100))
186 .setKeepaliveDelay(Uint32.valueOf(1000))
188 .setCredentials(new LoginPasswordBuilder()
189 .setUsername("testuser")
190 .setPassword("testpassword")
193 return new NodeBuilder()
194 .withKey(new NodeKey(new NodeId(nodeId)))
195 .setNodeId(new NodeId(nodeId))
196 .addAugmentation(netconfNode)