Utkarsh Singh has uploaded a new change for review.

Change subject: wip, webadmin: frontend integration of sparsify feature
......................................................................

wip, webadmin: frontend integration of sparsify feature

This patch adds features to call sparsify commands through
webadmin frontend. The "Sparsify Disk" context menu entry
and toolbar entry are available in main tab disk view.

The user can now see the actual size of disk images in
main tab disk view as one of the columns. The user can sort
the column by disk image size and choose which disks he
wishes to sparsify.

Any single disk image that is not attached to a virtual
machine, that is not shared,  and that is sparse, can be
selected to be sparsified. This in turn calls the sparsify
bll command.

Change-Id: I8b9ddf286038094149aaa39454ad262a54a58e21
Signed-off-by: Utkarsh <utkarshs...@gmail.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SearchQuery.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/SparsifyImageParameters.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationConstants.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/disks/DiskListModel.java
A 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/SparsifyDiskModel.java
M 
frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/PresenterModule.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/DiskModule.java
A 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/vm/VmDiskSparsifyPopupPresenterWidget.java
A 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/vm/VmDiskSparsifyPopupView.java
A 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/vm/VmDiskSparsifyPopupView.ui.xml
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/MainTabDiskView.java
13 files changed, 544 insertions(+), 1 deletion(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/08/31308/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SearchQuery.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SearchQuery.java
index 0266395..1c1139e 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SearchQuery.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SearchQuery.java
@@ -14,6 +14,8 @@
 import org.ovirt.engine.core.bll.quota.QuotaManager;
 import org.ovirt.engine.core.common.businessentities.AuditLog;
 import org.ovirt.engine.core.common.businessentities.Disk;
+import org.ovirt.engine.core.common.businessentities.Disk.DiskStorageType;
+import org.ovirt.engine.core.common.businessentities.DiskImage;
 import org.ovirt.engine.core.common.businessentities.IVdcQueryable;
 import org.ovirt.engine.core.common.businessentities.Provider;
 import org.ovirt.engine.core.common.businessentities.Quota;
@@ -298,7 +300,19 @@
     }
 
     private List<Disk> searchDisk() {
-        return genericSearch(getDbFacade().getDiskDao(), true);
+        List<Disk> allDisks = genericSearch(getDbFacade().getDiskDao(), true);
+
+        for (Disk disk : allDisks) {
+            if (disk.getDiskStorageType() == DiskStorageType.IMAGE) {
+                DiskImage diskImage = (DiskImage) disk;
+                diskImage.getSnapshots().addAll(
+                        ImagesHandler.getAllImageSnapshots(
+                                diskImage.getImageId(),
+                                diskImage.getImageTemplateId()));
+            }
+        }
+
+        return allDisks;
     }
 
     private List<GlusterVolumeEntity> searchGlusterVolumes() {
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/SparsifyImageParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/SparsifyImageParameters.java
new file mode 100644
index 0000000..a61da26
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/SparsifyImageParameters.java
@@ -0,0 +1,132 @@
+package org.ovirt.engine.core.common.action;
+
+import java.util.ArrayList;
+import java.util.Map;
+
+import org.ovirt.engine.core.common.VdcObjectType;
+import org.ovirt.engine.core.common.asynctasks.EntityInfo;
+import org.ovirt.engine.core.common.businessentities.DiskImage;
+import org.ovirt.engine.core.compat.Guid;
+
+public class SparsifyImageParameters extends ImagesActionsParametersBase {
+
+    private static final long serialVersionUID = -511590961717689124L;
+
+    private DiskImage srcImage;
+    private DiskImage destImage;
+    private DiskImage tempImage;
+
+    // Members used to persist data during command execution
+    private SparsifyDiskStep commandStep;
+    private SparsifyDiskStep nextCommandStep;
+    private Map<SparsifyDiskStep, Guid> childCommands;
+    private boolean createDestinationCommandComplete;
+    private boolean sparsifyCommandComplete;
+
+    public SparsifyImageParameters() {
+        super();
+        setSparsifyCommandComplete(true);
+        initParams();
+    }
+
+    public void initParams() {
+        if (srcImage != null) {
+            if (destImage == null) {
+                DiskImage dImage = getClonedDiskImage(this.srcImage);
+                dImage.setDiskAlias(dImage.getDiskAlias() + "_sparse");
+                setDestinationDiskImage(dImage);
+            }
+        }
+        setImportEntity(true);
+    }
+
+    @Override
+    public Guid getStorageDomainId() {
+        return srcImage.getStorageIds().get(0);
+    }
+
+    public DiskImage getSourceDiskImage() {
+        return srcImage;
+    }
+
+    public void setSourceDiskImage(DiskImage diskImage) {
+        this.srcImage = diskImage;
+
+        setEntityInfo(new EntityInfo(VdcObjectType.Disk, 
srcImage.getImageId()));
+        setImageId(srcImage.getImageId());
+        setImageGroupID(srcImage.getId());
+    }
+
+    public DiskImage getDestinationDiskImage() {
+        return destImage;
+    }
+
+    public void setDestinationDiskImage(DiskImage diskImage) {
+        this.destImage = diskImage;
+
+        setDestinationImageId(destImage.getImageId());
+    }
+
+    public DiskImage getTempDiskImage() {
+        return tempImage;
+    }
+
+    public void setTempDiskImage(DiskImage diskImage) {
+        this.tempImage = diskImage;
+    }
+
+    public SparsifyDiskStep getCommandStep() {
+        return commandStep;
+    }
+
+    public void setCommandStep(SparsifyDiskStep commandStep) {
+        this.commandStep = commandStep;
+    }
+
+    public SparsifyDiskStep getNextCommandStep() {
+        return nextCommandStep;
+    }
+
+    public void setNextCommandStep(SparsifyDiskStep nextCommandStep) {
+        this.nextCommandStep = nextCommandStep;
+    }
+
+    public Map<SparsifyDiskStep, Guid> getChildCommands() {
+        return childCommands;
+    }
+
+    public void setChildCommands(Map<SparsifyDiskStep, Guid> childCommands) {
+        this.childCommands = childCommands;
+    }
+
+    public boolean isCreateDestinationCommandComplete() {
+        return createDestinationCommandComplete;
+    }
+
+    public void setCreateDestinationCommandComplete(boolean 
createDestinationCommandComplete) {
+        this.createDestinationCommandComplete = 
createDestinationCommandComplete;
+    }
+
+    public boolean isSparsifyCommandComplete() {
+        return sparsifyCommandComplete;
+    }
+
+    public void setSparsifyCommandComplete(boolean sparsifyCommandComplete) {
+        this.sparsifyCommandComplete = sparsifyCommandComplete;
+    }
+
+    private DiskImage getClonedDiskImage(DiskImage srcDiskImage) {
+        Guid storageDomainId = srcDiskImage.getStorageIds().get(0);
+        Guid imageGroupId = Guid.newGuid();
+        Guid imageId = Guid.newGuid();
+
+        DiskImage dstDiskImage = DiskImage.copyOf(srcDiskImage);
+        ArrayList<Guid> storageIds = new ArrayList<Guid>();
+        storageIds.add(storageDomainId);
+        dstDiskImage.setStorageIds(storageIds);
+        dstDiskImage.setId(imageGroupId);
+        dstDiskImage.setImageId(imageId);
+
+        return dstDiskImage;
+    }
+}
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 9453c0a..79fc298 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
@@ -152,6 +152,7 @@
     Merge(237, QuotaDependency.STORAGE),
     MergeStatus(238, QuotaDependency.NONE),
     DestroyImage(239, QuotaDependency.STORAGE),
+    Sparsify(240, QuotaDependency.NONE),
     // VmPoolCommands
     AddVmPool(301, QuotaDependency.NONE),
     AddVmPoolWithVms(304, ActionGroup.CREATE_VM_POOL, QuotaDependency.BOTH),
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationConstants.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationConstants.java
index 56da05e..bebafd4 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationConstants.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationConstants.java
@@ -915,6 +915,9 @@
     @DefaultStringValue("Scan Alignment")
     String getDiskAlignment();
 
+    @DefaultStringValue("Sparsify Disk")
+    String sparsifyDisk();
+
     @DefaultStringValue("Export")
     String exportDisk();
 
@@ -1610,6 +1613,9 @@
     @DefaultStringValue("Are you sure you want to remove the following items?")
     String removeConfirmationPopupMessage();
 
+    @DefaultStringValue("The following disk is about to be sparsified")
+    String sparsifyConfirmationPopupMessage();
+
     @DefaultStringValue("Soundcard enabled")
     String soundcardEnabled();
 
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/disks/DiskListModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/disks/DiskListModel.java
index fde26fe..6e7d7a9 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/disks/DiskListModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/disks/DiskListModel.java
@@ -7,6 +7,7 @@
 import org.ovirt.engine.core.common.action.ChangeQuotaParameters;
 import org.ovirt.engine.core.common.action.GetDiskAlignmentParameters;
 import org.ovirt.engine.core.common.action.RemoveDiskParameters;
+import org.ovirt.engine.core.common.action.SparsifyImageParameters;
 import org.ovirt.engine.core.common.action.VdcActionParametersBase;
 import org.ovirt.engine.core.common.action.VdcActionType;
 import org.ovirt.engine.core.common.businessentities.Disk;
@@ -14,6 +15,7 @@
 import org.ovirt.engine.core.common.businessentities.DiskImage;
 import org.ovirt.engine.core.common.businessentities.ImageStatus;
 import org.ovirt.engine.core.common.businessentities.Quota;
+import org.ovirt.engine.core.common.businessentities.VolumeType;
 import org.ovirt.engine.core.common.interfaces.SearchType;
 import org.ovirt.engine.core.common.mode.ApplicationMode;
 import org.ovirt.engine.core.common.queries.SearchParameters;
@@ -40,6 +42,7 @@
 import org.ovirt.engine.ui.uicommonweb.models.vms.MoveDiskModel;
 import org.ovirt.engine.ui.uicommonweb.models.vms.NewDiskModel;
 import org.ovirt.engine.ui.uicommonweb.models.vms.RemoveDiskModel;
+import org.ovirt.engine.ui.uicommonweb.models.vms.SparsifyDiskModel;
 import org.ovirt.engine.ui.uicompat.ConstantsManager;
 import org.ovirt.engine.ui.uicompat.FrontendMultipleActionAsyncResult;
 import org.ovirt.engine.ui.uicompat.IFrontendMultipleActionAsyncCallback;
@@ -108,6 +111,18 @@
     private void setScanAlignmentCommand(UICommand value)
     {
         privateScanAlignmentCommand = value;
+    }
+
+    private UICommand privateSparsifyCommand;
+
+    public UICommand getSparsifyCommand()
+    {
+        return privateSparsifyCommand;
+    }
+
+    private void setSparsifyCommand(UICommand value)
+    {
+        privateSparsifyCommand = value;
     }
 
     private UICommand exportCommand;
@@ -189,6 +204,7 @@
         setChangeQuotaCommand(new UICommand("changeQuota", this)); 
//$NON-NLS-1$
         setCopyCommand(new UICommand("Copy", this)); //$NON-NLS-1$
         setScanAlignmentCommand(new UICommand("Check Alignment", this)); 
//$NON-NLS-1$
+        setSparsifyCommand(new UICommand("Sparsify Disk", this)); //$NON-NLS-1$
         setExportCommand(new UICommand("Export", this)); //$NON-NLS-1$
 
         updateActionAvailability();
@@ -334,6 +350,59 @@
                 new IFrontendMultipleActionAsyncCallback() {
                     @Override
                     public void executed(FrontendMultipleActionAsyncResult 
result) {
+                    }
+                },
+                this);
+    }
+
+    private void sparsify()
+    {
+        @SuppressWarnings("unchecked")
+        ArrayList<DiskImage> disks = (ArrayList<DiskImage>) getSelectedItems();
+
+        if (disks == null || getWindow() != null || disks.size() != 1)
+        {
+            return;
+        }
+
+        DiskImage disk = disks.get(0);
+        SparsifyDiskModel model = new SparsifyDiskModel(disk);
+        ArrayList<DiskModel> items = new ArrayList<DiskModel>();
+        DiskModel diskModel = new DiskModel();
+
+        diskModel.setDisk(disk);
+        diskModel.setAlias(new EntityModel<String>(disk.getDiskAlias()));
+        diskModel.setSourceStorageDomainName(new 
EntityModel<String>(disk.getStoragesNames().get(0)));
+        items.add(diskModel);
+
+        setWindow(model);
+
+        
model.setTitle(ConstantsManager.getInstance().getConstants().sparsifyDiskTitle());
+        // model.setHelpTag(HelpTag.remove_disk);
+        model.setHashName("sparsify_disk"); //$NON-NLS-1$
+        model.setEntity(this);
+        model.setItems(items);
+        model.prepareCommands(this);
+    }
+
+    private void onSparsify()
+    {
+        SparsifyDiskModel model = (SparsifyDiskModel) getWindow();
+        ArrayList<VdcActionParametersBase> paramerterList = new 
ArrayList<VdcActionParametersBase>();
+
+        VdcActionParametersBase parameters = new SparsifyImageParameters();
+        ((SparsifyImageParameters) 
parameters).setSourceDiskImage(model.getDiskImage());
+        paramerterList.add(parameters);
+
+        model.startProgress(null);
+
+        Frontend.getInstance().runMultipleAction(VdcActionType.Sparsify, 
paramerterList,
+                new IFrontendMultipleActionAsyncCallback() {
+                    @Override
+                    public void executed(FrontendMultipleActionAsyncResult 
result) {
+                        DiskListModel localModel = (DiskListModel) 
result.getState();
+                        localModel.stopProgress();
+                        cancel();
                     }
                 },
                 this);
@@ -525,6 +594,7 @@
         getRemoveCommand().setIsExecutionAllowed(disks != null && disks.size() 
> 0 && isRemoveCommandAvailable());
         getScanAlignmentCommand().setIsExecutionAllowed(
                 disks != null && disks.size() > 0 && 
isScanAlignmentCommandAvailable());
+        
getSparsifyCommand().setIsExecutionAllowed(isSparsifyCommandAvailable());
         getExportCommand().setIsExecutionAllowed(isExportCommandAvailable());
         updateCopyAndMoveCommandAvailability(disks);
 
@@ -608,6 +678,37 @@
         return true;
     }
 
