Daniel Erez has uploaded a new change for review. Change subject: webadmin: Storage Snapshots sub-tab ......................................................................
webadmin: Storage Snapshots sub-tab Introducing new sub-tab: Storage -> Snapshots (includes all disks snapshots that reside on the selected storage domain). Change-Id: I888dad6a3f7ac876a859ce5e8e371599d0873b22 Feature-Page: http://www.ovirt.org/Features/Snapshots_Overview Signed-off-by: Daniel Erez <[email protected]> --- M frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java M frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationConstants.java M frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/disks/DisksViewColumns.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/help/HelpTag.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageListModel.java A frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageSnapshotListModel.java M frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIMessages.java M frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/ClientGinjectorExtension.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/StorageModule.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/place/ApplicationPlaces.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/tab/storage/SubTabStorageEventPresenter.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/tab/storage/SubTabStoragePermissionPresenter.java A frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/tab/storage/SubTabStorageSnapshotPresenter.java A frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/storage/SubTabStorageSnapshotView.java M frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties 17 files changed, 428 insertions(+), 3 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/29/26329/1 diff --git a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java index b5c1784..f8182a5 100644 --- a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java +++ b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java @@ -775,6 +775,9 @@ @DefaultStringValue("$type iSCSI Bond") String VAR__TYPE__ISCSI_BOND(); + @DefaultStringValue("$type Disk Snapshot") + String VAR__TYPE__DISK__SNAPSHOT(); + @DefaultStringValue("$action run") String VAR__ACTION__RUN(); 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 b45d863..7bd2300 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 @@ -340,6 +340,9 @@ @DefaultStringValue("Disks") String disksLabel(); + @DefaultStringValue("Snapshots") + String snapshotsLabel(); + @DefaultStringValue("Statistics") String statistics(); @@ -864,6 +867,15 @@ @DefaultStringValue("Actual Size") String sizeDisk(); + @DefaultStringValue("Size") + String diskSnapshotSize(); + + @DefaultStringValue("Disk Alias") + String diskSnapshotAlias(); + + @DefaultStringValue("Snapshot Description") + String diskSnapshotDescription(); + @DefaultStringValue("Storage Domain") String storageDomainDisk(); diff --git a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/disks/DisksViewColumns.java b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/disks/DisksViewColumns.java index 991b718..8499a91 100644 --- a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/disks/DisksViewColumns.java +++ b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/disks/DisksViewColumns.java @@ -292,4 +292,18 @@ return diskModel.getDisk().getReadOnly(); } }; + + public static final DiskSizeColumn<Disk> snapshotSizeColumn = new DiskSizeColumn<Disk>(SizeConverter.SizeUnit.GB) { + @Override + protected Long getRawValue(Disk object) { + return Math.round(((DiskImage) object).getActualSize()); + } + }; + + public static final TextColumnWithTooltip<Disk> snapshotDescriptionColumn = new TextColumnWithTooltip<Disk>() { + @Override + public String getValue(Disk object) { + return ((DiskImage) object).getVmSnapshotDescription(); + } + }; } diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/help/HelpTag.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/help/HelpTag.java index b90258c..561e9bb 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/help/HelpTag.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/help/HelpTag.java @@ -456,7 +456,9 @@ stop_virtual_machine("stop_virtual_machine", HelpTagType.WEBADMIN, "VMs main tab -> Power Off confirmation dialog"), //$NON-NLS-1$ //$NON-NLS-2$ - reboot_virtual_machine("reboot_virtual_machine", HelpTagType.WEBADMIN, "VMs main tab -> Reboot confirmation dialog"); //$NON-NLS-1$ //$NON-NLS-2$ + reboot_virtual_machine("reboot_virtual_machine", HelpTagType.WEBADMIN, "VMs main tab -> Reboot confirmation dialog"), //$NON-NLS-1$ //$NON-NLS-2$ + + remove_disk_snapshot("remove_disk_snapshot", HelpTagType.WEBADMIN, "Storage Tab > Snapshots Sub-Tab > Remove Disk Snapshot(s)"); //$NON-NLS-1$ //$NON-NLS-2$ public final String name; diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageListModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageListModel.java index 4e870c6..3c3edef 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageListModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageListModel.java @@ -193,6 +193,7 @@ private ListModel templateListModel; private ListModel isoListModel; private ListModel diskListModel; + private ListModel snapshotListModel; public StorageDomainStatic storageDomain; public TaskContext context; @@ -235,6 +236,9 @@ diskListModel = new StorageDiskListModel(); diskListModel.setIsAvailable(false); + snapshotListModel = new StorageSnapshotListModel(); + snapshotListModel.setIsAvailable(false); + ObservableCollection<EntityModel> list = new ObservableCollection<EntityModel>(); list.add(generalModel); list.add(dcListModel); @@ -244,6 +248,7 @@ list.add(templateListModel); list.add(isoListModel); list.add(diskListModel); + list.add(snapshotListModel); list.add(new StorageEventListModel()); list.add(new PermissionListModel()); setDetailModels(list); @@ -1054,6 +1059,7 @@ vmListModel.setIsAvailable(isDataStorage); templateListModel.setIsAvailable(isDataStorage); diskListModel.setIsAvailable(isDataStorage); + snapshotListModel.setIsAvailable(isDataStorage); isoListModel.setIsAvailable(isImageStorage); } diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageSnapshotListModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageSnapshotListModel.java new file mode 100644 index 0000000..911dd29 --- /dev/null +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageSnapshotListModel.java @@ -0,0 +1,226 @@ +package org.ovirt.engine.ui.uicommonweb.models.storage; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.ovirt.engine.core.common.action.RemoveSnapshotImagesParameters; +import org.ovirt.engine.core.common.action.VdcActionParametersBase; +import org.ovirt.engine.core.common.action.VdcActionType; +import org.ovirt.engine.core.common.businessentities.DiskImage; +import org.ovirt.engine.core.common.businessentities.ImageStatus; +import org.ovirt.engine.core.common.businessentities.StorageDomain; +import org.ovirt.engine.core.common.queries.IdQueryParameters; +import org.ovirt.engine.core.common.queries.VdcQueryReturnValue; +import org.ovirt.engine.core.common.queries.VdcQueryType; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.ui.frontend.AsyncQuery; +import org.ovirt.engine.ui.frontend.Frontend; +import org.ovirt.engine.ui.frontend.INewAsyncCallback; +import org.ovirt.engine.ui.uicommonweb.Linq; +import org.ovirt.engine.ui.uicommonweb.UICommand; +import org.ovirt.engine.ui.uicommonweb.help.HelpTag; +import org.ovirt.engine.ui.uicommonweb.models.ConfirmationModel; +import org.ovirt.engine.ui.uicommonweb.models.SearchableListModel; +import org.ovirt.engine.ui.uicompat.ConstantsManager; +import org.ovirt.engine.ui.uicompat.FrontendMultipleActionAsyncResult; +import org.ovirt.engine.ui.uicompat.IFrontendMultipleActionAsyncCallback; + +public class StorageSnapshotListModel extends SearchableListModel +{ + private UICommand privateRemoveCommand; + + public UICommand getRemoveCommand() { + return privateRemoveCommand; + } + + private void setRemoveCommand(UICommand value) { + privateRemoveCommand = value; + } + + public StorageSnapshotListModel() { + setTitle(ConstantsManager.getInstance().getConstants().snapshotsTitle()); + setHelpTag(HelpTag.snapshots); + setHashName("snapshots"); //$NON-NLS-1$ + + setRemoveCommand(new UICommand("Remove", this)); //$NON-NLS-1$ + + updateActionAvailability(); + } + + @Override + protected void onEntityChanged() { + super.onEntityChanged(); + + getSearchCommand().execute(); + } + + @Override + public StorageDomain getEntity() + { + return (StorageDomain) super.getEntity(); + } + + public void setEntity(StorageDomain value) + { + super.setEntity(value); + } + + @Override + protected void onSelectedItemChanged() { + super.onSelectedItemChanged(); + updateActionAvailability(); + } + + @Override + protected void selectedItemsChanged() { + super.selectedItemsChanged(); + updateActionAvailability(); + } + + @Override + public void search() { + if (getEntity() != null) { + super.search(); + } + else { + setItems(null); + } + } + + public void cancel() { + setWindow(null); + } + + @Override + protected void syncSearch() { + if (getEntity() == null) { + return; + } + + super.syncSearch(); + + IdQueryParameters parameters = new IdQueryParameters((getEntity()).getId()); + parameters.setRefresh(getIsQueryFirstTime()); + + Frontend.getInstance().runQuery(VdcQueryType.GetAllSnapshotImagesByStorageDomainId, parameters, + new AsyncQuery(this, new INewAsyncCallback() { + @Override + public void onSuccess(Object model, Object ReturnValue) { + StorageSnapshotListModel storageSnapshotListModel = (StorageSnapshotListModel) model; + storageSnapshotListModel.setItems((ArrayList<DiskImage>) ((VdcQueryReturnValue) ReturnValue).getReturnValue()); + } + })); + } + + private void updateActionAvailability() { + ArrayList<DiskImage> disks = getSelectedItems() != null ? + Linq.<DiskImage> cast(getSelectedItems()) : new ArrayList<DiskImage>(); + + getRemoveCommand().setIsExecutionAllowed(disks.size() > 0 && isRemoveCommandAvailable(disks)); + } + + private boolean isRemoveCommandAvailable(ArrayList<DiskImage> disks) { + for (DiskImage disk : disks) { + boolean isImageLocked = disk.getImageStatus() == ImageStatus.LOCKED; + boolean isTemplateType = disk.getVmEntityType().isTemplateType(); + + if (isImageLocked || isTemplateType) { + return false; + } + } + + return true; + } + + private void remove() { + if (getWindow() != null) { + return; + } + + ConfirmationModel model = new ConfirmationModel(); + setWindow(model); + model.setTitle(ConstantsManager.getInstance().getConstants().removeDisksTitle()); + model.setHelpTag(HelpTag.remove_disk_snapshot); + model.setHashName("remove_disk_snapshot"); //$NON-NLS-1$ + + model.getLatch().setIsAvailable(false); + + ArrayList<String> items = new ArrayList<String>(); + for (Object item : getSelectedItems()) { + DiskImage disk = (DiskImage) item; + items.add(ConstantsManager.getInstance().getMessages().diskSnapshotLabel( + disk.getDiskAlias(), disk.getVmSnapshotDescription())); + } + model.setItems(items); + + UICommand onRemoveCommand = new UICommand("OnRemove", this); //$NON-NLS-1$ + onRemoveCommand.setTitle(ConstantsManager.getInstance().getConstants().ok()); + onRemoveCommand.setIsDefault(true); + model.getCommands().add(onRemoveCommand); + UICommand cancelCommand = new UICommand("Cancel", this); //$NON-NLS-1$ + cancelCommand.setTitle(ConstantsManager.getInstance().getConstants().cancel()); + cancelCommand.setIsCancel(true); + model.getCommands().add(cancelCommand); + } + + private void onRemove() { + ConfirmationModel model = (ConfirmationModel) getWindow(); + ArrayList<VdcActionParametersBase> paramerterList = new ArrayList<VdcActionParametersBase>(); + + Map<Guid, List<DiskImage>> diskImagesMap = groupImagesByDiskId((List<DiskImage>) getSelectedItems()); + for (List<DiskImage> images : diskImagesMap.values()) { + RemoveSnapshotImagesParameters parameters = new RemoveSnapshotImagesParameters(images); + paramerterList.add(parameters); + } + + model.startProgress(null); + + Frontend.getInstance().runMultipleAction(VdcActionType.RemoveSnapshotImages, paramerterList, + new IFrontendMultipleActionAsyncCallback() { + @Override + public void executed(FrontendMultipleActionAsyncResult result) { + StorageSnapshotListModel localModel = (StorageSnapshotListModel) result.getState(); + localModel.stopProgress(); + cancel(); + } + }, + this); + } + + private Map<Guid, List<DiskImage>> groupImagesByDiskId(List<DiskImage> diskImages) { + Map<Guid, List<DiskImage>> diskImagesMap = new HashMap<Guid, List<DiskImage>>(); + for (DiskImage diskImage: diskImages) { + List<DiskImage> images = diskImagesMap.get(diskImage.getId()); + if (images != null) { + images.add(diskImage); + } + else { + diskImagesMap.put(diskImage.getId(), new ArrayList(Arrays.asList(diskImage))); + } + } + return diskImagesMap; + } + + @Override + public void executeCommand(UICommand command) { + super.executeCommand(command); + + if (command == getRemoveCommand()) { + remove(); + } + else if ("OnRemove".equals(command.getName())) { //$NON-NLS-1$ + onRemove(); + } + else if ("Cancel".equals(command.getName())) { //$NON-NLS-1$ + cancel(); + } + } + + @Override + protected String getListName() { + return "StorageSnapshotListModel"; //$NON-NLS-1$ + } +} diff --git a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIMessages.java b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIMessages.java index 69d9031..e6e791f 100644 --- a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIMessages.java +++ b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIMessages.java @@ -355,4 +355,7 @@ @DefaultMessage("Network should be assigned to ''{0}'' via label ''{1}''. However, for some reason it isn''t.") String labeledNetworkNotAttached(String nicName, String labelName); + + @DefaultMessage("Disk {0} from Snapshot {1}") + String diskSnapshotLabel(String diskAlias, String snapshotDescription); } diff --git a/frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties b/frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties index a2b07da..90c78e2 100644 --- a/frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties +++ b/frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties @@ -277,6 +277,7 @@ VAR__TYPE__PERMISSION=$type Permission VAR__TYPE__HOST_CAPABILITIES=$type Host capabilities VAR__TYPE__ISCSI_BOND=$type iSCSI Bond +VAR__TYPE__DISK__SNAPSHOT="$type Disk Snapshot VAR__ACTION__RUN=$action run VAR__ACTION__REMOVE=$action remove VAR__ACTION__ADD=$action add diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/ClientGinjectorExtension.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/ClientGinjectorExtension.java index 565b555..21a5151 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/ClientGinjectorExtension.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/ClientGinjectorExtension.java @@ -109,6 +109,7 @@ import org.ovirt.engine.ui.uicommonweb.models.storage.StorageGeneralModel; import org.ovirt.engine.ui.uicommonweb.models.storage.StorageIsoListModel; import org.ovirt.engine.ui.uicommonweb.models.storage.StorageListModel; +import org.ovirt.engine.ui.uicommonweb.models.storage.StorageSnapshotListModel; import org.ovirt.engine.ui.uicommonweb.models.storage.StorageTemplateListModel; import org.ovirt.engine.ui.uicommonweb.models.storage.StorageVmListModel; import org.ovirt.engine.ui.uicommonweb.models.storage.TemplateBackupModel; @@ -228,6 +229,8 @@ SearchableDetailModelProvider<Disk, StorageListModel, StorageDiskListModel> getSubTabStorageDiskModelProvider(); + SearchableDetailModelProvider<Disk, StorageListModel, StorageSnapshotListModel> getSubTabStorageSnapshotModelProvider(); + SearchableDetailModelProvider<Permissions, StorageListModel, PermissionListModel> getSubTabStoragePermissionModelProvider(); SearchableDetailModelProvider<AuditLog, StorageListModel, StorageEventListModel> getSubTabStorageEventModelProvider(); 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 34d6622..973df47 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 @@ -195,6 +195,7 @@ import org.ovirt.engine.ui.webadmin.section.main.presenter.tab.storage.SubTabStorageGeneralPresenter; import org.ovirt.engine.ui.webadmin.section.main.presenter.tab.storage.SubTabStorageIsoPresenter; import org.ovirt.engine.ui.webadmin.section.main.presenter.tab.storage.SubTabStoragePermissionPresenter; +import org.ovirt.engine.ui.webadmin.section.main.presenter.tab.storage.SubTabStorageSnapshotPresenter; import org.ovirt.engine.ui.webadmin.section.main.presenter.tab.storage.SubTabStorageTemplateBackupPresenter; import org.ovirt.engine.ui.webadmin.section.main.presenter.tab.storage.SubTabStorageTemplatePresenter; import org.ovirt.engine.ui.webadmin.section.main.presenter.tab.storage.SubTabStorageVmBackupPresenter; @@ -416,6 +417,7 @@ import org.ovirt.engine.ui.webadmin.section.main.view.tab.storage.SubTabStorageGeneralView; import org.ovirt.engine.ui.webadmin.section.main.view.tab.storage.SubTabStorageIsoView; import org.ovirt.engine.ui.webadmin.section.main.view.tab.storage.SubTabStoragePermissionView; +import org.ovirt.engine.ui.webadmin.section.main.view.tab.storage.SubTabStorageSnapshotView; import org.ovirt.engine.ui.webadmin.section.main.view.tab.storage.SubTabStorageTemplateBackupView; import org.ovirt.engine.ui.webadmin.section.main.view.tab.storage.SubTabStorageTemplateView; import org.ovirt.engine.ui.webadmin.section.main.view.tab.storage.SubTabStorageVmBackupView; @@ -649,6 +651,10 @@ SubTabStorageDiskPresenter.ViewDef.class, SubTabStorageDiskView.class, SubTabStorageDiskPresenter.ProxyDef.class); + bindPresenter(SubTabStorageSnapshotPresenter.class, + SubTabStorageSnapshotPresenter.ViewDef.class, + SubTabStorageSnapshotView.class, + SubTabStorageSnapshotPresenter.ProxyDef.class); bindPresenter(SubTabStoragePermissionPresenter.class, SubTabStoragePermissionPresenter.ViewDef.class, SubTabStoragePermissionView.class, diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/StorageModule.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/StorageModule.java index 9a61813..b4d09ff 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/StorageModule.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/StorageModule.java @@ -30,6 +30,7 @@ import org.ovirt.engine.ui.uicommonweb.models.storage.StorageGeneralModel; import org.ovirt.engine.ui.uicommonweb.models.storage.StorageIsoListModel; import org.ovirt.engine.ui.uicommonweb.models.storage.StorageListModel; +import org.ovirt.engine.ui.uicommonweb.models.storage.StorageSnapshotListModel; import org.ovirt.engine.ui.uicommonweb.models.storage.StorageTemplateListModel; import org.ovirt.engine.ui.uicommonweb.models.storage.StorageVmListModel; import org.ovirt.engine.ui.uicommonweb.models.storage.TemplateBackupModel; @@ -236,6 +237,27 @@ @Provides @Singleton + public SearchableDetailModelProvider<Disk, StorageListModel, StorageSnapshotListModel> getStorageSnapshotListProvider(EventBus eventBus, + Provider<DefaultConfirmationPopupPresenterWidget> defaultConfirmPopupProvider, + final Provider<RemoveConfirmationPopupPresenterWidget> removeConfirmPopupProvider) { + return new SearchableDetailTabModelProvider<Disk, StorageListModel, StorageSnapshotListModel>( + eventBus, defaultConfirmPopupProvider, + StorageListModel.class, + StorageSnapshotListModel.class) { + @Override + public AbstractModelBoundPopupPresenterWidget<? extends ConfirmationModel, ?> getConfirmModelPopup(StorageSnapshotListModel source, + UICommand lastExecutedCommand) { + if (lastExecutedCommand == getModel().getRemoveCommand()) { + return removeConfirmPopupProvider.get(); + } else { + return super.getConfirmModelPopup(source, lastExecutedCommand); + } + } + }; + } + + @Provides + @Singleton public SearchableDetailModelProvider<VmTemplate, StorageListModel, StorageTemplateListModel> getStorageTemplateListProvider(EventBus eventBus, Provider<DefaultConfirmationPopupPresenterWidget> defaultConfirmPopupProvider) { return new SearchableDetailTabModelProvider<VmTemplate, StorageListModel, StorageTemplateListModel>( diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/place/ApplicationPlaces.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/place/ApplicationPlaces.java index cacdd4c..8b9aeb9 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/place/ApplicationPlaces.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/place/ApplicationPlaces.java @@ -101,6 +101,9 @@ public static final String storageDiskSubTabPlace = storageMainTabPlace + SUB_TAB_PREFIX + "disks"; //$NON-NLS-1$ + public static final String storageSnapshotSubTabPlace = storageMainTabPlace + SUB_TAB_PREFIX + + "snapshots"; //$NON-NLS-1$ + public static final String storagePermissionSubTabPlace = storageMainTabPlace + SUB_TAB_PREFIX + "permissions"; //$NON-NLS-1$ diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/tab/storage/SubTabStorageEventPresenter.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/tab/storage/SubTabStorageEventPresenter.java index e2e6e67..3b30c31 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/tab/storage/SubTabStorageEventPresenter.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/tab/storage/SubTabStorageEventPresenter.java @@ -37,7 +37,7 @@ @TabInfo(container = StorageSubTabPanelPresenter.class) static TabData getTabData(ApplicationConstants applicationConstants, SearchableDetailModelProvider<AuditLog, StorageListModel, StorageEventListModel> modelProvider) { - return new ModelBoundTabData(applicationConstants.storageEventSubTabLabel(), 9, modelProvider, Align.RIGHT); + return new ModelBoundTabData(applicationConstants.storageEventSubTabLabel(), 10, modelProvider, Align.RIGHT); } @Inject diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/tab/storage/SubTabStoragePermissionPresenter.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/tab/storage/SubTabStoragePermissionPresenter.java index 41d6f58..118c736 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/tab/storage/SubTabStoragePermissionPresenter.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/tab/storage/SubTabStoragePermissionPresenter.java @@ -36,7 +36,7 @@ @TabInfo(container = StorageSubTabPanelPresenter.class) static TabData getTabData(ApplicationConstants applicationConstants, SearchableDetailModelProvider<Permissions, StorageListModel, PermissionListModel> modelProvider) { - return new ModelBoundTabData(applicationConstants.storagePermissionSubTabLabel(), 8, modelProvider); + return new ModelBoundTabData(applicationConstants.storagePermissionSubTabLabel(), 9, modelProvider); } @Inject diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/tab/storage/SubTabStorageSnapshotPresenter.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/tab/storage/SubTabStorageSnapshotPresenter.java new file mode 100644 index 0000000..88f1d91 --- /dev/null +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/tab/storage/SubTabStorageSnapshotPresenter.java @@ -0,0 +1,60 @@ +package org.ovirt.engine.ui.webadmin.section.main.presenter.tab.storage; + +import org.ovirt.engine.core.common.businessentities.Disk; +import org.ovirt.engine.core.common.businessentities.StorageDomain; +import org.ovirt.engine.ui.common.place.PlaceRequestFactory; +import org.ovirt.engine.ui.common.presenter.AbstractSubTabPresenter; +import org.ovirt.engine.ui.common.uicommon.model.SearchableDetailModelProvider; +import org.ovirt.engine.ui.common.widget.tab.ModelBoundTabData; +import org.ovirt.engine.ui.uicommonweb.models.storage.StorageListModel; +import org.ovirt.engine.ui.uicommonweb.models.storage.StorageSnapshotListModel; +import org.ovirt.engine.ui.webadmin.ApplicationConstants; +import org.ovirt.engine.ui.webadmin.place.ApplicationPlaces; +import org.ovirt.engine.ui.webadmin.section.main.presenter.tab.StorageSelectionChangeEvent; + +import com.google.gwt.event.shared.EventBus; +import com.google.inject.Inject; +import com.gwtplatform.mvp.client.TabData; +import com.gwtplatform.mvp.client.annotations.NameToken; +import com.gwtplatform.mvp.client.annotations.ProxyCodeSplit; +import com.gwtplatform.mvp.client.annotations.ProxyEvent; +import com.gwtplatform.mvp.client.annotations.TabInfo; +import com.gwtplatform.mvp.client.proxy.PlaceManager; +import com.gwtplatform.mvp.client.proxy.PlaceRequest; +import com.gwtplatform.mvp.client.proxy.TabContentProxyPlace; + +public class SubTabStorageSnapshotPresenter extends AbstractSubTabPresenter<StorageDomain, StorageListModel, StorageSnapshotListModel, SubTabStorageSnapshotPresenter.ViewDef, SubTabStorageSnapshotPresenter.ProxyDef> { + + @ProxyCodeSplit + @NameToken(ApplicationPlaces.storageSnapshotSubTabPlace) + public interface ProxyDef extends TabContentProxyPlace<SubTabStorageSnapshotPresenter> { + } + + public interface ViewDef extends AbstractSubTabPresenter.ViewDef<StorageDomain> { + } + + @TabInfo(container = StorageSubTabPanelPresenter.class) + static TabData getTabData(ApplicationConstants applicationConstants, + SearchableDetailModelProvider<Disk, StorageListModel, StorageSnapshotListModel> modelProvider) { + return new ModelBoundTabData(applicationConstants.snapshotsLabel(), 8, modelProvider); + } + + @Inject + public SubTabStorageSnapshotPresenter(EventBus eventBus, ViewDef view, ProxyDef proxy, + PlaceManager placeManager, + SearchableDetailModelProvider<Disk, StorageListModel, StorageSnapshotListModel> modelProvider) { + super(eventBus, view, proxy, placeManager, modelProvider, + StorageSubTabPanelPresenter.TYPE_SetTabContent); + } + + @Override + protected PlaceRequest getMainTabRequest() { + return PlaceRequestFactory.get(ApplicationPlaces.storageMainTabPlace); + } + + @ProxyEvent + public void onStorageSelectionChange(StorageSelectionChangeEvent event) { + updateMainTabSelection(event.getSelectedItems()); + } + +} diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/storage/SubTabStorageSnapshotView.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/storage/SubTabStorageSnapshotView.java new file mode 100644 index 0000000..e55dd5c --- /dev/null +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/storage/SubTabStorageSnapshotView.java @@ -0,0 +1,63 @@ +package org.ovirt.engine.ui.webadmin.section.main.view.tab.storage; + +import org.ovirt.engine.core.common.businessentities.Disk; +import org.ovirt.engine.core.common.businessentities.StorageDomain; +import org.ovirt.engine.ui.common.idhandler.ElementIdHandler; +import org.ovirt.engine.ui.common.uicommon.model.SearchableDetailModelProvider; +import org.ovirt.engine.ui.common.widget.uicommon.disks.DisksViewColumns; +import org.ovirt.engine.ui.uicommonweb.UICommand; +import org.ovirt.engine.ui.uicommonweb.models.storage.StorageListModel; +import org.ovirt.engine.ui.uicommonweb.models.storage.StorageSnapshotListModel; +import org.ovirt.engine.ui.webadmin.ApplicationConstants; +import org.ovirt.engine.ui.webadmin.section.main.presenter.tab.storage.SubTabStorageSnapshotPresenter; +import org.ovirt.engine.ui.webadmin.section.main.view.AbstractSubTabTableView; +import org.ovirt.engine.ui.webadmin.widget.action.WebAdminButtonDefinition; + +import com.google.gwt.core.client.GWT; +import com.google.inject.Inject; + +public class SubTabStorageSnapshotView extends AbstractSubTabTableView<StorageDomain, Disk, StorageListModel, StorageSnapshotListModel> + implements SubTabStorageSnapshotPresenter.ViewDef { + + interface ViewIdHandler extends ElementIdHandler<SubTabStorageSnapshotView> { + ViewIdHandler idHandler = GWT.create(ViewIdHandler.class); + } + + @Inject + public SubTabStorageSnapshotView(SearchableDetailModelProvider<Disk, StorageListModel, + StorageSnapshotListModel> modelProvider, ApplicationConstants constants) { + super(modelProvider); + ViewIdHandler.idHandler.generateAndSetIds(this); + initTable(constants); + initWidget(getTable()); + } + + void initTable(ApplicationConstants constants) { + getTable().enableColumnResizing(); + + getTable().ensureColumnPresent( + DisksViewColumns.snapshotSizeColumn, constants.diskSnapshotSize(), true, "130px"); //$NON-NLS-1$ + + getTable().ensureColumnPresent( + DisksViewColumns.dateCreatedColumn, constants.creationDateDisk(), true, "130px"); //$NON-NLS-1$ + + getTable().ensureColumnPresent( + DisksViewColumns.aliasColumn, constants.diskSnapshotAlias(), true, "130px"); //$NON-NLS-1$ + + getTable().ensureColumnPresent( + DisksViewColumns.snapshotDescriptionColumn, constants.diskSnapshotDescription(), true, "160px"); //$NON-NLS-1$ + + getTable().ensureColumnPresent( + DisksViewColumns.diskContainersColumn, constants.attachedToDisk(), true, "130px"); //$NON-NLS-1$ + + getTable().ensureColumnPresent( + DisksViewColumns.statusColumn, constants.statusDisk(), true, "80px"); //$NON-NLS-1$ + + getTable().addActionButton(new WebAdminButtonDefinition<Disk>(constants.removeDisk()) { + @Override + protected UICommand resolveCommand() { + return getDetailModel().getRemoveCommand(); + } + }); + } +} diff --git a/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties b/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties index be68147..e56b4dc 100644 --- a/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties +++ b/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties @@ -291,6 +291,7 @@ VAR__TYPE__NETWORK_QOS=$type Network QoS VAR__TYPE__SPM=$type SPM VAR__TYPE__ISCSI_BOND=$type iSCSI Bond +VAR__TYPE__DISK__SNAPSHOT="$type Disk Snapshot VAR__ACTION__RUN=$action run VAR__ACTION__REMOVE=$action remove VAR__ACTION__ADD=$action add -- To view, visit http://gerrit.ovirt.org/26329 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I888dad6a3f7ac876a859ce5e8e371599d0873b22 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Daniel Erez <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
