diff --git a/api/src/com/cloud/api/commands/ListVMsCmd.java b/api/src/com/cloud/api/commands/ListVMsCmd.java index f8b694a2a1e..37dfcd32620 100755 --- a/api/src/com/cloud/api/commands/ListVMsCmd.java +++ b/api/src/com/cloud/api/commands/ListVMsCmd.java @@ -96,6 +96,9 @@ public class ListVMsCmd extends BaseListTaggedResourcesCmd { @Parameter(name=ApiConstants.ISO_ID, type=CommandType.LONG, description="list vms by iso") private Long isoId; + @IdentityMapper(entityTableName="vpc") + @Parameter(name=ApiConstants.VPC_ID, type=CommandType.LONG, description="list vms by vpc") + private Long vpcId; ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -156,6 +159,10 @@ public class ListVMsCmd extends BaseListTaggedResourcesCmd { return isoId; } + public Long getVpcId(){ + return vpcId; + } + public EnumSet getDetails() throws InvalidParameterValueException { EnumSet dv; if (viewDetails==null || viewDetails.size() <=0){ diff --git a/server/src/com/cloud/server/Criteria.java b/server/src/com/cloud/server/Criteria.java index 3a1f740b774..35186f89711 100755 --- a/server/src/com/cloud/server/Criteria.java +++ b/server/src/com/cloud/server/Criteria.java @@ -81,6 +81,7 @@ public class Criteria { public static final String STORAGE_ID="storageid"; public static final String TEMPLATE_ID = "templateid"; public static final String ISO_ID = "isoid"; + public static final String VPC_ID = "vpcId"; public Criteria(String orderBy, Boolean ascending, Long offset, Long limit) { this.offset = offset; diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 73a60ce91d2..79eeb31a781 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -141,6 +141,8 @@ import com.cloud.network.security.SecurityGroupManager; import com.cloud.network.security.dao.SecurityGroupDao; import com.cloud.network.security.dao.SecurityGroupVMMapDao; import com.cloud.network.vpc.VpcManager; +import com.cloud.network.vpc.VpcVO; +import com.cloud.network.vpc.dao.VpcDao; import com.cloud.offering.NetworkOffering; import com.cloud.offering.NetworkOffering.Availability; import com.cloud.offering.ServiceOffering; @@ -319,6 +321,8 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager @Inject protected NicDao _nicDao; @Inject + protected VpcDao _vpcDao; + @Inject protected RulesManager _rulesMgr; @Inject protected LoadBalancingRulesManager _lbMgr; @@ -3012,6 +3016,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager c.addCriteria(Criteria.NETWORKID, cmd.getNetworkId()); c.addCriteria(Criteria.TEMPLATE_ID, cmd.getTemplateId()); c.addCriteria(Criteria.ISO_ID, cmd.getIsoId()); + c.addCriteria(Criteria.VPC_ID, cmd.getVpcId()); if (domainId != null) { c.addCriteria(Criteria.DOMAINID, domainId); @@ -3063,6 +3068,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager Object storageId = c.getCriteria(Criteria.STORAGE_ID); Object templateId = c.getCriteria(Criteria.TEMPLATE_ID); Object isoId = c.getCriteria(Criteria.ISO_ID); + Object vpcId = c.getCriteria(Criteria.VPC_ID); sb.and("displayName", sb.entity().getDisplayName(), SearchCriteria.Op.LIKE); sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); @@ -3110,6 +3116,19 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager sb.join("nicSearch", nicSearch, sb.entity().getId(), nicSearch.entity().getInstanceId(), JoinBuilder.JoinType.INNER); } + + if(vpcId != null && networkId == null){ + SearchBuilder nicSearch = _nicDao.createSearchBuilder(); + + SearchBuilder networkSearch = _networkDao.createSearchBuilder(); + nicSearch.join("networkSearch", networkSearch, nicSearch.entity().getNetworkId(), networkSearch.entity().getId(), JoinBuilder.JoinType.INNER); + + SearchBuilder vpcSearch = _vpcDao.createSearchBuilder(); + vpcSearch.and("vpcId", vpcSearch.entity().getId(), SearchCriteria.Op.EQ); + networkSearch.join("vpcSearch", vpcSearch, networkSearch.entity().getVpcId(), vpcSearch.entity().getId(), JoinBuilder.JoinType.INNER); + + sb.join("nicSearch", nicSearch, sb.entity().getId(), nicSearch.entity().getInstanceId(), JoinBuilder.JoinType.INNER); + } if (storageId != null) { SearchBuilder volumeSearch = _volsDao.createSearchBuilder(); @@ -3162,6 +3181,10 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager if (networkId != null) { sc.setJoinParameters("nicSearch", "networkId", networkId); } + + if(vpcId != null && networkId == null){ + sc.setJoinParameters("vpcSearch", "vpcId", vpcId); + } if (name != null) { sc.setParameters("name", "%" + name + "%"); diff --git a/utils/src/com/cloud/utils/db/SearchCriteria.java b/utils/src/com/cloud/utils/db/SearchCriteria.java index a0d944f08cd..ba4e84db55d 100755 --- a/utils/src/com/cloud/utils/db/SearchCriteria.java +++ b/utils/src/com/cloud/utils/db/SearchCriteria.java @@ -223,9 +223,10 @@ public class SearchCriteria { return jb; } - for (JoinBuilder> j2 : _joins.values()) { + for (JoinBuilder> j2 : jbmap.values()) { SearchCriteria sc = j2.getT(); - jb = findJoin(sc._joins, joinName); + if(sc._joins != null) + jb = findJoin(sc._joins, joinName); if (jb != null) { return jb; }