+    private boolean isSparsifyCommandAvailable() {
+        ArrayList<Disk> disks =
+                getSelectedItems() != null ? Linq.<Disk> 
cast(getSelectedItems()) : new ArrayList<Disk>();
+
+        if (disks.size() != 1)
+        {
+            return false;
+        }
+
+        for (Disk disk : disks)
+        {
+            if (disk.getDiskStorageType() != DiskStorageType.IMAGE) {
+                return false;
+            }
+
+            DiskImage diskImage = (DiskImage) disk;
+
+            if (diskImage.getVolumeType() != VolumeType.Sparse) {
+                return false;
+            } else if (diskImage.getImageStatus() != ImageStatus.OK) {
+                return false;
+            } else if (disk.getNumberOfVms() != 0) {
+                return false;
+            } else if (disk.getReadOnly() != null && disk.getReadOnly()) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
     private boolean isExportCommandAvailable() {
         ArrayList<Disk> disks = (ArrayList<Disk>) getSelectedItems();
 
@@ -672,6 +773,10 @@
         {
             export();
         }
+        else if (command == getSparsifyCommand())
+        {
+            sparsify();
+        }
         else if ("Cancel".equals(command.getName())) //$NON-NLS-1$
         {
             cancel();
@@ -683,6 +788,10 @@
         else if ("OnRemove".equals(command.getName())) //$NON-NLS-1$
         {
             onRemove();
+        }
+        else if ("OnSparsify".equals(command.getName())) //$NON-NLS-1$
+        {
+            onSparsify();
         } else if (command == getChangeQuotaCommand()) {
             changeQuota();
         } else if (command.getName().equals("onChangeQuota")) { //$NON-NLS-1$
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/SparsifyDiskModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/SparsifyDiskModel.java
new file mode 100644
index 0000000..9dbdb2c
--- /dev/null
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/SparsifyDiskModel.java
@@ -0,0 +1,57 @@
+package org.ovirt.engine.ui.uicommonweb.models.vms;
+
+import org.ovirt.engine.core.common.businessentities.DiskImage;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.ui.uicommonweb.ICommandTarget;
+import org.ovirt.engine.ui.uicommonweb.UICommand;
+import org.ovirt.engine.ui.uicommonweb.models.ConfirmationModel;
+import org.ovirt.engine.ui.uicompat.ConstantsManager;
+
+public class SparsifyDiskModel extends ConfirmationModel {
+
+    private DiskImage disk;
+    private Guid storageDomain;
+
+    public DiskImage getDiskImage() {
+        return disk;
+    }
+
+    public void setDiskImage(DiskImage disk) {
+        if (disk != this.disk) {
+            this.disk = disk;
+            setStorageDomain(disk.getStorageIds().get(0));
+        }
+    }
+
+    public void prepareCommands(ICommandTarget target) {
+        UICommand onSparsifyCommand =
+                new UICommand("OnSparsify", target); //$NON-NLS-1$
+        
onSparsifyCommand.setTitle(ConstantsManager.getInstance().getConstants().ok());
+        onSparsifyCommand.setIsDefault(true);
+        getCommands().add(onSparsifyCommand);
+
+        UICommand cancelCommand = new UICommand("Cancel", target); 
//$NON-NLS-1$
+        
cancelCommand.setTitle(ConstantsManager.getInstance().getConstants().cancel());
+        cancelCommand.setIsCancel(true);
+        getCommands().add(cancelCommand);
+    }
+
+    public Guid getStorageDomain() {
+        return storageDomain;
+    }
+
+    public void setStorageDomain(Guid storageDomain) {
+        this.storageDomain = storageDomain;
+    }
+
+    public SparsifyDiskModel(DiskImage disk) {
+        setDiskImage(disk);
+    }
+
+    @Override
+    public boolean validate()
+    {
+        return true;
+    }
+
+}
diff --git 
a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java
 
b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java
index edb57a8..c0b2ead 100644
--- 
a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java
+++ 
b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java
@@ -582,6 +582,9 @@
     @DefaultStringValue("Remove Disk(s)")
     String removeDisksTitle();
 
+    @DefaultStringValue("Sparsify Disk")
+    String sparsifyDiskTitle();
+
     @DefaultStringValue("Move Disk(s)")
     String moveDisksTitle();
 
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/PresenterModule.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/PresenterModule.java
index 1e85680..f7c3863 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/PresenterModule.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/PresenterModule.java
@@ -99,6 +99,7 @@
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.vm.VmClonePopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.vm.VmDiskPopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.vm.VmDiskRemovePopupPresenterWidget;
+import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.vm.VmDiskSparsifyPopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.vm.VmExportPopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.vm.VmInterfacePopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.vm.VmMakeTemplatePopupPresenterWidget;
@@ -327,6 +328,7 @@
 import 
org.ovirt.engine.ui.webadmin.section.main.view.popup.vm.VmClonePopupView;
 import org.ovirt.engine.ui.webadmin.section.main.view.popup.vm.VmDiskPopupView;
 import 
org.ovirt.engine.ui.webadmin.section.main.view.popup.vm.VmDiskRemovePopupView;
+import 
org.ovirt.engine.ui.webadmin.section.main.view.popup.vm.VmDiskSparsifyPopupView;
 import 
org.ovirt.engine.ui.webadmin.section.main.view.popup.vm.VmExportPopupView;
 import 
org.ovirt.engine.ui.webadmin.section.main.view.popup.vm.VmInterfacePopupView;
 import 
org.ovirt.engine.ui.webadmin.section.main.view.popup.vm.VmMakeTemplatePopupView;
@@ -1304,6 +1306,11 @@
                 VmDiskRemovePopupPresenterWidget.ViewDef.class,
                 VmDiskRemovePopupView.class);
 
+        // Disk Sparsify
+        bindPresenterWidget(VmDiskSparsifyPopupPresenterWidget.class,
+                VmDiskSparsifyPopupPresenterWidget.ViewDef.class,
+                VmDiskSparsifyPopupView.class);
+
         // Edit Template
         bindPresenterWidget(TemplateNewPresenterWidget.class,
                 TemplateNewPresenterWidget.ViewDef.class,
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/DiskModule.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/DiskModule.java
index 8b1acd8..9f70c36 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/DiskModule.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/DiskModule.java
@@ -30,6 +30,7 @@
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage.ImportExportImagePopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.vm.VmDiskPopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.vm.VmDiskRemovePopupPresenterWidget;
+import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.vm.VmDiskSparsifyPopupPresenterWidget;
 
 import com.google.gwt.event.shared.EventBus;
 import com.google.gwt.inject.client.AbstractGinModule;
@@ -47,6 +48,7 @@
             Provider<DefaultConfirmationPopupPresenterWidget> 
defaultConfirmPopupProvider,
             final Provider<VmDiskPopupPresenterWidget> newPopupProvider,
             final Provider<VmDiskRemovePopupPresenterWidget> 
removeConfirmPopupProvider,
+            final Provider<VmDiskSparsifyPopupPresenterWidget> 
sparsifyConfirmPopupProvider,
             final Provider<DisksAllocationPopupPresenterWidget> 
moveOrCopyPopupProvider,
             final Provider<ChangeQuotaPopupPresenterWidget> 
changeQutoaPopupProvider,
             final Provider<ImportExportImagePopupPresenterWidget> 
importExportImagePopupPresenterWidgetProvider) {
@@ -74,6 +76,8 @@
                     UICommand lastExecutedCommand) {
                 if (lastExecutedCommand == getModel().getRemoveCommand()) {
                     return removeConfirmPopupProvider.get();
+                } else if (lastExecutedCommand == 
getModel().getSparsifyCommand()) {
+                    return sparsifyConfirmPopupProvider.get();
                 } else {
                     return super.getConfirmModelPopup(source, 
lastExecutedCommand);
                 }
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/vm/VmDiskSparsifyPopupPresenterWidget.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/vm/VmDiskSparsifyPopupPresenterWidget.java
new file mode 100644
index 0000000..5c208b6
--- /dev/null
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/vm/VmDiskSparsifyPopupPresenterWidget.java
@@ -0,0 +1,19 @@
+package org.ovirt.engine.ui.webadmin.section.main.presenter.popup.vm;
+
+import 
org.ovirt.engine.ui.common.presenter.AbstractModelBoundPopupPresenterWidget;
+import org.ovirt.engine.ui.uicommonweb.models.ConfirmationModel;
+
+import com.google.gwt.event.shared.EventBus;
+import com.google.inject.Inject;
+
+public class VmDiskSparsifyPopupPresenterWidget extends 
AbstractModelBoundPopupPresenterWidget<ConfirmationModel, 
VmDiskSparsifyPopupPresenterWidget.ViewDef> {
+
+    public interface ViewDef extends 
AbstractModelBoundPopupPresenterWidget.ViewDef<ConfirmationModel> {
+    }
+
+    @Inject
+    public VmDiskSparsifyPopupPresenterWidget(EventBus eventBus, ViewDef view) 
{
+        super(eventBus, view);
+    }
+
+}
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/vm/VmDiskSparsifyPopupView.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/vm/VmDiskSparsifyPopupView.java
new file mode 100644
index 0000000..63ed6c8
--- /dev/null
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/vm/VmDiskSparsifyPopupView.java
@@ -0,0 +1,155 @@
+package org.ovirt.engine.ui.webadmin.section.main.view.popup.vm;
+
+import java.util.ArrayList;
+
+import org.ovirt.engine.core.common.businessentities.DiskImage;
+import org.ovirt.engine.core.common.utils.SizeConverter;
+import org.ovirt.engine.ui.common.CommonApplicationConstants;
+import org.ovirt.engine.ui.common.CommonApplicationMessages;
+import org.ovirt.engine.ui.common.CommonApplicationResources;
+import org.ovirt.engine.ui.common.idhandler.ElementIdHandler;
+import org.ovirt.engine.ui.common.view.popup.AbstractConfirmationPopupView;
+import org.ovirt.engine.ui.common.widget.dialog.SimpleDialogPanel;
+import org.ovirt.engine.ui.uicommonweb.models.ConfirmationModel;
+import org.ovirt.engine.ui.uicommonweb.models.vms.DiskModel;
+import org.ovirt.engine.ui.uicompat.Event;
+import org.ovirt.engine.ui.uicompat.EventArgs;
+import org.ovirt.engine.ui.uicompat.IEventListener;
+import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.vm.VmDiskSparsifyPopupPresenterWidget;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.editor.client.SimpleBeanEditorDriver;
+import com.google.gwt.event.shared.EventBus;
+import com.google.gwt.safehtml.shared.SafeHtmlUtils;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.uibinder.client.UiField;
+import com.google.gwt.user.client.ui.HTML;
+import com.google.inject.Inject;
+
+public class VmDiskSparsifyPopupView extends AbstractConfirmationPopupView 
implements VmDiskSparsifyPopupPresenterWidget.ViewDef {
+
+    interface Driver extends SimpleBeanEditorDriver<ConfirmationModel, 
VmDiskSparsifyPopupView> {
+    }
+
+    interface ViewUiBinder extends UiBinder<SimpleDialogPanel, 
VmDiskSparsifyPopupView> {
+        ViewUiBinder uiBinder = GWT.create(ViewUiBinder.class);
+    }
+
+    interface ViewIdHandler extends ElementIdHandler<VmDiskSparsifyPopupView> {
+        ViewIdHandler idHandler = GWT.create(ViewIdHandler.class);
+    }
+
+    protected final CommonApplicationMessages messages;
+    protected final CommonApplicationConstants constants;
+
+    ArrayList<String> notes = new ArrayList<String>();
+
+    @UiField
+    @Ignore
+    public HTML diskAlias;
+
+    @UiField
+    @Ignore
+    public HTML diskDomain;
+
+    @UiField
+    @Ignore
+    public HTML diskSizeVirtual;
+
+    @UiField
+    @Ignore
+    public HTML diskSizeActual;
+
+    private final Driver driver = GWT.create(Driver.class);
+
+    @Inject
+    public VmDiskSparsifyPopupView(EventBus eventBus,
+            CommonApplicationResources resources,
+            CommonApplicationMessages messages,
+            CommonApplicationConstants constants) {
+        super(eventBus, resources);
+        initWidget(ViewUiBinder.uiBinder.createAndBindUi(this));
+        ViewIdHandler.idHandler.generateAndSetIds(this);
+        driver.initialize(this);
+        this.constants = constants;
+        this.messages = messages;
+    }
+
+    @Override
+    public void setMessage(String message) {
+        super.setMessage(constants.sparsifyConfirmationPopupMessage());
+    }
+
+    @Override
+    public void setItems(Iterable<?> items) {
+        if (items != null)
+            addItems(items);
+        else
+            clearItems();
+    }
+
+    protected void clearItems() {
+        diskAlias.setHTML(new String());
+        diskDomain.setHTML(new String());
+        diskSizeVirtual.setHTML(new String());
+        diskSizeActual.setHTML(new String());
+    }
+
+    protected void addItems(Iterable<?> items) {
+        for (Object item : items) {
+            addItemText(item);
+        }
+    }
+
+    protected void addItemText(Object item) {
+        DiskModel diskModel = (DiskModel) item;
+
+        if (diskModel.getDisk() instanceof DiskImage) {
+            DiskImage disk = (DiskImage) diskModel.getDisk();
+            notes.clear();
+
+            Number virtualSize =
+                    SizeConverter.convert(disk.getSize(), 
SizeConverter.SizeUnit.BYTES, SizeConverter.SizeUnit.GB);
+
+            diskAlias.setHTML(SafeHtmlUtils.fromSafeConstant("<b>" + 
disk.getDiskAlias() + "</b>")); //$NON-NLS-1$ //$NON-NLS-2$
+            diskDomain.setHTML(SafeHtmlUtils.fromSafeConstant("<b> Storage 
Domain: </b>" + diskModel.getSourceStorageDomainName().getEntity())); 
//$NON-NLS-1$
+            diskSizeVirtual.setHTML(SafeHtmlUtils.fromSafeConstant("<b> 
Virtual Size: </b>" + virtualSize + " GB")); //$NON-NLS-1$ //$NON-NLS-2$
+            diskSizeActual.setHTML(SafeHtmlUtils.fromSafeConstant("<b> Actual 
Size: </b>" + disk.getActualSize() + " GB")); //$NON-NLS-1$ //$NON-NLS-2$
+        }
+    }
+
+    String getItemTextFormatted(String itemText) {
+        return "- " + itemText; //$NON-NLS-1$
+    }
+
+    String getFormattedNote() {
+        StringBuilder formattedNote = new StringBuilder(constants.empty());
+
+        for (int i = 0; i < notes.size(); i++) {
+            String note = notes.get(i);
+            
formattedNote.append(constants.lineBreak()).append(constants.htmlTab()).append(note);
+        }
+
+        return formattedNote.toString();
+    }
+
+    @Override
+    public void edit(final ConfirmationModel object) {
+        driver.edit(object);
+
+        object.getItemsChangedEvent().addListener(new IEventListener() {
+            @SuppressWarnings("unchecked")
+            @Override
+            public void eventRaised(Event ev, Object sender, EventArgs args) {
+                ArrayList<String> items = (ArrayList<String>) 
object.getItems();
+                setItems(items);
+            }
+        });
+    }
+
+    @Override
+    public ConfirmationModel flush() {
+        return driver.flush();
+    }
+
+}
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/vm/VmDiskSparsifyPopupView.ui.xml
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/vm/VmDiskSparsifyPopupView.ui.xml
new file mode 100644
index 0000000..6f8efa2
--- /dev/null
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/vm/VmDiskSparsifyPopupView.ui.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent";>
+<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" 
xmlns:g="urn:import:com.google.gwt.user.client.ui"
+       xmlns:d="urn:import:org.ovirt.engine.ui.common.widget.dialog" 
xmlns:ge="urn:import:org.ovirt.engine.ui.common.widget.editor.generic">
+
+       <ui:style>
+               
.messageHTML,.diskAlias,.diskDomain,.diskSizeVirtual,.diskSizeActual {
+                       margin: 5px;
+               }
+       </ui:style>
+
+       <d:SimpleDialogPanel width="500px" height="400px">
+               <d:content>
+                       <g:FlowPanel>
+                               <g:HTML ui:field="messageHTML" 
addStyleNames="{style.messageHTML}" />
+                               <g:HTML ui:field="diskAlias" 
addStyleNames="{style.diskAlias}" />
+                               <g:HTML ui:field="diskDomain" 
addStyleNames="{style.diskDomain}" />
+                               <g:HTML ui:field="diskSizeVirtual" 
addStyleNames="{style.diskSizeVirtual}" />
+                               <g:HTML ui:field="diskSizeActual" 
addStyleNames="{style.diskSizeActual}" />
+                       </g:FlowPanel>
+               </d:content>
+       </d:SimpleDialogPanel>
+
+</ui:UiBinder>
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/MainTabDiskView.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/MainTabDiskView.java
index 4ae10a0..e2a91a1 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/MainTabDiskView.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/MainTabDiskView.java
@@ -51,6 +51,7 @@
     private static TextColumnWithTooltip<Disk> aliasColumn;
     private static TextColumnWithTooltip<Disk> idColumn;
     private static DiskSizeColumn sizeColumn;
+    private static DiskSizeColumn<Disk> actualSizeColumn;
     private static TextColumnWithTooltip<Disk> allocationColumn;
     private static TextColumnWithTooltip<Disk> dateCreatedColumn;
     private static TextColumnWithTooltip<Disk> statusColumn;
@@ -156,6 +157,9 @@
                 "110px"); //$NON-NLS-1$
 
         getTable().ensureColumnPresent(
+                actualSizeColumn, constants.sizeDisk(), all || images || luns, 
"110px"); //$NON-NLS-1$
+
+        getTable().ensureColumnPresent(
                 allocationColumn, constants.allocationDisk(), images,
                 "130px"); //$NON-NLS-1$
 
@@ -197,6 +201,7 @@
         aliasColumn = 
DisksViewColumns.getAliasColumn(DiskConditionFieldAutoCompleter.ALIAS);
         idColumn = 
DisksViewColumns.getIdColumn(DiskConditionFieldAutoCompleter.ID);
         sizeColumn = 
DisksViewColumns.getSizeColumn(DiskConditionFieldAutoCompleter.PROVISIONED_SIZE);
+        actualSizeColumn = 
DisksViewColumns.getActualSizeColumn(DiskConditionFieldAutoCompleter.ACTUAL_SIZE);
         allocationColumn = 
DisksViewColumns.getAllocationColumn(constants.empty());
         dateCreatedColumn = 
DisksViewColumns.getDateCreatedColumn(DiskConditionFieldAutoCompleter.CREATION_DATE);
         statusColumn = 
DisksViewColumns.getStatusColumn(DiskConditionFieldAutoCompleter.STATUS);
@@ -253,6 +258,13 @@
             }
         });
 
+        getTable().addActionButton(new 
WebAdminButtonDefinition<Disk>(constants.sparsifyDisk()) {
+            @Override
+            protected UICommand resolveCommand() {
+                return getMainModel().getSparsifyCommand();
+            }
+        });
+
         getTable().addActionButton(new 
WebAdminButtonDefinition<Disk>(constants.exportDisk()) {
             @Override
             protected UICommand resolveCommand() {


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I8b9ddf286038094149aaa39454ad262a54a58e21
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Utkarsh Singh <utkarshs...@gmail.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to