Gilad Chaplik has uploaded a new change for review. Change subject: engine: back-compat for disk profiles ......................................................................
engine: back-compat for disk profiles Adding a second disk profile to a storage domain enforce the user to specify the disk profile, which breaks backward compatibility when using disk profiles. This patch solves it by selecting a disk profile out of user permitted disk profiles. * Adds 'attach disk profile' role. * Adding 'everyone' permission on that role to all disk profiles. * User query to fetch only disk profiles that has permission on the disk profile. * Already attached disk profiles (without permissions) will be shown in UI. * Specific error message for disk profiles authorization (instead of generic one). Change-Id: Ie1910a086e46cbbf8eb2e40a6e6f185a2c5fa3aa Bug-Url: https://bugzilla.redhat.com/1160846 Signed-off-by: Gilad Chaplik <gchap...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddDiskCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommonVmPoolWithVmsCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmTemplateCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyDiskCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/PredefinedRoles.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RegisterDiskCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmDiskCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/profiles/AddDiskProfileCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/profiles/DiskProfileHelper.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/ActionGroup.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java M backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties M backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/RoleDAOTest.java M backend/manager/modules/dal/src/test/resources/fixtures.xml M backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/model/PermitType.java M backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/PermitMapper.java M frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/configure/roles_ui/RoleTreeView.java M frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/LocalizedEnums.java M frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java M frontend/webadmin/modules/uicompat/src/main/resources/org/ovirt/engine/ui/uicompat/LocalizedEnums.properties M frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties M frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties M packaging/dbscripts/create_views.sql M packaging/dbscripts/disk_profiles_sp.sql A packaging/dbscripts/upgrade/03_05_1220_attach_disk_profile_permission.sql 30 files changed, 234 insertions(+), 39 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/17/36817/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddDiskCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddDiskCommand.java index 814fb9d..2f74cac 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddDiskCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddDiskCommand.java @@ -605,7 +605,7 @@ protected boolean setAndValidateDiskProfiles() { return validate(DiskProfileHelper.setAndValidateDiskProfiles(Collections.singletonMap(getDiskImageInfo(), - getStorageDomainId()), getStoragePool().getcompatibility_version())); + getStorageDomainId()), getStoragePool().getcompatibility_version(), getCurrentUser())); } @Override diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java index 0f7ce8c..999c8d8 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java @@ -647,7 +647,7 @@ map.put(diskImage, diskImage.getStorageIds().get(0)); } return validate(DiskProfileHelper.setAndValidateDiskProfiles(map, - getStoragePool().getcompatibility_version())); + getStoragePool().getcompatibility_version(), getCurrentUser())); } return true; } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java index 8a1c35f..a722a04 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java @@ -455,7 +455,7 @@ map.put(diskImage, diskImage.getStorageIds().get(0)); } return validate(DiskProfileHelper.setAndValidateDiskProfiles(map, - getStoragePool().getcompatibility_version())); + getStoragePool().getcompatibility_version(), getCurrentUser())); } return true; } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommonVmPoolWithVmsCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommonVmPoolWithVmsCommand.java index 63dd741..ecb90ee 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommonVmPoolWithVmsCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommonVmPoolWithVmsCommand.java @@ -416,7 +416,7 @@ map.put(diskImage, diskImage.getStorageIds().get(0)); } return validate(DiskProfileHelper.setAndValidateDiskProfiles(map, - getStoragePool().getcompatibility_version())); + getStoragePool().getcompatibility_version(), getCurrentUser())); } return true; } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmCommand.java index 8f0593f..60cd702 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmCommand.java @@ -1340,7 +1340,7 @@ } } return validate(DiskProfileHelper.setAndValidateDiskProfiles(map, - getStoragePool().getcompatibility_version())); + getStoragePool().getcompatibility_version(), getCurrentUser())); } return true; } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmTemplateCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmTemplateCommand.java index 26c88d0..271c180 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmTemplateCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmTemplateCommand.java @@ -553,7 +553,7 @@ map.put(diskImage, imageToDestinationDomainMap.get(diskImage.getId())); } return validate(DiskProfileHelper.setAndValidateDiskProfiles(map, - getStoragePool().getcompatibility_version())); + getStoragePool().getcompatibility_version(), getCurrentUser())); } return true; } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyDiskCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyDiskCommand.java index c4da09c..904f254 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyDiskCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyDiskCommand.java @@ -404,7 +404,7 @@ protected boolean setAndValidateDiskProfiles() { getImage().setDiskProfileId(getParameters().getDiskProfileId()); return validate(DiskProfileHelper.setAndValidateDiskProfiles(Collections.singletonMap(getImage(), - getParameters().getStorageDomainId()), getStoragePool().getcompatibility_version())); + getParameters().getStorageDomainId()), getStoragePool().getcompatibility_version(), getCurrentUser())); } @Override diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/PredefinedRoles.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/PredefinedRoles.java index 41dcb5d..6dcfcc5 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/PredefinedRoles.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/PredefinedRoles.java @@ -26,7 +26,8 @@ INSTANCE_OPERATOR(new Guid("DEF00012-0000-0000-0000-DEF000000012")), TAG_ADMIN(new Guid("DEF00011-0000-0000-0000-DEF000000013")), BOOKMARK_ADMIN(new Guid("DEF00011-0000-0000-0000-DEF000000014")), - EVENT_NOTIFICATION_ADMIN(new Guid("DEF00011-0000-0000-0000-DEF000000015")); + EVENT_NOTIFICATION_ADMIN(new Guid("DEF00011-0000-0000-0000-DEF000000015")), + DISK_PROFILE_USER(new Guid("DEF00020-0000-0000-0000-ABC000000010")); private Guid id; diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RegisterDiskCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RegisterDiskCommand.java index 7257437..2eedecf 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RegisterDiskCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RegisterDiskCommand.java @@ -93,7 +93,9 @@ protected boolean setAndValidateDiskProfiles() { return validate(DiskProfileHelper.setAndValidateDiskProfiles(Collections.singletonMap(getParameters().getDiskImage(), - getStorageDomainId()), getStoragePool().getcompatibility_version())); + getStorageDomainId()), + getStoragePool().getcompatibility_version(), + getCurrentUser())); } @Override diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmDiskCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmDiskCommand.java index 238da5b..68c8ff4 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmDiskCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmDiskCommand.java @@ -586,10 +586,15 @@ protected boolean setAndValidateDiskProfiles() { if (isDiskImage()) { DiskImage diskImage = (DiskImage) getNewDisk(); + // when disk profile isn't updated, skip check. + if (diskImage.getDiskProfileId() != null + && diskImage.getDiskProfileId().equals(((DiskImage) getOldDisk()).getDiskProfileId())) { + return true; + } Map<DiskImage, Guid> map = new HashMap<>(); map.put(diskImage, diskImage.getStorageIds().get(0)); return validate(DiskProfileHelper.setAndValidateDiskProfiles(map, - getStoragePool().getcompatibility_version())); + getStoragePool().getcompatibility_version(), getCurrentUser())); } return true; } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommand.java index 7ac2fc7..5b6b4d5 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommand.java @@ -265,7 +265,7 @@ map.put(diskImage, diskImage.getStorageIds().get(0)); } return validate(DiskProfileHelper.setAndValidateDiskProfiles(map, - getStoragePool().getcompatibility_version())); + getStoragePool().getcompatibility_version(), getCurrentUser())); } @Override diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/profiles/AddDiskProfileCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/profiles/AddDiskProfileCommand.java index c4eb735..94ef72b 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/profiles/AddDiskProfileCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/profiles/AddDiskProfileCommand.java @@ -3,10 +3,13 @@ import java.util.Collections; import java.util.List; +import org.ovirt.engine.core.bll.MultiLevelAdministrationHandler; +import org.ovirt.engine.core.bll.PredefinedRoles; import org.ovirt.engine.core.bll.utils.PermissionSubject; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.action.DiskProfileParameters; +import org.ovirt.engine.core.common.businessentities.Permissions; import org.ovirt.engine.core.common.businessentities.profiles.DiskProfile; import org.ovirt.engine.core.common.errors.VdcBllMessages; import org.ovirt.engine.core.dao.profiles.ProfilesDao; @@ -45,4 +48,17 @@ public AuditLogType getAuditLogTypeValue() { return getSucceeded() ? AuditLogType.USER_ADDED_DISK_PROFILE : AuditLogType.USER_FAILED_TO_ADD_DISK_PROFILE; } + + @Override + protected void executeCommand() { + super.executeCommand(); + addPermission(); + } + + private void addPermission() { + MultiLevelAdministrationHandler.addPermission(new Permissions(MultiLevelAdministrationHandler.EVERYONE_OBJECT_ID, + PredefinedRoles.DISK_PROFILE_USER.getId(), + getProfileId(), + VdcObjectType.DiskProfile)); + } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/profiles/DiskProfileHelper.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/profiles/DiskProfileHelper.java index 0d5337c..3acbcf4 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/profiles/DiskProfileHelper.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/profiles/DiskProfileHelper.java @@ -1,18 +1,24 @@ package org.ovirt.engine.core.bll.profiles; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Set; import org.ovirt.engine.core.bll.ValidationResult; import org.ovirt.engine.core.common.FeatureSupported; +import org.ovirt.engine.core.common.VdcObjectType; +import org.ovirt.engine.core.common.businessentities.ActionGroup; import org.ovirt.engine.core.common.businessentities.DiskImage; +import org.ovirt.engine.core.common.businessentities.aaa.DbUser; import org.ovirt.engine.core.common.businessentities.profiles.DiskProfile; import org.ovirt.engine.core.common.errors.VdcBllMessages; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.Version; import org.ovirt.engine.core.dal.dbbroker.DbFacade; +import org.ovirt.engine.core.dao.PermissionDAO; import org.ovirt.engine.core.dao.profiles.DiskProfileDao; public class DiskProfileHelper { @@ -29,31 +35,39 @@ return profile; } - public static ValidationResult setAndValidateDiskProfiles(Map<DiskImage, Guid> map, Version version) { + public static ValidationResult setAndValidateDiskProfiles(Map<DiskImage, Guid> map, Version version, DbUser user) { if (map == null || !FeatureSupported.storageQoS(version)) { return ValidationResult.VALID; } Map<Guid, List<DiskProfile>> storageDiskProfilesMap = new HashMap<>(); + // caching disk profile ids that was already checked. + Set<Guid> permittedDiskProfilesIds = new HashSet<>(); for (Entry<DiskImage, Guid> entry : map.entrySet()) { DiskImage diskImage = entry.getKey(); Guid storageDomainId = entry.getValue(); - if (diskImage.getDiskProfileId() == null && storageDomainId != null) { // set disk profile if there's only 1 for SD. + if (diskImage.getDiskProfileId() == null && storageDomainId != null) { List<DiskProfile> diskProfilesList = storageDiskProfilesMap.get(storageDomainId); if (diskProfilesList == null) { diskProfilesList = getDiskProfileDao().getAllForStorageDomain(storageDomainId); storageDiskProfilesMap.put(storageDomainId, diskProfilesList); } - if (diskProfilesList.size() == 1) { - diskImage.setDiskProfileId(diskProfilesList.get(0).getId()); - } else { - return new ValidationResult(VdcBllMessages.ACTION_TYPE_DISK_PROFILE_EMPTY); + // Set Disk Profile according to permissions + if (!updateDiskProfileForBackwardCompatibility(diskImage, + diskProfilesList, + permittedDiskProfilesIds, + user)) { + return new ValidationResult(VdcBllMessages.USER_NOT_AUTHORIZED_TO_ATTACH_DISK_PROFILE); } } else { + DiskProfile diskProfile = getDiskProfileDao().get(diskImage.getDiskProfileId()); ValidationResult result = - new DiskProfileValidator(getDiskProfileDao().get(diskImage.getDiskProfileId())).isParentEntityValid(storageDomainId); + new DiskProfileValidator(diskProfile).isParentEntityValid(storageDomainId); if (result != ValidationResult.VALID) { return result; + } + if (!isDiskProfilePermitted(diskProfile, permittedDiskProfilesIds, user)) { + return new ValidationResult(VdcBllMessages.USER_NOT_AUTHORIZED_TO_ATTACH_DISK_PROFILE); } } } @@ -61,7 +75,35 @@ return ValidationResult.VALID; } + private static boolean updateDiskProfileForBackwardCompatibility(DiskImage diskImage, + List<DiskProfile> diskProfilesList, + Set<Guid> permittedDiskProfilesIds, + DbUser user) { + for (DiskProfile diskProfile : diskProfilesList) { + if (isDiskProfilePermitted(diskProfile, permittedDiskProfilesIds, user)) { + permittedDiskProfilesIds.add(diskProfile.getId()); + diskImage.setDiskProfileId(diskProfile.getId()); + return true; + } + } + return false; + } + + private static boolean isDiskProfilePermitted(DiskProfile diskProfile, + Set<Guid> permittedDiskProfilesIds, + DbUser user) { + return permittedDiskProfilesIds.contains(diskProfile.getId()) + || getPermissionDAO().getEntityPermissions(user.getId(), + ActionGroup.ATTACH_DISK_PROFILE, + diskProfile.getId(), + VdcObjectType.DiskProfile) != null; + } + private static DiskProfileDao getDiskProfileDao() { return DbFacade.getInstance().getDiskProfileDao(); } + + private static PermissionDAO getPermissionDAO() { + return DbFacade.getInstance().getPermissionDao(); + } } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/ActionGroup.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/ActionGroup.java index 6c4275d..c0758b8 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/ActionGroup.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/ActionGroup.java @@ -137,8 +137,8 @@ // disk profiles CONFIGURE_STORAGE_DISK_PROFILE(1560, RoleType.ADMIN, true, ApplicationMode.VirtOnly), CREATE_STORAGE_DISK_PROFILE(1561, RoleType.ADMIN, true, ApplicationMode.VirtOnly), - DELETE_STORAGE_DISK_PROFILE(1562, RoleType.ADMIN, true, ApplicationMode.VirtOnly); - + DELETE_STORAGE_DISK_PROFILE(1562, RoleType.ADMIN, true, ApplicationMode.VirtOnly), + ATTACH_DISK_PROFILE(1563, RoleType.USER, true, ApplicationMode.VirtOnly); private int id; private RoleType roleType; diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java index fa0e199..64e13a8 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java @@ -1045,6 +1045,7 @@ ACTION_TYPE_CPU_PROFILE_NOT_MATCH_CLUSTER(ErrorType.BAD_PARAMETERS), ACTION_TYPE_CANNOT_REMOVE_LAST_CPU_PROFILE_IN_CLUSTER(ErrorType.NOT_SUPPORTED), ACTION_TYPE_CANNOT_REMOVE_LAST_DISK_PROFILE_IN_STORAGE_DOMAIN(ErrorType.NOT_SUPPORTED), + USER_NOT_AUTHORIZED_TO_ATTACH_DISK_PROFILE(ErrorType.NO_PERMISSION), // Affinity Groups AFFINITY_GROUP_NAME_TOO_LONG(ErrorType.BAD_PARAMETERS), diff --git a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties index b7ded7b..2a3b3af 100644 --- a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties +++ b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties @@ -1169,6 +1169,7 @@ ACTION_TYPE_CPU_PROFILE_NOT_MATCH_CLUSTER=Cannot ${action} ${type}. CPU Profile doesn't match provided Cluster. ACTION_TYPE_CANNOT_REMOVE_LAST_CPU_PROFILE_IN_CLUSTER=Cannot ${action} ${type}. Cannot remove last CPU profile in Cluster. ACTION_TYPE_CANNOT_REMOVE_LAST_DISK_PROFILE_IN_STORAGE_DOMAIN=Cannot ${action} ${type}. Cannot remove last Disk profile in Storage Domain. +USER_NOT_AUTHORIZED_TO_ATTACH_DISK_PROFILE=Cannot ${action} ${type}. The user doesn't have permissions to attach Disk Profile to the Disk. # cluster policy errors ACTION_TYPE_FAILED_CLUSTER_POLICY_PARAMETERS_INVALID=Cannot ${action} ${type}. Parameters are invalid. diff --git a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/RoleDAOTest.java b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/RoleDAOTest.java index 713caa2..8a381ae 100644 --- a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/RoleDAOTest.java +++ b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/RoleDAOTest.java @@ -18,7 +18,7 @@ private static final String GROUP_IDS = "26df4393-659b-4b8a-b0f6-3ee94d32e82f,08963ba9-b1c8-498d-989f-75cf8142eab7"; private static final Guid USER_ID = new Guid("9bf7c640-b620-456f-a550-0348f366544b"); private static final Guid OTHER_USER_ID = new Guid("9bf7c640-b620-456f-a550-0348f366544a"); - private static final int ROLE_COUNT = 5; + private static final int ROLE_COUNT = 6; private RoleDAO dao; private Role existingRole; diff --git a/backend/manager/modules/dal/src/test/resources/fixtures.xml b/backend/manager/modules/dal/src/test/resources/fixtures.xml index 2e416dd..3fd8918 100644 --- a/backend/manager/modules/dal/src/test/resources/fixtures.xml +++ b/backend/manager/modules/dal/src/test/resources/fixtures.xml @@ -4738,6 +4738,15 @@ <value>true</value> <value>1</value> </row> + <row> + <value>def00020-0000-0000-0000-abc000000010</value> + <value>profile_user_role</value> + <null /> + <value>0</value> + <value>2</value> + <value>true</value> + <value>1</value> + </row> </table> <table name="roles_groups"> @@ -4895,6 +4904,20 @@ <value>1b26a52b-b60f-44cb-9f46-3ef333b04a37</value> <value>19</value> </row> + <row> + <value>2d2f2522-afd2-4964-a3b1-001cca295e47</value> + <value>def00020-0000-0000-0000-abc000000010</value> + <value>9bf7c640-b620-456f-a550-0348f366544b</value> + <value>fd81f1e1-785b-4579-ab75-1419ebb87052</value> + <value>29</value> + </row> + <row> + <value>2d2f2522-afd2-4964-a3b1-001cca295e48</value> + <value>def00020-0000-0000-0000-abc000000010</value> + <value>9bf7c640-b620-456f-a550-0348f366544b</value> + <value>a667da39-27b0-47ec-a5fa-d4293a62b222</value> + <value>29</value> + </row> </table> <table name="event_map"> diff --git a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/model/PermitType.java b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/model/PermitType.java index 01e9dc4..47d0b04 100644 --- a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/model/PermitType.java +++ b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/model/PermitType.java @@ -120,7 +120,8 @@ // disk profile CONFIGURE_STORAGE_DISK_PROFILE, CREATE_STORAGE_DISK_PROFILE, - DELETE_STORAGE_DISK_PROFILE; + DELETE_STORAGE_DISK_PROFILE, + ATTACH_DISK_PROFILE; public String value() { diff --git a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/PermitMapper.java b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/PermitMapper.java index 6796250..5885918 100644 --- a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/PermitMapper.java +++ b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/PermitMapper.java @@ -198,6 +198,8 @@ return PermitType.CONFIGURE_STORAGE_DISK_PROFILE; case DELETE_STORAGE_DISK_PROFILE: return PermitType.DELETE_STORAGE_DISK_PROFILE; + case ATTACH_DISK_PROFILE: + return PermitType.ATTACH_DISK_PROFILE; default: return null; } @@ -360,6 +362,8 @@ return ActionGroup.CONFIGURE_STORAGE_DISK_PROFILE; case DELETE_STORAGE_DISK_PROFILE: return ActionGroup.DELETE_STORAGE_DISK_PROFILE; + case ATTACH_DISK_PROFILE: + return ActionGroup.ATTACH_DISK_PROFILE; default: return null; } diff --git a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java index ef89427..5e80c26 100644 --- a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java +++ b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java @@ -3156,6 +3156,9 @@ @DefaultStringValue("Cannot ${action} ${type}. Cannot remove last Disk profile in Storage Domain.") String ACTION_TYPE_CANNOT_REMOVE_LAST_DISK_PROFILE_IN_STORAGE_DOMAIN(); + @DefaultStringValue("Cannot ${action} ${type}. The user doesn't have permissions to attach Disk Profile to the Disk.") + String USER_NOT_AUTHORIZED_TO_ATTACH_DISK_PROFILE(); + @DefaultStringValue("Cannot ${action}. New disk size cannot be smaller than the current.") String ACTION_TYPE_FAILED_REQUESTED_DISK_SIZE_IS_TOO_SMALL(); diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/configure/roles_ui/RoleTreeView.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/configure/roles_ui/RoleTreeView.java index f801756..a7c6c05 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/configure/roles_ui/RoleTreeView.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/configure/roles_ui/RoleTreeView.java @@ -88,21 +88,29 @@ protected static RoleNode createDiskRoleTree() { return new RoleNode(getConstants().diskRoleTree(), - new RoleNode[] { new RoleNode(getConstants().provisioningOperationsRoleTree(), - getConstants().notePermissionsContainingOperationsRoleTreeTooltip(), - new RoleNode[] { - new RoleNode(ActionGroup.CREATE_DISK, getConstants().allowToCreateDiskRoleTreeTooltip()), - new RoleNode(ActionGroup.DELETE_DISK, getConstants().allowToDeleteDiskRoleTreeTooltip()), - new RoleNode(ActionGroup.CONFIGURE_DISK_STORAGE, - getConstants().allowToMoveDiskToAnotherStorageDomainRoleTreeTooltip()), - new RoleNode(ActionGroup.ATTACH_DISK, - getConstants().allowToAttachDiskToVmRoleTreeTooltip()), - new RoleNode(ActionGroup.EDIT_DISK_PROPERTIES, - getConstants().allowToChangePropertiesOfTheDiskRoleTreeTooltip()), - new RoleNode(ActionGroup.CONFIGURE_SCSI_GENERIC_IO, - getConstants().allowToChangeSGIORoleTreeTooltip()), - new RoleNode(ActionGroup.ACCESS_IMAGE_STORAGE, - getConstants().allowAccessImageDomainRoleTreeTooltip()) }) }); + new RoleNode[] { + new RoleNode(getConstants().provisioningOperationsRoleTree(), + getConstants().notePermissionsContainingOperationsRoleTreeTooltip(), + new RoleNode[] { + new RoleNode(ActionGroup.CREATE_DISK, + getConstants().allowToCreateDiskRoleTreeTooltip()), + new RoleNode(ActionGroup.DELETE_DISK, + getConstants().allowToDeleteDiskRoleTreeTooltip()), + new RoleNode(ActionGroup.CONFIGURE_DISK_STORAGE, + getConstants().allowToMoveDiskToAnotherStorageDomainRoleTreeTooltip()), + new RoleNode(ActionGroup.ATTACH_DISK, + getConstants().allowToAttachDiskToVmRoleTreeTooltip()), + new RoleNode(ActionGroup.EDIT_DISK_PROPERTIES, + getConstants().allowToChangePropertiesOfTheDiskRoleTreeTooltip()), + new RoleNode(ActionGroup.CONFIGURE_SCSI_GENERIC_IO, + getConstants().allowToChangeSGIORoleTreeTooltip()), + new RoleNode(ActionGroup.ACCESS_IMAGE_STORAGE, + getConstants().allowAccessImageDomainRoleTreeTooltip()) }), + new RoleNode(getConstants().attachDiskProfileRoleTree(), + getConstants().notePermissionsContainingDiskProfileOperationsRoleTreeTooltip(), + new RoleNode[] { + new RoleNode(ActionGroup.ATTACH_DISK_PROFILE, + getConstants().allowToAttachDiskProfileToDiskRoleTreeTooltip()) }) }); } protected static RoleNode createVmPoolRoleTree() { diff --git a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/LocalizedEnums.java b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/LocalizedEnums.java index a948793..1b391ad 100644 --- a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/LocalizedEnums.java +++ b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/LocalizedEnums.java @@ -214,6 +214,8 @@ String ActionGroup___DELETE_STORAGE_DISK_PROFILE(); + String ActionGroup___ATTACH_DISK_PROFILE(); + String EventNotificationEntity___Host(); String EventNotificationEntity___VdsGroup(); diff --git a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java index bf7f134..9e7add3 100644 --- a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java +++ b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java @@ -1330,6 +1330,9 @@ @DefaultStringValue("Allow to access image domain") String allowAccessImageDomainRoleTreeTooltip(); + @DefaultStringValue("Allow to attach Disk Profile to a Disk") + String allowToAttachDiskProfile(); + @DefaultStringValue("No") String noAlerts(); @@ -1525,6 +1528,15 @@ @DefaultStringValue("VM Pool") String vmPoolRoleTree(); + @DefaultStringValue("Disk Profile") + String attachDiskProfileRoleTree(); + + @DefaultStringValue("Note: Permissions containing these operations should be associated with Disk Profile or Storage Domain Object (or above)") + String notePermissionsContainingDiskProfileOperationsRoleTreeTooltip(); + + @DefaultStringValue("Allow to attach Disk Profile to a Disk") + String allowToAttachDiskProfileToDiskRoleTreeTooltip(); + // Error @DefaultStringValue("This Network does not exist in the Cluster") String thisNetworkDoesNotExistInTheClusterErr(); diff --git a/frontend/webadmin/modules/uicompat/src/main/resources/org/ovirt/engine/ui/uicompat/LocalizedEnums.properties b/frontend/webadmin/modules/uicompat/src/main/resources/org/ovirt/engine/ui/uicompat/LocalizedEnums.properties index 19e6151..2ce4bce 100644 --- a/frontend/webadmin/modules/uicompat/src/main/resources/org/ovirt/engine/ui/uicompat/LocalizedEnums.properties +++ b/frontend/webadmin/modules/uicompat/src/main/resources/org/ovirt/engine/ui/uicompat/LocalizedEnums.properties @@ -102,6 +102,7 @@ ActionGroup___CONFIGURE_STORAGE_DISK_PROFILE=Manipulate Disk Profiles ActionGroup___CREATE_STORAGE_DISK_PROFILE=Create Disk Profiles ActionGroup___DELETE_STORAGE_DISK_PROFILE=Delete Disk Profiles +ActionGroup___ATTACH_DISK_PROFILE=Attach Disk Profile EventNotificationEntity___Host=General Host Events: EventNotificationEntity___VdsGroup=Cluster Events: EventNotificationEntity___VirtHost=Virt Host Events: diff --git a/frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties b/frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties index 21d77f7..46dcf2b 100644 --- a/frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties +++ b/frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties @@ -1066,4 +1066,5 @@ CPU_TYPE_UNSUPPORTED_FOR_THE_GUEST_OS=The guest OS doesn't support the following CPUs: ${unsupportedCpus}. Its possible to change the cluster cpu or set a different one per VM BALLOON_REQUESTED_ON_NOT_SUPPORTED_ARCH=Cannot ${action} ${type}. Balloon is not supported on '${clusterArch}' architecture. +USER_NOT_AUTHORIZED_TO_ATTACH_DISK_PROFILE=Cannot ${action} ${type}. The user doesn't have permissions to attach Disk Profile to the Disk. diff --git a/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties b/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties index f5b07b0..41f3644 100644 --- a/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties +++ b/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties @@ -1138,6 +1138,7 @@ ACTION_TYPE_CPU_PROFILE_NOT_MATCH_CLUSTER=Cannot ${action} ${type}. CPU Profile doesn't match provided Cluster. ACTION_TYPE_CANNOT_REMOVE_LAST_CPU_PROFILE_IN_CLUSTER=Cannot ${action} ${type}. Cannot remove last CPU profile in Cluster. ACTION_TYPE_CANNOT_REMOVE_LAST_DISK_PROFILE_IN_STORAGE_DOMAIN=Cannot ${action} ${type}. Cannot remove last Disk profile in Storage Domain. +USER_NOT_AUTHORIZED_TO_ATTACH_DISK_PROFILE=Cannot ${action} ${type}. The user doesn't have permissions to attach Disk Profile to the Disk. # cluster policy errors ACTION_TYPE_FAILED_CLUSTER_POLICY_PARAMETERS_INVALID=Cannot ${action} ${type}. Parameters are invalid. diff --git a/packaging/dbscripts/create_views.sql b/packaging/dbscripts/create_views.sql index 2532d62..e63f5c1 100644 --- a/packaging/dbscripts/create_views.sql +++ b/packaging/dbscripts/create_views.sql @@ -1701,6 +1701,20 @@ FROM user_network_permissions_view_base NATURAL JOIN user_flat_groups; +-- Permissions on disk profiles +-- The user has permissions on the disk profile directly +CREATE OR REPLACE VIEW user_disk_profile_permissions_view_base (entity_id, granted_id) +AS +SELECT object_id, ad_element_id +FROM internal_permissions_view +WHERE object_type_id = 29 AND role_type = 2; + +CREATE OR REPLACE VIEW user_disk_profile_permissions_view (entity_id, user_id) +AS +SELECT DISTINCT entity_id, user_id +FROM user_disk_profile_permissions_view_base +NATURAL JOIN user_flat_groups; + CREATE OR REPLACE VIEW gluster_volumes_view AS SELECT gluster_volumes.*, diff --git a/packaging/dbscripts/disk_profiles_sp.sql b/packaging/dbscripts/disk_profiles_sp.sql index 59331ec..e5f3f09 100644 --- a/packaging/dbscripts/disk_profiles_sp.sql +++ b/packaging/dbscripts/disk_profiles_sp.sql @@ -87,8 +87,8 @@ FROM disk_profiles WHERE storage_domain_id = v_storage_domain_id AND (NOT v_is_filtered OR EXISTS (SELECT 1 - FROM user_storage_domain_permissions_view - WHERE user_id = v_user_id AND entity_id = v_storage_domain_id)); + FROM user_disk_profile_permissions_view + WHERE user_id = v_user_id AND entity_id = disk_profiles.id)); END; $procedure$ LANGUAGE plpgsql; diff --git a/packaging/dbscripts/upgrade/03_05_1220_attach_disk_profile_permission.sql b/packaging/dbscripts/upgrade/03_05_1220_attach_disk_profile_permission.sql new file mode 100644 index 0000000..f03d650 --- /dev/null +++ b/packaging/dbscripts/upgrade/03_05_1220_attach_disk_profile_permission.sql @@ -0,0 +1,57 @@ +Create or replace FUNCTION __temp_set_disk_profiles_permissions() +RETURNS VOID + AS $procedure$ + DECLARE + v_DISK_PROFILE_USER_ID UUID; + +BEGIN + v_DISK_PROFILE_USER_ID := 'DEF00020-0000-0000-0000-ABC000000010'; + + -- Add disk_profile_user role + INSERT INTO roles(id,name,description,is_readonly,role_type, app_mode) SELECT v_DISK_PROFILE_USER_ID, 'DiskProfileUser', 'Disk Profile User', true, 2, 1 + WHERE NOT EXISTS (SELECT id,name,description,is_readonly,role_type + FROM roles + WHERE id = v_DISK_PROFILE_USER_ID + AND name='DiskProfileUser' + AND description='Disk Profile User' + AND is_readonly=true + AND role_type=2 + AND app_mode=1); + + -- Add 'Attach disk profile' action group to roles: + -- newly created disk profile user + PERFORM fn_db_add_action_group_to_role(v_DISK_PROFILE_USER_ID, 1563); + + -- Add action group to each role that contains CRUD action groups on disk profile + -- 1560- CONFIGURE_STORAGE_DISK_PROFILE, 1561- CREATE_STORAGE_DISK_PROFILE, 1562- DELETE_STORAGE_DISK_PROFILE + INSERT INTO roles_groups (role_id, action_group_id) + SELECT DISTINCT role_id, 1563 + FROM roles_groups a + WHERE NOT EXISTS (SELECT 1 + FROM roles_groups b + WHERE b.role_id = a.role_id + AND b.action_group_id = 1563) + AND EXISTS (SELECT 1 + FROM roles_groups b + WHERE b.role_id = a.role_id + AND (b.action_group_id = 1560 OR b.action_group_id = 1561 OR b.action_group_id = 1562)); + + -- Add permission EVERYONE on DiskProfileUser role on each disk profile. + INSERT INTO permissions(id, + role_id, + ad_element_id, + object_id, + object_type_id) + SELECT uuid_generate_v1(), + v_DISK_PROFILE_USER_ID, + 'EEE00000-0000-0000-0000-123456789EEE', -- Everyone + disk_profiles.id, + 29 -- disk profile object id + FROM disk_profiles; + +END; $procedure$ +LANGUAGE plpgsql; + +SELECT __temp_set_disk_profiles_permissions(); +DROP function __temp_set_disk_profiles_permissions(); + -- To view, visit http://gerrit.ovirt.org/36817 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ie1910a086e46cbbf8eb2e40a6e6f185a2c5fa3aa Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: ovirt-engine-3.5 Gerrit-Owner: Gilad Chaplik <gchap...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches