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