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`);

Reply via email to