Skip to content

Commit d9b7b8c

Browse files
committed
Merge branch '4.9' into 4.10
Signed-off-by: Rohit Yadav <rohit.yadav@shapeblue.com>
2 parents cf6c949 + 542b7e6 commit d9b7b8c

6 files changed

Lines changed: 166 additions & 30 deletions

File tree

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: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,6 @@
3434
import javax.inject.Inject;
3535
import javax.naming.ConfigurationException;
3636

37-
import com.google.common.base.MoreObjects;
38-
import org.apache.commons.collections.CollectionUtils;
39-
import org.apache.commons.collections.MapUtils;
40-
import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
41-
import org.apache.cloudstack.storage.datastore.db.ImageStoreDao;
42-
import org.apache.log4j.Logger;
43-
4437
import org.apache.cloudstack.acl.SecurityChecker;
4538
import org.apache.cloudstack.affinity.AffinityGroup;
4639
import org.apache.cloudstack.affinity.AffinityGroupService;
@@ -72,6 +65,7 @@
7265
import org.apache.cloudstack.context.CallContext;
7366
import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
7467
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
68+
import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
7569
import org.apache.cloudstack.framework.config.ConfigDepot;
7670
import org.apache.cloudstack.framework.config.ConfigKey;
7771
import org.apache.cloudstack.framework.config.Configurable;
@@ -86,11 +80,15 @@
8680
import org.apache.cloudstack.region.Region;
8781
import org.apache.cloudstack.region.RegionVO;
8882
import org.apache.cloudstack.region.dao.RegionDao;
83+
import org.apache.cloudstack.storage.datastore.db.ImageStoreDao;
8984
import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao;
9085
import org.apache.cloudstack.storage.datastore.db.ImageStoreVO;
9186
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
9287
import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao;
9388
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
89+
import org.apache.commons.collections.CollectionUtils;
90+
import org.apache.commons.collections.MapUtils;
91+
import org.apache.log4j.Logger;
9492

9593
import com.cloud.alert.AlertManager;
9694
import com.cloud.api.ApiDBUtils;
@@ -221,7 +219,7 @@
221219
import com.cloud.vm.dao.NicIpAliasVO;
222220
import com.cloud.vm.dao.NicSecondaryIpDao;
223221
import com.cloud.vm.dao.VMInstanceDao;
224-
222+
import com.google.common.base.MoreObjects;
225223
import com.google.common.base.Preconditions;
226224

