Sergey Gotliv has uploaded a new change for review.

Change subject: engine: Enable online virtual drive resize
......................................................................

engine: Enable online virtual drive resize

Currently there is no option to extend virtual disk size after it's
creation. This patch is providing such option from the engine side.

Change-Id: Ie702348a68a26ac02a01f66aaa1ea42c2c675ebb
Bug-Url:https://bugzilla.redhat.com/show_bug.cgi?id=600483
Signed-off-by: Sergey Gotliv <[email protected]>
---
M backend/manager/dbscripts/images_sp.sql
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ExtendImageSizeCommand.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ExtendImageSizeParameters.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskType.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/ExtendImageSizeVDSCommandParameters.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/ExtendVmDiskSizeVDSCommandParameters.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/VdcBllMessages.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/ImageDao.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/ImageDaoDbFacadeImpl.java
M backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
M 
backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties
A 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/ExtendImageSizeVDSCommand.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IIrsServer.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsServerConnector.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsServerWrapper.java
A 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/ExtendVmDiskSizeVDSCommand.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java
22 files changed, 452 insertions(+), 3 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/75/14975/1

diff --git a/backend/manager/dbscripts/images_sp.sql 
b/backend/manager/dbscripts/images_sp.sql
index 65f829e..951b48b 100644
--- a/backend/manager/dbscripts/images_sp.sql
+++ b/backend/manager/dbscripts/images_sp.sql
@@ -88,6 +88,23 @@
 
 
 
