/* * Copyright (c) 2016 Ericsson India Global Services Pvt Ltd. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.genius.itm.impl; import static org.mockito.Matchers.any; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import com.google.common.base.Optional; import com.google.common.util.concurrent.Futures; import java.math.BigInteger; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Future; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.DataChangeListener; import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.genius.itm.confighelpers.HwVtep; import org.opendaylight.genius.itm.confighelpers.ItmExternalTunnelAddWorker; import org.opendaylight.genius.itm.globals.ITMConstants; import org.opendaylight.genius.utils.cache.DataStoreCache; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddressBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefixBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.AllocateIdInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.AllocateIdInputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.AllocateIdOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.AllocateIdOutputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelMonitoringTypeBase; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeBase; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeVxlan; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.config.rev160406.TunnelMonitorInterval; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.config.rev160406.TunnelMonitorIntervalBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.config.rev160406.TunnelMonitorParams; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.config.rev160406.TunnelMonitorParamsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.DpnEndpoints; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.DpnEndpointsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.ExternalTunnelList; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.endpoints.DPNTEPsInfo; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.endpoints.DPNTEPsInfoBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.endpoints.DPNTEPsInfoKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.endpoints.dpn.teps.info .TunnelEndPoints; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.endpoints.dpn.teps.info .TunnelEndPointsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.external.tunnel.list.ExternalTunnel; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.external.tunnel.list.ExternalTunnelKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.TransportZones; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.TransportZone; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.TransportZoneBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.TransportZoneKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.Subnets; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone .SubnetsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.SubnetsKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.subnets.DeviceVteps; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.subnets.DeviceVtepsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.subnets.DeviceVtepsKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.subnets.Vteps; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.subnets.VtepsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.subnets.VtepsKey; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.common.RpcResultBuilder; @RunWith(MockitoJUnitRunner.class) public class ItmExternalTunnelAddTest { BigInteger dpId1 = BigInteger.valueOf(1); int vlanId = 100 ; int interval = 1000; String portName1 = "phy0"; String tepIp1 = "192.168.56.30"; String tepIp2 = "192.168.56.40"; String tepIp3 = "192.168.56.101"; String gwyIp1 = "0.0.0.0"; String gwyIp2 = "0.0.0.1"; String subnetIp = "10.1.1.24"; String parentInterfaceName = "1:phy0:100" ; String transportZone1 = "TZA" ; String source = "hwvtep://192.168.101.30:6640/physicalswitch/s3" ; String destination = "hwvtep://192.168.101.40:6640/physicalswitch/s4" ; String trunkInterfaceName = null; TunnelEndPoints tunnelEndPointsVxlan = null; IpAddress ipAddress1 = null; IpAddress ipAddress2 = null; IpAddress ipAddress3 = null; IpAddress gtwyIp1 = null; IpAddress gtwyIp2 = null; IpPrefix ipPrefixTest = null; DPNTEPsInfo dpntePsInfoVxlan = null; ExternalTunnel externalTunnel = null; DpnEndpoints dpnEndpointsVxlan = null; AllocateIdInput getIdInput1 = null; AllocateIdInput getIdInput2 = null; AllocateIdInput getIdInput3 = null; AllocateIdInput getIdInput4 = null; AllocateIdInput getIdInput5 = null; AllocateIdInput getIdInput6 = null; Subnets subnets = null; HwVtep hwVtep1 = null; Vteps vtepsTest = null; DeviceVteps deviceVteps1 = null; DeviceVteps deviceVteps2 = null; TransportZone transportZone = null; TunnelMonitorParams TunnelMonitorParams = null; TunnelMonitorInterval tunnelMonitorInterval = null; Class monitorProtocol = ITMConstants.DEFAULT_MONITOR_PROTOCOL; Interface iface = null; List cfgdDpnListVxlan = new ArrayList<>() ; List tunnelEndPointsListVxlan = new ArrayList<>(); List bigIntegerList = new ArrayList<>(); List cfgdHwVtepsList = new ArrayList<>(); List subnetsList = new ArrayList<>(); List deviceVtepsList = new ArrayList<>(); List vtepsList = new ArrayList<>(); java.lang.Class tunnelType1 = TunnelTypeVxlan.class; InstanceIdentifier interfaceIdentifier = null; InstanceIdentifier TunnelMonitorParamsIdentifier = InstanceIdentifier.create(TunnelMonitorParams.class); InstanceIdentifier tunnelMonitorIntervalIdentifier = InstanceIdentifier.create(TunnelMonitorInterval.class); InstanceIdentifier externalTunnelIdentifier = null; InstanceIdentifier dpnEndpointsIdentifier = InstanceIdentifier.builder(DpnEndpoints.class).build(); AllocateIdOutput expectedId1 = new AllocateIdOutputBuilder().setIdValue(Long.valueOf("100")).build(); Future> idOutputOptional1 ; AllocateIdOutput expectedId2 = new AllocateIdOutputBuilder().setIdValue(Long.valueOf("101")).build(); Future> idOutputOptional2 ; AllocateIdOutput expectedId3 = new AllocateIdOutputBuilder().setIdValue(Long.valueOf("102")).build(); Future> idOutputOptional3 ; AllocateIdOutput expectedId4 = new AllocateIdOutputBuilder().setIdValue(Long.valueOf("103")).build(); Future> idOutputOptional4 ; AllocateIdOutput expectedId5 = new AllocateIdOutputBuilder().setIdValue(Long.valueOf("104")).build(); Future> idOutputOptional5 ; AllocateIdOutput expectedId6 = new AllocateIdOutputBuilder().setIdValue(Long.valueOf("105")).build(); Future> idOutputOptional6 ; Optional optionalDpnEndPoints ; Optional TunnelMonitorParamsOptional ; Optional tunnelMonitorIntervalOptional ; @Mock DataBroker dataBroker; @Mock ListenerRegistration dataChangeListenerRegistration; @Mock ReadOnlyTransaction mockReadTx; @Mock WriteTransaction mockWriteTx; @Mock IdManagerService idManagerService; ItmExternalTunnelAddWorker externalTunnelAddWorker = new ItmExternalTunnelAddWorker(); @Before public void setUp() throws Exception { when(dataBroker.registerDataChangeListener( any(LogicalDatastoreType.class), any(InstanceIdentifier.class), any(DataChangeListener.class), any(AsyncDataBroker.DataChangeScope.class))) .thenReturn(dataChangeListenerRegistration); setupMocks(); DataStoreCache.create(ITMConstants.ITM_MONIRORING_PARAMS_CACHE_NAME); optionalDpnEndPoints = Optional.of(dpnEndpointsVxlan); TunnelMonitorParamsOptional = Optional.of(TunnelMonitorParams); tunnelMonitorIntervalOptional = Optional.of(tunnelMonitorInterval); doReturn(Futures.immediateCheckedFuture(optionalDpnEndPoints)).when(mockReadTx).read(LogicalDatastoreType .CONFIGURATION,dpnEndpointsIdentifier); doReturn(Futures.immediateCheckedFuture(TunnelMonitorParamsOptional)).when(mockReadTx).read(LogicalDatastoreType.CONFIGURATION, TunnelMonitorParamsIdentifier); doReturn(Futures.immediateCheckedFuture(tunnelMonitorIntervalOptional)).when(mockReadTx).read(LogicalDatastoreType.CONFIGURATION, tunnelMonitorIntervalIdentifier); } @After public void cleanUp() { } private void setupMocks(){ ipAddress1 = IpAddressBuilder.getDefaultInstance(tepIp1); ipAddress2 = IpAddressBuilder.getDefaultInstance(tepIp2); ipAddress3 = IpAddressBuilder.getDefaultInstance(tepIp3); gtwyIp1 = IpAddressBuilder.getDefaultInstance(gwyIp1); gtwyIp2 = IpAddressBuilder.getDefaultInstance(gwyIp2); ipPrefixTest = IpPrefixBuilder.getDefaultInstance(subnetIp + "/24"); tunnelEndPointsVxlan = new TunnelEndPointsBuilder().setVLANID(vlanId).setPortname(portName1).setIpAddress (ipAddress3).setGwIpAddress(gtwyIp1).setInterfaceName(parentInterfaceName).setTransportZone (transportZone1).setTunnelType(tunnelType1).setSubnetMask(ipPrefixTest).build(); tunnelEndPointsListVxlan.add(tunnelEndPointsVxlan); dpntePsInfoVxlan = new DPNTEPsInfoBuilder().setDPNID(dpId1).setUp(true).setKey(new DPNTEPsInfoKey(dpId1)) .setTunnelEndPoints(tunnelEndPointsListVxlan).build(); deviceVteps1 = new DeviceVtepsBuilder().setIpAddress(ipAddress1).setKey(new DeviceVtepsKey(ipAddress1, source)).setNodeId(source).setTopologyId("hwvtep:1").build(); deviceVteps2 = new DeviceVtepsBuilder().setIpAddress(ipAddress2).setKey(new DeviceVtepsKey(ipAddress2, destination)).setNodeId(destination).setTopologyId("hwvtep:1").build(); hwVtep1 = new HwVtep(); hwVtep1.setTransportZone(transportZone1); hwVtep1.setGatewayIP(gtwyIp1); hwVtep1.setHwIp(ipAddress1); hwVtep1.setTunnel_type(tunnelType1); hwVtep1.setVlanID(vlanId); hwVtep1.setTopo_id("hwvtep:1"); hwVtep1.setNode_id(source); hwVtep1.setIpPrefix(ipPrefixTest); cfgdDpnListVxlan.add(dpntePsInfoVxlan); cfgdHwVtepsList.add(hwVtep1); bigIntegerList.add(dpId1); deviceVtepsList.add(deviceVteps1); deviceVtepsList.add(deviceVteps2); vtepsTest = new VtepsBuilder().setDpnId(dpId1).setIpAddress(ipAddress3).setPortname(portName1).setKey(new VtepsKey(dpId1,portName1)).build(); vtepsList.add(vtepsTest); dpnEndpointsVxlan = new DpnEndpointsBuilder().setDPNTEPsInfo(cfgdDpnListVxlan).build(); transportZone = new TransportZoneBuilder().setTunnelType(tunnelType1).setZoneName(transportZone1).setKey(new TransportZoneKey(transportZone1)).setSubnets(subnetsList).build(); idOutputOptional1 = RpcResultBuilder.success(expectedId1).buildFuture(); getIdInput1 = new AllocateIdInputBuilder() .setPoolName(ITMConstants.ITM_IDPOOL_NAME) .setIdKey("1:phy0:100:192.168.56.101:192.168.56.40:VXLAN").build(); doReturn(idOutputOptional1).when(idManagerService).allocateId(getIdInput1); idOutputOptional2 = RpcResultBuilder.success(expectedId2).buildFuture(); getIdInput2 = new AllocateIdInputBuilder() .setPoolName(ITMConstants.ITM_IDPOOL_NAME) .setIdKey("1:phy0:100:192.168.56.101:192.168.56.30:VXLAN").build(); doReturn(idOutputOptional2).when(idManagerService).allocateId(getIdInput2); idOutputOptional3 = RpcResultBuilder.success(expectedId3).buildFuture(); getIdInput3 = new AllocateIdInputBuilder() .setPoolName(ITMConstants.ITM_IDPOOL_NAME) .setIdKey("hwvtep:1:hwvtep://192.168.101.30:6640/physicalswitch/s3:192.168.56.30:192.168.56.101:VXLAN") .build(); doReturn(idOutputOptional3).when(idManagerService).allocateId(getIdInput3); idOutputOptional4 = RpcResultBuilder.success(expectedId4).buildFuture(); getIdInput4 = new AllocateIdInputBuilder() .setPoolName(ITMConstants.ITM_IDPOOL_NAME) .setIdKey("hwvtep:1:hwvtep://192.168.101.40:6640/physicalswitch/s4:192.168.56.40:192.168.56.101:VXLAN") .build(); doReturn(idOutputOptional4).when(idManagerService).allocateId(getIdInput4); idOutputOptional5 = RpcResultBuilder.success(expectedId5).buildFuture(); getIdInput5 = new AllocateIdInputBuilder() .setPoolName(ITMConstants.ITM_IDPOOL_NAME) .setIdKey("hwvtep:1:hwvtep://192.168.101.30:6640/physicalswitch/s3:192.168.56.30:192.168.56.40:VXLAN") .build(); doReturn(idOutputOptional5).when(idManagerService).allocateId(getIdInput5); idOutputOptional6 = RpcResultBuilder.success(expectedId6).buildFuture(); getIdInput6 = new AllocateIdInputBuilder() .setPoolName(ITMConstants.ITM_IDPOOL_NAME) .setIdKey("hwvtep:1:hwvtep://192.168.101.40:6640/physicalswitch/s4:192.168.56.40:192.168.56.30:VXLAN") .build(); doReturn(idOutputOptional6).when(idManagerService).allocateId(getIdInput6); TunnelMonitorParams = new TunnelMonitorParamsBuilder().setEnabled(true).build(); tunnelMonitorInterval = new TunnelMonitorIntervalBuilder().setInterval(interval).build(); trunkInterfaceName = ItmUtils.getTrunkInterfaceName(idManagerService,parentInterfaceName, tunnelEndPointsVxlan.getIpAddress().getIpv4Address().getValue(),ipAddress2.getIpv4Address().getValue (),tunnelType1.getName()); interfaceIdentifier = ItmUtils.buildId(trunkInterfaceName); externalTunnelIdentifier = InstanceIdentifier.create(ExternalTunnelList.class) .child(ExternalTunnel.class, new ExternalTunnelKey(ipAddress2.toString(), dpId1.toString(), tunnelType1)); iface = ItmUtils.buildTunnelInterface(dpId1,trunkInterfaceName, String.format("%s %s", ItmUtils.convertTunnelTypetoString(tunnelType1), "Trunk Interface"),true,tunnelType1,ipAddress3 ,ipAddress2,gtwyIp1,tunnelEndPointsVxlan.getVLANID(),false,false,monitorProtocol,null, false); externalTunnel = ItmUtils.buildExternalTunnel(dpId1.toString(),ipAddress2.toString(),tunnelType1, trunkInterfaceName); subnets = new SubnetsBuilder().setGatewayIp(gtwyIp1).setVlanId(vlanId).setKey(new SubnetsKey(ipPrefixTest)) .setVteps(vtepsList).setDeviceVteps(deviceVtepsList).build(); subnetsList.add(subnets); doReturn(mockReadTx).when(dataBroker).newReadOnlyTransaction(); doReturn(mockWriteTx).when(dataBroker).newWriteOnlyTransaction(); doReturn(Futures.immediateCheckedFuture(null)).when(mockWriteTx).submit(); } @Test public void testBuildTunnelsToExternalEndPoint(){ externalTunnelAddWorker.buildTunnelsToExternalEndPoint(dataBroker,idManagerService,cfgdDpnListVxlan, ipAddress2,tunnelType1); verify(mockWriteTx).merge(LogicalDatastoreType.CONFIGURATION,interfaceIdentifier,iface,true); verify(mockWriteTx).merge(LogicalDatastoreType.CONFIGURATION,externalTunnelIdentifier,externalTunnel,true); } @Test public void testBuildTunnelsFromDpnToExternalEndPoint(){ externalTunnelAddWorker.buildTunnelsFromDpnToExternalEndPoint(dataBroker,idManagerService,bigIntegerList, ipAddress2,tunnelType1); verify(mockWriteTx).merge(LogicalDatastoreType.CONFIGURATION,interfaceIdentifier,iface,true); verify(mockWriteTx).merge(LogicalDatastoreType.CONFIGURATION,externalTunnelIdentifier,externalTunnel,true); } @Test public void testBuildHwVtepsTunnels(){ Interface extTunnelIf1 = ItmUtils.buildTunnelInterface(dpId1, "tun030025bd04f", String.format("%s %s", tunnelType1 .getName(), "Trunk Interface"), true, tunnelType1, tunnelEndPointsVxlan.getIpAddress(), ipAddress1, gtwyIp1, vlanId, false,false, monitorProtocol, ITMConstants.BFD_DEFAULT_MONITOR_INTERVAL, false); Interface hwTunnelIf2 = ItmUtils.buildHwTunnelInterface("tun9a55a9c38f2", String.format("%s %s", tunnelType1.getName(), "Trunk Interface"), true, hwVtep1.getTopo_id(), hwVtep1.getNode_id(), tunnelType1, ipAddress1, ipAddress3, gtwyIp1, false, monitorProtocol, ITMConstants.BFD_DEFAULT_MONITOR_INTERVAL); Interface extTunnelIf3 = ItmUtils.buildTunnelInterface(dpId1, "tun17c6e20c283", String.format("%s %s", tunnelType1 .getName(), "Trunk Interface"), true, tunnelType1, tunnelEndPointsVxlan.getIpAddress(), ipAddress2, gtwyIp1, vlanId, false,false, monitorProtocol, ITMConstants.BFD_DEFAULT_MONITOR_INTERVAL, false); Interface hwTunnelIf4 = ItmUtils.buildHwTunnelInterface("tunaa109b6c8c5", String.format("%s %s", tunnelType1.getName(), "Trunk Interface"), true, hwVtep1.getTopo_id(), destination, tunnelType1, ipAddress2, ipAddress3, gtwyIp1, false, monitorProtocol, ITMConstants.BFD_DEFAULT_MONITOR_INTERVAL); Interface hwTunnelIf5 = ItmUtils.buildHwTunnelInterface("tund903ed434d5", String.format("%s %s", tunnelType1.getName(), "Trunk Interface"), true, hwVtep1.getTopo_id(), hwVtep1.getNode_id(), tunnelType1, ipAddress1, ipAddress2, gtwyIp1, false, monitorProtocol, ITMConstants.BFD_DEFAULT_MONITOR_INTERVAL); Interface hwTunnelIf6 = ItmUtils.buildHwTunnelInterface("tunc3315b110a6", String.format("%s %s", tunnelType1 .getName(), "Trunk Interface"), true, hwVtep1.getTopo_id(), destination, tunnelType1, ipAddress2, ipAddress1, gtwyIp1, false, monitorProtocol, ITMConstants.BFD_DEFAULT_MONITOR_INTERVAL); ExternalTunnel externalTunnel1 = ItmUtils.buildExternalTunnel( getExternalTunnelKey(dpId1.toString()), getExternalTunnelKey(source), tunnelType1, "tun030025bd04f"); ExternalTunnel externalTunnel2 = ItmUtils.buildExternalTunnel( getExternalTunnelKey(source), getExternalTunnelKey(dpId1.toString()), tunnelType1, "tun9a55a9c38f2"); ExternalTunnel externalTunnel3 = ItmUtils.buildExternalTunnel( getExternalTunnelKey(dpId1.toString()), getExternalTunnelKey(destination), tunnelType1, "tun17c6e20c283"); ExternalTunnel externalTunnel4 = ItmUtils.buildExternalTunnel( getExternalTunnelKey(destination), getExternalTunnelKey(dpId1.toString()), tunnelType1, "tunaa109b6c8c5"); ExternalTunnel externalTunnel5 = ItmUtils.buildExternalTunnel( getExternalTunnelKey(source), getExternalTunnelKey(destination), tunnelType1, "tund903ed434d5"); ExternalTunnel externalTunnel6 = ItmUtils.buildExternalTunnel( getExternalTunnelKey(destination), getExternalTunnelKey(source), tunnelType1, "tunc3315b110a6"); InstanceIdentifier transportZoneIdentifier = InstanceIdentifier.builder(TransportZones.class).child (TransportZone.class, new TransportZoneKey(transportZone1)).build(); InstanceIdentifier ifIID1 = InstanceIdentifier.builder(Interfaces.class).child(Interface.class, new InterfaceKey("tun030025bd04f")).build(); InstanceIdentifier ifIID2 = InstanceIdentifier.builder(Interfaces.class).child(Interface.class, new InterfaceKey("tun9a55a9c38f2")).build(); InstanceIdentifier ifIID3 = InstanceIdentifier.builder(Interfaces.class).child(Interface.class, new InterfaceKey("tun17c6e20c283")).build(); InstanceIdentifier ifIID4 = InstanceIdentifier.builder(Interfaces.class).child(Interface.class, new InterfaceKey("tunaa109b6c8c5")).build(); InstanceIdentifier ifIID5 = InstanceIdentifier.builder(Interfaces.class).child(Interface.class, new InterfaceKey("tund903ed434d5")).build(); InstanceIdentifier ifIID6 = InstanceIdentifier.builder(Interfaces.class).child(Interface.class, new InterfaceKey("tunc3315b110a6")).build(); InstanceIdentifier externalTunnelIdentifier1 = InstanceIdentifier.create(ExternalTunnelList .class).child(ExternalTunnel.class, new ExternalTunnelKey( getExternalTunnelKey(source), getExternalTunnelKey(dpId1.toString()), tunnelType1)); InstanceIdentifier externalTunnelIdentifier2 = InstanceIdentifier.create (ExternalTunnelList.class).child(ExternalTunnel.class, new ExternalTunnelKey(getExternalTunnelKey(dpId1.toString()), getExternalTunnelKey(source), tunnelType1)); InstanceIdentifier externalTunnelIdentifier3 = InstanceIdentifier.create (ExternalTunnelList.class).child(ExternalTunnel.class, new ExternalTunnelKey(getExternalTunnelKey (destination), getExternalTunnelKey(dpId1.toString()), tunnelType1)); InstanceIdentifier externalTunnelIdentifier4 = InstanceIdentifier.create (ExternalTunnelList.class).child(ExternalTunnel.class, new ExternalTunnelKey(getExternalTunnelKey (dpId1.toString()), getExternalTunnelKey(destination), tunnelType1)); InstanceIdentifier externalTunnelIdentifier5 = InstanceIdentifier.create (ExternalTunnelList.class).child(ExternalTunnel.class, new ExternalTunnelKey(getExternalTunnelKey (destination), getExternalTunnelKey(source), tunnelType1)); InstanceIdentifier externalTunnelIdentifier6 = InstanceIdentifier.create (ExternalTunnelList.class).child(ExternalTunnel.class, new ExternalTunnelKey(getExternalTunnelKey (source), getExternalTunnelKey(destination), tunnelType1)); Optional optionalTransportZone = Optional.of(transportZone); doReturn(Futures.immediateCheckedFuture(optionalTransportZone)).when(mockReadTx).read(LogicalDatastoreType .CONFIGURATION,transportZoneIdentifier); externalTunnelAddWorker.buildHwVtepsTunnels(dataBroker,idManagerService,cfgdDpnListVxlan,null); externalTunnelAddWorker.buildHwVtepsTunnels(dataBroker,idManagerService,null,cfgdHwVtepsList); verify(mockWriteTx, times(2)).merge(LogicalDatastoreType.CONFIGURATION,ifIID1,extTunnelIf1,true); verify(mockWriteTx, times(2)).merge(LogicalDatastoreType.CONFIGURATION,externalTunnelIdentifier1, externalTunnel1, true); verify(mockWriteTx, times(2)).merge(LogicalDatastoreType.CONFIGURATION,ifIID2,hwTunnelIf2,true); verify(mockWriteTx, times(2)).merge(LogicalDatastoreType.CONFIGURATION,externalTunnelIdentifier2, externalTunnel2, true); verify(mockWriteTx).merge(LogicalDatastoreType.CONFIGURATION,ifIID3,extTunnelIf3,true); verify(mockWriteTx).merge(LogicalDatastoreType.CONFIGURATION,externalTunnelIdentifier3, externalTunnel3, true); verify(mockWriteTx).merge(LogicalDatastoreType.CONFIGURATION,ifIID4,hwTunnelIf4,true); verify(mockWriteTx).merge(LogicalDatastoreType.CONFIGURATION,externalTunnelIdentifier4, externalTunnel4, true); verify(mockWriteTx).merge(LogicalDatastoreType.CONFIGURATION,ifIID5,hwTunnelIf5,true); verify(mockWriteTx).merge(LogicalDatastoreType.CONFIGURATION,externalTunnelIdentifier5, externalTunnel5, true); verify(mockWriteTx).merge(LogicalDatastoreType.CONFIGURATION,ifIID6,hwTunnelIf6,true); verify(mockWriteTx).merge(LogicalDatastoreType.CONFIGURATION,externalTunnelIdentifier6, externalTunnel6, true); } static String getExternalTunnelKey(String nodeid) { if (nodeid.indexOf("physicalswitch") > 0) { nodeid = nodeid.substring(0, nodeid.indexOf("physicalswitch") - 1); } return nodeid; } }