Shubhendu Tripathi has uploaded a new change for review.

Change subject: webadmin: Listing gluster volume snapshots
......................................................................

webadmin: Listing gluster volume snapshots

Introduced sub tab for listing gluster volume snapshots under Volumes
main tab.
Also added a column for no of snapshots under volumes list and added a
field to display the maximum no of allowed snapshots for a volume under
General sub tab.

Change-Id: Ic1953aad3d013d386719a43b4bfdda82896cc3af
Signed-off-by: Shubhendu Tripathi <[email protected]>
---
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterVolumeSnapshotEntity.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/Linq.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/help/HelpTag.java
A 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/gluster/GlusterVolumeSnapshotListModel.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/gluster/VolumeGeneralModel.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/volumes/VolumeListModel.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/place/WebAdminApplicationPlaces.java
M 
frontend/webadmin/modules/uicompat/src/main/resources/org/ovirt/engine/ui/uicompat/LocalizedEnums.properties
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationTemplates.java
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/VolumeModule.java
A 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/tab/gluster/SubTabGlusterVolumeSnapshotPresenter.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/MainTabVolumeView.java
A 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/gluster/SubTabGlusterVolumeSnapshotView.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/gluster/SubTabVolumeGeneralView.java
A 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/GlusterVolumeSnapshotStatusCell.java
A 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/GlusterVolumeSnapshotStatusColumn.java
20 files changed, 450 insertions(+), 9 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/90/39290/1

diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterVolumeSnapshotEntity.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterVolumeSnapshotEntity.java
index edc3907..bde66d4 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterVolumeSnapshotEntity.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterVolumeSnapshotEntity.java
@@ -133,4 +133,9 @@
 
         return true;
     }
+
+    @Override
+    public Object getQueryableId() {
+        return this.snapshotId;
+    }
 }
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/Linq.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/Linq.java
index a3d386b..68bf03b 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/Linq.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/Linq.java
@@ -38,6 +38,7 @@
 import 
org.ovirt.engine.core.common.businessentities.comparators.LexoNumericComparator;
 import 
org.ovirt.engine.core.common.businessentities.comparators.NameableComparator;
 import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterBrickEntity;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSnapshotEntity;
 import org.ovirt.engine.core.common.businessentities.network.Network;
 import org.ovirt.engine.core.common.businessentities.network.NetworkInterface;
 import org.ovirt.engine.core.common.businessentities.network.NetworkQoS;
@@ -124,6 +125,16 @@
         }
 
     }
+
+    public static class GlusterVolumeSnapshotComparer implements 
Comparator<GlusterVolumeSnapshotEntity>, Serializable {
+        private static final long serialVersionUID = -6085272225112945249L;
+
+        @Override
+        public int compare(GlusterVolumeSnapshotEntity snapshot0, 
GlusterVolumeSnapshotEntity snapshot1) {
+            return 
snapshot0.getSnapshotName().compareTo(snapshot1.getSnapshotName());
+        }
+    }
+
     public static class DiskImageByLastModifiedComparer implements 
Comparator<DiskImage>, Serializable
     {
 
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java
index 13854ca..7ba7841 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java
@@ -75,6 +75,7 @@
 import org.ovirt.engine.core.common.businessentities.gluster.GlusterHookEntity;
 import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterServerService;
 import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSnapshotEntity;
 import org.ovirt.engine.core.common.businessentities.gluster.ServiceType;
 import org.ovirt.engine.core.common.businessentities.network.Network;
 import org.ovirt.engine.core.common.businessentities.network.NetworkQoS;
@@ -1593,6 +1594,16 @@
                 aQuery);
     }
 
