package org.ovirt.engine.core.bll.gluster; import java.io.Serializable; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.Map; import javax.inject.Inject; import javax.inject.Singleton; import org.ovirt.engine.core.bll.interfaces.BackendInternal; import org.ovirt.engine.core.bll.utils.GlusterAuditLogUtil; import org.ovirt.engine.core.bll.utils.GlusterUtil; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.action.VdcReturnValueBase; import org.ovirt.engine.core.common.action.gluster.CreateGlusterVolumeSnapshotParameters; 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.GlusterVolumeSnapshotSchedule; import org.ovirt.engine.core.common.constants.gluster.GlusterConstants; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dao.gluster.GlusterVolumeDao; import org.ovirt.engine.core.dao.gluster.GlusterVolumeSnapshotScheduleDao; import org.ovirt.engine.core.utils.timer.OnTimerMethodAnnotation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Singleton public class GlusterSnapshotScheduleJob implements Serializable { private static final long serialVersionUID = 2355384696827317365L; private static final Logger log = LoggerFactory.getLogger(GlusterSnapshotScheduleJob.class); @Inject private GlusterAuditLogUtil logUtil; @Inject private GlusterVolumeSnapshotScheduleDao glusterVolumeSnapshotScheduleDao; @Inject private GlusterVolumeDao glusterVolumeDao; @Inject private BackendInternal backend; @Inject private GlusterUtil glusterUtil; public GlusterSnapshotScheduleJob() { } @OnTimerMethodAnnotation("onTimer") public void onTimer(String serverId, String volumeId, String snapshotNamePrefix, String description, boolean force) { final GlusterVolumeEntity volume = glusterVolumeDao.getById(new Guid(volumeId)); if (volume == null) { log.error("Error while creating volume snapshot. Volume is null."); return; } final GlusterVolumeSnapshotEntity snapshot = new GlusterVolumeSnapshotEntity(); snapshot.setClusterId(volume.getClusterId()); snapshot.setVolumeId(volume.getId()); snapshot.setSnapshotName(snapshotNamePrefix); snapshot.setDescription(description); VdcReturnValueBase returnValue = backend.runInternalAction(VdcActionType.CreateGlusterVolumeSnapshot, new CreateGlusterVolumeSnapshotParameters(snapshot, force)); if (!returnValue.getSucceeded()) { log.error("Error while creating snapshot for volume '{}': {}", volume.getName(), returnValue.getExecuteFailedMessages().toString()); Map<String, String> customValues = new HashMap<>(); customValues.put(GlusterConstants.VOLUME_SNAPSHOT_NAME, snapshot.getSnapshotName()); customValues.put(GlusterConstants.VOLUME_NAME, volume.getName()); logUtil.logAuditMessage(volume.getClusterId(), volume, null, AuditLogType.GLUSTER_VOLUME_SNAPSHOT_CREATE_FAILED, customValues); } // Check if next schedule available, and if not delete the scheduling details from DB GlusterVolumeSnapshotSchedule schedule = glusterVolumeSnapshotScheduleDao.getByVolumeId(volume.getId()); Date endDate = glusterUtil.convertDate(schedule.getEndByDate(), schedule.getTimeZone()); if (endDate != null && endDate.before(new Date())) { glusterVolumeSnapshotScheduleDao.removeByVolumeId(volume.getId()); logUtil.logAuditMessage(volume.getClusterId(), volume, null, AuditLogType.GLUSTER_VOLUME_SNAPSHOT_SCHEDULE_DELETED, Collections.singletonMap(GlusterConstants.VOLUME_NAME, volume.getName())); } } }