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.rev230526.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 NetworkModelNotificationHandlerTest {
66 private NotificationPublishService notificationPublishService;
68 private ServiceDataStoreOperations serviceDataStoreOperations;
69 private static PathDescription pathDescription;
70 private NetworkModelNotificationHandler 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 NetworkModelNotificationHandler(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 NetworkModelNotificationHandler networkModelListenerMocked = Mockito.mock(
298 NetworkModelNotificationHandler.class);
299 doCallRealMethod().when(networkModelListenerMocked).onTopologyUpdateResult(any(TopologyUpdateResult.class));
301 Map<TopologyChangesKey, TopologyChanges> topologyChanges1 = Map.of(
302 new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
303 new TopologyChangesBuilder()
304 .setNodeId("tpNodeIdA")
306 .setState(State.OutOfService)
308 Map<TopologyChangesKey, TopologyChanges> topologyChanges2 = Map.of(
309 new TopologyChangesKey("tpNodeIdC", "TpIdC1"),
310 new TopologyChangesBuilder()
311 .setNodeId("tpNodeIdC")
313 .setState(State.OutOfService)
316 networkModelListenerMocked.onTopologyUpdateResult(new TopologyUpdateResultBuilder()
317 .setTopologyChanges(topologyChanges1).build());
318 networkModelListenerMocked.onTopologyUpdateResult(new TopologyUpdateResultBuilder()
319 .setTopologyChanges(topologyChanges2).build());
320 verify(networkModelListenerMocked, times(2)).updateServicePaths(any(TopologyUpdateResult.class));
324 void testOnTopologyUpdateResultWhenAlreadyWired() {
325 NetworkModelNotificationHandler networkModelListenerMocked = Mockito.mock(
326 NetworkModelNotificationHandler.class);
327 doCallRealMethod().when(networkModelListenerMocked).onTopologyUpdateResult(any(TopologyUpdateResult.class));
329 Map<TopologyChangesKey, TopologyChanges> topologyChanges = Map.of(
330 new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
331 new TopologyChangesBuilder()
332 .setNodeId("tpNodeIdA")
334 .setState(State.OutOfService)
336 TopologyUpdateResult topologyUpdateResult = new TopologyUpdateResultBuilder()
337 .setTopologyChanges(topologyChanges).build();
339 networkModelListenerMocked.onTopologyUpdateResult(topologyUpdateResult);
340 networkModelListenerMocked.onTopologyUpdateResult(topologyUpdateResult);
341 verify(networkModelListenerMocked, times(1)).updateServicePaths(any(TopologyUpdateResult.class));
344 private Map<AToZKey, AToZ> createMapAtoZ() {
345 Map<AToZKey, AToZ> atozmap = new HashMap<>();
350 .setResource(new ResourceBuilder()
351 .setResource(new TerminationPointBuilder()
352 .setTpNodeId("tpNodeIdA")
355 .setState(State.InService)
362 .setResource(new ResourceBuilder()
363 .setResource(new NodeBuilder()
364 .setNodeId("NodeIdA")
366 .setState(State.InService)
373 .setResource(new ResourceBuilder()
374 .setResource(new TerminationPointBuilder()
375 .setTpNodeId("tpNodeIdA")
378 .setState(State.InService)
385 .setResource(new ResourceBuilder()
386 .setResource(new LinkBuilder()
387 .setLinkId("LinkIdAZ")
389 .setState(State.InService)
396 .setResource(new ResourceBuilder()
397 .setResource(new TerminationPointBuilder()
398 .setTpNodeId("tpNodeIdZ")
401 .setState(State.InService)
408 .setResource(new ResourceBuilder()
409 .setResource(new NodeBuilder()
410 .setNodeId("NodeIdZ")
412 .setState(State.InService)
419 .setResource(new ResourceBuilder()
420 .setResource(new TerminationPointBuilder()
421 .setTpNodeId("tpNodeIdZ")
424 .setState(State.InService)
430 private Map<ZToAKey, ZToA> createMapZtoA() {
431 Map<ZToAKey, ZToA> ztoamap = new HashMap<>();
436 .setResource(new ResourceBuilder()
437 .setResource(new TerminationPointBuilder()
438 .setTpNodeId("tpNodeIdZ")
441 .setState(State.InService)
448 .setResource(new ResourceBuilder()
449 .setResource(new NodeBuilder()
450 .setNodeId("NodeIdZ")
452 .setState(State.InService)
459 .setResource(new ResourceBuilder()
460 .setResource(new TerminationPointBuilder()
461 .setTpNodeId("tpNodeIdZ")
464 .setState(State.InService)
471 .setResource(new ResourceBuilder()
472 .setResource(new LinkBuilder()
473 .setLinkId("LinkIdAZ")
475 .setState(State.InService)
482 .setResource(new ResourceBuilder()
483 .setResource(new TerminationPointBuilder()
484 .setTpNodeId("tpNodeIdA")
487 .setState(State.InService)
494 .setResource(new ResourceBuilder()
495 .setResource(new NodeBuilder()
496 .setNodeId("NodeIdA")
498 .setState(State.InService)
505 .setResource(new ResourceBuilder()
506 .setResource(new TerminationPointBuilder()
507 .setTpNodeId("tpNodeIdA")
510 .setState(State.InService)