From 669ab73efeaf85e4e1c5763c2b21e246275f55d8 Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Mon, 4 Oct 2021 00:45:59 +0200 Subject: [PATCH] server: check service offering (storage) tags when reallocate a ROOT disk (#5501) * server: check service offering (storage) tags when reallocate a ROOT disk * server: resize volumes in Allocated state --- .../java/com/cloud/storage/dao/VolumeDao.java | 2 ++ .../com/cloud/storage/dao/VolumeDaoImpl.java | 16 ++++++++++++++++ .../deploy/DeploymentPlanningManagerImpl.java | 3 ++- .../java/com/cloud/vm/UserVmManagerImpl.java | 4 ++-- 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/engine/schema/src/main/java/com/cloud/storage/dao/VolumeDao.java b/engine/schema/src/main/java/com/cloud/storage/dao/VolumeDao.java index b410f48d113..9eb623a7bd6 100644 --- a/engine/schema/src/main/java/com/cloud/storage/dao/VolumeDao.java +++ b/engine/schema/src/main/java/com/cloud/storage/dao/VolumeDao.java @@ -94,6 +94,8 @@ public interface VolumeDao extends GenericDao, StateDao findReadyRootVolumesByInstance(long instanceId); + List findReadyAndAllocatedRootVolumesByInstance(long instanceId); + List listPoolIdsByVolumeCount(long dcId, Long podId, Long clusterId, long accountId); List listZoneWidePoolIdsByVolumeCount(long dcId, long accountId); diff --git a/engine/schema/src/main/java/com/cloud/storage/dao/VolumeDaoImpl.java b/engine/schema/src/main/java/com/cloud/storage/dao/VolumeDaoImpl.java index 12e658a65a6..d934f80dc4e 100644 --- a/engine/schema/src/main/java/com/cloud/storage/dao/VolumeDaoImpl.java +++ b/engine/schema/src/main/java/com/cloud/storage/dao/VolumeDaoImpl.java @@ -61,6 +61,7 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol protected final GenericSearchBuilder ActiveTemplateSearch; protected final SearchBuilder InstanceStatesSearch; protected final SearchBuilder AllFieldsSearch; + protected final SearchBuilder RootDiskStateSearch; protected GenericSearchBuilder CountByAccount; protected GenericSearchBuilder primaryStorageSearch; protected GenericSearchBuilder primaryStorageSearch2; @@ -217,6 +218,15 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol return listBy(sc); } + @Override + public List findReadyAndAllocatedRootVolumesByInstance(long instanceId) { + SearchCriteria sc = RootDiskStateSearch.create(); + sc.setParameters("instanceId", instanceId); + sc.setParameters("state", Volume.State.Ready, State.Allocated); + sc.setParameters("vType", Volume.Type.ROOT); + return listBy(sc); + } + @Override public List findByPod(long podId) { SearchCriteria sc = AllFieldsSearch.create(); @@ -365,6 +375,12 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol AllFieldsSearch.and("name", AllFieldsSearch.entity().getName(), Op.EQ); AllFieldsSearch.done(); + RootDiskStateSearch = createSearchBuilder(); + RootDiskStateSearch.and("state", RootDiskStateSearch.entity().getState(), Op.IN); + RootDiskStateSearch.and("vType", RootDiskStateSearch.entity().getVolumeType(), Op.EQ); + RootDiskStateSearch.and("instanceId", RootDiskStateSearch.entity().getInstanceId(), Op.EQ); + RootDiskStateSearch.done(); + DetachedAccountIdSearch = createSearchBuilder(); DetachedAccountIdSearch.and("accountId", DetachedAccountIdSearch.entity().getAccountId(), Op.EQ); DetachedAccountIdSearch.and("destroyed", DetachedAccountIdSearch.entity().getState(), Op.NEQ); diff --git a/server/src/main/java/com/cloud/deploy/DeploymentPlanningManagerImpl.java b/server/src/main/java/com/cloud/deploy/DeploymentPlanningManagerImpl.java index 2ff19d6bdc1..5a42f6e321c 100644 --- a/server/src/main/java/com/cloud/deploy/DeploymentPlanningManagerImpl.java +++ b/server/src/main/java/com/cloud/deploy/DeploymentPlanningManagerImpl.java @@ -1639,7 +1639,8 @@ StateListener, Configurable { DiskOfferingVO diskOffering = _diskOfferingDao.findById(toBeCreated.getDiskOfferingId()); - if (vmProfile.getTemplate().getFormat() == Storage.ImageFormat.ISO && vmProfile.getServiceOffering().getTagsArray().length != 0) { + if ((vmProfile.getTemplate().getFormat() == Storage.ImageFormat.ISO || toBeCreated.getVolumeType() == Volume.Type.ROOT) + && vmProfile.getServiceOffering().getTagsArray().length != 0) { diskOffering.setTagsArray(Arrays.asList(vmProfile.getServiceOffering().getTagsArray())); } diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index 44bb79e38b2..d371e58cd67 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -1271,7 +1271,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir DiskOfferingVO newRootDiskOffering = _diskOfferingDao.findById(newServiceOffering.getId()); - List vols = _volsDao.findReadyRootVolumesByInstance(vmInstance.getId()); + List vols = _volsDao.findReadyAndAllocatedRootVolumesByInstance(vmInstance.getId()); for (final VolumeVO rootVolumeOfVm : vols) { DiskOfferingVO currentRootDiskOffering = _diskOfferingDao.findById(rootVolumeOfVm.getDiskOfferingId()); @@ -1347,7 +1347,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir private void resizeRootVolumeOfVmWithNewOffering(VMInstanceVO vmInstance, ServiceOfferingVO newServiceOffering) throws ResourceAllocationException { DiskOfferingVO newROOTDiskOffering = _diskOfferingDao.findById(newServiceOffering.getId()); - List vols = _volsDao.findReadyRootVolumesByInstance(vmInstance.getId()); + List vols = _volsDao.findReadyAndAllocatedRootVolumesByInstance(vmInstance.getId()); for (final VolumeVO rootVolumeOfVm : vols) { rootVolumeOfVm.setDiskOfferingId(newROOTDiskOffering.getId());