diff --git a/api/src/com/cloud/api/commands/ListSystemVMsCmd.java b/api/src/com/cloud/api/commands/ListSystemVMsCmd.java index 195a5e370d4..9f38cb74bc0 100644 --- a/api/src/com/cloud/api/commands/ListSystemVMsCmd.java +++ b/api/src/com/cloud/api/commands/ListSystemVMsCmd.java @@ -66,6 +66,10 @@ public class ListSystemVMsCmd extends BaseListCmd { @IdentityMapper(entityTableName="data_center") @Parameter(name=ApiConstants.ZONE_ID, type=CommandType.LONG, description="the Zone ID of the system VM") private Long zoneId; + + @IdentityMapper(entityTableName="storage_pool") + @Parameter(name=ApiConstants.STORAGE_ID, type=CommandType.LONG, description="the storage ID where vm's volumes belong to") + private Long storageId; ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// @@ -98,6 +102,10 @@ public class ListSystemVMsCmd extends BaseListCmd { public Long getZoneId() { return zoneId; } + + public Long getStorageId() { + return storageId; + } ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index e62d6cbb204..dafcca7c8e9 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -2577,6 +2577,7 @@ public class ManagementServerImpl implements ManagementServer { String keyword = cmd.getKeyword(); Long podId = cmd.getPodId(); Long hostId = cmd.getHostId(); + Long storageId = cmd.getStorageId(); Filter searchFilter = new Filter(VMInstanceVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal()); SearchBuilder sb = _vmInstanceDao.createSearchBuilder(); @@ -2589,6 +2590,12 @@ public class ManagementServerImpl implements ManagementServer { sb.and("hostId", sb.entity().getHostId(), SearchCriteria.Op.EQ); sb.and("type", sb.entity().getType(), SearchCriteria.Op.EQ); sb.and("nulltype", sb.entity().getType(), SearchCriteria.Op.IN); + + if (storageId != null) { + SearchBuilder volumeSearch = _volumeDao.createSearchBuilder(); + volumeSearch.and("poolId", volumeSearch.entity().getPoolId(), SearchCriteria.Op.EQ); + sb.join("volumeSearch", volumeSearch, sb.entity().getId(), volumeSearch.entity().getInstanceId(), JoinBuilder.JoinType.INNER); + } SearchCriteria sc = sb.create(); @@ -2596,9 +2603,9 @@ public class ManagementServerImpl implements ManagementServer { SearchCriteria ssc = _vmInstanceDao.createSearchCriteria(); ssc.addOr("hostName", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("state", SearchCriteria.Op.LIKE, "%" + keyword + "%"); - + sc.addAnd("hostName", SearchCriteria.Op.SC, ssc); - } + } if (id != null) { sc.setParameters("id", id); @@ -2625,6 +2632,10 @@ public class ManagementServerImpl implements ManagementServer { } else { sc.setParameters("nulltype", VirtualMachine.Type.SecondaryStorageVm, VirtualMachine.Type.ConsoleProxy); } + + if (storageId != null) { + sc.setJoinParameters("volumeSearch", "poolId", storageId); + } return _vmInstanceDao.search(sc, searchFilter); }