From 1244fca367a6249bdb75b2f19c49196db2ca91cb Mon Sep 17 00:00:00 2001 From: Harikrishna Patnala Date: Sat, 1 Aug 2020 21:33:37 +0530 Subject: [PATCH] Handle listsystemvms cmd in case of datastore clusters --- .../com/cloud/api/query/QueryManagerImpl.java | 1 - .../cloud/server/ManagementServerImpl.java | 25 ++++++++++++++++--- 2 files changed, 21 insertions(+), 5 deletions(-) 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 850b2c64ca8..0fd7aa1398d 100644 --- a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java +++ b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java @@ -982,7 +982,6 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q if (storageId != null) { StoragePoolVO poolVO = _storagePoolDao.findById((Long) storageId); if (poolVO.getPoolType() == Storage.StoragePoolType.DatastoreCluster) { - List childDatastores = _storagePoolDao.listChildStoragePoolsInDatastoreCluster((Long) storageId); sb.and("poolId", sb.entity().getPoolId(), SearchCriteria.Op.IN); } else { sb.and("poolId", sb.entity().getPoolId(), SearchCriteria.Op.EQ); diff --git a/server/src/main/java/com/cloud/server/ManagementServerImpl.java b/server/src/main/java/com/cloud/server/ManagementServerImpl.java index bed1ec00030..f2eaeaf3f33 100644 --- a/server/src/main/java/com/cloud/server/ManagementServerImpl.java +++ b/server/src/main/java/com/cloud/server/ManagementServerImpl.java @@ -40,6 +40,7 @@ import javax.crypto.spec.SecretKeySpec; import javax.inject.Inject; import javax.naming.ConfigurationException; +import com.cloud.storage.Storage; import org.apache.cloudstack.acl.ControlledEntity; import org.apache.cloudstack.affinity.AffinityGroupProcessor; import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao; @@ -838,6 +839,8 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe private KeystoreManager _ksMgr; @Inject private DpdkHelper dpdkHelper; + @Inject + private PrimaryDataStoreDao _primaryDataStoreDao; private LockMasterListener _lockMasterListener; private final ScheduledExecutorService _eventExecutor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("EventChecker")); @@ -3323,9 +3326,16 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe sb.and("nulltype", sb.entity().getType(), SearchCriteria.Op.IN); if (storageId != null) { - final 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); + StoragePoolVO storagePool = _primaryDataStoreDao.findById(storageId); + if (storagePool.getPoolType() == Storage.StoragePoolType.DatastoreCluster) { + final SearchBuilder volumeSearch = _volumeDao.createSearchBuilder(); + volumeSearch.and("poolId", volumeSearch.entity().getPoolId(), SearchCriteria.Op.IN); + sb.join("volumeSearch", volumeSearch, sb.entity().getId(), volumeSearch.entity().getInstanceId(), JoinBuilder.JoinType.INNER); + } else { + final 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); + } } final SearchCriteria sc = sb.create(); @@ -3365,7 +3375,14 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe } if (storageId != null) { - sc.setJoinParameters("volumeSearch", "poolId", storageId); + StoragePoolVO storagePool = _primaryDataStoreDao.findById(storageId); + if (storagePool.getPoolType() == Storage.StoragePoolType.DatastoreCluster) { + List childDataStores = _primaryDataStoreDao.listChildStoragePoolsInDatastoreCluster(storageId); + List childDatastoreIds = childDataStores.stream().map(mo -> mo.getId()).collect(Collectors.toList()); + sc.setJoinParameters("volumeSearch", "poolId", childDatastoreIds.toArray()); + } else { + sc.setJoinParameters("volumeSearch", "poolId", storageId); + } } final Pair, Integer> result = _vmInstanceDao.searchAndCount(sc, searchFilter);