This is an automated email from the ASF dual-hosted git repository. pearl11594 pushed a commit to branch ghi10021-flexibletags-detachedvolmigration in repository https://gitbox.apache.org/repos/asf/cloudstack.git
commit dc5ba75f6ca26a00b4c4266f5796ad8d8286a906 Author: Pearl Dsilva <[email protected]> AuthorDate: Fri Jan 16 08:28:04 2026 -0500 Consider flexible tags as for detached volume migration --- .../com/cloud/server/ManagementServerImpl.java | 58 ++++++++++++++++------ 1 file changed, 42 insertions(+), 16 deletions(-) diff --git a/server/src/main/java/com/cloud/server/ManagementServerImpl.java b/server/src/main/java/com/cloud/server/ManagementServerImpl.java index caf94a1cc85..bdf539bdd8b 100644 --- a/server/src/main/java/com/cloud/server/ManagementServerImpl.java +++ b/server/src/main/java/com/cloud/server/ManagementServerImpl.java @@ -25,11 +25,11 @@ import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.Optional; import java.util.Set; import java.util.TimeZone; import java.util.UUID; @@ -663,7 +663,6 @@ import com.cloud.alert.AlertVO; import com.cloud.alert.dao.AlertDao; import com.cloud.api.ApiDBUtils; import com.cloud.api.query.dao.StoragePoolJoinDao; -import com.cloud.api.query.vo.StoragePoolJoinVO; import com.cloud.capacity.Capacity; import com.cloud.capacity.CapacityVO; import com.cloud.capacity.dao.CapacityDao; @@ -768,7 +767,6 @@ import com.cloud.storage.ScopeType; import com.cloud.storage.Storage; import com.cloud.storage.StorageManager; import com.cloud.storage.StoragePool; -import com.cloud.storage.StoragePoolStatus; import com.cloud.storage.VMTemplateVO; import com.cloud.storage.Volume; import com.cloud.storage.VolumeApiServiceImpl; @@ -1991,23 +1989,51 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe private List<StoragePool> findAllSuitableStoragePoolsForDetachedVolume(Volume volume, Long diskOfferingId, List<? extends StoragePool> allPools) { List<StoragePool> suitablePools = new ArrayList<>(); if (CollectionUtils.isEmpty(allPools)) { - return suitablePools; + return suitablePools; } + + StoragePoolVO srcPool = _poolDao.findById(volume.getPoolId()); + if (srcPool == null) { + logger.warn("Source pool not found for volume {}: {}", volume.getName(), volume.getUuid()); + return suitablePools; + } + + HypervisorType hypervisorType = getHypervisorType(null, srcPool); + List<ClusterVO> clusters = _clusterDao.listByDcHyType(srcPool.getDataCenterId(), hypervisorType.toString()); + DiskOfferingVO diskOffering = _diskOfferingDao.findById(diskOfferingId); - List<String> tags = new ArrayList<>(); - String[] tagsArray = diskOffering.getTagsArray(); - if (tagsArray != null && tagsArray.length > 0) { - tags = Arrays.asList(tagsArray); - } - Long[] poolIds = allPools.stream().map(StoragePool::getId).toArray(Long[]::new); - List<StoragePoolJoinVO> pools = _poolJoinDao.searchByIds(poolIds); - for (StoragePoolJoinVO storagePool : pools) { - if (StoragePoolStatus.Up.equals(storagePool.getStatus()) && - (CollectionUtils.isEmpty(tags) || tags.contains(storagePool.getTag()))) { - Optional<? extends StoragePool> match = allPools.stream().filter(x -> x.getId() == storagePool.getId()).findFirst(); - match.ifPresent(suitablePools::add); + DiskProfile diskProfile = new DiskProfile(volume, diskOffering, hypervisorType); + + ExcludeList avoid = new ExcludeList(); + + Set<Long> allPoolIds = allPools.stream() + .map(StoragePool::getId) + .collect(Collectors.toSet()); + Set<Long> addedPoolIds = new HashSet<>(); + + for (Cluster cluster : clusters) { + DataCenterDeployment plan = new DataCenterDeployment(srcPool.getDataCenterId(), cluster.getPodId(), cluster.getId(), + null, null, null, null); + + for (StoragePoolAllocator allocator : _storagePoolAllocators) { + try { + List<StoragePool> pools = allocator.allocateToPool(diskProfile, null, plan, avoid, StoragePoolAllocator.RETURN_UPTO_ALL, + false, null); + if (CollectionUtils.isNotEmpty(pools)) { + for (StoragePool pool : pools) { + if (allPoolIds.contains(pool.getId()) && !addedPoolIds.contains(pool.getId())) { + suitablePools.add(pool); + addedPoolIds.add(pool.getId()); + } + } + } + } catch (Exception e) { + logger.warn("Allocator {} failed to find storage pools for detached volume {} due to {}", + allocator.getClass().getSimpleName(), volume.getId(), e.getMessage()); + } } } + return suitablePools; }