227225
public class ConfigurationManagerImpl extends ManagerBase implements ConfigurationManager, ConfigurationService, Configurable {
@@ -5026,6 +5024,32 @@ public List<? extends NetworkOffering> listNetworkOfferings(final TrafficType tr
50265024
return _networkOfferingDao.search(sc, searchFilter);
50275025
}
50285026

5027+
@Override
5028+
@DB
5029+
public boolean releaseDomainSpecificVirtualRanges(final long domainId) {
5030+
final List<DomainVlanMapVO> maps = _domainVlanMapDao.listDomainVlanMapsByDomain(domainId);
5031+
if (CollectionUtils.isNotEmpty(maps)) {
5032+
try {
5033+
Transaction.execute(new TransactionCallbackNoReturn() {
5034+
@Override
5035+
public void doInTransactionWithoutResult(final TransactionStatus status) {
5036+
for (DomainVlanMapVO map : maps) {
5037+
if (!releasePublicIpRange(map.getVlanDbId(), _accountMgr.getSystemUser().getId(), _accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM))) {
5038+
throw new CloudRuntimeException("Failed to release domain specific virtual ip ranges for domain id=" + domainId);
5039+
}
5040+
}
5041+
}
5042+
});
5043+
} catch (final CloudRuntimeException e) {
5044+
s_logger.error(e);
5045+
return false;
5046+
}
5047+
} else {
5048+
s_logger.trace("Domain id=" + domainId + " has no domain specific virtual ip ranges, nothing to release");
5049+
}
5050+
return true;
5051+
}
5052+
50295053
@Override
50305054
@DB
50315055
public boolean releaseAccountSpecificVirtualRanges(final long accountId) {

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

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,6 @@
2323

2424
import javax.inject.Inject;
2525

26-
import org.apache.log4j.Logger;
27-
import org.springframework.stereotype.Component;
28-
2926
import org.apache.cloudstack.api.command.admin.domain.ListDomainChildrenCmd;
3027
import org.apache.cloudstack.api.command.admin.domain.ListDomainsCmd;
3128
import org.apache.cloudstack.api.command.admin.domain.UpdateDomainCmd;
@@ -36,7 +33,10 @@
3633
import org.apache.cloudstack.region.RegionManager;
3734
import org.apache.commons.collections.CollectionUtils;
3835
import org.apache.commons.lang.BooleanUtils;
36+
import org.apache.log4j.Logger;
37+
import org.springframework.stereotype.Component;
3938

39+
import com.cloud.configuration.ConfigurationManager;
4040
import com.cloud.configuration.Resource.ResourceOwnerType;
4141
import com.cloud.configuration.ResourceLimit;
4242
import com.cloud.configuration.dao.ResourceCountDao;
@@ -108,6 +108,8 @@ public class DomainManagerImpl extends ManagerBase implements DomainManager, Dom
108108
private NetworkOrchestrationService _networkMgr;
109109
@Inject
110110
private NetworkDomainDao _networkDomainDao;
111+
@Inject
112+
private ConfigurationManager _configMgr;
111113

112114
@Inject
113115
MessageBus _messageBus;
@@ -309,6 +311,14 @@ public boolean deleteDomain(DomainVO domain, Boolean cleanup) {
309311
removeDomainWithNoAccountsForCleanupNetworksOrDedicatedResources(domain);
310312
}
311313

314+
if (!_configMgr.releaseDomainSpecificVirtualRanges(domain.getId())) {
315+
CloudRuntimeException e = new CloudRuntimeException("Can't delete the domain yet because failed to release domain specific virtual ip ranges");
316+
e.addProxyObject(domain.getUuid(), "domainId");
317+
throw e;
318+
} else {
319+
s_logger.debug("Domain specific Virtual IP ranges " + " are successfully released as a part of domain id=" + domain.getId() + " cleanup.");
320+
}
321+
312322
cleanupDomainOfferings(domain.getId());
313323
CallContext.current().putContextParameter(Domain.class, domain.getUuid());
314324
return true;

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

Lines changed: 89 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,27 +17,11 @@
1717

1818
package com.cloud.user;
1919

20-
import com.cloud.configuration.dao.ResourceCountDao;
21-
import com.cloud.configuration.dao.ResourceLimitDao;
22-
import com.cloud.dc.DedicatedResourceVO;
23-
import com.cloud.dc.dao.DedicatedResourceDao;
24-
import com.cloud.domain.Domain;
25-
import com.cloud.domain.DomainVO;
26-
import com.cloud.domain.dao.DomainDao;
27-
import com.cloud.exception.InvalidParameterValueException;
28-
import com.cloud.exception.PermissionDeniedException;
29-
import com.cloud.network.dao.NetworkDomainDao;
30-
import com.cloud.projects.ProjectManager;
31-
import com.cloud.projects.dao.ProjectDao;
32-
import com.cloud.service.dao.ServiceOfferingDao;
33-
import com.cloud.storage.dao.DiskOfferingDao;
34-
import com.cloud.user.dao.AccountDao;
35-
import com.cloud.utils.db.GlobalLock;
36-
import com.cloud.utils.exception.CloudRuntimeException;
37-
3820
import java.util.ArrayList;
3921
import java.util.List;
22+
import java.util.UUID;
4023

24+
import org.apache.cloudstack.context.CallContext;
4125
import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
4226
import org.apache.cloudstack.framework.messagebus.MessageBus;
4327
import org.apache.cloudstack.framework.messagebus.PublishScope;
@@ -53,6 +37,30 @@
5337
import org.mockito.Spy;
5438
import org.mockito.runners.MockitoJUnitRunner;
5539

40+
import com.cloud.configuration.ConfigurationManager;
41+
import com.cloud.configuration.Resource.ResourceOwnerType;
42+
import com.cloud.configuration.dao.ResourceCountDao;
43+
import com.cloud.configuration.dao.ResourceLimitDao;
44+
import com.cloud.dc.DedicatedResourceVO;
45+
import com.cloud.dc.dao.DedicatedResourceDao;
46+
import com.cloud.domain.Domain;
47+
import com.cloud.domain.DomainVO;
48+
import com.cloud.domain.dao.DomainDao;
49+
import com.cloud.exception.InvalidParameterValueException;
50+
import com.cloud.exception.PermissionDeniedException;
51+
import com.cloud.network.dao.NetworkDomainDao;
52+
import com.cloud.projects.ProjectManager;
53+
import com.cloud.projects.dao.ProjectDao;
54+
import com.cloud.service.ServiceOfferingVO;
55+
import com.cloud.service.dao.ServiceOfferingDao;
56+
import com.cloud.storage.DiskOfferingVO;
57+
import com.cloud.storage.dao.DiskOfferingDao;
58+
import com.cloud.user.dao.AccountDao;
59+
import com.cloud.utils.db.Filter;
60+
import com.cloud.utils.db.GlobalLock;
61+
import com.cloud.utils.db.SearchCriteria;
62+
import com.cloud.utils.exception.CloudRuntimeException;
63+
5664
@RunWith(MockitoJUnitRunner.class)
5765
public class DomainManagerImplTest {
5866
@Mock
@@ -83,6 +91,8 @@ public class DomainManagerImplTest {
8391
NetworkDomainDao _networkDomainDao;
8492
@Mock
8593
MessageBus _messageBus;
94+
@Mock
95+
ConfigurationManager _configMgr;
8696

8797
@Spy
8898
@InjectMocks
@@ -178,6 +188,7 @@ public void testDeleteDomainRootDomain() {
178188

179189
@Test
180190
public void testDeleteDomainNoCleanup() {
191+
Mockito.when(_configMgr.releaseDomainSpecificVirtualRanges(Mockito.anyLong())).thenReturn(true);
181192
domainManager.deleteDomain(DOMAIN_ID, testDomainCleanup);
182193
Mockito.verify(domainManager).deleteDomain(domain, testDomainCleanup);
183194
Mockito.verify(domainManager).removeDomainWithNoAccountsForCleanupNetworksOrDedicatedResources(domain);
@@ -224,4 +235,64 @@ public void testFailRemoveOperation() {
224235
domainManager.failRemoveOperation(domain, domainAccountsForCleanup, domainNetworkIds, true);
225236
}
226237

238+
@Test
239+
public void deleteDomain() {
240+
DomainVO domain = new DomainVO();
241+
domain.setId(20l);
242+
domain.setAccountId(30l);
243+
Account account = new AccountVO("testaccount", 1L, "networkdomain", (short)0, "uuid");
244+
UserVO user = new UserVO(1, "testuser", "password", "firstname", "lastName", "email", "timezone", UUID.randomUUID().toString(), User.Source.UNKNOWN);
245+
CallContext.register(user, account);
246+
247+
Mockito.when(_domainDao.findById(20l)).thenReturn(domain);
248+
Mockito.doNothing().when(_accountMgr).checkAccess(Mockito.any(Account.class), Mockito.any(Domain.class));
249+
Mockito.when(_domainDao.update(Mockito.eq(20l), Mockito.any(DomainVO.class))).thenReturn(true);
250+
Mockito.when(_accountDao.search(Mockito.any(SearchCriteria.class), (Filter)org.mockito.Matchers.isNull())).thenReturn(new ArrayList<AccountVO>());
251+
Mockito.when(_networkDomainDao.listNetworkIdsByDomain(Mockito.anyLong())).thenReturn(new ArrayList<Long>());
252+
Mockito.when(_accountDao.findCleanupsForRemovedAccounts(Mockito.anyLong())).thenReturn(new ArrayList<AccountVO>());
253+
Mockito.when(_dedicatedDao.listByDomainId(Mockito.anyLong())).thenReturn(new ArrayList<DedicatedResourceVO>());
254+
Mockito.when(_domainDao.remove(Mockito.anyLong())).thenReturn(true);
255+
Mockito.when(_configMgr.releaseDomainSpecificVirtualRanges(Mockito.anyLong())).thenReturn(true);
256+
Mockito.when(_diskOfferingDao.listByDomainId(Mockito.anyLong())).thenReturn(new ArrayList<DiskOfferingVO>());
257+
Mockito.when(_offeringsDao.findServiceOfferingByDomainId(Mockito.anyLong())).thenReturn(new ArrayList<ServiceOfferingVO>());
258+
259+
try {
260+
Assert.assertTrue(domainManager.deleteDomain(20l, false));
261+
} finally {
262+
CallContext.unregister();
263+
}
264+
}
265+
266+
@Test
267+
public void deleteDomainCleanup() {
268+
DomainVO domain = new DomainVO();
269+
domain.setId(20l);
270+
domain.setAccountId(30l);
271+
Account account = new AccountVO("testaccount", 1L, "networkdomain", (short)0, "uuid");
272+
UserVO user = new UserVO(1, "testuser", "password", "firstname", "lastName", "email", "timezone", UUID.randomUUID().toString(), User.Source.UNKNOWN);
273+
CallContext.register(user, account);
274+
275+
Mockito.when(_domainDao.findById(20l)).thenReturn(domain);
276+
Mockito.doNothing().when(_accountMgr).checkAccess(Mockito.any(Account.class), Mockito.any(Domain.class));
277+
Mockito.when(_domainDao.update(Mockito.eq(20l), Mockito.any(DomainVO.class))).thenReturn(true);
278+
Mockito.when(_domainDao.createSearchCriteria()).thenReturn(Mockito.mock(SearchCriteria.class));
279+
Mockito.when(_domainDao.search(Mockito.any(SearchCriteria.class), (Filter)org.mockito.Matchers.isNull())).thenReturn(new ArrayList<DomainVO>());
280+
Mockito.when(_accountDao.createSearchCriteria()).thenReturn(Mockito.mock(SearchCriteria.class));
281+
Mockito.when(_accountDao.search(Mockito.any(SearchCriteria.class), (Filter)org.mockito.Matchers.isNull())).thenReturn(new ArrayList<AccountVO>());
282+
Mockito.when(_networkDomainDao.listNetworkIdsByDomain(Mockito.anyLong())).thenReturn(new ArrayList<Long>());
283+
Mockito.when(_accountDao.findCleanupsForRemovedAccounts(Mockito.anyLong())).thenReturn(new ArrayList<AccountVO>());
284+
Mockito.when(_dedicatedDao.listByDomainId(Mockito.anyLong())).thenReturn(new ArrayList<DedicatedResourceVO>());
285+
Mockito.when(_domainDao.remove(Mockito.anyLong())).thenReturn(true);
286+
Mockito.when(_resourceCountDao.removeEntriesByOwner(Mockito.anyLong(), Mockito.eq(ResourceOwnerType.Domain))).thenReturn(1l);
287+
Mockito.when(_resourceLimitDao.removeEntriesByOwner(Mockito.anyLong(), Mockito.eq(ResourceOwnerType.Domain))).thenReturn(1l);
288+
Mockito.when(_configMgr.releaseDomainSpecificVirtualRanges(Mockito.anyLong())).thenReturn(true);
289+
Mockito.when(_diskOfferingDao.listByDomainId(Mockito.anyLong())).thenReturn(new ArrayList<DiskOfferingVO>());
290+
Mockito.when(_offeringsDao.findServiceOfferingByDomainId(Mockito.anyLong())).thenReturn(new ArrayList<ServiceOfferingVO>());
291+
292+
try {
293+
Assert.assertTrue(domainManager.deleteDomain(20l, true));
294+
} finally {
295+
CallContext.unregister();
296+
}
297+
}
227298
}

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)