Abort power setup if setting gainloss fails
[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.List;
21 import java.util.Map;
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;
52
53 @ExtendWith(MockitoExtension.class)
54 public class NetConfTopologyListenerTest {
55
56     @Mock
57     private NetworkModelService networkModelService;
58     @Mock
59     private DataBroker dataBroker;
60     @Mock
61     private DeviceTransactionManager deviceTransactionManager;
62     @Mock
63     private PortMapping portMapping;
64     @Mock
65     private Map<String, NodeRegistration> registrations;
66
67     @Test
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);
73         changes.add(ch);
74         when(ch.getRootNode()).thenReturn(node);
75
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);
80
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();
89     }
90
91     @Test
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);
96         changes.add(ch);
97         when(ch.getRootNode()).thenReturn(node);
98
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);
106
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());
115     }
116
117     @Test
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);
122         changes.add(ch);
123         when(ch.getRootNode()).thenReturn(node);
124
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);
132
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());
142     }
143
144     @Test
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);
149         changes.add(ch);
150         when(ch.getRootNode()).thenReturn(node);
151
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);
156
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());
166     }
167
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)
174             .build());
175         final AvailableCapabilities avCaps = new AvailableCapabilitiesBuilder().setAvailableCapability(avCapList)
176             .build();
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))
185             .setTcpOnly(true)
186             .setCredentials(new LoginPwBuilder()
187                 .setLoginPassword(new LoginPasswordBuilder()
188                     .setUsername("testuser")
189                     .setPassword("testpassword".getBytes())
190                     .build())
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 }