Juan Hernandez has uploaded a new change for review.

Change subject: core, restapi: Support adding permission using role name
......................................................................

core, restapi: Support adding permission using role name

Currently the operations to add permissions require the identifier of
the role:

  POST /vms/{vm:id}/permissions
  <permission>
    <role id="00000000-0000-0000-0000-000000000001" />
    <group id="..."/>
  </permission>

This patch adds the capability to use role names as well:

  POST /vms/{vm:id}/permissions
  <permission>
    <role>
      <name>UserVmManager</name>
      <group id="..."/>
    </role>
  </permission>

Change-Id: I74f22e9bebbc102a45b76e9c62cc44961edadfbc
Bug-Url: https://bugzilla.redhat.com/1152989
Signed-off-by: Juan Hernandez <[email protected]>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddPermissionCommand.java
M 
backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml
M 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendAssignedPermissionsResource.java
M 
backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/PermissionMapper.java
M 
backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/PermissionMapperTest.java
5 files changed, 172 insertions(+), 96 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/94/40694/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddPermissionCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddPermissionCommand.java
index e2790c5..68479fd 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddPermissionCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddPermissionCommand.java
@@ -47,14 +47,31 @@
             return false;
         }
 
-        Role role = getRoleDao().get(perm.getRoleId());
-        Guid adElementId = perm.getAdElementId();
-
+        // Try to find the requested role, first by id and then by name:
+        Role role = null;
+        Guid roleId = perm.getRoleId();
+        String roleName = perm.getRoleName();
+        if (!Guid.isNullOrEmpty(roleId)) {
+            role = getRoleDao().get(roleId);
+            if (role != null) {
+                roleName = role.getName();
+                perm.setRoleName(roleName);
+            }
+        }
+        else if (roleName != null) {
+            role = getRoleDao().getByName(roleName);
+            if (role != null) {
+                roleId = role.getId();
+                perm.setRoleId(roleId);
+            }
+        }
         if (role == null) {
             
addCanDoActionMessage(VdcBllMessages.PERMISSION_ADD_FAILED_INVALID_ROLE_ID);
             return false;
         }
 
