Handle notification reception on port state change
[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 org.junit.Test;
24 import org.junit.runner.RunWith;
25 import org.mockito.Mock;
26 import org.mockito.junit.MockitoJUnitRunner;
27 import org.opendaylight.mdsal.binding.api.DataBroker;
28 import org.opendaylight.mdsal.binding.api.DataObjectModification;
29 import org.opendaylight.mdsal.binding.api.DataTreeModification;
30 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
31 import org.opendaylight.transportpce.common.mapping.PortMapping;
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.node.topology.rev150114.NetconfNode;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.AvailableCapabilities;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.AvailableCapabilitiesBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.available.capabilities.AvailableCapability;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.available.capabilities.AvailableCapabilityBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.credentials.credentials.LoginPasswordBuilder;
45 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
46 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
47 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder;
48 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
49 import org.opendaylight.yangtools.yang.common.Uint16;
50 import org.opendaylight.yangtools.yang.common.Uint32;
51
52 @RunWith(MockitoJUnitRunner.StrictStubs.class)
53 public class NetConfTopologyListenerTest {
54
55     @Mock
56     private NetworkModelService networkModelService;
57     @Mock
58     private DataBroker dataBroker;
59     @Mock
60     private DeviceTransactionManager deviceTransactionManager;
61     @Mock
62     private PortMapping portMapping;
63
64     @Test
65     public void testOnDataTreeChangedWhenDeleteNode() {
66         final DataObjectModification<Node> node = mock(DataObjectModification.class);
67         final Collection<DataTreeModification<Node>> changes = new HashSet<>();
68         final DataTreeModification<Node> ch = mock(DataTreeModification.class);
69         changes.add(ch);
70         when(ch.getRootNode()).thenReturn(node);
71
72         final Node netconfNode = getNetconfNode("netconfNode1", NetconfNodeConnectionStatus.ConnectionStatus.Connecting,
73             OPENROADM_DEVICE_VERSION_2_2_1);
74         when(node.getModificationType()).thenReturn(DataObjectModification.ModificationType.DELETE);
75         when(node.getDataBefore()).thenReturn(netconfNode);
76         NetConfTopologyListener listener = new NetConfTopologyListener(networkModelService, dataBroker,
77             deviceTransactionManager, portMapping);
78         listener.onDataTreeChanged(changes);
79         verify(ch, times(1)).getRootNode();
80         verify(node, times(1)).getModificationType();
81         verify(node, times(3)).getDataBefore();
82         verify(networkModelService, times(1)).deleteOpenRoadmnode(anyString());
83     }
84
85     @Test
86     public void testOnDataTreeChangedWhenAddNode() {
87         final DataObjectModification<Node> node = mock(DataObjectModification.class);
88         final Collection<DataTreeModification<Node>> changes = new HashSet<>();
89         @SuppressWarnings("unchecked") final DataTreeModification<Node> ch = mock(DataTreeModification.class);
90         changes.add(ch);
91         when(ch.getRootNode()).thenReturn(node);
92
93         final Node netconfNodeBefore = getNetconfNode("netconfNode1",
94             NetconfNodeConnectionStatus.ConnectionStatus.Connecting, OPENROADM_DEVICE_VERSION_2_2_1);
95         final Node netconfNodeAfter = getNetconfNode("netconfNode1",
96             NetconfNodeConnectionStatus.ConnectionStatus.Connected, OPENROADM_DEVICE_VERSION_2_2_1);
97         when(node.getModificationType()).thenReturn(DataObjectModification.ModificationType.WRITE);
98         when(node.getDataBefore()).thenReturn(netconfNodeBefore);
99         when(node.getDataAfter()).thenReturn(netconfNodeAfter);
100
101         NetConfTopologyListener listener = new NetConfTopologyListener(networkModelService, dataBroker,
102             deviceTransactionManager, portMapping);
103         listener.onDataTreeChanged(changes);
104         verify(ch, times(1)).getRootNode();
105         verify(node, times(1)).getModificationType();
106         verify(node, times(3)).getDataBefore();
107         verify(node, times(1)).getDataAfter();
108         verify(networkModelService, times(1)).createOpenRoadmNode(anyString(), anyString());
109     }
110
111     @Test
112     public void testOnDataTreeChangedWhenDisconnectingNode() {
113         final DataObjectModification<Node> node = mock(DataObjectModification.class);
114         final Collection<DataTreeModification<Node>> changes = new HashSet<>();
115         final DataTreeModification<Node> ch = mock(DataTreeModification.class);
116         changes.add(ch);
117         when(ch.getRootNode()).thenReturn(node);
118
119         final Node netconfNodeBefore = getNetconfNode("netconfNode1",
120             NetconfNodeConnectionStatus.ConnectionStatus.Connected, OPENROADM_DEVICE_VERSION_2_2_1);
121         final Node netconfNodeAfter = getNetconfNode("netconfNode1",
122             NetconfNodeConnectionStatus.ConnectionStatus.Connecting, OPENROADM_DEVICE_VERSION_2_2_1);
123         when(node.getModificationType()).thenReturn(DataObjectModification.ModificationType.WRITE);
124         when(node.getDataBefore()).thenReturn(netconfNodeBefore);
125         when(node.getDataAfter()).thenReturn(netconfNodeAfter);
126
127         NetConfTopologyListener listener = new NetConfTopologyListener(networkModelService, dataBroker,
128             deviceTransactionManager, portMapping);
129         listener.onDataTreeChanged(changes);
130         verify(ch, times(1)).getRootNode();
131         verify(node, times(1)).getModificationType();
132         verify(node, times(3)).getDataBefore();
133         verify(node, times(1)).getDataAfter();
134         verify(networkModelService, never()).createOpenRoadmNode(anyString(), anyString());
135         verify(networkModelService, never()).deleteOpenRoadmnode(anyString());
136     }
137
138     @Test
139     public void testOnDataTreeChangedWhenShouldNeverHappen() {
140         final DataObjectModification<Node> node = mock(DataObjectModification.class);
141         final Collection<DataTreeModification<Node>> changes = new HashSet<>();
142         final DataTreeModification<Node> ch = mock(DataTreeModification.class);
143         changes.add(ch);
144         when(ch.getRootNode()).thenReturn(node);
145
146         final Node netconfNodeBefore = getNetconfNode("netconfNode1",
147             NetconfNodeConnectionStatus.ConnectionStatus.Connected, OPENROADM_DEVICE_VERSION_2_2_1);
148         when(node.getModificationType()).thenReturn(DataObjectModification.ModificationType.SUBTREE_MODIFIED);
149         when(node.getDataBefore()).thenReturn(netconfNodeBefore);
150
151         NetConfTopologyListener listener = new NetConfTopologyListener(networkModelService, dataBroker,
152             deviceTransactionManager, portMapping);
153         listener.onDataTreeChanged(changes);
154         verify(ch, times(1)).getRootNode();
155         verify(node, times(2)).getModificationType();
156         verify(node, times(3)).getDataBefore();
157         verify(node, never()).getDataAfter();
158         verify(networkModelService, never()).createOpenRoadmNode(anyString(), anyString());
159         verify(networkModelService, never()).deleteOpenRoadmnode(anyString());
160     }
161
162     private Node getNetconfNode(final String nodeId, final NetconfNodeConnectionStatus.ConnectionStatus cs,
163         final String openRoadmVersion) {
164         final List<AvailableCapability> avCapList = new ArrayList<>();
165         avCapList.add(new AvailableCapabilityBuilder()
166             .setCapabilityOrigin(AvailableCapability.CapabilityOrigin.UserDefined)
167             .setCapability(openRoadmVersion)
168             .build());
169         final AvailableCapabilities avCaps = new AvailableCapabilitiesBuilder().setAvailableCapability(avCapList)
170             .build();
171         final NetconfNode netconfNode = new NetconfNodeBuilder()
172             .setConnectionStatus(cs)
173             .setAvailableCapabilities(avCaps)
174             .setHost(new Host(new IpAddress(new Ipv4Address("127.0.0.1"))))
175             .setPort(new PortNumber(Uint16.valueOf(9999)))
176             .setReconnectOnChangedSchema(true)
177             .setDefaultRequestTimeoutMillis(Uint32.valueOf(1000))
178             .setBetweenAttemptsTimeoutMillis(Uint16.valueOf(100))
179             .setKeepaliveDelay(Uint32.valueOf(1000))
180             .setTcpOnly(true)
181             .setCredentials(new LoginPasswordBuilder()
182                 .setUsername("testuser")
183                 .setPassword("testpassword")
184                 .build())
185             .build();
186         return new NodeBuilder()
187             .withKey(new NodeKey(new NodeId(nodeId)))
188             .setNodeId(new NodeId(nodeId))
189             .addAugmentation(netconfNode)
190             .build();
191     }
192 }