Shubhendu Tripathi has uploaded a new change for review.

Change subject: gluster: WIP-Sync job for gluster volume snapshots
......................................................................

gluster: WIP-Sync job for gluster volume snapshots

Sync job for gluster volume snapshots

Change-Id: I7b7bf79b72fc5680dab301b290e7aa860d5c714d
Signed-off-by: Shubhendu Tripathi <shtri...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/CreateGlusterVolumeSnapshotCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterJobsManager.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterSnapshotSyncJob.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterSnapshotStatus.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterVolumeSnapshotInfo.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllErrors.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/gluster/GlusterFeatureSupported.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/gluster/GlusterVolumeSnapshotInfoVDSParameters.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeSnapshotDaoDbFacadeImpl.java
M backend/manager/modules/dal/src/main/resources/bundles/VdsmErrors.properties
M 
backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeSnapshotDaoTest.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/AbstractGlusterBrokerCommand.java
A 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GetGlusterVolumeSnapshotInfoVDSCommand.java
A 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GlusterVolumeSnapshotInfoReturnForXmlRpc.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcVdsServer.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java
M 
frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/VdsmErrors.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/GlusterVolumeSnapshotStatusCell.java
M 
frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/VdsmErrors.properties
M packaging/dbscripts/gluster_volume_snapshot_sp.sql
24 files changed, 600 insertions(+), 84 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/04/35904/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/CreateGlusterVolumeSnapshotCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/CreateGlusterVolumeSnapshotCommand.java
index 1e95086..d22c6b0 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/CreateGlusterVolumeSnapshotCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/CreateGlusterVolumeSnapshotCommand.java
@@ -68,7 +68,7 @@
             createdSnapshot.setDescription(snapshot.getDescription());
             createdSnapshot.setSnapshotName(snapshot.getSnapshotName());
             createdSnapshot.setCreatedAt(new Date());
-            createdSnapshot.setStatus(GlusterSnapshotStatus.ACTIVATED);
+            createdSnapshot.setStatus(GlusterSnapshotStatus.STARTED);
             getDbFacade().getGlusterVolumeSnapshotDao().save(createdSnapshot);
         }
         addCustomValue(GlusterConstants.VOLUME_SNAPSHOT_NAME, 
getParameters().getSnapshot().getSnapshotName());
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterJobsManager.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterJobsManager.java
index cd20f43..91fe2fa 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterJobsManager.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterJobsManager.java
@@ -72,6 +72,14 @@
                 getRefreshRate(ConfigValues.GlusterRefreshRateGeoRepDiscovery),
                 TimeUnit.SECONDS);
 
