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.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;
23 import java.util.HashMap;
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;
62 @RunWith(MockitoJUnitRunner.class)
63 public class NetworkModelListenerImplTest {
66 private NotificationPublishService notificationPublishService;
68 private ServiceDataStoreOperations serviceDataStoreOperations;
69 private static PathDescription pathDescription;
70 private NetworkModelListenerImpl networkModelListener;
74 pathDescription = new PathDescriptionBuilder()
75 .setAToZDirection(new AToZDirectionBuilder().setAToZ(new HashMap<>(createMapAtoZ())).build())
76 .setZToADirection(new ZToADirectionBuilder().setZToA(new HashMap<>(createMapZtoA())).build())
78 networkModelListener = new NetworkModelListenerImpl(notificationPublishService,
79 serviceDataStoreOperations);
83 public 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)
99 assertEquals(pathDescription.getZToADirection().getZToA(),
100 networkModelListener.changePathElementStateZA(topologyChanges, pathDescription));
104 public void testChangePathElementStateZAShouldModifyPathDescriptionsElementStates() {
105 Map<TopologyChangesKey, TopologyChanges> topologyChanges = Map.of(
106 new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
107 new TopologyChangesBuilder()
108 .setNodeId("tpNodeIdA")
110 .setState(State.OutOfService)
112 new TopologyChangesKey("tpNodeIdA", "TpIdA2"),
113 new TopologyChangesBuilder()
114 .setNodeId("tpNodeIdA")
116 .setState(State.OutOfService)
119 Map<ZToAKey, ZToA> ztoamapExpected = pathDescription.getZToADirection().getZToA();
120 ztoamapExpected.computeIfPresent(
122 (zToAKey, zToA) -> new ZToABuilder(zToA)
123 .setResource(new ResourceBuilder(zToA.getResource())
124 .setState(State.OutOfService)
127 ztoamapExpected.computeIfPresent(
129 (zToAKey, zToA) -> new ZToABuilder(zToA)
130 .setResource(new ResourceBuilder(zToA.getResource())
131 .setState(State.OutOfService)
134 assertEquals(ztoamapExpected, networkModelListener.changePathElementStateZA(topologyChanges, pathDescription));
138 public void testChangePathElementStateAZShouldNotModifyPathDescriptionsElementStates() {
139 Map<TopologyChangesKey, TopologyChanges> topologyChanges = Map.of(
140 new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
141 new TopologyChangesBuilder()
142 .setNodeId("tpNodeIdA")
144 .setState(State.InService)
146 new TopologyChangesKey("tpNodeIdA", "TpIdA2"),
147 new TopologyChangesBuilder()
148 .setNodeId("tpNodeIdA")
150 .setState(State.InService)
153 assertEquals(pathDescription.getAToZDirection().getAToZ(),
154 networkModelListener.changePathElementStateAZ(topologyChanges, pathDescription));
158 public void testChangePathElementStateAZShouldModifyPathDescriptionsElementStates() {
159 Map<TopologyChangesKey, TopologyChanges> topologyChanges = Map.of(
160 new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
161 new TopologyChangesBuilder()
162 .setNodeId("tpNodeIdA")
164 .setState(State.OutOfService)
166 new TopologyChangesKey("tpNodeIdA", "TpIdA2"),
167 new TopologyChangesBuilder()
168 .setNodeId("tpNodeIdA")
170 .setState(State.OutOfService)
173 Map<AToZKey, AToZ> atozmapExpected = pathDescription.getAToZDirection().getAToZ();
174 atozmapExpected.computeIfPresent(
176 (aToZKey, aToZ) -> new AToZBuilder(aToZ)
177 .setResource(new ResourceBuilder(aToZ.getResource())
178 .setState(State.OutOfService)
181 atozmapExpected.computeIfPresent(
183 (aToZKey, aToZ) -> new AToZBuilder(aToZ)
184 .setResource(new ResourceBuilder(aToZ.getResource())
185 .setState(State.OutOfService)
188 assertEquals(atozmapExpected, networkModelListener.changePathElementStateAZ(topologyChanges, pathDescription));
192 public void testAllElementsinPathinServiceShouldReturnFalse() {
193 Map<AToZKey, AToZ> atozmap = pathDescription.getAToZDirection().getAToZ();
194 atozmap.computeIfPresent(
196 (aToZKey, aToZ) -> new AToZBuilder(aToZ)
197 .setResource(new ResourceBuilder(aToZ.getResource())
198 .setState(State.OutOfService)
201 Map<ZToAKey, ZToA> ztoamap = pathDescription.getZToADirection().getZToA();
202 ztoamap.computeIfPresent(
204 (zToAKey, zToA) -> new ZToABuilder(zToA)
205 .setResource(new ResourceBuilder(zToA.getResource())
206 .setState(State.OutOfService)
209 assertFalse(networkModelListener.allElementsinPathinService(atozmap, ztoamap));
213 public void testAllElementsinPathinServiceShouldReturnTrue() {
214 assertTrue(networkModelListener.allElementsinPathinService(pathDescription.getAToZDirection().getAToZ(),
215 pathDescription.getZToADirection().getZToA()));
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)
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)
236 Map<TopologyChangesKey, TopologyChanges> topologyChanges = Map.of(
237 new TopologyChangesKey("tpNodeIdC", "TpIdC1"),
238 new TopologyChangesBuilder()
239 .setNodeId("tpNodeIdC")
241 .setState(State.OutOfService)
243 new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
244 new TopologyChangesBuilder()
245 .setNodeId("tpNodeIdA")
247 .setState(State.InService)
250 networkModelListener.updateServicePaths(new TopologyUpdateResultBuilder()
251 .setTopologyChanges(topologyChanges).build());
252 verify(serviceDataStoreOperations,
253 never()).modifyService(anyString(), any(State.class), any(AdminStates.class));
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)
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)
274 when(serviceDataStoreOperations.modifyService(anyString(), any(State.class), any(AdminStates.class)))
275 .thenReturn(OperationResult.ok(""));
277 Map<TopologyChangesKey, TopologyChanges> topologyChanges = Map.of(
278 new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
279 new TopologyChangesBuilder()
280 .setNodeId("tpNodeIdA")
282 .setState(State.OutOfService)
285 networkModelListener.updateServicePaths(new TopologyUpdateResultBuilder()
286 .setTopologyChanges(topologyChanges).build());
287 verify(serviceDataStoreOperations, times(1)).modifyService(anyString(),
288 eq(State.OutOfService), any(AdminStates.class));
292 public void testOnTopologyUpdateResultWhenNeverWired() {
293 NetworkModelListenerImpl networkModelListenerMocked = Mockito.mock(NetworkModelListenerImpl.class);
294 doCallRealMethod().when(networkModelListenerMocked).onTopologyUpdateResult(any(TopologyUpdateResult.class));
296 Map<TopologyChangesKey, TopologyChanges> topologyChanges1 = Map.of(
297 new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
298 new TopologyChangesBuilder()
299 .setNodeId("tpNodeIdA")
301 .setState(State.OutOfService)
303 Map<TopologyChangesKey, TopologyChanges> topologyChanges2 = Map.of(
304 new TopologyChangesKey("tpNodeIdC", "TpIdC1"),
305 new TopologyChangesBuilder()
306 .setNodeId("tpNodeIdC")
308 .setState(State.OutOfService)
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));
320 public void testOnTopologyUpdateResultWhenAlreadyWired() {
321 NetworkModelListenerImpl networkModelListenerMocked = Mockito.mock(NetworkModelListenerImpl.class);
322 doCallRealMethod().when(networkModelListenerMocked).onTopologyUpdateResult(any(TopologyUpdateResult.class));
324 Map<TopologyChangesKey, TopologyChanges> topologyChanges = Map.of(
325 new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
326 new TopologyChangesBuilder()
327 .setNodeId("tpNodeIdA")
329 .setState(State.OutOfService)
331 TopologyUpdateResult topologyUpdateResult = new TopologyUpdateResultBuilder()
332 .setTopologyChanges(topologyChanges).build();
334 networkModelListenerMocked.onTopologyUpdateResult(topologyUpdateResult);
335 networkModelListenerMocked.onTopologyUpdateResult(topologyUpdateResult);
336 verify(networkModelListenerMocked, times(1)).updateServicePaths(
337 any(TopologyUpdateResult.class));
340 private Map<AToZKey, AToZ> createMapAtoZ() {
341 Map<AToZKey, AToZ> atozmap = new HashMap<>();
346 .setResource(new ResourceBuilder()
347 .setResource(new TerminationPointBuilder()
348 .setTpNodeId("tpNodeIdA")
351 .setState(State.InService)
358 .setResource(new ResourceBuilder()
359 .setResource(new NodeBuilder()
360 .setNodeId("NodeIdA")
362 .setState(State.InService)
369 .setResource(new ResourceBuilder()
370 .setResource(new TerminationPointBuilder()
371 .setTpNodeId("tpNodeIdA")
374 .setState(State.InService)
381 .setResource(new ResourceBuilder()
382 .setResource(new LinkBuilder()
383 .setLinkId("LinkIdAZ")
385 .setState(State.InService)
392 .setResource(new ResourceBuilder()
393 .setResource(new TerminationPointBuilder()
394 .setTpNodeId("tpNodeIdZ")
397 .setState(State.InService)
404 .setResource(new ResourceBuilder()
405 .setResource(new NodeBuilder()
406 .setNodeId("NodeIdZ")
408 .setState(State.InService)
415 .setResource(new ResourceBuilder()
416 .setResource(new TerminationPointBuilder()
417 .setTpNodeId("tpNodeIdZ")
420 .setState(State.InService)
426 private Map<ZToAKey, ZToA> createMapZtoA() {
427 Map<ZToAKey, ZToA> ztoamap = new HashMap<>();
432 .setResource(new ResourceBuilder()
433 .setResource(new TerminationPointBuilder()
434 .setTpNodeId("tpNodeIdZ")
437 .setState(State.InService)
444 .setResource(new ResourceBuilder()
445 .setResource(new NodeBuilder()
446 .setNodeId("NodeIdZ")
448 .setState(State.InService)
455 .setResource(new ResourceBuilder()
456 .setResource(new TerminationPointBuilder()
457 .setTpNodeId("tpNodeIdZ")
460 .setState(State.InService)
467 .setResource(new ResourceBuilder()
468 .setResource(new LinkBuilder()
469 .setLinkId("LinkIdAZ")
471 .setState(State.InService)
478 .setResource(new ResourceBuilder()
479 .setResource(new TerminationPointBuilder()
480 .setTpNodeId("tpNodeIdA")
483 .setState(State.InService)
490 .setResource(new ResourceBuilder()
491 .setResource(new NodeBuilder()
492 .setNodeId("NodeIdA")
494 .setState(State.InService)
501 .setResource(new ResourceBuilder()
502 .setResource(new TerminationPointBuilder()
503 .setTpNodeId("tpNodeIdA")
506 .setState(State.InService)