+    public static void getGlusterVolumeSnapshotsForVolume(AsyncQuery aQuery, 
Guid volumeId) {
+        aQuery.converterCallback = new IAsyncConverter() {
+            @Override
+            public Object Convert(Object source, AsyncQuery asyncQuery) {
+                return source != null ? source : new 
ArrayList<GlusterVolumeSnapshotEntity>();
+            }
+        };
+        
Frontend.getInstance().runQuery(VdcQueryType.GetGlusterVolumeSnapshotsByVolumeId,
 new IdQueryParameters(volumeId), aQuery);
+    }
+
     public static void getGlusterHookContent(AsyncQuery aQuery, Guid hookId, 
Guid serverId) {
 
         aQuery.converterCallback = new IAsyncConverter() {
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 97419ca..849278d 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
@@ -470,6 +470,8 @@
 
     volume_stop("volume_stop", HelpTagType.WEBADMIN, "Volumes Tab > Stop 
Volume"), //$NON-NLS-1$ //$NON-NLS-2$
 
+    volume_snapshots("volume_snapshots", HelpTagType.WEBADMIN), //$NON-NLS-1$
+
     new_role("new_role", HelpTagType.WEBADMIN), //$NON-NLS-1$
 
     edit_role("edit_role", HelpTagType.WEBADMIN), //$NON-NLS-1$
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/gluster/GlusterVolumeSnapshotListModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/gluster/GlusterVolumeSnapshotListModel.java
new file mode 100644
index 0000000..48ef3c1
--- /dev/null
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/gluster/GlusterVolumeSnapshotListModel.java
@@ -0,0 +1,79 @@
+package org.ovirt.engine.ui.uicommonweb.models.gluster;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSnapshotEntity;
+import org.ovirt.engine.ui.frontend.AsyncQuery;
+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.dataprovider.AsyncDataProvider;
+import org.ovirt.engine.ui.uicommonweb.help.HelpTag;
+import org.ovirt.engine.ui.uicommonweb.models.SearchableListModel;
+import org.ovirt.engine.ui.uicompat.ConstantsManager;
+
+public class GlusterVolumeSnapshotListModel extends SearchableListModel {
+    @Override
+    public String getListName() {
+        return "GlusterVolumeSnapshotListModel"; //$NON-NLS-1$
+    }
+
+    public GlusterVolumeSnapshotListModel() {
+        
setTitle(ConstantsManager.getInstance().getConstants().snapshotsTitle());
+        setHelpTag(HelpTag.volume_snapshots);
+        setHashName("volume_snapshots");//$NON-NLS-1$
+    }
+
+    @Override
+    protected void onEntityChanged() {
+        super.onEntityChanged();
+        getSearchCommand().execute();
+    }
+
+    @Override
+    protected void onSelectedItemChanged() {
+        super.onSelectedItemChanged();
+    }
+
+    @Override
+    protected void selectedItemsChanged()
+    {
+        super.selectedItemsChanged();
+    }
+
+    @Override
+    protected void syncSearch() {
+        if (getEntity() == null) {
+            return;
+        }
+
+        AsyncDataProvider.getGlusterVolumeSnapshotsForVolume(new 
AsyncQuery(this,
+                new INewAsyncCallback() {
+
+                    @Override
+                    public void onSuccess(Object model, Object returnValue) {
+                        List<GlusterVolumeSnapshotEntity> snapshots =
+                                (ArrayList<GlusterVolumeSnapshotEntity>) 
returnValue;
+                        Collections.sort(snapshots, new 
Linq.GlusterVolumeSnapshotComparer());
+                        setItems(snapshots);
+                    }
+                }), getEntity().getId());
+    }
+
+    @Override
+    public void executeCommand(UICommand command) {
+        super.executeCommand(command);
+    }
+
+    @Override
+    public GlusterVolumeEntity getEntity() {
+        return (GlusterVolumeEntity) super.getEntity();
+    }
+
+    public void setEntity(GlusterVolumeEntity value) {
+        super.setEntity(value);
+    }
+}
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/gluster/VolumeGeneralModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/gluster/VolumeGeneralModel.java
index d341419..02ca742 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/gluster/VolumeGeneralModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/gluster/VolumeGeneralModel.java
@@ -19,6 +19,7 @@
     private String glusterMountPoint;
     private String nfsMountPoint;
     private Set<TransportType> transportTypes;
+    private String snapMaxLimit;
 
     public String getName() {
         return name;
@@ -89,6 +90,14 @@
         this.nfsMountPoint = nfsMountPoint;
     }
 
+    public String getSnapMaxLimit() {
+        return this.snapMaxLimit;
+    }
+
+    public void setSnapMaxLimit(String noOfSnaps) {
+        this.snapMaxLimit = noOfSnaps;
+    }
+
     public VolumeGeneralModel() {
         setTitle(ConstantsManager.getInstance().getConstants().generalTitle());
         setHelpTag(HelpTag.general);
@@ -113,6 +122,7 @@
         setStripeCount(entity.getStripeCount() != null ? 
Integer.toString(entity.getStripeCount()) : null);
         setNumOfBricks(entity.getBricks() != null ? 
Integer.toString(entity.getBricks().size()) : null);
         setTransportTypes(entity.getTransportTypes());
+        setSnapMaxLimit(entity.getSnapMaxLimit() != null ? 
entity.getSnapMaxLimit().toString() : null);
     }
 
     public Set<TransportType> getTransportTypes() {
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/volumes/VolumeListModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/volumes/VolumeListModel.java
index 6f85d0f..b7b91fe 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/volumes/VolumeListModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/volumes/VolumeListModel.java
@@ -47,6 +47,7 @@
 import org.ovirt.engine.ui.uicommonweb.models.SystemTreeItemModel;
 import org.ovirt.engine.ui.uicommonweb.models.SystemTreeItemType;
 import org.ovirt.engine.ui.uicommonweb.models.configure.PermissionListModel;
+import 
org.ovirt.engine.ui.uicommonweb.models.gluster.GlusterVolumeSnapshotListModel;
 import org.ovirt.engine.ui.uicommonweb.models.gluster.VolumeBrickListModel;
 import org.ovirt.engine.ui.uicommonweb.models.gluster.VolumeEventListModel;
 import org.ovirt.engine.ui.uicommonweb.models.gluster.VolumeGeneralModel;
@@ -160,6 +161,16 @@
         this.brickListModel = brickListModel;
     }
 
+    private GlusterVolumeSnapshotListModel snapshotListModel;
+
+    public GlusterVolumeSnapshotListModel getSnapshotListModel() {
+        return snapshotListModel;
+    }
+
+    public void setSnapshotListModel(GlusterVolumeSnapshotListModel 
snapshotListModel) {
+        this.snapshotListModel = snapshotListModel;
+    }
+
     public UICommand getStartVolumeProfilingCommand() {
         return startVolumeProfilingCommand;
     }
@@ -223,6 +234,7 @@
         super.initDetailModels();
 
         setBrickListModel(new VolumeBrickListModel());
+        setSnapshotListModel(new GlusterVolumeSnapshotListModel());
 
         ObservableCollection<EntityModel> list = new 
ObservableCollection<EntityModel>();
         list.add(new VolumeGeneralModel());
@@ -230,6 +242,7 @@
         list.add(getBrickListModel());
         list.add(new PermissionListModel());
         list.add(new VolumeEventListModel());
+        list.add(getSnapshotListModel());
         setDetailModels(list);
     }
 
@@ -403,6 +416,7 @@
         super.onSelectedItemChanged();
         updateActionAvailability();
         getBrickListModel().setVolumeEntity((GlusterVolumeEntity) 
provideDetailModelEntity(getSelectedItem()));
+        getSnapshotListModel().setEntity((GlusterVolumeEntity) 
provideDetailModelEntity(getSelectedItem()));
     }
 
     @Override
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/place/WebAdminApplicationPlaces.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/place/WebAdminApplicationPlaces.java
index ab057e5..d719771 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/place/WebAdminApplicationPlaces.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/place/WebAdminApplicationPlaces.java
@@ -306,6 +306,8 @@
 
     public static final String volumeEventSubTabPlace = volumeMainTabPlace + 
SUB_TAB_PREFIX + "events"; //$NON-NLS-1$
 
+    public static final String volumeSnapshotSubTabPlace = volumeMainTabPlace 
+ SUB_TAB_PREFIX + "volume_snapshots"; //$NON-NLS-1$
+
     // Disk
 
     public static final String diskGeneralSubTabPlace = diskMainTabPlace + 
SUB_TAB_PREFIX + "general"; //$NON-NLS-1$
@@ -317,7 +319,6 @@
     public static final String diskStorageSubTabPlace = diskMainTabPlace + 
SUB_TAB_PREFIX + "storage"; //$NON-NLS-1$
 
     public static final String diskPermissionSubTabPlace = diskMainTabPlace + 
SUB_TAB_PREFIX + "permissions"; //$NON-NLS-1$
-
 
     // Network
     public static final String networkGeneralSubTabPlace = networkMainTabPlace 
+ SUB_TAB_PREFIX + "general"; //$NON-NLS-1$
@@ -342,7 +343,6 @@
 
     public static final String networkPermissionSubTabPlace = 
networkMainTabPlace + SUB_TAB_PREFIX
             + "permissions"; //$NON-NLS-1$
-
 
     // Provider
     public static final String providerGeneralSubTabPlace = 
providerMainTabPlace + SUB_TAB_PREFIX + "general"; //$NON-NLS-1$
diff --git 
a/frontend/webadmin/modules/uicompat/src/main/resources/org/ovirt/engine/ui/uicompat/LocalizedEnums.properties
 
b/frontend/webadmin/modules/uicompat/src/main/resources/org/ovirt/engine/ui/uicompat/LocalizedEnums.properties
index a66ab14..a17d39f 100644
--- 
a/frontend/webadmin/modules/uicompat/src/main/resources/org/ovirt/engine/ui/uicompat/LocalizedEnums.properties
+++ 
b/frontend/webadmin/modules/uicompat/src/main/resources/org/ovirt/engine/ui/uicompat/LocalizedEnums.properties
@@ -210,6 +210,8 @@
 AuditLogType___GLUSTER_BRICK_STATUS_CHANGED=Detected change in status of brick
 AuditLogType___GLUSTER_VOLUME_REBALANCE_NOT_FOUND_FROM_CLI=Could not find 
information for rebalance on volume from CLI. Marking it as unknown.
 AuditLogType___REMOVE_GLUSTER_VOLUME_BRICKS_NOT_FOUND_FROM_CLI=Could not find 
information for remove brick on volume from CLI. Marking it as unknown.
+AuditLogType___GLUSTER_VOLUME_SNAPSHOT_CREATED=Snapshot created for the volume
+AuditLogType___GLUSTER_VOLUME_SNAPSHOT_CREATE_FAILED=Failed create snapshot 
for the volume
 
 
 VdcActionType___ActivateVds=Activate Host
@@ -328,6 +330,7 @@
 VdcActionType___GlusterVolumeRemoveBricks=Remove Gluster Volume Bricks
 VdcActionType___AddBricksToGlusterVolume=Add Brick To Gluster Volume
 VdcActionType___StartRebalanceGlusterVolume=Start Rebalance Gluster Volume
+VdcActionType___CreateGlusterVolumeSnapshot=Create Gluster Volume Snapshot
 VdcActionType___ReplaceGlusterVolumeBrick=Start Gluster Volume Replace Brick
 VdcActionType___GlusterHostAdd=Add Gluster server
 vdcActionType___StartGlusterVolumeProfile=Start Gluster Volume Profile
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java
index d4723eb..04f8e4c 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java
@@ -103,6 +103,9 @@
     @DefaultStringValue("Bricks")
     String volumeBrickSubTabLabel();
 
+    @DefaultStringValue("Snapshots")
+    String volumeSnapshotSubTabLabel();
+
     @DefaultStringValue("Permissions")
     String volumePermissionSubTabLabel();
 
@@ -780,7 +783,8 @@
     @DefaultStringValue("CPU Threads")
     String clusterPopupCpuThreadsPanelTitle();
 
-    @DefaultStringValue("Allow guests to use host threads as virtual CPU 
cores, utilizing AMD Clustered MultiThreading or Intel" +
+    @DefaultStringValue("Allow guests to use host threads as virtual CPU 
cores, utilizing AMD Clustered MultiThreading or Intel"
+            +
             " Hyper-Threading technology on the virtualization host. Enabling 
this option may be useful for less" +
             " CPU-intensive workloads, or to run guests with CPU 
configurations that would otherwise be restricted.")
     String clusterPopupCpuThreadsInfo();
@@ -2741,6 +2745,9 @@
     @DefaultStringValue("Transport Types")
     String transportTypesVolume();
 
+    @DefaultStringValue("Maximum no of snapshots")
+    String maxNumberOfSnapshotsVolume();
+
     @DefaultStringValue("Activities")
     String activitiesOnVolume();
 
@@ -3543,7 +3550,7 @@
     @DefaultStringValue("Remove brick in progress but status unknown. Unable 
to fetch the status at the moment.")
     String removeBrickStatusUnknown();
 
-    //Volume Rebalance Status Table Columns
+    // Volume Rebalance Status Table Columns
     @DefaultStringValue("Host")
     String rebalanceSessionHost();
 
@@ -3707,11 +3714,10 @@
     @DefaultStringValue("Disk Snapshots")
     String snapshotsLabel();
 
-
     @DefaultStringValue("Attached by label")
     String attachedByLabel();
 
-    //Gluster Volume Profiling
+    // Gluster Volume Profiling
     @DefaultStringValue("File operation")
     String fileOperation();
 
@@ -3861,4 +3867,35 @@
 
     @DefaultStringValue("NUMA Support")
     String numaSupport();
+
+    // Volume snapshots
+    @DefaultStringValue("Name")
+    String volumeSnapshotName();
+
+    @DefaultStringValue("Description")
+    String volumeSnapshotDescription();
+
+    @DefaultStringValue("Creation Time")
+    String volumeSnapshotCreationTime();
+
+    @DefaultStringValue("No of snapshots")
+    String noOfSnapshotsLabel();
+
+    @DefaultStringValue("Options - Cluster")
+    String configureClusterSnapshotOptions();
+
+    @DefaultStringValue("Options - Volume")
+    String configureVolumeSnapshotOptions();
+
+    @DefaultStringValue("Option")
+    String volumeSnapshotConfigName();
+
+    @DefaultStringValue("Cluster Value")
+    String clusterSnapshotConfigValue();
+
+    @DefaultStringValue("Value")
+    String volumeSnapshotConfigValue();
+
+    @DefaultStringValue("Snapshot Options")
+    String snapshotConfigHeaderLabel();
 }
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationTemplates.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationTemplates.java
index 23d6bdc..392e349 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationTemplates.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationTemplates.java
@@ -139,6 +139,9 @@
             "</tr> </table>")
     SafeHtml volumeBrickStatusTemplate(SafeHtml upImage, int upCount, SafeHtml 
downImage, int downCount);
 
+    @Template("<div style='line-height: 100%; text-align: center; 
vertical-align: middle;'>{0}</div>")
+    SafeHtml volumeSnapshotsStatusTemplate(int snapshotCount);
+
     @Template("<div style='line-height: 100%; text-align: center; 
vertical-align: middle; border: solid 1px transparent; '>{0}</div>")
     SafeHtml volumeActivityMenu(SafeHtml statusImage);
 
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 fbb2bd8..6c0960b 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
@@ -25,6 +25,7 @@
 import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterServerService;
 import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity;
 import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeOptionEntity;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSnapshotEntity;
 import org.ovirt.engine.core.common.businessentities.network.ExternalSubnet;
 import org.ovirt.engine.core.common.businessentities.network.Network;
 import org.ovirt.engine.core.common.businessentities.network.NetworkCluster;
@@ -74,6 +75,7 @@
 import org.ovirt.engine.ui.uicommonweb.models.gluster.VolumeEventListModel;
 import org.ovirt.engine.ui.uicommonweb.models.gluster.VolumeGeneralModel;
 import org.ovirt.engine.ui.uicommonweb.models.gluster.VolumeParameterListModel;
+import 
org.ovirt.engine.ui.uicommonweb.models.gluster.GlusterVolumeSnapshotListModel;
 import org.ovirt.engine.ui.uicommonweb.models.hosts.HostBricksListModel;
 import org.ovirt.engine.ui.uicommonweb.models.hosts.HostEventListModel;
 import org.ovirt.engine.ui.uicommonweb.models.hosts.HostGeneralModel;
@@ -381,6 +383,8 @@
 
     SearchableDetailModelProvider<AuditLog, VolumeListModel, 
VolumeEventListModel> getSubTabVolumeEventModelProvider();
 
+    SearchableDetailModelProvider<GlusterVolumeSnapshotEntity, 
VolumeListModel, GlusterVolumeSnapshotListModel> 
getSubTabVolumeSnapshotModelProvider();
+
     // Disk
 
     DetailModelProvider<DiskListModel, DiskGeneralModel> 
getSubTabDiskGeneralModelProvider();
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 3d97a3c..8c188f1 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
@@ -163,6 +163,7 @@
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.tab.gluster.SubTabVolumeGeneralPresenter;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.tab.gluster.SubTabVolumeParameterPresenter;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.tab.gluster.SubTabVolumePermissionPresenter;
+import 
org.ovirt.engine.ui.webadmin.section.main.presenter.tab.gluster.SubTabGlusterVolumeSnapshotPresenter;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.tab.gluster.VolumeSubTabPanelPresenter;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.tab.host.HostSubTabPanelPresenter;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.tab.host.SubTabHostBrickPresenter;
@@ -402,6 +403,7 @@
 import 
org.ovirt.engine.ui.webadmin.section.main.view.tab.gluster.SubTabVolumeGeneralView;
 import 
org.ovirt.engine.ui.webadmin.section.main.view.tab.gluster.SubTabVolumeParameterView;
 import 
org.ovirt.engine.ui.webadmin.section.main.view.tab.gluster.SubTabVolumePermissionView;
+import 
org.ovirt.engine.ui.webadmin.section.main.view.tab.gluster.SubTabGlusterVolumeSnapshotView;
 import 
org.ovirt.engine.ui.webadmin.section.main.view.tab.gluster.VolumeSubTabPanelView;
 import 
org.ovirt.engine.ui.webadmin.section.main.view.tab.host.HostSubTabPanelView;
 import 
org.ovirt.engine.ui.webadmin.section.main.view.tab.host.SubTabHostBrickView;
@@ -847,7 +849,6 @@
                 SubTabVirtualMachineEventPresenter.ViewDef.class,
                 SubTabVirtualMachineEventView.class,
                 SubTabVirtualMachineEventPresenter.ProxyDef.class);
-
 
         // Pool
         bindPresenter(PoolSubTabPanelPresenter.class,
@@ -1371,7 +1372,7 @@
                 QuotaPopupPresenterWidget.ViewDef.class,
                 QuotaPopupView.class);
 
-        //Network QoS
+        // Network QoS
         bindPresenterWidget(NetworkQoSPopupPresenterWidget.class,
                 NetworkQoSPopupPresenterWidget.ViewDef.class,
                 NetworkQoSPopupView.class);
@@ -1424,6 +1425,11 @@
                 SubTabVolumeEventView.class,
                 SubTabVolumeEventPresenter.ProxyDef.class);
 
+        bindPresenter(SubTabGlusterVolumeSnapshotPresenter.class,
+                SubTabGlusterVolumeSnapshotPresenter.ViewDef.class,
+                SubTabGlusterVolumeSnapshotView.class,
+                SubTabGlusterVolumeSnapshotPresenter.ProxyDef.class);
+
         bindPresenterWidget(AddBrickPopupPresenterWidget.class,
                 AddBrickPopupPresenterWidget.ViewDef.class,
                 AddBrickPopupView.class);
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/VolumeModule.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/VolumeModule.java
index f8a2c66..be3422c 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/VolumeModule.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/uicommon/VolumeModule.java
@@ -5,6 +5,7 @@
 import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterBrickEntity;
 import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity;
 import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeOptionEntity;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSnapshotEntity;
 import 
org.ovirt.engine.ui.common.presenter.AbstractModelBoundPopupPresenterWidget;
 import 
org.ovirt.engine.ui.common.presenter.popup.DefaultConfirmationPopupPresenterWidget;
 import 
org.ovirt.engine.ui.common.presenter.popup.RemoveConfirmationPopupPresenterWidget;
@@ -19,6 +20,7 @@
 import org.ovirt.engine.ui.uicommonweb.models.ConfirmationModel;
 import org.ovirt.engine.ui.uicommonweb.models.Model;
 import org.ovirt.engine.ui.uicommonweb.models.configure.PermissionListModel;
+import 
org.ovirt.engine.ui.uicommonweb.models.gluster.GlusterVolumeSnapshotListModel;
 import org.ovirt.engine.ui.uicommonweb.models.gluster.VolumeBrickListModel;
 import org.ovirt.engine.ui.uicommonweb.models.gluster.VolumeEventListModel;
 import org.ovirt.engine.ui.uicommonweb.models.gluster.VolumeGeneralModel;
@@ -145,6 +147,31 @@
 
     @Provides
     @Singleton
+    public SearchableDetailModelProvider<GlusterVolumeSnapshotEntity, 
VolumeListModel, GlusterVolumeSnapshotListModel> 
getVolumeSnapshotListProvider(EventBus eventBus,
+            Provider<DefaultConfirmationPopupPresenterWidget> 
defaultConfirmPopupProvider,
+            final Provider<VolumeListModel> mainModelProvider,
+            final Provider<GlusterVolumeSnapshotListModel> modelProvider) {
+        return new 
SearchableDetailTabModelProvider<GlusterVolumeSnapshotEntity, VolumeListModel, 
GlusterVolumeSnapshotListModel>(eventBus,
+                defaultConfirmPopupProvider,
+                VolumeListModel.class,
+                GlusterVolumeSnapshotListModel.class) {
+                    @Override
+                    public AbstractModelBoundPopupPresenterWidget<? extends 
Model, ?> getModelPopup(GlusterVolumeSnapshotListModel source,
+                            UICommand lastExecutedCommand,
+                            Model windowModel) {
+                        return super.getModelPopup(source, 
lastExecutedCommand, windowModel);
+                    }
+
+                    @Override
+                    public AbstractModelBoundPopupPresenterWidget<? extends 
ConfirmationModel, ?> getConfirmModelPopup(GlusterVolumeSnapshotListModel 
source,
+                            UICommand lastExecutedCommand) {
+                        return super.getConfirmModelPopup(source, 
lastExecutedCommand);
+                    }
+                };
+    }
+
+    @Provides
+    @Singleton
     public SearchableDetailModelProvider<GlusterVolumeOptionEntity, 
VolumeListModel, VolumeParameterListModel> 
getVolumeParameterListProvider(EventBus eventBus,
             Provider<DefaultConfirmationPopupPresenterWidget> 
defaultConfirmPopupProvider,
             final Provider<VolumeParameterPopupPresenterWidget> 
addParameterPopupProvider,
@@ -225,6 +252,7 @@
 
     @Override
     protected void configure() {
+        bind(GlusterVolumeSnapshotListModel.class).in(Singleton.class);
     }
 
 }
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/tab/gluster/SubTabGlusterVolumeSnapshotPresenter.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/tab/gluster/SubTabGlusterVolumeSnapshotPresenter.java
new file mode 100644
index 0000000..9b43fa0
--- /dev/null
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/tab/gluster/SubTabGlusterVolumeSnapshotPresenter.java
@@ -0,0 +1,58 @@
+package org.ovirt.engine.ui.webadmin.section.main.presenter.tab.gluster;
+
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSnapshotEntity;
+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.gluster.GlusterVolumeSnapshotListModel;
+import org.ovirt.engine.ui.uicommonweb.models.volumes.VolumeListModel;
+import org.ovirt.engine.ui.uicommonweb.place.WebAdminApplicationPlaces;
+import org.ovirt.engine.ui.webadmin.ApplicationConstants;
+import 
org.ovirt.engine.ui.webadmin.section.main.presenter.tab.VolumeSelectionChangeEvent;
+
+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 SubTabGlusterVolumeSnapshotPresenter extends 
AbstractSubTabPresenter<GlusterVolumeEntity, VolumeListModel, 
GlusterVolumeSnapshotListModel, SubTabGlusterVolumeSnapshotPresenter.ViewDef, 
SubTabGlusterVolumeSnapshotPresenter.ProxyDef> {
+    @TabInfo(container = VolumeSubTabPanelPresenter.class)
+    static TabData getTabData(ApplicationConstants applicationConstants,
+            SearchableDetailModelProvider<GlusterVolumeSnapshotEntity, 
VolumeListModel, GlusterVolumeSnapshotListModel> modelProvider) {
+        return new 
ModelBoundTabData(applicationConstants.volumeSnapshotSubTabLabel(), 5, 
modelProvider);
+    }
+
+    @Inject
+    public SubTabGlusterVolumeSnapshotPresenter(EventBus eventBus, ViewDef 
view, ProxyDef proxy,
+            PlaceManager placeManager,
+            SearchableDetailModelProvider<GlusterVolumeSnapshotEntity, 
VolumeListModel, GlusterVolumeSnapshotListModel> modelProvider) {
+        super(eventBus, view, proxy, placeManager, modelProvider,
+                VolumeSubTabPanelPresenter.TYPE_SetTabContent);
+    }
+
+    @ProxyCodeSplit
+    @NameToken(WebAdminApplicationPlaces.volumeSnapshotSubTabPlace)
+    public interface ProxyDef extends 
TabContentProxyPlace<SubTabGlusterVolumeSnapshotPresenter> {
+    }
+
+    public interface ViewDef extends 
AbstractSubTabPresenter.ViewDef<GlusterVolumeEntity> {
+    }
+
+    @Override
+    protected PlaceRequest getMainTabRequest() {
+        return 
PlaceRequestFactory.get(WebAdminApplicationPlaces.volumeMainTabPlace);
+    }
+
+    @ProxyEvent
+    public void onVolumeSelectionChange(VolumeSelectionChangeEvent event) {
+        updateMainTabSelection(event.getSelectedItems());
+    }
+}
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/MainTabVolumeView.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/MainTabVolumeView.java
index eee7f12..9335f85 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/MainTabVolumeView.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/MainTabVolumeView.java
@@ -155,6 +155,16 @@
                 constants.activitiesOnVolume(),
                 "100px"); //$NON-NLS-1$
 
+        TextColumnWithTooltip<GlusterVolumeEntity> snapshotCountColumn =
+                new TextColumnWithTooltip<GlusterVolumeEntity>() {
+            @Override
+            public String getValue(GlusterVolumeEntity object) {
+                return object.getSnapshotsCount().toString();
+            }
+        };
+        snapshotCountColumn.makeSortable();
+        getTable().addColumn(snapshotCountColumn, 
constants.noOfSnapshotsLabel(), "100px"); //$NON-NLS-1$
+
         getTable().addActionButton(new 
WebAdminButtonDefinition<GlusterVolumeEntity>(constants.newVolume()) {
             @Override
             protected UICommand resolveCommand() {
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/gluster/SubTabGlusterVolumeSnapshotView.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/gluster/SubTabGlusterVolumeSnapshotView.java
new file mode 100644
index 0000000..7358eb7
--- /dev/null
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/gluster/SubTabGlusterVolumeSnapshotView.java
@@ -0,0 +1,71 @@
+package org.ovirt.engine.ui.webadmin.section.main.view.tab.gluster;
+
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSnapshotEntity;
+import org.ovirt.engine.ui.common.idhandler.ElementIdHandler;
+import org.ovirt.engine.ui.common.uicommon.model.SearchableDetailModelProvider;
+import org.ovirt.engine.ui.common.widget.table.column.TextColumnWithTooltip;
+import 
org.ovirt.engine.ui.uicommonweb.models.gluster.GlusterVolumeSnapshotListModel;
+import org.ovirt.engine.ui.uicommonweb.models.volumes.VolumeListModel;
+import org.ovirt.engine.ui.webadmin.ApplicationConstants;
+import 
org.ovirt.engine.ui.webadmin.section.main.presenter.tab.gluster.SubTabGlusterVolumeSnapshotPresenter;
+import org.ovirt.engine.ui.webadmin.section.main.view.AbstractSubTabTableView;
+import 
org.ovirt.engine.ui.webadmin.widget.table.column.GlusterVolumeSnapshotStatusColumn;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.i18n.client.DateTimeFormat;
+import com.google.inject.Inject;
+
+public class SubTabGlusterVolumeSnapshotView extends 
AbstractSubTabTableView<GlusterVolumeEntity, GlusterVolumeSnapshotEntity, 
VolumeListModel, GlusterVolumeSnapshotListModel> implements 
SubTabGlusterVolumeSnapshotPresenter.ViewDef {
+
+    interface ViewIdHandler extends 
ElementIdHandler<SubTabGlusterVolumeSnapshotView> {
+        ViewIdHandler idHandler = GWT.create(ViewIdHandler.class);
+    }
+
+    @Inject
+    public 
SubTabGlusterVolumeSnapshotView(SearchableDetailModelProvider<GlusterVolumeSnapshotEntity,
 VolumeListModel, GlusterVolumeSnapshotListModel> modelProvider,
+            ApplicationConstants constants) {
+        super(modelProvider);
+        initTable(constants);
+        initWidget(getTable());
+    }
+
+    void initTable(ApplicationConstants constants) {
+        getTable().enableColumnResizing();
+
+        GlusterVolumeSnapshotStatusColumn snapshotStatusColumn = new 
GlusterVolumeSnapshotStatusColumn();
+        snapshotStatusColumn.makeSortable();
+        getTable().addColumn(snapshotStatusColumn, constants.empty(), "30px"); 
//$NON-NLS-1$
+
+        TextColumnWithTooltip<GlusterVolumeSnapshotEntity> snapshotNameColumn =
+                new TextColumnWithTooltip<GlusterVolumeSnapshotEntity>() {
+                    @Override
+                    public String getValue(GlusterVolumeSnapshotEntity 
snapshot) {
+                        return snapshot.getSnapshotName();
+                    }
+                };
+        snapshotNameColumn.makeSortable();
+        getTable().addColumn(snapshotNameColumn, 
constants.volumeSnapshotName(), "300px"); //$NON-NLS-1$
+
+        TextColumnWithTooltip<GlusterVolumeSnapshotEntity> descriptionColumn =
+                new TextColumnWithTooltip<GlusterVolumeSnapshotEntity>() {
+                    @Override
+                    public String getValue(GlusterVolumeSnapshotEntity 
snapshot) {
+                        return snapshot.getDescription();
+                    }
+                };
+        descriptionColumn.makeSortable();
+        getTable().addColumn(descriptionColumn, 
constants.volumeSnapshotDescription(), "400px"); //$NON-NLS-1$
+
+        TextColumnWithTooltip<GlusterVolumeSnapshotEntity> creationTimeColumn =
+                new TextColumnWithTooltip<GlusterVolumeSnapshotEntity>() {
+                    @Override
+                    public String getValue(GlusterVolumeSnapshotEntity 
snapshot) {
+                        DateTimeFormat df = 
DateTimeFormat.getFormat("yyyy-MM-dd, HH:mm:ss"); //$NON-NLS-1$
+                        return df.format(snapshot.getCreatedAt());
+                    }
+                };
+        creationTimeColumn.makeSortable();
+        getTable().addColumn(creationTimeColumn, 
constants.volumeSnapshotCreationTime(), "400px"); //$NON-NLS-1$
+    }
+}
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/gluster/SubTabVolumeGeneralView.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/gluster/SubTabVolumeGeneralView.java
index ebecbf4..975d5ef 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/gluster/SubTabVolumeGeneralView.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/gluster/SubTabVolumeGeneralView.java
@@ -42,6 +42,7 @@
     TextBoxLabel stripeCount = new TextBoxLabel();
     TextBoxLabel numOfBricks = new TextBoxLabel();
     VolumeTransportTypeLabel transportTypes = new VolumeTransportTypeLabel();
+    TextBoxLabel snapMaxLimit = new TextBoxLabel();
 
     FormBuilder formBuilder;
 
@@ -61,7 +62,7 @@
         driver.initialize(this);
 
         // Build a form using the FormBuilder
-        formBuilder = new FormBuilder(formPanel, 1, 7);
+        formBuilder = new FormBuilder(formPanel, 1, 8);
 
         formBuilder.addFormItem(new FormItem(constants.NameVolume(), name, 0, 
0));
         formBuilder.addFormItem(new FormItem(constants.volumeIdVolume(), 
volumeId, 1, 0));
@@ -75,6 +76,7 @@
 
         formBuilder.addFormItem(new FormItem(constants.numberOfBricksVolume(), 
numOfBricks, 5, 0));
         formBuilder.addFormItem(new FormItem(constants.transportTypesVolume(), 
transportTypes, 6, 0));
+        formBuilder.addFormItem(new 
FormItem(constants.maxNumberOfSnapshotsVolume(), snapMaxLimit, 7, 0));
 
         getDetailModel().getPropertyChangedEvent().addListener(new 
IEventListener() {
             @Override
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/GlusterVolumeSnapshotStatusCell.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/GlusterVolumeSnapshotStatusCell.java
new file mode 100644
index 0000000..1560a3c
--- /dev/null
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/GlusterVolumeSnapshotStatusCell.java
@@ -0,0 +1,60 @@
+package org.ovirt.engine.ui.webadmin.widget.table.column;
+
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterSnapshotStatus;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSnapshotEntity;
+import org.ovirt.engine.ui.webadmin.ApplicationConstants;
+import org.ovirt.engine.ui.webadmin.ApplicationResources;
+import org.ovirt.engine.ui.webadmin.ApplicationTemplates;
+import org.ovirt.engine.ui.webadmin.gin.ClientGinjectorProvider;
+
+import com.google.gwt.cell.client.AbstractCell;
+import com.google.gwt.resources.client.ImageResource;
+import com.google.gwt.safehtml.shared.SafeHtml;
+import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
+import com.google.gwt.safehtml.shared.SafeHtmlUtils;
+import com.google.gwt.user.client.ui.AbstractImagePrototype;
+
+public class GlusterVolumeSnapshotStatusCell extends 
AbstractCell<GlusterVolumeSnapshotEntity> {
+
+    private static final ApplicationResources resources = 
ClientGinjectorProvider.getApplicationResources();
+
+    private static final ApplicationConstants constants = 
ClientGinjectorProvider.getApplicationConstants();
+
+    private static final ApplicationTemplates applicationTemplates = 
ClientGinjectorProvider.getApplicationTemplates();
+
+    @Override
+    public void render(Context context, GlusterVolumeSnapshotEntity snapshot, 
SafeHtmlBuilder sb) {
+        // Nothing to render if no snapshot is provided:
+        if (snapshot == null) {
+            return;
+        }
+
+        // Find the image corresponding to the status of the brick:
+        GlusterSnapshotStatus status = snapshot.getStatus();
+        ImageResource statusImage = null;
+        String tooltip;
+
+        switch (status) {
+        case STARTED:
+            statusImage = resources.upImage();
+            tooltip = constants.up();
+            break;
+        case STOPPED:
+            statusImage = resources.downImage();
+            tooltip = constants.down();
+            break;
+        case UNKNOWN:
+            statusImage = resources.questionMarkImage();
+            tooltip = constants.unknown();
+            break;
+        default:
+            statusImage = resources.downImage();
+            tooltip = constants.down();
+        }
+
+        // Generate the HTML for the image:
+        SafeHtml statusImageHtml =
+                
SafeHtmlUtils.fromTrustedString(AbstractImagePrototype.create(statusImage).getHTML());
+        sb.append(applicationTemplates.statusTemplate(statusImageHtml, 
tooltip));
+    }
+}
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/GlusterVolumeSnapshotStatusColumn.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/GlusterVolumeSnapshotStatusColumn.java
new file mode 100644
index 0000000..add4a7d
--- /dev/null
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/GlusterVolumeSnapshotStatusColumn.java
@@ -0,0 +1,27 @@
+package org.ovirt.engine.ui.webadmin.widget.table.column;
+
+import java.util.Comparator;
+
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSnapshotEntity;
+import org.ovirt.engine.ui.common.widget.table.column.SortableColumn;
+
+public class GlusterVolumeSnapshotStatusColumn extends 
SortableColumn<GlusterVolumeSnapshotEntity, GlusterVolumeSnapshotEntity> {
+
+    public GlusterVolumeSnapshotStatusColumn() {
+        super(new GlusterVolumeSnapshotStatusCell());
+    }
+
+    @Override
+    public GlusterVolumeSnapshotEntity getValue(GlusterVolumeSnapshotEntity 
object) {
+        return object;
+    }
+
+    public void makeSortable() {
+        makeSortable(new Comparator<GlusterVolumeSnapshotEntity>() {
+            @Override
+            public int compare(GlusterVolumeSnapshotEntity o1, 
GlusterVolumeSnapshotEntity o2) {
+                return o1.getStatus().ordinal() - o2.getStatus().ordinal();
+            }
+        });
+    }
+}


-- 
To view, visit https://gerrit.ovirt.org/39290
To unsubscribe, visit https://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ic1953aad3d013d386719a43b4bfdda82896cc3af
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: ovirt-engine-3.5-gluster
Gerrit-Owner: Shubhendu Tripathi <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to