7fc2b4c5f7ba232fccb7626ebfa919434850fe4f
[transportpce.git] / networkmodel / src / test / java / org / opendaylight / transportpce / networkmodel / NetConfTopologyListenerTest.java
1 /*
2  * Copyright © 2020 Orange.  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.transportpce.networkmodel;
10
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;
18
19 import java.util.ArrayList;
20 import java.util.Collection;
21 import java.util.HashSet;
22 import java.util.List;
23 import java.util.Map;
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.device.rev221225.ConnectionOper.ConnectionStatus;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev221225.connection.oper.AvailableCapabilities;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev221225.connection.oper.AvailableCapabilitiesBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev221225.connection.oper.available.capabilities.AvailableCapability;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev221225.connection.oper.available.capabilities.AvailableCapabilityBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev221225.credentials.credentials.LoginPasswordBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev221225.NetconfNode;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev221225.NetconfNodeBuilder;
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;
53
54 @RunWith(MockitoJUnitRunner.StrictStubs.class)
55 public class NetConfTopologyListenerTest {
56
57     @Mock
58     private NetworkModelService networkModelService;
59     @Mock
60     private DataBroker dataBroker;
61     @Mock
62     private DeviceTransactionManager deviceTransactionManager;
63     @Mock
64     private PortMapping portMapping;
65     @Mock
66     private Map<String, NodeRegistration> registrations;
67
68     @Test
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);
74         changes.add(ch);
75         when(ch.getRootNode()).thenReturn(node);
76
77         final Node netconfNode = getNetconfNode("netconfNode1", ConnectionStatus.Connecting,
78             OPENROADM_DEVICE_VERSION_2_2_1);
79         when(node.getModificationType()).thenReturn(DataObjectModification.ModificationType.DELETE);
80         when(node.getDataBefore()).thenReturn(netconfNode);
81
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();
90     }
91
92     @Test
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);
97         changes.add(ch);
98         when(ch.getRootNode()).thenReturn(node);
99
100         final Node netconfNodeBefore = getNetconfNode("netconfNode1",
101             ConnectionStatus.Connecting, OPENROADM_DEVICE_VERSION_2_2_1);
102         final Node netconfNodeAfter = getNetconfNode("netconfNode1",
103             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);
107
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());
116     }
117
118     @Test
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);
123         changes.add(ch);
124         when(ch.getRootNode()).thenReturn(node);
125
126         final Node netconfNodeBefore = getNetconfNode("netconfNode1",
127             ConnectionStatus.Connected, OPENROADM_DEVICE_VERSION_2_2_1);
128         final Node netconfNodeAfter = getNetconfNode("netconfNode1",
129             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);
133
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());
143     }
144
145     @Test
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);
150         changes.add(ch);
151         when(ch.getRootNode()).thenReturn(node);
152
153         final Node netconfNodeBefore = getNetconfNode("netconfNode1",
154             ConnectionStatus.Connected, OPENROADM_DEVICE_VERSION_2_2_1);
155         when(node.getModificationType()).thenReturn(DataObjectModification.ModificationType.SUBTREE_MODIFIED);
156         when(node.getDataBefore()).thenReturn(netconfNodeBefore);
157
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());
167     }
168
169     private Node getNetconfNode(final String nodeId, final 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)
175             .build());
176         final AvailableCapabilities avCaps = new AvailableCapabilitiesBuilder().setAvailableCapability(avCapList)
177             .build();
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))
187             .setTcpOnly(true)
188             .setCredentials(new LoginPasswordBuilder()
189                 .setUsername("testuser")
190                 .setPassword("testpassword")
191                 .build())
192             .build();
193         return new NodeBuilder()
194             .withKey(new NodeKey(new NodeId(nodeId)))
195             .setNodeId(new NodeId(nodeId))
196             .addAugmentation(netconfNode)
197             .build();
198     }
199 }