+Create or replace FUNCTION UpdateImageSize(
+    v_image_group_id UUID,
+    v_size BIGINT,
+    v_lastModified TIMESTAMP WITH TIME ZONE)
+RETURNS VOID
+AS $procedure$
+BEGIN
+    UPDATE images
+    SET    size = v_size,
+           lastModified = v_lastModified
+    WHERE  image_group_id = v_image_group_id;
+END; $procedure$
+LANGUAGE plpgsql;
+
+
+
+
 Create or replace FUNCTION UpdateImage(
     v_creation_date TIMESTAMP WITH TIME ZONE,
     v_image_guid UUID,
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ExtendImageSizeCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ExtendImageSizeCommand.java
new file mode 100644
index 0000000..0eda1c2
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ExtendImageSizeCommand.java
@@ -0,0 +1,170 @@
+package org.ovirt.engine.core.bll;
+
+import org.apache.commons.lang.exception.ExceptionUtils;
+import org.ovirt.engine.core.bll.utils.PermissionSubject;
+import org.ovirt.engine.core.common.AuditLogType;
+import org.ovirt.engine.core.common.VdcObjectType;
+import org.ovirt.engine.core.common.action.ExtendImageSizeParameters;
+import org.ovirt.engine.core.common.action.VdcActionType;
+import org.ovirt.engine.core.common.asynctasks.AsyncTaskType;
+import org.ovirt.engine.core.common.businessentities.ActionGroup;
+import org.ovirt.engine.core.common.businessentities.Disk;
+import org.ovirt.engine.core.common.businessentities.DiskImage;
+import org.ovirt.engine.core.common.businessentities.VM;
+import org.ovirt.engine.core.common.businessentities.VMStatus;
+import org.ovirt.engine.core.common.errors.VdcBLLException;
+import 
org.ovirt.engine.core.common.vdscommands.ExtendImageSizeVDSCommandParameters;
+import 
org.ovirt.engine.core.common.vdscommands.ExtendVmDiskSizeVDSCommandParameters;
+import 
org.ovirt.engine.core.common.vdscommands.GetImageInfoVDSCommandParameters;
+import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
+import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.dal.VdcBllMessages;
+import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogDirector;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ExtendImageSizeCommand<T extends ExtendImageSizeParameters> 
extends BaseImagesCommand<T> {
+
+    private List<PermissionSubject> permissionsList;
+
+    public ExtendImageSizeCommand(T parameters) {
+        super(parameters);
+    }
+
+    @Override
+    protected boolean canDoAction() {
+        return isImageExist() && isExtendCurrentSize();
+    }
+
+    @Override
+    protected void executeCommand() {
+        DiskImage diskImage = getImage();
+        
getParameters().setStoragePoolId(diskImage.getStoragePoolId().getValue());
+        getParameters().setStorageDomainId(diskImage.getStorageIds().get(0));
+        getParameters().setImageGroupID(diskImage.getId());
+
+        lockImage();
+
+        VDSReturnValue vdsReturnValue = 
runVdsCommand(VDSCommandType.ExtendImageSize,
+                createExtendImageSizeVDSCommandParameters(diskImage));
+
+        if (vdsReturnValue.getSucceeded()) {
+            Guid taskId = createTask(vdsReturnValue.getCreationInfo(), 
VdcActionType.ExtendImageSize);
+            getReturnValue().getTaskIdList().add(taskId);
+            setSucceeded(true);
+        }
+    }
+
+    @Override
+    protected void endSuccessfully() {
+        try {
+            DiskImage image = (DiskImage) runVdsCommand(
+                    VDSCommandType.GetImageInfo,
+                    createGetImageInfoVDSCommandParameters()
+            ).getReturnValue();
+
+            if (image != null && getImage().getSize() != image.getSize()) {
+                updateImageSize(image);
+                updateRunningVms(image);
+            }
+        } finally {
+            unLockImage();
+            setSucceeded(true);
+        }
+    }
+
+    @Override
+    protected void endWithFailure() {
+        unLockImage();
+        log.warnFormat("Failed to extend size of the volume '${0}', user: 
'${1}'", getImage().getId(), getUserName());
+        addCustomValue("DiskId", getImageId().toString());
+        addCustomValue("UserName", getUserName());
+        AuditLogDirector.log(this, AuditLogType.USER_EXTEND_DISK_SIZE_FAILURE);
+        setSucceeded(true);
+    }
+
+    private void updateImageSize(DiskImage diskImage) {
+        getImageDao().updateImageSize(diskImage.getId(), diskImage.getSize(), 
diskImage.getLastModifiedDate());
+    }
+
+    private void updateRunningVms(DiskImage diskImage) {
+        List<VM> vms = 
getDbFacade().getVmDao().getVmsListForDisk(diskImage.getId());
+        for (VM vm : vms) {
+            if (vm.getStatus() == VMStatus.Up) {
+                try {
+                    runVdsCommand(VDSCommandType.ExtendVmDiskSize,
+                            createExtendVmDiskSizeVDSCommandParameters(vm, 
diskImage.getSize()));
+                } catch (VdcBLLException e) {
+                    log.warnFormat("Failed to update VM {0} with the new 
volume size due to error: {1}",
+                            vm.getName(), ExceptionUtils.getMessage(e));
+                    addCustomValue("VmName", getVmName());
+                    AuditLogDirector.log(this, 
AuditLogType.USER_EXTEND_DISK_SIZE_UPDATE_VM_FAILURE);
+                }
+            }
+        }
+    }
+
+    private ExtendImageSizeVDSCommandParameters 
createExtendImageSizeVDSCommandParameters(DiskImage diskImage) {
+        ExtendImageSizeVDSCommandParameters params = new 
ExtendImageSizeVDSCommandParameters();
+        params.setStoragePoolId(diskImage.getStoragePoolId().getValue());
+        params.setStorageDomainId(diskImage.getStorageIds().get(0));
+        params.setImageGroupId(diskImage.getId());
+        params.setImageId(diskImage.getImageId());
+        params.setNewSize(getParameters().getNewSize());
+        return params;
+    }
+
+    private GetImageInfoVDSCommandParameters 
createGetImageInfoVDSCommandParameters() {
+        return new GetImageInfoVDSCommandParameters(
+                getParameters().getStoragePoolId(),
+                getParameters().getStorageDomainId(),
+                getParameters().getImageGroupID(),
+                getParameters().getImageId()
+        );
+    }
+
+    private ExtendVmDiskSizeVDSCommandParameters 
createExtendVmDiskSizeVDSCommandParameters(VM vm, long newSize) {
+        ExtendVmDiskSizeVDSCommandParameters params = new 
ExtendVmDiskSizeVDSCommandParameters(
+                vm.getRunOnVds().getValue(), vm.getId(), newSize
+        );
+        params.setStorageDomainId(getParameters().getStorageDomainId());
+        params.setStoragePoolId(getParameters().getStoragePoolId());
+        params.setImageGroupId(getParameters().getImageGroupID());
+        params.setImageId(getParameters().getImageId());
+        return params;
+    }
+
+    private boolean isImageExist() {
+        if (getImage() == null || getImage().getDiskStorageType() != 
Disk.DiskStorageType.IMAGE) {
+            
addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_DISK_NOT_EXIST);
+            return false;
+        }
+        return true;
+    }
+
+    private boolean isExtendCurrentSize() {
+        long currentSize = getImage().getSize();
+        if (currentSize > getParameters().getNewSize()) {
+            
addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_SHRINK_IS_NOT_SUPPORTED);
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public List<PermissionSubject> getPermissionCheckSubjects() {
+        if (permissionsList == null) {
+            permissionsList = new ArrayList<PermissionSubject>();
+            permissionsList.add(new PermissionSubject(getImageId(), 
VdcObjectType.Disk, ActionGroup.EDIT_DISK_PROPERTIES));
+        }
+
+        return permissionsList;
+    }
+
+    @Override
+    protected AsyncTaskType getTaskType() {
+        return AsyncTaskType.extendImageSize;
+    }
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java
index 1b0608e..ceb9e76 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java
@@ -303,6 +303,8 @@
     USER_PASSWORD_CHANGE_FAILED(347),
     USER_CLEAR_UNKNOWN_VMS(348),
     USER_FAILED_CLEAR_UNKNOWN_VMS(349),
+    USER_EXTEND_DISK_SIZE_FAILURE(370),
+    USER_EXTEND_DISK_SIZE_UPDATE_VM_FAILURE(371),
 
     AUTO_SUSPEND_VM(524),
     @Deprecated
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ExtendImageSizeParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ExtendImageSizeParameters.java
new file mode 100644
index 0000000..45218ae
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ExtendImageSizeParameters.java
@@ -0,0 +1,25 @@
+package org.ovirt.engine.core.common.action;
+
+import org.ovirt.engine.core.compat.Guid;
+
+public class ExtendImageSizeParameters extends ImagesActionsParametersBase {
+
+    private long newSize;
+
+    public ExtendImageSizeParameters() {
+
+    }
+
+    public ExtendImageSizeParameters(Guid imageId, long newSize) {
+        super(imageId);
+        this.newSize = newSize;
+    }
+
+    public long getNewSize() {
+        return newSize;
+    }
+
+    public void setNewSize(long newSize) {
+        this.newSize = newSize;
+    }
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
index e18f7b6..ada0b74 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
@@ -211,6 +211,7 @@
     LiveMigrateDisk(1010, QuotaDependency.NONE),
     LiveMigrateVmDisks(1011, false, QuotaDependency.STORAGE),
     MoveDisks(1012, false, QuotaDependency.NONE),
+    ExtendImageSize(1013, false, QuotaDependency.NONE),
     // Event Notification
     AddEventSubscription(1100, QuotaDependency.NONE),
     RemoveEventSubscription(1101, QuotaDependency.NONE),
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskType.java
index e5300ae..163a853 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskType.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskType.java
@@ -9,7 +9,8 @@
     deleteImage,
     mergeSnapshots,
     cloneImageStructure,
-    syncImageData;
+    syncImageData,
+    extendImageSize;
 
     public int getValue() {
         return this.ordinal();
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/ExtendImageSizeVDSCommandParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/ExtendImageSizeVDSCommandParameters.java
new file mode 100644
index 0000000..c6d5ae8
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/ExtendImageSizeVDSCommandParameters.java
@@ -0,0 +1,52 @@
+package org.ovirt.engine.core.common.vdscommands;
+
+import org.ovirt.engine.core.compat.Guid;
+
+public class ExtendImageSizeVDSCommandParameters extends 
IrsBaseVDSCommandParameters {
+
+    private Guid storagePoolId;
+    private Guid storageDomainId;
+    private Guid imageGroupId;
+    private Guid imageId;
+    private long newSize;
+
+    public Guid getStoragePoolId() {
+        return storagePoolId;
+    }
+
+    public void setStoragePoolId(Guid storagePoolId) {
+        this.storagePoolId = storagePoolId;
+    }
+
+    public Guid getStorageDomainId() {
+        return storageDomainId;
+    }
+
+    public void setStorageDomainId(Guid storageDomainId) {
+        this.storageDomainId = storageDomainId;
+    }
+
+    public Guid getImageId() {
+        return imageId;
+    }
+
+    public void setImageId(Guid imageId) {
+        this.imageId = imageId;
+    }
+
+    public Guid getImageGroupId() {
+        return imageGroupId;
+    }
+
+    public void setImageGroupId(Guid imageGroupId) {
+        this.imageGroupId = imageGroupId;
+    }
+
+    public long getNewSize() {
+        return newSize;
+    }
+
+    public void setNewSize(long newSize) {
+        this.newSize = newSize;
+    }
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/ExtendVmDiskSizeVDSCommandParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/ExtendVmDiskSizeVDSCommandParameters.java
new file mode 100644
index 0000000..3716e68
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/ExtendVmDiskSizeVDSCommandParameters.java
@@ -0,0 +1,73 @@
+package org.ovirt.engine.core.common.vdscommands;
+
+import org.ovirt.engine.core.compat.Guid;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class ExtendVmDiskSizeVDSCommandParameters extends 
VdsAndVmIDVDSParametersBase {
+
+    private long newSize;
+    private Guid storagePoolId;
+    private Guid storageDomainId;
+    private Guid imageGroupId;
+    private Guid imageId;
+
+    public ExtendVmDiskSizeVDSCommandParameters() {
+        super();
+    }
+
+    public ExtendVmDiskSizeVDSCommandParameters(Guid vdsId, Guid vmId, long 
newSize) {
+        super(vdsId, vmId);
+        this.newSize = newSize;
+    }
+
+    public long getNewSize() {
+        return newSize;
+    }
+
+    public void setNewSize(long newSize) {
+        this.newSize = newSize;
+    }
+
+    public Guid getStoragePoolId() {
+        return storagePoolId;
+    }
+
+    public void setStoragePoolId(Guid storagePoolId) {
+        this.storagePoolId = storagePoolId;
+    }
+
+    public Guid getStorageDomainId() {
+        return storageDomainId;
+    }
+
+    public void setStorageDomainId(Guid storageDomainId) {
+        this.storageDomainId = storageDomainId;
+    }
+
+    public Guid getImageGroupId() {
+        return imageGroupId;
+    }
+
+    public void setImageGroupId(Guid imageGroupId) {
+        this.imageGroupId = imageGroupId;
+    }
+
+    public Guid getImageId() {
+        return imageId;
+    }
+
+    public void setImageId(Guid imageId) {
+        this.imageId = imageId;
+    }
+
+    public Map<String, String> getDriveSpecs() {
+        Map<String, String> driveSpecs = new HashMap<String, String>();
+        driveSpecs.put("poolID", getStoragePoolId().toString());
+        driveSpecs.put("domainID", getStorageDomainId().toString());
+        driveSpecs.put("imageID", getImageGroupId().toString());
+        driveSpecs.put("volumeID", getImageId().toString());
+        return driveSpecs;
+    }
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java
index bdd5635..5f38f43 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java
@@ -111,6 +111,8 @@
     Snapshot("org.ovirt.engine.core.vdsbroker.vdsbroker"),
     UpdateVmInterface("org.ovirt.engine.core.vdsbroker.vdsbroker"),
     GetHardwareInfo("org.ovirt.engine.core.vdsbroker.vdsbroker"),
+    ExtendImageSize("org.ovirt.engine.core.vdsbroker.irsbroker"),
+    ExtendVmDiskSize("org.ovirt.engine.core.vdsbroker.vdsbroker"),
     // Gluster VDS commands
     CreateGlusterVolume("org.ovirt.engine.core.vdsbroker.gluster"),
     SetGlusterVolumeOption("org.ovirt.engine.core.vdsbroker.gluster"),
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/VdcBllMessages.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/VdcBllMessages.java
index 0487595..51033b1 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/VdcBllMessages.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/VdcBllMessages.java
@@ -672,6 +672,7 @@
     ACTION_TYPE_FAILED_DISK_NOT_EXIST,
     ACTION_TYPE_FAILED_NO_DISKS_SPECIFIED,
     ACTION_TYPE_FAILED_SOURCE_AND_TARGET_SAME,
+    ACTION_TYPE_FAILED_SHRINK_IS_NOT_SUPPORTED,
     NON_VM_NETWORK_NOT_SUPPORTED_FOR_POOL_LEVEL,
     VALIDATION_STORAGE_CONNECTION_INVALID,
     VALIDATION_STORAGE_CONNECTION_EMPTY_VFSTYPE,
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/ImageDao.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/ImageDao.java
index 17bda44..c755f9c 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/ImageDao.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/ImageDao.java
@@ -5,11 +5,15 @@
 import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.compat.NGuid;
 
+import java.util.Date;
+
 /**
  * <code>ImageDAO</code> defines a type for performing CRUD operations on 
instances of {@link Image}.
  */
 public interface ImageDao extends GenericDao<Image, Guid>, 
StatusAwareDao<Guid, ImageStatus> {
-    void updateQuotaForImageAndSnapshots(Guid imageGroupId, NGuid quotaId);
+    public void updateQuotaForImageAndSnapshots(Guid imageGroupId, NGuid 
quotaId);
 
     public void updateImageVmSnapshotId(Guid id, Guid vmSnapshotId);
+
+    public void updateImageSize(Guid id, long size, Date lastModified);
 }
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/ImageDaoDbFacadeImpl.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/ImageDaoDbFacadeImpl.java
index 31965af..2864901 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/ImageDaoDbFacadeImpl.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/ImageDaoDbFacadeImpl.java
@@ -2,6 +2,7 @@
 
 import java.sql.ResultSet;
 import java.sql.SQLException;
+import java.util.Date;
 
 import org.ovirt.engine.core.common.businessentities.Image;
 import org.ovirt.engine.core.common.businessentities.ImageStatus;
@@ -36,6 +37,15 @@
     }
 
     @Override
+    public void updateImageSize(Guid id, long size, Date lastModified) {
+        MapSqlParameterSource parameterSource = 
getCustomMapSqlParameterSource()
+                .addValue("image_group_id", id)
+                .addValue("size", size)
+                .addValue("lastModified", lastModified);
+        getCallsHandler().executeModification("UpdateImageSize", 
parameterSource);
+    }
+
+    @Override
     protected MapSqlParameterSource createFullParametersMapper(Image entity) {
         return createIdParameterMapper(entity.getId())
                 .addValue("creation_date", entity.getCreationDate())
diff --git 
a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties 
b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
index e4b886c..5ab030c 100644
--- 
a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
+++ 
b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
@@ -205,6 +205,7 @@
 ACTION_TYPE_FAILED_STORAGE_POOL_NAME_ALREADY_EXIST=Cannot ${action} ${type}. 
The Data Center name is already in use.
 ACTION_TYPE_FAILED_TEMPLATE_NOT_FOUND_ON_DESTINATION_DOMAIN=Cannot ${action} 
${type}. The selected Storage Domain does not contain the VM Template.
 ACTION_TYPE_FAILED_NO_VDS_IN_POOL=Cannot ${action} ${type}. There is no active 
Host in the Data Center.
+ACTION_TYPE_FAILED_SHRINK_IS_NOT_SUPPORTED=Cannot ${action} ${type}. The new 
size should be greater than the current.
 VAR__TYPE__HOST=$type Host
 VAR__ENTITIES__HOSTS=$entities hosts
 VAR__TYPE__NETWORK=$type Network
diff --git 
a/backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties
 
b/backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties
index 1317a38..4c985ab 100644
--- 
a/backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties
+++ 
b/backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties
@@ -159,7 +159,8 @@
 USER_TRY_BACK_TO_SNAPSHOT_FINISH_FAILURE=Failed to complete Snapshot-Preview 
${SnapshotName} for VM ${VmName}.
 USER_UPDATE_BOOKMARK=Bookmark ${BookmarkName} was updated by ${UserName}.
 USER_UPDATE_BOOKMARK_FAILED=Failed to update bookmark: ${BookmarkName} (User: 
${UserName})
-
+USER_EXTEND_DISK_SIZE_UPDATE_VM_FAILURE=Failed to update VM {VmName} with the 
new volume size. VM restart is recommended.
+USER_EXTEND_DISK_SIZE_FAILED=Failed to extend disk size ${DiskId}. (User: 
${UserName})
 USER_UPDATE_VDS=Host ${VdsName} parameters were updated by ${UserName}.
 USER_UPDATE_VM=VM ${VmName} parameters were updated by ${UserName}.
 USER_UPDATE_VM_CLUSTER_DEFAULT_HOST_CLEARED=${VmName} cluster was updated by 
${UserName}, Default host was reset to auto assign.
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/ExtendImageSizeVDSCommand.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/ExtendImageSizeVDSCommand.java
new file mode 100644
index 0000000..80688e6
--- /dev/null
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/ExtendImageSizeVDSCommand.java
@@ -0,0 +1,36 @@
+package org.ovirt.engine.core.vdsbroker.irsbroker;
+
+import org.ovirt.engine.core.common.asynctasks.AsyncTaskCreationInfo;
+import org.ovirt.engine.core.common.asynctasks.AsyncTaskType;
+import 
org.ovirt.engine.core.common.vdscommands.ExtendImageSizeVDSCommandParameters;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.vdsbroker.vdsbroker.StatusForXmlRpc;
+
+public class ExtendImageSizeVDSCommand<P extends 
ExtendImageSizeVDSCommandParameters> extends IrsBrokerCommand<P> {
+
+    private OneUuidReturnForXmlRpc result;
+
+    public ExtendImageSizeVDSCommand(P parameters) {
+        super(parameters);
+    }
+
+    @Override
+    protected void ExecuteIrsBrokerCommand() {
+        result = 
getIrsProxy().extendVolumeSize(getParameters().getStoragePoolId().toString(),
+                getParameters().getStorageDomainId().toString(),
+                getParameters().getImageGroupId().toString(),
+                getParameters().getImageId().toString(),
+                String.valueOf(getParameters().getNewSize()));
+
+        ProceedProxyReturnValue();
+
+        getVDSReturnValue().setCreationInfo(
+                new 
AsyncTaskCreationInfo(Guid.createGuidFromString(result.mUuid),
+                        AsyncTaskType.extendImageSize, 
getParameters().getStoragePoolId()));
+    }
+
+    @Override
+    protected StatusForXmlRpc getReturnStatus() {
+        return result.mStatus;
+    }
+}
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IIrsServer.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IIrsServer.java
index 048b131..e0971d2 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IIrsServer.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IIrsServer.java
@@ -84,4 +84,6 @@
     ImagesListReturnForXmlRpc getImagesList(String sdUUID);
 
     UUIDListReturnForXmlRpc getVolumesList(String sdUUID, String spUUID, 
String imgUUID);
+
+    OneUuidReturnForXmlRpc extendVolumeSize(String spUUID, String sdUUID, 
String imageUUID, String volumeUUID, String newSize);
 }
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsServerConnector.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsServerConnector.java
index e2013a7..6a9be80 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsServerConnector.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsServerConnector.java
@@ -98,4 +98,6 @@
     public Map<String, Object> getImagesList(String sdUUID);
 
     public Map<String, Object> getVolumesList(String sdUUID, String spUUID, 
String imgUUID);
+
+    public Map<String, Object> extendVolumeSize(String spUUID, String sdUUID, 
String imageUUID, String volumeUUID, String newSize);
 }
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsServerWrapper.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsServerWrapper.java
index 6bb35fb..aa745c9 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsServerWrapper.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsServerWrapper.java
@@ -280,4 +280,11 @@
         UUIDListReturnForXmlRpc wrapper = new 
UUIDListReturnForXmlRpc(xmlRpcReturnValue);
         return wrapper;
     }
+
+    @Override
+    public OneUuidReturnForXmlRpc extendVolumeSize(String spUUID, String 
sdUUID, String imageUUID, String volumeUUID, String newSize) {
+        Map<String, Object> xmlRpcReturnValue = 
irsServer.extendVolumeSize(spUUID, sdUUID, imageUUID, volumeUUID, newSize);
+        OneUuidReturnForXmlRpc wrapper = new 
OneUuidReturnForXmlRpc(xmlRpcReturnValue);
+        return wrapper;
+    }
 }
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/ExtendVmDiskSizeVDSCommand.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/ExtendVmDiskSizeVDSCommand.java
new file mode 100644
index 0000000..13a069e
--- /dev/null
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/ExtendVmDiskSizeVDSCommand.java
@@ -0,0 +1,27 @@
+package org.ovirt.engine.core.vdsbroker.vdsbroker;
+
+import 
org.ovirt.engine.core.common.vdscommands.ExtendVmDiskSizeVDSCommandParameters;
+
+public class ExtendVmDiskSizeVDSCommand <P extends 
ExtendVmDiskSizeVDSCommandParameters> extends VdsBrokerCommand<P> {
+
+    StatusOnlyReturnForXmlRpc status;
+
+    public ExtendVmDiskSizeVDSCommand(P parameters) {
+        super(parameters);
+    }
+
+    @Override
+    protected void ExecuteVdsBrokerCommand() {
+        status = getBroker().diskSizeExtend(
+                getParameters().getVmId().toString(),
+                getParameters().getDriveSpecs(),
+                String.valueOf(getParameters().getNewSize())
+        );
+        ProceedProxyReturnValue();
+    }
+
+    @Override
+    protected StatusForXmlRpc getReturnStatus() {
+        return status.mStatus;
+    }
+}
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java
index ec89a78..76005b2 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java
@@ -175,6 +175,8 @@
 
     StatusOnlyReturnForXmlRpc snapshot(String vmId, Map<String, String>[] 
snapParams);
 
+    StatusOnlyReturnForXmlRpc diskSizeExtend(String vmId, Map<String, String> 
diskParams, String newSize);
+
     // Gluster vdsm Commands
     OneUuidReturnForXmlRpc glusterVolumeCreate(String volumeName,
             String[] brickList,
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java
index 7af0e4a..c44b7f1 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java
@@ -158,6 +158,8 @@
 
     Map<String, Object> snapshot(String vmId, Map<String, String>[] 
snapParams);
 
+    public Map<String, Object> diskSizeExtend(String vmId, Map<String, String> 
diskParams, String newSize);
+
     // Gluster vdsm commands
     public Map<String, Object> glusterVolumeCreate(String volumeName,
             String[] brickList,
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java
index 82f8287..e77c3c0 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java
@@ -855,6 +855,17 @@
     }
 
     @Override
+    public StatusOnlyReturnForXmlRpc diskSizeExtend(String vmId, Map<String, 
String> diskParams, String newSize) {
+        try {
+            Map<String, Object> xmlRpcReturnValue = 
vdsServer.diskSizeExtend(vmId, diskParams, newSize);
+            StatusOnlyReturnForXmlRpc wrapper = new 
StatusOnlyReturnForXmlRpc(xmlRpcReturnValue);
+            return wrapper;
+        } catch (UndeclaredThrowableException ute) {
+            throw new XmlRpcRunTimeException(ute);
+        }
+    }
+
+    @Override
     public OneUuidReturnForXmlRpc glusterVolumeCreate(String volumeName,
             String[] brickList,
             int replicaCount,


--
To view, visit http://gerrit.ovirt.org/14975
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ie702348a68a26ac02a01f66aaa1ea42c2c675ebb
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Sergey Gotliv <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to