Shubhendu Tripathi has uploaded a new change for review.

Change subject: gluster: WIP - BLL command for scheduling volume snapshot
......................................................................

gluster: WIP - BLL command for scheduling volume snapshot

Introduced BLL command for gluster volume snapshots creation.

Change-Id: I4326ebb0c146eadceb6ae30cce73ece132749dc5
Signed-off-by: Shubhendu Tripathi <shtri...@redhat.com>
---
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterSnapshotScheduleJob.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/ReScheduleGlusterVolumeSnapshotCommand.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/ScheduleGlusterVolumeSnapshotCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/utils/GlusterUtil.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/gluster/ScheduleGlusterVolumeSnapshotParameters.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
M 
frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java
9 files changed, 436 insertions(+), 3 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/80/36980/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterSnapshotScheduleJob.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterSnapshotScheduleJob.java
new file mode 100644
index 0000000..6778f65
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterSnapshotScheduleJob.java
@@ -0,0 +1,79 @@
+package org.ovirt.engine.core.bll.gluster;
+
+import java.io.Serializable;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import org.ovirt.engine.core.bll.Backend;
+import org.ovirt.engine.core.bll.interfaces.BackendInternal;
+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.vdscommands.VDSCommandType;
+import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
+import 
org.ovirt.engine.core.common.vdscommands.gluster.GlusterVolumeCreateSnapshotVDSParameters;
+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.timer.OnTimerMethodAnnotation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class GlusterSnapshotScheduleJob implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private final static Logger log = 
LoggerFactory.getLogger(GlusterSnapshotScheduleJob.class);
+    private static final GlusterSnapshotScheduleJob instance = new 
GlusterSnapshotScheduleJob();
+
+    public GlusterSnapshotScheduleJob() {
+    }
+
+    public static GlusterSnapshotScheduleJob getInstance() {
+        return instance;
+    }
+
+    @OnTimerMethodAnnotation("onTimer")
+    public void onTimer(String serverId, String volumeId, String 
snapshotNamePrefix, String description, boolean force) {
+        GlusterVolumeEntity volume = getGlusterVolumeDao().getById(new 
Guid(volumeId));
+
+        GlusterVolumeSnapshotEntity snapshot = new 
GlusterVolumeSnapshotEntity();
+        snapshot.setClusterId(volume.getClusterId());
+        snapshot.setVolumeId(new Guid(volumeId));
+        DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
+        String snapshotName = snapshotNamePrefix + "-snap-" + df.format(new 
Date());
+        snapshot.setSnapshotName(snapshotName);
+        snapshot.setDescription(description);
+
+        VDSReturnValue returnValue = getBackend().getResourceManager()
+                .RunVdsCommand(VDSCommandType.CreateGlusterVolumeSnapshot,
+                        new GlusterVolumeCreateSnapshotVDSParameters(new 
Guid(serverId),
+                                volume.getName(),
+                                snapshotName,
+                                description,
+                                force));
+        if (returnValue.getSucceeded()) {
+            snapshot.setSnapshotId((Guid) returnValue.getReturnValue());
+            snapshot.setCreatedAt(new Date());
+            snapshot.setStatus(GlusterSnapshotStatus.STARTED);
+            getGlusterVolumeSnapshotDao().save(snapshot);
+        } else {
+            log.error("Error while creating snapshot for volume '{}': {}", 
volume.getName(), returnValue.getVdsError()
+                    .getMessage());
+            log.debug(returnValue.getVdsError().getMessage());
+        }
+    }
+
+    protected GlusterVolumeDao getGlusterVolumeDao() {
+        return DbFacade.getInstance().getGlusterVolumeDao();
+    }
+
+    protected GlusterVolumeSnapshotDao getGlusterVolumeSnapshotDao() {
+        return DbFacade.getInstance().getGlusterVolumeSnapshotDao();
+    }
+
+    protected BackendInternal getBackend() {
+        return Backend.getInstance();
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/ReScheduleGlusterVolumeSnapshotCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/ReScheduleGlusterVolumeSnapshotCommand.java
new file mode 100644
index 0000000..ab30d89
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/ReScheduleGlusterVolumeSnapshotCommand.java
@@ -0,0 +1,129 @@
+package org.ovirt.engine.core.bll.gluster;
+
+import java.util.Collections;
+import java.util.Map;
+
+import org.ovirt.engine.core.bll.LockMessagesMatchUtil;
+import org.ovirt.engine.core.bll.utils.GlusterUtil;
+import org.ovirt.engine.core.common.AuditLogType;
+import org.ovirt.engine.core.common.action.LockProperties;
+import org.ovirt.engine.core.common.action.LockProperties.Scope;
+import 
org.ovirt.engine.core.common.action.gluster.ScheduleGlusterVolumeSnapshotParameters;
+import org.ovirt.engine.core.common.businessentities.VDSGroup;
+import org.ovirt.engine.core.common.businessentities.gluster.GlusterStatus;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSnapshotSchedule;
+import org.ovirt.engine.core.common.errors.VdcBllMessages;
+import org.ovirt.engine.core.common.locks.LockingGroup;
+import org.ovirt.engine.core.common.utils.Pair;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.dal.dbbroker.DbFacade;
+import org.ovirt.engine.core.dao.gluster.GlusterVolumeSnapshotScheduleDao;
+import org.ovirt.engine.core.utils.timer.SchedulerUtil;
+import org.ovirt.engine.core.utils.timer.SchedulerUtilQuartzDBImpl;
+
+public class ReScheduleGlusterVolumeSnapshotCommand extends 
GlusterVolumeCommandBase<ScheduleGlusterVolumeSnapshotParameters> {
+    private GlusterVolumeSnapshotSchedule schedule;
+    private Guid volumeId;
+    private boolean force;
+
+    public 
ReScheduleGlusterVolumeSnapshotCommand(ScheduleGlusterVolumeSnapshotParameters 
params) {
+        super(params);
+        this.schedule = getParameters().getSchedule();
+        this.force = getParameters().getForce();
+
+        if (this.schedule != null) {
+            setVdsGroupId(schedule.getClusterId());
+            volumeId = schedule.getVolumeId();
+        }
+    }
+
+    @Override
+    protected LockProperties applyLockProperties(LockProperties 
lockProperties) {
+        return lockProperties.withScope(Scope.Execution);
+    }
+
+    @Override
+    protected void setActionMessageParameters() {
+        addCanDoActionMessage(VdcBllMessages.VAR__ACTION__CREATE);
+    }
+
+    @Override
+    protected void executeCommand() {
+        GlusterVolumeSnapshotSchedule fetchedSchedule = 
getGlusterVolumeSnapshotScheduleDao().getByVolumeId(volumeId);
+        String jobId = fetchedSchedule.getJobId();
+        SchedulerUtil scheduler = SchedulerUtilQuartzDBImpl.getInstance();
+
+        // delete the existing job
+        scheduler.deleteJob(jobId);
+
+        // create a new job with same id
+        String cronExpression = 
GlusterUtil.getInstance().getCronExpression(schedule);
+        String newJobId = 
scheduler.scheduleACronJob(GlusterSnapshotScheduleJob.class,
+                "onTimer",
+                new Class[] { Guid.class, Guid.class, String.class, 
String.class, Boolean.class },
+                new Object[] { upServer.getId(), volumeId, 
schedule.getSnapshotNamePrefix(),
+                        schedule.getSnapshotDescription(), force },
+                cronExpression);
+
+        schedule.setJobId(newJobId);
+        
getGlusterVolumeSnapshotScheduleDao().updateScheduleByVolumeId(volumeId, 
schedule);
+    }
+
+    @Override
+    protected boolean canDoAction() {
+        if (!super.canDoAction()) {
+            return false;
+        }
+
+        VDSGroup cluster = getVdsGroup();
+        if (cluster == null) {
+            
addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_CLUSTER_IS_NOT_VALID);
+            return false;
+        }
+
+        if (!cluster.supportsGlusterService()) {
+            
addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_CLUSTER_DOES_NOT_SUPPORT_GLUSTER);
+            return false;
+        }
+
+        GlusterVolumeEntity volume = getGlusterVolumeDao().getById(volumeId);
+        if (volume != null && volume.getStatus() == GlusterStatus.DOWN) {
+            return 
failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_GLUSTER_VOLUME_IS_DOWN);
+        }
+
+        if (!GlusterUtil.getInstance().isVolumeThinlyProvisioned(volume)) {
+            return 
failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_GLUSTER_VOLUME_IS_NOT_THINLY_PROVISIONED);
+        }
+
+        GlusterVolumeSnapshotSchedule fetchedSchedule = 
getGlusterVolumeSnapshotScheduleDao().getByVolumeId(volumeId);
+        if (fetchedSchedule == null) {
+            return 
failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_GLUSTER_VOLUME_SNAPSHOT_NOT_SCHEDULED);
+        }
+
+        return true;
+    }
+
+    @Override
+    protected Map<String, Pair<String, String>> getExclusiveLocks() {
+        if (!isInternalExecution()) {
+            return Collections.singletonMap(schedule.getVolumeId().toString(),
+                    LockMessagesMatchUtil.makeLockingPair(LockingGroup.GLUSTER,
+                            VdcBllMessages.ACTION_TYPE_FAILED_OBJECT_LOCKED));
+        }
+        return null;
+    }
+
+    @Override
+    public AuditLogType getAuditLogTypeValue() {
+        if (getSucceeded()) {
+            return AuditLogType.GLUSTER_VOLUME_SNAPSHOT_RESCHEDULED;
+        } else {
+            return errorType == null ? 
AuditLogType.GLUSTER_VOLUME_SNAPSHOT_RESCHEDULE_FAILED : errorType;
+        }
+    }
+
+    private GlusterVolumeSnapshotScheduleDao 
getGlusterVolumeSnapshotScheduleDao() {
+        return DbFacade.getInstance().getGlusterVolumeSnapshotScheduleDao();
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/ScheduleGlusterVolumeSnapshotCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/ScheduleGlusterVolumeSnapshotCommand.java
new file mode 100644
index 0000000..c71cdbf
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/ScheduleGlusterVolumeSnapshotCommand.java
@@ -0,0 +1,131 @@
+package org.ovirt.engine.core.bll.gluster;
+
+import java.util.Collections;
+import java.util.Map;
+
+import org.ovirt.engine.core.bll.LockMessagesMatchUtil;
+import org.ovirt.engine.core.bll.utils.GlusterUtil;
+import org.ovirt.engine.core.common.AuditLogType;
+import org.ovirt.engine.core.common.action.LockProperties;
+import org.ovirt.engine.core.common.action.LockProperties.Scope;
+import 
org.ovirt.engine.core.common.action.gluster.ScheduleGlusterVolumeSnapshotParameters;
+import org.ovirt.engine.core.common.businessentities.VDSGroup;
+import org.ovirt.engine.core.common.businessentities.gluster.GlusterStatus;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSnapshotSchedule;
+import org.ovirt.engine.core.common.errors.VdcBllMessages;
+import org.ovirt.engine.core.common.locks.LockingGroup;
+import org.ovirt.engine.core.common.utils.Pair;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.dal.dbbroker.DbFacade;
+import org.ovirt.engine.core.dao.gluster.GlusterVolumeSnapshotScheduleDao;
+import org.ovirt.engine.core.utils.timer.SchedulerUtilQuartzDBImpl;
+
+public class ScheduleGlusterVolumeSnapshotCommand extends 
GlusterVolumeCommandBase<ScheduleGlusterVolumeSnapshotParameters> {
+    private GlusterVolumeSnapshotSchedule schedule;
+    private Guid volumeId;
+    private boolean force;
+
+    public 
ScheduleGlusterVolumeSnapshotCommand(ScheduleGlusterVolumeSnapshotParameters 
params) {
+        super(params);
+        this.schedule = getParameters().getSchedule();
+        this.force = getParameters().getForce();
+
+        if (this.schedule != null) {
+            setVdsGroupId(schedule.getClusterId());
+            volumeId = schedule.getVolumeId();
+        }
+    }
+
+    @Override
+    protected LockProperties applyLockProperties(LockProperties 
lockProperties) {
+        return lockProperties.withScope(Scope.Execution);
+    }
+
+    @Override
+    protected void setActionMessageParameters() {
+        addCanDoActionMessage(VdcBllMessages.VAR__ACTION__CREATE);
+    }
+
+    @Override
+    protected void executeCommand() {
+        // schedule the task
+        String jobId = scheduleJob();
+
+        if (jobId != null) {
+            setSucceeded(true);
+            schedule.setJobId(jobId);
+            getGlusterVolumeSnapshotScheduleDao().save(schedule);
+        }
+    }
+
+    private String scheduleJob() {
+        String cronExpression = 
GlusterUtil.getInstance().getCronExpression(schedule);
+        if (cronExpression == null)
+            return null;
+
+        return 
SchedulerUtilQuartzDBImpl.getInstance().scheduleACronJob(GlusterSnapshotScheduleJob.getInstance(),
+                "onTimer",
+                new Class[] { String.class, String.class, String.class, 
String.class, Boolean.class },
+                new Object[] { upServer.getId().toString(), 
volumeId.toString(), schedule.getSnapshotNamePrefix(),
+                        schedule.getSnapshotDescription(), force },
+                cronExpression);
+    }
+
+    @Override
+    protected boolean canDoAction() {
+        if (!super.canDoAction()) {
+            return false;
+        }
+
+        VDSGroup cluster = getVdsGroup();
+        if (cluster == null) {
+            
addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_CLUSTER_IS_NOT_VALID);
+            return false;
+        }
+
+        if (!cluster.supportsGlusterService()) {
+            
addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_CLUSTER_DOES_NOT_SUPPORT_GLUSTER);
+            return false;
+        }
+
+        GlusterVolumeEntity volume = getGlusterVolumeDao().getById(volumeId);
+        if (volume != null && volume.getStatus() == GlusterStatus.DOWN) {
+            return 
failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_GLUSTER_VOLUME_IS_DOWN);
+        }
+
+        if (!GlusterUtil.getInstance().isVolumeThinlyProvisioned(volume)) {
+            return 
failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_GLUSTER_VOLUME_IS_NOT_THINLY_PROVISIONED);
+        }
+
+        GlusterVolumeSnapshotSchedule fetchedSchedule = 
getGlusterVolumeSnapshotScheduleDao().getByVolumeId(volumeId);
+        if (fetchedSchedule != null) {
+            return 
failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_GLUSTER_VOLUME_SNAPSHOT_ALREADY_SCHEDULED);
+        }
+
+        return true;
+    }
+
+    @Override
+    protected Map<String, Pair<String, String>> getExclusiveLocks() {
+        if (!isInternalExecution()) {
+            return Collections.singletonMap(schedule.getVolumeId().toString(),
+                    LockMessagesMatchUtil.makeLockingPair(LockingGroup.GLUSTER,
+                            VdcBllMessages.ACTION_TYPE_FAILED_OBJECT_LOCKED));
+        }
+        return null;
+    }
+
+    @Override
+    public AuditLogType getAuditLogTypeValue() {
+        if (getSucceeded()) {
+            return AuditLogType.GLUSTER_VOLUME_SNAPSHOT_SCHEDULED;
+        } else {
+            return errorType == null ? 
AuditLogType.GLUSTER_VOLUME_SNAPSHOT_SCHEDULE_FAILED : errorType;
+        }
+    }
+
+    private GlusterVolumeSnapshotScheduleDao 
getGlusterVolumeSnapshotScheduleDao() {
+        return DbFacade.getInstance().getGlusterVolumeSnapshotScheduleDao();
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/utils/GlusterUtil.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/utils/GlusterUtil.java
index 7c32801..5b0df78 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/utils/GlusterUtil.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/utils/GlusterUtil.java
@@ -4,6 +4,7 @@
 import java.io.IOException;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
+import java.sql.Time;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -20,6 +21,8 @@
 import org.ovirt.engine.core.common.businessentities.VDS;
 import org.ovirt.engine.core.common.businessentities.gluster.GlusterServer;
 import org.ovirt.engine.core.common.businessentities.gluster.GlusterServerInfo;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSnapshotSchedule;
 import 
org.ovirt.engine.core.common.businessentities.network.VdsNetworkInterface;
 import org.ovirt.engine.core.common.config.Config;
 import org.ovirt.engine.core.common.config.ConfigValues;
@@ -71,7 +74,8 @@
      * @throws AuthenticationException
      *             If SSH authentication with given root password fails
      */
-    public Set<String> getPeers(String server, String username, String 
password) throws AuthenticationException, IOException {
+    public Set<String> getPeers(String server, String username, String 
password) throws AuthenticationException,
+            IOException {
 
         try (final SSHClient client = getSSHClient()) {
             connect(client, server);
@@ -222,7 +226,8 @@
     public EngineLock acquireGlusterLockWait(Guid clusterId) {
         Map<String, Pair<String, String>> exclusiveLocks = new HashMap<String, 
Pair<String, String>>();
         exclusiveLocks.put(clusterId.toString(),
-                LockMessagesMatchUtil.makeLockingPair(LockingGroup.GLUSTER, 
VdcBllMessages.ACTION_TYPE_FAILED_GLUSTER_OPERATION_INPROGRESS));
+                LockMessagesMatchUtil.makeLockingPair(LockingGroup.GLUSTER,
+                        
VdcBllMessages.ACTION_TYPE_FAILED_GLUSTER_OPERATION_INPROGRESS));
         EngineLock lock = new EngineLock(exclusiveLocks, null);
         LockManagerFactory.getLockManager().acquireLockWait(lock);
         return lock;
@@ -265,4 +270,44 @@
         List<VdsNetworkInterface> interfaces = 
DbFacade.getInstance().getInterfaceDao().getAllInterfacesForVds(vdsId);
         return (interfaces == null) ? new ArrayList<VdsNetworkInterface>() : 
interfaces;
     }
+
+    public boolean isVolumeThinlyProvisioned(GlusterVolumeEntity volume) {
+        // TODO: As part of disk provisioning feature in oVirt for gluster, a 
flag would be maintained
+        // as part Gluster Volume Entity which depicts if the volume bricks 
are thinly provisioned or not.
+        // The same flag would be used here to decide accordingly later.
+        return true;
+    }
+
+    public String getCronExpression(GlusterVolumeSnapshotSchedule schedule) {
+        String retStr = "";
+
+        switch (schedule.getRecurrence()) {
+        case INTERVAL:
+            int interval = schedule.getInterval();
+            retStr = "0 */" + interval + " * * * ? *";
+            break;
+        case HOURLY:
+            // Date startDate = schedule.getStartDate();
+            retStr = "0 0 * * * ? *";
+            break;
+        case DAILY:
+            Time execTime = schedule.getExecutionTime();
+            retStr = "0 " + execTime.getMinutes() + " " + execTime.getHours() 
+ " * * ? *";
+            break;
+        case WEEKLY:
+            String days = schedule.getDays();
+            Time execTime1 = schedule.getExecutionTime();
+            retStr = "0 " + execTime1.getMinutes() + " " + 
execTime1.getHours() + " ? * " + days + " *";
+            break;
+        case MONTHLY:
+            String days1 = schedule.getDays();
+            Time execTime2 = schedule.getExecutionTime();
+            retStr = "0 " + execTime2.getMinutes() + " " + 
execTime2.getHours() + " " + days1 + " * ? *";
+            break;
+        case UNKNOWN:
+            return null;
+        }
+
+        return retStr;
+    }
 }
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java
index 6134f76..04773f8 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java
@@ -392,7 +392,10 @@
     GEOREP_SESSION_STOP_FAILED(4102, AuditLogSeverity.ERROR),
     GEOREP_SESSION_DELETE(4103),
     GEOREP_SESSION_DELETE_FAILED(4104, AuditLogSeverity.ERROR),
-
+    GLUSTER_VOLUME_SNAPSHOT_SCHEDULED(4105),
+    GLUSTER_VOLUME_SNAPSHOT_SCHEDULE_FAILED(4106, AuditLogSeverity.ERROR),
+    GLUSTER_VOLUME_SNAPSHOT_RESCHEDULED(4107),
+    GLUSTER_VOLUME_SNAPSHOT_RESCHEDULE_FAILED(4108, AuditLogSeverity.ERROR),
     USER_FORCE_SELECTED_SPM(159),
     USER_VDS_RESTART(41),
     USER_FAILED_VDS_RESTART(107, AuditLogSeverity.ERROR),
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
index 9784e56..a5ee240 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
@@ -309,6 +309,8 @@
     StopGeoRepSession(1427, ActionGroup.MANIPULATE_GLUSTER_VOLUME, 
QuotaDependency.NONE),
     DeleteGeoRepSession(1428, ActionGroup.MANIPULATE_GLUSTER_VOLUME, 
QuotaDependency.NONE),
     StartGlusterVolumeGeoRep(1429, ActionGroup.MANIPULATE_GLUSTER_VOLUME, 
QuotaDependency.NONE),
+    ScheduleGlusterVolumeSnapshot(1430, ActionGroup.MANIPULATE_GLUSTER_VOLUME, 
QuotaDependency.NONE),
+    ReScheduleGlusterVolumeSnapshot(1431, 
ActionGroup.MANIPULATE_GLUSTER_VOLUME, QuotaDependency.NONE),
 
     // Scheduling Policy
     AddClusterPolicy(1450, ActionGroup.EDIT_STORAGE_POOL_CONFIGURATION, false, 
QuotaDependency.NONE),
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/gluster/ScheduleGlusterVolumeSnapshotParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/gluster/ScheduleGlusterVolumeSnapshotParameters.java
new file mode 100644
index 0000000..7c9b3c3
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/gluster/ScheduleGlusterVolumeSnapshotParameters.java
@@ -0,0 +1,37 @@
+package org.ovirt.engine.core.common.action.gluster;
+
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSnapshotSchedule;
+
+public class ScheduleGlusterVolumeSnapshotParameters extends 
GlusterVolumeParameters {
+    private static final long serialVersionUID = 1L;
+
+    private GlusterVolumeSnapshotSchedule schedule;
+
+    private boolean force;
+
+    public ScheduleGlusterVolumeSnapshotParameters() {
+    }
+
+    public 
ScheduleGlusterVolumeSnapshotParameters(GlusterVolumeSnapshotSchedule schedule,
+            boolean force) {
+        super(schedule.getVolumeId());
+        this.schedule = schedule;
+        this.force = force;
+    }
+
+    public GlusterVolumeSnapshotSchedule getSchedule() {
+        return this.schedule;
+    }
+
+    public void setSchedule(GlusterVolumeSnapshotSchedule schedule) {
+        this.schedule = schedule;
+    }
+
+    public boolean getForce() {
+        return this.force;
+    }
+
+    public void setForce(boolean value) {
+        this.force = value;
+    }
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
index 081fa50..0ae6004 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
@@ -948,6 +948,10 @@
     ACTION_TYPE_FAILED_GEOREP_SESSION_ALREADY_STARTED(ErrorType.CONFLICT),
     ACTION_TYPE_FAILED_GEOREP_SESSION_LOCKED(ErrorType.CONFLICT),
     ACTION_TYPE_FAILED_GEOREP_SESSION_STOPPED(ErrorType.CONFLICT),
+    ACTION_TYPE_FAILED_VOLUME_SNAPSHOT_NOT_SUPPORTED(ErrorType.CONFLICT),
+    
ACTION_TYPE_FAILED_GLUSTER_VOLUME_SNAPSHOT_ALREADY_SCHEDULED(ErrorType.CONFLICT),
+    
ACTION_TYPE_FAILED_GLUSTER_VOLUME_SNAPSHOT_NOT_SCHEDULED(ErrorType.CONFLICT),
+
     // OpenStack Glance
     ACTION_TYPE_FAILED_IMAGE_DOWNLOAD_ERROR(ErrorType.BAD_PARAMETERS),
     ACTION_TYPE_FAILED_IMAGE_NOT_SUPPORTED(ErrorType.BAD_PARAMETERS),
diff --git 
a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java
 
b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java
index e4e5469..65dd80b 100644
--- 
a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java
+++ 
b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java
@@ -2879,6 +2879,9 @@
     @DefaultStringValue("Cannot ${action} ${type}. Gluster Volume is down.")
     String ACTION_TYPE_FAILED_GLUSTER_VOLUME_IS_DOWN();
 
+    @DefaultStringValue("Cannot ${action} ${type}. Gluster volume is not 
thinly provisioned")
+    String ACTION_TYPE_FAILED_GLUSTER_VOLUME_IS_NOT_THINLY_PROVISIONED();
+
     @DefaultStringValue("Cannot ${action} ${type}. Cannot remove all the 
bricks from a Volume.")
     String ACTION_TYPE_FAILED_CAN_NOT_REMOVE_ALL_BRICKS_FROM_VOLUME();
 


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I4326ebb0c146eadceb6ae30cce73ece132749dc5
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