From 84dcaf6db38fb515a93cb936948917684f2aea9f Mon Sep 17 00:00:00 2001 From: Stephan Date: Mon, 13 Mar 2023 09:20:49 -0300 Subject: [PATCH 1/3] Use max secondary storage defined on the account during the upload of volume, template, and ISOs. --- .../com/cloud/storage/VolumeApiServiceImpl.java | 13 ++++++------- .../cloud/template/HypervisorTemplateAdapter.java | 14 ++++++-------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java b/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java index d6325b431341..26b8c6e18141 100644 --- a/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java +++ b/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java @@ -486,13 +486,12 @@ public GetUploadParamsResponse doInTransaction(TransactionStatus status) throws //using the existing max upload size configuration command.setProcessTimeout(NumbersUtil.parseLong(_configDao.getValue("vmware.package.ova.timeout"), 3600)); command.setMaxUploadSize(_configDao.getValue(Config.MaxUploadVolumeSize.key())); - command.setAccountId(vol.getAccountId()); - Account account = _accountDao.findById(vol.getAccountId()); - if (account.getType().equals(Account.Type.PROJECT)) { - command.setDefaultMaxSecondaryStorageInGB(ResourceLimitService.MaxProjectSecondaryStorage.value()); - } else { - command.setDefaultMaxSecondaryStorageInGB(ResourceLimitService.MaxAccountSecondaryStorage.value()); - } + + Long accountId = vol.getAccountId(); + Account account = _accountDao.findById(accountId); + + command.setDefaultMaxSecondaryStorageInGB(_resourceLimitMgr.findCorrectResourceLimitForAccount(account, ResourceType.secondary_storage)); + command.setAccountId(accountId); Gson gson = new GsonBuilder().create(); String metadata = EncryptionUtil.encodeData(gson.toJson(command), key); response.setMetadata(metadata); diff --git a/server/src/main/java/com/cloud/template/HypervisorTemplateAdapter.java b/server/src/main/java/com/cloud/template/HypervisorTemplateAdapter.java index 2204e5a78b05..d0f50ed7b112 100644 --- a/server/src/main/java/com/cloud/template/HypervisorTemplateAdapter.java +++ b/server/src/main/java/com/cloud/template/HypervisorTemplateAdapter.java @@ -93,7 +93,6 @@ import com.cloud.storage.download.DownloadMonitor; import com.cloud.template.VirtualMachineTemplate.State; import com.cloud.user.Account; -import com.cloud.user.ResourceLimitService; import com.cloud.utils.Pair; import com.cloud.utils.UriUtils; import com.cloud.utils.db.DB; @@ -402,13 +401,12 @@ public List doInTransaction(TransactionStatus templateOnStore.getDataStore().getRole().toString()); //using the existing max template size configuration payload.setMaxUploadSize(_configDao.getValue(Config.MaxTemplateAndIsoSize.key())); - payload.setAccountId(template.getAccountId()); - Account account = _accountDao.findById(template.getAccountId()); - if (account.getType().equals(Account.Type.PROJECT)) { - payload.setDefaultMaxSecondaryStorageInGB(ResourceLimitService.MaxProjectSecondaryStorage.value()); - } else { - payload.setDefaultMaxSecondaryStorageInGB(ResourceLimitService.MaxAccountSecondaryStorage.value()); - } + + Long accountId = template.getAccountId(); + Account account = _accountDao.findById(accountId); + + payload.setDefaultMaxSecondaryStorageInGB(_resourceLimitMgr.findCorrectResourceLimitForAccount(account, ResourceType.secondary_storage)); + payload.setAccountId(accountId); payload.setRemoteEndPoint(ep.getPublicAddr()); payload.setRequiresHvm(template.requiresHvm()); payload.setDescription(template.getDisplayText()); From 4fb9dc259a8daa3074e22c3ef0abdf983ad7e32c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Jandre?= <48719461+JoaoJandre@users.noreply.github.com> Date: Thu, 13 Jul 2023 11:42:05 -0300 Subject: [PATCH 2/3] add check for domain --- .../main/java/com/cloud/user/ResourceLimitService.java | 9 +++++++++ .../cloud/resourcelimit/ResourceLimitManagerImpl.java | 8 ++++++++ .../java/com/cloud/storage/VolumeApiServiceImpl.java | 9 +++++++-- .../com/cloud/template/HypervisorTemplateAdapter.java | 4 +++- .../java/com/cloud/vpc/MockResourceLimitManagerImpl.java | 5 +++++ 5 files changed, 32 insertions(+), 3 deletions(-) diff --git a/api/src/main/java/com/cloud/user/ResourceLimitService.java b/api/src/main/java/com/cloud/user/ResourceLimitService.java index 41b2c8135cf0..f2d87a4390df 100644 --- a/api/src/main/java/com/cloud/user/ResourceLimitService.java +++ b/api/src/main/java/com/cloud/user/ResourceLimitService.java @@ -117,6 +117,15 @@ public interface ResourceLimitService { */ public long findDefaultResourceLimitForDomain(ResourceType resourceType); + /** + * Finds the resource limit for a specified account, domain and type. + * + * @param domain + * @param type + * @return resource limit + */ + public long findCorrectResourceLimitForAccountAndDomain(Account account, Domain domain, ResourceType type); + /** * Increments the resource count * diff --git a/server/src/main/java/com/cloud/resourcelimit/ResourceLimitManagerImpl.java b/server/src/main/java/com/cloud/resourcelimit/ResourceLimitManagerImpl.java index 9efeed39ac07..df03f079b4c9 100644 --- a/server/src/main/java/com/cloud/resourcelimit/ResourceLimitManagerImpl.java +++ b/server/src/main/java/com/cloud/resourcelimit/ResourceLimitManagerImpl.java @@ -534,6 +534,14 @@ public long findDefaultResourceLimitForDomain(ResourceType resourceType) { return resourceLimit; } + @Override + public long findCorrectResourceLimitForAccountAndDomain(Account account, Domain domain, ResourceType type) { + long maxSecondaryStorageForAccount = findCorrectResourceLimitForAccount(account, type); + long maxSecondaryStorageForDomain = findCorrectResourceLimitForDomain(domain, type); + + return Math.min(maxSecondaryStorageForDomain, maxSecondaryStorageForAccount); + } + @Override @DB public void checkResourceLimit(final Account account, final ResourceType type, long... count) throws ResourceAllocationException { diff --git a/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java b/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java index 26b8c6e18141..d358092a64ba 100644 --- a/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java +++ b/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java @@ -34,6 +34,7 @@ import javax.inject.Inject; +import com.cloud.domain.dao.DomainDao; import org.apache.cloudstack.api.ApiConstants.IoDriverPolicy; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.InternalIdentity; @@ -331,6 +332,9 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic @Inject protected SnapshotHelper snapshotHelper; + @Inject + protected DomainDao domainDao; + @Inject protected ProjectManager projectManager; @Inject @@ -487,10 +491,11 @@ public GetUploadParamsResponse doInTransaction(TransactionStatus status) throws command.setProcessTimeout(NumbersUtil.parseLong(_configDao.getValue("vmware.package.ova.timeout"), 3600)); command.setMaxUploadSize(_configDao.getValue(Config.MaxUploadVolumeSize.key())); - Long accountId = vol.getAccountId(); + long accountId = vol.getAccountId(); Account account = _accountDao.findById(accountId); + Domain domain = domainDao.findById(account.getDomainId()); - command.setDefaultMaxSecondaryStorageInGB(_resourceLimitMgr.findCorrectResourceLimitForAccount(account, ResourceType.secondary_storage)); + command.setDefaultMaxSecondaryStorageInGB(_resourceLimitMgr.findCorrectResourceLimitForAccountAndDomain(account, domain, ResourceType.secondary_storage)); command.setAccountId(accountId); Gson gson = new GsonBuilder().create(); String metadata = EncryptionUtil.encodeData(gson.toJson(command), key); diff --git a/server/src/main/java/com/cloud/template/HypervisorTemplateAdapter.java b/server/src/main/java/com/cloud/template/HypervisorTemplateAdapter.java index d0f50ed7b112..f5c19ecff1d2 100644 --- a/server/src/main/java/com/cloud/template/HypervisorTemplateAdapter.java +++ b/server/src/main/java/com/cloud/template/HypervisorTemplateAdapter.java @@ -28,6 +28,7 @@ import javax.inject.Inject; +import com.cloud.domain.Domain; import org.apache.cloudstack.agent.directdownload.CheckUrlAnswer; import org.apache.cloudstack.agent.directdownload.CheckUrlCommand; import org.apache.cloudstack.annotation.AnnotationService; @@ -404,8 +405,9 @@ public List doInTransaction(TransactionStatus Long accountId = template.getAccountId(); Account account = _accountDao.findById(accountId); + Domain domain = _domainDao.findById(account.getDomainId()); - payload.setDefaultMaxSecondaryStorageInGB(_resourceLimitMgr.findCorrectResourceLimitForAccount(account, ResourceType.secondary_storage)); + payload.setDefaultMaxSecondaryStorageInGB(_resourceLimitMgr.findCorrectResourceLimitForAccountAndDomain(account, domain, ResourceType.secondary_storage)); payload.setAccountId(accountId); payload.setRemoteEndPoint(ep.getPublicAddr()); payload.setRequiresHvm(template.requiresHvm()); diff --git a/server/src/test/java/com/cloud/vpc/MockResourceLimitManagerImpl.java b/server/src/test/java/com/cloud/vpc/MockResourceLimitManagerImpl.java index 1d1da5331d92..9b091dedc211 100644 --- a/server/src/test/java/com/cloud/vpc/MockResourceLimitManagerImpl.java +++ b/server/src/test/java/com/cloud/vpc/MockResourceLimitManagerImpl.java @@ -93,6 +93,11 @@ public long findDefaultResourceLimitForDomain(ResourceType resourceType) { return 0; } + @Override + public long findCorrectResourceLimitForAccountAndDomain(Account account, Domain domain, ResourceType type) { + return 0; + } + /* (non-Javadoc) * @see com.cloud.user.ResourceLimitService#incrementResourceCount(long, com.cloud.configuration.Resource.ResourceType, java.lang.Long[]) */ From d3d63e2eb0efd7285d2d0ed0b94c41778bb9eabb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Jandre?= <48719461+JoaoJandre@users.noreply.github.com> Date: Fri, 14 Jul 2023 09:09:21 -0300 Subject: [PATCH 3/3] fix check when one is unlimited --- .../com/cloud/resourcelimit/ResourceLimitManagerImpl.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/server/src/main/java/com/cloud/resourcelimit/ResourceLimitManagerImpl.java b/server/src/main/java/com/cloud/resourcelimit/ResourceLimitManagerImpl.java index df03f079b4c9..94004e935708 100644 --- a/server/src/main/java/com/cloud/resourcelimit/ResourceLimitManagerImpl.java +++ b/server/src/main/java/com/cloud/resourcelimit/ResourceLimitManagerImpl.java @@ -539,6 +539,10 @@ public long findCorrectResourceLimitForAccountAndDomain(Account account, Domain long maxSecondaryStorageForAccount = findCorrectResourceLimitForAccount(account, type); long maxSecondaryStorageForDomain = findCorrectResourceLimitForDomain(domain, type); + if (maxSecondaryStorageForDomain == Resource.RESOURCE_UNLIMITED || maxSecondaryStorageForAccount == Resource.RESOURCE_UNLIMITED) { + return Math.max(maxSecondaryStorageForDomain, maxSecondaryStorageForAccount); + } + return Math.min(maxSecondaryStorageForDomain, maxSecondaryStorageForAccount); }