Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions api/src/main/java/org/apache/cloudstack/acl/RoleService.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@

import java.util.List;

import com.cloud.utils.Pair;

import org.apache.cloudstack.acl.RolePermission.Permission;
import org.apache.cloudstack.framework.config.ConfigKey;

Expand Down Expand Up @@ -65,16 +67,22 @@ public interface RoleService {
*/
List<Role> listRoles();

Pair<List<Role>, 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<Role> findRolesByName(String name);

Pair<List<Role>, 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<Role> findRolesByType(RoleType roleType);

Pair<List<Role>, Integer> findRolesByType(RoleType roleType, Long startIndex, Long limit);

List<RolePermission> findAllPermissionsBy(Long roleId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,18 +25,19 @@
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";

/////////////////////////////////////////////////////
Expand Down Expand Up @@ -77,18 +78,18 @@ public RoleType getRoleType() {

@Override
public String getCommandName() {
return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX;
return APINAME.toLowerCase() + BaseListCmd.RESPONSE_SUFFIX;
}

@Override
public long getEntityOwnerId() {
return Account.ACCOUNT_ID_SYSTEM;
}

private void setupResponse(final List<Role> roles) {
private void setupResponse(final Pair<List<Role>, Integer> roles) {
final ListResponse<RoleResponse> response = new ListResponse<>();
final List<RoleResponse> roleResponses = new ArrayList<>();
for (final Role role : roles) {
for (final Role role : roles.first()) {
if (role == null) {
continue;
}
Expand All @@ -100,22 +101,22 @@ private void setupResponse(final List<Role> roles) {
roleResponse.setObjectName("role");
roleResponses.add(roleResponse);
}
response.setResponses(roleResponses);
response.setResponses(roleResponses, roles.second());
response.setResponseName(getCommandName());
setResponseObject(response);
}

@Override
public void execute() {
List<Role> roles;
Pair<List<Role>, Integer> roles;
if (getId() != null && getId() > 0L) {
roles = Collections.singletonList(roleService.findRole(getId()));
roles = new Pair<List<Role>, 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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,18 @@ public String getKeyPairName() {
return keypair;
}

public Long getHostId() {
return hostId;
}

public Long getPodId() {
return podId;
}

public Long getStorageId() {
return storageId;
}

public EnumSet<VMDetails> getDetails() throws InvalidParameterValueException {
EnumSet<VMDetails> dv;
if (viewDetails == null || viewDetails.size() <= 0) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down Expand Up @@ -381,7 +381,7 @@ public void setLastPinged(Date lastPinged) {
this.lastPinged = lastPinged;
}

public void setManagementServerId(Long managementServerId) {
public void setManagementServerId(String managementServerId) {
this.managementServerId = managementServerId;
}

Expand Down Expand Up @@ -633,7 +633,7 @@ public Date getLastPinged() {
return lastPinged;
}

public Long getManagementServerId() {
public String getManagementServerId() {
return managementServerId;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -25,5 +26,10 @@

public interface RoleDao extends GenericDao<RoleVO, Long> {
List<RoleVO> findAllByName(String roleName);

Pair<List<RoleVO>, Integer> findAllByName(final String roleName, Long offset, Long limit);

List<RoleVO> findAllByRoleType(RoleType type);

Pair<List<RoleVO>, Integer> findAllByRoleType(RoleType type, Long offset, Long limit);
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -45,15 +47,24 @@ public RoleDaoImpl() {

@Override
public List<RoleVO> findAllByName(final String roleName) {
return findAllByName(roleName, null, null).first();
}

@Override
public Pair<List<RoleVO>, Integer> findAllByName(final String roleName, Long offset, Long limit) {
SearchCriteria<RoleVO> sc = RoleByNameSearch.create();
sc.setParameters("roleName", "%" + roleName + "%");
return listBy(sc);
return searchAndCount(sc, new Filter(RoleVO.class, "id", true, offset, limit));
}

@Override
public List<RoleVO> findAllByRoleType(final RoleType type) {
return findAllByRoleType(type, null, null).first();
}

public Pair<List<RoleVO>, Integer> findAllByRoleType(final RoleType type, Long offset, Long limit) {
SearchCriteria<RoleVO> sc = RoleByTypeSearch.create();
sc.setParameters("roleType", type);
return listBy(sc);
return searchAndCount(sc, new Filter(RoleVO.class, "id", true, offset, limit));
}
}
15 changes: 6 additions & 9 deletions server/src/main/java/com/cloud/api/query/QueryManagerImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,6 @@
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;
Expand Down Expand Up @@ -910,11 +909,10 @@ private Pair<List<UserVmJoinVO>, Integer> searchForUserVMsInternal(ListVMsCmd cm
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);
Expand Down Expand Up @@ -1064,9 +1062,8 @@ private Pair<List<UserVmJoinVO>, Integer> searchForUserVMsInternal(ListVMsCmd cm
sc.setParameters("keyPairName", keyPairName);
}

if (cmd instanceof ListVMsCmdByAdmin) {
ListVMsCmdByAdmin aCmd = (ListVMsCmdByAdmin)cmd;
if (aCmd.getPodId() != null) {
if (_accountMgr.isRootAdmin(caller.getId())) {
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@rhtyd Is there a better way to do this? If not, can entirely remove ListVmsCmdByAdmin since it's no longer used

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this LGTM

if (cmd.getPodId() != null) {
sc.setParameters("podId", pod);

if (state == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@

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;
Expand All @@ -65,6 +67,8 @@ public class HostJoinDaoImpl extends GenericDaoBase<HostJoinVO, Long> implements
private HAConfigDao haConfigDao;
@Inject
private OutOfBandManagementDao outOfBandManagementDao;
@Inject
private ManagementServerHostDao managementServerHostDao;

private final SearchBuilder<HostJoinVO> hostSearch;

Expand Down Expand Up @@ -103,7 +107,13 @@ public HostResponse newHostResponse(HostJoinVO host, EnumSet<HostDetails> detail
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());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
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;
Expand All @@ -68,6 +69,8 @@ public class TemplateJoinDaoImpl extends GenericDaoBaseWithTagInformation<Templa
private AccountService _accountService;
@Inject
private VMTemplateDao _vmTemplateDao;
@Inject
private VMTemplateDetailsDao _templateDetailsDao;

private final SearchBuilder<TemplateJoinVO> tmpltIdPairSearch;

Expand Down Expand Up @@ -209,11 +212,8 @@ public TemplateResponse newTemplateResponse(ResponseView view, TemplateJoinVO te
}

// set details map
if (template.getDetailName() != null) {
Map<String, String> details = new HashMap<>();
details.put(template.getDetailName(), template.getDetailValue());
templateResponse.setDetails(details);
}
Map<String, String> details = _templateDetailsDao.listDetailsKeyPairs(template.getId());
templateResponse.setDetails(details);

// update tag information
long tag_id = template.getTagId();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,7 @@ public Pair<List<? extends NetworkACL>, Integer> listNetworkACLs(final ListNetwo
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<List<NetworkACLVO>, Integer> acls = _networkACLDao.searchAndCount(sc, filter);
return new Pair<List<? extends NetworkACL>, Integer>(acls.first(), acls.second());
}
Expand Down
Loading