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

Reply via email to