93d1f95d4aaf293b0e74e47dbdccbbbe866c3d5d
[transportpce.git] / servicehandler / src / test / java / org / opendaylight / transportpce / servicehandler / listeners / NetworkModelListenerImplTest.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 NetworkModelListenerImplTest {
64
65     @Mock
66     private NotificationPublishService notificationPublishService;
67     @Mock
68     private ServiceDataStoreOperations serviceDataStoreOperations;
69     private static PathDescription pathDescription;
70     private NetworkModelListenerImpl 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 NetworkModelListenerImpl(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         NetworkModelListenerImpl networkModelListenerMocked = Mockito.mock(NetworkModelListenerImpl.class);
298         doCallRealMethod().when(networkModelListenerMocked).onTopologyUpdateResult(any(TopologyUpdateResult.class));
299
300         Map<TopologyChangesKey, TopologyChanges> topologyChanges1 = Map.of(
301                 new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
302                 new TopologyChangesBuilder()
303                         .setNodeId("tpNodeIdA")
304                         .setTpId("TpIdA1")
305                         .setState(State.OutOfService)
306                         .build());
307         Map<TopologyChangesKey, TopologyChanges> topologyChanges2 = Map.of(
308                 new TopologyChangesKey("tpNodeIdC", "TpIdC1"),
309                 new TopologyChangesBuilder()
310                         .setNodeId("tpNodeIdC")
311                         .setTpId("TpIdC1")
312                         .setState(State.OutOfService)
313                         .build());
314
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));
320     }
321
322     @Test
323     void testOnTopologyUpdateResultWhenAlreadyWired() {
324         NetworkModelListenerImpl networkModelListenerMocked = Mockito.mock(NetworkModelListenerImpl.class);
325         doCallRealMethod().when(networkModelListenerMocked).onTopologyUpdateResult(any(TopologyUpdateResult.class));
326
327         Map<TopologyChangesKey, TopologyChanges> topologyChanges = Map.of(
328                 new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
329                 new TopologyChangesBuilder()
330                         .setNodeId("tpNodeIdA")
331                         .setTpId("TpIdA1")
332                         .setState(State.OutOfService)
333                         .build());
334         TopologyUpdateResult topologyUpdateResult = new TopologyUpdateResultBuilder()
335                 .setTopologyChanges(topologyChanges).build();
336
337         networkModelListenerMocked.onTopologyUpdateResult(topologyUpdateResult);
338         networkModelListenerMocked.onTopologyUpdateResult(topologyUpdateResult);
339         verify(networkModelListenerMocked, times(1)).updateServicePaths(any(TopologyUpdateResult.class));
340     }
341
342     private Map<AToZKey, AToZ> createMapAtoZ() {
343         Map<AToZKey, AToZ> atozmap = new HashMap<>();
344         atozmap.put(
345                 new AToZKey("0"),
346                 new AToZBuilder()
347                         .setId("0")
348                         .setResource(new ResourceBuilder()
349                                 .setResource(new TerminationPointBuilder()
350                                         .setTpNodeId("tpNodeIdA")
351                                         .setTpId("TpIdA1")
352                                         .build())
353                                 .setState(State.InService)
354                                 .build())
355                         .build());
356         atozmap.put(
357                 new AToZKey("1"),
358                 new AToZBuilder()
359                         .setId("1")
360                         .setResource(new ResourceBuilder()
361                                 .setResource(new NodeBuilder()
362                                         .setNodeId("NodeIdA")
363                                         .build())
364                                 .setState(State.InService)
365                                 .build())
366                         .build());
367         atozmap.put(
368                 new AToZKey("2"),
369                 new AToZBuilder()
370                         .setId("2")
371                         .setResource(new ResourceBuilder()
372                                 .setResource(new TerminationPointBuilder()
373                                         .setTpNodeId("tpNodeIdA")
374                                         .setTpId("TpIdA2")
375                                         .build())
376                                 .setState(State.InService)
377                                 .build())
378                         .build());
379         atozmap.put(
380                 new AToZKey("3"),
381                 new AToZBuilder()
382                         .setId("3")
383                         .setResource(new ResourceBuilder()
384                                 .setResource(new LinkBuilder()
385                                         .setLinkId("LinkIdAZ")
386                                         .build())
387                                 .setState(State.InService)
388                                 .build())
389                         .build());
390         atozmap.put(
391                 new AToZKey("4"),
392                 new AToZBuilder()
393                         .setId("4")
394                         .setResource(new ResourceBuilder()
395                                 .setResource(new TerminationPointBuilder()
396                                         .setTpNodeId("tpNodeIdZ")
397                                         .setTpId("TpIdZ2")
398                                         .build())
399                                 .setState(State.InService)
400                                 .build())
401                         .build());
402         atozmap.put(
403                 new AToZKey("5"),
404                 new AToZBuilder()
405                         .setId("5")
406                         .setResource(new ResourceBuilder()
407                                 .setResource(new NodeBuilder()
408                                         .setNodeId("NodeIdZ")
409                                         .build())
410                                 .setState(State.InService)
411                                 .build())
412                         .build());
413         atozmap.put(
414                 new AToZKey("6"),
415                 new AToZBuilder()
416                         .setId("6")
417                         .setResource(new ResourceBuilder()
418                                 .setResource(new TerminationPointBuilder()
419                                         .setTpNodeId("tpNodeIdZ")
420                                         .setTpId("TpIdZ1")
421                                         .build())
422                                 .setState(State.InService)
423                                 .build())
424                         .build());
425         return atozmap;
426     }
427
428     private Map<ZToAKey, ZToA> createMapZtoA() {
429         Map<ZToAKey, ZToA> ztoamap = new HashMap<>();
430         ztoamap.put(
431                 new ZToAKey("0"),
432                 new ZToABuilder()
433                         .setId("0")
434                         .setResource(new ResourceBuilder()
435                                 .setResource(new TerminationPointBuilder()
436                                         .setTpNodeId("tpNodeIdZ")
437                                         .setTpId("TpIdZ1")
438                                         .build())
439                                 .setState(State.InService)
440                                 .build())
441                         .build());
442         ztoamap.put(
443                 new ZToAKey("1"),
444                 new ZToABuilder()
445                         .setId("1")
446                         .setResource(new ResourceBuilder()
447                                 .setResource(new NodeBuilder()
448                                         .setNodeId("NodeIdZ")
449                                         .build())
450                                 .setState(State.InService)
451                                 .build())
452                         .build());
453         ztoamap.put(
454                 new ZToAKey("2"),
455                 new ZToABuilder()
456                         .setId("2")
457                         .setResource(new ResourceBuilder()
458                                 .setResource(new TerminationPointBuilder()
459                                         .setTpNodeId("tpNodeIdZ")
460                                         .setTpId("TpIdZ2")
461                                         .build())
462                                 .setState(State.InService)
463                                 .build())
464                         .build());
465         ztoamap.put(
466                 new ZToAKey("3"),
467                 new ZToABuilder()
468                         .setId("3")
469                         .setResource(new ResourceBuilder()
470                                 .setResource(new LinkBuilder()
471                                         .setLinkId("LinkIdAZ")
472                                         .build())
473                                 .setState(State.InService)
474                                 .build())
475                         .build());
476         ztoamap.put(
477                 new ZToAKey("4"),
478                 new ZToABuilder()
479                         .setId("4")
480                         .setResource(new ResourceBuilder()
481                                 .setResource(new TerminationPointBuilder()
482                                         .setTpNodeId("tpNodeIdA")
483                                         .setTpId("TpIdA2")
484                                         .build())
485                                 .setState(State.InService)
486                                 .build())
487                         .build());
488         ztoamap.put(
489                 new ZToAKey("5"),
490                 new ZToABuilder()
491                         .setId("5")
492                         .setResource(new ResourceBuilder()
493                                 .setResource(new NodeBuilder()
494                                         .setNodeId("NodeIdA")
495                                         .build())
496                                 .setState(State.InService)
497                                 .build())
498                         .build());
499         ztoamap.put(
500                 new ZToAKey("6"),
501                 new ZToABuilder()
502                         .setId("6")
503                         .setResource(new ResourceBuilder()
504                                 .setResource(new TerminationPointBuilder()
505                                         .setTpNodeId("tpNodeIdA")
506                                         .setTpId("TpIdA1")
507                                         .build())
508                                 .setState(State.InService)
509                                 .build())
510                         .build());
511         return ztoamap;
512     }
513 }