From 4ff592ac2c151ff9be61b78c82d6508e74a52288 Mon Sep 17 00:00:00 2001 From: Marcus Sorensen Date: Thu, 26 Oct 2023 00:44:09 -0600 Subject: [PATCH] Use UserVmDao for listVirtualMachines API to increase performance (#8012) Co-authored-by: Marcus Sorensen --- .../com/cloud/utils/db/GenericDaoBase.java | 37 +- .../cloud/utils/db/GenericDaoBaseTest.java | 52 ++ .../com/cloud/api/query/QueryManagerImpl.java | 790 ++++++++++-------- 3 files changed, 540 insertions(+), 339 deletions(-) diff --git a/framework/db/src/main/java/com/cloud/utils/db/GenericDaoBase.java b/framework/db/src/main/java/com/cloud/utils/db/GenericDaoBase.java index a5ed004c30e..5fd9580342c 100644 --- a/framework/db/src/main/java/com/cloud/utils/db/GenericDaoBase.java +++ b/framework/db/src/main/java/com/cloud/utils/db/GenericDaoBase.java @@ -1264,6 +1264,11 @@ public abstract class GenericDaoBase extends Compone @DB() protected void addJoins(StringBuilder str, Collection>> joins) { + addJoins(str, joins, new HashMap<>()); + } + + @DB() + protected void addJoins(StringBuilder str, Collection>> joins, Map joinedTableNames) { boolean hasWhereClause = true; int fromIndex = str.lastIndexOf("WHERE"); if (fromIndex == -1) { @@ -1274,18 +1279,27 @@ public abstract class GenericDaoBase extends Compone } for (JoinBuilder> join : joins) { + String joinTableName = join.getSecondAttribute().table; + String joinTableAlias = findNextJoinTableName(joinTableName, joinedTableNames); StringBuilder onClause = new StringBuilder(); onClause.append(" ") .append(join.getType().getName()) .append(" ") - .append(join.getSecondAttribute().table) - .append(" ON ") + .append(joinTableName); + if (!joinTableAlias.equals(joinTableName)) { + onClause.append(" ").append(joinTableAlias); + } + onClause.append(" ON ") .append(join.getFirstAttribute().table) .append(".") .append(join.getFirstAttribute().columnName) - .append("=") - .append(join.getSecondAttribute().table) - .append(".") + .append("="); + if(!joinTableAlias.equals(joinTableName)) { + onClause.append(joinTableAlias); + } else { + onClause.append(joinTableName); + } + onClause.append(".") .append(join.getSecondAttribute().columnName) .append(" "); str.insert(fromIndex, onClause); @@ -1306,11 +1320,22 @@ public abstract class GenericDaoBase extends Compone for (JoinBuilder> join : joins) { if (join.getT().getJoins() != null) { - addJoins(str, join.getT().getJoins()); + addJoins(str, join.getT().getJoins(), joinedTableNames); } } } + protected static String findNextJoinTableName(String tableName, Map usedTableNames) { + if (usedTableNames.containsKey(tableName)) { + Integer tableCounter = usedTableNames.get(tableName); + usedTableNames.put(tableName, ++tableCounter); + tableName = tableName + tableCounter; + } else { + usedTableNames.put(tableName, 0); + } + return tableName; + } + private void removeAndClause(StringBuilder sql) { sql.delete(sql.length() - 4, sql.length()); } diff --git a/framework/db/src/test/java/com/cloud/utils/db/GenericDaoBaseTest.java b/framework/db/src/test/java/com/cloud/utils/db/GenericDaoBaseTest.java index 352ea735aa7..b950501337b 100644 --- a/framework/db/src/test/java/com/cloud/utils/db/GenericDaoBaseTest.java +++ b/framework/db/src/test/java/com/cloud/utils/db/GenericDaoBaseTest.java @@ -18,6 +18,10 @@ package com.cloud.utils.db; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; import org.junit.Assert; import org.junit.Before; @@ -36,6 +40,7 @@ public class GenericDaoBaseTest { @Mock SQLException mockedSQLException; + private static final DbTestDao dbTestDao = new DbTestDao(); private static final String INTEGRITY_CONSTRAINT_VIOLATION = "23000"; private static final int DUPLICATE_ENTRY_ERRO_CODE = 1062; @@ -214,4 +219,51 @@ public class GenericDaoBaseTest { Assert.assertEquals(resultSetSize, result); } + + @Test + public void addJoinsTest() { + StringBuilder joinString = new StringBuilder(); + Collection>> joins = new ArrayList<>(); + + Attribute attr1 = new Attribute("table1", "column1"); + Attribute attr2 = new Attribute("table2", "column2"); + Attribute attr3 = new Attribute("table3", "column1"); + Attribute attr4 = new Attribute("table4", "column2"); + + joins.add(new JoinBuilder<>(dbTestDao.createSearchCriteria(), attr1, attr2, JoinBuilder.JoinType.INNER)); + joins.add(new JoinBuilder<>(dbTestDao.createSearchCriteria(), attr3, attr4, JoinBuilder.JoinType.INNER)); + dbTestDao.addJoins(joinString, joins); + + Assert.assertEquals(" INNER JOIN table2 ON table1.column1=table2.column2 INNER JOIN table4 ON table3.column1=table4.column2 ", joinString.toString()); + } + + @Test + public void multiJoinSameTableTest() { + StringBuilder joinString = new StringBuilder(); + Collection>> joins = new ArrayList<>(); + + Attribute tAc1 = new Attribute("tableA", "column1"); + Attribute tAc2 = new Attribute("tableA", "column2"); + Attribute tAc3 = new Attribute("tableA", "column3"); + Attribute tBc2 = new Attribute("tableB", "column2"); + Attribute tCc3 = new Attribute("tableC", "column3"); + Attribute tDc4 = new Attribute("tableD", "column4"); + + joins.add(new JoinBuilder<>(dbTestDao.createSearchCriteria(), tBc2, tAc1, JoinBuilder.JoinType.INNER)); + joins.add(new JoinBuilder<>(dbTestDao.createSearchCriteria(), tCc3, tAc2, JoinBuilder.JoinType.INNER)); + joins.add(new JoinBuilder<>(dbTestDao.createSearchCriteria(), tDc4, tAc3, JoinBuilder.JoinType.INNER)); + dbTestDao.addJoins(joinString, joins); + + Assert.assertEquals(" INNER JOIN tableA ON tableB.column2=tableA.column1 INNER JOIN tableA tableA1 ON tableC.column3=tableA1.column2 INNER JOIN tableA tableA2 ON tableD.column4=tableA2.column3 ", joinString.toString()); + } + + @Test + public void findNextTableNameTest() { + Map usedTables = new HashMap<>(); + + Assert.assertEquals("tableA", GenericDaoBase.findNextJoinTableName("tableA", usedTables)); + Assert.assertEquals("tableA1", GenericDaoBase.findNextJoinTableName("tableA", usedTables)); + Assert.assertEquals("tableA2", GenericDaoBase.findNextJoinTableName("tableA", usedTables)); + Assert.assertEquals("tableA3", GenericDaoBase.findNextJoinTableName("tableA", usedTables)); + } } 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 491104b654c..946b48cf480 100644 --- a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java +++ b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java @@ -34,6 +34,22 @@ import java.util.stream.Stream; import javax.inject.Inject; +import com.cloud.host.Host; +import com.cloud.host.dao.HostDao; +import com.cloud.network.as.AutoScaleVmGroupVmMapVO; +import com.cloud.network.as.dao.AutoScaleVmGroupDao; +import com.cloud.network.as.dao.AutoScaleVmGroupVmMapDao; +import com.cloud.network.dao.NetworkDao; +import com.cloud.network.dao.NetworkVO; +import com.cloud.storage.dao.VolumeDao; +import com.cloud.user.SSHKeyPairVO; +import com.cloud.user.dao.SSHKeyPairDao; +import com.cloud.vm.InstanceGroupVMMapVO; +import com.cloud.vm.NicVO; +import com.cloud.vm.UserVmDetailVO; +import com.cloud.vm.dao.InstanceGroupVMMapDao; +import com.cloud.vm.dao.NicDao; +import com.cloud.vm.dao.UserVmDetailsDao; import org.apache.cloudstack.acl.ControlledEntity; import org.apache.cloudstack.acl.ControlledEntity.ACLType; import org.apache.cloudstack.acl.SecurityChecker; @@ -118,6 +134,8 @@ import org.apache.cloudstack.api.response.UserResponse; import org.apache.cloudstack.api.response.UserVmResponse; import org.apache.cloudstack.api.response.VolumeResponse; import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.backup.BackupOfferingVO; +import org.apache.cloudstack.backup.dao.BackupOfferingDao; import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreCapabilities; @@ -201,7 +219,6 @@ import com.cloud.exception.CloudAuthenticationException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.PermissionDeniedException; import com.cloud.ha.HighAvailabilityManager; -import com.cloud.host.Host; import com.cloud.hypervisor.Hypervisor; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.network.RouterHealthCheckResult; @@ -247,7 +264,6 @@ import com.cloud.storage.VolumeVO; import com.cloud.storage.dao.DiskOfferingDao; import com.cloud.storage.dao.StoragePoolTagsDao; import com.cloud.storage.dao.VMTemplateDao; -import com.cloud.storage.dao.VolumeDao; import com.cloud.tags.ResourceTagVO; import com.cloud.tags.dao.ResourceTagDao; import com.cloud.template.VirtualMachineTemplate.State; @@ -281,6 +297,8 @@ import com.cloud.vm.dao.DomainRouterDao; import com.cloud.vm.dao.UserVmDao; import com.cloud.vm.dao.VMInstanceDao; +import static com.cloud.vm.VmDetailConstants.SSH_PUBLIC_KEY; + @Component public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements QueryService, Configurable { @@ -289,7 +307,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q private static final String ID_FIELD = "id"; @Inject - private AccountManager _accountMgr; + private AccountManager accountMgr; @Inject private ProjectManager _projectMgr; @@ -316,7 +334,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q private UserVmJoinDao _userVmJoinDao; @Inject - private UserVmDao _userVmDao; + private UserVmDao userVmDao; @Inject private VMInstanceDao _vmInstanceDao; @@ -325,7 +343,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q private SecurityGroupJoinDao _securityGroupJoinDao; @Inject - private SecurityGroupVMMapDao _securityGroupVMMapDao; + private SecurityGroupVMMapDao securityGroupVMMapDao; @Inject private DomainRouterJoinDao _routerJoinDao; @@ -346,7 +364,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q private ProjectAccountJoinDao _projectAccountJoinDao; @Inject - private HostJoinDao _hostJoinDao; + private HostJoinDao hostJoinDao; @Inject private VolumeJoinDao _volumeJoinDao; @@ -429,7 +447,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q private AffinityGroupDomainMapDao _affinityGroupDomainMapDao; @Inject - private ResourceTagDao _resourceTagDao; + private ResourceTagDao resourceTagDao; @Inject private DataStoreManager dataStoreManager; @@ -447,7 +465,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q private RouterHealthCheckResultDao routerHealthCheckResultDao; @Inject - private PrimaryDataStoreDao _storagePoolDao; + private PrimaryDataStoreDao storagePoolDao; @Inject private StoragePoolDetailsDao _storagePoolDetailsDao; @@ -470,8 +488,37 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q private ManagementServerHostDao msHostDao; @Inject - private SnapshotJoinDao snapshotJoinDao; + private NetworkDao networkDao; + @Inject + private NicDao nicDao; + + @Inject + private HostDao hostDao; + + @Inject + private InstanceGroupVMMapDao instanceGroupVMMapDao; + + @Inject + private AffinityGroupVMMapDao affinityGroupVMMapDao; + + @Inject + private UserVmDetailsDao userVmDetailsDao; + + @Inject + private SSHKeyPairDao sshKeyPairDao; + + @Inject + private BackupOfferingDao backupOfferingDao; + + @Inject + private AutoScaleVmGroupDao autoScaleVmGroupDao; + + @Inject + private AutoScaleVmGroupVmMapDao autoScaleVmGroupVmMapDao; + + @Inject + private SnapshotJoinDao snapshotJoinDao; @Inject EntityManager entityManager; @@ -595,13 +642,13 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q private Pair, Integer> getUserListInternal(Account caller, List permittedAccounts, boolean listAll, Long id, Object username, Object type, String accountName, Object state, String keyword, Long domainId, boolean recursive, Filter searchFilter) { Ternary domainIdRecursiveListProject = new Ternary(domainId, recursive, null); - _accountMgr.buildACLSearchParameters(caller, id, accountName, null, permittedAccounts, domainIdRecursiveListProject, listAll, false); + accountMgr.buildACLSearchParameters(caller, id, accountName, null, permittedAccounts, domainIdRecursiveListProject, listAll, false); domainId = domainIdRecursiveListProject.first(); Boolean isRecursive = domainIdRecursiveListProject.second(); ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); SearchBuilder sb = _userAccountJoinDao.createSearchBuilder(); - _accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); + accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); sb.and("username", sb.entity().getUsername(), Op.LIKE); if (id != null && id == 1) { // system user should NOT be searchable @@ -627,7 +674,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q SearchCriteria sc = sb.create(); // building ACL condition - _accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); + accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); if (keyword != null) { SearchCriteria ssc = _userAccountJoinDao.createSearchCriteria(); @@ -687,7 +734,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q private Pair, Integer> searchForEventsInternal(ListEventsCmd cmd) { Account caller = CallContext.current().getCallingAccount(); - boolean isRootAdmin = _accountMgr.isRootAdmin(caller.getId()); + boolean isRootAdmin = accountMgr.isRootAdmin(caller.getId()); List permittedAccounts = new ArrayList(); Long id = cmd.getId(); @@ -727,12 +774,12 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q } if (!isRootAdmin && object instanceof ControlledEntity) { ControlledEntity entity = (ControlledEntity)object; - _accountMgr.checkAccess(CallContext.current().getCallingAccount(), SecurityChecker.AccessType.ListEntry, entity.getAccountId() == caller.getId(), entity); + accountMgr.checkAccess(CallContext.current().getCallingAccount(), SecurityChecker.AccessType.ListEntry, entity.getAccountId() == caller.getId(), entity); } } Ternary domainIdRecursiveListProject = new Ternary(cmd.getDomainId(), cmd.isRecursive(), null); - _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, cmd.listAll(), false); + accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, cmd.listAll(), false); Long domainId = domainIdRecursiveListProject.first(); Boolean isRecursive = domainIdRecursiveListProject.second(); ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); @@ -743,7 +790,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q searchFilter.addOrderBy(EventJoinVO.class, "id", false); SearchBuilder sb = _eventJoinDao.createSearchBuilder(); - _accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); + accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); sb.and("levelL", sb.entity().getLevel(), SearchCriteria.Op.LIKE); @@ -762,10 +809,10 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q SearchCriteria sc = sb.create(); // building ACL condition - _accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); + accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); // For end users display only enabled events - if (!_accountMgr.isRootAdmin(caller.getId())) { + if (!accountMgr.isRootAdmin(caller.getId())) { sc.setParameters("displayEvent", true); } @@ -880,14 +927,14 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q Ternary domainIdRecursiveListProject = new Ternary(cmd.getDomainId(), cmd.isRecursive(), null); - _accountMgr.buildACLSearchParameters(caller, null, cmd.getAccountName(), projectId, permittedAccounts, domainIdRecursiveListProject, listAll, false); + accountMgr.buildACLSearchParameters(caller, null, cmd.getAccountName(), projectId, permittedAccounts, domainIdRecursiveListProject, listAll, false); Long domainId = domainIdRecursiveListProject.first(); Boolean isRecursive = domainIdRecursiveListProject.second(); ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); Filter searchFilter = new Filter(ResourceTagJoinVO.class, "resourceType", false, cmd.getStartIndex(), cmd.getPageSizeVal()); SearchBuilder sb = _resourceTagJoinDao.createSearchBuilder(); - _accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); + accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); sb.and("key", sb.entity().getKey(), SearchCriteria.Op.EQ); sb.and("value", sb.entity().getValue(), SearchCriteria.Op.EQ); @@ -902,7 +949,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q // now set the SC criteria... SearchCriteria sc = sb.create(); - _accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); + accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); if (key != null) { sc.setParameters("key", key); @@ -952,7 +999,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q List permittedAccounts = new ArrayList(); Ternary domainIdRecursiveListProject = new Ternary(cmd.getDomainId(), cmd.isRecursive(), null); - _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, cmd.listAll(), false); + accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, cmd.listAll(), false); Long domainId = domainIdRecursiveListProject.first(); Boolean isRecursive = domainIdRecursiveListProject.second(); ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); @@ -960,13 +1007,13 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q Filter searchFilter = new Filter(InstanceGroupJoinVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal()); SearchBuilder sb = _vmGroupJoinDao.createSearchBuilder(); - _accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); + accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); sb.and("name", sb.entity().getName(), SearchCriteria.Op.EQ); SearchCriteria sc = sb.create(); - _accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); + accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); if (keyword != null) { SearchCriteria ssc = _vmGroupJoinDao.createSearchCriteria(); @@ -997,7 +1044,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q ResponseView respView = ResponseView.Restricted; Account caller = CallContext.current().getCallingAccount(); - if (_accountMgr.isRootAdmin(caller.getId())) { + if (accountMgr.isRootAdmin(caller.getId())) { respView = ResponseView.Full; } List vmResponses = ViewResponseHelper.createUserVmResponse(respView, "virtualmachine", cmd.getDetails(), cmd.getAccumulate(), cmd.getShowUserData(), @@ -1019,21 +1066,79 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q } private Pair, Integer> searchForUserVMsInternal(ListVMsCmd cmd) { + Pair, Integer> vmIdPage = searchForUserVMIdsAndCount(cmd); + + Integer count = vmIdPage.second(); + Long[] idArray = vmIdPage.first().toArray(new Long[0]); + + if (count == 0) { + return new Pair<>(new ArrayList<>(), count); + } + + // search vm details by ids + List vms = _userVmJoinDao.searchByIds( idArray); + return new Pair<>(vms, count); + } + + private Pair, Integer> searchForUserVMIdsAndCount(ListVMsCmd cmd) { Account caller = CallContext.current().getCallingAccount(); List permittedAccounts = new ArrayList<>(); - boolean listAll = cmd.listAll(); Long id = cmd.getId(); + Boolean display = cmd.getDisplay(); + String hypervisor = cmd.getHypervisor(); + String state = cmd.getState(); + Long zoneId = cmd.getZoneId(); + Long templateId = cmd.getTemplateId(); + Long serviceOfferingId = cmd.getServiceOfferingId(); + Boolean isHaEnabled = cmd.getHaEnabled(); + String keyword = cmd.getKeyword(); + Long networkId = cmd.getNetworkId(); + Long isoId = cmd.getIsoId(); + String vmHostName = cmd.getName(); + Long hostId = null; + Long podId = null; + Long clusterId = null; + Long groupId = cmd.getGroupId(); + Long vpcId = cmd.getVpcId(); + Long affinityGroupId = cmd.getAffinityGroupId(); + String keyPairName = cmd.getKeyPairName(); + Long securityGroupId = cmd.getSecurityGroupId(); + Long autoScaleVmGroupId = cmd.getAutoScaleVmGroupId(); + Long backupOfferingId = cmd.getBackupOfferingId(); + Long storageId = null; + StoragePoolVO pool = null; Long userId = cmd.getUserId(); Map tags = cmd.getTags(); - Boolean display = cmd.getDisplay(); + + boolean isAdmin = false; + boolean isRootAdmin = false; + + if (accountMgr.isAdmin(caller.getId())) { + isAdmin = true; + } + + if (accountMgr.isRootAdmin(caller.getId())) { + isRootAdmin = true; + podId = (Long) getObjectPossibleMethodValue(cmd, "getPodId"); + clusterId = (Long) getObjectPossibleMethodValue(cmd, "getClusterId"); + hostId = (Long) getObjectPossibleMethodValue(cmd, "getHostId"); + storageId = (Long) getObjectPossibleMethodValue(cmd, "getStorageId"); + if (storageId != null) { + pool = storagePoolDao.findById( storageId); + if (pool == null) { + throw new InvalidParameterValueException("Unable to find specified storage pool"); + } + } + } + Ternary domainIdRecursiveListProject = new Ternary<>(cmd.getDomainId(), cmd.isRecursive(), null); - _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, listAll, false); + accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, listAll, false); Long domainId = domainIdRecursiveListProject.first(); Boolean isRecursive = domainIdRecursiveListProject.second(); ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); - Filter searchFilter = new Filter(UserVmJoinVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal()); + Filter searchFilter = new Filter(UserVmVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal()); List ids = null; if (cmd.getId() != null) { @@ -1046,302 +1151,319 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q ids = cmd.getIds(); } - // first search distinct vm id by using query criteria and pagination - SearchBuilder sb = _userVmJoinDao.createSearchBuilder(); - sb.select(null, Func.DISTINCT, sb.entity().getId()); // select distinct ids + SearchBuilder userVmSearchBuilder = userVmDao.createSearchBuilder(); + userVmSearchBuilder.select(null, Func.DISTINCT, userVmSearchBuilder.entity().getId()); + accountMgr.buildACLSearchBuilder(userVmSearchBuilder, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); - _accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); - - String hypervisor = cmd.getHypervisor(); - Object name = cmd.getName(); - String state = cmd.getState(); - Object zoneId = cmd.getZoneId(); - Object keyword = cmd.getKeyword(); - boolean isAdmin = false; - boolean isRootAdmin = false; - if (_accountMgr.isAdmin(caller.getId())) { - isAdmin = true; - } - if (_accountMgr.isRootAdmin(caller.getId())) { - isRootAdmin = true; - } - - Object groupId = cmd.getGroupId(); - Object networkId = cmd.getNetworkId(); if (HypervisorType.getType(hypervisor) == HypervisorType.None && hypervisor != null) { // invalid hypervisor type input throw new InvalidParameterValueException("Invalid HypervisorType " + hypervisor); } - Object templateId = cmd.getTemplateId(); - Object isoId = cmd.getIsoId(); - Object vpcId = cmd.getVpcId(); - Object affinityGroupId = cmd.getAffinityGroupId(); - Object keyPairName = cmd.getKeyPairName(); - Object serviceOffId = cmd.getServiceOfferingId(); - Object securityGroupId = cmd.getSecurityGroupId(); - Object backupOfferingId = cmd.getBackupOfferingId(); - Object isHaEnabled = cmd.getHaEnabled(); - Object autoScaleVmGroupId = cmd.getAutoScaleVmGroupId(); - Object pod = null; - Object clusterId = null; - Object hostId = null; - Object storageId = null; - if (_accountMgr.isRootAdmin(caller.getId())) { - pod = getObjectPossibleMethodValue(cmd, "getPodId"); - clusterId = getObjectPossibleMethodValue(cmd, "getClusterId"); - hostId = getObjectPossibleMethodValue(cmd, "getHostId"); - storageId = getObjectPossibleMethodValue(cmd, "getStorageId"); - } - - sb.and("displayName", sb.entity().getDisplayName(), SearchCriteria.Op.LIKE); - sb.and("idIN", sb.entity().getId(), SearchCriteria.Op.IN); - sb.and("name", sb.entity().getName(), SearchCriteria.Op.EQ); - sb.and("stateEQ", sb.entity().getState(), SearchCriteria.Op.EQ); - sb.and("stateNEQ", sb.entity().getState(), SearchCriteria.Op.NEQ); - sb.and("stateNIN", sb.entity().getState(), SearchCriteria.Op.NIN); - sb.and("dataCenterId", sb.entity().getDataCenterId(), SearchCriteria.Op.EQ); - sb.and("podId", sb.entity().getPodId(), SearchCriteria.Op.EQ); - if (clusterId != null) { - sb.and().op("clusterId", sb.entity().getClusterId(), SearchCriteria.Op.EQ); - sb.or("clusterHostId", sb.entity().getHostId(), Op.IN); - sb.or("clusterLastHostId", sb.entity().getLastHostId(), Op.IN); - sb.cp(); - } - sb.and("hypervisorType", sb.entity().getHypervisorType(), SearchCriteria.Op.EQ); - sb.and("hostIdEQ", sb.entity().getHostId(), SearchCriteria.Op.EQ); - sb.and("templateId", sb.entity().getTemplateId(), SearchCriteria.Op.EQ); - sb.and("isoId", sb.entity().getIsoId(), SearchCriteria.Op.EQ); - sb.and("instanceGroupId", sb.entity().getInstanceGroupId(), SearchCriteria.Op.EQ); - - if (serviceOffId != null) { - sb.and("serviceOfferingId", sb.entity().getServiceOfferingId(), SearchCriteria.Op.EQ); - } - - if (backupOfferingId != null) { - sb.and("backupOfferingId", sb.entity().getBackupOfferingId(), SearchCriteria.Op.EQ); - } - - if (display != null) { - sb.and("display", sb.entity().isDisplayVm(), SearchCriteria.Op.EQ); - } - - if (isHaEnabled != null) { - sb.and("haEnabled", sb.entity().isHaEnabled(), SearchCriteria.Op.EQ); - } - - if (groupId != null && (Long)groupId != -1) { - sb.and("instanceGroupId", sb.entity().getInstanceGroupId(), SearchCriteria.Op.EQ); - } - - if (userId != null) { - sb.and("userId", sb.entity().getUserId(), SearchCriteria.Op.EQ); - } - - if (networkId != null) { - sb.and("networkId", sb.entity().getNetworkId(), SearchCriteria.Op.EQ); - } - - if (vpcId != null && networkId == null) { - sb.and("vpcId", sb.entity().getVpcId(), SearchCriteria.Op.EQ); - } - - if (storageId != null) { - StoragePoolVO poolVO = _storagePoolDao.findById((Long) storageId); - if (poolVO.getPoolType() == Storage.StoragePoolType.DatastoreCluster) { - sb.and("poolId", sb.entity().getPoolId(), SearchCriteria.Op.IN); - } else { - sb.and("poolId", sb.entity().getPoolId(), SearchCriteria.Op.EQ); - } - } - - if (affinityGroupId != null) { - sb.and("affinityGroupId", sb.entity().getAffinityGroupId(), SearchCriteria.Op.EQ); - } - - if (keyPairName != null) { - sb.and("keyPairName", sb.entity().getKeypairNames(), SearchCriteria.Op.FIND_IN_SET); - } - - if (!isRootAdmin) { - sb.and("displayVm", sb.entity().isDisplayVm(), SearchCriteria.Op.EQ); - } - - if (securityGroupId != null) { - sb.and("securityGroupId", sb.entity().getSecurityGroupId(), SearchCriteria.Op.EQ); - } - - if (autoScaleVmGroupId != null) { - sb.and("autoScaleVmGroupId", sb.entity().getAutoScaleVmGroupId(), SearchCriteria.Op.EQ); - } - - // populate the search criteria with the values passed in - SearchCriteria sc = sb.create(); - - // building ACL condition - _accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); - - if (tags != null && !tags.isEmpty()) { - SearchCriteria tagSc = _userVmJoinDao.createSearchCriteria(); - for (Map.Entry entry : tags.entrySet()) { - SearchCriteria tsc = _userVmJoinDao.createSearchCriteria(); - tsc.addAnd("tagKey", SearchCriteria.Op.EQ, entry.getKey()); - tsc.addAnd("tagValue", SearchCriteria.Op.EQ, entry.getValue()); - tagSc.addOr("tagKey", SearchCriteria.Op.SC, tsc); - } - sc.addAnd("tagKey", SearchCriteria.Op.SC, tagSc); - } - - if (groupId != null && (Long)groupId != -1) { - sc.setParameters("instanceGroupId", groupId); - } - - if (keyword != null) { - SearchCriteria ssc = _userVmJoinDao.createSearchCriteria(); - String likeKeyword = String.format("%%%s%%", keyword); - ssc.addOr("displayName", SearchCriteria.Op.LIKE, likeKeyword); - ssc.addOr("name", SearchCriteria.Op.LIKE, likeKeyword); - if (isRootAdmin) { - ssc.addOr("instanceName", SearchCriteria.Op.LIKE, likeKeyword); - } - ssc.addOr("ipAddress", SearchCriteria.Op.LIKE, likeKeyword); - ssc.addOr("publicIpAddress", SearchCriteria.Op.LIKE, likeKeyword); - ssc.addOr("ip6Address", SearchCriteria.Op.LIKE, likeKeyword); - ssc.addOr("state", SearchCriteria.Op.EQ, keyword); - sc.addAnd("displayName", SearchCriteria.Op.SC, ssc); - } - - if (serviceOffId != null) { - sc.setParameters("serviceOfferingId", serviceOffId); - } - - if (backupOfferingId != null) { - sc.setParameters("backupOfferingId", backupOfferingId); - } - - if (securityGroupId != null) { - sc.setParameters("securityGroupId", securityGroupId); - } - - if (autoScaleVmGroupId != null) { - sc.setParameters("autoScaleVmGroupId", autoScaleVmGroupId); - } - - if (display != null) { - sc.setParameters("display", display); - } - - if (isHaEnabled != null) { - sc.setParameters("haEnabled", isHaEnabled); - } if (ids != null && !ids.isEmpty()) { - sc.setParameters("idIN", ids.toArray()); + userVmSearchBuilder.and("idIN", userVmSearchBuilder.entity().getId(), Op.IN); + } + + userVmSearchBuilder.and("displayName", userVmSearchBuilder.entity().getDisplayName(), Op.LIKE); + userVmSearchBuilder.and("stateEQ", userVmSearchBuilder.entity().getState(), Op.EQ); + userVmSearchBuilder.and("stateNEQ", userVmSearchBuilder.entity().getState(), Op.NEQ); + userVmSearchBuilder.and("stateNIN", userVmSearchBuilder.entity().getState(), Op.NIN); + + if (hostId != null) { + userVmSearchBuilder.and("hostId", userVmSearchBuilder.entity().getHostId(), Op.EQ); + } + + if (zoneId != null) { + userVmSearchBuilder.and("dataCenterId", userVmSearchBuilder.entity().getDataCenterId(), Op.EQ); } if (templateId != null) { - sc.setParameters("templateId", templateId); + userVmSearchBuilder.and("templateId", userVmSearchBuilder.entity().getTemplateId(), Op.EQ); + } + + if (hypervisor != null) { + userVmSearchBuilder.and("hypervisorType", userVmSearchBuilder.entity().getHypervisorType(), Op.EQ); + } + + if (vmHostName != null) { + userVmSearchBuilder.and("name", userVmSearchBuilder.entity().getHostName(), Op.EQ); + } + + if (serviceOfferingId != null) { + userVmSearchBuilder.and("serviceOfferingId", userVmSearchBuilder.entity().getServiceOfferingId(), Op.EQ); + } + if (display != null) { + userVmSearchBuilder.and("display", userVmSearchBuilder.entity().isDisplayVm(), Op.EQ); + } + + if (!isRootAdmin) { + userVmSearchBuilder.and("displayVm", userVmSearchBuilder.entity().isDisplayVm(), Op.EQ); + } + + if (isHaEnabled != null) { + userVmSearchBuilder.and("haEnabled", userVmSearchBuilder.entity().isHaEnabled(), Op.EQ); } if (isoId != null) { - sc.setParameters("isoId", isoId); + userVmSearchBuilder.and("isoId", userVmSearchBuilder.entity().getIsoId(), Op.EQ); } if (userId != null) { - sc.setParameters("userId", userId); + userVmSearchBuilder.and("userId", userVmSearchBuilder.entity().getUserId(), Op.EQ); } - if (networkId != null) { - sc.setParameters("networkId", networkId); + if (podId != null) { + userVmSearchBuilder.and("podId", userVmSearchBuilder.entity().getPodIdToDeployIn(), Op.EQ); } - if (vpcId != null && networkId == null) { - sc.setParameters("vpcId", vpcId); + if (networkId != null || vpcId != null) { + SearchBuilder nicSearch = nicDao.createSearchBuilder(); + nicSearch.and("networkId", nicSearch.entity().getNetworkId(), Op.EQ); + if (vpcId != null) { + SearchBuilder networkSearch = networkDao.createSearchBuilder(); + networkSearch.and("vpcId", networkSearch.entity().getVpcId(), Op.EQ); + nicSearch.join("vpc", networkSearch, networkSearch.entity().getId(), nicSearch.entity().getNetworkId(), JoinBuilder.JoinType.INNER); + } + userVmSearchBuilder.join("nic", nicSearch, nicSearch.entity().getInstanceId(), userVmSearchBuilder.entity().getId(), JoinBuilder.JoinType.INNER); } - if (name != null) { - sc.setParameters("name", name); + if (clusterId != null) { + userVmSearchBuilder.and().op("hostIdIn", userVmSearchBuilder.entity().getHostId(), Op.IN); + userVmSearchBuilder.or().op("lastHostIdIn", userVmSearchBuilder.entity().getLastHostId(), Op.IN); + userVmSearchBuilder.and(userVmSearchBuilder.entity().getState(), Op.EQ).values(VirtualMachine.State.Stopped); + userVmSearchBuilder.cp().cp(); + } + + if (groupId != null && groupId != -1) { + SearchBuilder instanceGroupSearch = instanceGroupVMMapDao.createSearchBuilder(); + instanceGroupSearch.and("groupId", instanceGroupSearch.entity().getGroupId(), Op.EQ); + userVmSearchBuilder.join("instanceGroup", instanceGroupSearch, instanceGroupSearch.entity().getInstanceId(), userVmSearchBuilder.entity().getId(), JoinBuilder.JoinType.INNER); + } + + if (affinityGroupId != null && affinityGroupId != -1) { + SearchBuilder affinityGroupSearch = affinityGroupVMMapDao.createSearchBuilder(); + affinityGroupSearch.and("affinityGroupId", affinityGroupSearch.entity().getAffinityGroupId(), Op.EQ); + userVmSearchBuilder.join("affinityGroup", affinityGroupSearch, affinityGroupSearch.entity().getInstanceId(), userVmSearchBuilder.entity().getId(), JoinBuilder.JoinType.INNER); + } + + if (securityGroupId != null && securityGroupId != -1) { + SearchBuilder securityGroupSearch = securityGroupVMMapDao.createSearchBuilder(); + securityGroupSearch.and("securityGroupId", securityGroupSearch.entity().getSecurityGroupId(), Op.EQ); + userVmSearchBuilder.join("securityGroup", securityGroupSearch, securityGroupSearch.entity().getInstanceId(), userVmSearchBuilder.entity().getId(), JoinBuilder.JoinType.INNER); + } + + if (storageId != null) { + SearchBuilder volumeSearch = volumeDao.createSearchBuilder(); + if (pool.getPoolType().equals(Storage.StoragePoolType.DatastoreCluster)) { + volumeSearch.and("storagePoolId", volumeSearch.entity().getPoolId(), Op.IN); + } else { + volumeSearch.and("storagePoolId", volumeSearch.entity().getPoolId(), Op.EQ); + } + userVmSearchBuilder.join("volume", volumeSearch, volumeSearch.entity().getInstanceId(), userVmSearchBuilder.entity().getId(), JoinBuilder.JoinType.INNER); + } + + if (tags != null && !tags.isEmpty()) { + SearchBuilder resourceTagSearch = resourceTagDao.createSearchBuilder(); + resourceTagSearch.and("resourceType", resourceTagSearch.entity().getResourceType(), Op.EQ); + resourceTagSearch.and().op(); + for (int count = 0; count < tags.size(); count++) { + if (count == 0) { + resourceTagSearch.op("tagKey" + String.valueOf(count), resourceTagSearch.entity().getKey(), Op.EQ); + } else { + resourceTagSearch.or().op("tagKey" + String.valueOf(count), resourceTagSearch.entity().getKey(), Op.EQ); + } + resourceTagSearch.and("tagValue" + String.valueOf(count), resourceTagSearch.entity().getValue(), Op.EQ); + resourceTagSearch.cp(); + } + resourceTagSearch.cp(); + + userVmSearchBuilder.join("tags", resourceTagSearch, resourceTagSearch.entity().getResourceId(), userVmSearchBuilder.entity().getId(), JoinBuilder.JoinType.INNER); + } + + if (keyPairName != null) { + SearchBuilder vmDetailSearchKeys = userVmDetailsDao.createSearchBuilder(); + SearchBuilder vmDetailSearchVmIds = userVmDetailsDao.createSearchBuilder(); + vmDetailSearchKeys.and(vmDetailSearchKeys.entity().getName(), Op.EQ).values(SSH_PUBLIC_KEY); + + SearchBuilder sshKeyPairSearch = sshKeyPairDao.createSearchBuilder(); + sshKeyPairSearch.and("keyPairName", sshKeyPairSearch.entity().getName(), Op.EQ); + + sshKeyPairSearch.join("keyPairToDetailValueJoin", vmDetailSearchKeys, vmDetailSearchKeys.entity().getValue(), sshKeyPairSearch.entity().getPublicKey(), JoinBuilder.JoinType.INNER); + userVmSearchBuilder.join("userVmToDetailJoin", vmDetailSearchVmIds, vmDetailSearchVmIds.entity().getResourceId(), userVmSearchBuilder.entity().getId(), JoinBuilder.JoinType.INNER); + userVmSearchBuilder.join("userVmToKeyPairJoin", sshKeyPairSearch, sshKeyPairSearch.entity().getAccountId(), userVmSearchBuilder.entity().getAccountId(), JoinBuilder.JoinType.INNER); + } + + if (keyword != null) { + userVmSearchBuilder.and().op("keywordDisplayName", userVmSearchBuilder.entity().getDisplayName(), Op.LIKE); + userVmSearchBuilder.or("keywordName", userVmSearchBuilder.entity().getHostName(), Op.LIKE); + userVmSearchBuilder.or("keywordState", userVmSearchBuilder.entity().getState(), Op.EQ); + if (isRootAdmin) { + userVmSearchBuilder.or("keywordInstanceName", userVmSearchBuilder.entity().getInstanceName(), Op.LIKE ); + } + userVmSearchBuilder.cp(); + } + + if (backupOfferingId != null) { + SearchBuilder backupOfferingSearch = backupOfferingDao.createSearchBuilder(); + backupOfferingSearch.and("backupOfferingId", backupOfferingSearch.entity().getId(), Op.EQ); + userVmSearchBuilder.join("backupOffering", backupOfferingSearch, backupOfferingSearch.entity().getId(), userVmSearchBuilder.entity().getBackupOfferingId(), JoinBuilder.JoinType.INNER); + } + + if (autoScaleVmGroupId != null) { + SearchBuilder autoScaleMapSearch = autoScaleVmGroupVmMapDao.createSearchBuilder(); + autoScaleMapSearch.and("autoScaleVmGroupId", autoScaleMapSearch.entity().getVmGroupId(), Op.EQ); + userVmSearchBuilder.join("autoScaleVmGroup", autoScaleMapSearch, autoScaleMapSearch.entity().getInstanceId(), userVmSearchBuilder.entity().getId(), JoinBuilder.JoinType.INNER); + } + + SearchCriteria userVmSearchCriteria = userVmSearchBuilder.create(); + accountMgr.buildACLSearchCriteria(userVmSearchCriteria, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); + + if (serviceOfferingId != null) { + userVmSearchCriteria.setParameters("serviceOfferingId", serviceOfferingId); } if (state != null) { if (state.equalsIgnoreCase("present")) { - sc.setParameters("stateNIN", "Destroyed", "Expunging"); + userVmSearchCriteria.setParameters("stateNIN", "Destroyed", "Expunging"); } else { - sc.setParameters("stateEQ", state); + userVmSearchCriteria.setParameters("stateEQ", state); } } if (hypervisor != null) { - sc.setParameters("hypervisorType", hypervisor); + userVmSearchCriteria.setParameters("hypervisorType", hypervisor); } // Don't show Destroyed and Expunging vms to the end user if the AllowUserViewDestroyedVM flag is not set. if (!isAdmin && !AllowUserViewDestroyedVM.valueIn(caller.getAccountId())) { - sc.setParameters("stateNIN", "Destroyed", "Expunging"); + userVmSearchCriteria.setParameters("stateNIN", "Destroyed", "Expunging"); } if (zoneId != null) { - sc.setParameters("dataCenterId", zoneId); + userVmSearchCriteria.setParameters("dataCenterId", zoneId); } - if (affinityGroupId != null) { - sc.setParameters("affinityGroupId", affinityGroupId); + if (templateId != null) { + userVmSearchCriteria.setParameters("templateId", templateId); + } + + if (display != null) { + userVmSearchCriteria.setParameters("display", display); + } + + if (isHaEnabled != null) { + userVmSearchCriteria.setParameters("haEnabled", isHaEnabled); + } + + if (isoId != null) { + userVmSearchCriteria.setParameters("isoId", isoId); + } + + if (ids != null && !ids.isEmpty()) { + userVmSearchCriteria.setParameters("idIN", ids.toArray()); + } + + if (vmHostName != null) { + userVmSearchCriteria.setParameters("name", vmHostName); + } + + if (groupId != null && groupId != -1) { + userVmSearchCriteria.setJoinParameters("instanceGroup","groupId", groupId); + } + + if (affinityGroupId != null && affinityGroupId != -1) { + userVmSearchCriteria.setJoinParameters("affinityGroup", "affinityGroupId", affinityGroupId); + } + + if (securityGroupId != null && securityGroupId != -1) { + userVmSearchCriteria.setJoinParameters("securityGroup","securityGroupId", securityGroupId); + } + + if (keyword != null) { + String keywordMatch = "%" + keyword + "%"; + userVmSearchCriteria.setParameters("keywordDisplayName", keywordMatch); + userVmSearchCriteria.setParameters("keywordName", keywordMatch); + userVmSearchCriteria.setParameters("keywordState", keyword); + if (isRootAdmin) { + userVmSearchCriteria.setParameters("keywordInstanceName", keywordMatch); + } + } + + if (tags != null && !tags.isEmpty()) { + int count = 0; + userVmSearchCriteria.setJoinParameters("tags","resourceType", ResourceObjectType.UserVm); + for (Map.Entry entry : tags.entrySet()) { + userVmSearchCriteria.setJoinParameters("tags", "tagKey" + String.valueOf(count), entry.getKey()); + userVmSearchCriteria.setJoinParameters("tags", "tagValue" + String.valueOf(count), entry.getValue()); + count++; + } } if (keyPairName != null) { - sc.setParameters("keyPairName", keyPairName); + userVmSearchCriteria.setJoinParameters("userVmToKeyPairJoin", "keyPairName", keyPairName); } - if (_accountMgr.isRootAdmin(caller.getId())) { - if (pod != null) { - sc.setParameters("podId", pod); + if (networkId != null) { + userVmSearchCriteria.setJoinParameters("nic", "networkId", networkId); + } + if (vpcId != null) { + userVmSearchCriteria.getJoin("nic").setJoinParameters("vpc", "vpcId", vpcId); + } + + if (userId != null) { + userVmSearchCriteria.setParameters("userId", userId); + } + + if (backupOfferingId != null) { + userVmSearchCriteria.setJoinParameters("backupOffering", "backupOfferingId", backupOfferingId); + } + + if (autoScaleVmGroupId != null) { + userVmSearchCriteria.setJoinParameters("autoScaleVmGroup", "autoScaleVmGroupId", autoScaleVmGroupId); + } + + if (isRootAdmin) { + if (podId != null) { + userVmSearchCriteria.setParameters("podId", podId); if (state == null) { - sc.setParameters("stateNEQ", "Destroyed"); + userVmSearchCriteria.setParameters("stateNEQ", "Destroyed"); } } if (clusterId != null) { - sc.setParameters("clusterId", clusterId); - List hosts = _hostJoinDao.findByClusterId((Long)clusterId, Host.Type.Routing); + List hosts = hostJoinDao.findByClusterId(clusterId, Host.Type.Routing); + if (CollectionUtils.isEmpty(hosts)) { + // cluster has no hosts, so we cannot find VMs, cancel search. + return new Pair<>(new ArrayList<>(), 0); + } List hostIds = hosts.stream().map(HostJoinVO::getId).collect(Collectors.toList()); - sc.setParameters("clusterHostId", hostIds.toArray()); - sc.setParameters("clusterLastHostId", hostIds.toArray()); + userVmSearchCriteria.setParameters("hostIdIn", hostIds.toArray()); + userVmSearchCriteria.setParameters("lastHostIdIn", hostIds.toArray()); } if (hostId != null) { - sc.setParameters("hostIdEQ", hostId); + userVmSearchCriteria.setParameters("hostId", hostId); } - if (storageId != null) { - StoragePoolVO poolVO = _storagePoolDao.findById((Long) storageId); - if (poolVO.getPoolType() == Storage.StoragePoolType.DatastoreCluster) { - List childDatastores = _storagePoolDao.listChildStoragePoolsInDatastoreCluster((Long) storageId); + if (storageId != null && pool != null) { + if (pool.getPoolType().equals(Storage.StoragePoolType.DatastoreCluster)) { + List childDatastores = storagePoolDao.listChildStoragePoolsInDatastoreCluster(storageId); List childDatastoreIds = childDatastores.stream().map(mo -> mo.getId()).collect(Collectors.toList()); - sc.setParameters("poolId", childDatastoreIds.toArray()); + userVmSearchCriteria.setJoinParameters("volume", "storagePoolId", childDatastoreIds.toArray()); } else { - sc.setParameters("poolId", storageId); + userVmSearchCriteria.setJoinParameters("volume", "storagePoolId", storageId); } } + } else { + userVmSearchCriteria.setParameters("displayVm", 1); } - if (!isRootAdmin) { - sc.setParameters("displayVm", 1); - } - // search vm details by ids - Pair, Integer> uniqueVmPair = _userVmJoinDao.searchAndDistinctCount(sc, searchFilter); + Pair, Integer> uniqueVmPair = userVmDao.searchAndDistinctCount(userVmSearchCriteria, searchFilter, new String[]{"vm_instance.id"}); Integer count = uniqueVmPair.second(); - if (count.intValue() == 0) { - // handle empty result cases - return uniqueVmPair; - } - List uniqueVms = uniqueVmPair.first(); - Long[] vmIds = new Long[uniqueVms.size()]; - int i = 0; - for (UserVmJoinVO v : uniqueVms) { - vmIds[i++] = v.getId(); - } - List vms = _userVmJoinDao.searchByIds(vmIds); - return new Pair<>(vms, count); + + List vmIds = uniqueVmPair.first().stream().map(VMInstanceVO::getId).collect(Collectors.toList()); + return new Pair<>(vmIds, count); } @Override @@ -1363,16 +1485,16 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q Map tags = cmd.getTags(); if (instanceId != null) { - UserVmVO userVM = _userVmDao.findById(instanceId); + UserVmVO userVM = userVmDao.findById(instanceId); if (userVM == null) { throw new InvalidParameterValueException("Unable to list network groups for virtual machine instance " + instanceId + "; instance not found."); } - _accountMgr.checkAccess(caller, null, true, userVM); + accountMgr.checkAccess(caller, null, true, userVM); return listSecurityGroupRulesByVM(instanceId.longValue(), cmd.getStartIndex(), cmd.getPageSizeVal()); } Ternary domainIdRecursiveListProject = new Ternary(cmd.getDomainId(), cmd.isRecursive(), null); - _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, cmd.listAll(), false); + accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, cmd.listAll(), false); Long domainId = domainIdRecursiveListProject.first(); Boolean isRecursive = domainIdRecursiveListProject.second(); ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); @@ -1381,13 +1503,13 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q SearchBuilder sb = _securityGroupJoinDao.createSearchBuilder(); sb.select(null, Func.DISTINCT, sb.entity().getId()); // select distinct // ids - _accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); + accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); sb.and("name", sb.entity().getName(), SearchCriteria.Op.EQ); SearchCriteria sc = sb.create(); - _accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); + accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); if (id != null) { sc.setParameters("id", id); @@ -1435,7 +1557,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q private Pair, Integer> listSecurityGroupRulesByVM(long vmId, long pageInd, long pageSize) { Filter sf = new Filter(SecurityGroupVMMapVO.class, null, true, pageInd, pageSize); - Pair, Integer> sgVmMappingPair = _securityGroupVMMapDao.listByInstanceId(vmId, sf); + Pair, Integer> sgVmMappingPair = securityGroupVMMapDao.listByInstanceId(vmId, sf); Integer count = sgVmMappingPair.second(); if (count.intValue() == 0) { // handle empty result cases @@ -1499,7 +1621,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q List permittedAccounts = new ArrayList(); Ternary domainIdRecursiveListProject = new Ternary(cmd.getDomainId(), cmd.isRecursive(), null); - _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, cmd.listAll(), false); + accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, cmd.listAll(), false); Long domainId = domainIdRecursiveListProject.first(); Boolean isRecursive = domainIdRecursiveListProject.second(); ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); @@ -1511,7 +1633,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q // number of // records with // pagination - _accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); + accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); sb.and("name", sb.entity().getInstanceName(), SearchCriteria.Op.EQ); sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); @@ -1559,7 +1681,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q } SearchCriteria sc = sb.create(); - _accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); + accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); if (keyword != null) { SearchCriteria ssc = _routerJoinDao.createSearchCriteria(); @@ -1674,17 +1796,17 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q sb.select(null, Func.DISTINCT, sb.entity().getId()); // select distinct // ids - if (_accountMgr.isAdmin(caller.getId())) { + if (accountMgr.isAdmin(caller.getId())) { if (domainId != null) { DomainVO domain = _domainDao.findById(domainId); if (domain == null) { throw new InvalidParameterValueException("Domain id=" + domainId + " doesn't exist in the system"); } - _accountMgr.checkAccess(caller, domain); + accountMgr.checkAccess(caller, domain); if (accountName != null) { - Account owner = _accountMgr.getActiveAccountByName(accountName, domainId); + Account owner = accountMgr.getActiveAccountByName(accountName, domainId); if (owner == null) { throw new InvalidParameterValueException("Unable to find account " + accountName + " in domain " + domainId); } @@ -1725,10 +1847,10 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q userId = user.getId(); } - if (domainId == null && accountId == null && (_accountMgr.isNormalUser(caller.getId()) || !listAll)) { + if (domainId == null && accountId == null && (accountMgr.isNormalUser(caller.getId()) || !listAll)) { accountId = caller.getId(); userId = user.getId(); - } else if (_accountMgr.isDomainAdmin(caller.getId()) || (isRecursive && !listAll)) { + } else if (accountMgr.isDomainAdmin(caller.getId()) || (isRecursive && !listAll)) { DomainVO domain = _domainDao.findById(caller.getDomainId()); path = domain.getPath(); } @@ -1839,14 +1961,14 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q List permittedAccounts = new ArrayList(); Ternary domainIdRecursiveListProject = new Ternary(domainId, isRecursive, null); - _accountMgr.buildACLSearchParameters(caller, id, accountName, projectId, permittedAccounts, domainIdRecursiveListProject, listAll, true); + accountMgr.buildACLSearchParameters(caller, id, accountName, projectId, permittedAccounts, domainIdRecursiveListProject, listAll, true); domainId = domainIdRecursiveListProject.first(); isRecursive = domainIdRecursiveListProject.second(); ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); Filter searchFilter = new Filter(ProjectInvitationJoinVO.class, "id", true, startIndex, pageSizeVal); SearchBuilder sb = _projectInvitationJoinDao.createSearchBuilder(); - _accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); + accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); ProjectInvitation invitation = projectInvitationDao.findByUserIdProjectId(callingUser.getId(), callingUser.getAccountId(), projectId == null ? -1 : projectId); sb.and("projectId", sb.entity().getProjectId(), SearchCriteria.Op.EQ); sb.and("state", sb.entity().getState(), SearchCriteria.Op.EQ); @@ -1854,7 +1976,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); SearchCriteria sc = sb.create(); - _accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); + accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); if (projectId != null) { sc.setParameters("projectId", projectId); @@ -1917,7 +2039,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q // verify permissions - only accounts belonging to the project can list // project's account - if (!_accountMgr.isAdmin(caller.getId()) && _projectAccountDao.findByProjectIdUserId(projectId, callingUser.getAccountId(), callingUser.getId()) == null && + if (!accountMgr.isAdmin(caller.getId()) && _projectAccountDao.findByProjectIdUserId(projectId, callingUser.getAccountId(), callingUser.getId()) == null && _projectAccountDao.findByProjectIdAccountId(projectId, caller.getAccountId()) == null) { throw new PermissionDeniedException("Account " + caller + " is not authorized to list users of the project id=" + projectId); } @@ -1973,7 +2095,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q public Pair, Integer> searchForServersInternal(ListHostsCmd cmd) { - Long zoneId = _accountMgr.checkAccessAndSpecifyAuthority(CallContext.current().getCallingAccount(), cmd.getZoneId()); + Long zoneId = accountMgr.checkAccessAndSpecifyAuthority(CallContext.current().getCallingAccount(), cmd.getZoneId()); Object name = cmd.getHostName(); Object type = cmd.getType(); Object state = cmd.getState(); @@ -1991,7 +2113,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q Filter searchFilter = new Filter(HostJoinVO.class, "id", Boolean.TRUE, startIndex, pageSize); - SearchBuilder sb = _hostJoinDao.createSearchBuilder(); + SearchBuilder sb = hostJoinDao.createSearchBuilder(); sb.select(null, Func.DISTINCT, sb.entity().getId()); // select distinct // ids sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); @@ -2021,7 +2143,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q SearchCriteria sc = sb.create(); if (keyword != null) { - SearchCriteria ssc = _hostJoinDao.createSearchCriteria(); + SearchCriteria ssc = hostJoinDao.createSearchCriteria(); ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("status", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("type", SearchCriteria.Op.LIKE, "%" + keyword + "%"); @@ -2072,7 +2194,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q sc.setParameters("hypervisor_type", hypervisorType); } // search host details by ids - Pair, Integer> uniqueHostPair = _hostJoinDao.searchAndCount(sc, searchFilter); + Pair, Integer> uniqueHostPair = hostJoinDao.searchAndCount(sc, searchFilter); Integer count = uniqueHostPair.second(); if (count.intValue() == 0) { // handle empty result cases @@ -2084,7 +2206,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q for (HostJoinVO v : uniqueHosts) { hostIds[i++] = v.getId(); } - List hosts = _hostJoinDao.searchByIds(hostIds); + List hosts = hostJoinDao.searchByIds(hostIds); return new Pair, Integer>(hosts, count); } @@ -2101,7 +2223,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q ResponseView respView = cmd.getResponseView(); Account account = CallContext.current().getCallingAccount(); - if (_accountMgr.isRootAdmin(account.getAccountId())) { + if (accountMgr.isRootAdmin(account.getAccountId())) { respView = ResponseView.Full; } @@ -2160,7 +2282,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q List ids = getIdsListFromCmd(cmd.getId(), cmd.getIds()); Ternary domainIdRecursiveListProject = new Ternary(cmd.getDomainId(), cmd.isRecursive(), null); - _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, cmd.listAll(), false); + accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, cmd.listAll(), false); Long domainId = domainIdRecursiveListProject.first(); Boolean isRecursive = domainIdRecursiveListProject.second(); ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); @@ -2175,7 +2297,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q // number of // records with // pagination - _accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); + accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); sb.and("name", sb.entity().getName(), SearchCriteria.Op.EQ); sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); @@ -2186,7 +2308,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q sb.and("dataCenterId", sb.entity().getDataCenterId(), SearchCriteria.Op.EQ); sb.and("podId", sb.entity().getPodId(), SearchCriteria.Op.EQ); if (storageId != null) { - StoragePoolVO poolVO = _storagePoolDao.findByUuid(storageId); + StoragePoolVO poolVO = storagePoolDao.findByUuid(storageId); if (poolVO.getPoolType() == Storage.StoragePoolType.DatastoreCluster) { sb.and("storageId", sb.entity().getPoolUuid(), SearchCriteria.Op.IN); } else { @@ -2210,7 +2332,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q // now set the SC criteria... SearchCriteria sc = sb.create(); - _accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); + accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); if (keyword != null) { SearchCriteria ssc = _volumeJoinDao.createSearchCriteria(); @@ -2269,9 +2391,9 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q } if (storageId != null) { - StoragePoolVO poolVO = _storagePoolDao.findByUuid(storageId); + StoragePoolVO poolVO = storagePoolDao.findByUuid(storageId); if (poolVO.getPoolType() == Storage.StoragePoolType.DatastoreCluster) { - List childDatastores = _storagePoolDao.listChildStoragePoolsInDatastoreCluster(poolVO.getId()); + List childDatastores = storagePoolDao.listChildStoragePoolsInDatastoreCluster(poolVO.getId()); List childDatastoreIds = childDatastores.stream().map(mo -> mo.getUuid()).collect(Collectors.toList()); sc.setParameters("storageId", childDatastoreIds.toArray()); } else { @@ -2285,7 +2407,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q if (state != null) { sc.setParameters("state", state); - } else if (!_accountMgr.isAdmin(caller.getId())) { + } else if (!accountMgr.isAdmin(caller.getId())) { sc.setParameters("stateNEQ", Volume.State.Expunged); } @@ -2307,7 +2429,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q } private boolean shouldListSystemVms(ListVolumesCmd cmd, Long callerId) { - return Boolean.TRUE.equals(cmd.getListSystemVms()) && _accountMgr.isRootAdmin(callerId); + return Boolean.TRUE.equals(cmd.getListSystemVms()) && accountMgr.isRootAdmin(callerId); } @Override @@ -2337,7 +2459,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q if (domain == null) { throw new InvalidParameterValueException("Domain id=" + domainId + " doesn't exist"); } - _accountMgr.checkAccess(caller, domain); + accountMgr.checkAccess(caller, domain); } else { if (caller.getType() != Account.Type.ADMIN) { domainId = caller.getDomainId(); @@ -2414,7 +2536,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q String accountName = cmd.getSearchName(); boolean isRecursive = cmd.isRecursive(); boolean listAll = cmd.listAll(); - boolean callerIsAdmin = _accountMgr.isAdmin(caller.getId()); + boolean callerIsAdmin = accountMgr.isAdmin(caller.getId()); Account account; Domain domain = null; @@ -2426,7 +2548,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q throw new InvalidParameterValueException("Domain id=" + domainId + " doesn't exist"); } // ... and check access rights. - _accountMgr.checkAccess(caller, domain); + accountMgr.checkAccess(caller, domain); } // if no "id" specified... @@ -2449,7 +2571,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q if (account == null || account.getId() == Account.ACCOUNT_ID_SYSTEM) { throw new InvalidParameterValueException("Unable to find account by name " + accountName + " in domain " + domainId); } - _accountMgr.checkAccess(caller, null, true, account); + accountMgr.checkAccess(caller, null, true, account); } else { // if they specified an "id"... if (domainId == null) { @@ -2460,7 +2582,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q if (account == null || account.getId() == Account.ACCOUNT_ID_SYSTEM) { throw new InvalidParameterValueException("Unable to find account by id " + accountId + (domainId == null ? "" : " in domain " + domainId)); } - _accountMgr.checkAccess(caller, null, true, account); + accountMgr.checkAccess(caller, null, true, account); } Filter searchFilter = new Filter(AccountJoinVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal()); @@ -2556,7 +2678,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q List permittedAccounts = new ArrayList(); Ternary domainIdRecursiveListProject = new Ternary(cmd.getDomainId(), cmd.isRecursive(), null); - _accountMgr.buildACLSearchParameters(caller, null, cmd.getAccountName(), null, permittedAccounts, domainIdRecursiveListProject, cmd.listAll(), false); + accountMgr.buildACLSearchParameters(caller, null, cmd.getAccountName(), null, permittedAccounts, domainIdRecursiveListProject, cmd.listAll(), false); Long domainId = domainIdRecursiveListProject.first(); Boolean isRecursive = domainIdRecursiveListProject.second(); ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); @@ -2640,7 +2762,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q Map caps = driver.getCapabilities(); if (Storage.StoragePoolType.NetworkFilesystem.toString().equals(poolResponse.getType()) && HypervisorType.VMware.toString().equals(poolResponse.getHypervisor())) { - StoragePoolVO pool = _storagePoolDao.findPoolByUUID(poolResponse.getId()); + StoragePoolVO pool = storagePoolDao.findPoolByUUID(poolResponse.getId()); StoragePoolDetailVO detail = _storagePoolDetailsDao.findDetail(pool.getId(), Storage.Capability.HARDWARE_ACCELERATION.toString()); if (detail != null) { caps.put(Storage.Capability.HARDWARE_ACCELERATION.toString(), detail.getValue()); @@ -2659,7 +2781,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q ScopeType scopeType = ScopeType.validateAndGetScopeType(cmd.getScope()); StoragePoolStatus status = StoragePoolStatus.validateAndGetStatus(cmd.getStatus()); - Long zoneId = _accountMgr.checkAccessAndSpecifyAuthority(CallContext.current().getCallingAccount(), cmd.getZoneId()); + Long zoneId = accountMgr.checkAccessAndSpecifyAuthority(CallContext.current().getCallingAccount(), cmd.getZoneId()); Long id = cmd.getId(); String name = cmd.getStoragePoolName(); String path = cmd.getPath(); @@ -2667,6 +2789,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q Long cluster = cmd.getClusterId(); String address = cmd.getIpAddress(); String keyword = cmd.getKeyword(); + Long startIndex = cmd.getStartIndex(); Long pageSize = cmd.getPageSizeVal(); @@ -2786,7 +2909,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q private Pair, Integer> searchForImageStoresInternal(ListImageStoresCmd cmd) { - Long zoneId = _accountMgr.checkAccessAndSpecifyAuthority(CallContext.current().getCallingAccount(), cmd.getZoneId()); + Long zoneId = accountMgr.checkAccessAndSpecifyAuthority(CallContext.current().getCallingAccount(), cmd.getZoneId()); Object id = cmd.getId(); Object name = cmd.getStoreName(); String provider = cmd.getProvider(); @@ -2870,7 +2993,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q private Pair, Integer> searchForCacheStoresInternal(ListSecondaryStagingStoresCmd cmd) { - Long zoneId = _accountMgr.checkAccessAndSpecifyAuthority(CallContext.current().getCallingAccount(), cmd.getZoneId()); + Long zoneId = accountMgr.checkAccessAndSpecifyAuthority(CallContext.current().getCallingAccount(), cmd.getZoneId()); Object id = cmd.getId(); Object name = cmd.getStoreName(); String provider = cmd.getProvider(); @@ -2967,7 +3090,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q Object id = cmd.getId(); Object keyword = cmd.getKeyword(); Long domainId = cmd.getDomainId(); - Boolean isRootAdmin = _accountMgr.isRootAdmin(account.getAccountId()); + Boolean isRootAdmin = accountMgr.isRootAdmin(account.getAccountId()); Boolean isRecursive = cmd.isRecursive(); Long zoneId = cmd.getZoneId(); Long volumeId = cmd.getVolumeId(); @@ -2977,7 +3100,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q // if a domainId is provided, we just return the disk offering // associated with this domain if (domainId != null) { - if (_accountMgr.isRootAdmin(account.getId()) || isPermissible(account.getDomainId(), domainId)) { + if (accountMgr.isRootAdmin(account.getId()) || isPermissible(account.getDomainId(), domainId)) { // check if the user's domain == do's domain || user's domain is // a child of so's domain for non-root users sc.addAnd("domainId", Op.FIND_IN_SET, String.valueOf(domainId)); @@ -2992,7 +3115,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q // For non-root users, only return all offerings for the user's domain, // and everything above till root - if ((_accountMgr.isNormalUser(account.getId()) || _accountMgr.isDomainAdmin(account.getId())) || account.getType() == Account.Type.RESOURCE_DOMAIN_ADMIN) { + if ((accountMgr.isNormalUser(account.getId()) || accountMgr.isDomainAdmin(account.getId())) || account.getType() == Account.Type.RESOURCE_DOMAIN_ADMIN) { if (isRecursive) { // domain + all sub-domains if (account.getType() == Account.Type.NORMAL) { throw new InvalidParameterValueException("Only ROOT admins and Domain admins can list disk offerings with isrecursive=true"); @@ -3154,14 +3277,14 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q Boolean encryptRoot = cmd.getEncryptRoot(); SearchCriteria sc = _srvOfferingJoinDao.createSearchCriteria(); - if (!_accountMgr.isRootAdmin(caller.getId()) && isSystem) { + if (!accountMgr.isRootAdmin(caller.getId()) && isSystem) { throw new InvalidParameterValueException("Only ROOT admins can access system's offering"); } // Keeping this logic consistent with domain specific zones // if a domainId is provided, we just return the so associated with this // domain - if (domainId != null && !_accountMgr.isRootAdmin(caller.getId())) { + if (domainId != null && !accountMgr.isRootAdmin(caller.getId())) { // check if the user's domain == so's domain || user's domain is a // child of so's domain if (!isPermissible(caller.getDomainId(), domainId)) { @@ -3177,7 +3300,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q throw ex; } - _accountMgr.checkAccess(caller, null, true, vmInstance); + accountMgr.checkAccess(caller, null, true, vmInstance); currentVmOffering = _srvOfferingDao.findByIdIncludingRemoved(vmInstance.getId(), vmInstance.getServiceOfferingId()); if (! currentVmOffering.isDynamic()) { @@ -3202,8 +3325,8 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q Integer vmMemory = currentVmOffering.getRamSize(); Integer vmSpeed = currentVmOffering.getSpeed(); if ((vmCpu == null || vmMemory == null || vmSpeed == null) && VirtualMachine.Type.User.equals(vmInstance.getType())) { - UserVmVO userVmVO = _userVmDao.findById(vmId); - _userVmDao.loadDetails(userVmVO); + UserVmVO userVmVO = userVmDao.findById(vmId); + userVmDao.loadDetails(userVmVO); Map details = userVmVO.getDetails(); vmCpu = NumbersUtil.parseInt(details.get(ApiConstants.CPU_NUMBER), 0); if (vmSpeed == null) { @@ -3225,7 +3348,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q } // boolean includePublicOfferings = false; - if ((_accountMgr.isNormalUser(caller.getId()) || _accountMgr.isDomainAdmin(caller.getId())) || caller.getType() == Account.Type.RESOURCE_DOMAIN_ADMIN) { + if ((accountMgr.isNormalUser(caller.getId()) || accountMgr.isDomainAdmin(caller.getId())) || caller.getType() == Account.Type.RESOURCE_DOMAIN_ADMIN) { // For non-root users. if (isSystem) { throw new InvalidParameterValueException("Only root admins can access system's offering"); @@ -3411,7 +3534,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q SearchBuilder sb = _dcJoinDao.createSearchBuilder(); if (resourceTags != null && !resourceTags.isEmpty()) { - SearchBuilder tagSearch = _resourceTagDao.createSearchBuilder(); + SearchBuilder tagSearch = resourceTagDao.createSearchBuilder(); for (int count = 0; count < resourceTags.size(); count++) { tagSearch.or().op("key" + String.valueOf(count), tagSearch.entity().getKey(), SearchCriteria.Op.EQ); tagSearch.and("value" + String.valueOf(count), tagSearch.entity().getValue(), SearchCriteria.Op.EQ); @@ -3455,7 +3578,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q // only list zones associated // with this domain, private zone sc.addAnd("domainId", SearchCriteria.Op.EQ, domainId); - if (_accountMgr.isNormalUser(account.getId())) { + if (accountMgr.isNormalUser(account.getId())) { // accountId == null (zones dedicated to a domain) or // accountId = caller SearchCriteria sdc = _dcJoinDao.createSearchCriteria(); @@ -3465,7 +3588,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q sc.addAnd("accountId", SearchCriteria.Op.SC, sdc); } - } else if (_accountMgr.isNormalUser(account.getId())) { + } else if (accountMgr.isNormalUser(account.getId())) { // it was decided to return all zones for the user's domain, and // everything above till root // list all zones belonging to this domain, and all of its @@ -3510,7 +3633,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q sdc.addAnd("id", SearchCriteria.Op.NIN, dedicatedZoneIds.toArray(new Object[dedicatedZoneIds.size()])); } - } else if (_accountMgr.isDomainAdmin(account.getId()) || account.getType() == Account.Type.RESOURCE_DOMAIN_ADMIN) { + } else if (accountMgr.isDomainAdmin(account.getId()) || account.getType() == Account.Type.RESOURCE_DOMAIN_ADMIN) { // it was decided to return all zones for the domain admin, and // everything above till root, as well as zones till the domain // leaf @@ -3658,11 +3781,11 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q List permittedAccountIds = new ArrayList(); Ternary domainIdRecursiveListProject = new Ternary(cmd.getDomainId(), cmd.isRecursive(), null); - _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccountIds, domainIdRecursiveListProject, listAll, false); + accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccountIds, domainIdRecursiveListProject, listAll, false); ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); List permittedAccounts = new ArrayList(); for (Long accountId : permittedAccountIds) { - permittedAccounts.add(_accountMgr.getAccount(accountId)); + permittedAccounts.add(accountMgr.getAccount(accountId)); } boolean showDomr = ((templateFilter != TemplateFilter.selfexecutable) && (templateFilter != TemplateFilter.featured)); @@ -3720,16 +3843,16 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q throw ex; } if (!template.isPublicTemplate() && caller.getType() == Account.Type.DOMAIN_ADMIN) { - Account template_acc = _accountMgr.getAccount(template.getAccountId()); + Account template_acc = accountMgr.getAccount(template.getAccountId()); DomainVO domain = _domainDao.findById(template_acc.getDomainId()); - _accountMgr.checkAccess(caller, domain); + accountMgr.checkAccess(caller, domain); } // if template is not public, perform permission check here else if (!template.isPublicTemplate() && caller.getType() != Account.Type.ADMIN) { - _accountMgr.checkAccess(caller, null, false, template); + accountMgr.checkAccess(caller, null, false, template); } else if (template.isPublicTemplate()) { - _accountMgr.checkAccess(caller, null, false, template); + accountMgr.checkAccess(caller, null, false, template); } // if templateId is specified, then we will just use the id to @@ -3782,7 +3905,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q } // get all child domain ID's - if (_accountMgr.isAdmin(account.getId()) || publicTemplates) { + if (accountMgr.isAdmin(account.getId()) || publicTemplates) { List allChildDomains = _domainDao.findAllChildren(domainTreeNode.getPath(), domainTreeNode.getId()); for (DomainVO childDomain : allChildDomains) { relatedDomainIds.add(childDomain.getId()); @@ -4056,13 +4179,14 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q listAll = true; } + List permittedAccountIds = new ArrayList<>(); Ternary domainIdRecursiveListProject = new Ternary<>(cmd.getDomainId(), cmd.isRecursive(), null); - _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccountIds, domainIdRecursiveListProject, listAll, false); + accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccountIds, domainIdRecursiveListProject, listAll, false); ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); List permittedAccounts = new ArrayList<>(); for (Long accountId : permittedAccountIds) { - permittedAccounts.add(_accountMgr.getAccount(accountId)); + permittedAccounts.add(accountMgr.getAccount(accountId)); } HypervisorType hypervisorType = HypervisorType.getType(cmd.getHypervisor()); @@ -4170,18 +4294,18 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q Account caller = CallContext.current().getCallingAccount(); if (vmId != null) { - UserVmVO userVM = _userVmDao.findById(vmId); + UserVmVO userVM = userVmDao.findById(vmId); if (userVM == null) { throw new InvalidParameterValueException("Unable to list affinity groups for virtual machine instance " + vmId + "; instance not found."); } - _accountMgr.checkAccess(caller, null, true, userVM); + accountMgr.checkAccess(caller, null, true, userVM); return listAffinityGroupsByVM(vmId.longValue(), startIndex, pageSize); } List permittedAccounts = new ArrayList(); Ternary ternary = new Ternary(domainId, isRecursive, null); - _accountMgr.buildACLSearchParameters(caller, affinityGroupId, accountName, projectId, permittedAccounts, ternary, listAll, false); + accountMgr.buildACLSearchParameters(caller, affinityGroupId, accountName, projectId, permittedAccounts, ternary, listAll, false); domainId = ternary.first(); isRecursive = ternary.second(); @@ -4568,7 +4692,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q List permittedAccountIds = new ArrayList<>(); Ternary domainIdRecursiveListProject = new Ternary(domainId, isRecursive, null); - _accountMgr.buildACLSearchParameters(caller, id, accountName, projectId, permittedAccountIds, domainIdRecursiveListProject, listAll, false); + accountMgr.buildACLSearchParameters(caller, id, accountName, projectId, permittedAccountIds, domainIdRecursiveListProject, listAll, false); ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); domainId = domainIdRecursiveListProject.first(); isRecursive = domainIdRecursiveListProject.second(); @@ -4576,7 +4700,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q if (volumeId != null) { VolumeVO volume = volumeDao.findById(volumeId); if (volume != null) { - _accountMgr.checkAccess(CallContext.current().getCallingAccount(), null, true, volume); + accountMgr.checkAccess(CallContext.current().getCallingAccount(), null, true, volume); } } @@ -4586,7 +4710,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q } else { sb.select(null, Func.DISTINCT, sb.entity().getSnapshotStorePair()); // select distinct (snapshotId, store_role, store_id) key } - _accountMgr.buildACLSearchBuilder(sb, domainId, isRecursive, permittedAccountIds, listProjectResourcesCriteria); + accountMgr.buildACLSearchBuilder(sb, domainId, isRecursive, permittedAccountIds, listProjectResourcesCriteria); sb.and("statusNEQ", sb.entity().getStatus(), SearchCriteria.Op.NEQ); //exclude those Destroyed snapshot, not showing on UI sb.and("volumeId", sb.entity().getVolumeId(), SearchCriteria.Op.EQ); sb.and("name", sb.entity().getName(), SearchCriteria.Op.EQ); @@ -4598,7 +4722,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q sb.and("locationType", sb.entity().getStoreRole(), SearchCriteria.Op.EQ); if (tags != null && !tags.isEmpty()) { - SearchBuilder tagSearch = _resourceTagDao.createSearchBuilder(); + SearchBuilder tagSearch = resourceTagDao.createSearchBuilder(); for (int count = 0; count < tags.size(); count++) { tagSearch.or().op("key" + String.valueOf(count), tagSearch.entity().getKey(), SearchCriteria.Op.EQ); tagSearch.and("value" + String.valueOf(count), tagSearch.entity().getValue(), SearchCriteria.Op.EQ); @@ -4610,7 +4734,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q } SearchCriteria sc = sb.create(); - _accountMgr.buildACLSearchCriteria(sc, domainId, isRecursive, permittedAccountIds, listProjectResourcesCriteria); + accountMgr.buildACLSearchCriteria(sc, domainId, isRecursive, permittedAccountIds, listProjectResourcesCriteria); sc.setParameters("statusNEQ", Snapshot.State.Destroyed);