package com.sungardas.enhancedsnapshots.service.impl;
import com.amazonaws.services.s3.AmazonS3;
import com.sungardas.enhancedsnapshots.aws.dynamodb.model.BackupEntry;
import com.sungardas.enhancedsnapshots.aws.dynamodb.repository.BackupRepository;
import com.sungardas.enhancedsnapshots.components.ConfigurationMediator;
import com.sungardas.enhancedsnapshots.service.AWSCommunicationService;
import com.sungardas.enhancedsnapshots.service.SDFSStateService;
import com.sungardas.enhancedsnapshots.util.EnhancedSnapshotSystemMetadataUtil;
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 javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;
@Service("CreateAppConfiguration")
@Profile("prod")
class CreateAppConfigurationImpl {
private static final Logger LOG = LogManager.getLogger(CreateAppConfigurationImpl.class);
@Autowired
private ConfigurationMediator configurationMediator;
@Autowired
private SDFSStateService sdfsStateService;
@Autowired
private AmazonS3 amazonS3;
@Autowired
private BackupRepository backupRepository;
@Autowired
private AWSCommunicationService awsCommunicationService;
private boolean init = false;
@PostConstruct
private void init() {
awsCommunicationService.restartAWSLogService();
if (!init) {
LOG.info("Initialization started");
init = true;
boolean isBucketContainsSDFSMetadata = false;
if (EnhancedSnapshotSystemMetadataUtil.isBucketExits(configurationMediator.getS3Bucket(), amazonS3)) {
isBucketContainsSDFSMetadata = EnhancedSnapshotSystemMetadataUtil.containsSdfsMetadata(configurationMediator.getS3Bucket(),
configurationMediator.getSdfsBackupFileName(), amazonS3);
}
LOG.info("Initialization restore");
if (isBucketContainsSDFSMetadata) {
LOG.info("Restoring SDFS state");
sdfsStateService.restoreSDFS();
syncBackupsInDBWithExistingOnes();
} else {
LOG.info("Starting SDFS");
sdfsStateService.startSDFS();
}
LOG.info("Initialization finished");
}
}
/**
* There can be situations when user removed/added backups after system backup and than decided
* to migrate to another instance, in this case backups will not be in consistent state
*/
private void syncBackupsInDBWithExistingOnes() {
List<BackupEntry> realBackups = sdfsStateService.getBackupsFromSDFSMountPoint();
List<BackupEntry> backupEntries = backupRepository.findAll();
// removing non existing backups from DB
List<BackupEntry> toRemove = new ArrayList<>();
backupEntries.stream().filter(b -> !realBackups.contains(b))
.peek(b -> LOG.info("Backup {} of volume {} does not exist any more. Removing related data from DB", b.getFileName(), b.getVolumeId()))
.forEach(toRemove::add);
backupRepository.delete(toRemove);
// adding backups which are not stored in DB
List<BackupEntry> toAdd = new ArrayList<>();
realBackups.stream().filter(rb -> !backupEntries.contains(rb))
.peek(rb -> LOG.info("Adding backup {} info to DB", rb.getFileName())).forEach(toAdd::add);
backupRepository.save(toAdd);
}
}