Daniel Erez has uploaded a new change for review.

Change subject: core: support Cinder disk update
......................................................................

core: support Cinder disk update

Support updating/extending Cinder disks.

Change-Id: I16d4ce9f53569ddfe1984b29dcbe1cdda4f7b444
Bug-Url: https://bugzilla.redhat.com/1185826
Signed-off-by: Daniel Erez <de...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmDiskCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java
M 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/AttachDiskToVmCommandTest.java
M 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/UpdateVmDiskCommandTest.java
4 files changed, 68 insertions(+), 10 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/01/39201/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmDiskCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmDiskCommand.java
index 24f7ccd..af00aca 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmDiskCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmDiskCommand.java
@@ -9,12 +9,15 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
 
 import org.apache.commons.lang.StringUtils;
 import org.ovirt.engine.core.bll.profiles.DiskProfileHelper;
 import org.ovirt.engine.core.bll.quota.QuotaConsumptionParameter;
 import org.ovirt.engine.core.bll.quota.QuotaStorageConsumptionParameter;
 import org.ovirt.engine.core.bll.quota.QuotaStorageDependent;
+import org.ovirt.engine.core.bll.tasks.CommandCoordinatorUtil;
 import org.ovirt.engine.core.bll.utils.PermissionSubject;
 import org.ovirt.engine.core.bll.utils.VmDeviceUtils;
 import org.ovirt.engine.core.bll.validator.LocalizedVmStatus;
@@ -37,6 +40,7 @@
 import org.ovirt.engine.core.common.businessentities.VMStatus;
 import org.ovirt.engine.core.common.businessentities.VmDevice;
 import org.ovirt.engine.core.common.businessentities.network.VmNic;
+import org.ovirt.engine.core.common.businessentities.storage.CinderDisk;
 import org.ovirt.engine.core.common.businessentities.storage.Disk;
 import org.ovirt.engine.core.common.businessentities.storage.DiskStorageType;
 import org.ovirt.engine.core.common.businessentities.storage.DiskImage;
@@ -124,7 +128,14 @@
         ImagesHandler.setDiskAlias(getParameters().getDiskInfo(), getVm());
 
         if (resizeDiskImageRequested()) {
-            extendDiskImageSize();
+            switch (getOldDisk().getDiskStorageType()) {
+                case IMAGE:
+                    extendDiskImageSize();
+                    break;
+                case CINDER:
+                    extendCinderDiskSize();
+                    break;
+            }
         } else {
             try {
                 performDiskUpdate(false);
@@ -171,7 +182,8 @@
                 return false;
             }
         }
-        if (DiskStorageType.IMAGE == getOldDisk().getDiskStorageType() && 
!validateCanResizeDisk()) {
+        if ((DiskStorageType.IMAGE == getOldDisk().getDiskStorageType() ||
+                DiskStorageType.CINDER == getOldDisk().getDiskStorageType()) 
&& !validateCanResizeDisk()) {
             return false;
         }
 
@@ -359,7 +371,7 @@
         return listPermissionSubjects;
     }
 
-    private void performDiskUpdate(final boolean unlockImage) {
+    protected void performDiskUpdate(final boolean unlockImage) {
         if (shouldPerformMetadataUpdate()) {
             updateMetaDataDescription((DiskImage) getNewDisk());
         }
@@ -381,6 +393,14 @@
                     getImageDao().update(diskImage.getImage());
                     updateQuota(diskImage);
                     updateDiskProfile();
+                } else if (disk.getDiskStorageType() == 
DiskStorageType.CINDER) {
+                    CinderDisk cinderDisk = (CinderDisk) disk;
+                    setStorageDomainId(cinderDisk.getStorageIds().get(0));
+                    getCinderBroker().updateDisk(cinderDisk);
+                    if (unlockImage && cinderDisk.getImageStatus() == 
ImageStatus.LOCKED) {
+                        cinderDisk.setImageStatus(ImageStatus.OK);
+                    }
+                    getImageDao().update(cinderDisk.getImage());
                 }
 
                 reloadDisks();
@@ -508,8 +528,31 @@
         setSucceeded(ret.getSucceeded());
     }
 
