Update docs conf.yaml version to Sulfur
[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.Assert.assertEquals;
12 import static org.junit.Assert.assertFalse;
13 import static org.junit.Assert.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.Before;
27 import org.junit.Test;
28 import org.junit.runner.RunWith;
29 import org.mockito.Mock;
30 import org.mockito.Mockito;
31 import org.mockito.junit.MockitoJUnitRunner;
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.rev210705.path.description.AToZDirectionBuilder;
44 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ZToADirectionBuilder;
45 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZ;
46 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZBuilder;
47 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZKey;
48 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ztoa.direction.ZToA;
49 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ztoa.direction.ZToABuilder;
50 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ztoa.direction.ZToAKey;
51 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.ResourceBuilder;
52 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.resource.resource.LinkBuilder;
53 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.resource.resource.NodeBuilder;
54 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.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 @RunWith(MockitoJUnitRunner.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     @Before
73     public 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     public 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(pathDescription.getZToADirection().getZToA(),
100                 networkModelListener.changePathElementStateZA(topologyChanges, pathDescription));
101     }
102
103     @Test
104     public void testChangePathElementStateZAShouldModifyPathDescriptionsElementStates() {
105         Map<TopologyChangesKey, TopologyChanges> topologyChanges = Map.of(
106                 new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
107                 new TopologyChangesBuilder()
108                         .setNodeId("tpNodeIdA")
109                         .setTpId("TpIdA1")
110                         .setState(State.OutOfService)
111                         .build(),
112                 new TopologyChangesKey("tpNodeIdA", "TpIdA2"),
113                 new TopologyChangesBuilder()
114                         .setNodeId("tpNodeIdA")
115                         .setTpId("TpIdA2")
116                         .setState(State.OutOfService)
117                         .build());
118
119         Map<ZToAKey, ZToA> ztoamapExpected = pathDescription.getZToADirection().getZToA();
120         ztoamapExpected.computeIfPresent(
121                 new ZToAKey("6"),
122                 (zToAKey, zToA) -> new ZToABuilder(zToA)
123                         .setResource(new ResourceBuilder(zToA.getResource())
124                                 .setState(State.OutOfService)
125                                 .build())
126                         .build());
127         ztoamapExpected.computeIfPresent(
128                 new ZToAKey("4"),
129                 (zToAKey, zToA) -> new ZToABuilder(zToA)
130                         .setResource(new ResourceBuilder(zToA.getResource())
131                                 .setState(State.OutOfService)
132                                 .build())
133                         .build());
134         assertEquals(ztoamapExpected, networkModelListener.changePathElementStateZA(topologyChanges, pathDescription));
135     }
136
137     @Test
138     public void testChangePathElementStateAZShouldNotModifyPathDescriptionsElementStates() {
139         Map<TopologyChangesKey, TopologyChanges> topologyChanges = Map.of(
140                 new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
141                 new TopologyChangesBuilder()
142                         .setNodeId("tpNodeIdA")
143                         .setTpId("TpIdA1")
144                         .setState(State.InService)
145                         .build(),
146                 new TopologyChangesKey("tpNodeIdA", "TpIdA2"),
147                 new TopologyChangesBuilder()
148                         .setNodeId("tpNodeIdA")
149                         .setTpId("TpIdA2")
150                         .setState(State.InService)
151                         .build());
152
153         assertEquals(pathDescription.getAToZDirection().getAToZ(),
154                 networkModelListener.changePathElementStateAZ(topologyChanges, pathDescription));
155     }
156
157     @Test
158     public void testChangePathElementStateAZShouldModifyPathDescriptionsElementStates() {
159         Map<TopologyChangesKey, TopologyChanges> topologyChanges = Map.of(
160                 new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
161                 new TopologyChangesBuilder()
162                         .setNodeId("tpNodeIdA")
163                         .setTpId("TpIdA1")
164                         .setState(State.OutOfService)
165                         .build(),
166                 new TopologyChangesKey("tpNodeIdA", "TpIdA2"),
167                 new TopologyChangesBuilder()
168                         .setNodeId("tpNodeIdA")
169                         .setTpId("TpIdA2")
170                         .setState(State.OutOfService)
171                         .build());
172
173         Map<AToZKey, AToZ> atozmapExpected = pathDescription.getAToZDirection().getAToZ();
174         atozmapExpected.computeIfPresent(
175                 new AToZKey("0"),
176                 (aToZKey, aToZ) -> new AToZBuilder(aToZ)
177                         .setResource(new ResourceBuilder(aToZ.getResource())
178                                 .setState(State.OutOfService)
179                                 .build())
180                         .build());
181         atozmapExpected.computeIfPresent(
182                 new AToZKey("2"),
183                 (aToZKey, aToZ) -> new AToZBuilder(aToZ)
184                         .setResource(new ResourceBuilder(aToZ.getResource())
185                                 .setState(State.OutOfService)
186                                 .build())
187                         .build());
188         assertEquals(atozmapExpected, networkModelListener.changePathElementStateAZ(topologyChanges, pathDescription));
189     }
190
191     @Test
192     public void testAllElementsinPathinServiceShouldReturnFalse() {
193         Map<AToZKey, AToZ> atozmap = pathDescription.getAToZDirection().getAToZ();
194         atozmap.computeIfPresent(
195                 new AToZKey("0"),
196                 (aToZKey, aToZ) -> new AToZBuilder(aToZ)
197                         .setResource(new ResourceBuilder(aToZ.getResource())
198                                 .setState(State.OutOfService)
199                                 .build())
200                         .build());
201         Map<ZToAKey, ZToA> ztoamap = pathDescription.getZToADirection().getZToA();
202         ztoamap.computeIfPresent(
203                 new ZToAKey("6"),
204                 (zToAKey, zToA) -> new ZToABuilder(zToA)
205                         .setResource(new ResourceBuilder(zToA.getResource())
206                                 .setState(State.OutOfService)
207                                 .build())
208                         .build());
209         assertFalse(networkModelListener.allElementsinPathinService(atozmap, ztoamap));
210     }
211
212     @Test
213     public void testAllElementsinPathinServiceShouldReturnTrue() {
214         assertTrue(networkModelListener.allElementsinPathinService(pathDescription.getAToZDirection().getAToZ(),
215                 pathDescription.getZToADirection().getZToA()));
216     }
217
218     @Test
219     public void testUpdateServicePathsShouldNotModifyServiceState() {
220         Map<ServicePathsKey, ServicePaths> servicePathMap = Map.of(new ServicePathsKey("service-path 1"),
221                 new ServicePathsBuilder()
222                         .setServicePathName("service-path 1")
223                         .setPathDescription(pathDescription)
224                         .build());
225
226         when(serviceDataStoreOperations.getServicePaths()).thenReturn(Optional.of(new ServicePathListBuilder()
227                 .setServicePaths(servicePathMap).build()));
228         when(serviceDataStoreOperations.modifyServicePath(any(PathDescription.class), anyString()))
229                 .thenReturn(OperationResult.ok(""));
230         when(serviceDataStoreOperations.getService(anyString())).thenReturn(Optional.of(
231                 new ServicesBuilder().setServiceName("serviceTest")
232                         .setOperationalState(State.InService)
233                         .setAdministrativeState(AdminStates.InService)
234                         .build()));
235
236         Map<TopologyChangesKey, TopologyChanges> topologyChanges = Map.of(
237                 new TopologyChangesKey("tpNodeIdC", "TpIdC1"),
238                 new TopologyChangesBuilder()
239                         .setNodeId("tpNodeIdC")
240                         .setTpId("TpIdC1")
241                         .setState(State.OutOfService)
242                         .build(),
243                 new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
244                 new TopologyChangesBuilder()
245                         .setNodeId("tpNodeIdA")
246                         .setTpId("TpIdA1")
247                         .setState(State.InService)
248                         .build());
249
250         networkModelListener.updateServicePaths(new TopologyUpdateResultBuilder()
251                 .setTopologyChanges(topologyChanges).build());
252         verify(serviceDataStoreOperations,
253                 never()).modifyService(anyString(), any(State.class), any(AdminStates.class));
254     }
255
256     @Test
257     public void testUpdateServicePathsShouldModifyServiceState() {
258         Map<ServicePathsKey, ServicePaths> servicePathMap = Map.of(
259                 new ServicePathsKey("service-path 1"),
260                 new ServicePathsBuilder()
261                         .setServicePathName("service-path 1")
262                         .setPathDescription(pathDescription)
263                         .build());
264
265         when(serviceDataStoreOperations.getServicePaths()).thenReturn(Optional.of(new ServicePathListBuilder()
266                 .setServicePaths(servicePathMap).build()));
267         when(serviceDataStoreOperations.modifyServicePath(any(PathDescription.class), anyString()))
268                 .thenReturn(OperationResult.ok(""));
269         when(serviceDataStoreOperations.getService(anyString())).thenReturn(Optional.of(
270                 new ServicesBuilder().setServiceName("serviceTest")
271                         .setOperationalState(State.InService)
272                         .setAdministrativeState(AdminStates.InService)
273                         .build()));
274         when(serviceDataStoreOperations.modifyService(anyString(), any(State.class), any(AdminStates.class)))
275                 .thenReturn(OperationResult.ok(""));
276
277         Map<TopologyChangesKey, TopologyChanges> topologyChanges = Map.of(
278                 new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
279                 new TopologyChangesBuilder()
280                         .setNodeId("tpNodeIdA")
281                         .setTpId("TpIdA1")
282                         .setState(State.OutOfService)
283                         .build());
284
285         networkModelListener.updateServicePaths(new TopologyUpdateResultBuilder()
286                 .setTopologyChanges(topologyChanges).build());
287         verify(serviceDataStoreOperations, times(1)).modifyService(anyString(),
288                 eq(State.OutOfService), any(AdminStates.class));
289     }
290
291     @Test
292     public void testOnTopologyUpdateResultWhenNeverWired() {
293         NetworkModelListenerImpl networkModelListenerMocked = Mockito.mock(NetworkModelListenerImpl.class);
294         doCallRealMethod().when(networkModelListenerMocked).onTopologyUpdateResult(any(TopologyUpdateResult.class));
295
296         Map<TopologyChangesKey, TopologyChanges> topologyChanges1 = Map.of(
297                 new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
298                 new TopologyChangesBuilder()
299                         .setNodeId("tpNodeIdA")
300                         .setTpId("TpIdA1")
301                         .setState(State.OutOfService)
302                         .build());
303         Map<TopologyChangesKey, TopologyChanges> topologyChanges2 = Map.of(
304                 new TopologyChangesKey("tpNodeIdC", "TpIdC1"),
305                 new TopologyChangesBuilder()
306                         .setNodeId("tpNodeIdC")
307                         .setTpId("TpIdC1")
308                         .setState(State.OutOfService)
309                         .build());
310
311         networkModelListenerMocked.onTopologyUpdateResult(new TopologyUpdateResultBuilder()
312                 .setTopologyChanges(topologyChanges1).build());
313         networkModelListenerMocked.onTopologyUpdateResult(new TopologyUpdateResultBuilder()
314                 .setTopologyChanges(topologyChanges2).build());
315         verify(networkModelListenerMocked, times(2)).updateServicePaths(
316                 any(TopologyUpdateResult.class));
317     }
318
319     @Test
320     public void testOnTopologyUpdateResultWhenAlreadyWired() {
321         NetworkModelListenerImpl networkModelListenerMocked = Mockito.mock(NetworkModelListenerImpl.class);
322         doCallRealMethod().when(networkModelListenerMocked).onTopologyUpdateResult(any(TopologyUpdateResult.class));
323
324         Map<TopologyChangesKey, TopologyChanges> topologyChanges = Map.of(
325                 new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
326                 new TopologyChangesBuilder()
327                         .setNodeId("tpNodeIdA")
328                         .setTpId("TpIdA1")
329                         .setState(State.OutOfService)
330                         .build());
331         TopologyUpdateResult topologyUpdateResult = new TopologyUpdateResultBuilder()
332                 .setTopologyChanges(topologyChanges).build();
333
334         networkModelListenerMocked.onTopologyUpdateResult(topologyUpdateResult);
335         networkModelListenerMocked.onTopologyUpdateResult(topologyUpdateResult);
336         verify(networkModelListenerMocked, times(1)).updateServicePaths(
337                 any(TopologyUpdateResult.class));
338     }
339
340     private Map<AToZKey, AToZ> createMapAtoZ() {
341         Map<AToZKey, AToZ> atozmap = new HashMap<>();
342         atozmap.put(
343                 new AToZKey("0"),
344                 new AToZBuilder()
345                         .setId("0")
346                         .setResource(new ResourceBuilder()
347                                 .setResource(new TerminationPointBuilder()
348                                         .setTpNodeId("tpNodeIdA")
349                                         .setTpId("TpIdA1")
350                                         .build())
351                                 .setState(State.InService)
352                                 .build())
353                         .build());
354         atozmap.put(
355                 new AToZKey("1"),
356                 new AToZBuilder()
357                         .setId("1")
358                         .setResource(new ResourceBuilder()
359                                 .setResource(new NodeBuilder()
360                                         .setNodeId("NodeIdA")
361                                         .build())
362                                 .setState(State.InService)
363                                 .build())
364                         .build());
365         atozmap.put(
366                 new AToZKey("2"),
367                 new AToZBuilder()
368                         .setId("2")
369                         .setResource(new ResourceBuilder()
370                                 .setResource(new TerminationPointBuilder()
371                                         .setTpNodeId("tpNodeIdA")
372                                         .setTpId("TpIdA2")
373                                         .build())
374                                 .setState(State.InService)
375                                 .build())
376                         .build());
377         atozmap.put(
378                 new AToZKey("3"),
379                 new AToZBuilder()
380                         .setId("3")
381                         .setResource(new ResourceBuilder()
382                                 .setResource(new LinkBuilder()
383                                         .setLinkId("LinkIdAZ")
384                                         .build())
385                                 .setState(State.InService)
386                                 .build())
387                         .build());
388         atozmap.put(
389                 new AToZKey("4"),
390                 new AToZBuilder()
391                         .setId("4")
392                         .setResource(new ResourceBuilder()
393                                 .setResource(new TerminationPointBuilder()
394                                         .setTpNodeId("tpNodeIdZ")
395                                         .setTpId("TpIdZ2")
396                                         .build())
397                                 .setState(State.InService)
398                                 .build())
399                         .build());
400         atozmap.put(
401                 new AToZKey("5"),
402                 new AToZBuilder()
403                         .setId("5")
404                         .setResource(new ResourceBuilder()
405                                 .setResource(new NodeBuilder()
406                                         .setNodeId("NodeIdZ")
407                                         .build())
408                                 .setState(State.InService)
409                                 .build())
410                         .build());
411         atozmap.put(
412                 new AToZKey("6"),
413                 new AToZBuilder()
414                         .setId("6")
415                         .setResource(new ResourceBuilder()
416                                 .setResource(new TerminationPointBuilder()
417                                         .setTpNodeId("tpNodeIdZ")
418                                         .setTpId("TpIdZ1")
419                                         .build())
420                                 .setState(State.InService)
421                                 .build())
422                         .build());
423         return atozmap;
424     }
425
426     private Map<ZToAKey, ZToA> createMapZtoA() {
427         Map<ZToAKey, ZToA> ztoamap = new HashMap<>();
428         ztoamap.put(
429                 new ZToAKey("0"),
430                 new ZToABuilder()
431                         .setId("0")
432                         .setResource(new ResourceBuilder()
433                                 .setResource(new TerminationPointBuilder()
434                                         .setTpNodeId("tpNodeIdZ")
435                                         .setTpId("TpIdZ1")
436                                         .build())
437                                 .setState(State.InService)
438                                 .build())
439                         .build());
440         ztoamap.put(
441                 new ZToAKey("1"),
442                 new ZToABuilder()
443                         .setId("1")
444                         .setResource(new ResourceBuilder()
445                                 .setResource(new NodeBuilder()
446                                         .setNodeId("NodeIdZ")
447                                         .build())
448                                 .setState(State.InService)
449                                 .build())
450                         .build());
451         ztoamap.put(
452                 new ZToAKey("2"),
453                 new ZToABuilder()
454                         .setId("2")
455                         .setResource(new ResourceBuilder()
456                                 .setResource(new TerminationPointBuilder()
457                                         .setTpNodeId("tpNodeIdZ")
458                                         .setTpId("TpIdZ2")
459                                         .build())
460                                 .setState(State.InService)
461                                 .build())
462                         .build());
463         ztoamap.put(
464                 new ZToAKey("3"),
465                 new ZToABuilder()
466                         .setId("3")
467                         .setResource(new ResourceBuilder()
468                                 .setResource(new LinkBuilder()
469                                         .setLinkId("LinkIdAZ")
470                                         .build())
471                                 .setState(State.InService)
472                                 .build())
473                         .build());
474         ztoamap.put(
475                 new ZToAKey("4"),
476                 new ZToABuilder()
477                         .setId("4")
478                         .setResource(new ResourceBuilder()
479                                 .setResource(new TerminationPointBuilder()
480                                         .setTpNodeId("tpNodeIdA")
481                                         .setTpId("TpIdA2")
482                                         .build())
483                                 .setState(State.InService)
484                                 .build())
485                         .build());
486         ztoamap.put(
487                 new ZToAKey("5"),
488                 new ZToABuilder()
489                         .setId("5")
490                         .setResource(new ResourceBuilder()
491                                 .setResource(new NodeBuilder()
492                                         .setNodeId("NodeIdA")
493                                         .build())
494                                 .setState(State.InService)
495                                 .build())
496                         .build());
497         ztoamap.put(
498                 new ZToAKey("6"),
499                 new ZToABuilder()
500                         .setId("6")
501                         .setResource(new ResourceBuilder()
502                                 .setResource(new TerminationPointBuilder()
503                                         .setTpNodeId("tpNodeIdA")
504                                         .setTpId("TpIdA1")
505                                         .build())
506                                 .setState(State.InService)
507                                 .build())
508                         .build());
509         return ztoamap;
510     }
511 }