guest-vlan: cleanup (during guest vlan range and account deletion)
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/ad79f374 Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/ad79f374 Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/ad79f374 Branch: refs/heads/dedicate-guest-vlan-ranges Commit: ad79f3746dc51c1fcc6598bb6874aeb9dea15eef Parents: 84395f5 Author: Likitha Shetty <[email protected]> Authored: Fri Apr 26 02:45:57 2013 +0530 Committer: Likitha Shetty <[email protected]> Committed: Fri Apr 26 02:45:57 2013 +0530 ---------------------------------------------------------------------- server/src/com/cloud/dc/dao/DataCenterVnetDao.java | 2 + .../com/cloud/dc/dao/DataCenterVnetDaoImpl.java | 17 ++++++++++++++- .../src/com/cloud/network/NetworkServiceImpl.java | 15 +++++++++++++ .../cloud/network/dao/AccountGuestVlanMapDao.java | 2 + .../network/dao/AccountGuestVlanMapDaoImpl.java | 7 ++++++ server/src/com/cloud/user/AccountManagerImpl.java | 15 +++++++++++++ setup/db/db/schema-410to420.sql | 2 +- 7 files changed, 58 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ad79f374/server/src/com/cloud/dc/dao/DataCenterVnetDao.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/dc/dao/DataCenterVnetDao.java b/server/src/com/cloud/dc/dao/DataCenterVnetDao.java index 17c7634..778498d 100755 --- a/server/src/com/cloud/dc/dao/DataCenterVnetDao.java +++ b/server/src/com/cloud/dc/dao/DataCenterVnetDao.java @@ -41,6 +41,8 @@ public interface DataCenterVnetDao extends GenericDao<DataCenterVnetVO, Long> { public void release(String vnet, long physicalNetworkId, long accountId, String reservationId); + public void releaseDedicatedGuestVlans(Long dedicatedGuestVlanRangeId); + public int countVnetsAllocatedToAccount(long dcId, long accountId); public int countVnetsDedicatedToAccount(long dcId, long accountId); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ad79f374/server/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java b/server/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java index 27d692b..e97f2c6 100755 --- a/server/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java +++ b/server/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java @@ -60,8 +60,8 @@ public class DataCenterVnetDaoImpl extends GenericDaoBase<DataCenterVnetVO, Long private final GenericSearchBuilder<DataCenterVnetVO, Integer> countZoneVlans; private final GenericSearchBuilder<DataCenterVnetVO, Integer> countAllocatedZoneVlans; private final SearchBuilder<DataCenterVnetVO> SearchRange; + private final SearchBuilder<DataCenterVnetVO> DedicatedGuestVlanRangeSearch; private final GenericSearchBuilder<DataCenterVnetVO, Integer> countVnetsAllocatedToAccount; - protected GenericSearchBuilder<DataCenterVnetVO, Integer> countVnetsDedicatedToAccount; protected SearchBuilder<AccountGuestVlanMapVO> AccountGuestVlanMapSearch; @@ -201,6 +201,17 @@ public class DataCenterVnetDaoImpl extends GenericDaoBase<DataCenterVnetVO, Long } @Override + public void releaseDedicatedGuestVlans(Long dedicatedGuestVlanRangeId) { + SearchCriteria<DataCenterVnetVO> sc = DedicatedGuestVlanRangeSearch.create(); + sc.setParameters("dedicatedGuestVlanRangeId", dedicatedGuestVlanRangeId); + List<DataCenterVnetVO> vnets = listBy(sc); + for(DataCenterVnetVO vnet : vnets) { + vnet.setAccountGuestVlanMapId(null); + update(vnet.getId(), vnet); + } + } + + @Override public int countVnetsAllocatedToAccount(long dcId, long accountId) { SearchCriteria<Integer> sc = countVnetsAllocatedToAccount.create(); sc.setParameters("dc", dcId); @@ -294,6 +305,10 @@ public class DataCenterVnetDaoImpl extends GenericDaoBase<DataCenterVnetVO, Long VnetDcSearchAllocated.and("reservation", VnetDcSearchAllocated.entity().getReservationId(), SearchCriteria.Op.EQ); VnetDcSearchAllocated.done(); + DedicatedGuestVlanRangeSearch = createSearchBuilder(); + DedicatedGuestVlanRangeSearch.and("dedicatedGuestVlanRangeId", DedicatedGuestVlanRangeSearch.entity().getAccountGuestVlanMapId(), SearchCriteria.Op.EQ); + DedicatedGuestVlanRangeSearch.done(); + countVnetsAllocatedToAccount = createSearchBuilder(Integer.class); countVnetsAllocatedToAccount.and("dc", countVnetsAllocatedToAccount.entity().getDataCenterId(), SearchCriteria.Op.EQ); countVnetsAllocatedToAccount.and("accountId", countVnetsAllocatedToAccount.entity().getAccountId(), SearchCriteria.Op.EQ); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ad79f374/server/src/com/cloud/network/NetworkServiceImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/network/NetworkServiceImpl.java b/server/src/com/cloud/network/NetworkServiceImpl.java index 0b38367..3f33b55 100755 --- a/server/src/com/cloud/network/NetworkServiceImpl.java +++ b/server/src/com/cloud/network/NetworkServiceImpl.java @@ -2523,6 +2523,19 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { txn.close(); throw new InvalidParameterValueException("Some of the vnets from this range are allocated, can only remove a range which has no allocated vnets"); } + // If the range is partially dedicated to an account fail the request + List<AccountGuestVlanMapVO> maps = _accountGuestVlanMapDao.listAccountGuestVlanMapsByPhysicalNetwork(network.getId()); + for (AccountGuestVlanMapVO map : maps) { + String[] vlans = map.getGuestVlanRange().split("-"); + Integer dedicatedStartVlan = Integer.parseInt(vlans[0]); + Integer dedicatedEndVlan = Integer.parseInt(vlans[1]); + if ((start <= dedicatedStartVlan && end >= dedicatedStartVlan) || (start <= dedicatedEndVlan && end >= dedicatedEndVlan)) { + txn.close(); + throw new InvalidParameterValueException("Vnet range " + map.getGuestVlanRange() + " is dedicated" + + " to an account. The specified range " + start + "-" + end + " overlaps with the dedicated range " + + " Please release the overlapping dedicated range before deleting the range"); + } + } for (i=0; i<existingRanges.size(); i++){ if (existingRanges.get(i).first()<= start & existingRanges.get(i).second()>= end){ temp = existingRanges.get(i).second(); @@ -2553,6 +2566,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { _physicalNetworkDao.update(network.getId(), network); txn.commit(); _physicalNetworkDao.releaseFromLockTable(network.getId()); + return true; } @@ -2930,6 +2944,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { } // Remove dedication for the guest vlan + _datacneter_vnet.releaseDedicatedGuestVlans(dedicatedGuestVlan.getId()); if (_accountGuestVlanMapDao.remove(dedicatedGuestVlanRangeId)) { return true; } else { http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ad79f374/server/src/com/cloud/network/dao/AccountGuestVlanMapDao.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/network/dao/AccountGuestVlanMapDao.java b/server/src/com/cloud/network/dao/AccountGuestVlanMapDao.java index 57e1187..2a0a324 100755 --- a/server/src/com/cloud/network/dao/AccountGuestVlanMapDao.java +++ b/server/src/com/cloud/network/dao/AccountGuestVlanMapDao.java @@ -29,4 +29,6 @@ public interface AccountGuestVlanMapDao extends GenericDao<AccountGuestVlanMapVO public List<AccountGuestVlanMapVO> listAccountGuestVlanMapsByPhysicalNetwork(long physicalNetworkId); + public int removeByAccountId(long accountId); + } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ad79f374/server/src/com/cloud/network/dao/AccountGuestVlanMapDaoImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/network/dao/AccountGuestVlanMapDaoImpl.java b/server/src/com/cloud/network/dao/AccountGuestVlanMapDaoImpl.java index 05b92c5..eb2c2a1 100755 --- a/server/src/com/cloud/network/dao/AccountGuestVlanMapDaoImpl.java +++ b/server/src/com/cloud/network/dao/AccountGuestVlanMapDaoImpl.java @@ -58,6 +58,13 @@ public class AccountGuestVlanMapDaoImpl extends GenericDaoBase<AccountGuestVlanM return listIncludingRemovedBy(sc); } + @Override + public int removeByAccountId(long accountId) { + SearchCriteria<AccountGuestVlanMapVO> sc = AccountSearch.create(); + sc.setParameters("accountId", accountId); + return expunge(sc); + } + public AccountGuestVlanMapDaoImpl() { super(); AccountSearch = createSearchBuilder(); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ad79f374/server/src/com/cloud/user/AccountManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/user/AccountManagerImpl.java b/server/src/com/cloud/user/AccountManagerImpl.java index 8de73fb..4088f64 100755 --- a/server/src/com/cloud/user/AccountManagerImpl.java +++ b/server/src/com/cloud/user/AccountManagerImpl.java @@ -59,6 +59,7 @@ import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.configuration.dao.ResourceCountDao; import com.cloud.dc.DataCenterVO; import com.cloud.dc.dao.DataCenterDao; +import com.cloud.dc.dao.DataCenterVnetDao; import com.cloud.domain.Domain; import com.cloud.domain.DomainVO; import com.cloud.domain.dao.DomainDao; @@ -76,6 +77,8 @@ import com.cloud.network.IpAddress; import com.cloud.network.NetworkManager; import com.cloud.network.VpnUserVO; import com.cloud.network.as.AutoScaleManager; +import com.cloud.network.dao.AccountGuestVlanMapDao; +import com.cloud.network.dao.AccountGuestVlanMapVO; import com.cloud.network.dao.IPAddressDao; import com.cloud.network.dao.IPAddressVO; import com.cloud.network.dao.NetworkDao; @@ -222,6 +225,10 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M @Inject VolumeManager volumeMgr; @Inject private AffinityGroupDao _affinityGroupDao; + @Inject + private AccountGuestVlanMapDao _accountGuestVlanMapDao; + @Inject + private DataCenterVnetDao _dataCenterVnetDao; private List<UserAuthenticator> _userAuthenticators; List<UserAuthenticator> _userPasswordEncoders; @@ -699,6 +706,14 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M } } + // release account specific guest vlans + List<AccountGuestVlanMapVO> maps = _accountGuestVlanMapDao.listAccountGuestVlanMapsByAccount(accountId); + for (AccountGuestVlanMapVO map : maps) { + _dataCenterVnetDao.releaseDedicatedGuestVlans(map.getId()); + } + int vlansReleased = _accountGuestVlanMapDao.removeByAccountId(accountId); + s_logger.info("deleteAccount: Released " + vlansReleased + " dedicated guest vlan ranges from account " + accountId); + return true; } catch (Exception ex) { s_logger.warn("Failed to cleanup account " + account + " due to ", ex); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ad79f374/setup/db/db/schema-410to420.sql ---------------------------------------------------------------------- diff --git a/setup/db/db/schema-410to420.sql b/setup/db/db/schema-410to420.sql index 317cdc9..1626721 100644 --- a/setup/db/db/schema-410to420.sql +++ b/setup/db/db/schema-410to420.sql @@ -1126,4 +1126,4 @@ CREATE TABLE `cloud`.`account_guest_vlan_map` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ALTER TABLE `cloud`.`op_dc_vnet_alloc` ADD COLUMN account_guest_vlan_map_id bigint unsigned; -ALTER TABLE `cloud`.`op_dc_vnet_alloc` ADD CONSTRAINT `fk_op_dc_vnet_alloc__account_guest_vlan_map_id` FOREIGN KEY `fk_op_dc_vnet_alloc__account_guest_vlan_map_id` (`account_guest_vlan_map_id`) REFERENCES `account_guest_vlan_map` (`id`) ON DELETE CASCADE; +ALTER TABLE `cloud`.`op_dc_vnet_alloc` ADD CONSTRAINT `fk_op_dc_vnet_alloc__account_guest_vlan_map_id` FOREIGN KEY `fk_op_dc_vnet_alloc__account_guest_vlan_map_id` (`account_guest_vlan_map_id`) REFERENCES `account_guest_vlan_map` (`id`);