+        scheduler.scheduleAFixedDelayJob(GlusterSnapshotSyncJob.getInstance(),
+                "gluster_snapshot_poll_event",
+                new Class[0],
+                new Class[0],
+                
getRefreshRate(ConfigValues.GlusterRefreshRateSnapshotDiscovery),
+                
getRefreshRate(ConfigValues.GlusterRefreshRateSnapshotDiscovery),
+                TimeUnit.SECONDS);
+
     }
 
     private static boolean glusterModeSupported() {
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterSnapshotSyncJob.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterSnapshotSyncJob.java
new file mode 100644
index 0000000..fcf8abb
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterSnapshotSyncJob.java
@@ -0,0 +1,176 @@
+package org.ovirt.engine.core.bll.gluster;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.Callable;
+
+import org.ovirt.engine.core.common.businessentities.VDS;
+import org.ovirt.engine.core.common.businessentities.VDSGroup;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSnapshotEntity;
+import org.ovirt.engine.core.common.errors.VdcBLLException;
+import org.ovirt.engine.core.common.errors.VdcBllErrors;
+import org.ovirt.engine.core.common.gluster.GlusterFeatureSupported;
+import org.ovirt.engine.core.common.utils.Pair;
+import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
+import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
+import 
org.ovirt.engine.core.common.vdscommands.gluster.GlusterVolumeSnapshotInfoVDSParameters;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.dal.dbbroker.DbFacade;
+import org.ovirt.engine.core.dao.gluster.GlusterVolumeDao;
+import org.ovirt.engine.core.dao.gluster.GlusterVolumeSnapshotDao;
+import org.ovirt.engine.core.utils.threadpool.ThreadPoolUtil;
+import org.ovirt.engine.core.utils.timer.OnTimerMethodAnnotation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class GlusterSnapshotSyncJob extends GlusterJob {
+    private static final Logger log = 
LoggerFactory.getLogger(GlusterSnapshotSyncJob.class);
+    private static final GlusterSnapshotSyncJob instance = new 
GlusterSnapshotSyncJob();
+
+    public void init() {
+        log.info("Gluster snapshot monitoring has been initialized");
+    }
+
+    public static GlusterSnapshotSyncJob getInstance() {
+        return instance;
+    }
+
+    @OnTimerMethodAnnotation("gluster_snapshot_poll_event")
+    public void refreshSnapshotData() {
+        // get all clusters
+        List<VDSGroup> clusters = getClusterDao().getAll();
+
+        for (VDSGroup cluster : clusters) {
+            refreshSnapshotsInCluster(cluster, false);
+        }
+    }
+
+    private void refreshSnapshotsInCluster(VDSGroup cluster, boolean 
throwError) {
+        if (!supportsGlusterSnapshotFeature(cluster)) {
+            return;
+        }
+
+        final VDS upServer = getClusterUtils().getUpServer(cluster.getId());
+        List<GlusterVolumeEntity> volumes = 
getGlusterVolumeDao().getByClusterId(cluster.getId());
+
+        if (volumes != null && volumes.size() > 0) {
+            List<Callable<Pair<GlusterVolumeEntity, VDSReturnValue>>> taskList 
=
+                    new ArrayList<Callable<Pair<GlusterVolumeEntity, 
VDSReturnValue>>>();
+            for (final GlusterVolumeEntity volume : volumes) {
+                taskList.add(new Callable<Pair<GlusterVolumeEntity, 
VDSReturnValue>>() {
+                    @Override
+                    public Pair<GlusterVolumeEntity, VDSReturnValue> call() 
throws Exception {
+                        VDSReturnValue returnValue =
+                                
runVdsCommand(VDSCommandType.GetGlusterVolumeSnapshotInfo,
+                                        new 
GlusterVolumeSnapshotInfoVDSParameters(volume.getClusterId(),
+                                                upServer.getId(),
+                                                volume.getName(),
+                                                null));
+                        return new Pair<GlusterVolumeEntity, 
VDSReturnValue>(volume, returnValue);
+                    }
+                });
+            }
+            List<Pair<GlusterVolumeEntity, VDSReturnValue>> pairResults = 
ThreadPoolUtil.invokeAll(taskList);
+            try {
+                addOrUpdateSnapshots(cluster.getId(), pairResults);
+            } catch (VdcBLLException e) {
+                if (throwError) {
+                    throw e;
+                }
+            }
+        }
+    }
+
+    private void addOrUpdateSnapshots(Guid clusterId, 
List<Pair<GlusterVolumeEntity, VDSReturnValue>> pairResults) {
+        try {
+            for (Pair<GlusterVolumeEntity, VDSReturnValue> entry : 
pairResults) {
+                GlusterVolumeEntity volume = entry.getFirst();
+                List<GlusterVolumeSnapshotEntity> existingSnapshots =
+                        
getGlusterVolumeSnapshotDao().getAllByVolumeId(volume.getId());
+                List<GlusterVolumeSnapshotEntity> fetchedSnapshots =
+                        (ArrayList<GlusterVolumeSnapshotEntity>) 
entry.getSecond().getReturnValue();
+
+                // form the maps for fetched and existing snapshots
+                Map<Guid, GlusterVolumeSnapshotEntity> existingSnapshotsMap =
+                        new HashMap<Guid, GlusterVolumeSnapshotEntity>();
+                for (final GlusterVolumeSnapshotEntity existingSnapshot : 
existingSnapshots) {
+                    existingSnapshotsMap.put(existingSnapshot.getSnapshotId(), 
existingSnapshot);
+                }
+                Map<Guid, GlusterVolumeSnapshotEntity> fetchedSnapshotsMap =
+                        new HashMap<Guid, GlusterVolumeSnapshotEntity>();
+                for (final GlusterVolumeSnapshotEntity fetchedSnapshot : 
fetchedSnapshots) {
+                    fetchedSnapshotsMap.put(fetchedSnapshot.getId(), 
fetchedSnapshot);
+                }
+
+                List<GlusterVolumeSnapshotEntity> updatedSnapshots = new 
ArrayList<GlusterVolumeSnapshotEntity>();
+                List<GlusterVolumeSnapshotEntity> newlyAddedSnapshots = new 
ArrayList<GlusterVolumeSnapshotEntity>();
+                List<GlusterVolumeSnapshotEntity> deletedSnapshots = new 
ArrayList<GlusterVolumeSnapshotEntity>();
+
+                for (final GlusterVolumeSnapshotEntity fetchedSnapshot : 
fetchedSnapshots) {
+                    GlusterVolumeSnapshotEntity existingSnapshot = 
existingSnapshotsMap.get(fetchedSnapshot.getId());
+
+                    if (existingSnapshot != null) {
+                        
existingSnapshot.setStatus(fetchedSnapshot.getStatus());
+                        updatedSnapshots.add(existingSnapshot);
+                    } else {
+                        newlyAddedSnapshots.add(fetchedSnapshot);
+                    }
+                }
+
+                for (final GlusterVolumeSnapshotEntity existingSnapshot : 
existingSnapshots) {
+                    if (fetchedSnapshotsMap.get(existingSnapshot.getId()) == 
null) {
+                        deletedSnapshots.add(existingSnapshot);
+                    }
+                }
+
+                // update snapshot details
+                try {
+                    acquireLock(volume.getId());
+
+                    saveNewSnapshots(newlyAddedSnapshots);
+                    updateSnapshots(updatedSnapshots);
+                    deleteSnapshots(deletedSnapshots);
+                } finally {
+                    releaseLock(volume.getId());
+                }
+            }
+        } catch (Exception e) {
+            log.error("Exception in sync", e);
+            throw new 
VdcBLLException(VdcBllErrors.GlusterSnapshotInfoFailedException, 
e.getLocalizedMessage());
+        }
+    }
+
+    private void saveNewSnapshots(List<GlusterVolumeSnapshotEntity> snaphosts) 
{
+        for (GlusterVolumeSnapshotEntity snapshot : snaphosts) {
+            getGlusterVolumeSnapshotDao().save(snapshot);
+        }
+    }
+
+    private void updateSnapshots(List<GlusterVolumeSnapshotEntity> snapshots) {
+        for (GlusterVolumeSnapshotEntity snapshot : snapshots) {
+            
getGlusterVolumeSnapshotDao().updateSnapshotStatus(snapshot.getId(), 
snapshot.getStatus());
+        }
+    }
+
+    private void deleteSnapshots(List<GlusterVolumeSnapshotEntity> snaphosts) {
+        for (GlusterVolumeSnapshotEntity snapshot : snaphosts) {
+            getGlusterVolumeSnapshotDao().remove(snapshot.getId());
+        }
+    }
+
+    private boolean supportsGlusterSnapshotFeature(VDSGroup cluster) {
+        return cluster.supportsGlusterService()
+                && 
GlusterFeatureSupported.glusterSnapshot(cluster.getcompatibility_version());
+    }
+
+    private GlusterVolumeDao getGlusterVolumeDao() {
+        return DbFacade.getInstance().getGlusterVolumeDao();
+    }
+
+    private GlusterVolumeSnapshotDao getGlusterVolumeSnapshotDao() {
+        return DbFacade.getInstance().getGlusterVolumeSnapshotDao();
+    }
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterSnapshotStatus.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterSnapshotStatus.java
index 0c92536..3a171dc 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterSnapshotStatus.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterSnapshotStatus.java
@@ -1,13 +1,13 @@
 package org.ovirt.engine.core.common.businessentities.gluster;
 
 public enum GlusterSnapshotStatus {
-    ACTIVATED,
-    DEACTIVATED,
+    STARTED,
+    STOPPED,
     UNKNOWN;
 
     public static GlusterSnapshotStatus from(String status) {
         for (GlusterSnapshotStatus snapshotStatus : values()) {
-            if (snapshotStatus.name().equals(status)) {
+            if (snapshotStatus.name().equalsIgnoreCase(status)) {
                 return snapshotStatus;
             }
         }
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterVolumeSnapshotInfo.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterVolumeSnapshotInfo.java
new file mode 100644
index 0000000..c21f007
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterVolumeSnapshotInfo.java
@@ -0,0 +1,57 @@
+package org.ovirt.engine.core.common.businessentities.gluster;
+
+import java.io.Serializable;
+import java.util.List;
+
+import org.ovirt.engine.core.common.utils.ObjectUtils;
+import org.ovirt.engine.core.compat.Guid;
+
+public class GlusterVolumeSnapshotInfo implements Serializable {
+    private static final long serialVersionUID = -768822766895441199L;
+
+    private Guid volumeId;
+    private List<GlusterVolumeSnapshotEntity> snapshots;
+
+    public GlusterVolumeSnapshotInfo() {
+    }
+
+    public Guid getVolumeId() {
+        return this.volumeId;
+    }
+
+    public void setVolumeId(Guid volumeId) {
+        this.volumeId = volumeId;
+    }
+
+    public List<GlusterVolumeSnapshotEntity> getSnapshots() {
+        return this.snapshots;
+    }
+
+    public void setSnapshots(List<GlusterVolumeSnapshotEntity> snapshots) {
+        this.snapshots = snapshots;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (!(obj instanceof GlusterVolumeSnapshotInfo)) {
+            return false;
+        }
+        GlusterVolumeSnapshotInfo snapshotInfo = (GlusterVolumeSnapshotInfo) 
obj;
+        if (!ObjectUtils.objectsEqual(getVolumeId(), 
snapshotInfo.getVolumeId())) {
+            return false;
+        }
+        if (!ObjectUtils.objectsEqual(getSnapshots(), 
snapshotInfo.getSnapshots())) {
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((getVolumeId() == null) ? 0 : 
getVolumeId().hashCode());
+        result = prime * result + ((getSnapshots() == null) ? 0 : 
getSnapshots().hashCode());
+        return result;
+    }
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java
index 8c6c3f6..9715a23 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java
@@ -1384,10 +1384,18 @@
     @DefaultValueAttribute("true")
     GlusterGeoReplicationEnabled,
 
+    @TypeConverterAttribute(Boolean.class)
+    @DefaultValueAttribute("true")
+    GlusterVolumeSnapshotSupported,
+
     @TypeConverterAttribute(Integer.class)
     @DefaultValueAttribute("3600")
     GlusterRefreshRateGeoRepDiscovery,
 
+    @TypeConverterAttribute(Integer.class)
+    @DefaultValueAttribute("5")
+    GlusterRefreshRateSnapshotDiscovery,
+
     @TypeConverterAttribute(String.class)
     @DefaultValueAttribute("AttestationService/resources/PollHosts")
     PollUri,
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllErrors.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllErrors.java
index 7f52ff6..c24b560 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllErrors.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllErrors.java
@@ -407,6 +407,7 @@
     GlusterVolumeGeoRepStatusDetailFailed(4600),
     GlusterSnapshotException(4700),
     GlusterSnapshotCreateFailedException(4701),
+    GlusterSnapshotInfoFailedException(4708),
 
     UnicodeArgumentException(4900),
 
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/gluster/GlusterFeatureSupported.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/gluster/GlusterFeatureSupported.java
index 2b2a529..96a98cd 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/gluster/GlusterFeatureSupported.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/gluster/GlusterFeatureSupported.java
@@ -91,4 +91,15 @@
    public static boolean glusterGeoReplication(Version version) {
        return supportedInConfig(ConfigValues.GlusterGeoReplicationEnabled, 
version);
    }
+
+   /**
+   *
+   * @param version
+   *            Compatibility version to check for.
+   * @return <code>true</code> if gluster snapshot management feature is 
enabled,
+   *         <code>false</code> if it's not.
+   */
+  public static boolean glusterSnapshot(Version version) {
+      return supportedInConfig(ConfigValues.GlusterVolumeSnapshotSupported, 
version);
+  }
 }
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java
index 9b39eaa..86c5c03 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java
@@ -162,6 +162,7 @@
     StopGlusterVolumeGeoRepSession("org.ovirt.engine.core.vdsbroker.gluster"),
     
DeleteGlusterVolumeGeoRepSession("org.ovirt.engine.core.vdsbroker.gluster"),
     CreateGlusterVolumeSnapshot("org.ovirt.engine.core.vdsbroker.gluster"),
+    GetGlusterVolumeSnapshotInfo("org.ovirt.engine.core.vdsbroker.gluster"),
     SetNumberOfCpus("org.ovirt.engine.core.vdsbroker"),
     UpdateVmPolicy("org.ovirt.engine.core.vdsbroker"),
     List("org.ovirt.engine.core.vdsbroker.vdsbroker"),           // get a list 
of VMs with status only
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/gluster/GlusterVolumeSnapshotInfoVDSParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/gluster/GlusterVolumeSnapshotInfoVDSParameters.java
new file mode 100644
index 0000000..a03c2b6
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/gluster/GlusterVolumeSnapshotInfoVDSParameters.java
@@ -0,0 +1,23 @@
+package org.ovirt.engine.core.common.vdscommands.gluster;
+
+import org.ovirt.engine.core.compat.Guid;
+
+public class GlusterVolumeSnapshotInfoVDSParameters extends 
GlusterVolumeSnapshotVDSParameters {
+    private Guid clusterId;
+
+    public GlusterVolumeSnapshotInfoVDSParameters() {
+    }
+
+    public GlusterVolumeSnapshotInfoVDSParameters(Guid clusterId, Guid 
serverId, String volumeName, String snapshotName) {
+        super(serverId, volumeName, snapshotName);
+        this.clusterId = clusterId;
+    }
+
+    public Guid getClusterId() {
+        return this.clusterId;
+    }
+
+    public void setClusterId(Guid clusterId) {
+        this.clusterId = clusterId;
+    }
+}
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeSnapshotDaoDbFacadeImpl.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeSnapshotDaoDbFacadeImpl.java
index da04249..46b7277 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeSnapshotDaoDbFacadeImpl.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeSnapshotDaoDbFacadeImpl.java
@@ -131,7 +131,8 @@
                 .addValue("snapshot_name", snapshot.getSnapshotName())
                 .addValue("volume_id", snapshot.getVolumeId())
                 .addValue("description", snapshot.getDescription())
-                .addValue("status", 
EnumUtils.nameOrNull(snapshot.getStatus()));
+                .addValue("status", EnumUtils.nameOrNull(snapshot.getStatus()))
+                .addValue("_create_date", snapshot.getCreatedAt());
     }
 
     private MapSqlParameterSource createSnapshotIdParams(Guid id) {
diff --git 
a/backend/manager/modules/dal/src/main/resources/bundles/VdsmErrors.properties 
b/backend/manager/modules/dal/src/main/resources/bundles/VdsmErrors.properties
index fdaa03b..1d35961 100644
--- 
a/backend/manager/modules/dal/src/main/resources/bundles/VdsmErrors.properties
+++ 
b/backend/manager/modules/dal/src/main/resources/bundles/VdsmErrors.properties
@@ -380,6 +380,7 @@
 GlusterVolumeGeoRepStopFailedException=Failed to stop geo-replication session
 GlusterSnapshotException=Gluster Snapshot Exception
 GlusterSnapshotCreateFailedException=Gluster snapshot create failed
+GlusterSnapshotInfoFailedException=Gluster snapshot info failed
 
 CANT_RECONSTRUCT_WHEN_A_DOMAIN_IN_POOL_IS_LOCKED=Can't reconstruct the Master 
Domain when the Data Center contains Domains in Locked state.\nPlease wait 
until the operation for these Domains ends before trying to reconstruct the 
Master Domain again.
 NO_IMPLEMENTATION=Not implemented
diff --git 
a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeSnapshotDaoTest.java
 
b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeSnapshotDaoTest.java
index 1aeca81..976694c 100644
--- 
a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeSnapshotDaoTest.java
+++ 
b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeSnapshotDaoTest.java
@@ -114,13 +114,13 @@
 
     @Test
     public void testUpdateVolumeStatus() {
-        dao.updateSnapshotStatus(existingSnapshot.getSnapshotId(), 
GlusterSnapshotStatus.DEACTIVATED);
+        dao.updateSnapshotStatus(existingSnapshot.getSnapshotId(), 
GlusterSnapshotStatus.STOPPED);
         GlusterVolumeSnapshotEntity snapshot = 
dao.getById(existingSnapshot.getSnapshotId());
 
         assertNotNull(snapshot);
 
         assertFalse(snapshot.equals(existingSnapshot));
-        existingSnapshot.setStatus(GlusterSnapshotStatus.DEACTIVATED);
+        existingSnapshot.setStatus(GlusterSnapshotStatus.STOPPED);
         assertEquals(existingSnapshot, snapshot);
     }
 
@@ -128,13 +128,13 @@
     public void testUpdateSnapshotStatusByName() {
         dao.updateSnapshotStatusByName(existingSnapshot.getVolumeId(),
                 existingSnapshot.getSnapshotName(),
-                GlusterSnapshotStatus.DEACTIVATED);
+                GlusterSnapshotStatus.STOPPED);
         GlusterVolumeSnapshotEntity snapshot = 
dao.getById(existingSnapshot.getSnapshotId());
 
         assertNotNull(snapshot);
 
         assertFalse(snapshot.equals(existingSnapshot));
-        existingSnapshot.setStatus(GlusterSnapshotStatus.DEACTIVATED);
+        existingSnapshot.setStatus(GlusterSnapshotStatus.STOPPED);
         assertEquals(existingSnapshot, snapshot);
     }
 
@@ -147,7 +147,7 @@
         snapshot.setSnapshotName(NEW_SNAPSHOT_NAME);
         snapshot.setVolumeId(VOLUME_ID);
         snapshot.setDescription("test-description");
-        snapshot.setStatus(GlusterSnapshotStatus.ACTIVATED);
+        snapshot.setStatus(GlusterSnapshotStatus.STARTED);
 
         dao.save(snapshot);
         return snapshot;
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/AbstractGlusterBrokerCommand.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/AbstractGlusterBrokerCommand.java
index e860239..92db1e4 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/AbstractGlusterBrokerCommand.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/AbstractGlusterBrokerCommand.java
@@ -76,6 +76,7 @@
         case GlusterVolumeGeoRepStopFailedException:
         case GlusterSnapshotException:
         case GlusterSnapshotCreateFailedException:
+        case GlusterSnapshotInfoFailedException:
 
             // Capture error from gluster command and record failure
             getVDSReturnValue().setVdsError(new VDSError(returnStatus, 
getReturnStatus().mMessage));
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GetGlusterVolumeSnapshotInfoVDSCommand.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GetGlusterVolumeSnapshotInfoVDSCommand.java
new file mode 100644
index 0000000..add1e7f
--- /dev/null
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GetGlusterVolumeSnapshotInfoVDSCommand.java
@@ -0,0 +1,38 @@
+package org.ovirt.engine.core.vdsbroker.gluster;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSnapshotEntity;
+import 
org.ovirt.engine.core.common.vdscommands.gluster.GlusterVolumeSnapshotInfoVDSParameters;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.vdsbroker.vdsbroker.StatusForXmlRpc;
+
+public class GetGlusterVolumeSnapshotInfoVDSCommand<P extends 
GlusterVolumeSnapshotInfoVDSParameters> extends AbstractGlusterBrokerCommand<P> 
{
+    private GlusterVolumeSnapshotInfoReturnForXmlRpc infoReturn;
+
+    public GetGlusterVolumeSnapshotInfoVDSCommand(P parameters) {
+        super(parameters);
+    }
+
+    @Override
+    protected StatusForXmlRpc getReturnStatus() {
+        return infoReturn.mStatus;
+    }
+
+    @Override
+    protected void executeVdsBrokerCommand() {
+        List<GlusterVolumeSnapshotEntity> snapshots = new 
ArrayList<GlusterVolumeSnapshotEntity>();
+
+        Guid clusterId = getParameters().getClusterId();
+        String volumeName = getParameters().getVolumeName();
+        String snapshotName = getParameters().getSnapshotName();
+        infoReturn = getBroker().glusterSnapshotInfo(clusterId, volumeName, 
snapshotName);
+        proceedProxyReturnValue();
+
+        if (getVDSReturnValue().getSucceeded()) {
+            snapshots = 
infoReturn.getGlusterVolumeSnapshotInfo().getSnapshots();
+            setReturnValue(snapshots);
+        }
+    }
+}
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GlusterVolumeSnapshotInfoReturnForXmlRpc.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GlusterVolumeSnapshotInfoReturnForXmlRpc.java
new file mode 100644
index 0000000..30b8db0
--- /dev/null
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/GlusterVolumeSnapshotInfoReturnForXmlRpc.java
@@ -0,0 +1,107 @@
+package org.ovirt.engine.core.vdsbroker.gluster;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterSnapshotStatus;
+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.GlusterVolumeSnapshotInfo;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.dal.dbbroker.DbFacade;
+import org.ovirt.engine.core.dao.gluster.GlusterVolumeDao;
+import org.ovirt.engine.core.dao.gluster.GlusterVolumeSnapshotDao;
+import org.ovirt.engine.core.vdsbroker.irsbroker.StatusReturnForXmlRpc;
+import org.ovirt.engine.core.vdsbroker.vdsbroker.StatusForXmlRpc;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@SuppressWarnings("unchecked")
+public final class GlusterVolumeSnapshotInfoReturnForXmlRpc extends 
StatusReturnForXmlRpc {
+    private static final String STATUS = "status";
+    private static final String SNAPSHOTS = "snapshots";
+    private static final String NAME = "name";
+    private static final String SNAPVOLUMES = "snapVolumes";
+    private static final String CREATETIME = "createTime";
+    private static final String UUID = "uuid";
+
+    private StatusForXmlRpc status;
+    private static final Logger log = 
LoggerFactory.getLogger(GlusterVolumesListReturnForXmlRpc.class);
+    private GlusterVolumeSnapshotInfo glusterVolumeSnapshotInfo = new 
GlusterVolumeSnapshotInfo();
+
+    public GlusterVolumeSnapshotInfo getGlusterVolumeSnapshotInfo() {
+        return glusterVolumeSnapshotInfo;
+    }
+
+    public GlusterVolumeSnapshotInfoReturnForXmlRpc(Guid clusterId, String 
volumeName, Map<String, Object> innerMap) {
+        super(innerMap);
+        status = new StatusForXmlRpc((Map<String, Object>) 
innerMap.get(STATUS));
+
+        Object[] snapshotsList = (Object[]) innerMap.get(SNAPSHOTS);
+
+        GlusterVolumeEntity volume = 
getGlusterVolumeDao().getByName(clusterId, volumeName);
+        glusterVolumeSnapshotInfo.setVolumeId(volume.getId());
+        
glusterVolumeSnapshotInfo.setSnapshots(prepareVolumeSnapshotsList(volume, 
snapshotsList));
+    }
+
+    private List<GlusterVolumeSnapshotEntity> 
prepareVolumeSnapshotsList(GlusterVolumeEntity volume,
+            Object[] snapshotInfoDetails) {
+
+        List<GlusterVolumeSnapshotEntity> newSnapshotsList = new 
ArrayList<GlusterVolumeSnapshotEntity>();
+
+        for (Object obj : snapshotInfoDetails) {
+            Map<String, Object> snapshotInfo = (Map<String, Object>) obj;
+
+            Object[] snapVolumes = (Object[]) (snapshotInfo.get(SNAPVOLUMES));
+            Map<String, Object> snapVolume = (Map<String, Object>) 
snapVolumes[0];
+            GlusterVolumeSnapshotEntity newSnapshot = new 
GlusterVolumeSnapshotEntity();
+            newSnapshot.setClusterId(volume.getClusterId());
+            newSnapshot.setVolumeId(volume.getId());
+            try {
+                DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                newSnapshot.setCreatedAt(df.parse((String) 
snapshotInfo.get(CREATETIME)));
+            } catch (Exception e) {
+                log.error("Could not populate snapshots of volume '{}' on 
cluster '{}': {}",
+                        volume.getName(),
+                        volume.getClusterId(),
+                        e.getMessage());
+                log.debug("Exception", e);
+            }
+            newSnapshot.setSnapshotId(Guid.createGuidFromString((String) 
snapshotInfo.get(UUID)));
+            newSnapshot.setSnapshotName((String) snapshotInfo.get(NAME));
+            newSnapshot.setStatus(GlusterSnapshotStatus.from((String) 
snapVolume.get(STATUS)));
+            newSnapshotsList.add(newSnapshot);
+        }
+
+        return newSnapshotsList;
+    }
+
+    private GlusterVolumeSnapshotEntity 
getSnapshotByName(List<GlusterVolumeSnapshotEntity> list, String name) {
+        for (GlusterVolumeSnapshotEntity entry : list) {
+            if (entry.getSnapshotName().equals(name)) {
+                return entry;
+            }
+        }
+
+        return null;
+    }
+
+    private GlusterVolumeSnapshotDao getGlusterVolumeSnapshotDao() {
+        return DbFacade.getInstance().getGlusterVolumeSnapshotDao();
+    }
+
+    private GlusterVolumeDao getGlusterVolumeDao() {
+        return DbFacade.getInstance().getGlusterVolumeDao();
+    }
+
+    public StatusForXmlRpc getStatus() {
+        return status;
+    }
+
+    public void setStatus(StatusForXmlRpc status) {
+        this.status = status;
+    }
+}
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcVdsServer.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcVdsServer.java
index d5cbe82..ba0a662 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcVdsServer.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcVdsServer.java
@@ -22,6 +22,7 @@
 import 
org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeGeoRepStatusForXmlRpc;
 import 
org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeOptionsInfoReturnForXmlRpc;
 import 
org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeProfileInfoReturnForXmlRpc;
+import 
org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeSnapshotInfoReturnForXmlRpc;
 import 
org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeStatusReturnForXmlRpc;
 import 
org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeTaskReturnForXmlRpc;
 import 
org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumesListReturnForXmlRpc;
@@ -59,11 +60,9 @@
 import org.ovirt.vdsm.jsonrpc.client.utils.retry.RetryPolicy;
 
 /**
- * Implementation of <code>IVdsServer</code> interface which provides JSONRPC 
by
- * using {@link JsonRpcClient}.
- * Each method uses {@link RequestBuilder} to build request object and sends it
- * using client. The response is represented as {@link FutureMap} which is lazy
- * evaluated.
+ * Implementation of <code>IVdsServer</code> interface which provides JSONRPC 
by using {@link JsonRpcClient}. Each
+ * method uses {@link RequestBuilder} to build request object and sends it 
using client. The response is represented as
+ * {@link FutureMap} which is lazy evaluated.
  *
  */
 public class JsonRpcVdsServer implements IVdsServer {
@@ -437,15 +436,15 @@
         });
         FutureTask<Map<String, Object>> future = new FutureTask<Map<String, 
Object>>(callable) {
 
-                    @Override
-                    public boolean isDone() {
-                        if (callable.isDone()) {
-                            updateHeartbeatPolicy(true);
-                            return true;
-                        }
-                        return false;
-                    }
-                };
+            @Override
+            public boolean isDone() {
+                if (callable.isDone()) {
+                    updateHeartbeatPolicy(true);
+                    return true;
+                }
+                return false;
+            }
+        };
         ThreadPoolUtil.execute(future);
         return future;
     }
@@ -931,11 +930,11 @@
 
         FutureTask<Map<String, Object>> future = new FutureTask<Map<String, 
Object>>(callable) {
 
-                    @Override
-                    public boolean isDone() {
-                        return callable.isDone();
-                    }
-                };
+            @Override
+            public boolean isDone() {
+                return callable.isDone();
+            }
+        };
 
         ThreadPoolUtil.execute(future);
         return future;
@@ -1219,24 +1218,29 @@
     }
 
     @Override
