package org.ovirt.engine.core.bll.gluster;
import java.sql.Time;
import java.util.Date;
import javax.inject.Inject;
import org.ovirt.engine.core.bll.context.CommandContext;
import org.ovirt.engine.core.common.action.gluster.ScheduleGlusterVolumeSnapshotParameters;
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.businessentities.gluster.GlusterVolumeSnapshotScheduleRecurrence;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.dao.gluster.GlusterVolumeSnapshotScheduleDao;
import org.ovirt.engine.core.utils.timer.DBSchedulerUtilQuartzImpl;
public abstract class ScheduleGlusterVolumeSnapshotCommandBase<T extends ScheduleGlusterVolumeSnapshotParameters> extends GlusterSnapshotCommandBase<T> {
private GlusterVolumeSnapshotSchedule schedule;
private boolean force;
@Inject
private DBSchedulerUtilQuartzImpl schedulerUtil;
@Inject
private GlusterSnapshotScheduleJob glusterSnapshotScheduleJob;
@Inject
protected GlusterVolumeSnapshotScheduleDao glusterVolumeSnapshotScheduleDao;
public ScheduleGlusterVolumeSnapshotCommandBase(T params, CommandContext commandContext) {
super(params, commandContext);
this.schedule = getParameters().getSchedule();
this.force = getParameters().getForce();
if (this.schedule != null) {
setClusterId(schedule.getClusterId());
setGlusterVolumeId(schedule.getVolumeId());
}
}
@Override
protected void setActionMessageParameters() {
addValidationMessage(EngineMessage.VAR__ACTION__CREATE);
super.setActionMessageParameters();
}
@Override
protected boolean validate() {
if (!super.validate()) {
return false;
}
GlusterVolumeEntity volume = getGlusterVolume();
if (volume != null && volume.getStatus() == GlusterStatus.DOWN) {
return failValidation(EngineMessage.ACTION_TYPE_FAILED_GLUSTER_VOLUME_IS_DOWN);
}
if (!glusterUtil.isVolumeThinlyProvisioned(volume)) {
return failValidation(EngineMessage.ACTION_TYPE_FAILED_GLUSTER_VOLUME_IS_NOT_THINLY_PROVISIONED);
}
// Validate the scheduling dates (start and end by dates)
Date convertedStartDate = glusterUtil.convertDate(schedule.getStartDate(), schedule.getTimeZone());
Date convertedEndByDate = glusterUtil.convertDate(schedule.getEndByDate(), schedule.getTimeZone());
if (schedule.getRecurrence() != null
&& schedule.getRecurrence() != GlusterVolumeSnapshotScheduleRecurrence.UNKNOWN
&& schedule.getEndByDate() != null && convertedStartDate != null
&& convertedEndByDate.compareTo(convertedStartDate) <= 0) {
return failValidation(EngineMessage.ACTION_TYPE_FAILED_END_BY_DATE_BEFORE_START_DATE);
}
return true;
}
protected String scheduleJob() {
// convert the execution time to engine time zone
if (schedule.getExecutionTime() != null) {
Time convertedTime = glusterUtil.convertTime(schedule.getExecutionTime(), schedule.getTimeZone());
schedule.setExecutionTime(convertedTime);
}
// convert the start date and end by date to the given timezone
Date convertedStartDate = glusterUtil.convertDate(schedule.getStartDate(), schedule.getTimeZone());
Date convertedEndByDate = glusterUtil.convertDate(schedule.getEndByDate(), schedule.getTimeZone());
String cronExpression = glusterUtil.getCronExpression(schedule);
if (cronExpression == null) {
throw new RuntimeException("Unable to form cron expression for schedule. Invalid scheduling details.");
}
return getDbSchedulUtil().scheduleACronJob(glusterSnapshotScheduleJob,
"onTimer",
new Class[] { String.class, String.class, String.class, String.class, Boolean.class },
new Object[] { upServer.getId().toString(), getGlusterVolumeId().toString(),
schedule.getSnapshotNamePrefix(),
schedule.getSnapshotDescription(), force },
cronExpression, convertedStartDate, convertedEndByDate);
}
protected GlusterVolumeSnapshotSchedule getSchedule() {
return schedule;
}
protected boolean getForce() {
return force;
}
protected DBSchedulerUtilQuartzImpl getDbSchedulUtil() {
return schedulerUtil;
}
}