diff --git a/server/src/com/cloud/network/vpc/VpcManagerImpl.java b/server/src/com/cloud/network/vpc/VpcManagerImpl.java index 9187f71dfeb..d1557a158ff 100644 --- a/server/src/com/cloud/network/vpc/VpcManagerImpl.java +++ b/server/src/com/cloud/network/vpc/VpcManagerImpl.java @@ -59,6 +59,7 @@ import com.cloud.network.addr.PublicIp; import com.cloud.network.dao.IPAddressDao; import com.cloud.network.dao.NetworkDao; import com.cloud.network.dao.PhysicalNetworkDao; +import com.cloud.network.dao.Site2SiteVpnConnectionDao; import com.cloud.network.dao.Site2SiteVpnGatewayDao; import com.cloud.network.element.VpcProvider; import com.cloud.network.vpc.VpcOffering.State; @@ -68,6 +69,7 @@ import com.cloud.network.vpc.Dao.VpcDao; import com.cloud.network.vpc.Dao.VpcGatewayDao; import com.cloud.network.vpc.Dao.VpcOfferingDao; import com.cloud.network.vpc.Dao.VpcOfferingServiceMapDao; +import com.cloud.network.vpn.Site2SiteVpnManager; import com.cloud.offering.NetworkOffering; import com.cloud.offerings.NetworkOfferingServiceMapVO; import com.cloud.offerings.dao.NetworkOfferingServiceMapDao; @@ -145,7 +147,7 @@ public class VpcManagerImpl implements VpcManager, Manager{ @Inject ResourceTagDao _resourceTagDao; @Inject - Site2SiteVpnGatewayDao _vpnGatewayDao; + Site2SiteVpnManager _s2sVpnMgr; private final ScheduledExecutorService _executor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("VpcChecker")); @@ -1047,7 +1049,13 @@ public class VpcManagerImpl implements VpcManager, Manager{ s_logger.debug("Cleaning up resources for vpc id=" + vpcId); boolean success = true; - //1) release all ip addresses + //1) Remove VPN connections and VPN gateway + s_logger.debug("Cleaning up existed site to site VPN connections"); + _s2sVpnMgr.cleanupVpnConnectionByVpc(vpcId); + s_logger.debug("Cleaning up existed site to site VPN gateways"); + _s2sVpnMgr.cleanupVpnGatewayByVpc(vpcId); + + //2) release all ip addresses List ipsToRelease = _ipAddressDao.listByAssociatedVpc(vpcId, null); s_logger.debug("Releasing ips for vpc id=" + vpcId + " as a part of vpc cleanup"); for (IPAddressVO ipToRelease : ipsToRelease) { @@ -1064,13 +1072,13 @@ public class VpcManagerImpl implements VpcManager, Manager{ //although it failed, proceed to the next cleanup step as it doesn't depend on the public ip release } - //2) Delete all static route rules + //3) Delete all static route rules if (!revokeStaticRoutesForVpc(vpcId, caller)) { s_logger.warn("Failed to revoke static routes for vpc " + vpcId + " as a part of cleanup vpc process"); return false; } - //3) Delete private gateway + //4) Delete private gateway VpcGateway gateway = getPrivateGatewayForVpc(vpcId); if (gateway != null) { s_logger.debug("Deleting private gateway " + gateway + " as a part of vpc " + vpcId + " resources cleanup"); diff --git a/server/src/com/cloud/network/vpn/Site2SiteVpnManager.java b/server/src/com/cloud/network/vpn/Site2SiteVpnManager.java new file mode 100644 index 00000000000..92820f1dfa5 --- /dev/null +++ b/server/src/com/cloud/network/vpn/Site2SiteVpnManager.java @@ -0,0 +1,6 @@ +package com.cloud.network.vpn; + +public interface Site2SiteVpnManager extends Site2SiteVpnService { + boolean cleanupVpnConnectionByVpc(long vpcId); + boolean cleanupVpnGatewayByVpc(long vpcId); +} diff --git a/server/src/com/cloud/network/vpn/Site2SiteVpnManagerImpl.java b/server/src/com/cloud/network/vpn/Site2SiteVpnManagerImpl.java index b3de9040ddb..b3c3452b06d 100644 --- a/server/src/com/cloud/network/vpn/Site2SiteVpnManagerImpl.java +++ b/server/src/com/cloud/network/vpn/Site2SiteVpnManagerImpl.java @@ -48,8 +48,8 @@ import com.cloud.utils.component.Manager; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.net.NetUtils; -@Local(value = Site2SiteVpnService.class) -public class Site2SiteVpnManagerImpl implements Site2SiteVpnService, Manager { +@Local(value = Site2SiteVpnManager.class) +public class Site2SiteVpnManagerImpl implements Site2SiteVpnManager, Manager { private static final Logger s_logger = Logger.getLogger(Site2SiteVpnManagerImpl.class); @Inject Site2SiteCustomerGatewayDao _customerGatewayDao; @@ -226,9 +226,7 @@ public class Site2SiteVpnManagerImpl implements Site2SiteVpnService, Manager { return true; } - @Override - public boolean deleteVpnGateway(DeleteVpnGatewayCmd cmd) { - Long id = cmd.getId(); + protected void doDeleteVpnGateway(long id) { Site2SiteVpnGateway vpnGateway = _vpnGatewayDao.findById(id); if (vpnGateway == null) { throw new InvalidParameterValueException("Fail to find vpn gateway with " + id + " !"); @@ -238,6 +236,12 @@ public class Site2SiteVpnManagerImpl implements Site2SiteVpnService, Manager { throw new InvalidParameterValueException("Unable to delete VPN gateway " + id + " because there is still related VPN connections!"); } _vpnGatewayDao.remove(id); + } + + @Override + public boolean deleteVpnGateway(DeleteVpnGatewayCmd cmd) { + Long id = cmd.getId(); + doDeleteVpnGateway(id); return true; } @@ -386,4 +390,23 @@ public class Site2SiteVpnManagerImpl implements Site2SiteVpnService, Manager { } return results; } + + @Override + public boolean cleanupVpnConnectionByVpc(long vpcId) { + List conns = _vpnConnectionDao.listByVpcId(vpcId); + for (Site2SiteVpnConnection conn : conns) { + _vpnConnectionDao.remove(conn.getId()); + } + return true; + } + + @Override + public boolean cleanupVpnGatewayByVpc(long vpcId) { + Site2SiteVpnGatewayVO gw = _vpnGatewayDao.findByVpcId(vpcId); + if (gw == null) { + return true; + } + doDeleteVpnGateway(gw.getId()); + return true; + } }