package com.sungardas.init;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperConfig;
import com.sungardas.enhancedsnapshots.aws.AmazonConfigProviderDEV;
import com.sungardas.enhancedsnapshots.aws.dynamodb.model.Configuration;
import com.sungardas.enhancedsnapshots.aws.dynamodb.model.User;
import com.sungardas.enhancedsnapshots.dto.InitConfigurationDto;
import com.sungardas.enhancedsnapshots.dto.converter.BucketNameValidationDTO;
import com.sungardas.enhancedsnapshots.dto.converter.MailConfigurationDocumentConverter;
import com.sungardas.enhancedsnapshots.exception.ConfigurationException;
import com.sungardas.enhancedsnapshots.service.CryptoService;
import com.sungardas.enhancedsnapshots.service.SDFSStateService;
import com.sungardas.enhancedsnapshots.util.SystemUtils;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.PostConstruct;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
class InitConfigurationServiceDev extends InitConfigurationServiceImpl {
@Value("${enhancedsnapshots.bucket.name.prefix.002}")
private String enhancedSnapshotBucketPrefix;
@Value("${amazon.aws.accesskey}")
private String amazonAWSAccessKey;
@Value("${amazon.aws.secretkey}")
private String amazonAWSSecretKey;
@Value("${sungardas.worker.configuration}")
private String instanceId;
@Value("${amazon.aws.region}")
private String region;
@Value("${enhancedsnapshots.db.tables}")
private String[] tables;
@Value("${enhancedsnapshots.default.tempVolumeType}")
private String tempVolumeType;
@Value("${enhancedsnapshots.default.tempVolumeIopsPerGb}")
private int tempVolumeIopsPerGb;
@Value("${enhancedsnapshots.default.restoreVolumeType}")
private String restoreVolumeType;
@Value("${enhancedsnapshots.default.restoreVolumeIopsPerGb}")
private int restoreVolumeIopsPerGb;
@Value("${enhancedsnapshots.default.amazon.retry.count}")
private int amazonRetryCount;
@Value("${enhancedsnapshots.default.amazon.retry.sleep}")
private int amazonRetrySleep;
@Value("${enhancedsnapshots.default.queue.size}")
private int queueSize;
@Value("${enhancedsnapshots.default.sdfs.volume.config.path}")
private String sdfsConfigPath;
@Value("${enhancedsnapshots.default.sdfs.backup.file.name}")
private String sdfsStateBackupFileName;
@Value("${enhancedsnapshots.default.retention.cron}")
private String defaultRetentionCronExpression;
@Value("${enhancedsnapshots.default.polling.rate}")
private int defaultPollingRate;
@Value("${enhancedsnapshots.default.sdfs.local.cache.size}")
private int sdfsLocalCacheSize;
@Value("${enhancedsnapshots.default.wait.time.before.new.sync}")
private int defaultWaitTimeBeforeNewSyncWithAWS;
@Value("${enhancedsnapshots.default.max.wait.time.to.detach.volume}")
private int defaultMaxWaitTimeToDetachVolume;
@Value("${enhancedsnapshots.logs.buffer.size}")
private int bufferSize;
@Value("${enhancedsnapshots.logs.file}")
private String logFile;
@Value("${enhancedsnapshots.dev.isSystemConfigured:false}")
private boolean isSystemConfigured;
@Autowired
private CryptoService cryptoService;
public void removeProperties() {
}
protected List<InitConfigurationDto.S3> getBucketsWithSdfsMetadata() {
ArrayList<InitConfigurationDto.S3> result = new ArrayList<>();
return result;
}
@PostConstruct
protected void init() {
DynamoDBMapperConfig config = new DynamoDBMapperConfig.Builder().withTableNameOverride(DynamoDBMapperConfig.TableNameOverride.
withTableNamePrefix(AmazonConfigProviderDEV.getDynamoDbPrefix(SystemUtils.getSystemId()))).build();
mapper = new DynamoDBMapper(amazonDynamoDB, config);
}
@Override
public InitConfigurationDto getInitConfigurationDto() {
InitConfigurationDto config = new InitConfigurationDto();
List<InitConfigurationDto.S3> names = new ArrayList<>();
names.add(new InitConfigurationDto.S3(enhancedSnapshotBucketPrefix + "s0", false));
names.add(new InitConfigurationDto.S3(enhancedSnapshotBucketPrefix + "s1", true));
names.add(new InitConfigurationDto.S3(enhancedSnapshotBucketPrefix + "s2", true));
InitConfigurationDto.SDFS sdfs = new InitConfigurationDto.SDFS();
sdfs.setCreated(true);
sdfs.setMountPoint("/mnt/awspool");
sdfs.setVolumeName("awspool");
sdfs.setVolumeSize("40");
sdfs.setMinVolumeSize("10");
sdfs.setMaxVolumeSize("2000");
sdfs.setSdfsLocalCacheSize(1);
sdfs.setMinSdfsLocalCacheSize(0);
sdfs.setMaxSdfsLocalCacheSize(3);
InitConfigurationDto.DB db = new InitConfigurationDto.DB();
db.setValid(true);
db.setAdminExist(true);
config.setS3(names);
config.setSdfs(sdfs);
config.setDb(db);
config.setImmutableBucketNamePrefix(enhancedSnapshotBucketPrefix);
config.setClusterMode(SystemUtils.clusterMode());
config.setUUID(UUID);
return config;
}
@Override
public boolean systemIsConfigured() {
return isSystemConfigured;
}
protected Configuration getConfiguration(){
return mapper.load(Configuration.class, SystemUtils.getSystemId());
}
@Override
public boolean checkDefaultUser(String login, String password) {
return true;
}
protected boolean requiredTablesExist(){
return true;
}
protected void validateVolumeSize(final int volumeSize) {
int min = 10;
int max = 2000;
if (volumeSize < min || volumeSize > max) {
throw new ConfigurationException("Invalid volume size");
}
}
@Override
public void storePropertiesEditableFromConfigFile() {
}
@Override
public void configureSSO(String spEntityID) {
}
@Override
public void createDBAndStoreSettings(final ConfigDto config) {
createDbStructure();
storeSettings(config);
}
private void storeSettings(final ConfigDto config) {
Configuration configuration = getDevConf();
configuration.setMailConfigurationDocument(MailConfigurationDocumentConverter.toMailConfigurationDocument(config.getMailConfiguration(), cryptoService, "DEV", ""));
configuration.setDomain(config.getDomain());
if (SystemUtils.clusterMode()) {
configuration.setClusterMode(true);
configuration.setMaxNodeNumber(config.getCluster().getMaxNodeNumber());
configuration.setMinNodeNumber(config.getCluster().getMinNodeNumber());
configuration.setChunkStoreEncryptionKey(SDFSStateService.generateChunkStoreEncryptionKey());
configuration.setChunkStoreIV(SDFSStateService.generateChunkStoreIV());
configuration.setSdfsCliPsw(SystemUtils.getSystemId());
}
mapper.save(configuration);
User user = new User("admin@admin", DigestUtils.sha512Hex("admin"), "admin", "dev", "dev");
user.setId(SystemUtils.getInstanceId());
mapper.save(user);
}
@Override
protected void createBucket(String bucketName) {
}
private Configuration getDevConf() {
Configuration configuration = new Configuration();
configuration.setConfigurationId(SystemUtils.getSystemId());
configuration.setEc2Region(Regions.EU_WEST_1.getName());
configuration.setSdfsMountPoint("");
configuration.setSdfsVolumeName("");
configuration.setRestoreVolumeIopsPerGb(restoreVolumeIopsPerGb);
configuration.setRestoreVolumeType(restoreVolumeType);
configuration.setTempVolumeIopsPerGb(tempVolumeIopsPerGb);
configuration.setTempVolumeType(tempVolumeType);
configuration.setSdfsLocalCacheSize(sdfsLocalCacheSize);
configuration.setAmazonRetryCount(amazonRetryCount);
configuration.setAmazonRetrySleep(amazonRetrySleep);
configuration.setMaxQueueSize(queueSize);
configuration.setSdfsConfigPath(sdfsConfigPath);
configuration.setSdfsBackupFileName(sdfsStateBackupFileName);
configuration.setRetentionCronExpression(defaultRetentionCronExpression);
configuration.setWorkerDispatcherPollingRate(defaultPollingRate);
configuration.setWaitTimeBeforeNewSyncWithAWS(defaultWaitTimeBeforeNewSyncWithAWS);
configuration.setMaxWaitTimeToDetachVolume(defaultMaxWaitTimeToDetachVolume);
configuration.setS3Bucket("com.sungardas.enhancedsnapshots.dev");
configuration.setSdfsSize(500);
configuration.setSdfsVolumeName("awspool");
configuration.setSdfsMountPoint("/mnt/awspool");
configuration.setSsoLoginMode(true);
configuration.setLogFile(logFile);
configuration.setLogsBufferSize(bufferSize);
return configuration;
}
public void syncSettingsInDbAndConfigFile() {
}
public BucketNameValidationDTO validateBucketName(String bucketName) {
return new BucketNameValidationDTO(true, "");
}
public void saveAndProcessSAMLFiles(MultipartFile spCertificate, MultipartFile idpMetadata) {
}
protected void uploadToS3(String bucketName, Path filePath) {
}
@Override
public InitConfigurationDto.DB containsMetadata(final String bucketName) {
InitConfigurationDto.DB db = new InitConfigurationDto.DB();
db.setValid(true);
db.setAdminExist(true);
return db;
}
}