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