+    private void extendCinderDiskSize() {
+        lockImageInDb();
+        CinderDisk newCinderDisk = (CinderDisk) getNewDisk();
+        Future<VdcReturnValueBase> future = 
CommandCoordinatorUtil.executeAsyncCommand(
+                VdcActionType.ExtendCinderDisk,
+                new UpdateVmDiskParameters(getVmId(), newCinderDisk.getId(), 
newCinderDisk),
+                cloneContextAndDetachFromParent());
+        addCustomValue("NewSize", String.valueOf(getNewDiskSizeInGB()));
+        try {
+            setReturnValue(future.get());
+            setSucceeded(getReturnValue().getSucceeded());
+        } catch (InterruptedException | ExecutionException e) {
+            log.error("Error extending Cinder disk '{}': {}",
+                    getNewDisk().getDiskAlias(),
+                    e.getMessage());
+            log.debug("Exception", e);
+        }
+    }
+
     @Override
     protected void endSuccessfully() {
+        if (!isDiskImage()) {
+            return;
+        }
+
         VdcReturnValueBase ret = 
getBackend().endAction(VdcActionType.ExtendImageSize,
                         createExtendImageSizeParameters(),
                 
getContext().clone().withoutCompensationContext().withoutExecutionContext().withoutLock());
@@ -577,8 +620,17 @@
         return jobProperties;
     }
 
+    public long getNewDiskSizeInGB() {
+        CinderDisk cinderDisk = (CinderDisk) getNewDisk();
+        return cinderDisk.getSize() / (1024 * 1024 * 1024);
+    }
+
     private boolean isDiskImage() {
         return getOldDisk() != null && getNewDisk() != null && 
DiskStorageType.IMAGE == getOldDisk().getDiskStorageType();
+    }
+
+    private boolean isCinderDisk() {
+        return getOldDisk() != null && getNewDisk() != null && 
DiskStorageType.CINDER == getOldDisk().getDiskStorageType();
     }
 
     protected Guid getQuotaId() {
@@ -639,8 +691,14 @@
     }
 
     private boolean resizeDiskImageRequested() {
-        return getNewDisk().getDiskStorageType() == DiskStorageType.IMAGE &&
-               vmDeviceForVm.getSnapshotId() == null && getNewDisk().getSize() 
!= getOldDisk().getSize();
+        boolean sizeChanged = getNewDisk().getSize() != getOldDisk().getSize();
+        switch (getNewDisk().getDiskStorageType()) {
+            case IMAGE:
+                return sizeChanged && vmDeviceForVm.getSnapshotId() == null;
+            case CINDER:
+                return sizeChanged;
+        }
+        return false;
     }
 
     private boolean updateParametersRequiringVmDownRequested() {
@@ -705,7 +763,7 @@
         return oldDisk;
     }
 
-    private Disk getNewDisk() {
+    protected Disk getNewDisk() {
         return getParameters().getDiskInfo();
     }
 
@@ -754,7 +812,7 @@
          });
     }
 
-    private void unlockImageInDb() {
+    public void unlockImageInDb() {
         final DiskImage diskImage = (DiskImage) getOldDisk();
         diskImage.setImageStatus(ImageStatus.OK);
         ImagesHandler.updateImageStatus(diskImage.getImageId(), 
ImageStatus.OK);
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java
index 228bae6..e548f87 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java
@@ -524,7 +524,7 @@
         return getDbFacade().getTagDao();
     }
 
-    protected DiskDao getDiskDao() {
+    public DiskDao getDiskDao() {
         return getDbFacade().getDiskDao();
     }
 
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/AttachDiskToVmCommandTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/AttachDiskToVmCommandTest.java
index 657b621..a91b0db 100644
--- 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/AttachDiskToVmCommandTest.java
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/AttachDiskToVmCommandTest.java
@@ -100,7 +100,7 @@
             // Overridden here and not during spying, since it's called in the 
constructor
             @SuppressWarnings("synthetic-access")
             @Override
-            protected DiskDao getDiskDao() {
+            public DiskDao getDiskDao() {
                 return diskDao;
             }
         });
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/UpdateVmDiskCommandTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/UpdateVmDiskCommandTest.java
index 0ab92f7..5465dbb 100644
--- 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/UpdateVmDiskCommandTest.java
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/UpdateVmDiskCommandTest.java
@@ -574,7 +574,7 @@
             // Overridden here and not during spying, since it's called in the 
constructor
             @SuppressWarnings("synthetic-access")
             @Override
-            protected DiskDao getDiskDao() {
+            public DiskDao getDiskDao() {
                 return diskDao;
             }
 


-- 
To view, visit https://gerrit.ovirt.org/39201
To unsubscribe, visit https://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I16d4ce9f53569ddfe1984b29dcbe1cdda4f7b444
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Daniel Erez <de...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to