package com.sungardas.enhancedsnapshots.service.impl; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.UUID; import javax.annotation.PostConstruct; 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.components.ConfigurationMediator; import com.sungardas.enhancedsnapshots.exception.DataException; import com.sungardas.enhancedsnapshots.service.BackupService; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.joda.time.DateTime; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import static com.sungardas.enhancedsnapshots.aws.dynamodb.model.TaskEntry.TaskEntryType.DELETE; @Service public class BackupServiceImpl implements BackupService { private static final Logger LOG = LogManager.getLogger(BackupServiceImpl.class); private static final String BACKUP_FILE_EXT = ".backup"; @Autowired private ConfigurationMediator configurationMediator; @Autowired private BackupRepository backupRepository; @Autowired private TaskRepository taskRepository; private String instanceId; @PostConstruct private void init() { instanceId = configurationMediator.getConfigurationId(); } @Override public void deleteBackup(String backupName, String user) { TaskEntry taskEntry = getDeleteTask(backupName + BACKUP_FILE_EXT, user, true); if (taskRepository.findByVolumeAndTypeAndOptions(taskEntry.getVolume(), taskEntry.getType(), taskEntry.getOptions()).isEmpty()) { taskRepository.save(taskEntry); } else { LOG.error("Task already exist: {}", taskEntry); throw new DataException("Task already exist"); } } @Override public List<BackupEntry> getBackupList(String volumeId) { return backupRepository.findByVolumeId(volumeId); } @Override public void deleteBackup(Collection<BackupEntry> backupEntries, String user) { LOG.debug("Removing backups: {}", backupEntries); List<TaskEntry> tasks = new ArrayList<>(); for (BackupEntry entry : backupEntries) { TaskEntry taskEntry = getDeleteTask(entry.getFileName(), user, false); if (taskRepository.findByVolumeAndTypeAndOptions(taskEntry.getVolume(), taskEntry.getType(), taskEntry.getOptions()).isEmpty()) { tasks.add(getDeleteTask(entry.getFileName(), user, false)); } else { LOG.debug("Task ignored: {}", taskEntry); } } taskRepository.save(tasks); } private String getVolumeId(String backupName) { return backupName.substring(0, 12); } private TaskEntry getDeleteTask(String backupFile, String user, boolean schedulerManual) { String volumeId = getVolumeId(backupFile); TaskEntry taskEntry = new TaskEntry(); taskEntry.setId(UUID.randomUUID().toString()); taskEntry.setVolume(volumeId); taskEntry.setType(DELETE.getType()); taskEntry.setStatus(TaskEntry.TaskEntryStatus.QUEUED.getStatus()); taskEntry.setOptions(backupFile); taskEntry.setSchedulerName(user); taskEntry.setSchedulerTime(String.valueOf(DateTime.now().getMillis())); taskEntry.setPriority(1); if (!configurationMediator.isClusterMode()) { taskEntry.setWorker(configurationMediator.getConfigurationId()); } //TODO Remove hardcode taskEntry.setSchedulerManual(schedulerManual); taskEntry.setRegular(false); return taskEntry; } }