CLOUDSTACK-8958: release dedicated ip range in domain removal

This commit is contained in:
Wei Zhou 2016-01-20 17:21:06 +01:00 committed by Rohit Yadav
parent 86b6050c32
commit 5645164dbb
6 changed files with 143 additions and 1 deletions

View File

@ -219,6 +219,20 @@ public interface ConfigurationManager {
void createDefaultSystemNetworks(long zoneId) throws ConcurrentOperationException;
/**
* Release dedicated virtual ip ranges of a domain.
*
* @param domainId
* @return success/failure
*/
boolean releaseDomainSpecificVirtualRanges(long domainId);
/**
* Release dedicated virtual ip ranges of an account.
*
* @param accountId
* @return success/failure
*/
boolean releaseAccountSpecificVirtualRanges(long accountId);
/**

View File

@ -103,6 +103,10 @@ public class DomainVO implements Domain {
return id;
}
public void setId(long id) {
this.id = id;
}
@Override
public Long getParent() {
return parent;
@ -135,6 +139,10 @@ public class DomainVO implements Domain {
return accountId;
}
public void setAccountId(long accountId) {
this. accountId= accountId;
}
@Override
public Date getRemoved() {
return removed;

View File

@ -84,6 +84,7 @@ import org.apache.cloudstack.region.dao.RegionDao;
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao;
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
import org.apache.commons.collections.CollectionUtils;
import com.cloud.alert.AlertManager;
import com.cloud.api.ApiDBUtils;
@ -4935,6 +4936,32 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
return _networkOfferingDao.search(sc, searchFilter);
}
@Override
@DB
public boolean releaseDomainSpecificVirtualRanges(final long domainId) {
final List<DomainVlanMapVO> maps = _domainVlanMapDao.listDomainVlanMapsByDomain(domainId);
if (CollectionUtils.isNotEmpty(maps)) {
try {
Transaction.execute(new TransactionCallbackNoReturn() {
@Override
public void doInTransactionWithoutResult(final TransactionStatus status) {
for (DomainVlanMapVO map : maps) {
if (!releasePublicIpRange(map.getVlanDbId(), _accountMgr.getSystemUser().getId(), _accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM))) {
throw new CloudRuntimeException("Failed to release domain specific virtual ip ranges for domain id=" + domainId);
}
}
}
});
} catch (final CloudRuntimeException e) {
s_logger.error(e);
return false;
}
} else {
s_logger.trace("Domain id=" + domainId + " has no domain specific virtual ip ranges, nothing to release");
}
return true;
}
@Override
@DB
public boolean releaseAccountSpecificVirtualRanges(final long accountId) {

View File

@ -35,6 +35,7 @@ import org.apache.cloudstack.framework.messagebus.MessageBus;
import org.apache.cloudstack.framework.messagebus.PublishScope;
import org.apache.cloudstack.region.RegionManager;
import com.cloud.configuration.ConfigurationManager;
import com.cloud.configuration.Resource.ResourceOwnerType;
import com.cloud.configuration.ResourceLimit;
import com.cloud.configuration.dao.ResourceCountDao;
@ -105,6 +106,8 @@ public class DomainManagerImpl extends ManagerBase implements DomainManager, Dom
private NetworkOrchestrationService _networkMgr;
@Inject
private NetworkDomainDao _networkDomainDao;
@Inject
private ConfigurationManager _configMgr;
@Inject
MessageBus _messageBus;
@ -326,6 +329,14 @@ public class DomainManagerImpl extends ManagerBase implements DomainManager, Dom
}
}
if (!_configMgr.releaseDomainSpecificVirtualRanges(domain.getId())) {
CloudRuntimeException e = new CloudRuntimeException("Can't delete the domain yet because failed to release domain specific virtual ip ranges");
e.addProxyObject(domain.getUuid(), "domainId");
throw e;
} else {
s_logger.debug("Domain specific Virtual IP ranges " + " are successfully released as a part of domain id=" + domain.getId() + " cleanup.");
}
cleanupDomainOfferings(domain.getId());
CallContext.current().putContextParameter(Domain.class, domain.getUuid());
_messageBus.publish(_name, MESSAGE_REMOVE_DOMAIN_EVENT, PublishScope.LOCAL, domain);

View File

@ -17,17 +17,26 @@
package com.cloud.user;
import com.cloud.configuration.ConfigurationManager;
import com.cloud.configuration.Resource.ResourceOwnerType;
import com.cloud.configuration.dao.ResourceCountDao;
import com.cloud.configuration.dao.ResourceLimitDao;
import com.cloud.dc.DedicatedResourceVO;
import com.cloud.dc.dao.DedicatedResourceDao;
import com.cloud.domain.Domain;
import com.cloud.domain.DomainVO;
import com.cloud.domain.dao.DomainDao;
import com.cloud.network.dao.NetworkDomainDao;
import com.cloud.projects.ProjectManager;
import com.cloud.projects.dao.ProjectDao;
import com.cloud.service.ServiceOfferingVO;
import com.cloud.service.dao.ServiceOfferingDao;
import com.cloud.storage.DiskOfferingVO;
import com.cloud.storage.dao.DiskOfferingDao;
import com.cloud.user.dao.AccountDao;
import com.cloud.utils.db.Filter;
import com.cloud.utils.db.SearchCriteria;
import org.apache.cloudstack.context.CallContext;
import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
import org.apache.cloudstack.framework.messagebus.MessageBus;
import org.apache.cloudstack.region.RegionManager;
@ -41,6 +50,8 @@ import org.mockito.runners.MockitoJUnitRunner;
import javax.inject.Inject;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.UUID;
@RunWith(MockitoJUnitRunner.class)
public class DomainManagerImplTest {
@ -72,6 +83,8 @@ public class DomainManagerImplTest {
NetworkDomainDao _networkDomainDao;
@Mock
MessageBus _messageBus;
@Mock
ConfigurationManager _configMgr;
DomainManagerImpl domainManager;
@ -134,4 +147,64 @@ public class DomainManagerImplTest {
Assert.assertEquals(domain, domainManager.findDomainByIdOrPath(1L, "/validDomain/"));
}
@Test
public void deleteDomain() {
DomainVO domain = new DomainVO();
domain.setId(20l);
domain.setAccountId(30l);
Account account = new AccountVO("testaccount", 1L, "networkdomain", (short)0, "uuid");
UserVO user = new UserVO(1, "testuser", "password", "firstname", "lastName", "email", "timezone", UUID.randomUUID().toString(), User.Source.UNKNOWN);
CallContext.register(user, account);
Mockito.when(_domainDao.findById(20l)).thenReturn(domain);
Mockito.doNothing().when(_accountMgr).checkAccess(Mockito.any(Account.class), Mockito.any(Domain.class));
Mockito.when(_domainDao.update(Mockito.eq(20l), Mockito.any(DomainVO.class))).thenReturn(true);
Mockito.when(_accountDao.search(Mockito.any(SearchCriteria.class), (Filter)org.mockito.Matchers.isNull())).thenReturn(new ArrayList<AccountVO>());
Mockito.when(_networkDomainDao.listNetworkIdsByDomain(Mockito.anyLong())).thenReturn(new ArrayList<Long>());
Mockito.when(_accountDao.findCleanupsForRemovedAccounts(Mockito.anyLong())).thenReturn(new ArrayList<AccountVO>());
Mockito.when(_dedicatedDao.listByDomainId(Mockito.anyLong())).thenReturn(new ArrayList<DedicatedResourceVO>());
Mockito.when(_domainDao.remove(Mockito.anyLong())).thenReturn(true);
Mockito.when(_configMgr.releaseDomainSpecificVirtualRanges(Mockito.anyLong())).thenReturn(true);
Mockito.when(_diskOfferingDao.listByDomainId(Mockito.anyLong())).thenReturn(new ArrayList<DiskOfferingVO>());
Mockito.when(_offeringsDao.findServiceOfferingByDomainId(Mockito.anyLong())).thenReturn(new ArrayList<ServiceOfferingVO>());
try {
Assert.assertTrue(domainManager.deleteDomain(20l, false));
} finally {
CallContext.unregister();
}
}
@Test
public void deleteDomainCleanup() {
DomainVO domain = new DomainVO();
domain.setId(20l);
domain.setAccountId(30l);
Account account = new AccountVO("testaccount", 1L, "networkdomain", (short)0, "uuid");
UserVO user = new UserVO(1, "testuser", "password", "firstname", "lastName", "email", "timezone", UUID.randomUUID().toString(), User.Source.UNKNOWN);
CallContext.register(user, account);
Mockito.when(_domainDao.findById(20l)).thenReturn(domain);
Mockito.doNothing().when(_accountMgr).checkAccess(Mockito.any(Account.class), Mockito.any(Domain.class));
Mockito.when(_domainDao.update(Mockito.eq(20l), Mockito.any(DomainVO.class))).thenReturn(true);
Mockito.when(_domainDao.createSearchCriteria()).thenReturn(Mockito.mock(SearchCriteria.class));
Mockito.when(_domainDao.search(Mockito.any(SearchCriteria.class), (Filter)org.mockito.Matchers.isNull())).thenReturn(new ArrayList<DomainVO>());
Mockito.when(_accountDao.createSearchCriteria()).thenReturn(Mockito.mock(SearchCriteria.class));
Mockito.when(_accountDao.search(Mockito.any(SearchCriteria.class), (Filter)org.mockito.Matchers.isNull())).thenReturn(new ArrayList<AccountVO>());
Mockito.when(_networkDomainDao.listNetworkIdsByDomain(Mockito.anyLong())).thenReturn(new ArrayList<Long>());
Mockito.when(_accountDao.findCleanupsForRemovedAccounts(Mockito.anyLong())).thenReturn(new ArrayList<AccountVO>());
Mockito.when(_dedicatedDao.listByDomainId(Mockito.anyLong())).thenReturn(new ArrayList<DedicatedResourceVO>());
Mockito.when(_domainDao.remove(Mockito.anyLong())).thenReturn(true);
Mockito.when(_resourceCountDao.removeEntriesByOwner(Mockito.anyLong(), Mockito.eq(ResourceOwnerType.Domain))).thenReturn(1l);
Mockito.when(_resourceLimitDao.removeEntriesByOwner(Mockito.anyLong(), Mockito.eq(ResourceOwnerType.Domain))).thenReturn(1l);
Mockito.when(_configMgr.releaseDomainSpecificVirtualRanges(Mockito.anyLong())).thenReturn(true);
Mockito.when(_diskOfferingDao.listByDomainId(Mockito.anyLong())).thenReturn(new ArrayList<DiskOfferingVO>());
Mockito.when(_offeringsDao.findServiceOfferingByDomainId(Mockito.anyLong())).thenReturn(new ArrayList<ServiceOfferingVO>());
try {
Assert.assertTrue(domainManager.deleteDomain(20l, true));
} finally {
CallContext.unregister();
}
}
}

View File

@ -456,7 +456,16 @@ public class MockConfigurationManagerImpl extends ManagerBase implements Configu
}
/* (non-Javadoc)
* @see com.cloud.configuration.ConfigurationManager#deleteAccountSpecificVirtualRanges(long)
* @see com.cloud.configuration.ConfigurationManager#releaseDomainSpecificVirtualRanges(long)
*/
@Override
public boolean releaseDomainSpecificVirtualRanges(long domainId) {
// TODO Auto-generated method stub
return false;
}
/* (non-Javadoc)
* @see com.cloud.configuration.ConfigurationManager#releaseAccountSpecificVirtualRanges(long)
*/
@Override
public boolean releaseAccountSpecificVirtualRanges(long accountId) {