2 * Copyright © 2022 Orange, Inc. and others. 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.servicehandler.listeners;
11 import static org.junit.jupiter.api.Assertions.assertEquals;
12 import static org.junit.jupiter.api.Assertions.assertFalse;
13 import static org.junit.jupiter.api.Assertions.assertTrue;
14 import static org.mockito.ArgumentMatchers.any;
15 import static org.mockito.ArgumentMatchers.anyString;
16 import static org.mockito.Mockito.doCallRealMethod;
17 import static org.mockito.Mockito.eq;
18 import static org.mockito.Mockito.never;
19 import static org.mockito.Mockito.times;
20 import static org.mockito.Mockito.verify;
21 import static org.mockito.Mockito.when;
23 import java.util.HashMap;
25 import java.util.Optional;
26 import org.junit.jupiter.api.BeforeEach;
27 import org.junit.jupiter.api.Test;
28 import org.junit.jupiter.api.extension.ExtendWith;
29 import org.mockito.Mock;
30 import org.mockito.Mockito;
31 import org.mockito.junit.jupiter.MockitoExtension;
32 import org.opendaylight.mdsal.binding.api.NotificationPublishService;
33 import org.opendaylight.transportpce.common.OperationResult;
34 import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations;
35 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkmodel.rev201116.TopologyUpdateResult;
36 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkmodel.rev201116.TopologyUpdateResultBuilder;
37 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkmodel.rev201116.topology.update.result.TopologyChanges;
38 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkmodel.rev201116.topology.update.result.TopologyChangesBuilder;
39 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkmodel.rev201116.topology.update.result.TopologyChangesKey;
40 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
41 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
42 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.list.ServicesBuilder;
43 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.AToZDirectionBuilder;
44 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ZToADirectionBuilder;
45 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZ;
46 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZBuilder;
47 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZKey;
48 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ztoa.direction.ZToA;
49 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ztoa.direction.ZToABuilder;
50 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ztoa.direction.ZToAKey;
51 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.ResourceBuilder;
52 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.resource.resource.LinkBuilder;
53 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.resource.resource.NodeBuilder;
54 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.resource.resource.TerminationPointBuilder;
55 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.path.PathDescription;
56 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.path.PathDescriptionBuilder;
57 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.ServicePathListBuilder;
58 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.service.path.list.ServicePaths;
59 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.service.path.list.ServicePathsBuilder;
60 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.service.path.list.ServicePathsKey;
62 @ExtendWith(MockitoExtension.class)
63 public class NetworkModelListenerImplTest {
66 private NotificationPublishService notificationPublishService;
68 private ServiceDataStoreOperations serviceDataStoreOperations;
69 private static PathDescription pathDescription;
70 private NetworkModelListenerImpl networkModelListener;
74 pathDescription = new PathDescriptionBuilder()
75 .setAToZDirection(new AToZDirectionBuilder().setAToZ(new HashMap<>(createMapAtoZ())).build())
76 .setZToADirection(new ZToADirectionBuilder().setZToA(new HashMap<>(createMapZtoA())).build())
78 networkModelListener = new NetworkModelListenerImpl(notificationPublishService,
79 serviceDataStoreOperations);
83 void testChangePathElementStateZAShouldNotModifyPathDescriptionsElementStates() {
84 Map<TopologyChangesKey, TopologyChanges> topologyChanges = Map.of(
85 new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
86 new TopologyChangesBuilder()
87 .setNodeId("tpNodeIdA")
89 .setState(State.InService)
91 new TopologyChangesKey("tpNodeIdA", "TpIdA2"),
92 new TopologyChangesBuilder()
93 .setNodeId("tpNodeIdA")
95 .setState(State.InService)
100 pathDescription.getZToADirection().getZToA(),
101 networkModelListener.changePathElementStateZA(topologyChanges, pathDescription));
105 void testChangePathElementStateZAShouldModifyPathDescriptionsElementStates() {
106 Map<TopologyChangesKey, TopologyChanges> topologyChanges = Map.of(
107 new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
108 new TopologyChangesBuilder()
109 .setNodeId("tpNodeIdA")
111 .setState(State.OutOfService)
113 new TopologyChangesKey("tpNodeIdA", "TpIdA2"),
114 new TopologyChangesBuilder()
115 .setNodeId("tpNodeIdA")
117 .setState(State.OutOfService)
120 Map<ZToAKey, ZToA> ztoamapExpected = pathDescription.getZToADirection().getZToA();
121 ztoamapExpected.computeIfPresent(
123 (zToAKey, zToA) -> new ZToABuilder(zToA)
124 .setResource(new ResourceBuilder(zToA.getResource())
125 .setState(State.OutOfService)
128 ztoamapExpected.computeIfPresent(
130 (zToAKey, zToA) -> new ZToABuilder(zToA)
131 .setResource(new ResourceBuilder(zToA.getResource())
132 .setState(State.OutOfService)
135 assertEquals(ztoamapExpected, networkModelListener.changePathElementStateZA(topologyChanges, pathDescription));
139 void testChangePathElementStateAZShouldNotModifyPathDescriptionsElementStates() {
140 Map<TopologyChangesKey, TopologyChanges> topologyChanges = Map.of(
141 new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
142 new TopologyChangesBuilder()
143 .setNodeId("tpNodeIdA")
145 .setState(State.InService)
147 new TopologyChangesKey("tpNodeIdA", "TpIdA2"),
148 new TopologyChangesBuilder()
149 .setNodeId("tpNodeIdA")
151 .setState(State.InService)
155 pathDescription.getAToZDirection().getAToZ(),
156 networkModelListener.changePathElementStateAZ(topologyChanges, pathDescription));
160 void testChangePathElementStateAZShouldModifyPathDescriptionsElementStates() {
161 Map<TopologyChangesKey, TopologyChanges> topologyChanges = Map.of(
162 new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
163 new TopologyChangesBuilder()
164 .setNodeId("tpNodeIdA")
166 .setState(State.OutOfService)
168 new TopologyChangesKey("tpNodeIdA", "TpIdA2"),
169 new TopologyChangesBuilder()
170 .setNodeId("tpNodeIdA")
172 .setState(State.OutOfService)
175 Map<AToZKey, AToZ> atozmapExpected = pathDescription.getAToZDirection().getAToZ();
176 atozmapExpected.computeIfPresent(
178 (aToZKey, aToZ) -> new AToZBuilder(aToZ)
179 .setResource(new ResourceBuilder(aToZ.getResource())
180 .setState(State.OutOfService)
183 atozmapExpected.computeIfPresent(
185 (aToZKey, aToZ) -> new AToZBuilder(aToZ)
186 .setResource(new ResourceBuilder(aToZ.getResource())
187 .setState(State.OutOfService)
190 assertEquals(atozmapExpected, networkModelListener.changePathElementStateAZ(topologyChanges, pathDescription));
194 void testAllElementsinPathinServiceShouldReturnFalse() {
195 Map<AToZKey, AToZ> atozmap = pathDescription.getAToZDirection().getAToZ();
196 atozmap.computeIfPresent(
198 (aToZKey, aToZ) -> new AToZBuilder(aToZ)
199 .setResource(new ResourceBuilder(aToZ.getResource())
200 .setState(State.OutOfService)
203 Map<ZToAKey, ZToA> ztoamap = pathDescription.getZToADirection().getZToA();
204 ztoamap.computeIfPresent(
206 (zToAKey, zToA) -> new ZToABuilder(zToA)
207 .setResource(new ResourceBuilder(zToA.getResource())
208 .setState(State.OutOfService)
211 assertFalse(networkModelListener.allElementsinPathinService(atozmap, ztoamap));
215 void testAllElementsinPathinServiceShouldReturnTrue() {
216 assertTrue(networkModelListener.allElementsinPathinService(pathDescription.getAToZDirection().getAToZ(),
217 pathDescription.getZToADirection().getZToA()));
221 void testUpdateServicePathsShouldNotModifyServiceState() {
222 Map<ServicePathsKey, ServicePaths> servicePathMap = Map.of(new ServicePathsKey("service-path 1"),
223 new ServicePathsBuilder()
224 .setServicePathName("service-path 1")
225 .setPathDescription(pathDescription)
228 when(serviceDataStoreOperations.getServicePaths())
229 .thenReturn(Optional.of(new ServicePathListBuilder().setServicePaths(servicePathMap).build()));
230 when(serviceDataStoreOperations.modifyServicePath(any(PathDescription.class), anyString()))
231 .thenReturn(OperationResult.ok(""));
232 when(serviceDataStoreOperations.getService(anyString()))
233 .thenReturn(Optional.of(new ServicesBuilder()
234 .setServiceName("serviceTest")
235 .setOperationalState(State.InService)
236 .setAdministrativeState(AdminStates.InService)
239 Map<TopologyChangesKey, TopologyChanges> topologyChanges = Map.of(
240 new TopologyChangesKey("tpNodeIdC", "TpIdC1"),
241 new TopologyChangesBuilder()
242 .setNodeId("tpNodeIdC")
244 .setState(State.OutOfService)
246 new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
247 new TopologyChangesBuilder()
248 .setNodeId("tpNodeIdA")
250 .setState(State.InService)
253 networkModelListener.updateServicePaths(new TopologyUpdateResultBuilder()
254 .setTopologyChanges(topologyChanges).build());
255 verify(serviceDataStoreOperations, never())
256 .modifyService(anyString(), any(State.class), any(AdminStates.class));
260 void testUpdateServicePathsShouldModifyServiceState() {
261 Map<ServicePathsKey, ServicePaths> servicePathMap = Map.of(
262 new ServicePathsKey("service-path 1"),
263 new ServicePathsBuilder()
264 .setServicePathName("service-path 1")
265 .setPathDescription(pathDescription)
268 when(serviceDataStoreOperations.getServicePaths())
269 .thenReturn(Optional.of(new ServicePathListBuilder().setServicePaths(servicePathMap).build()));
270 when(serviceDataStoreOperations.modifyServicePath(any(PathDescription.class), anyString()))
271 .thenReturn(OperationResult.ok(""));
272 when(serviceDataStoreOperations.getService(anyString()))
273 .thenReturn(Optional.of(new ServicesBuilder()
274 .setServiceName("serviceTest")
275 .setOperationalState(State.InService)
276 .setAdministrativeState(AdminStates.InService)
278 when(serviceDataStoreOperations.modifyService(anyString(), any(State.class), any(AdminStates.class)))
279 .thenReturn(OperationResult.ok(""));
281 Map<TopologyChangesKey, TopologyChanges> topologyChanges = Map.of(
282 new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
283 new TopologyChangesBuilder()
284 .setNodeId("tpNodeIdA")
286 .setState(State.OutOfService)
289 networkModelListener.updateServicePaths(new TopologyUpdateResultBuilder()
290 .setTopologyChanges(topologyChanges).build());
291 verify(serviceDataStoreOperations, times(1))
292 .modifyService(anyString(), eq(State.OutOfService), any(AdminStates.class));
296 void testOnTopologyUpdateResultWhenNeverWired() {
297 NetworkModelListenerImpl networkModelListenerMocked = Mockito.mock(NetworkModelListenerImpl.class);
298 doCallRealMethod().when(networkModelListenerMocked).onTopologyUpdateResult(any(TopologyUpdateResult.class));
300 Map<TopologyChangesKey, TopologyChanges> topologyChanges1 = Map.of(
301 new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
302 new TopologyChangesBuilder()
303 .setNodeId("tpNodeIdA")
305 .setState(State.OutOfService)
307 Map<TopologyChangesKey, TopologyChanges> topologyChanges2 = Map.of(
308 new TopologyChangesKey("tpNodeIdC", "TpIdC1"),
309 new TopologyChangesBuilder()
310 .setNodeId("tpNodeIdC")
312 .setState(State.OutOfService)
315 networkModelListenerMocked.onTopologyUpdateResult(new TopologyUpdateResultBuilder()
316 .setTopologyChanges(topologyChanges1).build());
317 networkModelListenerMocked.onTopologyUpdateResult(new TopologyUpdateResultBuilder()
318 .setTopologyChanges(topologyChanges2).build());
319 verify(networkModelListenerMocked, times(2)).updateServicePaths(any(TopologyUpdateResult.class));
323 void testOnTopologyUpdateResultWhenAlreadyWired() {
324 NetworkModelListenerImpl networkModelListenerMocked = Mockito.mock(NetworkModelListenerImpl.class);
325 doCallRealMethod().when(networkModelListenerMocked).onTopologyUpdateResult(any(TopologyUpdateResult.class));
327 Map<TopologyChangesKey, TopologyChanges> topologyChanges = Map.of(
328 new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
329 new TopologyChangesBuilder()
330 .setNodeId("tpNodeIdA")
332 .setState(State.OutOfService)
334 TopologyUpdateResult topologyUpdateResult = new TopologyUpdateResultBuilder()
335 .setTopologyChanges(topologyChanges).build();
337 networkModelListenerMocked.onTopologyUpdateResult(topologyUpdateResult);
338 networkModelListenerMocked.onTopologyUpdateResult(topologyUpdateResult);
339 verify(networkModelListenerMocked, times(1)).updateServicePaths(any(TopologyUpdateResult.class));
342 private Map<AToZKey, AToZ> createMapAtoZ() {
343 Map<AToZKey, AToZ> atozmap = new HashMap<>();
348 .setResource(new ResourceBuilder()
349 .setResource(new TerminationPointBuilder()
350 .setTpNodeId("tpNodeIdA")
353 .setState(State.InService)
360 .setResource(new ResourceBuilder()
361 .setResource(new NodeBuilder()
362 .setNodeId("NodeIdA")
364 .setState(State.InService)
371 .setResource(new ResourceBuilder()
372 .setResource(new TerminationPointBuilder()
373 .setTpNodeId("tpNodeIdA")
376 .setState(State.InService)
383 .setResource(new ResourceBuilder()
384 .setResource(new LinkBuilder()
385 .setLinkId("LinkIdAZ")
387 .setState(State.InService)
394 .setResource(new ResourceBuilder()
395 .setResource(new TerminationPointBuilder()
396 .setTpNodeId("tpNodeIdZ")
399 .setState(State.InService)
406 .setResource(new ResourceBuilder()
407 .setResource(new NodeBuilder()
408 .setNodeId("NodeIdZ")
410 .setState(State.InService)
417 .setResource(new ResourceBuilder()
418 .setResource(new TerminationPointBuilder()
419 .setTpNodeId("tpNodeIdZ")
422 .setState(State.InService)
428 private Map<ZToAKey, ZToA> createMapZtoA() {
429 Map<ZToAKey, ZToA> ztoamap = new HashMap<>();
434 .setResource(new ResourceBuilder()
435 .setResource(new TerminationPointBuilder()
436 .setTpNodeId("tpNodeIdZ")
439 .setState(State.InService)
446 .setResource(new ResourceBuilder()
447 .setResource(new NodeBuilder()
448 .setNodeId("NodeIdZ")
450 .setState(State.InService)
457 .setResource(new ResourceBuilder()
458 .setResource(new TerminationPointBuilder()
459 .setTpNodeId("tpNodeIdZ")
462 .setState(State.InService)
469 .setResource(new ResourceBuilder()
470 .setResource(new LinkBuilder()
471 .setLinkId("LinkIdAZ")
473 .setState(State.InService)
480 .setResource(new ResourceBuilder()
481 .setResource(new TerminationPointBuilder()
482 .setTpNodeId("tpNodeIdA")
485 .setState(State.InService)
492 .setResource(new ResourceBuilder()
493 .setResource(new NodeBuilder()
494 .setNodeId("NodeIdA")
496 .setState(State.InService)
503 .setResource(new ResourceBuilder()
504 .setResource(new TerminationPointBuilder()
505 .setTpNodeId("tpNodeIdA")
508 .setState(State.InService)