From 86a0aefa74034898fc71dcb9d35d54b36dc0e0e6 Mon Sep 17 00:00:00 2001 From: Alain Courtines Date: Fri, 31 May 2024 12:59:16 -0700 Subject: [PATCH 1/4] api for resource limit configuration --- .../user/resource/UpdateResourceLimitCmd.java | 1 + .../java/com/cloud/configuration/Config.java | 9 ++ .../ResourceLimitManagerImpl.java | 2 + .../ResourceLimitManagerImplTest.java | 87 +++++++++++++++++++ 4 files changed, 99 insertions(+) diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/resource/UpdateResourceLimitCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/resource/UpdateResourceLimitCmd.java index 52afd2b1760c..3538a389a6e9 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/resource/UpdateResourceLimitCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/resource/UpdateResourceLimitCmd.java @@ -62,6 +62,7 @@ public class UpdateResourceLimitCmd extends BaseCmd { + "2 - Volume. Number of disk volumes a user can create. " + "3 - Snapshot. Number of snapshots a user can create. " + "4 - Template. Number of templates that a user can register/create. " + + "5 - Project. Number of projects a user can create. " + "6 - Network. Number of guest network a user can create. " + "7 - VPC. Number of VPC a user can create. " + "8 - CPU. Total number of CPU cores a user can use. " diff --git a/server/src/main/java/com/cloud/configuration/Config.java b/server/src/main/java/com/cloud/configuration/Config.java index 1fb36b65ecf1..5101bf525ed7 100644 --- a/server/src/main/java/com/cloud/configuration/Config.java +++ b/server/src/main/java/com/cloud/configuration/Config.java @@ -1366,6 +1366,14 @@ public enum Config { "200", "The default maximum primary storage space (in GiB) that can be used for an account", null), +DefaultMaxAccountProjects( + "Account Defaults", + ManagementServer.class, + Long.class, + "max.account.projects", + "10", + "The default maximum number of projects that can be created for an account", + null), //disabling lb as cluster sync does not work with distributed cluster SubDomainNetworkAccess( @@ -1415,6 +1423,7 @@ public enum Config { DefaultMaxDomainMemory("Domain Defaults", ManagementServer.class, Long.class, "max.domain.memory", "81920", "The default maximum memory (in MB) that can be used for a domain", null), DefaultMaxDomainPrimaryStorage("Domain Defaults", ManagementServer.class, Long.class, "max.domain.primary.storage", "400", "The default maximum primary storage space (in GiB) that can be used for a domain", null), DefaultMaxDomainSecondaryStorage("Domain Defaults", ManagementServer.class, Long.class, "max.domain.secondary.storage", "800", "The default maximum secondary storage space (in GiB) that can be used for a domain", null), + DefaultMaxDomainProjects("Domain Defaults",ManagementServer.class,Long.class,"max.domain.projects","50","The default maximum number of projects that can be created for a domain",null), DefaultMaxProjectUserVms( "Project Defaults", diff --git a/server/src/main/java/com/cloud/resourcelimit/ResourceLimitManagerImpl.java b/server/src/main/java/com/cloud/resourcelimit/ResourceLimitManagerImpl.java index 4455c4721136..6232ec922e40 100644 --- a/server/src/main/java/com/cloud/resourcelimit/ResourceLimitManagerImpl.java +++ b/server/src/main/java/com/cloud/resourcelimit/ResourceLimitManagerImpl.java @@ -288,6 +288,7 @@ public boolean configure(final String name, final Map params) th accountResourceLimitMap.put(Resource.ResourceType.memory.name(), Long.parseLong(_configDao.getValue(Config.DefaultMaxAccountMemory.key()))); accountResourceLimitMap.put(Resource.ResourceType.primary_storage.name(), Long.parseLong(_configDao.getValue(Config.DefaultMaxAccountPrimaryStorage.key()))); accountResourceLimitMap.put(Resource.ResourceType.secondary_storage.name(), MaxAccountSecondaryStorage.value()); + accountResourceLimitMap.put(Resource.ResourceType.project.name(),Long.parseLong(_configDao.getValue(Config.DefaultMaxAccountProjects.key()))); domainResourceLimitMap.put(Resource.ResourceType.public_ip.name(), Long.parseLong(_configDao.getValue(Config.DefaultMaxDomainPublicIPs.key()))); domainResourceLimitMap.put(Resource.ResourceType.snapshot.name(), Long.parseLong(_configDao.getValue(Config.DefaultMaxDomainSnapshots.key()))); @@ -300,6 +301,7 @@ public boolean configure(final String name, final Map params) th domainResourceLimitMap.put(Resource.ResourceType.memory.name(), Long.parseLong(_configDao.getValue(Config.DefaultMaxDomainMemory.key()))); domainResourceLimitMap.put(Resource.ResourceType.primary_storage.name(), Long.parseLong(_configDao.getValue(Config.DefaultMaxDomainPrimaryStorage.key()))); domainResourceLimitMap.put(Resource.ResourceType.secondary_storage.name(), Long.parseLong(_configDao.getValue(Config.DefaultMaxDomainSecondaryStorage.key()))); + domainResourceLimitMap.put(Resource.ResourceType.project.name(),Long.parseLong(_configDao.getValue(Config.DefaultMaxDomainProjects.key()))); } catch (NumberFormatException e) { logger.error("NumberFormatException during configuration", e); throw new ConfigurationException("Configuration failed due to NumberFormatException, see log for the stacktrace"); diff --git a/server/src/test/java/com/cloud/resourcelimit/ResourceLimitManagerImplTest.java b/server/src/test/java/com/cloud/resourcelimit/ResourceLimitManagerImplTest.java index 3d31561f2680..a51bcb8713cd 100644 --- a/server/src/test/java/com/cloud/resourcelimit/ResourceLimitManagerImplTest.java +++ b/server/src/test/java/com/cloud/resourcelimit/ResourceLimitManagerImplTest.java @@ -190,6 +190,12 @@ protected void updateResourceLimit() { // update resource Limit for a domain for resource_type = 11 (Secondary storage (in GiB)) resourceLimitServiceCall(null, (long)1, 10, (long)400); + + // update resource Limit for an account for resource_type = 5 (Project) + resourceLimitServiceCall((long) 1, (long) 1, 5, (long) 50); + + // update resource Limit for a domain for resource_type = 5 (Project) + resourceLimitServiceCall(null, (long) 1, 5, (long) 100); } private void resourceLimitServiceCall(Long accountId, Long domainId, Integer resourceType, Long max) { @@ -412,6 +418,39 @@ public void testFindCorrectResourceLimitForAccount() { result = resourceLimitManager.findCorrectResourceLimitForAccount(account, Resource.ResourceType.cpu, hostTags.get(0)); Assert.assertEquals(defaultAccountCpuMax, result); } + + @Test + public void testFindCorrectResourceLimitForAccountProjects() { + AccountVO account = Mockito.mock(AccountVO.class); + Mockito.when(account.getId()).thenReturn(1L); + Mockito.when(accountManager.isRootAdmin(1L)).thenReturn(true); + + // Test for Resource.RESOURCE_UNLIMITED when account is Root Admin + long result = resourceLimitManager.findCorrectResourceLimitForAccount(account, + Resource.ResourceType.project, hostTags.get(0)); + Assert.assertEquals(Resource.RESOURCE_UNLIMITED, result); + + // Test when account is not Root Admin and specific limit is set + Mockito.when(accountManager.isRootAdmin(1L)).thenReturn(false); + ResourceLimitVO limit = new ResourceLimitVO(); + limit.setMax(10L); + Mockito.when(resourceLimitDao.findByOwnerIdAndTypeAndTag(1L, Resource.ResourceOwnerType.Account, + Resource.ResourceType.project, hostTags.get(0))).thenReturn(limit); + result = resourceLimitManager.findCorrectResourceLimitForAccount(account, Resource.ResourceType.project, + hostTags.get(0)); + Assert.assertEquals(10L, result); + + // Test default account project limit + long defaultAccountProjectsMax = 15L; + Map accountResourceLimitMap = new HashMap<>(); + accountResourceLimitMap.put(Resource.ResourceType.project.name(), defaultAccountProjectsMax); + resourceLimitManager.accountResourceLimitMap = accountResourceLimitMap; + Mockito.when(resourceLimitDao.findByOwnerIdAndTypeAndTag(1L, Resource.ResourceOwnerType.Account, + Resource.ResourceType.project, hostTags.get(0))).thenReturn(null); + result = resourceLimitManager.findCorrectResourceLimitForAccount(account, Resource.ResourceType.project, + hostTags.get(0)); + Assert.assertEquals(defaultAccountProjectsMax, result); + } @Test public void testFindCorrectResourceLimitForAccountId1() { @@ -471,6 +510,54 @@ public void testFindCorrectResourceLimitForDomain() { result = resourceLimitManager.findCorrectResourceLimitForDomain(domain, Resource.ResourceType.cpu, hostTags.get(0)); Assert.assertEquals(defaultDomainCpuMax, result); } + + @Test + public void testFindCorrectResourceLimitForDomainProjects() { + DomainVO domain = Mockito.mock(DomainVO.class); + Mockito.when(domain.getId()).thenReturn(1L); + long result = resourceLimitManager.findCorrectResourceLimitForDomain(domain, Resource.ResourceType.project, + hostTags.get(0)); + Assert.assertEquals(Resource.RESOURCE_UNLIMITED, result); + + // Test specific limit set for domain + Mockito.when(domain.getId()).thenReturn(2L); + Mockito.when(domain.getParent()).thenReturn(null); + ResourceLimitVO limit = new ResourceLimitVO(); + limit.setMax(100L); + Mockito.when(resourceLimitDao.findByOwnerIdAndTypeAndTag(2L, Resource.ResourceOwnerType.Domain, + Resource.ResourceType.project, hostTags.get(0))).thenReturn(limit); + result = resourceLimitManager.findCorrectResourceLimitForDomain(domain, Resource.ResourceType.project, + hostTags.get(0)); + Assert.assertEquals(100L, result); + + // Test parent domain limit + Mockito.when(domain.getId()).thenReturn(3L); + DomainVO parentDomain = Mockito.mock(DomainVO.class); + Mockito.when(domain.getParent()).thenReturn(5L); + Mockito.when(domainDao.findById(5L)).thenReturn(parentDomain); + limit = new ResourceLimitVO(); + limit.setMax(200L); + Mockito.when(resourceLimitDao.findByOwnerIdAndTypeAndTag(3L, Resource.ResourceOwnerType.Domain, + Resource.ResourceType.project, hostTags.get(0))).thenReturn(null); + Mockito.when(resourceLimitDao.findByOwnerIdAndTypeAndTag(5L, Resource.ResourceOwnerType.Domain, + Resource.ResourceType.project, hostTags.get(0))).thenReturn(limit); + result = resourceLimitManager.findCorrectResourceLimitForDomain(domain, Resource.ResourceType.project, + hostTags.get(0)); + Assert.assertEquals(200L, result); + + // Test default domain project limit + long defaultDomainProjectsMax = 250L; + Mockito.when(domain.getId()).thenReturn(4L); + Mockito.when(domain.getParent()).thenReturn(null); + Map domainResourceLimitMap = new HashMap<>(); + domainResourceLimitMap.put(Resource.ResourceType.project.name(), defaultDomainProjectsMax); + resourceLimitManager.domainResourceLimitMap = domainResourceLimitMap; + Mockito.when(resourceLimitDao.findByOwnerIdAndTypeAndTag(4L, Resource.ResourceOwnerType.Domain, + Resource.ResourceType.project, hostTags.get(0))).thenReturn(null); + result = resourceLimitManager.findCorrectResourceLimitForDomain(domain, Resource.ResourceType.project, + hostTags.get(0)); + Assert.assertEquals(defaultDomainProjectsMax, result); + } @Test public void testCheckResourceLimitWithTag() { From da479ecbc838b380c267a46b9ce40f5daafcfca6 Mon Sep 17 00:00:00 2001 From: Alain Courtines Date: Mon, 3 Jun 2024 13:02:26 -0700 Subject: [PATCH 2/4] adhere to checkstyle rulesets --- .../resourcelimit/ResourceLimitManagerImplTest.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/server/src/test/java/com/cloud/resourcelimit/ResourceLimitManagerImplTest.java b/server/src/test/java/com/cloud/resourcelimit/ResourceLimitManagerImplTest.java index a51bcb8713cd..6cc9cf74bbca 100644 --- a/server/src/test/java/com/cloud/resourcelimit/ResourceLimitManagerImplTest.java +++ b/server/src/test/java/com/cloud/resourcelimit/ResourceLimitManagerImplTest.java @@ -418,19 +418,17 @@ public void testFindCorrectResourceLimitForAccount() { result = resourceLimitManager.findCorrectResourceLimitForAccount(account, Resource.ResourceType.cpu, hostTags.get(0)); Assert.assertEquals(defaultAccountCpuMax, result); } - + @Test public void testFindCorrectResourceLimitForAccountProjects() { AccountVO account = Mockito.mock(AccountVO.class); Mockito.when(account.getId()).thenReturn(1L); Mockito.when(accountManager.isRootAdmin(1L)).thenReturn(true); - // Test for Resource.RESOURCE_UNLIMITED when account is Root Admin long result = resourceLimitManager.findCorrectResourceLimitForAccount(account, Resource.ResourceType.project, hostTags.get(0)); Assert.assertEquals(Resource.RESOURCE_UNLIMITED, result); - // Test when account is not Root Admin and specific limit is set Mockito.when(accountManager.isRootAdmin(1L)).thenReturn(false); ResourceLimitVO limit = new ResourceLimitVO(); limit.setMax(10L); @@ -440,7 +438,6 @@ public void testFindCorrectResourceLimitForAccountProjects() { hostTags.get(0)); Assert.assertEquals(10L, result); - // Test default account project limit long defaultAccountProjectsMax = 15L; Map accountResourceLimitMap = new HashMap<>(); accountResourceLimitMap.put(Resource.ResourceType.project.name(), defaultAccountProjectsMax); @@ -510,7 +507,7 @@ public void testFindCorrectResourceLimitForDomain() { result = resourceLimitManager.findCorrectResourceLimitForDomain(domain, Resource.ResourceType.cpu, hostTags.get(0)); Assert.assertEquals(defaultDomainCpuMax, result); } - + @Test public void testFindCorrectResourceLimitForDomainProjects() { DomainVO domain = Mockito.mock(DomainVO.class); @@ -519,7 +516,6 @@ public void testFindCorrectResourceLimitForDomainProjects() { hostTags.get(0)); Assert.assertEquals(Resource.RESOURCE_UNLIMITED, result); - // Test specific limit set for domain Mockito.when(domain.getId()).thenReturn(2L); Mockito.when(domain.getParent()).thenReturn(null); ResourceLimitVO limit = new ResourceLimitVO(); @@ -530,7 +526,6 @@ public void testFindCorrectResourceLimitForDomainProjects() { hostTags.get(0)); Assert.assertEquals(100L, result); - // Test parent domain limit Mockito.when(domain.getId()).thenReturn(3L); DomainVO parentDomain = Mockito.mock(DomainVO.class); Mockito.when(domain.getParent()).thenReturn(5L); @@ -545,7 +540,6 @@ public void testFindCorrectResourceLimitForDomainProjects() { hostTags.get(0)); Assert.assertEquals(200L, result); - // Test default domain project limit long defaultDomainProjectsMax = 250L; Mockito.when(domain.getId()).thenReturn(4L); Mockito.when(domain.getParent()).thenReturn(null); From 86746b08fe7c9f00503febc89625d8e45d4483cb Mon Sep 17 00:00:00 2001 From: Alain Courtines Date: Fri, 7 Jun 2024 12:48:55 -0700 Subject: [PATCH 3/4] updated max project default settings to ConfigKey implementation. Also split unit test in ResourceManagerImplTest into multiple smaller tests --- .../com/cloud/user/ResourceLimitService.java | 4 ++ .../ResourceLimitManagerImpl.java | 8 ++-- .../ResourceLimitManagerImplTest.java | 46 +++++++++++++------ 3 files changed, 41 insertions(+), 17 deletions(-) diff --git a/api/src/main/java/com/cloud/user/ResourceLimitService.java b/api/src/main/java/com/cloud/user/ResourceLimitService.java index ba19719ea8d4..493e165856ca 100644 --- a/api/src/main/java/com/cloud/user/ResourceLimitService.java +++ b/api/src/main/java/com/cloud/user/ResourceLimitService.java @@ -43,6 +43,10 @@ public interface ResourceLimitService { "A comma-separated list of tags for host resource limits", true); static final ConfigKey ResourceLimitStorageTags = new ConfigKey<>("Advanced", String.class, "resource.limit.storage.tags", "", "A comma-separated list of tags for storage resource limits", true); + static final ConfigKey DefaultMaxAccountProjects = new ConfigKey<>("Account Defaults",Long.class,"max.account.projects","10", + "The default maximum number of projects that can be created for an account",false); + static final ConfigKey DefaultMaxDomainProjects = new ConfigKey<>("Domain Defaults",Long.class,"max.domain.projects","50", + "The default maximum number of projects that can be created for a domain",false); static final List HostTagsSupportingTypes = List.of(ResourceType.user_vm, ResourceType.cpu, ResourceType.memory); static final List StorageTagsSupportingTypes = List.of(ResourceType.volume, ResourceType.primary_storage); diff --git a/server/src/main/java/com/cloud/resourcelimit/ResourceLimitManagerImpl.java b/server/src/main/java/com/cloud/resourcelimit/ResourceLimitManagerImpl.java index 6232ec922e40..eb686fb005df 100644 --- a/server/src/main/java/com/cloud/resourcelimit/ResourceLimitManagerImpl.java +++ b/server/src/main/java/com/cloud/resourcelimit/ResourceLimitManagerImpl.java @@ -288,7 +288,7 @@ public boolean configure(final String name, final Map params) th accountResourceLimitMap.put(Resource.ResourceType.memory.name(), Long.parseLong(_configDao.getValue(Config.DefaultMaxAccountMemory.key()))); accountResourceLimitMap.put(Resource.ResourceType.primary_storage.name(), Long.parseLong(_configDao.getValue(Config.DefaultMaxAccountPrimaryStorage.key()))); accountResourceLimitMap.put(Resource.ResourceType.secondary_storage.name(), MaxAccountSecondaryStorage.value()); - accountResourceLimitMap.put(Resource.ResourceType.project.name(),Long.parseLong(_configDao.getValue(Config.DefaultMaxAccountProjects.key()))); + accountResourceLimitMap.put(Resource.ResourceType.project.name(), DefaultMaxAccountProjects.value()); domainResourceLimitMap.put(Resource.ResourceType.public_ip.name(), Long.parseLong(_configDao.getValue(Config.DefaultMaxDomainPublicIPs.key()))); domainResourceLimitMap.put(Resource.ResourceType.snapshot.name(), Long.parseLong(_configDao.getValue(Config.DefaultMaxDomainSnapshots.key()))); @@ -301,7 +301,7 @@ public boolean configure(final String name, final Map params) th domainResourceLimitMap.put(Resource.ResourceType.memory.name(), Long.parseLong(_configDao.getValue(Config.DefaultMaxDomainMemory.key()))); domainResourceLimitMap.put(Resource.ResourceType.primary_storage.name(), Long.parseLong(_configDao.getValue(Config.DefaultMaxDomainPrimaryStorage.key()))); domainResourceLimitMap.put(Resource.ResourceType.secondary_storage.name(), Long.parseLong(_configDao.getValue(Config.DefaultMaxDomainSecondaryStorage.key()))); - domainResourceLimitMap.put(Resource.ResourceType.project.name(),Long.parseLong(_configDao.getValue(Config.DefaultMaxDomainProjects.key()))); + domainResourceLimitMap.put(Resource.ResourceType.project.name(), DefaultMaxDomainProjects.value()); } catch (NumberFormatException e) { logger.error("NumberFormatException during configuration", e); throw new ConfigurationException("Configuration failed due to NumberFormatException, see log for the stacktrace"); @@ -2111,7 +2111,9 @@ public ConfigKey[] getConfigKeys() { MaxAccountSecondaryStorage, MaxProjectSecondaryStorage, ResourceLimitHostTags, - ResourceLimitStorageTags + ResourceLimitStorageTags, + DefaultMaxAccountProjects, + DefaultMaxDomainProjects }; } diff --git a/server/src/test/java/com/cloud/resourcelimit/ResourceLimitManagerImplTest.java b/server/src/test/java/com/cloud/resourcelimit/ResourceLimitManagerImplTest.java index 6cc9cf74bbca..55c863a2e8d0 100644 --- a/server/src/test/java/com/cloud/resourcelimit/ResourceLimitManagerImplTest.java +++ b/server/src/test/java/com/cloud/resourcelimit/ResourceLimitManagerImplTest.java @@ -509,46 +509,64 @@ public void testFindCorrectResourceLimitForDomain() { } @Test - public void testFindCorrectResourceLimitForDomainProjects() { + public void testResourceUnlimitedForDomainProjects() { DomainVO domain = Mockito.mock(DomainVO.class); Mockito.when(domain.getId()).thenReturn(1L); + long result = resourceLimitManager.findCorrectResourceLimitForDomain(domain, Resource.ResourceType.project, hostTags.get(0)); Assert.assertEquals(Resource.RESOURCE_UNLIMITED, result); + } + @Test + public void testSpecificLimitForDomainProjects() { + DomainVO domain = Mockito.mock(DomainVO.class); + Mockito.when(domain.getId()).thenReturn(2L); + Mockito.when(domain.getParent()).thenReturn(null); - Mockito.when(domain.getId()).thenReturn(2L); - Mockito.when(domain.getParent()).thenReturn(null); - ResourceLimitVO limit = new ResourceLimitVO(); - limit.setMax(100L); - Mockito.when(resourceLimitDao.findByOwnerIdAndTypeAndTag(2L, Resource.ResourceOwnerType.Domain, - Resource.ResourceType.project, hostTags.get(0))).thenReturn(limit); - result = resourceLimitManager.findCorrectResourceLimitForDomain(domain, Resource.ResourceType.project, - hostTags.get(0)); - Assert.assertEquals(100L, result); + ResourceLimitVO limit = new ResourceLimitVO(); + limit.setMax(100L); + Mockito.when(resourceLimitDao.findByOwnerIdAndTypeAndTag(2L, Resource.ResourceOwnerType.Domain, Resource.ResourceType.project, hostTags.get(0))).thenReturn(limit); + long result = resourceLimitManager.findCorrectResourceLimitForDomain(domain, Resource.ResourceType.project, hostTags.get(0)); + Assert.assertEquals(100L, result); + } + + @Test + public void testParentDomainLimitForDomainProjects() { + DomainVO domain = Mockito.mock(DomainVO.class); Mockito.when(domain.getId()).thenReturn(3L); + DomainVO parentDomain = Mockito.mock(DomainVO.class); Mockito.when(domain.getParent()).thenReturn(5L); Mockito.when(domainDao.findById(5L)).thenReturn(parentDomain); - limit = new ResourceLimitVO(); + + ResourceLimitVO limit = new ResourceLimitVO(); limit.setMax(200L); Mockito.when(resourceLimitDao.findByOwnerIdAndTypeAndTag(3L, Resource.ResourceOwnerType.Domain, Resource.ResourceType.project, hostTags.get(0))).thenReturn(null); Mockito.when(resourceLimitDao.findByOwnerIdAndTypeAndTag(5L, Resource.ResourceOwnerType.Domain, Resource.ResourceType.project, hostTags.get(0))).thenReturn(limit); - result = resourceLimitManager.findCorrectResourceLimitForDomain(domain, Resource.ResourceType.project, + + long result = resourceLimitManager.findCorrectResourceLimitForDomain(domain, Resource.ResourceType.project, hostTags.get(0)); Assert.assertEquals(200L, result); + } - long defaultDomainProjectsMax = 250L; + @Test + public void testDefaultDomainProjectLimit() { + DomainVO domain = Mockito.mock(DomainVO.class); Mockito.when(domain.getId()).thenReturn(4L); Mockito.when(domain.getParent()).thenReturn(null); + + long defaultDomainProjectsMax = 250L; Map domainResourceLimitMap = new HashMap<>(); domainResourceLimitMap.put(Resource.ResourceType.project.name(), defaultDomainProjectsMax); resourceLimitManager.domainResourceLimitMap = domainResourceLimitMap; + Mockito.when(resourceLimitDao.findByOwnerIdAndTypeAndTag(4L, Resource.ResourceOwnerType.Domain, Resource.ResourceType.project, hostTags.get(0))).thenReturn(null); - result = resourceLimitManager.findCorrectResourceLimitForDomain(domain, Resource.ResourceType.project, + + long result = resourceLimitManager.findCorrectResourceLimitForDomain(domain, Resource.ResourceType.project, hostTags.get(0)); Assert.assertEquals(defaultDomainProjectsMax, result); } From 2afec672356b83d0909681d1a6e746fd127f596c Mon Sep 17 00:00:00 2001 From: Alain Courtines Date: Thu, 11 Jul 2024 16:47:50 -0700 Subject: [PATCH 4/4] removal of unnecessary Mockito stubbing --- .../com/cloud/resourcelimit/ResourceLimitManagerImplTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/server/src/test/java/com/cloud/resourcelimit/ResourceLimitManagerImplTest.java b/server/src/test/java/com/cloud/resourcelimit/ResourceLimitManagerImplTest.java index 55c863a2e8d0..defcd09b1744 100644 --- a/server/src/test/java/com/cloud/resourcelimit/ResourceLimitManagerImplTest.java +++ b/server/src/test/java/com/cloud/resourcelimit/ResourceLimitManagerImplTest.java @@ -521,7 +521,6 @@ public void testResourceUnlimitedForDomainProjects() { public void testSpecificLimitForDomainProjects() { DomainVO domain = Mockito.mock(DomainVO.class); Mockito.when(domain.getId()).thenReturn(2L); - Mockito.when(domain.getParent()).thenReturn(null); ResourceLimitVO limit = new ResourceLimitVO(); limit.setMax(100L);