From 65512af779c7808614e37a1801ca2a705af4921b Mon Sep 17 00:00:00 2001 From: Harikrishna Date: Tue, 11 Apr 2023 22:24:29 +0530 Subject: [PATCH] server: Roles search by keyword (#7384) This PR fixes #7362 and also other search criteria to use the name as an exact search where keyword is also there. Made UI changes for roles search to make use of keyword instead of name. --- .../java/org/apache/cloudstack/acl/RoleService.java | 2 +- .../api/command/admin/acl/ListRolesCmd.java | 4 ++-- .../java/org/apache/cloudstack/acl/dao/RoleDao.java | 2 +- .../org/apache/cloudstack/acl/dao/RoleDaoImpl.java | 13 ++++++++++--- .../cloudstack/metrics/MetricsServiceImpl.java | 4 ++-- .../java/com/cloud/network/vpc/VpcManagerImpl.java | 2 +- .../java/com/cloud/server/ManagementServerImpl.java | 2 +- .../org/apache/cloudstack/acl/RoleManagerImpl.java | 8 ++++---- .../apache/cloudstack/backup/BackupManagerImpl.java | 2 +- .../apache/cloudstack/acl/RoleManagerImplTest.java | 2 +- ui/src/views/AutogenView.vue | 4 +--- ui/tests/unit/views/AutogenView.spec.js | 2 +- 12 files changed, 26 insertions(+), 21 deletions(-) diff --git a/api/src/main/java/org/apache/cloudstack/acl/RoleService.java b/api/src/main/java/org/apache/cloudstack/acl/RoleService.java index dfc5cb1cafe..578c13ef6fd 100644 --- a/api/src/main/java/org/apache/cloudstack/acl/RoleService.java +++ b/api/src/main/java/org/apache/cloudstack/acl/RoleService.java @@ -80,7 +80,7 @@ public interface RoleService { */ List findRolesByName(String name); - Pair, Integer> findRolesByName(String name, Long startIndex, Long limit); + Pair, Integer> findRolesByName(String name, String keyword, Long startIndex, Long limit); /** * Find all roles by {@link RoleType}. If the role type is {@link RoleType#Admin}, the calling account must be a root admin, otherwise we return an empty list. diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/ListRolesCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/ListRolesCmd.java index dfe401596f4..b55dc80e705 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/ListRolesCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/ListRolesCmd.java @@ -105,8 +105,8 @@ public class ListRolesCmd extends BaseListCmd { Pair, Integer> roles; if (getId() != null && getId() > 0L) { roles = new Pair, Integer>(Collections.singletonList(roleService.findRole(getId())), 1); - } else if (StringUtils.isNotBlank(getName())) { - roles = roleService.findRolesByName(getName(), getStartIndex(), getPageSizeVal()); + } else if (StringUtils.isNotBlank(getName()) || StringUtils.isNotBlank(getKeyword())) { + roles = roleService.findRolesByName(getName(), getKeyword(), getStartIndex(), getPageSizeVal()); } else if (getRoleType() != null) { roles = roleService.findRolesByType(getRoleType(), getStartIndex(), getPageSizeVal()); } else { diff --git a/engine/schema/src/main/java/org/apache/cloudstack/acl/dao/RoleDao.java b/engine/schema/src/main/java/org/apache/cloudstack/acl/dao/RoleDao.java index ec1051bfae9..36833d5e790 100644 --- a/engine/schema/src/main/java/org/apache/cloudstack/acl/dao/RoleDao.java +++ b/engine/schema/src/main/java/org/apache/cloudstack/acl/dao/RoleDao.java @@ -28,7 +28,7 @@ import java.util.List; public interface RoleDao extends GenericDao { List findAllByName(String roleName); - Pair, Integer> findAllByName(final String roleName, Long offset, Long limit); + Pair, Integer> findAllByName(final String roleName, String keyword, Long offset, Long limit); List findAllByRoleType(RoleType type); List findByName(String roleName); diff --git a/engine/schema/src/main/java/org/apache/cloudstack/acl/dao/RoleDaoImpl.java b/engine/schema/src/main/java/org/apache/cloudstack/acl/dao/RoleDaoImpl.java index dda836a9706..b4938a1e833 100644 --- a/engine/schema/src/main/java/org/apache/cloudstack/acl/dao/RoleDaoImpl.java +++ b/engine/schema/src/main/java/org/apache/cloudstack/acl/dao/RoleDaoImpl.java @@ -25,6 +25,7 @@ import com.cloud.utils.db.SearchCriteria; import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.acl.RoleVO; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; import java.util.List; @@ -54,13 +55,19 @@ public class RoleDaoImpl extends GenericDaoBase implements RoleDao @Override public List findAllByName(final String roleName) { - return findAllByName(roleName, null, null).first(); + return findAllByName(roleName, null, null, null).first(); } @Override - public Pair, Integer> findAllByName(final String roleName, Long offset, Long limit) { + public Pair, Integer> findAllByName(final String roleName, String keyword, Long offset, Long limit) { SearchCriteria sc = RoleByNameSearch.create(); - sc.setParameters("roleName", "%" + roleName + "%"); + if (StringUtils.isNotEmpty(roleName)) { + sc.setParameters("roleName", roleName); + } + if (StringUtils.isNotEmpty(keyword)) { + sc.setParameters("roleName", "%" + keyword + "%"); + } + return searchAndCount(sc, new Filter(RoleVO.class, "id", true, offset, limit)); } diff --git a/plugins/metrics/src/main/java/org/apache/cloudstack/metrics/MetricsServiceImpl.java b/plugins/metrics/src/main/java/org/apache/cloudstack/metrics/MetricsServiceImpl.java index 7d1f74ed924..979e4aacbe7 100644 --- a/plugins/metrics/src/main/java/org/apache/cloudstack/metrics/MetricsServiceImpl.java +++ b/plugins/metrics/src/main/java/org/apache/cloudstack/metrics/MetricsServiceImpl.java @@ -287,7 +287,7 @@ public class MetricsServiceImpl extends MutualExclusiveIdsManagerBase implements SearchBuilder sb = vmInstanceDao.createSearchBuilder(); sb.and("idIN", sb.entity().getId(), SearchCriteria.Op.IN); - sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE); + sb.and("name", sb.entity().getName(), SearchCriteria.Op.EQ); sb.and("state", sb.entity().getState(), SearchCriteria.Op.EQ); sb.and("type", sb.entity().getType(), SearchCriteria.Op.NEQ); @@ -340,7 +340,7 @@ public class MetricsServiceImpl extends MutualExclusiveIdsManagerBase implements SearchBuilder sb = volumeDao.createSearchBuilder(); sb.and("idIN", sb.entity().getId(), SearchCriteria.Op.IN); - sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE); + sb.and("name", sb.entity().getName(), SearchCriteria.Op.EQ); sb.and("state", sb.entity().getState(), SearchCriteria.Op.EQ); SearchCriteria sc = sb.create(); diff --git a/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java b/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java index 9222520602f..f5682665895 100644 --- a/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java +++ b/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java @@ -1391,7 +1391,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis final SearchBuilder sb = vpcDao.createSearchBuilder(); _accountMgr.buildACLSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); - sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE); + sb.and("name", sb.entity().getName(), SearchCriteria.Op.EQ); sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); sb.and("displayText", sb.entity().getDisplayText(), SearchCriteria.Op.LIKE); sb.and("vpcOfferingId", sb.entity().getVpcOfferingId(), SearchCriteria.Op.EQ); diff --git a/server/src/main/java/com/cloud/server/ManagementServerImpl.java b/server/src/main/java/com/cloud/server/ManagementServerImpl.java index 4b6782659ba..964cca71f1c 100644 --- a/server/src/main/java/com/cloud/server/ManagementServerImpl.java +++ b/server/src/main/java/com/cloud/server/ManagementServerImpl.java @@ -4580,7 +4580,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); sb.and("name", sb.entity().getName(), SearchCriteria.Op.EQ); - sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE); + sb.and("name", sb.entity().getName(), SearchCriteria.Op.EQ); final SearchCriteria sc = sb.create(); _accountMgr.buildACLSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); diff --git a/server/src/main/java/org/apache/cloudstack/acl/RoleManagerImpl.java b/server/src/main/java/org/apache/cloudstack/acl/RoleManagerImpl.java index fc2a7e86160..f2f4a6fe06a 100644 --- a/server/src/main/java/org/apache/cloudstack/acl/RoleManagerImpl.java +++ b/server/src/main/java/org/apache/cloudstack/acl/RoleManagerImpl.java @@ -357,13 +357,13 @@ public class RoleManagerImpl extends ManagerBase implements RoleService, Configu @Override public List findRolesByName(String name) { - return findRolesByName(name, null, null).first(); + return findRolesByName(name, null, null, null).first(); } @Override - public Pair, Integer> findRolesByName(String name, Long startIndex, Long limit) { - if (StringUtils.isNotBlank(name)) { - Pair, Integer> data = roleDao.findAllByName(name, startIndex, limit); + public Pair, Integer> findRolesByName(String name, String keyword, Long startIndex, Long limit) { + if (StringUtils.isNotBlank(name) || StringUtils.isNotBlank(keyword)) { + Pair, Integer> data = roleDao.findAllByName(name, keyword, startIndex, limit); int removed = removeRootAdminRolesIfNeeded(data.first()); return new Pair,Integer>(ListUtils.toListOfInterface(data.first()), Integer.valueOf(data.second() - removed)); } diff --git a/server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java b/server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java index 314d263f75d..4e18caa684b 100644 --- a/server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java +++ b/server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java @@ -223,7 +223,7 @@ public class BackupManagerImpl extends ManagerBase implements BackupManager { final Filter searchFilter = new Filter(BackupOfferingVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal()); SearchBuilder sb = backupOfferingDao.createSearchBuilder(); sb.and("zone_id", sb.entity().getZoneId(), SearchCriteria.Op.EQ); - sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE); + sb.and("name", sb.entity().getName(), SearchCriteria.Op.EQ); final SearchCriteria sc = sb.create(); diff --git a/server/src/test/java/org/apache/cloudstack/acl/RoleManagerImplTest.java b/server/src/test/java/org/apache/cloudstack/acl/RoleManagerImplTest.java index a1be4541541..049bc17e0b6 100644 --- a/server/src/test/java/org/apache/cloudstack/acl/RoleManagerImplTest.java +++ b/server/src/test/java/org/apache/cloudstack/acl/RoleManagerImplTest.java @@ -166,7 +166,7 @@ public class RoleManagerImplTest { String roleName = "roleName"; List roles = new ArrayList<>(); Pair, Integer> toBeReturned = new Pair(roles, 0); - Mockito.doReturn(toBeReturned).when(roleDaoMock).findAllByName(roleName, null, null); + Mockito.doReturn(toBeReturned).when(roleDaoMock).findAllByName(roleName, null, null, null); roleManagerImpl.findRolesByName(roleName); Mockito.verify(roleManagerImpl).removeRootAdminRolesIfNeeded(roles); diff --git a/ui/src/views/AutogenView.vue b/ui/src/views/AutogenView.vue index 95bed406d58..16cf14e04cb 100644 --- a/ui/src/views/AutogenView.vue +++ b/ui/src/views/AutogenView.vue @@ -1609,9 +1609,7 @@ export default { if ('searchQuery' in opts) { const value = opts.searchQuery if (value && value.length > 0) { - if (this.$route.name === 'role') { - query.name = value - } else if (this.$route.name === 'quotaemailtemplate') { + if (this.$route.name === 'quotaemailtemplate') { query.templatetype = value } else if (this.$route.name === 'globalsetting') { query.name = value diff --git a/ui/tests/unit/views/AutogenView.spec.js b/ui/tests/unit/views/AutogenView.spec.js index 18872107d77..ec3130c6fb3 100644 --- a/ui/tests/unit/views/AutogenView.spec.js +++ b/ui/tests/unit/views/AutogenView.spec.js @@ -920,7 +920,7 @@ describe('Views > AutogenView.vue', () => { await flushPromises() expect(router.currentRoute.value.path).toEqual('/role') - expect(router.currentRoute.value.query).toEqual({ name: 'test-value', q: 'test-value', page: '1', pagesize: '20' }) + expect(router.currentRoute.value.query).toEqual({ keyword: 'test-value', q: 'test-value', page: '1', pagesize: '20' }) done() })