Don't use NotificationListener (Servicehandler)
[transportpce.git] / servicehandler / src / test / java / org / opendaylight / transportpce / servicehandler / listeners / NetworkModelNotificationHandlerTest.java
1 /*
2  * Copyright © 2022 Orange, Inc. and others.  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.servicehandler.listeners;
10
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;
22
23 import java.util.HashMap;
24 import java.util.Map;
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;
61
62 @ExtendWith(MockitoExtension.class)
63 public class NetworkModelNotificationHandlerTest {
64
65     @Mock
66     private NotificationPublishService notificationPublishService;
67     @Mock
68     private ServiceDataStoreOperations serviceDataStoreOperations;
69     private static PathDescription pathDescription;
70     private NetworkModelNotificationHandler networkModelListener;
71
72     @BeforeEach
73     void setUp() {
74         pathDescription = new PathDescriptionBuilder()
75                 .setAToZDirection(new AToZDirectionBuilder().setAToZ(new HashMap<>(createMapAtoZ())).build())
76                 .setZToADirection(new ZToADirectionBuilder().setZToA(new HashMap<>(createMapZtoA())).build())
77                 .build();
78         networkModelListener = new NetworkModelNotificationHandler(notificationPublishService,
79                 serviceDataStoreOperations);
80     }
81
82     @Test
83     void testChangePathElementStateZAShouldNotModifyPathDescriptionsElementStates() {
84         Map<TopologyChangesKey, TopologyChanges> topologyChanges = Map.of(
85                 new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
86                 new TopologyChangesBuilder()
87                         .setNodeId("tpNodeIdA")
88                         .setTpId("TpIdA1")
89                         .setState(State.InService)
90                         .build(),
91                 new TopologyChangesKey("tpNodeIdA", "TpIdA2"),
92                 new TopologyChangesBuilder()
93                         .setNodeId("tpNodeIdA")
94                         .setTpId("TpIdA2")
95                         .setState(State.InService)
96                         .build()
97         );
98
99         assertEquals(
100             pathDescription.getZToADirection().getZToA(),
101             networkModelListener.changePathElementStateZA(topologyChanges, pathDescription));
102     }
103
104     @Test
105     void testChangePathElementStateZAShouldModifyPathDescriptionsElementStates() {
106         Map<TopologyChangesKey, TopologyChanges> topologyChanges = Map.of(
107                 new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
108                 new TopologyChangesBuilder()
109                         .setNodeId("tpNodeIdA")
110                         .setTpId("TpIdA1")
111                         .setState(State.OutOfService)
112                         .build(),
113                 new TopologyChangesKey("tpNodeIdA", "TpIdA2"),
114                 new TopologyChangesBuilder()
115                         .setNodeId("tpNodeIdA")
116                         .setTpId("TpIdA2")
117                         .setState(State.OutOfService)
118                         .build());
119
120         Map<ZToAKey, ZToA> ztoamapExpected = pathDescription.getZToADirection().getZToA();
121         ztoamapExpected.computeIfPresent(
122                 new ZToAKey("6"),
123                 (zToAKey, zToA) -> new ZToABuilder(zToA)
124                         .setResource(new ResourceBuilder(zToA.getResource())
125                                 .setState(State.OutOfService)
126                                 .build())
127                         .build());
128         ztoamapExpected.computeIfPresent(
129                 new ZToAKey("4"),
130                 (zToAKey, zToA) -> new ZToABuilder(zToA)
131                         .setResource(new ResourceBuilder(zToA.getResource())
132                                 .setState(State.OutOfService)
133                                 .build())
134                         .build());
135         assertEquals(ztoamapExpected, networkModelListener.changePathElementStateZA(topologyChanges, pathDescription));
136     }
137
138     @Test
139     void testChangePathElementStateAZShouldNotModifyPathDescriptionsElementStates() {
140         Map<TopologyChangesKey, TopologyChanges> topologyChanges = Map.of(
141                 new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
142                 new TopologyChangesBuilder()
143                         .setNodeId("tpNodeIdA")
144                         .setTpId("TpIdA1")
145                         .setState(State.InService)
146                         .build(),
147                 new TopologyChangesKey("tpNodeIdA", "TpIdA2"),
148                 new TopologyChangesBuilder()
149                         .setNodeId("tpNodeIdA")
150                         .setTpId("TpIdA2")
151                         .setState(State.InService)
152                         .build());
153
154         assertEquals(
155             pathDescription.getAToZDirection().getAToZ(),
156             networkModelListener.changePathElementStateAZ(topologyChanges, pathDescription));
157     }
158
159     @Test
160     void testChangePathElementStateAZShouldModifyPathDescriptionsElementStates() {
161         Map<TopologyChangesKey, TopologyChanges> topologyChanges = Map.of(
162                 new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
163                 new TopologyChangesBuilder()
164                         .setNodeId("tpNodeIdA")
165                         .setTpId("TpIdA1")
166                         .setState(State.OutOfService)
167                         .build(),
168                 new TopologyChangesKey("tpNodeIdA", "TpIdA2"),
169                 new TopologyChangesBuilder()
170                         .setNodeId("tpNodeIdA")
171                         .setTpId("TpIdA2")
172                         .setState(State.OutOfService)
173                         .build());
174
175         Map<AToZKey, AToZ> atozmapExpected = pathDescription.getAToZDirection().getAToZ();
176         atozmapExpected.computeIfPresent(
177                 new AToZKey("0"),
178                 (aToZKey, aToZ) -> new AToZBuilder(aToZ)
179                         .setResource(new ResourceBuilder(aToZ.getResource())
180                                 .setState(State.OutOfService)
181                                 .build())
182                         .build());
183         atozmapExpected.computeIfPresent(
184                 new AToZKey("2"),
185                 (aToZKey, aToZ) -> new AToZBuilder(aToZ)
186                         .setResource(new ResourceBuilder(aToZ.getResource())
187                                 .setState(State.OutOfService)
188                                 .build())
189                         .build());
190         assertEquals(atozmapExpected, networkModelListener.changePathElementStateAZ(topologyChanges, pathDescription));
191     }
192
193     @Test
194     void testAllElementsinPathinServiceShouldReturnFalse() {
195         Map<AToZKey, AToZ> atozmap = pathDescription.getAToZDirection().getAToZ();
196         atozmap.computeIfPresent(
197                 new AToZKey("0"),
198                 (aToZKey, aToZ) -> new AToZBuilder(aToZ)
199                         .setResource(new ResourceBuilder(aToZ.getResource())
200                                 .setState(State.OutOfService)
201                                 .build())
202                         .build());
203         Map<ZToAKey, ZToA> ztoamap = pathDescription.getZToADirection().getZToA();
204         ztoamap.computeIfPresent(
205                 new ZToAKey("6"),
206                 (zToAKey, zToA) -> new ZToABuilder(zToA)
207                         .setResource(new ResourceBuilder(zToA.getResource())
208                                 .setState(State.OutOfService)
209                                 .build())
210                         .build());
211         assertFalse(networkModelListener.allElementsinPathinService(atozmap, ztoamap));
212     }
213
214     @Test
215     void testAllElementsinPathinServiceShouldReturnTrue() {
216         assertTrue(networkModelListener.allElementsinPathinService(pathDescription.getAToZDirection().getAToZ(),
217                 pathDescription.getZToADirection().getZToA()));
218     }
219
220     @Test
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)
226                         .build());
227
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)
237                     .build()));
238
239         Map<TopologyChangesKey, TopologyChanges> topologyChanges = Map.of(
240                 new TopologyChangesKey("tpNodeIdC", "TpIdC1"),
241                 new TopologyChangesBuilder()
242                         .setNodeId("tpNodeIdC")
243                         .setTpId("TpIdC1")
244                         .setState(State.OutOfService)
245                         .build(),
246                 new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
247                 new TopologyChangesBuilder()
248                         .setNodeId("tpNodeIdA")
249                         .setTpId("TpIdA1")
250                         .setState(State.InService)
251                         .build());
252
253         networkModelListener.updateServicePaths(new TopologyUpdateResultBuilder()
254                 .setTopologyChanges(topologyChanges).build());
255         verify(serviceDataStoreOperations, never())
256             .modifyService(anyString(), any(State.class), any(AdminStates.class));
257     }
258
259     @Test
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)
266                         .build());
267
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)
277                     .build()));
278         when(serviceDataStoreOperations.modifyService(anyString(), any(State.class), any(AdminStates.class)))
279             .thenReturn(OperationResult.ok(""));
280
281         Map<TopologyChangesKey, TopologyChanges> topologyChanges = Map.of(
282                 new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
283                 new TopologyChangesBuilder()
284                         .setNodeId("tpNodeIdA")
285                         .setTpId("TpIdA1")
286                         .setState(State.OutOfService)
287                         .build());
288
289         networkModelListener.updateServicePaths(new TopologyUpdateResultBuilder()
290                 .setTopologyChanges(topologyChanges).build());
291         verify(serviceDataStoreOperations, times(1))
292             .modifyService(anyString(), eq(State.OutOfService), any(AdminStates.class));
293     }
294
295     @Test
296     void testOnTopologyUpdateResultWhenNeverWired() {
297         NetworkModelNotificationHandler networkModelListenerMocked = Mockito.mock(
298             NetworkModelNotificationHandler.class);
299         doCallRealMethod().when(networkModelListenerMocked).onTopologyUpdateResult(any(TopologyUpdateResult.class));
300
301         Map<TopologyChangesKey, TopologyChanges> topologyChanges1 = Map.of(
302                 new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
303                 new TopologyChangesBuilder()
304                         .setNodeId("tpNodeIdA")
305                         .setTpId("TpIdA1")
306                         .setState(State.OutOfService)
307                         .build());
308         Map<TopologyChangesKey, TopologyChanges> topologyChanges2 = Map.of(
309                 new TopologyChangesKey("tpNodeIdC", "TpIdC1"),
310                 new TopologyChangesBuilder()
311                         .setNodeId("tpNodeIdC")
312                         .setTpId("TpIdC1")
313                         .setState(State.OutOfService)
314                         .build());
315
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));
321     }
322
323     @Test
324     void testOnTopologyUpdateResultWhenAlreadyWired() {
325         NetworkModelNotificationHandler networkModelListenerMocked = Mockito.mock(
326             NetworkModelNotificationHandler.class);
327         doCallRealMethod().when(networkModelListenerMocked).onTopologyUpdateResult(any(TopologyUpdateResult.class));
328
329         Map<TopologyChangesKey, TopologyChanges> topologyChanges = Map.of(
330                 new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
331                 new TopologyChangesBuilder()
332                         .setNodeId("tpNodeIdA")
333                         .setTpId("TpIdA1")
334                         .setState(State.OutOfService)
335                         .build());
336         TopologyUpdateResult topologyUpdateResult = new TopologyUpdateResultBuilder()
337                 .setTopologyChanges(topologyChanges).build();
338
339         networkModelListenerMocked.onTopologyUpdateResult(topologyUpdateResult);
340         networkModelListenerMocked.onTopologyUpdateResult(topologyUpdateResult);
341         verify(networkModelListenerMocked, times(1)).updateServicePaths(any(TopologyUpdateResult.class));
342     }
343
344     private Map<AToZKey, AToZ> createMapAtoZ() {
345         Map<AToZKey, AToZ> atozmap = new HashMap<>();
346         atozmap.put(
347                 new AToZKey("0"),
348                 new AToZBuilder()
349                         .setId("0")
350                         .setResource(new ResourceBuilder()
351                                 .setResource(new TerminationPointBuilder()
352                                         .setTpNodeId("tpNodeIdA")
353                                         .setTpId("TpIdA1")
354                                         .build())
355                                 .setState(State.InService)
356                                 .build())
357                         .build());
358         atozmap.put(
359                 new AToZKey("1"),
360                 new AToZBuilder()
361                         .setId("1")
362                         .setResource(new ResourceBuilder()
363                                 .setResource(new NodeBuilder()
364                                         .setNodeId("NodeIdA")
365                                         .build())
366                                 .setState(State.InService)
367                                 .build())
368                         .build());
369         atozmap.put(
370                 new AToZKey("2"),
371                 new AToZBuilder()
372                         .setId("2")
373                         .setResource(new ResourceBuilder()
374                                 .setResource(new TerminationPointBuilder()
375                                         .setTpNodeId("tpNodeIdA")
376                                         .setTpId("TpIdA2")
377                                         .build())
378                                 .setState(State.InService)
379                                 .build())
380                         .build());
381         atozmap.put(
382                 new AToZKey("3"),
383                 new AToZBuilder()
384                         .setId("3")
385                         .setResource(new ResourceBuilder()
386                                 .setResource(new LinkBuilder()
387                                         .setLinkId("LinkIdAZ")
388                                         .build())
389                                 .setState(State.InService)
390                                 .build())
391                         .build());
392         atozmap.put(
393                 new AToZKey("4"),
394                 new AToZBuilder()
395                         .setId("4")
396                         .setResource(new ResourceBuilder()
397                                 .setResource(new TerminationPointBuilder()
398                                         .setTpNodeId("tpNodeIdZ")
399                                         .setTpId("TpIdZ2")
400                                         .build())
401                                 .setState(State.InService)
402                                 .build())
403                         .build());
404         atozmap.put(
405                 new AToZKey("5"),
406                 new AToZBuilder()
407                         .setId("5")
408                         .setResource(new ResourceBuilder()
409                                 .setResource(new NodeBuilder()
410                                         .setNodeId("NodeIdZ")
411                                         .build())
412                                 .setState(State.InService)
413                                 .build())
414                         .build());
415         atozmap.put(
416                 new AToZKey("6"),
417                 new AToZBuilder()
418                         .setId("6")
419                         .setResource(new ResourceBuilder()
420                                 .setResource(new TerminationPointBuilder()
421                                         .setTpNodeId("tpNodeIdZ")
422                                         .setTpId("TpIdZ1")
423                                         .build())
424                                 .setState(State.InService)
425                                 .build())
426                         .build());
427         return atozmap;
428     }
429
430     private Map<ZToAKey, ZToA> createMapZtoA() {
431         Map<ZToAKey, ZToA> ztoamap = new HashMap<>();
432         ztoamap.put(
433                 new ZToAKey("0"),
434                 new ZToABuilder()
435                         .setId("0")
436                         .setResource(new ResourceBuilder()
437                                 .setResource(new TerminationPointBuilder()
438                                         .setTpNodeId("tpNodeIdZ")
439                                         .setTpId("TpIdZ1")
440                                         .build())
441                                 .setState(State.InService)
442                                 .build())
443                         .build());
444         ztoamap.put(
445                 new ZToAKey("1"),
446                 new ZToABuilder()
447                         .setId("1")
448                         .setResource(new ResourceBuilder()
449                                 .setResource(new NodeBuilder()
450                                         .setNodeId("NodeIdZ")
451                                         .build())
452                                 .setState(State.InService)
453                                 .build())
454                         .build());
455         ztoamap.put(
456                 new ZToAKey("2"),
457                 new ZToABuilder()
458                         .setId("2")
459                         .setResource(new ResourceBuilder()
460                                 .setResource(new TerminationPointBuilder()
461                                         .setTpNodeId("tpNodeIdZ")
462                                         .setTpId("TpIdZ2")
463                                         .build())
464                                 .setState(State.InService)
465                                 .build())
466                         .build());
467         ztoamap.put(
468                 new ZToAKey("3"),
469                 new ZToABuilder()
470                         .setId("3")
471                         .setResource(new ResourceBuilder()
472                                 .setResource(new LinkBuilder()
473                                         .setLinkId("LinkIdAZ")
474                                         .build())
475                                 .setState(State.InService)
476                                 .build())
477                         .build());
478         ztoamap.put(
479                 new ZToAKey("4"),
480                 new ZToABuilder()
481                         .setId("4")
482                         .setResource(new ResourceBuilder()
483                                 .setResource(new TerminationPointBuilder()
484                                         .setTpNodeId("tpNodeIdA")
485                                         .setTpId("TpIdA2")
486                                         .build())
487                                 .setState(State.InService)
488                                 .build())
489                         .build());
490         ztoamap.put(
491                 new ZToAKey("5"),
492                 new ZToABuilder()
493                         .setId("5")
494                         .setResource(new ResourceBuilder()
495                                 .setResource(new NodeBuilder()
496                                         .setNodeId("NodeIdA")
497                                         .build())
498                                 .setState(State.InService)
499                                 .build())
500                         .build());
501         ztoamap.put(
502                 new ZToAKey("6"),
503                 new ZToABuilder()
504                         .setId("6")
505                         .setResource(new ResourceBuilder()
506                                 .setResource(new TerminationPointBuilder()
507                                         .setTpNodeId("tpNodeIdA")
508                                         .setTpId("TpIdA1")
509                                         .build())
510                                 .setState(State.InService)
511                                 .build())
512                         .build());
513         return ztoamap;
514     }
515 }