bb6f61899a846ef46f2cc52cdac42b1a632ac2ca
[genius.git] / itm / itm-impl / src / test / java / org / opendaylight / genius / itm / impl / ItmExternalTunnelDeleteTest.java
1 /*
2  * Copyright (c) 2016, 2017 Ericsson India Global Services Pvt Ltd. 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.genius.itm.impl;
10
11 import static org.mockito.ArgumentMatchers.any;
12 import static org.mockito.Mockito.doReturn;
13 import static org.mockito.Mockito.lenient;
14 import static org.mockito.Mockito.times;
15 import static org.mockito.Mockito.verify;
16
17 import com.google.common.util.concurrent.Futures;
18 import java.util.ArrayList;
19 import java.util.List;
20 import java.util.Optional;
21 import java.util.concurrent.ExecutionException;
22 import java.util.concurrent.Future;
23 import junit.framework.TestCase;
24 import org.junit.After;
25 import org.junit.Before;
26 import org.junit.Test;
27 import org.junit.runner.RunWith;
28 import org.mockito.Mock;
29 import org.mockito.junit.MockitoJUnitRunner;
30 import org.opendaylight.genius.infra.Datastore;
31 import org.opendaylight.genius.infra.TypedReadWriteTransaction;
32 import org.opendaylight.genius.infra.TypedWriteTransaction;
33 import org.opendaylight.genius.itm.confighelpers.HwVtep;
34 import org.opendaylight.genius.itm.confighelpers.ItmExternalTunnelDeleteWorker;
35 import org.opendaylight.genius.itm.globals.ITMConstants;
36 import org.opendaylight.mdsal.binding.api.DataBroker;
37 import org.opendaylight.mdsal.binding.api.ReadTransaction;
38 import org.opendaylight.mdsal.binding.api.WriteTransaction;
39 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
40 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddressBuilder;
41 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
42 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefixBuilder;
43 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.AllocateIdInput;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.AllocateIdInputBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.AllocateIdOutput;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.AllocateIdOutputBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.ReleaseIdInput;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.ReleaseIdOutput;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeBase;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeVxlan;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.config.rev160406.ItmConfig;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.ExternalTunnelList;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.endpoints.DPNTEPsInfo;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.endpoints.DPNTEPsInfoBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.endpoints.DPNTEPsInfoKey;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.endpoints.dpn.teps.info.TunnelEndPoints;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.endpoints.dpn.teps.info.TunnelEndPointsBuilder;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.external.tunnel.list.ExternalTunnel;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.external.tunnel.list.ExternalTunnelBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.external.tunnel.list.ExternalTunnelKey;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.TransportZones;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.TransportZone;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.TransportZoneBuilder;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.TransportZoneKey;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.DeviceVteps;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.DeviceVtepsBuilder;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.DeviceVtepsKey;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.Vteps;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.VtepsBuilder;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.VtepsKey;
73 import org.opendaylight.yangtools.util.concurrent.FluentFutures;
74 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
75 import org.opendaylight.yangtools.yang.common.RpcResult;
76 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
77 import org.opendaylight.yangtools.yang.common.Uint16;
78 import org.opendaylight.yangtools.yang.common.Uint64;
79
80 @RunWith(MockitoJUnitRunner.class)
81 public class ItmExternalTunnelDeleteTest {
82
83     int vlanId = 100 ;
84     String portName1 = "phy0";
85     String parentInterfaceName = "1:phy0:100" ;
86     String transportZone1 = "TZA" ;
87     String subnetIp = "10.1.1.24";
88     String tepIp1 = "192.168.56.30";
89     String tepIp2 = "192.168.56.40";
90     String tepIp3 = "192.168.56.101";
91     String gwyIp1 = "0.0.0.0";
92     String gwyIp2 = "0.0.0.1";
93     String trunkInterfaceName = null;
94     IpAddress ipAddress1 = null;
95     IpAddress ipAddress2 = null;
96     IpAddress ipAddress3 = null;
97     IpAddress gtwyIp1 = null;
98     IpAddress gtwyIp2 = null;
99     IpPrefix ipPrefixTest = null;
100     Uint64 dpId2 = Uint64.ONE;
101     DPNTEPsInfo dpntePsInfoVxlan = null;
102     TunnelEndPoints tunnelEndPointsVxlan = null;
103     HwVtep hwVtep1  = null;
104     DeviceVteps deviceVteps1 = null;
105     DeviceVteps deviceVteps2 = null;
106     Vteps vteps = null;
107     TransportZone transportZone = null;
108     AllocateIdInput getIdInput1 = null;
109     AllocateIdInput getIdInput2 = null;
110     AllocateIdInput getIdInput3 = null;
111     AllocateIdInput getIdInput4 = null;
112     AllocateIdInput getIdInput5 = null;
113     AllocateIdInput getIdInput6 = null;
114     AllocateIdInput getIdInput7 = null;
115     AllocateIdInput getIdInput8 = null;
116     ExternalTunnel externalTunnel = null;
117     List<TunnelEndPoints> tunnelEndPointsListVxlan = new ArrayList<>();
118     List<DPNTEPsInfo> dpnTepsList = new ArrayList<>() ;
119     List<HwVtep> cfgdHwVtepsList = new ArrayList<>();
120     List<DeviceVteps> deviceVtepsList = new ArrayList<>();
121     List<Vteps> vtepsList = new ArrayList<>();
122     java.lang.Class<? extends TunnelTypeBase> tunnelType1 = TunnelTypeVxlan.class;
123
124     AllocateIdOutput expectedId1 = new AllocateIdOutputBuilder().setIdValue(Long.valueOf("100")).build();
125     Future<RpcResult<AllocateIdOutput>> idOutputOptional1 ;
126     AllocateIdOutput expectedId2 = new AllocateIdOutputBuilder().setIdValue(Long.valueOf("101")).build();
127     Future<RpcResult<AllocateIdOutput>> idOutputOptional2 ;
128     AllocateIdOutput expectedId3 = new AllocateIdOutputBuilder().setIdValue(Long.valueOf("102")).build();
129     Future<RpcResult<AllocateIdOutput>> idOutputOptional3 ;
130     AllocateIdOutput expectedId4 = new AllocateIdOutputBuilder().setIdValue(Long.valueOf("103")).build();
131     Future<RpcResult<AllocateIdOutput>> idOutputOptional4 ;
132     AllocateIdOutput expectedId5 = new AllocateIdOutputBuilder().setIdValue(Long.valueOf("104")).build();
133     Future<RpcResult<AllocateIdOutput>> idOutputOptional5 ;
134     AllocateIdOutput expectedId6 = new AllocateIdOutputBuilder().setIdValue(Long.valueOf("105")).build();
135     Future<RpcResult<AllocateIdOutput>> idOutputOptional6 ;
136     AllocateIdOutput expectedId7 = new AllocateIdOutputBuilder().setIdValue(Long.valueOf("105")).build();
137     Future<RpcResult<AllocateIdOutput>> idOutputOptional7 ;
138     AllocateIdOutput expectedId8 = new AllocateIdOutputBuilder().setIdValue(Long.valueOf("106")).build();
139     Future<RpcResult<AllocateIdOutput>> idOutputOptional8 ;
140     InstanceIdentifier<Interface> trunkIdentifier ;
141     InstanceIdentifier<ExternalTunnel> path ;
142
143     @Mock DataBroker dataBroker;
144     @Mock ReadTransaction mockReadTx;
145     @Mock WriteTransaction mockWriteTx;
146     @Mock IdManagerService idManagerService;
147     @Mock TypedWriteTransaction<Datastore.Configuration> typedWriteTransaction;
148     @Mock TypedReadWriteTransaction<Datastore.Configuration> typedReadWriteTransaction;
149     @Mock ItmConfig itmConfig;
150
151     @Before
152     public void setUp() {
153         setupMocks();
154
155         lenient().when(idManagerService.releaseId(any(ReleaseIdInput.class))).thenReturn(Futures.immediateFuture(
156                 RpcResultBuilder.<ReleaseIdOutput>success().build()));
157     }
158
159     @After
160     public void cleanUp() {
161     }
162
163     private void setupMocks() {
164
165         ipAddress1 = IpAddressBuilder.getDefaultInstance(tepIp1);
166         ipAddress2 = IpAddressBuilder.getDefaultInstance(tepIp2);
167         ipAddress3 = IpAddressBuilder.getDefaultInstance(tepIp3);
168         ipPrefixTest = IpPrefixBuilder.getDefaultInstance(subnetIp + "/24");
169         gtwyIp1 = IpAddressBuilder.getDefaultInstance(gwyIp1);
170         gtwyIp2 = IpAddressBuilder.getDefaultInstance(gwyIp2);
171         deviceVteps1 = new DeviceVtepsBuilder().setIpAddress(ipAddress1)
172                 .withKey(new DeviceVtepsKey(ipAddress1, "hwvtep:1"))
173                 .setNodeId("hwvtep://192.168.101.30:6640/physicalswitch/s3")
174                 .setTopologyId("hwvtep:1").build();
175         deviceVteps2 = new DeviceVtepsBuilder().setIpAddress(ipAddress2)
176                 .withKey(new DeviceVtepsKey(ipAddress2, "hwvtep:1"))
177                 .setNodeId("hwvtep://192.168.101.30:6640/physicalswitch/s3")
178                 .setTopologyId("hwvtep:1").build();
179         deviceVtepsList.add(deviceVteps1);
180         deviceVtepsList.add(deviceVteps2);
181         hwVtep1 = new HwVtep();
182         hwVtep1.setTransportZone(transportZone1);
183         hwVtep1.setGatewayIP(gtwyIp1);
184         hwVtep1.setHwIp(ipAddress2);
185         hwVtep1.setTunnelType(tunnelType1);
186         hwVtep1.setVlanID(vlanId);
187         hwVtep1.setTopoId("hwvtep:1");
188         hwVtep1.setNodeId("hwvtep://192.168.101.30:6640/physicalswitch/s3");
189         hwVtep1.setIpPrefix(ipPrefixTest);
190         vteps = new VtepsBuilder().setDpnId(dpId2).setIpAddress(ipAddress1).withKey(new
191                 VtepsKey(dpId2)).build();
192         vtepsList.add(vteps);
193         idOutputOptional1 = RpcResultBuilder.success(expectedId1).buildFuture();
194         getIdInput1 = new AllocateIdInputBuilder()
195                 .setPoolName(ITMConstants.ITM_IDPOOL_NAME)
196                 .setIdKey("1:phy0:100:192.168.56.101:192.168.56.30:VXLAN").build();
197         lenient().doReturn(idOutputOptional1).when(idManagerService).allocateId(getIdInput1);
198         idOutputOptional2 = RpcResultBuilder.success(expectedId2).buildFuture();
199         getIdInput2 = new AllocateIdInputBuilder()
200                 .setPoolName(ITMConstants.ITM_IDPOOL_NAME)
201                 .setIdKey("hwvtep:1:hwvtep:1:192.168.56.30:192.168.56.101:VXLAN").build();
202         lenient().doReturn(idOutputOptional2).when(idManagerService).allocateId(getIdInput2);
203         idOutputOptional3 = RpcResultBuilder.success(expectedId3).buildFuture();
204         getIdInput3 = new AllocateIdInputBuilder()
205                 .setPoolName(ITMConstants.ITM_IDPOOL_NAME)
206                 .setIdKey("1:phy0:100:192.168.56.101:192.168.56.40:VXLAN").build();
207         lenient().doReturn(idOutputOptional3).when(idManagerService).allocateId(getIdInput3);
208         idOutputOptional4 = RpcResultBuilder.success(expectedId4).buildFuture();
209         getIdInput4 = new AllocateIdInputBuilder()
210                 .setPoolName(ITMConstants.ITM_IDPOOL_NAME)
211                 .setIdKey("hwvtep:1:hwvtep:1:192.168.56.40:192.168.56.101:VXLAN").build();
212         lenient().doReturn(idOutputOptional4).when(idManagerService).allocateId(getIdInput4);
213         idOutputOptional5 = RpcResultBuilder.success(expectedId5).buildFuture();
214         getIdInput5 = new AllocateIdInputBuilder()
215                 .setPoolName(ITMConstants.ITM_IDPOOL_NAME)
216                 .setIdKey("hwvtep:1:hwvtep://192.168.101.30:6640/physicalswitch/"
217                         + "s3:192.168.56.40:192.168.56.101:VXLAN").build();
218         lenient().doReturn(idOutputOptional5).when(idManagerService).allocateId(getIdInput5);
219         idOutputOptional6 = RpcResultBuilder.success(expectedId6).buildFuture();
220         getIdInput6 = new AllocateIdInputBuilder()
221                 .setPoolName(ITMConstants.ITM_IDPOOL_NAME)
222                 .setIdKey("hwvtep:1:hwvtep://192.168.101.30:6640/physicalswitch/"
223                         + "s3:192.168.56.40:192.168.56.30:VXLAN")
224                 .build();
225         lenient().doReturn(idOutputOptional6).when(idManagerService).allocateId(getIdInput6);
226         idOutputOptional7 = RpcResultBuilder.success(expectedId7).buildFuture();
227         getIdInput7 = new AllocateIdInputBuilder()
228                 .setPoolName(ITMConstants.ITM_IDPOOL_NAME)
229                 .setIdKey("hwvtep:1:hwvtep:1:192.168.56.30:192.168.56.40:VXLAN").build();
230         lenient().doReturn(idOutputOptional7).when(idManagerService).allocateId(getIdInput7);
231         idOutputOptional8 = RpcResultBuilder.success(expectedId8).buildFuture();
232         getIdInput8 = new AllocateIdInputBuilder()
233                 .setPoolName(ITMConstants.ITM_IDPOOL_NAME)
234                 .setIdKey("1:phy0:100:192.168.56.30:192.168.56.40:VXLAN").build();
235         lenient().doReturn(idOutputOptional8).when(idManagerService).allocateId(getIdInput8);
236         tunnelEndPointsVxlan = new TunnelEndPointsBuilder()
237                 .setIpAddress(ipAddress3).setInterfaceName(parentInterfaceName)
238                 .setTzMembership(ItmUtils.createTransportZoneMembership(transportZone1)).setTunnelType(tunnelType1)
239                 .build();
240         tunnelEndPointsListVxlan.add(tunnelEndPointsVxlan);
241         dpntePsInfoVxlan = new DPNTEPsInfoBuilder().setDPNID(dpId2).setUp(true).withKey(new DPNTEPsInfoKey(dpId2))
242                 .setTunnelEndPoints(tunnelEndPointsListVxlan).build();
243         dpnTepsList.add(dpntePsInfoVxlan);
244         cfgdHwVtepsList.add(hwVtep1);
245
246         transportZone = new TransportZoneBuilder().setTunnelType(tunnelType1).setZoneName(transportZone1).withKey(new
247                 TransportZoneKey(transportZone1)).setDeviceVteps(deviceVtepsList).setVteps(vtepsList).build();
248         externalTunnel = new ExternalTunnelBuilder().setTunnelInterfaceName(parentInterfaceName)
249                 .setTransportType(tunnelType1).setDestinationDevice("hwvtep:1").setSourceDevice(dpId2.toString())
250                 .withKey(new ExternalTunnelKey(dpId2.toString() , hwVtep1.getNodeId() , tunnelType1)).build();
251         trunkInterfaceName = ItmUtils.getTrunkInterfaceName(parentInterfaceName,
252             tunnelEndPointsVxlan.getIpAddress().stringValue(), ipAddress1.stringValue(), tunnelType1.getName());
253         trunkIdentifier = ItmUtils.buildId(trunkInterfaceName);
254         path = InstanceIdentifier.create(ExternalTunnelList.class)
255                 .child(ExternalTunnel.class, ItmUtils.getExternalTunnelKey(ipAddress1.stringValue(),
256                     dpId2.toString(), tunnelType1));
257
258         lenient().doReturn(mockReadTx).when(dataBroker).newReadOnlyTransaction();
259         lenient().doReturn(mockWriteTx).when(dataBroker).newWriteOnlyTransaction();
260         lenient().doReturn(FluentFutures.immediateNullFluentFuture()).when(mockWriteTx).commit();
261         doReturn("phy0").when(itmConfig).getPortname();
262         doReturn(Uint16.valueOf(100)).when(itmConfig).getVlanId();
263     }
264
265     @Test
266     public void testDeleteTunnels() {
267         ItmExternalTunnelDeleteWorker.deleteTunnels(dpnTepsList, ipAddress1, tunnelType1, typedWriteTransaction);
268         verify(typedWriteTransaction).delete(trunkIdentifier);
269         verify(typedWriteTransaction).delete(path);
270     }
271
272     @Test
273     public void testDeleteHwVtepsTunnels() {
274
275         InstanceIdentifier<TransportZone> transportZoneIdentifier = InstanceIdentifier.builder(TransportZones.class)
276                 .child(TransportZone.class, new TransportZoneKey(transportZone1)).build();
277         InstanceIdentifier<ExternalTunnel> externalTunnelIdentifier1 = InstanceIdentifier.create(ExternalTunnelList
278                 .class).child(ExternalTunnel.class, ItmUtils.getExternalTunnelKey(hwVtep1.getTopoId(),
279                 dpId2.toString(), tunnelType1));
280         InstanceIdentifier<ExternalTunnel> externalTunnelIdentifier2 = InstanceIdentifier.create(ExternalTunnelList
281                 .class).child(ExternalTunnel.class, ItmUtils.getExternalTunnelKey(dpId2.toString(),
282                 hwVtep1.getTopoId(), tunnelType1));
283         InstanceIdentifier<ExternalTunnel> externalTunnelIdentifier3 = InstanceIdentifier.create(ExternalTunnelList
284                 .class).child(ExternalTunnel.class, ItmUtils.getExternalTunnelKey(hwVtep1.getNodeId(),
285                 dpId2.toString(), tunnelType1));
286         InstanceIdentifier<ExternalTunnel> externalTunnelIdentifier4 = InstanceIdentifier.create(ExternalTunnelList
287                 .class).child(ExternalTunnel.class, ItmUtils.getExternalTunnelKey(dpId2.toString(),
288                 hwVtep1.getNodeId(), tunnelType1));
289         InstanceIdentifier<ExternalTunnel> externalTunnelIdentifier5 = InstanceIdentifier.create(ExternalTunnelList
290                 .class).child(ExternalTunnel.class, ItmUtils.getExternalTunnelKey(hwVtep1.getTopoId(),
291                 hwVtep1.getNodeId(), tunnelType1));
292         InstanceIdentifier<ExternalTunnel> externalTunnelIdentifier6 = InstanceIdentifier.create(ExternalTunnelList
293                 .class).child(ExternalTunnel.class, ItmUtils.getExternalTunnelKey(hwVtep1.getNodeId(),
294                 hwVtep1.getTopoId(), tunnelType1));
295
296         Optional<TransportZone> optionalTransportZone = Optional.of(transportZone);
297         Optional<ExternalTunnel> exTunnels = Optional.of(externalTunnel);
298
299         doReturn(FluentFutures.immediateFluentFuture(optionalTransportZone))
300                 .when(typedReadWriteTransaction).read(transportZoneIdentifier);
301         doReturn(FluentFutures.immediateTrueFluentFuture())
302                 .when(typedReadWriteTransaction).exists(externalTunnelIdentifier1);
303         doReturn(FluentFutures.immediateTrueFluentFuture())
304                 .when(typedReadWriteTransaction).exists(externalTunnelIdentifier2);
305         doReturn(FluentFutures.immediateTrueFluentFuture()).when(typedReadWriteTransaction)
306                 .exists(externalTunnelIdentifier3);
307         doReturn(FluentFutures.immediateTrueFluentFuture()).when(typedReadWriteTransaction)
308                 .exists(externalTunnelIdentifier4);
309         doReturn(FluentFutures.immediateTrueFluentFuture()).when(typedReadWriteTransaction)
310                 .exists(externalTunnelIdentifier5);
311         doReturn(FluentFutures.immediateTrueFluentFuture()).when(typedReadWriteTransaction)
312                 .exists(externalTunnelIdentifier6);
313
314         try {
315             ItmExternalTunnelDeleteWorker
316                     .deleteHwVtepsTunnels(dpnTepsList, cfgdHwVtepsList, transportZone, typedReadWriteTransaction,
317                             itmConfig);
318             verify(typedReadWriteTransaction).delete(trunkIdentifier);
319             verify(typedReadWriteTransaction, times(2)).delete(externalTunnelIdentifier1);
320             verify(typedReadWriteTransaction, times(2)).delete(externalTunnelIdentifier2);
321             verify(typedReadWriteTransaction, times(2)).delete(externalTunnelIdentifier3);
322             verify(typedReadWriteTransaction, times(2)).delete(externalTunnelIdentifier4);
323             verify(typedReadWriteTransaction).delete(externalTunnelIdentifier5);
324             verify(typedReadWriteTransaction).delete(externalTunnelIdentifier6);
325         } catch (ExecutionException | InterruptedException e) {
326             TestCase.fail();// Fail in case of an exception
327         }
328     }
329 }