2 * Copyright (c) 2016 Ericsson India Global Services Pvt Ltd. 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.genius.itm.impl;
11 import static org.mockito.Matchers.any;
12 import static org.mockito.Mockito.doReturn;
13 import static org.mockito.Mockito.times;
14 import static org.mockito.Mockito.verify;
15 import static org.mockito.Mockito.when;
17 import com.google.common.base.Optional;
18 import com.google.common.util.concurrent.Futures;
19 import java.math.BigInteger;
20 import java.util.ArrayList;
21 import java.util.List;
22 import java.util.concurrent.Future;
23 import org.junit.After;
24 import org.junit.Before;
25 import org.junit.Test;
26 import org.junit.runner.RunWith;
27 import org.mockito.Mock;
28 import org.mockito.runners.MockitoJUnitRunner;
29 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
30 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
31 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
32 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
33 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker;
34 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
35 import org.opendaylight.genius.itm.confighelpers.HwVtep;
36 import org.opendaylight.genius.itm.confighelpers.ItmExternalTunnelDeleteWorker;
37 import org.opendaylight.genius.itm.globals.ITMConstants;
38 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
39 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddressBuilder;
40 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
41 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefixBuilder;
42 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.AllocateIdInput;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.AllocateIdInputBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.AllocateIdOutput;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.AllocateIdOutputBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.ReleaseIdInput;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeBase;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeVxlan;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.ExternalTunnelList;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.endpoints.DPNTEPsInfo;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.endpoints.DPNTEPsInfoBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.endpoints.DPNTEPsInfoKey;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.endpoints.dpn.teps.info
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.endpoints.dpn.teps.info
58 .TunnelEndPointsBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.external.tunnel.list.ExternalTunnel;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.external.tunnel.list
61 .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.Subnets;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.SubnetsKey;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.subnets.DeviceVteps;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.subnets.DeviceVtepsBuilder;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.subnets.DeviceVtepsKey;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.subnets.Vteps;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.subnets.VtepsBuilder;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.subnets.VtepsKey;
77 import org.opendaylight.yangtools.concepts.ListenerRegistration;
78 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
79 import org.opendaylight.yangtools.yang.common.RpcResult;
80 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
82 @RunWith(MockitoJUnitRunner.class)
83 public class ItmExternalTunnelDeleteTest {
86 String portName1 = "phy0";
87 String parentInterfaceName = "1:phy0:100" ;
88 String transportZone1 = "TZA" ;
89 String subnetIp = "10.1.1.24";
90 String tepIp1 = "192.168.56.30";
91 String tepIp2 = "192.168.56.40";
92 String tepIp3 = "192.168.56.101";
93 String gwyIp1 = "0.0.0.0";
94 String gwyIp2 = "0.0.0.1";
95 String trunkInterfaceName = null;
96 IpAddress ipAddress1 = null;
97 IpAddress ipAddress2 = null;
98 IpAddress ipAddress3 = null;
99 IpAddress gtwyIp1 = null;
100 IpAddress gtwyIp2 = null;
101 IpPrefix ipPrefixTest = null;
102 BigInteger dpId2 = BigInteger.valueOf(1);
103 DPNTEPsInfo dpntePsInfoVxlan = null;
104 TunnelEndPoints tunnelEndPointsVxlan = null;
105 HwVtep hwVtep1 = null;
106 Subnets subnets = null;
107 DeviceVteps deviceVteps1 = null;
108 DeviceVteps deviceVteps2 = null;
110 TransportZone transportZone = null;
111 AllocateIdInput getIdInput1 = null;
112 AllocateIdInput getIdInput2 = null;
113 AllocateIdInput getIdInput3 = null;
114 AllocateIdInput getIdInput4 = null;
115 AllocateIdInput getIdInput5 = null;
116 AllocateIdInput getIdInput6 = null;
117 AllocateIdInput getIdInput7 = null;
118 AllocateIdInput getIdInput8 = null;
119 ExternalTunnel externalTunnel = null;
120 List<TunnelEndPoints> tunnelEndPointsListVxlan = new ArrayList<>();
121 List<DPNTEPsInfo> dpnTepsList = new ArrayList<>() ;
122 List<HwVtep> cfgdHwVtepsList = new ArrayList<>();
123 List<Subnets> subnetsList = new ArrayList<>();
124 List<DeviceVteps> deviceVtepsList = new ArrayList<>();
125 List<Vteps> vtepsList = new ArrayList<>();
126 java.lang.Class<? extends TunnelTypeBase> tunnelType1 = TunnelTypeVxlan.class;
128 AllocateIdOutput expectedId1 = new AllocateIdOutputBuilder().setIdValue(Long.valueOf("100")).build();
129 Future<RpcResult<AllocateIdOutput>> idOutputOptional1 ;
130 AllocateIdOutput expectedId2 = new AllocateIdOutputBuilder().setIdValue(Long.valueOf("101")).build();
131 Future<RpcResult<AllocateIdOutput>> idOutputOptional2 ;
132 AllocateIdOutput expectedId3 = new AllocateIdOutputBuilder().setIdValue(Long.valueOf("102")).build();
133 Future<RpcResult<AllocateIdOutput>> idOutputOptional3 ;
134 AllocateIdOutput expectedId4 = new AllocateIdOutputBuilder().setIdValue(Long.valueOf("103")).build();
135 Future<RpcResult<AllocateIdOutput>> idOutputOptional4 ;
136 AllocateIdOutput expectedId5 = new AllocateIdOutputBuilder().setIdValue(Long.valueOf("104")).build();
137 Future<RpcResult<AllocateIdOutput>> idOutputOptional5 ;
138 AllocateIdOutput expectedId6 = new AllocateIdOutputBuilder().setIdValue(Long.valueOf("105")).build();
139 Future<RpcResult<AllocateIdOutput>> idOutputOptional6 ;
140 AllocateIdOutput expectedId7 = new AllocateIdOutputBuilder().setIdValue(Long.valueOf("105")).build();
141 Future<RpcResult<AllocateIdOutput>> idOutputOptional7 ;
142 AllocateIdOutput expectedId8 = new AllocateIdOutputBuilder().setIdValue(Long.valueOf("106")).build();
143 Future<RpcResult<AllocateIdOutput>> idOutputOptional8 ;
144 InstanceIdentifier<Interface> trunkIdentifier ;
145 InstanceIdentifier<ExternalTunnel> path ;
147 @Mock DataBroker dataBroker;
148 @Mock ListenerRegistration<DataChangeListener> dataChangeListenerRegistration;
149 @Mock ReadOnlyTransaction mockReadTx;
150 @Mock WriteTransaction mockWriteTx;
151 @Mock IdManagerService idManagerService;
153 ItmExternalTunnelDeleteWorker itmExternalTunnelDeleteWorker = new ItmExternalTunnelDeleteWorker();
156 public void setUp() throws Exception {
157 when(dataBroker.registerDataChangeListener(
158 any(LogicalDatastoreType.class),
159 any(InstanceIdentifier.class),
160 any(DataChangeListener.class),
161 any(AsyncDataBroker.DataChangeScope.class)))
162 .thenReturn(dataChangeListenerRegistration);
165 when(idManagerService.releaseId(any(ReleaseIdInput.class))).thenReturn(Futures.immediateFuture(RpcResultBuilder
166 .<Void>success().build()));
170 public void cleanUp() {
173 private void setupMocks(){
175 ipAddress1 = IpAddressBuilder.getDefaultInstance(tepIp1);
176 ipAddress2 = IpAddressBuilder.getDefaultInstance(tepIp2);
177 ipAddress3 = IpAddressBuilder.getDefaultInstance(tepIp3);
178 ipPrefixTest = IpPrefixBuilder.getDefaultInstance(subnetIp + "/24");
179 gtwyIp1 = IpAddressBuilder.getDefaultInstance(gwyIp1);
180 gtwyIp2 = IpAddressBuilder.getDefaultInstance(gwyIp2);
181 deviceVteps1 = new DeviceVtepsBuilder().setIpAddress(ipAddress1).setKey(new DeviceVtepsKey(ipAddress1, "hwvtep:1"))
182 .setNodeId("hwvtep://192.168.101.30:6640/physicalswitch/s3").setTopologyId("hwvtep:1").build();
183 deviceVteps2 = new DeviceVtepsBuilder().setIpAddress(ipAddress2).setKey(new DeviceVtepsKey(ipAddress2, "hwvtep:1"))
184 .setNodeId("hwvtep://192.168.101.30:6640/physicalswitch/s3").setTopologyId("hwvtep:1").build();
185 deviceVtepsList.add(deviceVteps1);
186 deviceVtepsList.add(deviceVteps2);
187 hwVtep1 = new HwVtep();
188 hwVtep1.setTransportZone(transportZone1);
189 hwVtep1.setGatewayIP(gtwyIp1);
190 hwVtep1.setHwIp(ipAddress2);
191 hwVtep1.setTunnel_type(tunnelType1);
192 hwVtep1.setVlanID(vlanId);
193 hwVtep1.setTopo_id("hwvtep:1");
194 hwVtep1.setNode_id("hwvtep://192.168.101.30:6640/physicalswitch/s3");
195 hwVtep1.setIpPrefix(ipPrefixTest);
196 vteps = new VtepsBuilder().setDpnId(dpId2).setIpAddress(ipAddress1).setPortname(portName1).setKey(new
197 VtepsKey(dpId2,portName1)).build();
198 vtepsList.add(vteps);
199 idOutputOptional1 = RpcResultBuilder.success(expectedId1).buildFuture();
200 getIdInput1 = new AllocateIdInputBuilder()
201 .setPoolName(ITMConstants.ITM_IDPOOL_NAME)
202 .setIdKey("1:phy0:100:192.168.56.101:192.168.56.30:VXLAN").build();
203 doReturn(idOutputOptional1).when(idManagerService).allocateId(getIdInput1);
204 idOutputOptional2 = RpcResultBuilder.success(expectedId2).buildFuture();
205 getIdInput2 = new AllocateIdInputBuilder()
206 .setPoolName(ITMConstants.ITM_IDPOOL_NAME)
207 .setIdKey("hwvtep:1:hwvtep:1:192.168.56.30:192.168.56.101:VXLAN").build();
208 doReturn(idOutputOptional2).when(idManagerService).allocateId(getIdInput2);
209 idOutputOptional3 = RpcResultBuilder.success(expectedId3).buildFuture();
210 getIdInput3 = new AllocateIdInputBuilder()
211 .setPoolName(ITMConstants.ITM_IDPOOL_NAME)
212 .setIdKey("1:phy0:100:192.168.56.101:192.168.56.40:VXLAN").build();
213 doReturn(idOutputOptional3).when(idManagerService).allocateId(getIdInput3);
214 idOutputOptional4 = RpcResultBuilder.success(expectedId4).buildFuture();
215 getIdInput4 = new AllocateIdInputBuilder()
216 .setPoolName(ITMConstants.ITM_IDPOOL_NAME)
217 .setIdKey("hwvtep:1:hwvtep:1:192.168.56.40:192.168.56.101:VXLAN").build();
218 doReturn(idOutputOptional4).when(idManagerService).allocateId(getIdInput4);
219 idOutputOptional5 = RpcResultBuilder.success(expectedId5).buildFuture();
220 getIdInput5 = new AllocateIdInputBuilder()
221 .setPoolName(ITMConstants.ITM_IDPOOL_NAME)
222 .setIdKey("hwvtep:1:hwvtep://192.168.101.30:6640/physicalswitch/s3:192.168.56.40:192.168.56.101:VXLAN").build();
223 doReturn(idOutputOptional5).when(idManagerService).allocateId(getIdInput5);
224 idOutputOptional6 = RpcResultBuilder.success(expectedId6).buildFuture();
225 getIdInput6 = new AllocateIdInputBuilder()
226 .setPoolName(ITMConstants.ITM_IDPOOL_NAME)
227 .setIdKey("hwvtep:1:hwvtep://192.168.101.30:6640/physicalswitch/s3:192.168.56.40:192.168.56.30:VXLAN")
229 doReturn(idOutputOptional6).when(idManagerService).allocateId(getIdInput6);
230 idOutputOptional7 = RpcResultBuilder.success(expectedId7).buildFuture();
231 getIdInput7 = new AllocateIdInputBuilder()
232 .setPoolName(ITMConstants.ITM_IDPOOL_NAME)
233 .setIdKey("hwvtep:1:hwvtep:1:192.168.56.30:192.168.56.40:VXLAN").build();
234 doReturn(idOutputOptional7).when(idManagerService).allocateId(getIdInput7);
235 idOutputOptional8 = RpcResultBuilder.success(expectedId8).buildFuture();
236 getIdInput8 = new AllocateIdInputBuilder()
237 .setPoolName(ITMConstants.ITM_IDPOOL_NAME)
238 .setIdKey("1:phy0:100:192.168.56.30:192.168.56.40:VXLAN").build();
239 doReturn(idOutputOptional8).when(idManagerService).allocateId(getIdInput8);
240 tunnelEndPointsVxlan = new TunnelEndPointsBuilder().setVLANID(vlanId).setPortname(portName1).setIpAddress
241 (ipAddress3).setGwIpAddress(gtwyIp1).setInterfaceName(parentInterfaceName).setTransportZone
242 (transportZone1).setTunnelType(tunnelType1).setSubnetMask(ipPrefixTest).build();
243 tunnelEndPointsListVxlan.add(tunnelEndPointsVxlan);
244 dpntePsInfoVxlan = new DPNTEPsInfoBuilder().setDPNID(dpId2).setUp(true).setKey(new DPNTEPsInfoKey(dpId2))
245 .setTunnelEndPoints(tunnelEndPointsListVxlan).build();
246 dpnTepsList.add(dpntePsInfoVxlan);
247 cfgdHwVtepsList.add(hwVtep1);
248 subnets = new SubnetsBuilder().setGatewayIp(gtwyIp1).setVlanId(vlanId).setKey(new SubnetsKey(ipPrefixTest))
249 .setDeviceVteps(deviceVtepsList).setVteps(vtepsList).build();
250 subnetsList.add(subnets);
251 transportZone = new TransportZoneBuilder().setTunnelType(tunnelType1).setZoneName(transportZone1).setKey(new
252 TransportZoneKey(transportZone1)).setSubnets(subnetsList).build();
253 externalTunnel = new ExternalTunnelBuilder().setTunnelInterfaceName(parentInterfaceName).setTransportType
254 (tunnelType1).setDestinationDevice("hwvtep:1").setSourceDevice(dpId2.toString()).setKey(new
255 ExternalTunnelKey(dpId2.toString() , hwVtep1.getNode_id() , tunnelType1)).build();
256 trunkInterfaceName = ItmUtils.getTrunkInterfaceName( idManagerService, parentInterfaceName,
257 tunnelEndPointsVxlan.getIpAddress().getIpv4Address().getValue(), ipAddress1.getIpv4Address().getValue(),
258 tunnelType1.getName());
259 trunkIdentifier = ItmUtils.buildId(trunkInterfaceName);
260 path = InstanceIdentifier.create(ExternalTunnelList.class)
261 .child(ExternalTunnel.class, ItmUtils.getExternalTunnelKey(ipAddress1.toString(), dpId2.toString(),
264 doReturn(mockReadTx).when(dataBroker).newReadOnlyTransaction();
265 doReturn(mockWriteTx).when(dataBroker).newWriteOnlyTransaction();
266 doReturn(Futures.immediateCheckedFuture(null)).when(mockWriteTx).submit();
270 public void testDeleteTunnels(){
272 itmExternalTunnelDeleteWorker.deleteTunnels(dataBroker,idManagerService,dpnTepsList,ipAddress1,tunnelType1);
274 verify(mockWriteTx).delete(LogicalDatastoreType.CONFIGURATION,trunkIdentifier);
275 verify(mockWriteTx).delete(LogicalDatastoreType.CONFIGURATION,path);
280 public void testDeleteHwVtepsTunnels(){
282 InstanceIdentifier<TransportZone> transportZoneIdentifier = InstanceIdentifier.builder(TransportZones.class).child
283 (TransportZone.class, new TransportZoneKey(transportZone1)).build();
284 InstanceIdentifier<ExternalTunnel> externalTunnelIdentifier1 = InstanceIdentifier.create(ExternalTunnelList
285 .class).child(ExternalTunnel.class, ItmUtils.getExternalTunnelKey(hwVtep1.getTopo_id(), dpId2.toString(),
287 InstanceIdentifier<ExternalTunnel> externalTunnelIdentifier2 = InstanceIdentifier.create(ExternalTunnelList
288 .class).child(ExternalTunnel.class, ItmUtils.getExternalTunnelKey(dpId2.toString(), hwVtep1.getTopo_id(),
290 InstanceIdentifier<ExternalTunnel> externalTunnelIdentifier3 = InstanceIdentifier.create(ExternalTunnelList
291 .class).child(ExternalTunnel.class, ItmUtils.getExternalTunnelKey(hwVtep1.getNode_id(), dpId2.toString(),
293 InstanceIdentifier<ExternalTunnel> externalTunnelIdentifier4 = InstanceIdentifier.create(ExternalTunnelList
294 .class).child(ExternalTunnel.class, ItmUtils.getExternalTunnelKey(dpId2.toString(), hwVtep1.getNode_id(),
296 InstanceIdentifier<ExternalTunnel> externalTunnelIdentifier5 = InstanceIdentifier.create(ExternalTunnelList
297 .class).child(ExternalTunnel.class, ItmUtils.getExternalTunnelKey(hwVtep1.getTopo_id(), hwVtep1.getNode_id(),
299 InstanceIdentifier<ExternalTunnel> externalTunnelIdentifier6 = InstanceIdentifier.create(ExternalTunnelList
300 .class).child(ExternalTunnel.class, ItmUtils.getExternalTunnelKey( hwVtep1.getNode_id(), hwVtep1.getTopo_id(),
303 Optional<TransportZone> optionalTransportZone = Optional.of(transportZone);
304 Optional<ExternalTunnel> exTunnels = Optional.of(externalTunnel);
306 doReturn(Futures.immediateCheckedFuture(optionalTransportZone)).when(mockReadTx).read(LogicalDatastoreType
307 .CONFIGURATION,transportZoneIdentifier);
308 doReturn(Futures.immediateCheckedFuture(exTunnels)).when(mockReadTx).read(LogicalDatastoreType.CONFIGURATION,
309 externalTunnelIdentifier1);
310 doReturn(Futures.immediateCheckedFuture(exTunnels)).when(mockReadTx).read(LogicalDatastoreType.CONFIGURATION,
311 externalTunnelIdentifier2);
312 doReturn(Futures.immediateCheckedFuture(exTunnels)).when(mockReadTx).read(LogicalDatastoreType.CONFIGURATION,
313 externalTunnelIdentifier3);
314 doReturn(Futures.immediateCheckedFuture(exTunnels)).when(mockReadTx).read(LogicalDatastoreType.CONFIGURATION,
315 externalTunnelIdentifier4);
316 doReturn(Futures.immediateCheckedFuture(exTunnels)).when(mockReadTx).read(LogicalDatastoreType.CONFIGURATION,
317 externalTunnelIdentifier5);
318 doReturn(Futures.immediateCheckedFuture(exTunnels)).when(mockReadTx).read(LogicalDatastoreType.CONFIGURATION,
319 externalTunnelIdentifier6);
321 itmExternalTunnelDeleteWorker.deleteHwVtepsTunnels(dataBroker, idManagerService, dpnTepsList, cfgdHwVtepsList,
324 verify(mockWriteTx).delete(LogicalDatastoreType.CONFIGURATION,trunkIdentifier);
325 verify(mockWriteTx, times(2)).delete(LogicalDatastoreType.CONFIGURATION,externalTunnelIdentifier1);
326 verify(mockWriteTx, times(2)).delete(LogicalDatastoreType.CONFIGURATION,externalTunnelIdentifier2);
327 verify(mockWriteTx, times(2)).delete(LogicalDatastoreType.CONFIGURATION,externalTunnelIdentifier3);
328 verify(mockWriteTx, times(2)).delete(LogicalDatastoreType.CONFIGURATION,externalTunnelIdentifier4);
329 verify(mockWriteTx).delete(LogicalDatastoreType.CONFIGURATION,externalTunnelIdentifier5);
330 verify(mockWriteTx).delete(LogicalDatastoreType.CONFIGURATION,externalTunnelIdentifier6);