From db66574e27b3df99e708ad09c96fdd2f3cad7da1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafael=20Weing=C3=A4rtner?= Date: Thu, 26 Apr 2018 20:39:17 -0300 Subject: [PATCH] Allow changing disk offering of VMs' root volume Currently, users are not able to change the disk offering of VMs' root volumes. It might be interesting to allow such changes, so users would be able to move a VM initially deployed in shared storage to local storage and vice versa. It is also interesting to enable changing the quality of service offered to root disks. We are allowing only administrators to execute the change of root volumes disk offerings during volume migration between storage. Therefore, we perform all at once, the migration of storage and the disk offering to reflect the new place. --- .../main/java/com/cloud/storage/VolumeApiServiceImpl.java | 5 +---- .../java/com/cloud/storage/VolumeApiServiceImplTest.java | 3 +-- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java b/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java index 2caeaec3b79f..2cf55d17e258 100644 --- a/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java +++ b/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java @@ -2125,9 +2125,6 @@ protected void validateConditionsToReplaceDiskOfferingOfVolume(VolumeVO volume, if (newDiskOffering == null) { return; } - if (Volume.Type.ROOT.equals(volume.getVolumeType())) { - throw new InvalidParameterValueException(String.format("Cannot change the disk offering of a ROOT volume [id=%s].", volume.getUuid())); - } if ((destPool.isShared() && newDiskOffering.getUseLocalStorage()) || destPool.isLocal() && newDiskOffering.isShared()) { throw new InvalidParameterValueException("You cannot move the volume to a shared storage and assing a disk offering for local storage and vice versa."); } @@ -2142,7 +2139,7 @@ protected void validateConditionsToReplaceDiskOfferingOfVolume(VolumeVO volume, "You are migrating a volume [id=%s] and changing the disk offering[from id=%s to id=%s] to reflect this migration. However, the sizes of the volume and the new disk offering are different.", volume.getUuid(), oldDiskOffering.getUuid(), newDiskOffering.getUuid())); } - + s_logger.info(String.format("Changing disk offering to [uuid=%s] while migrating volume [uuid=%s, name=%s].", newDiskOffering.getUuid(), volume.getUuid(), volume.getName())); } /** diff --git a/server/src/test/java/com/cloud/storage/VolumeApiServiceImplTest.java b/server/src/test/java/com/cloud/storage/VolumeApiServiceImplTest.java index 28937ec1b3f3..55dda5331938 100644 --- a/server/src/test/java/com/cloud/storage/VolumeApiServiceImplTest.java +++ b/server/src/test/java/com/cloud/storage/VolumeApiServiceImplTest.java @@ -516,7 +516,7 @@ public void validateConditionsToReplaceDiskOfferingOfVolumeTestNoNewDiskOffering Mockito.verify(volumeVOMock, times(0)).getVolumeType(); } - @Test(expected = InvalidParameterValueException.class) + @Test public void validateConditionsToReplaceDiskOfferingOfVolumeTestRootVolume() { Mockito.when(volumeVOMock.getVolumeType()).thenReturn(Type.ROOT); @@ -575,7 +575,6 @@ public void validateConditionsToReplaceDiskOfferingOfVolumeTestEverythingWorking volumeApiServiceImpl.validateConditionsToReplaceDiskOfferingOfVolume(volumeVOMock, newDiskOfferingMock, storagePoolMock); InOrder inOrder = Mockito.inOrder(volumeVOMock, newDiskOfferingMock, storagePoolMock, volumeApiServiceImpl); - inOrder.verify(volumeVOMock).getVolumeType(); inOrder.verify(storagePoolMock).isShared(); inOrder.verify(newDiskOfferingMock).getUseLocalStorage(); inOrder.verify(storagePoolMock).isLocal();