-    public StatusOnlyReturnForXmlRpc glusterVolumeGeoRepSessionDelete(String 
volumeName, String remoteHost, String remoteVolumeName) {
+    public StatusOnlyReturnForXmlRpc glusterVolumeGeoRepSessionDelete(String 
volumeName,
+            String remoteHost,
+            String remoteVolumeName) {
         JsonRpcRequest request = new 
RequestBuilder("GlusterVolume.geoRepSessionDelete")
-                                        .withParameter("volumeName", 
volumeName)
-                                        .withParameter("remoteHost", 
remoteHost)
-                                        .withParameter("remoteVolumeName", 
remoteVolumeName)
-                                        .build();
+                .withParameter("volumeName", volumeName)
+                .withParameter("remoteHost", remoteHost)
+                .withParameter("remoteVolumeName", remoteVolumeName)
+                .build();
         Map<String, Object> response = new FutureMap(this.client, request);
         return new StatusOnlyReturnForXmlRpc(response);
     }
 
     @Override
-    public StatusOnlyReturnForXmlRpc glusterVolumeGeoRepSessionStop(String 
volumeName, String remoteHost, String remoteVolumeName, Boolean force) {
+    public StatusOnlyReturnForXmlRpc glusterVolumeGeoRepSessionStop(String 
volumeName,
+            String remoteHost,
+            String remoteVolumeName,
+            Boolean force) {
         JsonRpcRequest request = new 
RequestBuilder("GlusterVolume.geoRepSessionStop")
-                                        .withParameter("volumeName", 
volumeName)
-                                        .withParameter("remoteHost", 
remoteHost)
-                                        .withParameter("remoteVolumeName", 
remoteVolumeName)
-                                        .withParameter("force", force)
-                                        .build();
+                .withParameter("volumeName", volumeName)
+                .withParameter("remoteHost", remoteHost)
+                .withParameter("remoteVolumeName", remoteVolumeName)
+                .withParameter("force", force)
+                .build();
         Map<String, Object> response = new FutureMap(this.client, request);
         return new StatusOnlyReturnForXmlRpc(response);
     }
@@ -1313,10 +1317,12 @@
     }
 
     @Override
-    public GlusterVolumeProfileInfoReturnForXmlRpc 
glusterVolumeProfileInfo(Guid clusterId, String volumeName, boolean nfs) {
+    public GlusterVolumeProfileInfoReturnForXmlRpc 
glusterVolumeProfileInfo(Guid clusterId,
+            String volumeName,
+            boolean nfs) {
         JsonRpcRequest request =
                 new 
RequestBuilder("GlusterVolume.profileInfo").withParameter("volumeName", 
volumeName)
-                .withParameter("nfs", nfs).build();
+                        .withParameter("nfs", nfs).build();
         Map<String, Object> response =
                 new FutureMap(this.client, request).withIgnoreResponseKey();
         return new GlusterVolumeProfileInfoReturnForXmlRpc(clusterId, 
response);
@@ -1477,14 +1483,16 @@
     @Override
     public GlusterVolumeGeoRepStatusForXmlRpc glusterVolumeGeoRepStatus(String 
volumeName) {
         JsonRpcRequest request = new 
RequestBuilder("GlusterVolume.geoRepStatus")
-                    .withParameter("volName", volumeName)
-                    .build();
+                .withParameter("volName", volumeName)
+                .build();
         Map<String, Object> response = new FutureMap(this.client, 
request).withIgnoreResponseKey();
         return new GlusterVolumeGeoRepStatusForXmlRpc(response);
     }
 
     @Override
-    public GlusterVolumeGeoRepStatusForXmlRpc glusterVolumeGeoRepStatus(String 
volumeName, String slaveHost, String slaveVolumeName) {
+    public GlusterVolumeGeoRepStatusForXmlRpc glusterVolumeGeoRepStatus(String 
volumeName,
+            String slaveHost,
+            String slaveVolumeName) {
         JsonRpcRequest request = new 
RequestBuilder("GlusterVolume.geoRepStatus").withParameter("volName", 
volumeName)
                 .withParameter("remoteHost", slaveHost)
                 .withParameter("remoteVolName", slaveVolumeName).build();
@@ -1493,10 +1501,13 @@
     }
 
     @Override
-    public GlusterVolumeGeoRepStatusDetailForXmlRpc 
glusterVolumeGeoRepStatusDetail(String volumeName, String slaveHost, String 
slaveVolumeName) {
-        JsonRpcRequest request = new 
RequestBuilder("GlusterVolume.geoRepStatusDetail").withParameter("volName", 
volumeName)
-                .withParameter("remoteHost", slaveHost)
-                .withParameter("remoteVolName", slaveVolumeName).build();
+    public GlusterVolumeGeoRepStatusDetailForXmlRpc 
glusterVolumeGeoRepStatusDetail(String volumeName,
+            String slaveHost,
+            String slaveVolumeName) {
+        JsonRpcRequest request =
+                new 
RequestBuilder("GlusterVolume.geoRepStatusDetail").withParameter("volName", 
volumeName)
+                        .withParameter("remoteHost", slaveHost)
+                        .withParameter("remoteVolName", 
slaveVolumeName).build();
         Map<String, Object> response = new FutureMap(this.client, 
request).withIgnoreResponseKey();
         return new GlusterVolumeGeoRepStatusDetailForXmlRpc(response);
     }
@@ -1547,15 +1558,30 @@
     }
 
     @Override
-    public OneUuidReturnForXmlRpc glusterSnapshotCreate(String volumeName, 
String snapshotName, String description, boolean force) {
+    public OneUuidReturnForXmlRpc glusterSnapshotCreate(String volumeName,
+            String snapshotName,
+            String description,
+            boolean force) {
         JsonRpcRequest request =
-                new 
RequestBuilder("GlusterSnapshot.create").withOptionalParameter("volumeName", 
volumeName)
+                new 
RequestBuilder("GlusterSnapshot.create").withParameter("volumeName", volumeName)
                         .withParameter("snapName", snapshotName)
-                        .withParameter("description", description)
+                        .withOptionalParameter("description", description)
                         .withParameter("force", force)
                         .build();
         Map<String, Object> response =
                 new FutureMap(this.client, request).withIgnoreResponseKey();
         return new OneUuidReturnForXmlRpc(response);
     }
+
+    @Override
+    public GlusterVolumeSnapshotInfoReturnForXmlRpc glusterSnapshotInfo(Guid 
clusterId,
+            String volumeName,
+            String snapshotName) {
+        JsonRpcRequest request =
+                new 
RequestBuilder("GlusterSnapshot.info").withOptionalParameter("snapName", 
snapshotName)
+                        .withOptionalParameter("volumeName", volumeName)
+                        .build();
+        Map<String, Object> response = new FutureMap(this.client, 
request).withIgnoreResponseKey();
+        return new GlusterVolumeSnapshotInfoReturnForXmlRpc(clusterId, 
volumeName, response);
+    }
 }
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java
index 8db932c..649f27b 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java
@@ -13,10 +13,11 @@
 import org.ovirt.engine.core.vdsbroker.gluster.GlusterServicesReturnForXmlRpc;
 import org.ovirt.engine.core.vdsbroker.gluster.GlusterTaskInfoReturnForXmlRpc;
 import org.ovirt.engine.core.vdsbroker.gluster.GlusterTasksListReturnForXmlRpc;
-import 
org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeGeoRepStatusForXmlRpc;
 import 
org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeGeoRepStatusDetailForXmlRpc;
+import 
org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeGeoRepStatusForXmlRpc;
 import 
org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeOptionsInfoReturnForXmlRpc;
 import 
org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeProfileInfoReturnForXmlRpc;
+import 
org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeSnapshotInfoReturnForXmlRpc;
 import 
org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeStatusReturnForXmlRpc;
 import 
org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeTaskReturnForXmlRpc;
 import 
org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumesListReturnForXmlRpc;
@@ -329,4 +330,6 @@
     StatusOnlyReturnForXmlRpc updateVmPolicy(Map info);
 
     OneUuidReturnForXmlRpc glusterSnapshotCreate(String volumeName, String 
snapshotName, String description, boolean force);
+
+    GlusterVolumeSnapshotInfoReturnForXmlRpc glusterSnapshotInfo(Guid 
clusterId, String snapshotName, String volumeName);
 }
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java
index a230498..add3d22 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java
@@ -308,4 +308,6 @@
     public Map<String, Object> updateVmPolicy(Map info);
 
     public Map<String, Object> glusterSnapshotCreate(String volumeName, String 
snapshotName, String description, boolean force);
+
+    public Map<String, Object> glusterSnapshotInfo(String snapshotName, String 
volumeName);
 }
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java
index c4167db..92ec5b9 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java
@@ -18,6 +18,7 @@
 import 
org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeGeoRepStatusForXmlRpc;
 import 
org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeOptionsInfoReturnForXmlRpc;
 import 
org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeProfileInfoReturnForXmlRpc;
+import 
org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeSnapshotInfoReturnForXmlRpc;
 import 
org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeStatusReturnForXmlRpc;
 import 
org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumeTaskReturnForXmlRpc;
 import 
org.ovirt.engine.core.vdsbroker.gluster.GlusterVolumesListReturnForXmlRpc;
@@ -27,7 +28,7 @@
 import org.ovirt.engine.core.vdsbroker.xmlrpc.XmlRpcRunTimeException;
 import org.ovirt.engine.core.vdsbroker.xmlrpc.XmlRpcUtils;
 
-@SuppressWarnings({"rawtypes", "unchecked"})
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class VdsServerWrapper implements IVdsServer {
 
     private final VdsServerConnector vdsServer;
@@ -329,7 +330,11 @@
     }
 
     @Override
-    public StatusOnlyReturnForXmlRpc setVmTicket(String vmId, String otp64, 
String sec, String connectionAction, Map<String, String> params) {
+    public StatusOnlyReturnForXmlRpc setVmTicket(String vmId,
+            String otp64,
+            String sec,
+            String connectionAction,
+            Map<String, String> params) {
         try {
             Map<String, Object> xmlRpcReturnValue = 
vdsServer.setVmTicket(vmId, otp64, sec, connectionAction, params);
             StatusOnlyReturnForXmlRpc wrapper = new 
StatusOnlyReturnForXmlRpc(xmlRpcReturnValue);
@@ -405,7 +410,7 @@
 
     @Override
     public FenceStatusReturnForXmlRpc fenceNode(String ip, String port, String 
type, String user, String password,
-                                                String action, String secured, 
String options,  Map<String, Object> fencingPolicy) {
+            String action, String secured, String options, Map<String, Object> 
fencingPolicy) {
         try {
             Map<String, Object> xmlRpcReturnValue;
             if (fencingPolicy == null) {
@@ -1095,9 +1100,13 @@
     }
 
     @Override
-    public GlusterTaskInfoReturnForXmlRpc glusterVolumeRebalanceStart(String 
volumeName, Boolean fixLayoutOnly, Boolean force) {
+    public GlusterTaskInfoReturnForXmlRpc glusterVolumeRebalanceStart(String 
volumeName,
+            Boolean fixLayoutOnly,
+            Boolean force) {
         try {
-            return new 
GlusterTaskInfoReturnForXmlRpc(vdsServer.glusterVolumeRebalanceStart(volumeName,
 fixLayoutOnly, force));
+            return new 
GlusterTaskInfoReturnForXmlRpc(vdsServer.glusterVolumeRebalanceStart(volumeName,
+                    fixLayoutOnly,
+                    force));
         } catch (UndeclaredThrowableException ute) {
             throw new XmlRpcRunTimeException(ute);
         }
@@ -1226,7 +1235,9 @@
     }
 
     @Override
-    public GlusterVolumeProfileInfoReturnForXmlRpc 
glusterVolumeProfileInfo(Guid clusterId, String volumeName, boolean nfs) {
+    public GlusterVolumeProfileInfoReturnForXmlRpc 
glusterVolumeProfileInfo(Guid clusterId,
+            String volumeName,
+            boolean nfs) {
         try {
             Map<String, Object> xmlRpcReturnValue = 
vdsServer.glusterVolumeProfileInfo(volumeName, nfs);
             GlusterVolumeProfileInfoReturnForXmlRpc wrapper =
@@ -1288,7 +1299,7 @@
         try {
             Map<String, Object> xmlRpcReturnValue = 
vdsServer.glusterHostUUIDGet();
             OneUuidReturnForXmlRpc wrapper = new 
OneUuidReturnForXmlRpc(xmlRpcReturnValue);
-             return wrapper;
+            return wrapper;
         } catch (UndeclaredThrowableException ute) {
             throw new XmlRpcRunTimeException(ute);
         }
@@ -1318,9 +1329,14 @@
     }
 
     @Override
-    public StatusOnlyReturnForXmlRpc glusterHookUpdate(String glusterCommand, 
String stage, String hookName, String content, String checksum) {
+    public StatusOnlyReturnForXmlRpc glusterHookUpdate(String glusterCommand,
+            String stage,
+            String hookName,
+            String content,
+            String checksum) {
         try {
-            Map<String, Object> xmlRpcReturnValue = 
vdsServer.glusterHookUpdate(glusterCommand, stage, hookName, content, checksum);
+            Map<String, Object> xmlRpcReturnValue =
+                    vdsServer.glusterHookUpdate(glusterCommand, stage, 
hookName, content, checksum);
             StatusOnlyReturnForXmlRpc wrapper = new 
StatusOnlyReturnForXmlRpc(xmlRpcReturnValue);
             return wrapper;
         } catch (UndeclaredThrowableException ute) {
@@ -1328,16 +1344,17 @@
         }
     }
 
-      @Override
+    @Override
     public StatusOnlyReturnForXmlRpc glusterHookAdd(String glusterCommand, 
String stage, String hookName,
             String content, String checksum, Boolean enabled) {
-          try {
-              Map<String, Object> xmlRpcReturnValue = 
vdsServer.glusterHookAdd(glusterCommand, stage, hookName, content, checksum, 
enabled);
-              StatusOnlyReturnForXmlRpc wrapper = new 
StatusOnlyReturnForXmlRpc(xmlRpcReturnValue);
-              return wrapper;
-          } catch (UndeclaredThrowableException ute) {
-              throw new XmlRpcRunTimeException(ute);
-          }
+        try {
+            Map<String, Object> xmlRpcReturnValue =
+                    vdsServer.glusterHookAdd(glusterCommand, stage, hookName, 
content, checksum, enabled);
+            StatusOnlyReturnForXmlRpc wrapper = new 
StatusOnlyReturnForXmlRpc(xmlRpcReturnValue);
+            return wrapper;
+        } catch (UndeclaredThrowableException ute) {
+            throw new XmlRpcRunTimeException(ute);
+        }
     }
 
     @Override
@@ -1352,11 +1369,11 @@
     }
 
     @Override
-    public GlusterServicesReturnForXmlRpc glusterServicesAction(Guid serverId, 
String [] serviceList, String actionType) {
+    public GlusterServicesReturnForXmlRpc glusterServicesAction(Guid serverId, 
String[] serviceList, String actionType) {
         try {
-          Map<String, Object> xmlRpcReturnValue = 
vdsServer.glusterServicesAction(serviceList, actionType);
-          GlusterServicesReturnForXmlRpc wrapper = new 
GlusterServicesReturnForXmlRpc(serverId, xmlRpcReturnValue);
-          return wrapper;
+            Map<String, Object> xmlRpcReturnValue = 
vdsServer.glusterServicesAction(serviceList, actionType);
+            GlusterServicesReturnForXmlRpc wrapper = new 
GlusterServicesReturnForXmlRpc(serverId, xmlRpcReturnValue);
+            return wrapper;
         } catch (UndeclaredThrowableException ute) {
             throw new XmlRpcRunTimeException(ute);
         }
@@ -1395,7 +1412,9 @@
     }
 
     @Override
-    public GlusterVolumeGeoRepStatusForXmlRpc glusterVolumeGeoRepStatus(String 
volumeName, String slaveHost, String slaveVolumeName) {
+    public GlusterVolumeGeoRepStatusForXmlRpc glusterVolumeGeoRepStatus(String 
volumeName,
+            String slaveHost,
+            String slaveVolumeName) {
         try {
             Map<String, Object> response;
             response = vdsServer.glusterVolumeGeoRepStatus(volumeName, 
slaveHost, slaveVolumeName);
@@ -1406,9 +1425,12 @@
     }
 
     @Override
-    public GlusterVolumeGeoRepStatusDetailForXmlRpc 
glusterVolumeGeoRepStatusDetail(String volumeName, String slaveHost, String 
slaveVolumeName) {
+    public GlusterVolumeGeoRepStatusDetailForXmlRpc 
glusterVolumeGeoRepStatusDetail(String volumeName,
+            String slaveHost,
+            String slaveVolumeName) {
         try {
-            Map<String, Object> response = 
vdsServer.glusterVolumeGeoRepStatusDetail(volumeName, slaveHost, 
slaveVolumeName);
+            Map<String, Object> response =
+                    vdsServer.glusterVolumeGeoRepStatusDetail(volumeName, 
slaveHost, slaveVolumeName);
             return new GlusterVolumeGeoRepStatusDetailForXmlRpc(response);
         } catch (UndeclaredThrowableException ute) {
             throw new XmlRpcRunTimeException(ute);
@@ -1512,9 +1534,34 @@
     }
 
     @Override
-    public OneUuidReturnForXmlRpc glusterSnapshotCreate(String volumeName, 
String snapshotName, String description, boolean force) {
+    public OneUuidReturnForXmlRpc glusterSnapshotCreate(String volumeName,
+            String snapshotName,
+            String description,
+            boolean force) {
         try {
-            return new 
OneUuidReturnForXmlRpc(vdsServer.glusterSnapshotCreate(volumeName, 
snapshotName, description, force));
+            return new 
OneUuidReturnForXmlRpc(vdsServer.glusterSnapshotCreate(volumeName,
+                    snapshotName,
+                    description,
+                    force));
+        } catch (UndeclaredThrowableException ute) {
+            throw new XmlRpcRunTimeException(ute);
+        }
+    }
+
+    @Override
+    public GlusterVolumeSnapshotInfoReturnForXmlRpc glusterSnapshotInfo(Guid 
clusterId,
+            String volumeName,
+            String snapshotName) {
+        try {
+            Map<String, Object> xmlRpcReturnValue;
+            if (snapshotName == null) {
+                xmlRpcReturnValue = vdsServer.glusterSnapshotInfo("", 
volumeName);
+            } else {
+                xmlRpcReturnValue = 
vdsServer.glusterSnapshotInfo(snapshotName, volumeName);
+            }
+            GlusterVolumeSnapshotInfoReturnForXmlRpc wrapper =
+                    new GlusterVolumeSnapshotInfoReturnForXmlRpc(clusterId, 
volumeName, xmlRpcReturnValue);
+            return wrapper;
         } catch (UndeclaredThrowableException ute) {
             throw new XmlRpcRunTimeException(ute);
         }
diff --git 
a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/VdsmErrors.java
 
b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/VdsmErrors.java
index b69488b..bcff534 100644
--- 
a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/VdsmErrors.java
+++ 
b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/VdsmErrors.java
@@ -839,4 +839,7 @@
 
     @DefaultStringValue("Gluster snapshot create failed")
     String GlusterSnapshotCreateFailedException();
+
+    @DefaultStringValue("Gluster snapshot info failed")
+    String GlusterSnapshotInfoFailedException();
 }
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
index b86e13e..1560a3c 100644
--- 
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
@@ -35,11 +35,11 @@
         String tooltip;
 
         switch (status) {
-        case ACTIVATED:
+        case STARTED:
             statusImage = resources.upImage();
             tooltip = constants.up();
             break;
-        case DEACTIVATED:
+        case STOPPED:
             statusImage = resources.downImage();
             tooltip = constants.down();
             break;
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/VdsmErrors.properties
 
b/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/VdsmErrors.properties
index 0e671c5..fc5bf02 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/VdsmErrors.properties
+++ 
b/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/VdsmErrors.properties
@@ -383,3 +383,4 @@
 GlusterVolumeRemoveBrickStatusFailed=Failed to get status of gluster volume 
remove bricks
 GlusterSnapshotException=Gluster Snapshot Exception
 GlusterSnapshotCreateFailedException=Gluster snapshot create failed
+GlusterSnapshotInfoFailedException=Gluster snapshot info failed
diff --git a/packaging/dbscripts/gluster_volume_snapshot_sp.sql 
b/packaging/dbscripts/gluster_volume_snapshot_sp.sql
index d261a19..4632422 100644
--- a/packaging/dbscripts/gluster_volume_snapshot_sp.sql
+++ b/packaging/dbscripts/gluster_volume_snapshot_sp.sql
@@ -9,14 +9,15 @@
                                                 v_snapshot_name VARCHAR(1000),
                                                 v_volume_id UUID,
                                                 v_description VARCHAR(1024),
-                                                v_status VARCHAR(32))
+                                                v_status VARCHAR(32),
+                                                v__create_date TIMESTAMP WITH 
TIME ZONE)
     RETURNS VOID
     AS $procedure$
 BEGIN
     INSERT INTO gluster_volume_snapshots (snapshot_id, snapshot_name, 
volume_id,
-        description, status)
+        description, status, _create_date)
     VALUES (v_snapshot_id,  v_snapshot_name, v_volume_id,
-        v_description, v_status);
+        v_description, v_status, v__create_date);
 END; $procedure$
 LANGUAGE plpgsql;
 


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I7b7bf79b72fc5680dab301b290e7aa860d5c714d
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Shubhendu Tripathi <shtri...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to