+        Guid adElementId = perm.getAdElementId();
+
         if (perm.getObjectType() == null
                 || getVdcObjectName() == null) {
             
addCanDoActionMessage(VdcBllMessages.PERMISSION_ADD_FAILED_INVALID_OBJECT_ID);
diff --git 
a/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml
 
b/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml
index 08f6044..14a1be9 100644
--- 
a/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml
+++ 
b/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml
@@ -723,11 +723,13 @@
     body:
       parameterType: Permission
       signatures:
-      - mandatoryArguments: {permission.user.id: 'xs:string', 
permission.role.id: 'xs:string'}
-        optionalArguments: {}
+      - mandatoryArguments:
+          permission.user.id: xs:string
+          permission.role.id|name: xs:string
         description: add a new user level permission for a given virtual 
machine
-      - mandatoryArguments: {permission.role.id: 'xs:string', 
permission.group.id: 'xs:string'}
-        optionalArguments: {}
+      - mandatoryArguments:
+          permission.group.id: xs:string
+          permission.role.id|name: xs:string
         description: add a new group level permission for a given virtual 
machine
 - name: /vms/{vm:id}/statistics|rel=get
   description: get the memory and cpu statistics for a given virtual machine
@@ -1137,11 +1139,13 @@
     body:
       parameterType: Permission
       signatures:
-      - mandatoryArguments: {permission.user.id: 'xs:string', 
permission.role.id: 'xs:string'}
-        optionalArguments: {}
+      - mandatoryArguments:
+          permission.user.id: xs:string
+          permission.role.id|name: xs:string
         description: add a new user level permission on the storage domain
-      - mandatoryArguments: {permission.role.id: 'xs:string', 
permission.group.id: 'xs:string'}
-        optionalArguments: {}
+      - mandatoryArguments:
+          permission.group.id: xs:string
+          permission.role.id|name: xs:string
         description: add a new group level permission on the storage domain
 - name: /storagedomains/{storagedomain:id}/templates/{template:id}|rel=delete
   description: delete the specified template from the export or data domain
@@ -1338,11 +1342,13 @@
     body:
       parameterType: Permission
       signatures:
-      - mandatoryArguments: {permission.user.id: 'xs:string', 
permission.role.id: 'xs:string'}
-        optionalArguments: {}
+      - mandatoryArguments:
+          permission.user.id: xs:string
+          permission.role.id|name: xs:string
         description: add a new user level permission on the cluster
-      - mandatoryArguments: {permission.role.id: 'xs:string', 
permission.group.id: 'xs:string'}
-        optionalArguments: {}
+      - mandatoryArguments:
+          permission.group.id: xs:string
+          permission.role.id|name: xs:string
         description: add a new group level permission on the cluster
 - name: /macpools|rel=get
   description: get a list of mac pools in the system
@@ -1463,11 +1469,13 @@
     body:
       parameterType: Permission
       signatures:
-      - mandatoryArguments: {permission.user.id: 'xs:string', 
permission.role.id: 'xs:string'}
-        optionalArguments: {}
+      - mandatoryArguments:
+          permission.user.id: xs:string
+          permission.role.id|name: xs:string
         description: add a new user level permission on the data center
-      - mandatoryArguments: {permission.role.id: 'xs:string', 
permission.group.id: 'xs:string'}
-        optionalArguments: {}
+      - mandatoryArguments:
+         permission.group.id: xs:string
+         permission.role.id|name: xs:string
         description: add a new role permission on the data center
 - name: /datacenters/{datacenter:id}/storagedomains|rel=get
   description: get the list of storage domains in a data center
@@ -1588,11 +1596,13 @@
     body:
       parameterType: Permission
       signatures:
-      - mandatoryArguments: {permission.user.id: 'xs:string', 
permission.role.id: 'xs:string'}
-        optionalArguments: {}
+      - mandatoryArguments:
+          permission.user.id: xs:string
+          permission.role.id|name: xs:string
         description: add a new user level permission on the cluster in the 
specified data center.
-      - mandatoryArguments: {permission.role.id: 'xs:string', 
permission.group.id: 'xs:string'}
-        optionalArguments: {}
+      - mandatoryArguments:
+          permission.group.id: xs:string
+          permission.role.id|name: xs:string
         description: add a new group level permission on the cluster in the 
specified data center.
 - name: /domains|rel=get
   description: get a list of domains in the system
@@ -1685,26 +1695,33 @@
     body:
       parameterType: Permission
       signatures:
-      - mandatoryArguments: {permission.role.id: 'xs:string', 
permission.data_center.id: 'xs:string'}
-        optionalArguments: {}
+      - mandatoryArguments:
+          permission.role.id|name: xs:string
+          permission.data_center.id: xs:string
         description: add a new permission on the data center to the group in 
the system
-      - mandatoryArguments: {permission.role.id: 'xs:string', 
permission.cluster.id: 'xs:string'}
-        optionalArguments: {}
+      - mandatoryArguments:
+          permission.role.id|name: xs:string
+          permission.cluster.id: xs:string
         description: add a new permission on the cluster to the group in the 
system
-      - mandatoryArguments: {permission.role.id: 'xs:string', 
permission.host.id: 'xs:string'}
-        optionalArguments: {}
+      - mandatoryArguments:
+          permission.role.id|name: xs:string
+          permission.host.id: xs:string
         description: add a new permission on the host to the group in the 
system
-      - mandatoryArguments: {permission.role.id: 'xs:string', 
permission.storage_domain.id: 'xs:string'}
-        optionalArguments: {}
+      - mandatoryArguments:
+          permission.role.id|name: xs:string
+          permission.storage_domain.id: xs:string
         description: add a new permission on the storage domain to the group 
in the system
-      - mandatoryArguments: {permission.role.id: 'xs:string', 
permission.vm.id: 'xs:string'}
-        optionalArguments: {}
+      - mandatoryArguments:
+          permission.role.id|name: xs:string
+          permission.vm.id: xs:string
         description: add a new permission on the vm to the group in the system
-      - mandatoryArguments: {permission.role.id: 'xs:string', 
permission.vmpool.id: 'xs:string'}
-        optionalArguments: {}
+      - mandatoryArguments:
+          permission.role.id|name: xs:string
+          permission.vmpool.id: xs:string
         description: add a new permission on the vm pool to the group in the 
system
-      - mandatoryArguments: {permission.role.id: 'xs:string', 
permission.template.id: 'xs:string'}
-        optionalArguments: {}
+      - mandatoryArguments:
+          permission.role.id|name: xs:string
+          permission.template.id: xs:string
         description: add a new permission on the template to the group in the 
system
 - name: /groups/{group:id}/roles|rel=get
   description: get the list of roles assigned to the specified group
@@ -2085,11 +2102,13 @@
     body:
       parameterType: Permission
       signatures:
-      - mandatoryArguments: {permission.user.id: 'xs:string', 
permission.role.id: 'xs:string'}
-        optionalArguments: {}
+      - mandatoryArguments:
+          permission.user.id: xs:string
+          permission.role.id|name: xs:string
         description: add a new user level permission for the host
-      - mandatoryArguments: {permission.role.id: 'xs:string', 
permission.group.id: 'xs:string'}
-        optionalArguments: {}
+      - mandatoryArguments:
+          permission.role.id|name: xs:string
+          permission.group.id: xs:string
         description: add a new group level permission for the host
 - name: /hosts/{host:id}/statistics|rel=get
   description: get the statistics for the host
@@ -2203,11 +2222,13 @@
     body:
       parameterType: Permission
       signatures:
-      - mandatoryArguments: {permission.user.id: 'xs:string', 
permission.role.id: 'xs:string'}
-        optionalArguments: {}
+      - mandatoryArguments:
+          permission.user.id: xs:string
+          permission.role.id|name: xs:string
         description: add a new user level permission on a network in the system
-      - mandatoryArguments: {permission.group.id: 'xs:string', 
permission.role.id: 'xs:string'}
-        optionalArguments: {}
+      - mandatoryArguments:
+          permission.group.id: xs:string
+          permission.role.id|name: xs:string
         description: add a new group level permission on a network in the 
system
 - name: /networks/{network:id}/vnicprofiles|rel=get
   description: get the list of all virtual network interface card profiles for 
the network
@@ -2286,11 +2307,13 @@
     body:
       parameterType: Permission
       signatures:
-      - mandatoryArguments: {permission.user.id: 'xs:string', 
permission.role.id: 'xs:string'}
-        optionalArguments: {}
+      - mandatoryArguments:
+          permission.user.id: xs:string
+          permission.role.id|name: xs:string
         description: add a new user level permission on the virtual network 
interface card profile in the system
-      - mandatoryArguments: {permission.group.id: 'xs:string', 
permission.role.id: 'xs:string'}
-        optionalArguments: {}
+      - mandatoryArguments:
+          permission.group.id: xs:string
+          permission.role.id|name: xs:string
         description: add a new group level permission on the virtual network 
interface card profile in the system
 - name: /roles|rel=get
   description: get the list of all roles in the system
@@ -2657,11 +2680,13 @@
     body:
       parameterType: Permission
       signatures:
-      - mandatoryArguments: {permission.user.id: 'xs:string', 
permission.role.id: 'xs:string'}
-        optionalArguments: {}
+      - mandatoryArguments:
+          permission.user.id: xs:string
+          permission.role.id|name: xs:string
         description: add a new user level permission on the template
-      - mandatoryArguments: {permission.role.id: 'xs:string', 
permission.group.id: 'xs:string'}
-        optionalArguments: {}
+      - mandatoryArguments:
+          permission.group.id: xs:string
+          permission.role.id|name: xs:string
         description: add a new role permission on the template
 - name: /templates/{template:id}/tags|rel=get
   description: get the list of tags added to the template
@@ -2719,27 +2744,34 @@
     body:
       parameterType: Permission
       signatures:
-      - mandatoryArguments: {permission.role.id: 'xs:string', 
permission.data_center.id: 'xs:string'}
-        optionalArguments: {}
-        description: add a new tole permission for the user on the data center
-      - mandatoryArguments: {permission.role.id: 'xs:string', 
permission.cluster.id: 'xs:string'}
-        optionalArguments: {}
-        description: add a new tole permission for the user on the cluster
-      - mandatoryArguments: {permission.role.id: 'xs:string', 
permission.host.id: 'xs:string'}
-        optionalArguments: {}
-        description: add a new tole permission for the user on the host
-      - mandatoryArguments: {permission.role.id: 'xs:string', 
permission.storage_domain.id: 'xs:string'}
-        optionalArguments: {}
-        description: add a new tole permission for the user on the storage 
domain
-      - mandatoryArguments: {permission.role.id: 'xs:string', 
permission.vm.id: 'xs:string'}
-        optionalArguments: {}
-        description: add a new tole permission for the user on the vm
-      - mandatoryArguments: {permission.role.id: 'xs:string', 
permission.vmpool.id: 'xs:string'}
-        optionalArguments: {}
-        description: add a new tole permission for the user on the vm pool
-      - mandatoryArguments: {permission.role.id: 'xs:string', 
permission.template.id: 'xs:string'}
-        optionalArguments: {}
-        description: add a new tole permission for the user on the template
+      - mandatoryArguments:
+          permission.role.id|name: xs:string
+          permission.data_center.id: xs:string
+        description: add a new role permission for the user on the data center
+      - mandatoryArguments:
+          permission.role.id|name: xs:string
+          permission.cluster.id: xs:string
+        description: add a new role permission for the user on the cluster
+      - mandatoryArguments:
+          permission.role.id|name: xs:string
+          permission.host.id: xs:string
+        description: add a new role permission for the user on the host
+      - mandatoryArguments:
+          permission.role.id|name: xs:string
+          permission.storage_domain.id: xs:string
+        description: add a new role permission for the user on the storage 
domain
+      - mandatoryArguments:
+          permission.role.id|name: xs:string
+          permission.vm.id: xs:string
+        description: add a new role permission for the user on the vm
+      - mandatoryArguments:
+          permission.role.id|name: xs:string
+          permission.vmpool.id: xs:string
+        description: add a new role permission for the user on the vm pool
+      - mandatoryArguments:
+          permission.role.id|name: xs:string
+          permission.template.id: xs:string
+        description: add a new role permission for the user on the template
 - name: /users/{user:id}/roles|rel=get
   description: get the list of roles assigned to the user
   request:
@@ -2842,11 +2874,13 @@
     body:
       parameterType: Permission
       signatures:
-      - mandatoryArguments: {permission.user.id: 'xs:string', 
permission.role.id: 'xs:string'}
-        optionalArguments: {}
+      - mandatoryArguments:
+          permission.user.id|name: xs:string
+          permission.role.id: xs:string
         description: add a new user level permission on the vm pool
-      - mandatoryArguments: {permission.role.id: 'xs:string', 
permission.group.id: 'xs:string'}
-        optionalArguments: {}
+      - mandatoryArguments:
+          permission.role.id|name: xs:string
+          permission.group.id: xs:string
         description: add a new group level permission on the vm pool
 - name: /clusters/{cluster:id}/glustervolumes|rel=get
   description: get the list of gluster volumes attached to the cluster
@@ -3328,11 +3362,13 @@
     body:
       parameterType: Permission
       signatures:
-      - mandatoryArguments: {permission.user.id: 'xs:string', 
permission.role.id: 'xs:string'}
-        optionalArguments: {}
+      - mandatoryArguments:
+          permission.user.id: xs:string
+          permission.role.id|name: xs:string
         description: add a new user level permission on the system
-      - mandatoryArguments: {permission.role.id: 'xs:string', 
permission.group.id: 'xs:string'}
-        optionalArguments: {}
+      - mandatoryArguments:
+          permission.group.id: xs:string
+          permission.role.id|name: xs:string
         description: add a new group level permission on the system
 
 - name: /instancetypes|rel=get
@@ -3706,11 +3742,13 @@
     body:
       parameterType: Permission
       signatures:
-      - mandatoryArguments: {permission.user.id: 'xs:string', 
permission.role.id: 'xs:string'}
-        optionalArguments: {}
+      - mandatoryArguments:
+          permission.user.id: xs:string
+          permission.role.id|name: xs:string
         description: add a new user level permission on the disk profile in 
the system
-      - mandatoryArguments: {permission.group.id: 'xs:string', 
permission.role.id: 'xs:string'}
-        optionalArguments: {}
+      - mandatoryArguments:
+          permission.group.id: xs:string
+          permission.role.id|name: xs:string
         description: add a new group level permission on the disk profile in 
the system
 - name: /storagedomains/{storagedomain:id}/diskprofiles|rel=get
   description: get the list of all disk profiles for the storage domain
@@ -3776,11 +3814,13 @@
     body:
       parameterType: Permission
       signatures:
-      - mandatoryArguments: {permission.user.id: 'xs:string', 
permission.role.id: 'xs:string'}
-        optionalArguments: {}
+      - mandatoryArguments:
+          permission.user.id: xs:string
+          permission.role.id|name: xs:string
         description: add a new user level permission on the cpu profile in the 
system
-      - mandatoryArguments: {permission.group.id: 'xs:string', 
permission.role.id: 'xs:string'}
-        optionalArguments: {}
+      - mandatoryArguments:
+          permission.group.id: xs:string
+          permission.role.id|name: xs:string
         description: add a new group level permission on the cpu profile in 
the system
 - name: /clusters/{cluster:id}/cpuprofiles|rel=get
   description: get the list of all cpu profiles for the cluster
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendAssignedPermissionsResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendAssignedPermissionsResource.java
index 6f3c856..98df5d5 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendAssignedPermissionsResource.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendAssignedPermissionsResource.java
@@ -104,8 +104,8 @@
     public Response add(Permission permission) {
         validateParameters(permission,
                            isPrincipalSubCollection()
-                           ? new String[] {"role.id", 
"dataCenter|cluster|host|storageDomain|vm|vmpool|template.id"}
-                           : new String[] {"role.id", "user|group.id"});
+                           ? new String[] {"role.id|name", 
"dataCenter|cluster|host|storageDomain|vm|vmpool|template.id"}
+                           : new String[] {"role.id|name", "user|group.id"});
         PermissionsOperationsParameters parameters = getParameters(permission);
         QueryIdResolver<Guid> resolver = new 
QueryIdResolver<>(VdcQueryType.GetPermissionById, IdQueryParameters.class);
         return performCreate(VdcActionType.AddPermission, parameters, 
resolver);
diff --git 
a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/PermissionMapper.java
 
b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/PermissionMapper.java
index cec9dd1..53226e6 100644
--- 
a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/PermissionMapper.java
+++ 
b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/PermissionMapper.java
@@ -26,8 +26,14 @@
         if (model.isSetId()) {
             entity.setId(GuidUtils.asGuid(model.getId()));
         }
-        if (model.isSetRole() && model.getRole().isSetId()) {
-            entity.setRoleId(GuidUtils.asGuid(model.getRole().getId()));
+        if (model.isSetRole()) {
+            Role role = model.getRole();
+            if (role.isSetId()) {
+                entity.setRoleId(GuidUtils.asGuid(role.getId()));
+            }
+            if (role.isSetName()) {
+                entity.setRoleName(role.getName());
+            }
         }
         entity.setObjectId(map(model, template != null ? 
template.getObjectId() : null));
         entity.setObjectType(map(model, template != null ? 
template.getObjectType() : null));
@@ -47,8 +53,20 @@
         Permission model = template != null ? template : new Permission();
         model.setId(entity.getId().toString());
         if (entity.getRoleId() != null) {
-            model.setRole(new Role());
-            model.getRole().setId(entity.getRoleId().toString());
+            Role role = model.getRole();
+            if (role == null) {
+                role = new Role();
+                model.setRole(role);
+            }
+            role.setId(entity.getRoleId().toString());
+        }
+        if (entity.getRoleName() != null) {
+            Role role = model.getRole();
+            if (role == null) {
+                role = new Role();
+                model.setRole(role);
+            }
+            role.setName(entity.getRoleName());
         }
         if (entity.getAdElementId() != null && (template == null || 
!template.isSetGroup())) {
             model.setUser(new User());
diff --git 
a/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/PermissionMapperTest.java
 
b/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/PermissionMapperTest.java
index 2e904f4..263d858 100644
--- 
a/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/PermissionMapperTest.java
+++ 
b/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/PermissionMapperTest.java
@@ -22,6 +22,7 @@
         assertEquals(model.getId(), transform.getId());
         assertTrue(transform.isSetRole());
         assertEquals(model.getRole().getId(), transform.getRole().getId());
+        assertEquals(model.getRole().getName(), transform.getRole().getName());
         assertTrue(transform.isSetDataCenter());
         assertEquals(model.getDataCenter().getId(), 
transform.getDataCenter().getId());
     }


-- 
To view, visit https://gerrit.ovirt.org/40694
To unsubscribe, visit https://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I74f22e9bebbc102a45b76e9c62cc44961edadfbc
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Juan Hernandez <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to