package com.sungardas.destroy;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Table;
import com.amazonaws.services.ec2.AmazonEC2;
import com.amazonaws.services.ec2.model.TerminateInstancesRequest;
import com.sungardas.enhancedsnapshots.aws.AmazonConfigProvider;
import com.sungardas.enhancedsnapshots.aws.dynamodb.model.Configuration;
import com.sungardas.enhancedsnapshots.aws.dynamodb.repository.ConfigurationRepository;
import com.sungardas.enhancedsnapshots.aws.dynamodb.repository.NodeRepository;
import com.sungardas.enhancedsnapshots.cluster.ClusterConfigurationService;
import com.sungardas.enhancedsnapshots.service.AWSCommunicationService;
import com.sungardas.enhancedsnapshots.util.SystemUtils;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import javax.annotation.PostConstruct;
import java.util.stream.StreamSupport;
public class RemoveAppConfiguration {
private static final Logger LOG = LogManager.getLogger(RemoveAppConfiguration.class);
@Value("${enhancedsnapshots.db.tables}")
private String[] tables;
@Value("${removeS3Bucket}")
private boolean removeS3Bucket;
@Autowired
@Qualifier("amazonDynamoDB")
private AmazonDynamoDB db;
@Autowired
private AmazonEC2 ec2;
@Autowired
private ConfigurationRepository configurationRepository;
@Autowired
private AWSCommunicationService awsCommunicationService;
@Autowired
private ClusterConfigurationService clusterConfigurationService;
@Autowired
private NodeRepository nodeRepository;
private DynamoDB dynamoDB;
private String configurationId;
@PostConstruct
private void init() {
configurationId = SystemUtils.getSystemId();
dynamoDB = new DynamoDB(db);
switch (SystemUtils.getSystemMode()) {
case CLUSTER:
dropConfiguration(removeS3Bucket);
clusterConfigurationService.removeClusterInfrastructure();
break;
case STANDALONE:
dropConfiguration(removeS3Bucket);
LOG.info("Terminating instance");
terminateInstance();
break;
}
}
private void dropConfiguration(boolean withS3Bucket) {
if (withS3Bucket) {
LOG.info("Dropping S3 bucket");
awsCommunicationService.dropS3Bucket(getConfiguration().getS3Bucket());
}
LOG.info("Dropping DB data");
dropDbData();
}
private void terminateInstance() {
terminateInstance(SystemUtils.getInstanceId());
}
private void terminateInstance(String... instanceIds) {
ec2.terminateInstances(new TerminateInstancesRequest().withInstanceIds(instanceIds));
}
private void dropDbData() {
for (String tableToDrop : tables) {
dropTable(tableToDrop);
}
}
private void dropTable(String tableName) {
Table tableToDelete = dynamoDB.getTable(AmazonConfigProvider.getDynamoDbPrefix() + tableName);
tableToDelete.delete();
try {
tableToDelete.waitForDelete();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private Configuration getConfiguration(){
return StreamSupport.stream(configurationRepository.findAll().spliterator(), false).findFirst().get();
}
}