Skip to content

Commit 5645164

Browse files
ustcweizhouyadvr
authored andcommitted
CLOUDSTACK-8958: release dedicated ip range in domain removal
1 parent 86b6050 commit 5645164

File tree

6 files changed

+143
-1
lines changed

6 files changed

+143
-1
lines changed

engine/components-api/src/com/cloud/configuration/ConfigurationManager.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,20 @@ Vlan createVlanAndPublicIpRange(long zoneId, long networkId, long physicalNetwor
219219

220220
void createDefaultSystemNetworks(long zoneId) throws ConcurrentOperationException;
221221

222+
/**
223+
* Release dedicated virtual ip ranges of a domain.
224+
*
225+
* @param domainId
226+
* @return success/failure
227+
*/
228+
boolean releaseDomainSpecificVirtualRanges(long domainId);
229+
230+
/**
231+
* Release dedicated virtual ip ranges of an account.
232+
*
233+
* @param accountId
234+
* @return success/failure
235+
*/
222236
boolean releaseAccountSpecificVirtualRanges(long accountId);
223237

224238
/**

engine/schema/src/com/cloud/domain/DomainVO.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,10 @@ public long getId() {
103103
return id;
104104
}
105105

106+
public void setId(long id) {
107+
this.id = id;
108+
}
109+
106110
@Override
107111
public Long getParent() {
108112
return parent;
@@ -135,6 +139,10 @@ public long getAccountId() {
135139
return accountId;
136140
}
137141

142+
public void setAccountId(long accountId) {
143+
this. accountId= accountId;
144+
}
145+
138146
@Override
139147
public Date getRemoved() {
140148
return removed;

server/src/com/cloud/configuration/ConfigurationManagerImpl.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
8585
import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao;
8686
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
87+
import org.apache.commons.collections.CollectionUtils;
8788

8889
import com.cloud.alert.AlertManager;
8990
import com.cloud.api.ApiDBUtils;
@@ -4935,6 +4936,32 @@ public List<? extends NetworkOffering> listNetworkOfferings(final TrafficType tr
49354936
return _networkOfferingDao.search(sc, searchFilter);
49364937
}
49374938

4939+
@Override
4940+
@DB
4941+
public boolean releaseDomainSpecificVirtualRanges(final long domainId) {
4942+
final List<DomainVlanMapVO> maps = _domainVlanMapDao.listDomainVlanMapsByDomain(domainId);
4943+
if (CollectionUtils.isNotEmpty(maps)) {
4944+
try {
4945+
Transaction.execute(new TransactionCallbackNoReturn() {
4946+
@Override
4947+
public void doInTransactionWithoutResult(final TransactionStatus status) {
4948+
for (DomainVlanMapVO map : maps) {
4949+
if (!releasePublicIpRange(map.getVlanDbId(), _accountMgr.getSystemUser().getId(), _accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM))) {
4950+
throw new CloudRuntimeException("Failed to release domain specific virtual ip ranges for domain id=" + domainId);
4951+
}
4952+
}
4953+
}
4954+
});
4955+
} catch (final CloudRuntimeException e) {
4956+
s_logger.error(e);
4957+
return false;
4958+
}
4959+
} else {
4960+
s_logger.trace("Domain id=" + domainId + " has no domain specific virtual ip ranges, nothing to release");
4961+
}
4962+
return true;
4963+
}
4964+
49384965
@Override
49394966
@DB
49404967
public boolean releaseAccountSpecificVirtualRanges(final long accountId) {

server/src/com/cloud/user/DomainManagerImpl.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.apache.cloudstack.framework.messagebus.PublishScope;
3636
import org.apache.cloudstack.region.RegionManager;
3737

38+
import com.cloud.configuration.ConfigurationManager;
3839
import com.cloud.configuration.Resource.ResourceOwnerType;
3940
import com.cloud.configuration.ResourceLimit;
4041
import com.cloud.configuration.dao.ResourceCountDao;
@@ -105,6 +106,8 @@ public class DomainManagerImpl extends ManagerBase implements DomainManager, Dom
105106
private NetworkOrchestrationService _networkMgr;
106107
@Inject
107108
private NetworkDomainDao _networkDomainDao;
109+
@Inject
110+
private ConfigurationManager _configMgr;
108111

109112
@Inject
110113
MessageBus _messageBus;
@@ -326,6 +329,14 @@ public boolean deleteDomain(DomainVO domain, Boolean cleanup) {
326329
}
327330
}
328331

332+
if (!_configMgr.releaseDomainSpecificVirtualRanges(domain.getId())) {
333+
CloudRuntimeException e = new CloudRuntimeException("Can't delete the domain yet because failed to release domain specific virtual ip ranges");
334+
e.addProxyObject(domain.getUuid(), "domainId");
335+
throw e;
336+
} else {
337+
s_logger.debug("Domain specific Virtual IP ranges " + " are successfully released as a part of domain id=" + domain.getId() + " cleanup.");
338+
}
339+
329340
cleanupDomainOfferings(domain.getId());
330341
CallContext.current().putContextParameter(Domain.class, domain.getUuid());
331342
_messageBus.publish(_name, MESSAGE_REMOVE_DOMAIN_EVENT, PublishScope.LOCAL, domain);

server/test/com/cloud/user/DomainManagerImplTest.java

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,26 @@
1717

1818
package com.cloud.user;
1919

20+
import com.cloud.configuration.ConfigurationManager;
21+
import com.cloud.configuration.Resource.ResourceOwnerType;
2022
import com.cloud.configuration.dao.ResourceCountDao;
2123
import com.cloud.configuration.dao.ResourceLimitDao;
24+
import com.cloud.dc.DedicatedResourceVO;
2225
import com.cloud.dc.dao.DedicatedResourceDao;
26+
import com.cloud.domain.Domain;
2327
import com.cloud.domain.DomainVO;
2428
import com.cloud.domain.dao.DomainDao;
2529
import com.cloud.network.dao.NetworkDomainDao;
2630
import com.cloud.projects.ProjectManager;
2731
import com.cloud.projects.dao.ProjectDao;
32+
import com.cloud.service.ServiceOfferingVO;
2833
import com.cloud.service.dao.ServiceOfferingDao;
34+
import com.cloud.storage.DiskOfferingVO;
2935
import com.cloud.storage.dao.DiskOfferingDao;
3036
import com.cloud.user.dao.AccountDao;
37+
import com.cloud.utils.db.Filter;
38+
import com.cloud.utils.db.SearchCriteria;
39+
import org.apache.cloudstack.context.CallContext;
3140
import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
3241
import org.apache.cloudstack.framework.messagebus.MessageBus;
3342
import org.apache.cloudstack.region.RegionManager;
@@ -41,6 +50,8 @@
4150

4251
import javax.inject.Inject;
4352
import java.lang.reflect.Field;
53+
import java.util.ArrayList;
54+
import java.util.UUID;
4455

4556
@RunWith(MockitoJUnitRunner.class)
4657
public class DomainManagerImplTest {
@@ -72,6 +83,8 @@ public class DomainManagerImplTest {
7283
NetworkDomainDao _networkDomainDao;
7384
@Mock
7485
MessageBus _messageBus;
86+
@Mock
87+
ConfigurationManager _configMgr;
7588

7689
DomainManagerImpl domainManager;
7790

@@ -134,4 +147,64 @@ public void testFindDomainByIdOrPathValidId() {
134147
Assert.assertEquals(domain, domainManager.findDomainByIdOrPath(1L, "/validDomain/"));
135148
}
136149

150+
@Test
151+
public void deleteDomain() {
152+
DomainVO domain = new DomainVO();
153+
domain.setId(20l);
154+
domain.setAccountId(30l);
155+
Account account = new AccountVO("testaccount", 1L, "networkdomain", (short)0, "uuid");
156+
UserVO user = new UserVO(1, "testuser", "password", "firstname", "lastName", "email", "timezone", UUID.randomUUID().toString(), User.Source.UNKNOWN);
157+
CallContext.register(user, account);
158+
159+
Mockito.when(_domainDao.findById(20l)).thenReturn(domain);
160+
Mockito.doNothing().when(_accountMgr).checkAccess(Mockito.any(Account.class), Mockito.any(Domain.class));
161+
Mockito.when(_domainDao.update(Mockito.eq(20l), Mockito.any(DomainVO.class))).thenReturn(true);
162+
Mockito.when(_accountDao.search(Mockito.any(SearchCriteria.class), (Filter)org.mockito.Matchers.isNull())).thenReturn(new ArrayList<AccountVO>());
163+
Mockito.when(_networkDomainDao.listNetworkIdsByDomain(Mockito.anyLong())).thenReturn(new ArrayList<Long>());
164+
Mockito.when(_accountDao.findCleanupsForRemovedAccounts(Mockito.anyLong())).thenReturn(new ArrayList<AccountVO>());
165+
Mockito.when(_dedicatedDao.listByDomainId(Mockito.anyLong())).thenReturn(new ArrayList<DedicatedResourceVO>());
166+
Mockito.when(_domainDao.remove(Mockito.anyLong())).thenReturn(true);
167+
Mockito.when(_configMgr.releaseDomainSpecificVirtualRanges(Mockito.anyLong())).thenReturn(true);
168+
Mockito.when(_diskOfferingDao.listByDomainId(Mockito.anyLong())).thenReturn(new ArrayList<DiskOfferingVO>());
169+
Mockito.when(_offeringsDao.findServiceOfferingByDomainId(Mockito.anyLong())).thenReturn(new ArrayList<ServiceOfferingVO>());
170+
171+
try {
172+
Assert.assertTrue(domainManager.deleteDomain(20l, false));
173+
} finally {
174+
CallContext.unregister();
175+
}
176+
}
177+
178+
@Test
179+
public void deleteDomainCleanup() {
180+
DomainVO domain = new DomainVO();
181+
domain.setId(20l);
182+
domain.setAccountId(30l);
183+
Account account = new AccountVO("testaccount", 1L, "networkdomain", (short)0, "uuid");
184+
UserVO user = new UserVO(1, "testuser", "password", "firstname", "lastName", "email", "timezone", UUID.randomUUID().toString(), User.Source.UNKNOWN);
185+
CallContext.register(user, account);
186+
187+
Mockito.when(_domainDao.findById(20l)).thenReturn(domain);
188+
Mockito.doNothing().when(_accountMgr).checkAccess(Mockito.any(Account.class), Mockito.any(Domain.class));
189+
Mockito.when(_domainDao.update(Mockito.eq(20l), Mockito.any(DomainVO.class))).thenReturn(true);
190+
Mockito.when(_domainDao.createSearchCriteria()).thenReturn(Mockito.mock(SearchCriteria.class));
191+
Mockito.when(_domainDao.search(Mockito.any(SearchCriteria.class), (Filter)org.mockito.Matchers.isNull())).thenReturn(new ArrayList<DomainVO>());
192+
Mockito.when(_accountDao.createSearchCriteria()).thenReturn(Mockito.mock(SearchCriteria.class));
193+
Mockito.when(_accountDao.search(Mockito.any(SearchCriteria.class), (Filter)org.mockito.Matchers.isNull())).thenReturn(new ArrayList<AccountVO>());
194+
Mockito.when(_networkDomainDao.listNetworkIdsByDomain(Mockito.anyLong())).thenReturn(new ArrayList<Long>());
195+
Mockito.when(_accountDao.findCleanupsForRemovedAccounts(Mockito.anyLong())).thenReturn(new ArrayList<AccountVO>());
196+
Mockito.when(_dedicatedDao.listByDomainId(Mockito.anyLong())).thenReturn(new ArrayList<DedicatedResourceVO>());
197+
Mockito.when(_domainDao.remove(Mockito.anyLong())).thenReturn(true);
198+
Mockito.when(_resourceCountDao.removeEntriesByOwner(Mockito.anyLong(), Mockito.eq(ResourceOwnerType.Domain))).thenReturn(1l);
199+
Mockito.when(_resourceLimitDao.removeEntriesByOwner(Mockito.anyLong(), Mockito.eq(ResourceOwnerType.Domain))).thenReturn(1l);
200+
Mockito.when(_configMgr.releaseDomainSpecificVirtualRanges(Mockito.anyLong())).thenReturn(true);
201+
Mockito.when(_diskOfferingDao.listByDomainId(Mockito.anyLong())).thenReturn(new ArrayList<DiskOfferingVO>());
202+
Mockito.when(_offeringsDao.findServiceOfferingByDomainId(Mockito.anyLong())).thenReturn(new ArrayList<ServiceOfferingVO>());
203+
204+
try {
205+
Assert.assertTrue(domainManager.deleteDomain(20l, true));
206+
} finally {
207+
CallContext.unregister();
208+
}
209+
}
137210
}

server/test/com/cloud/vpc/MockConfigurationManagerImpl.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,16 @@ public void createDefaultSystemNetworks(long zoneId) throws ConcurrentOperationE
456456
}
457457

458458
/* (non-Javadoc)
459-
* @see com.cloud.configuration.ConfigurationManager#deleteAccountSpecificVirtualRanges(long)
459+
* @see com.cloud.configuration.ConfigurationManager#releaseDomainSpecificVirtualRanges(long)
460+
*/
461+
@Override
462+
public boolean releaseDomainSpecificVirtualRanges(long domainId) {
463+
// TODO Auto-generated method stub
464+
return false;
465+
}
466+
467+
/* (non-Javadoc)
468+
* @see com.cloud.configuration.ConfigurationManager#releaseAccountSpecificVirtualRanges(long)
460469
*/
461470
@Override
462471
public boolean releaseAccountSpecificVirtualRanges(long accountId) {

0 commit comments

Comments
 (0)