From a06bd9fa2bc540c7bf33c2ec89505f70b1849929 Mon Sep 17 00:00:00 2001 From: Prachi Damle Date: Tue, 3 Sep 2013 13:06:56 -0700 Subject: [PATCH] CLOUDSTACK-4168 Root Admin should be able to create 'ExplicitDedication' affinity group at domain level and make it available for all accounts in the domain Changes: - 'ExcplicitDedication' type of group can be created/deleted by Root admin only - Users can no longer create this type of affinity group - RootAdmin can create this type of affinitygroup at domain level. Such a domain level group is available for all accounts in that domain for listing and for use during deployVM. - The domain level affinitygroup should be visible to the users in that domain, domain admins and Root admin. Conflicts: server/src/com/cloud/api/query/QueryManagerImpl.java server/src/org/apache/cloudstack/affinity/AffinityGroupServiceImpl.java server/test/org/apache/cloudstack/affinity/AffinityApiUnitTest.java --- .../cloudstack/affinity/AffinityGroup.java | 2 + .../affinity/AffinityGroupProcessor.java | 19 +++ .../affinity/AffinityGroupService.java | 4 + .../affinity/AffinityProcessorBase.java | 10 ++ client/tomcatconf/applicationContext.xml.in | 3 + client/tomcatconf/componentContext.xml.in | 1 + .../schema/src/com/cloud/user/AccountVO.java | 6 +- .../affinity/AffinityGroupDomainMapVO.java | 73 +++++++++ .../cloudstack/affinity/AffinityGroupVO.java | 15 +- .../dao/AffinityGroupDomainMapDao.java | 31 ++++ .../dao/AffinityGroupDomainMapDaoImpl.java | 67 ++++++++ .../affinity/ExplicitDedicationProcessor.java | 9 ++ .../cloud/acl/AffinityGroupAccessChecker.java | 80 ++++++++++ server/src/com/cloud/acl/DomainChecker.java | 3 + .../com/cloud/api/query/QueryManagerImpl.java | 124 ++++++++++++--- .../api/query/vo/AffinityGroupJoinVO.java | 16 ++ .../com/cloud/user/AccountManagerImpl.java | 5 +- .../src/com/cloud/vm/UserVmManagerImpl.java | 28 +++- .../affinity/AffinityGroupServiceImpl.java | 143 ++++++++++++++++-- .../affinity/AffinityApiUnitTest.java | 28 +++- setup/db/db/schema-410to420.sql | 13 +- 21 files changed, 634 insertions(+), 46 deletions(-) create mode 100644 engine/schema/src/org/apache/cloudstack/affinity/AffinityGroupDomainMapVO.java create mode 100644 engine/schema/src/org/apache/cloudstack/affinity/dao/AffinityGroupDomainMapDao.java create mode 100644 engine/schema/src/org/apache/cloudstack/affinity/dao/AffinityGroupDomainMapDaoImpl.java create mode 100644 server/src/com/cloud/acl/AffinityGroupAccessChecker.java diff --git a/api/src/org/apache/cloudstack/affinity/AffinityGroup.java b/api/src/org/apache/cloudstack/affinity/AffinityGroup.java index ac2eb613370..c1ad11dbdd0 100644 --- a/api/src/org/apache/cloudstack/affinity/AffinityGroup.java +++ b/api/src/org/apache/cloudstack/affinity/AffinityGroup.java @@ -28,4 +28,6 @@ public interface AffinityGroup extends ControlledEntity, InternalIdentity, Ident String getType(); + ACLType getAclType(); + } diff --git a/api/src/org/apache/cloudstack/affinity/AffinityGroupProcessor.java b/api/src/org/apache/cloudstack/affinity/AffinityGroupProcessor.java index 8e9fabd3f60..59b1f47863d 100644 --- a/api/src/org/apache/cloudstack/affinity/AffinityGroupProcessor.java +++ b/api/src/org/apache/cloudstack/affinity/AffinityGroupProcessor.java @@ -58,4 +58,23 @@ public interface AffinityGroupProcessor extends Adapter { */ boolean check(VirtualMachineProfile vm, DeployDestination plannedDestination) throws AffinityConflictException; + + /** + * isAdminControlledGroup() should return true if the affinity/anti-affinity + * group can only be operated on[create/delete/modify] by the Admin + * + * @return boolean true/false + */ + boolean isAdminControlledGroup(); + + + /** + * canBeSharedDomainWide() should return true if the affinity/anti-affinity + * group can be created for a domain and shared by all accounts under the + * domain. + * + * @return boolean true/false + */ + boolean canBeSharedDomainWide(); + } \ No newline at end of file diff --git a/api/src/org/apache/cloudstack/affinity/AffinityGroupService.java b/api/src/org/apache/cloudstack/affinity/AffinityGroupService.java index 1b30e58d92f..43a4994ec91 100644 --- a/api/src/org/apache/cloudstack/affinity/AffinityGroupService.java +++ b/api/src/org/apache/cloudstack/affinity/AffinityGroupService.java @@ -75,4 +75,8 @@ public interface AffinityGroupService { boolean isAffinityGroupProcessorAvailable(String affinityGroupType); + boolean isAdminControlledGroup(AffinityGroup group); + + boolean isAffinityGroupAvailableInDomain(long affinityGroupId, long domainId); + } diff --git a/api/src/org/apache/cloudstack/affinity/AffinityProcessorBase.java b/api/src/org/apache/cloudstack/affinity/AffinityProcessorBase.java index 779ca326b3a..0c5831a78d5 100644 --- a/api/src/org/apache/cloudstack/affinity/AffinityProcessorBase.java +++ b/api/src/org/apache/cloudstack/affinity/AffinityProcessorBase.java @@ -47,4 +47,14 @@ public class AffinityProcessorBase extends AdapterBase implements AffinityGroupP throws AffinityConflictException { return true; } + + @Override + public boolean isAdminControlledGroup() { + return false; + } + + @Override + public boolean canBeSharedDomainWide() { + return false; + } } diff --git a/client/tomcatconf/applicationContext.xml.in b/client/tomcatconf/applicationContext.xml.in index 708555a175f..e87636cacb4 100644 --- a/client/tomcatconf/applicationContext.xml.in +++ b/client/tomcatconf/applicationContext.xml.in @@ -377,6 +377,7 @@ +