From eec56025c83715a204d31cf81978c35064eb7cad Mon Sep 17 00:00:00 2001 From: davidjumani Date: Wed, 29 Jul 2020 12:26:39 +0530 Subject: [PATCH] api: Bug fixes for primate (#4214) Adding the following fixes so primate can work without issues : - Adding pagination for listNetworkAclLists - Adding pagination for listRoles - Returning mshost uuid rather than msid in list hosts response - Allowing listVirtualMachinesMetrics to respect hostid - Fixing return all details in template response --- .../apache/cloudstack/acl/RoleService.java | 8 ++++ .../api/command/admin/acl/ListRolesCmd.java | 25 +++++----- .../api/command/user/vm/ListVMsCmd.java | 12 +++++ .../cloudstack/api/response/HostResponse.java | 6 +-- .../apache/cloudstack/acl/dao/RoleDao.java | 6 +++ .../cloudstack/acl/dao/RoleDaoImpl.java | 15 +++++- .../com/cloud/api/query/QueryManagerImpl.java | 15 +++--- .../cloud/api/query/dao/HostJoinDaoImpl.java | 12 ++++- .../api/query/dao/TemplateJoinDaoImpl.java | 10 ++-- .../network/vpc/NetworkACLServiceImpl.java | 2 +- .../cloudstack/acl/RoleManagerImpl.java | 47 ++++++++++++++----- .../cloudstack/acl/RoleManagerImplTest.java | 19 ++++---- 12 files changed, 123 insertions(+), 54 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 6130c62a7d4..86f8a775936 100644 --- a/api/src/main/java/org/apache/cloudstack/acl/RoleService.java +++ b/api/src/main/java/org/apache/cloudstack/acl/RoleService.java @@ -19,6 +19,8 @@ package org.apache.cloudstack.acl; import java.util.List; +import com.cloud.utils.Pair; + import org.apache.cloudstack.acl.RolePermission.Permission; import org.apache.cloudstack.framework.config.ConfigKey; @@ -65,16 +67,22 @@ public interface RoleService { */ List listRoles(); + Pair, Integer> listRoles(Long startIndex, Long limit); + /** * Find all roles that have the giving {@link String} as part of their name. * If the user calling the method is not a 'root admin', roles of type {@link RoleType#Admin} wil lbe removed of the returned list. */ List findRolesByName(String name); + Pair, Integer> findRolesByName(String name, 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. */ List findRolesByType(RoleType roleType); + Pair, Integer> findRolesByType(RoleType roleType, Long startIndex, Long limit); + List findAllPermissionsBy(Long roleId); } 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 9025e89a93c..92156c14717 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 @@ -25,18 +25,19 @@ import org.apache.cloudstack.acl.Role; import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.ApiConstants; -import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.BaseListCmd; import org.apache.cloudstack.api.Parameter; import org.apache.cloudstack.api.response.ListResponse; import org.apache.cloudstack.api.response.RoleResponse; import org.apache.commons.lang3.StringUtils; import com.cloud.user.Account; +import com.cloud.utils.Pair; import com.google.common.base.Strings; @APICommand(name = ListRolesCmd.APINAME, description = "Lists dynamic roles in CloudStack", responseObject = RoleResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, since = "4.9.0", authorized = { - RoleType.Admin, RoleType.ResourceAdmin, RoleType.DomainAdmin}) -public class ListRolesCmd extends BaseCmd { + RoleType.Admin, RoleType.ResourceAdmin, RoleType.DomainAdmin }) +public class ListRolesCmd extends BaseListCmd { public static final String APINAME = "listRoles"; ///////////////////////////////////////////////////// @@ -77,7 +78,7 @@ public class ListRolesCmd extends BaseCmd { @Override public String getCommandName() { - return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + return APINAME.toLowerCase() + BaseListCmd.RESPONSE_SUFFIX; } @Override @@ -85,10 +86,10 @@ public class ListRolesCmd extends BaseCmd { return Account.ACCOUNT_ID_SYSTEM; } - private void setupResponse(final List roles) { + private void setupResponse(final Pair, Integer> roles) { final ListResponse response = new ListResponse<>(); final List roleResponses = new ArrayList<>(); - for (final Role role : roles) { + for (final Role role : roles.first()) { if (role == null) { continue; } @@ -100,22 +101,22 @@ public class ListRolesCmd extends BaseCmd { roleResponse.setObjectName("role"); roleResponses.add(roleResponse); } - response.setResponses(roleResponses); + response.setResponses(roleResponses, roles.second()); response.setResponseName(getCommandName()); setResponseObject(response); } @Override public void execute() { - List roles; + Pair, Integer> roles; if (getId() != null && getId() > 0L) { - roles = Collections.singletonList(roleService.findRole(getId())); + roles = new Pair, Integer>(Collections.singletonList(roleService.findRole(getId())), 1); } else if (StringUtils.isNotBlank(getName())) { - roles = roleService.findRolesByName(getName()); + roles = roleService.findRolesByName(getName(), getStartIndex(), getPageSizeVal()); } else if (getRoleType() != null) { - roles = roleService.findRolesByType(getRoleType()); + roles = roleService.findRolesByType(getRoleType(), getStartIndex(), getPageSizeVal()); } else { - roles = roleService.listRoles(); + roles = roleService.listRoles(getStartIndex(), getPageSizeVal()); } setupResponse(roles); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java index d4685784854..072cf6b5724 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java @@ -200,6 +200,18 @@ public class ListVMsCmd extends BaseListTaggedResourcesCmd implements UserCmd { return keypair; } + public Long getHostId() { + return hostId; + } + + public Long getPodId() { + return podId; + } + + public Long getStorageId() { + return storageId; + } + public EnumSet getDetails() throws InvalidParameterValueException { EnumSet dv; if (viewDetails == null || viewDetails.size() <= 0) { diff --git a/api/src/main/java/org/apache/cloudstack/api/response/HostResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/HostResponse.java index 7b47f8a28ca..61a662f0725 100644 --- a/api/src/main/java/org/apache/cloudstack/api/response/HostResponse.java +++ b/api/src/main/java/org/apache/cloudstack/api/response/HostResponse.java @@ -166,7 +166,7 @@ public class HostResponse extends BaseResponse { @SerializedName("managementserverid") @Param(description = "the management server ID of the host") - private Long managementServerId; + private String managementServerId; @SerializedName("clusterid") @Param(description = "the cluster ID of the host") @@ -381,7 +381,7 @@ public class HostResponse extends BaseResponse { this.lastPinged = lastPinged; } - public void setManagementServerId(Long managementServerId) { + public void setManagementServerId(String managementServerId) { this.managementServerId = managementServerId; } @@ -633,7 +633,7 @@ public class HostResponse extends BaseResponse { return lastPinged; } - public Long getManagementServerId() { + public String getManagementServerId() { return managementServerId; } 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 e53654d998e..06c07ba74fe 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 @@ -17,6 +17,7 @@ package org.apache.cloudstack.acl.dao; +import com.cloud.utils.Pair; import com.cloud.utils.db.GenericDao; import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.acl.RoleVO; @@ -25,5 +26,10 @@ import java.util.List; public interface RoleDao extends GenericDao { List findAllByName(String roleName); + + Pair, Integer> findAllByName(final String roleName, Long offset, Long limit); + List findAllByRoleType(RoleType type); + + Pair, Integer> findAllByRoleType(RoleType type, Long offset, Long limit); } 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 e3dd266d131..b2200496712 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 @@ -17,6 +17,8 @@ package org.apache.cloudstack.acl.dao; +import com.cloud.utils.Pair; +import com.cloud.utils.db.Filter; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; @@ -45,15 +47,24 @@ public class RoleDaoImpl extends GenericDaoBase implements RoleDao @Override public List findAllByName(final String roleName) { + return findAllByName(roleName, null, null).first(); + } + + @Override + public Pair, Integer> findAllByName(final String roleName, Long offset, Long limit) { SearchCriteria sc = RoleByNameSearch.create(); sc.setParameters("roleName", "%" + roleName + "%"); - return listBy(sc); + return searchAndCount(sc, new Filter(RoleVO.class, "id", true, offset, limit)); } @Override public List findAllByRoleType(final RoleType type) { + return findAllByRoleType(type, null, null).first(); + } + + public Pair, Integer> findAllByRoleType(final RoleType type, Long offset, Long limit) { SearchCriteria sc = RoleByTypeSearch.create(); sc.setParameters("roleType", type); - return listBy(sc); + return searchAndCount(sc, new Filter(RoleVO.class, "id", true, offset, limit)); } } diff --git a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java index 4013ae7e553..18ea640bf14 100644 --- a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java +++ b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java @@ -57,7 +57,6 @@ import org.apache.cloudstack.api.command.admin.storage.ListStoragePoolsCmd; import org.apache.cloudstack.api.command.admin.storage.ListStorageTagsCmd; import org.apache.cloudstack.api.command.admin.template.ListTemplatesCmdByAdmin; import org.apache.cloudstack.api.command.admin.user.ListUsersCmd; -import org.apache.cloudstack.api.command.admin.vm.ListVMsCmdByAdmin; import org.apache.cloudstack.api.command.admin.zone.ListZonesCmdByAdmin; import org.apache.cloudstack.api.command.user.account.ListAccountsCmd; import org.apache.cloudstack.api.command.user.account.ListProjectAccountsCmd; @@ -910,11 +909,10 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q Object pod = null; Object hostId = null; Object storageId = null; - if (cmd instanceof ListVMsCmdByAdmin) { - ListVMsCmdByAdmin adCmd = (ListVMsCmdByAdmin)cmd; - pod = adCmd.getPodId(); - hostId = adCmd.getHostId(); - storageId = adCmd.getStorageId(); + if (_accountMgr.isRootAdmin(caller.getId())) { + pod = cmd.getPodId(); + hostId = cmd.getHostId(); + storageId = cmd.getStorageId(); } sb.and("displayName", sb.entity().getDisplayName(), SearchCriteria.Op.LIKE); @@ -1064,9 +1062,8 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q sc.setParameters("keyPairName", keyPairName); } - if (cmd instanceof ListVMsCmdByAdmin) { - ListVMsCmdByAdmin aCmd = (ListVMsCmdByAdmin)cmd; - if (aCmd.getPodId() != null) { + if (_accountMgr.isRootAdmin(caller.getId())) { + if (cmd.getPodId() != null) { sc.setParameters("podId", pod); if (state == null) { diff --git a/server/src/main/java/com/cloud/api/query/dao/HostJoinDaoImpl.java b/server/src/main/java/com/cloud/api/query/dao/HostJoinDaoImpl.java index ff5d254e9b7..6f16462f4f3 100644 --- a/server/src/main/java/com/cloud/api/query/dao/HostJoinDaoImpl.java +++ b/server/src/main/java/com/cloud/api/query/dao/HostJoinDaoImpl.java @@ -39,6 +39,8 @@ import org.apache.cloudstack.outofbandmanagement.dao.OutOfBandManagementDao; import com.cloud.api.ApiDBUtils; import com.cloud.api.query.vo.HostJoinVO; +import com.cloud.cluster.ManagementServerHostVO; +import com.cloud.cluster.dao.ManagementServerHostDao; import com.cloud.gpu.HostGpuGroupsVO; import com.cloud.gpu.VGPUTypesVO; import com.cloud.host.Host; @@ -65,6 +67,8 @@ public class HostJoinDaoImpl extends GenericDaoBase implements private HAConfigDao haConfigDao; @Inject private OutOfBandManagementDao outOfBandManagementDao; + @Inject + private ManagementServerHostDao managementServerHostDao; private final SearchBuilder hostSearch; @@ -103,7 +107,13 @@ public class HostJoinDaoImpl extends GenericDaoBase implements hostResponse.setHypervisor(host.getHypervisorType()); hostResponse.setHostType(host.getType()); hostResponse.setLastPinged(new Date(host.getLastPinged())); - hostResponse.setManagementServerId(host.getManagementServerId()); + Long mshostId = host.getManagementServerId(); + if (mshostId != null) { + ManagementServerHostVO managementServer = managementServerHostDao.findByMsid(host.getManagementServerId()); + if (managementServer != null) { + hostResponse.setManagementServerId(managementServer.getUuid()); + } + } hostResponse.setName(host.getName()); hostResponse.setPodId(host.getPodUuid()); hostResponse.setRemoved(host.getRemoved()); diff --git a/server/src/main/java/com/cloud/api/query/dao/TemplateJoinDaoImpl.java b/server/src/main/java/com/cloud/api/query/dao/TemplateJoinDaoImpl.java index 27380ffaa93..61a101743c9 100644 --- a/server/src/main/java/com/cloud/api/query/dao/TemplateJoinDaoImpl.java +++ b/server/src/main/java/com/cloud/api/query/dao/TemplateJoinDaoImpl.java @@ -48,6 +48,7 @@ import com.cloud.storage.VMTemplateHostVO; import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; import com.cloud.storage.VMTemplateVO; import com.cloud.storage.dao.VMTemplateDao; +import com.cloud.storage.dao.VMTemplateDetailsDao; import com.cloud.template.VirtualMachineTemplate; import com.cloud.user.Account; import com.cloud.user.AccountService; @@ -68,6 +69,8 @@ public class TemplateJoinDaoImpl extends GenericDaoBaseWithTagInformation tmpltIdPairSearch; @@ -209,11 +212,8 @@ public class TemplateJoinDaoImpl extends GenericDaoBaseWithTagInformation details = new HashMap<>(); - details.put(template.getDetailName(), template.getDetailValue()); - templateResponse.setDetails(details); - } + Map details = _templateDetailsDao.listDetailsKeyPairs(template.getId()); + templateResponse.setDetails(details); // update tag information long tag_id = template.getTagId(); diff --git a/server/src/main/java/com/cloud/network/vpc/NetworkACLServiceImpl.java b/server/src/main/java/com/cloud/network/vpc/NetworkACLServiceImpl.java index 4593e5dff8e..00667aa40c2 100644 --- a/server/src/main/java/com/cloud/network/vpc/NetworkACLServiceImpl.java +++ b/server/src/main/java/com/cloud/network/vpc/NetworkACLServiceImpl.java @@ -204,7 +204,7 @@ public class NetworkACLServiceImpl extends ManagerBase implements NetworkACLServ sc.setJoinParameters("networkJoin", "networkId", networkId); } - final Filter filter = new Filter(NetworkACLVO.class, "id", false, null, null); + final Filter filter = new Filter(NetworkACLVO.class, "id", false, cmd.getStartIndex(), cmd.getPageSizeVal()); final Pair, Integer> acls = _networkACLDao.searchAndCount(sc, filter); return new Pair, Integer>(acls.first(), acls.second()); } 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 ae471b2486c..3283062709b 100644 --- a/server/src/main/java/org/apache/cloudstack/acl/RoleManagerImpl.java +++ b/server/src/main/java/org/apache/cloudstack/acl/RoleManagerImpl.java @@ -49,8 +49,10 @@ import com.cloud.user.Account; import com.cloud.user.AccountManager; import com.cloud.user.dao.AccountDao; import com.cloud.utils.ListUtils; +import com.cloud.utils.Pair; import com.cloud.utils.component.ManagerBase; import com.cloud.utils.component.PluggableService; +import com.cloud.utils.db.Filter; import com.cloud.utils.db.Transaction; import com.cloud.utils.db.TransactionCallback; import com.cloud.utils.db.TransactionStatus; @@ -244,49 +246,62 @@ public class RoleManagerImpl extends ManagerBase implements RoleService, Configu @Override public List findRolesByName(String name) { - List roles = null; + return findRolesByName(name, null, null).first(); + } + + @Override + public Pair, Integer> findRolesByName(String name, Long startIndex, Long limit) { if (StringUtils.isNotBlank(name)) { - roles = roleDao.findAllByName(name); + Pair, Integer> data = roleDao.findAllByName(name, startIndex, limit); + int removed = removeRootAdminRolesIfNeeded(data.first()); + return new Pair,Integer>(ListUtils.toListOfInterface(data.first()), Integer.valueOf(data.second() - removed)); } - removeRootAdminRolesIfNeeded(roles); - return ListUtils.toListOfInterface(roles); + return new Pair, Integer>(new ArrayList(), 0); } /** * Removes roles of the given list that have the type '{@link RoleType#Admin}' if the user calling the method is not a 'root admin'. * The actual removal is executed via {@link #removeRootAdminRoles(List)}. Therefore, if the method is called by a 'root admin', we do nothing here. */ - protected void removeRootAdminRolesIfNeeded(List roles) { + protected int removeRootAdminRolesIfNeeded(List roles) { Account account = getCurrentAccount(); if (!accountManager.isRootAdmin(account.getId())) { - removeRootAdminRoles(roles); + return removeRootAdminRoles(roles); } + return 0; } /** * Remove all roles that have the {@link RoleType#Admin}. */ - protected void removeRootAdminRoles(List roles) { + protected int removeRootAdminRoles(List roles) { if (CollectionUtils.isEmpty(roles)) { - return; + return 0; } Iterator rolesIterator = roles.iterator(); + int count = 0; while (rolesIterator.hasNext()) { Role role = rolesIterator.next(); if (RoleType.Admin == role.getRoleType()) { + count++; rolesIterator.remove(); } } - + return count; } @Override public List findRolesByType(RoleType roleType) { + return findRolesByType(roleType, null, null).first(); + } + + @Override + public Pair, Integer> findRolesByType(RoleType roleType, Long startIndex, Long limit) { if (roleType == null || RoleType.Admin == roleType && !accountManager.isRootAdmin(getCurrentAccount().getId())) { - return Collections.emptyList(); + return new Pair, Integer>(Collections.emptyList(), 0); } - List roles = roleDao.findAllByRoleType(roleType); - return ListUtils.toListOfInterface(roles); + Pair, Integer> data = roleDao.findAllByRoleType(roleType, startIndex, limit); + return new Pair,Integer>(ListUtils.toListOfInterface(data.first()), Integer.valueOf(data.second())); } @Override @@ -296,6 +311,14 @@ public class RoleManagerImpl extends ManagerBase implements RoleService, Configu return ListUtils.toListOfInterface(roles); } + @Override + public Pair, Integer> listRoles(Long startIndex, Long limit) { + Pair, Integer> data = roleDao.searchAndCount(null, + new Filter(RoleVO.class, "id", Boolean.TRUE, startIndex, limit)); + int removed = removeRootAdminRolesIfNeeded(data.first()); + return new Pair,Integer>(ListUtils.toListOfInterface(data.first()), Integer.valueOf(data.second() - removed)); + } + @Override public List findAllPermissionsBy(final Long roleId) { List permissions = rolePermissionsDao.findAllByRoleIdSorted(roleId); 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 e7ce1acec3e..a1be4541541 100644 --- a/server/src/test/java/org/apache/cloudstack/acl/RoleManagerImplTest.java +++ b/server/src/test/java/org/apache/cloudstack/acl/RoleManagerImplTest.java @@ -34,6 +34,7 @@ import org.mockito.runners.MockitoJUnitRunner; import com.cloud.user.Account; import com.cloud.user.AccountManager; +import com.cloud.utils.Pair; @RunWith(MockitoJUnitRunner.class) public class RoleManagerImplTest { @@ -163,12 +164,12 @@ public class RoleManagerImplTest { @Test public void findRolesByNameTest() { String roleName = "roleName"; - ArrayList toBeReturned = new ArrayList<>(); - Mockito.doReturn(toBeReturned).when(roleDaoMock).findAllByName(roleName); + List roles = new ArrayList<>(); + Pair, Integer> toBeReturned = new Pair(roles, 0); + Mockito.doReturn(toBeReturned).when(roleDaoMock).findAllByName(roleName, null, null); roleManagerImpl.findRolesByName(roleName); - - Mockito.verify(roleManagerImpl).removeRootAdminRolesIfNeeded(toBeReturned); + Mockito.verify(roleManagerImpl).removeRootAdminRolesIfNeeded(roles); } @Test @@ -248,12 +249,12 @@ public class RoleManagerImplTest { List roles = new ArrayList<>(); roles.add(Mockito.mock(Role.class)); - Mockito.doReturn(roles).when(roleDaoMock).findAllByRoleType(RoleType.Admin); + Pair, Integer> toBeReturned = new Pair(roles, 1); + Mockito.doReturn(toBeReturned).when(roleDaoMock).findAllByRoleType(RoleType.Admin, null, null); List returnedRoles = roleManagerImpl.findRolesByType(RoleType.Admin); Assert.assertEquals(1, returnedRoles.size()); Mockito.verify(accountManagerMock, Mockito.times(1)).isRootAdmin(Mockito.anyLong()); - Mockito.verify(roleDaoMock, Mockito.times(1)).findAllByRoleType(Mockito.any(RoleType.class)); } @Test @@ -263,12 +264,12 @@ public class RoleManagerImplTest { List roles = new ArrayList<>(); roles.add(Mockito.mock(Role.class)); - Mockito.doReturn(roles).when(roleDaoMock).findAllByRoleType(RoleType.User); + Pair, Integer> toBeReturned = new Pair(roles, 1); + Mockito.doReturn(toBeReturned).when(roleDaoMock).findAllByRoleType(RoleType.User, null, null); List returnedRoles = roleManagerImpl.findRolesByType(RoleType.User); Assert.assertEquals(1, returnedRoles.size()); Mockito.verify(accountManagerMock, Mockito.times(0)).isRootAdmin(Mockito.anyLong()); - Mockito.verify(roleDaoMock, Mockito.times(1)).findAllByRoleType(Mockito.any(RoleType.class)); } @Test @@ -277,7 +278,7 @@ public class RoleManagerImplTest { roles.add(Mockito.mock(Role.class)); Mockito.doReturn(roles).when(roleDaoMock).listAll(); - Mockito.doNothing().when(roleManagerImpl).removeRootAdminRolesIfNeeded(roles); + Mockito.doReturn(0).when(roleManagerImpl).removeRootAdminRolesIfNeeded(roles); List returnedRoles = roleManagerImpl.listRoles();