package com.sungardas.enhancedsnapshots.tasks.executors;
import com.sungardas.enhancedsnapshots.aws.dynamodb.model.BackupEntry;
import com.sungardas.enhancedsnapshots.aws.dynamodb.model.TaskEntry;
import com.sungardas.enhancedsnapshots.aws.dynamodb.repository.BackupRepository;
import com.sungardas.enhancedsnapshots.aws.dynamodb.repository.TaskRepository;
import com.sungardas.enhancedsnapshots.dto.ExceptionDto;
import com.sungardas.enhancedsnapshots.enumeration.TaskProgress;
import com.sungardas.enhancedsnapshots.exception.EnhancedSnapshotsException;
import com.sungardas.enhancedsnapshots.service.*;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Service;
import static com.sungardas.enhancedsnapshots.aws.dynamodb.model.TaskEntry.TaskEntryStatus.ERROR;
import static com.sungardas.enhancedsnapshots.aws.dynamodb.model.TaskEntry.TaskEntryStatus.RUNNING;
@Service("awsDeleteTaskExecutor")
@Profile("prod")
public class AWSDeleteTaskExecutor extends AbstractAWSVolumeTaskExecutor {
private static final Logger LOG = LogManager.getLogger(AWSDeleteTaskExecutor.class);
@Autowired
private NotificationService notificationService;
@Autowired
private TaskRepository taskRepository;
@Autowired
private BackupRepository backupRepository;
@Autowired
private StorageService storageService;
@Autowired
private TaskService taskService;
@Autowired
private SnapshotService snapshotService;
@Autowired
private MailService mailService;
@Override
public void execute(TaskEntry taskEntry) {
LOG.info("Task " + taskEntry.getId() + ": Change task state to 'running'");
notificationService.notifyAboutRunningTaskProgress(taskEntry.getId(), "Starting delete task", 0);
taskEntry.setStatus(RUNNING.getStatus());
taskRepository.save(taskEntry);
notificationService.notifyAboutRunningTaskProgress(taskEntry.getId(), "Finding source file", 30);
BackupEntry backupEntry = backupRepository.findOne(taskEntry.getSourceFileName());
try {
notificationService.notifyAboutRunningTaskProgress(taskEntry.getId(), "Deleting file...", 60);
try {
storageService.deleteFile(backupEntry.getFileName());
} catch (Exception e) {
// skip
}
try {
snapshotService.deleteSnapshot(backupEntry.getSnapshotId());
} catch (Exception e) {
// skip
}
try {
backupRepository.delete(backupEntry);
} catch (Exception e) {
// skip
}
taskService.complete(taskEntry);
LOG.info("Task " + taskEntry.getId() + ": Change task state to 'complete'");
notificationService.notifyAboutRunningTaskProgress(taskEntry.getId(), "Task complete", 100);
mailService.notifyAboutSuccess(taskEntry);
setProgress(taskEntry, TaskProgress.DONE);
} catch (EnhancedSnapshotsException e){
LOG.error(e);
notificationService.notifyAboutError(new ExceptionDto("Delete task has failed", e.getLocalizedMessage()));
taskEntry.setStatus(ERROR.getStatus());
taskRepository.save(taskEntry);
mailService.notifyAboutError(taskEntry, e);
setProgress(taskEntry, TaskProgress.DONE);
}
}
}