From 6f3e4e6302265c78273256d743ac407c77106888 Mon Sep 17 00:00:00 2001 From: GaOrtiga <49285692+GaOrtiga@users.noreply.github.com> Date: Fri, 16 Feb 2024 07:15:55 -0300 Subject: [PATCH] fix_filter_and_pagination (#8306) Co-authored-by: Gabriel --- .../com/cloud/server/ManagementService.java | 3 +- .../FindStoragePoolsForMigrationCmd.java | 5 ++-- .../api/storage/StoragePoolAllocator.java | 3 ++ .../datastore/db/PrimaryDataStoreDao.java | 8 +++++- .../datastore/db/PrimaryDataStoreDaoImpl.java | 28 +++++++++++++++++-- .../AbstractStoragePoolAllocator.java | 10 +++++-- .../ClusterScopeStoragePoolAllocator.java | 2 +- ...GarbageCollectingStoragePoolAllocator.java | 2 +- .../allocator/LocalStoragePoolAllocator.java | 4 +-- .../ZoneWideStoragePoolAllocator.java | 2 +- .../AbstractStoragePoolAllocatorTest.java | 2 +- .../allocator/RandomStoragePoolAllocator.java | 2 +- .../cloud/server/ManagementServerImpl.java | 22 +++++++-------- 13 files changed, 66 insertions(+), 27 deletions(-) diff --git a/api/src/main/java/com/cloud/server/ManagementService.java b/api/src/main/java/com/cloud/server/ManagementService.java index e87f6b362da..18f3e901cd9 100644 --- a/api/src/main/java/com/cloud/server/ManagementService.java +++ b/api/src/main/java/com/cloud/server/ManagementService.java @@ -449,10 +449,11 @@ public interface ManagementService { * this method removes the child storage pools and adds the corresponding parent datastore cluster for API response listing * * @param Long volumeId + * @param String keyword if passed, will only return storage pools that contain this keyword in the name * @return Pair, List> List of storage pools in cluster and list * of pools with enough capacity. */ - Pair, List> listStoragePoolsForMigrationOfVolume(Long volumeId); + Pair, List> listStoragePoolsForMigrationOfVolume(Long volumeId, String keyword); Pair, List> listStoragePoolsForSystemMigrationOfVolume(Long volumeId, Long newDiskOfferingId, Long newSize, Long newMinIops, Long newMaxIops, boolean keepSourceStoragePool, boolean bypassStorageTypeCheck); diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/FindStoragePoolsForMigrationCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/FindStoragePoolsForMigrationCmd.java index 699f4831415..b19fa78bdd4 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/FindStoragePoolsForMigrationCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/FindStoragePoolsForMigrationCmd.java @@ -67,7 +67,7 @@ public class FindStoragePoolsForMigrationCmd extends BaseListCmd { @Override public void execute() { - Pair, List> pools = _mgr.listStoragePoolsForMigrationOfVolume(getId()); + Pair, List> pools = _mgr.listStoragePoolsForMigrationOfVolume(getId(), getKeyword()); ListResponse response = new ListResponse(); List poolResponses = new ArrayList(); @@ -87,7 +87,8 @@ public class FindStoragePoolsForMigrationCmd extends BaseListCmd { poolResponses.add(poolResponse); } sortPoolsBySuitabilityAndName(poolResponses); - response.setResponses(poolResponses); + List pagingList = com.cloud.utils.StringUtils.applyPagination(poolResponses, this.getStartIndex(), this.getPageSizeVal()); + response.setResponses(pagingList, poolResponses.size()); response.setResponseName(getCommandName()); this.setResponseObject(response); } diff --git a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/StoragePoolAllocator.java b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/StoragePoolAllocator.java index fde71fe0d4c..6a78f6fe253 100644 --- a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/StoragePoolAllocator.java +++ b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/StoragePoolAllocator.java @@ -52,9 +52,12 @@ public interface StoragePoolAllocator extends Adapter { * avoid * @param int returnUpTo (use -1 to return all possible pools) * @param boolean bypassStorageTypeCheck allows bypassing useLocalStorage check for provided DiskProfile when true + * @param String keyword if passed, will only return storage pools that contain this keyword in the name * @return List List of storage pools that are suitable for the * VM **/ + List allocateToPool(DiskProfile dskCh, VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo, boolean bypassStorageTypeCheck, String keyword); + List allocateToPool(DiskProfile dskCh, VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo, boolean bypassStorageTypeCheck); diff --git a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDao.java b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDao.java index 8f77b4ba63e..92b7ad27e45 100644 --- a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDao.java +++ b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDao.java @@ -39,6 +39,8 @@ public interface PrimaryDataStoreDao extends GenericDao { */ List listBy(long datacenterId, Long podId, Long clusterId, ScopeType scope); + List listBy(long datacenterId, Long podId, Long clusterId, ScopeType scope, String keyword); + /** * Set capacity of storage pool in bytes * @param id pool id. @@ -114,15 +116,19 @@ public interface PrimaryDataStoreDao extends GenericDao { List findLocalStoragePoolsByTags(long dcId, long podId, Long clusterId, String[] tags, boolean validateTagRule); + List findLocalStoragePoolsByTags(long dcId, long podId, Long clusterId, String[] tags, boolean validateTagRule, String keyword); + List findZoneWideStoragePoolsByTags(long dcId, String[] tags, boolean validateTagRule); List findZoneWideStoragePoolsByHypervisor(long dataCenterId, HypervisorType hypervisorType); + List findZoneWideStoragePoolsByHypervisor(long dataCenterId, HypervisorType hypervisorType, String keyword); + List findLocalStoragePoolsByHostAndTags(long hostId, String[] tags); List listLocalStoragePoolByPath(long datacenterId, String path); - List findPoolsInClusters(List clusterIds); + List findPoolsInClusters(List clusterIds, String keyword); void deletePoolTags(long poolId); diff --git a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java index af7dbdc0225..554500e2b34 100644 --- a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java +++ b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java @@ -243,6 +243,11 @@ public class PrimaryDataStoreDaoImpl extends GenericDaoBase @Override public List listBy(long datacenterId, Long podId, Long clusterId, ScopeType scope) { + return listBy(datacenterId, podId, clusterId, scope, null); + } + + @Override + public List listBy(long datacenterId, Long podId, Long clusterId, ScopeType scope, String keyword) { SearchCriteria sc = null; if (clusterId != null) { sc = DcPodSearch.create(); @@ -254,6 +259,9 @@ public class PrimaryDataStoreDaoImpl extends GenericDaoBase sc.setParameters("datacenterId", datacenterId); sc.setParameters("podId", podId); sc.setParameters("status", Status.Up); + if (keyword != null) { + sc.addAnd("name", Op.LIKE, "%" + keyword + "%"); + } if (scope != null) { sc.setParameters("scope", scope); } @@ -443,9 +451,14 @@ public class PrimaryDataStoreDaoImpl extends GenericDaoBase @Override public List findLocalStoragePoolsByTags(long dcId, long podId, Long clusterId, String[] tags, boolean validateTagRule) { + return findLocalStoragePoolsByTags(dcId, podId, clusterId, tags, validateTagRule, null); + } + + @Override + public List findLocalStoragePoolsByTags(long dcId, long podId, Long clusterId, String[] tags, boolean validateTagRule, String keyword) { List storagePools = null; if (tags == null || tags.length == 0) { - storagePools = listBy(dcId, podId, clusterId, ScopeType.HOST); + storagePools = listBy(dcId, podId, clusterId, ScopeType.HOST, keyword); if (validateTagRule) { storagePools = getPoolsWithoutTagRule(storagePools); @@ -582,11 +595,19 @@ public class PrimaryDataStoreDaoImpl extends GenericDaoBase @Override public List findZoneWideStoragePoolsByHypervisor(long dataCenterId, HypervisorType hypervisorType) { + return findZoneWideStoragePoolsByHypervisor(dataCenterId, hypervisorType, null); + } + + @Override + public List findZoneWideStoragePoolsByHypervisor(long dataCenterId, HypervisorType hypervisorType, String keyword) { QueryBuilder sc = QueryBuilder.create(StoragePoolVO.class); sc.and(sc.entity().getDataCenterId(), Op.EQ, dataCenterId); sc.and(sc.entity().getStatus(), Op.EQ, Status.Up); sc.and(sc.entity().getScope(), Op.EQ, ScopeType.ZONE); sc.and(sc.entity().getHypervisor(), Op.EQ, hypervisorType); + if (keyword != null) { + sc.and(sc.entity().getName(), Op.LIKE, "%" + keyword + "%"); + } return sc.list(); } @@ -611,10 +632,13 @@ public class PrimaryDataStoreDaoImpl extends GenericDaoBase } @Override - public List findPoolsInClusters(List clusterIds) { + public List findPoolsInClusters(List clusterIds, String keyword) { SearchCriteria sc = ClustersSearch.create(); sc.setParameters("clusterIds", clusterIds.toArray()); sc.setParameters("status", StoragePoolStatus.Up); + if (keyword != null) { + sc.addAnd("name", Op.LIKE, "%" + keyword + "%"); + } return listBy(sc); } diff --git a/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/AbstractStoragePoolAllocator.java b/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/AbstractStoragePoolAllocator.java index 89a7b577ae7..2a65fad8e8b 100644 --- a/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/AbstractStoragePoolAllocator.java +++ b/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/AbstractStoragePoolAllocator.java @@ -106,16 +106,20 @@ public abstract class AbstractStoragePoolAllocator extends AdapterBase implement return false; } - protected abstract List select(DiskProfile dskCh, VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo, boolean bypassStorageTypeCheck); + protected abstract List select(DiskProfile dskCh, VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo, boolean bypassStorageTypeCheck, String keyword); @Override public List allocateToPool(DiskProfile dskCh, VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo) { - return allocateToPool(dskCh, vmProfile, plan, avoid, returnUpTo, false); + return allocateToPool(dskCh, vmProfile, plan, avoid, returnUpTo, false, null); } @Override public List allocateToPool(DiskProfile dskCh, VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo, boolean bypassStorageTypeCheck) { - List pools = select(dskCh, vmProfile, plan, avoid, returnUpTo, bypassStorageTypeCheck); + return allocateToPool(dskCh, vmProfile, plan, avoid, returnUpTo, bypassStorageTypeCheck, null); + } + + public List allocateToPool(DiskProfile dskCh, VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo, boolean bypassStorageTypeCheck, String keyword) { + List pools = select(dskCh, vmProfile, plan, avoid, returnUpTo, bypassStorageTypeCheck, keyword); return reorderPools(pools, vmProfile, plan, dskCh); } diff --git a/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/ClusterScopeStoragePoolAllocator.java b/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/ClusterScopeStoragePoolAllocator.java index 9c0f84ab14a..da35baf9366 100644 --- a/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/ClusterScopeStoragePoolAllocator.java +++ b/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/ClusterScopeStoragePoolAllocator.java @@ -46,7 +46,7 @@ public class ClusterScopeStoragePoolAllocator extends AbstractStoragePoolAllocat DiskOfferingDao _diskOfferingDao; @Override - protected List select(DiskProfile dskCh, VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo, boolean bypassStorageTypeCheck) { + protected List select(DiskProfile dskCh, VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo, boolean bypassStorageTypeCheck, String keyword) { logStartOfSearch(dskCh, vmProfile, plan, returnUpTo, bypassStorageTypeCheck); if (!bypassStorageTypeCheck && dskCh.useLocalStorage()) { diff --git a/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/GarbageCollectingStoragePoolAllocator.java b/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/GarbageCollectingStoragePoolAllocator.java index 3fa69499ff1..9b9f56d4aa5 100644 --- a/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/GarbageCollectingStoragePoolAllocator.java +++ b/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/GarbageCollectingStoragePoolAllocator.java @@ -47,7 +47,7 @@ public class GarbageCollectingStoragePoolAllocator extends AbstractStoragePoolAl boolean _storagePoolCleanupEnabled; @Override - public List select(DiskProfile dskCh, VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo, boolean bypassStorageTypeCheck) { + public List select(DiskProfile dskCh, VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo, boolean bypassStorageTypeCheck, String keyword) { logStartOfSearch(dskCh, vmProfile, plan, returnUpTo, bypassStorageTypeCheck); if (!_storagePoolCleanupEnabled) { s_logger.debug("Storage pool cleanup is not enabled, so GarbageCollectingStoragePoolAllocator is being skipped."); diff --git a/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/LocalStoragePoolAllocator.java b/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/LocalStoragePoolAllocator.java index 4ec15b9e43f..7ec2f26d956 100644 --- a/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/LocalStoragePoolAllocator.java +++ b/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/LocalStoragePoolAllocator.java @@ -60,7 +60,7 @@ public class LocalStoragePoolAllocator extends AbstractStoragePoolAllocator { ConfigurationDao _configDao; @Override - protected List select(DiskProfile dskCh, VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo, boolean bypassStorageTypeCheck) { + protected List select(DiskProfile dskCh, VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo, boolean bypassStorageTypeCheck, String keyword) { logStartOfSearch(dskCh, vmProfile, plan, returnUpTo, bypassStorageTypeCheck); if (!bypassStorageTypeCheck && !dskCh.useLocalStorage()) { @@ -101,7 +101,7 @@ public class LocalStoragePoolAllocator extends AbstractStoragePoolAllocator { return null; } List availablePools = - storagePoolDao.findLocalStoragePoolsByTags(plan.getDataCenterId(), plan.getPodId(), plan.getClusterId(), dskCh.getTags(), true); + storagePoolDao.findLocalStoragePoolsByTags(plan.getDataCenterId(), plan.getPodId(), plan.getClusterId(), dskCh.getTags(), true, keyword); availablePools.addAll(storagePoolJoinDao.findStoragePoolByScopeAndRuleTags(plan.getDataCenterId(), plan.getPodId(), plan.getClusterId(), ScopeType.HOST, List.of(dskCh.getTags()))); for (StoragePoolVO pool : availablePools) { if (suitablePools.size() == returnUpTo) { diff --git a/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/ZoneWideStoragePoolAllocator.java b/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/ZoneWideStoragePoolAllocator.java index ba130b4e2e5..b02d437207e 100644 --- a/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/ZoneWideStoragePoolAllocator.java +++ b/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/ZoneWideStoragePoolAllocator.java @@ -50,7 +50,7 @@ public class ZoneWideStoragePoolAllocator extends AbstractStoragePoolAllocator { private CapacityDao capacityDao; @Override - protected List select(DiskProfile dskCh, VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo, boolean bypassStorageTypeCheck) { + protected List select(DiskProfile dskCh, VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo, boolean bypassStorageTypeCheck, String keyword) { logStartOfSearch(dskCh, vmProfile, plan, returnUpTo, bypassStorageTypeCheck); if (!bypassStorageTypeCheck && dskCh.useLocalStorage()) { diff --git a/engine/storage/src/test/java/org/apache/cloudstack/storage/allocator/AbstractStoragePoolAllocatorTest.java b/engine/storage/src/test/java/org/apache/cloudstack/storage/allocator/AbstractStoragePoolAllocatorTest.java index 466ae7db9bc..cddbc9e93cb 100644 --- a/engine/storage/src/test/java/org/apache/cloudstack/storage/allocator/AbstractStoragePoolAllocatorTest.java +++ b/engine/storage/src/test/java/org/apache/cloudstack/storage/allocator/AbstractStoragePoolAllocatorTest.java @@ -137,7 +137,7 @@ public class AbstractStoragePoolAllocatorTest { class MockStorapoolAllocater extends AbstractStoragePoolAllocator { @Override - protected List select(DiskProfile dskCh, VirtualMachineProfile vmProfile, DeploymentPlan plan, DeploymentPlanner.ExcludeList avoid, int returnUpTo, boolean bypassStorageTypeCheck) { + protected List select(DiskProfile dskCh, VirtualMachineProfile vmProfile, DeploymentPlan plan, DeploymentPlanner.ExcludeList avoid, int returnUpTo, boolean bypassStorageTypeCheck, String keyword) { return null; } } diff --git a/plugins/storage-allocators/random/src/main/java/org/apache/cloudstack/storage/allocator/RandomStoragePoolAllocator.java b/plugins/storage-allocators/random/src/main/java/org/apache/cloudstack/storage/allocator/RandomStoragePoolAllocator.java index 9787e618f0f..87a6bf56a6e 100644 --- a/plugins/storage-allocators/random/src/main/java/org/apache/cloudstack/storage/allocator/RandomStoragePoolAllocator.java +++ b/plugins/storage-allocators/random/src/main/java/org/apache/cloudstack/storage/allocator/RandomStoragePoolAllocator.java @@ -35,7 +35,7 @@ public class RandomStoragePoolAllocator extends AbstractStoragePoolAllocator { private static final Logger s_logger = Logger.getLogger(RandomStoragePoolAllocator.class); @Override - public List select(DiskProfile dskCh, VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo, boolean bypassStorageTypeCheck) { + public List select(DiskProfile dskCh, VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo, boolean bypassStorageTypeCheck, String keyword) { logStartOfSearch(dskCh, vmProfile, plan, returnUpTo, bypassStorageTypeCheck); List suitablePools = new ArrayList(); diff --git a/server/src/main/java/com/cloud/server/ManagementServerImpl.java b/server/src/main/java/com/cloud/server/ManagementServerImpl.java index f794736a4d5..430222a78ac 100644 --- a/server/src/main/java/com/cloud/server/ManagementServerImpl.java +++ b/server/src/main/java/com/cloud/server/ManagementServerImpl.java @@ -1630,9 +1630,9 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe } @Override - public Pair, List> listStoragePoolsForMigrationOfVolume(final Long volumeId) { + public Pair, List> listStoragePoolsForMigrationOfVolume(final Long volumeId, String keyword) { - Pair, List> allPoolsAndSuitablePoolsPair = listStoragePoolsForMigrationOfVolumeInternal(volumeId, null, null, null, null, false, true, false); + Pair, List> allPoolsAndSuitablePoolsPair = listStoragePoolsForMigrationOfVolumeInternal(volumeId, null, null, null, null, false, true, false, keyword); List allPools = allPoolsAndSuitablePoolsPair.first(); List suitablePools = allPoolsAndSuitablePoolsPair.second(); List avoidPools = new ArrayList<>(); @@ -1650,10 +1650,10 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe @Override public Pair, List> listStoragePoolsForSystemMigrationOfVolume(final Long volumeId, Long newDiskOfferingId, Long newSize, Long newMinIops, Long newMaxIops, boolean keepSourceStoragePool, boolean bypassStorageTypeCheck) { - return listStoragePoolsForMigrationOfVolumeInternal(volumeId, newDiskOfferingId, newSize, newMinIops, newMaxIops, keepSourceStoragePool, bypassStorageTypeCheck, true); + return listStoragePoolsForMigrationOfVolumeInternal(volumeId, newDiskOfferingId, newSize, newMinIops, newMaxIops, keepSourceStoragePool, bypassStorageTypeCheck, true, null); } - public Pair, List> listStoragePoolsForMigrationOfVolumeInternal(final Long volumeId, Long newDiskOfferingId, Long newSize, Long newMinIops, Long newMaxIops, boolean keepSourceStoragePool, boolean bypassStorageTypeCheck, boolean bypassAccountCheck) { + public Pair, List> listStoragePoolsForMigrationOfVolumeInternal(final Long volumeId, Long newDiskOfferingId, Long newSize, Long newMinIops, Long newMaxIops, boolean keepSourceStoragePool, boolean bypassStorageTypeCheck, boolean bypassAccountCheck, String keyword) { if (!bypassAccountCheck) { final Account caller = getCaller(); if (!_accountMgr.isRootAdmin(caller.getId())) { @@ -1728,7 +1728,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe Pair> hostClusterPair = getVolumeVmHostClusters(srcVolumePool, vm, hypervisorType); Host vmHost = hostClusterPair.first(); List clusters = hostClusterPair.second(); - allPools = getAllStoragePoolCompatibleWithVolumeSourceStoragePool(srcVolumePool, hypervisorType, clusters); + allPools = getAllStoragePoolCompatibleWithVolumeSourceStoragePool(srcVolumePool, hypervisorType, clusters, keyword); ExcludeList avoid = new ExcludeList(); if (!keepSourceStoragePool) { allPools.remove(srcVolumePool); @@ -1736,7 +1736,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe } if (vm != null) { suitablePools = findAllSuitableStoragePoolsForVm(volume, diskOfferingId, newSize, newMinIops, newMaxIops, vm, vmHost, avoid, - CollectionUtils.isNotEmpty(clusters) ? clusters.get(0) : null, hypervisorType, bypassStorageTypeCheck); + CollectionUtils.isNotEmpty(clusters) ? clusters.get(0) : null, hypervisorType, bypassStorageTypeCheck, keyword); } else { suitablePools = findAllSuitableStoragePoolsForDetachedVolume(volume, diskOfferingId, allPools); } @@ -1803,15 +1803,15 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe *
  • We also all storage available filtering by data center, pod and cluster as the current storage pool used by the given volume.
  • * */ - private List getAllStoragePoolCompatibleWithVolumeSourceStoragePool(StoragePool srcVolumePool, HypervisorType hypervisorType, List clusters) { + private List getAllStoragePoolCompatibleWithVolumeSourceStoragePool(StoragePool srcVolumePool, HypervisorType hypervisorType, List clusters, String keyword) { List storagePools = new ArrayList<>(); - List zoneWideStoragePools = _poolDao.findZoneWideStoragePoolsByHypervisor(srcVolumePool.getDataCenterId(), hypervisorType); + List zoneWideStoragePools = _poolDao.findZoneWideStoragePoolsByHypervisor(srcVolumePool.getDataCenterId(), hypervisorType, keyword); if (CollectionUtils.isNotEmpty(zoneWideStoragePools)) { storagePools.addAll(zoneWideStoragePools); } if (CollectionUtils.isNotEmpty(clusters)) { List clusterIds = clusters.stream().map(Cluster::getId).collect(Collectors.toList()); - List clusterAndLocalStoragePools = _poolDao.findPoolsInClusters(clusterIds); + List clusterAndLocalStoragePools = _poolDao.findPoolsInClusters(clusterIds, keyword); if (CollectionUtils.isNotEmpty(clusterAndLocalStoragePools)) { storagePools.addAll(clusterAndLocalStoragePools); } @@ -1827,7 +1827,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe * * Side note: the idea behind this method is to provide power for administrators of manually overriding deployments defined by CloudStack. */ - private List findAllSuitableStoragePoolsForVm(final VolumeVO volume, Long diskOfferingId, Long newSize, Long newMinIops, Long newMaxIops, VMInstanceVO vm, Host vmHost, ExcludeList avoid, Cluster srcCluster, HypervisorType hypervisorType, boolean bypassStorageTypeCheck) { + private List findAllSuitableStoragePoolsForVm(final VolumeVO volume, Long diskOfferingId, Long newSize, Long newMinIops, Long newMaxIops, VMInstanceVO vm, Host vmHost, ExcludeList avoid, Cluster srcCluster, HypervisorType hypervisorType, boolean bypassStorageTypeCheck, String keyword) { List suitablePools = new ArrayList<>(); Long clusterId = null; Long podId = null; @@ -1849,7 +1849,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe } for (StoragePoolAllocator allocator : _storagePoolAllocators) { - List pools = allocator.allocateToPool(diskProfile, profile, plan, avoid, StoragePoolAllocator.RETURN_UPTO_ALL, bypassStorageTypeCheck); + List pools = allocator.allocateToPool(diskProfile, profile, plan, avoid, StoragePoolAllocator.RETURN_UPTO_ALL, bypassStorageTypeCheck, keyword); if (CollectionUtils.isEmpty(pools)) { continue; }