This is an automated email from the ASF dual-hosted git repository.
rohit pushed a commit to branch 4.18
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/4.18 by this push:
new 65512af779c server: Roles search by keyword (#7384)
65512af779c is described below
commit 65512af779c7808614e37a1801ca2a705af4921b
Author: Harikrishna <[email protected]>
AuthorDate: Tue Apr 11 22:24:29 2023 +0530
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.
---
.../main/java/org/apache/cloudstack/acl/RoleService.java | 2 +-
.../cloudstack/api/command/admin/acl/ListRolesCmd.java | 4 ++--
.../main/java/org/apache/cloudstack/acl/dao/RoleDao.java | 2 +-
.../java/org/apache/cloudstack/acl/dao/RoleDaoImpl.java | 13 ++++++++++---
.../org/apache/cloudstack/metrics/MetricsServiceImpl.java | 4 ++--
.../src/main/java/com/cloud/network/vpc/VpcManagerImpl.java | 2 +-
.../main/java/com/cloud/server/ManagementServerImpl.java | 2 +-
.../java/org/apache/cloudstack/acl/RoleManagerImpl.java | 8 ++++----
.../org/apache/cloudstack/backup/BackupManagerImpl.java | 2 +-
.../java/org/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<Role> findRolesByName(String name);
- Pair<List<Role>, Integer> findRolesByName(String name, Long startIndex,
Long limit);
+ Pair<List<Role>, 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<List<Role>, Integer> roles;
if (getId() != null && getId() > 0L) {
roles = new Pair<List<Role>,
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<RoleVO, Long> {
List<RoleVO> findAllByName(String roleName);
- Pair<List<RoleVO>, Integer> findAllByName(final String roleName, Long
offset, Long limit);
+ Pair<List<RoleVO>, Integer> findAllByName(final String roleName, String
keyword, Long offset, Long limit);
List<RoleVO> findAllByRoleType(RoleType type);
List<RoleVO> 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<RoleVO,
Long> implements RoleDao
@Override
public List<RoleVO> findAllByName(final String roleName) {
- return findAllByName(roleName, null, null).first();
+ return findAllByName(roleName, null, null, null).first();
}
@Override
- public Pair<List<RoleVO>, Integer> findAllByName(final String roleName,
Long offset, Long limit) {
+ public Pair<List<RoleVO>, Integer> findAllByName(final String roleName,
String keyword, Long offset, Long limit) {
SearchCriteria<RoleVO> 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<VMInstanceVO> 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<VolumeVO> 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<VolumeVO> 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<VpcVO> 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<UserDataVO> 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<Role> findRolesByName(String name) {
- return findRolesByName(name, null, null).first();
+ return findRolesByName(name, null, null, null).first();
}
@Override
- public Pair<List<Role>, Integer> findRolesByName(String name, Long
startIndex, Long limit) {
- if (StringUtils.isNotBlank(name)) {
- Pair<List<RoleVO>, Integer> data = roleDao.findAllByName(name,
startIndex, limit);
+ public Pair<List<Role>, Integer> findRolesByName(String name, String
keyword, Long startIndex, Long limit) {
+ if (StringUtils.isNotBlank(name) || StringUtils.isNotBlank(keyword)) {
+ Pair<List<RoleVO>, Integer> data = roleDao.findAllByName(name,
keyword, startIndex, limit);
int removed = removeRootAdminRolesIfNeeded(data.first());
return new
Pair<List<Role>,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<BackupOfferingVO> 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<BackupOfferingVO> 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<Role> roles = new ArrayList<>();
Pair<ArrayList<RoleVO>, 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()
})