Merge changes I8c049137,I8660893e
[transportpce.git] / renderer / src / test / java / org / opendaylight / transportpce / renderer / provisiondevice / RendererServiceOperationsImplDeleteTest.java
1 /*
2  * Copyright © 2018 Orange Systems, 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.renderer.provisiondevice;
10
11
12 import static org.junit.jupiter.api.Assertions.assertEquals;
13 import static org.mockito.ArgumentMatchers.any;
14 import static org.mockito.ArgumentMatchers.anyString;
15 import static org.mockito.ArgumentMatchers.eq;
16 import static org.mockito.Mockito.doReturn;
17 import static org.mockito.Mockito.mock;
18 import static org.mockito.Mockito.spy;
19 import static org.mockito.Mockito.times;
20 import static org.mockito.Mockito.verify;
21 import static org.mockito.Mockito.when;
22
23 import com.google.common.util.concurrent.ListenableFuture;
24 import java.util.Collections;
25 import java.util.Map;
26 import java.util.concurrent.ExecutionException;
27 import java.util.concurrent.TimeoutException;
28 import org.junit.jupiter.api.BeforeEach;
29 import org.junit.jupiter.api.Test;
30 import org.opendaylight.mdsal.binding.api.MountPoint;
31 import org.opendaylight.mdsal.binding.api.MountPointService;
32 import org.opendaylight.mdsal.binding.api.NotificationPublishService;
33 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
34 import org.opendaylight.transportpce.common.ResponseCodes;
35 import org.opendaylight.transportpce.common.StringConstants;
36 import org.opendaylight.transportpce.common.crossconnect.CrossConnect;
37 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
38 import org.opendaylight.transportpce.common.device.DeviceTransactionManagerImpl;
39 import org.opendaylight.transportpce.common.mapping.PortMapping;
40 import org.opendaylight.transportpce.renderer.provisiondevice.notification.NotificationSender;
41 import org.opendaylight.transportpce.renderer.stub.OlmServiceStub;
42 import org.opendaylight.transportpce.renderer.utils.NotificationPublishServiceMock;
43 import org.opendaylight.transportpce.renderer.utils.ServiceDeleteDataUtils;
44 import org.opendaylight.transportpce.renderer.utils.TransactionUtils;
45 import org.opendaylight.transportpce.test.AbstractTest;
46 import org.opendaylight.transportpce.test.stub.MountPointServiceStub;
47 import org.opendaylight.transportpce.test.stub.MountPointStub;
48 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.ServicePathOutputBuilder;
49 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerTurndownOutputBuilder;
50 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.TransportpceOlmService;
51 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteInputBuilder;
52 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteOutput;
53 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.node.types.rev210528.NodeIdType;
54 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.ConnectionType;
55 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.ServiceAEnd;
56 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.ServiceAEndBuilder;
57 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.endpoint.TxDirectionBuilder;
58 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.endpoint.TxDirectionKey;
59 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.port.PortBuilder;
60 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.format.rev191129.ServiceFormat;
61 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.Services;
62 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.ServicesBuilder;
63 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.handler.header.ServiceHandlerHeaderBuilder;
64 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.ServicePathList;
65 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.service.path.list.ServicePaths;
66 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.service.path.list.ServicePathsBuilder;
67 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.service.path.list.ServicePathsKey;
68 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
69 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
70 import org.opendaylight.yangtools.yang.common.Uint32;
71 import org.opendaylight.yangtools.yang.common.Uint8;
72
73 public class RendererServiceOperationsImplDeleteTest extends AbstractTest {
74
75     private DeviceTransactionManager deviceTransactionManager;
76     private RendererServiceOperationsImpl rendererServiceOperations;
77     private final DeviceRendererService deviceRenderer = mock(DeviceRendererService.class);
78     private final OtnDeviceRendererService otnDeviceRendererService = mock(OtnDeviceRendererService.class);
79     private final PortMapping portMapping = mock(PortMapping.class);
80     private final CrossConnect crossConnect = mock(CrossConnect.class);
81     private TransportpceOlmService olmService;
82
83     private void setMountPoint(MountPoint mountPoint) {
84         MountPointService mountPointService = new MountPointServiceStub(mountPoint);
85         this.deviceTransactionManager = new DeviceTransactionManagerImpl(mountPointService, 3000);
86     }
87
88     @BeforeEach
89     void setUp() {
90         setMountPoint(new MountPointStub(getDataBroker()));
91         this.olmService = new OlmServiceStub();
92         this.olmService = spy(this.olmService);
93         NotificationPublishService notificationPublishService = new NotificationPublishServiceMock();
94         this.rendererServiceOperations =  new RendererServiceOperationsImpl(deviceRenderer,
95             otnDeviceRendererService, olmService, getDataBroker(), new NotificationSender(notificationPublishService),
96             portMapping);
97     }
98
99
100     @Test
101     void serviceDeleteOperationPp() throws ExecutionException, InterruptedException, TimeoutException {
102         writePathDescription();
103         ServiceDeleteInputBuilder serviceDeleteInputBuilder = new ServiceDeleteInputBuilder();
104         serviceDeleteInputBuilder.setServiceName("service 1");
105         serviceDeleteInputBuilder.setServiceHandlerHeader((new ServiceHandlerHeaderBuilder())
106             .setRequestId("request1").build());
107         doReturn(Collections.emptyList())
108             .when(this.crossConnect).deleteCrossConnect(anyString(), anyString(), eq(false));
109         ServiceAEnd serviceAEnd = new ServiceAEndBuilder()
110             .setServiceFormat(ServiceFormat.Ethernet)
111             .setServiceRate(Uint32.valueOf("100"))
112             .setTxDirection(Map.of(new TxDirectionKey(Uint8.ZERO),
113                     new TxDirectionBuilder().setIndex(Uint8.ZERO).setPort(new PortBuilder().setPortName("port-name")
114                         .build()).build()))
115             .setNodeId(new NodeIdType("optical-node1"))
116             .build();
117         Services service = new ServicesBuilder()
118             .setServiceName("service 1")
119             .setConnectionType(ConnectionType.Service)
120             .setServiceAEnd(serviceAEnd)
121             .build();
122         when(portMapping.getMapping(anyString(), anyString())).thenReturn(null);
123         when(deviceRenderer.deleteServicePath(any()))
124             .thenReturn(new ServicePathOutputBuilder().setSuccess(true).build());
125         ServiceDeleteOutput serviceDeleteOutput = this.rendererServiceOperations
126             .serviceDelete(serviceDeleteInputBuilder.build(), service).get();
127         assertEquals(ResponseCodes.RESPONSE_OK, serviceDeleteOutput.getConfigurationResponseCommon().getResponseCode());
128     }
129
130     @Test
131     void serviceDeleteOperationNoDescription() throws InterruptedException, ExecutionException {
132         ServiceDeleteInputBuilder serviceDeleteInputBuilder = new ServiceDeleteInputBuilder();
133         serviceDeleteInputBuilder.setServiceName("service 1");
134         Services service = new ServicesBuilder()
135             .setServiceName("service 1")
136             .setServiceAEnd(new ServiceAEndBuilder()
137                 .setServiceFormat(ServiceFormat.Ethernet)
138                 .setServiceRate(Uint32.valueOf(100))
139                 .setTxDirection(Map.of(
140                         new TxDirectionKey(Uint8.ZERO),
141                         new TxDirectionBuilder().setIndex(Uint8.ZERO).setPort(new PortBuilder()
142                             .setPortName("port-name").build()).build()))
143                 .setNodeId(new NodeIdType("optical-node1"))
144                 .build())
145             .build();
146         when(portMapping.getMapping(anyString(), anyString())).thenReturn(null);
147         doReturn(RpcResultBuilder.success((new ServicePowerTurndownOutputBuilder())
148             .setResult("Failed").build()).buildFuture()).when(this.olmService).servicePowerTurndown(any());
149         ServiceDeleteOutput serviceDeleteOutput
150                 = this.rendererServiceOperations.serviceDelete(serviceDeleteInputBuilder.build(), service).get();
151         assertEquals(
152             ResponseCodes.RESPONSE_FAILED,
153             serviceDeleteOutput.getConfigurationResponseCommon().getResponseCode());
154         verify(this.crossConnect, times(0)).deleteCrossConnect(any(), any(), eq(false));
155     }
156
157     @Test
158     void serviceDeleteOperationTearDownFailedAtoZ() throws ExecutionException, InterruptedException {
159         doReturn(Collections.emptyList())
160             .when(this.crossConnect).deleteCrossConnect(anyString(),anyString(), eq(false));
161         doReturn(RpcResultBuilder.success(new ServicePowerTurndownOutputBuilder().setResult("Failed").build())
162                 .buildFuture())
163             .when(this.olmService).servicePowerTurndown(any());
164
165         writePathDescription();
166         Services service = new ServicesBuilder()
167             .setServiceName("service 1")
168             .setConnectionType(ConnectionType.Service)
169             .setServiceAEnd(new ServiceAEndBuilder()
170                 .setServiceFormat(ServiceFormat.Ethernet)
171                 .setServiceRate(Uint32.valueOf("100"))
172                 .setTxDirection(Map.of(
173                     new TxDirectionKey(Uint8.ZERO),
174                     new TxDirectionBuilder()
175                         .setIndex(Uint8.ZERO)
176                         .setPort(new PortBuilder().setPortName("port-name").build())
177                         .build()))
178                 .setNodeId(new NodeIdType("optical-node1"))
179                 .build())
180             .build();
181         when(portMapping.getMapping(anyString(), anyString()))
182             .thenReturn(null);
183         ListenableFuture<ServiceDeleteOutput> serviceDeleteOutput = this.rendererServiceOperations
184             .serviceDelete(
185                 new ServiceDeleteInputBuilder()
186                     .setServiceName("service 1")
187                     .setServiceHandlerHeader((new ServiceHandlerHeaderBuilder()).setRequestId("request1").build())
188                     .build(),
189                 service);
190         ServiceDeleteOutput output = serviceDeleteOutput.get();
191         assertEquals(ResponseCodes.RESPONSE_FAILED,
192                 output.getConfigurationResponseCommon().getResponseCode());
193         verify(this.crossConnect, times(0)).deleteCrossConnect(eq("node1"), any(), eq(false));
194         verify(this.crossConnect, times(0)).deleteCrossConnect(eq("node2"), any(), eq(false));
195     }
196
197     @Test
198     void serviceDeleteOperationTearDownFailedZtoA() throws ExecutionException, InterruptedException {
199         doReturn(Collections.emptyList())
200             .when(this.crossConnect).deleteCrossConnect(anyString(), anyString(), eq(false));
201         when(this.olmService.servicePowerTurndown(any()))
202             .thenReturn(RpcResultBuilder.success((new ServicePowerTurndownOutputBuilder()).setResult("Success").build())
203                 .buildFuture())
204             .thenReturn(RpcResultBuilder.success((new ServicePowerTurndownOutputBuilder()).setResult("Failed").build())
205                 .buildFuture());
206
207         writePathDescription();
208         when(portMapping.getMapping(anyString(), anyString()))
209             .thenReturn(null);
210         ServiceDeleteOutput serviceDeleteOutput = this.rendererServiceOperations.serviceDelete(
211                 new ServiceDeleteInputBuilder()
212                     .setServiceName("service 1")
213                     .setServiceHandlerHeader((new ServiceHandlerHeaderBuilder()).setRequestId("request1").build())
214                     .build(),
215                 new ServicesBuilder()
216                     .setServiceName("service 1")
217                     .setConnectionType(ConnectionType.Service)
218                     .setServiceAEnd(new ServiceAEndBuilder()
219                         .setServiceFormat(ServiceFormat.Ethernet)
220                         .setServiceRate(Uint32.valueOf("100"))
221                         .setTxDirection(Map.of(
222                             new TxDirectionKey(Uint8.ZERO),
223                             new TxDirectionBuilder()
224                                 .setIndex(Uint8.ZERO)
225                                 .setPort(new PortBuilder().setPortName("port-name").build())
226                                 .build()))
227                         .setNodeId(new NodeIdType("optical-node1"))
228                         .build())
229                     .build())
230             .get();
231         assertEquals(ResponseCodes.RESPONSE_FAILED,
232             serviceDeleteOutput.getConfigurationResponseCommon().getResponseCode());
233         verify(this.olmService, times(2)).servicePowerTurndown(any());
234         verify(this.crossConnect, times(0)).deleteCrossConnect(eq("node1"), any(),eq(false));
235         verify(this.crossConnect, times(0)).deleteCrossConnect(eq("node2"), any(),eq(false));
236     }
237
238     private void writePathDescription() throws ExecutionException, InterruptedException {
239         TransactionUtils.writeTransaction(
240                 this.deviceTransactionManager,
241                 "node1" + StringConstants.PP_TOKEN,
242                 LogicalDatastoreType.OPERATIONAL,
243                 InstanceIdentifier.create(ServicePathList.class)
244                     .child(ServicePaths.class, new ServicePathsKey("service 1")),
245                 new ServicePathsBuilder()
246                     .setPathDescription(ServiceDeleteDataUtils
247                         .createTransactionPathDescription(StringConstants.PP_TOKEN))
248                     .setServiceAEnd(ServiceDeleteDataUtils.getServiceAEndBuild().build())
249                     .setServiceZEnd(ServiceDeleteDataUtils.getServiceZEndBuild().build())
250                     .withKey(new ServicePathsKey("service 1"))
251                     .setServiceHandlerHeader(new ServiceHandlerHeaderBuilder().setRequestId("Request 1").build())
252                     .build());
253     }
254 }