package tw.com;
import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.cloudformation.AmazonCloudFormationClient;
import com.amazonaws.services.cloudformation.model.CreateStackRequest;
import com.amazonaws.services.cloudformation.model.CreateStackResult;
import com.amazonaws.services.cloudformation.model.Parameter;
import com.amazonaws.services.ec2.AmazonEC2Client;
import com.amazonaws.services.ec2.model.*;
import com.amazonaws.services.elasticloadbalancing.AmazonElasticLoadBalancingClient;
import com.amazonaws.services.identitymanagement.AmazonIdentityManagementClient;
import com.amazonaws.services.rds.AmazonRDSClient;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.ObjectListing;
import com.amazonaws.services.s3.model.S3ObjectSummary;
import com.amazonaws.services.sns.AmazonSNSClient;
import com.amazonaws.services.sqs.AmazonSQSClient;
import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import tw.com.entity.ProjectAndEnv;
import tw.com.entity.StackNameAndId;
import tw.com.repository.VpcRepository;
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.attribute.PosixFilePermission;
import java.util.*;
import static java.nio.file.attribute.PosixFilePermission.*;
import static java.nio.file.attribute.PosixFilePermission.OTHERS_READ;
import static java.nio.file.attribute.PosixFilePermission.OTHERS_WRITE;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public class EnvironmentSetupForTests {
private static final Logger logger = LoggerFactory.getLogger(EnvironmentSetupForTests.class);
///////////////
// User/Env specific constants, these will need to change for others running these tests!
public static final String AVAILABILITY_ZONE = "eu-west-1c";
public static final String AMI_FOR_INSTANCE = "ami-9c7ad8eb"; // eu amazon linux instance
public static final String VPC_ID_FOR_ALT_ENV = "vpc-21e5ee43";
public static final String BUCKET_NAME="cfnassists3testbucket";
public static final String S3_PREFIX = "https://"+BUCKET_NAME+".s3-eu-west-1.amazonaws.com";
private static final Regions AWS_REGION = Regions.EU_WEST_1;
//
///////////////
public static final String PROJECT = "CfnAssist";
public static final String ENV = "Test";
public static String ALT_ENV = "AdditionalTest";
public static final String TEMPORARY_STACK = "temporaryStack";
public static final long DELETE_RETRY_MAX_TIMEOUT_MS = 5000;
public static final int DELETE_RETRY_LIMIT = (5*60000) / 5000; // Try for 5 minutes
public static List<Subnet> getSubnetFors(AmazonEC2Client ec2Client, Vpc vpc) {
DescribeSubnetsRequest describeSubnetsRequest = new DescribeSubnetsRequest();
Collection<Filter> filters = new HashSet<>();
Filter vpcFilter = new Filter().withName("vpc-id").withValues(vpc.getVpcId());
filters.add(vpcFilter);
describeSubnetsRequest.setFilters(filters);
DescribeSubnetsResult results = ec2Client.describeSubnets(describeSubnetsRequest );
return results.getSubnets();
}
public static AmazonEC2Client createEC2Client(AWSCredentialsProvider credentialsProvider) {
AmazonEC2Client ec2Client = new AmazonEC2Client(credentialsProvider);
ec2Client.setRegion(EnvironmentSetupForTests.getRegion());
return ec2Client;
}
public static AmazonCloudFormationClient createCFNClient(AWSCredentialsProvider credentialsProvider) {
AmazonCloudFormationClient cfnClient = new AmazonCloudFormationClient(credentialsProvider);
cfnClient.setRegion(EnvironmentSetupForTests.getRegion());
return cfnClient;
}
public static AmazonRDSClient createRDSClient(AWSCredentialsProvider credentialsProvider) {
AmazonRDSClient rdsClient = new AmazonRDSClient(credentialsProvider);
rdsClient.setRegion(EnvironmentSetupForTests.getRegion());
return rdsClient;
}
public static Vpc findAltVpc(VpcRepository repository) {
return repository.getCopyOfVpc(VPC_ID_FOR_ALT_ENV);
}
public static Region getRegion() {
return Region.getRegion(AWS_REGION);
}
public static void clearVpcTags(AmazonEC2Client directClient, Vpc vpc) throws InterruptedException {
List<String> resources = new LinkedList<>();
resources.add(vpc.getVpcId());
List<Tag> existingTags = vpc.getTags();
DeleteTagsRequest deleteTagsRequest = new DeleteTagsRequest(resources);
deleteTagsRequest.setTags(existingTags);
directClient.deleteTags(deleteTagsRequest);
}
public static ProjectAndEnv getMainProjectAndEnv() {
return new ProjectAndEnv(EnvironmentSetupForTests.PROJECT, EnvironmentSetupForTests.ENV);
}
public static ProjectAndEnv getAltProjectAndEnv() {
return new ProjectAndEnv(EnvironmentSetupForTests.PROJECT, EnvironmentSetupForTests.ALT_ENV);
}
public static StackNameAndId createTemporarySimpleStack(AmazonCloudFormationClient cfnClient, String vpcId, String arn) throws IOException {
CreateStackRequest createStackRequest = new CreateStackRequest();
createStackRequest.setStackName(TEMPORARY_STACK);
File file = new File(FilesForTesting.SIMPLE_STACK);
createStackRequest.setTemplateBody(FileUtils.readFileToString(file , Charset.defaultCharset()));
Collection<Parameter> parameters = new LinkedList<>();
parameters.add(createParam("env", EnvironmentSetupForTests.ENV));
parameters.add(createParam("vpc", vpcId));
if (!arn.isEmpty()) {
Collection<String> notificationARNs = new LinkedList<>();
notificationARNs.add(arn);
logger.debug("Adding arn subscription "+ arn);
createStackRequest.setNotificationARNs(notificationARNs);
}
createStackRequest.setParameters(parameters);
CreateStackResult result = cfnClient.createStack(createStackRequest);
return new StackNameAndId(TEMPORARY_STACK, result.getStackId());
}
private static Parameter createParam(String key, String value) {
Parameter p = new Parameter();
p.setParameterKey(key);
p.setParameterValue(value);
return p;
}
public static AmazonSNSClient createSNSClient(
DefaultAWSCredentialsProviderChain credentialsProvider) {
AmazonSNSClient amazonSNSClient = new AmazonSNSClient(credentialsProvider);
amazonSNSClient.setRegion(getRegion());
return amazonSNSClient;
}
public static AmazonSQSClient createSQSClient(
DefaultAWSCredentialsProviderChain credentialsProvider) {
AmazonSQSClient sqsClient = new AmazonSQSClient(credentialsProvider);
sqsClient.setRegion(getRegion());
return sqsClient;
}
public static AmazonElasticLoadBalancingClient createELBClient(
AWSCredentialsProvider credentialsProvider) {
AmazonElasticLoadBalancingClient client = new AmazonElasticLoadBalancingClient(credentialsProvider);
client.setRegion(getRegion());
return client;
}
public static AmazonS3Client createS3Client(DefaultAWSCredentialsProviderChain credentialsProvider) {
AmazonS3Client client = new AmazonS3Client(credentialsProvider);
client.setRegion(getRegion());
return client;
}
public static AmazonIdentityManagementClient createIamClient(DefaultAWSCredentialsProviderChain credentialsProvider) {
AmazonIdentityManagementClient client = new AmazonIdentityManagementClient(credentialsProvider);
client.setRegion(getRegion());
return client;
}
public static Boolean isContainedIn(List<S3ObjectSummary> objectSummaries,
String key) {
for(S3ObjectSummary summary : objectSummaries) {
if (summary.getBucketName().equals(EnvironmentSetupForTests.BUCKET_NAME) &&
summary.getKey().equals(key)) {
return true;
}
}
return false;
}
public static final int FAILURE_STATUS = -1;
public static List<S3ObjectSummary> getBucketObjects(AmazonS3Client s3Client) {
ObjectListing requestResult = s3Client.listObjects(EnvironmentSetupForTests.BUCKET_NAME);
return requestResult.getObjectSummaries();
}
public static List<com.amazonaws.services.cloudformation.model.Tag> createExpectedStackTags(String comment, Integer build, String project) {
List<com.amazonaws.services.cloudformation.model.Tag> expectedTags = new LinkedList<>();
expectedTags.add(createCfnStackTAG("CFN_ASSIST_ENV", "Test"));
expectedTags.add(createCfnStackTAG("CFN_ASSIST_PROJECT", project));
if (!comment.isEmpty()) {
expectedTags.add(createCfnStackTAG("CFN_COMMENT", comment));
}
if (build>=0) {
expectedTags.add(createCfnStackTAG("CFN_ASSIST_BUILD_NUMBER", build.toString()));
}
return expectedTags;
}
public static com.amazonaws.services.cloudformation.model.Tag createCfnStackTAG(String key, String value) {
com.amazonaws.services.cloudformation.model.Tag tag = new com.amazonaws.services.cloudformation.model.Tag();
tag.setKey(key);
tag.setValue(value);
return tag;
}
public static List<com.amazonaws.services.ec2.model.Tag> createExpectedEc2Tags(ProjectAndEnv projAndEnv, String comment) {
List<com.amazonaws.services.ec2.model.Tag> tags = new LinkedList<>();
tags.add(createEc2Tag("TagEnv",projAndEnv.getEnv()));
tags.add(createEc2Tag("Name", "testSubnet"));
// stack tags appear to be inherited
tags.add(createEc2Tag("CFN_ASSIST_ENV", projAndEnv.getEnv()));
tags.add(createEc2Tag("CFN_ASSIST_PROJECT", projAndEnv.getProject()));
if (!comment.isEmpty()) {
tags.add(createEc2Tag("CFN_COMMENT", comment));
}
return tags;
}
public static com.amazonaws.services.ec2.model.Tag createEc2Tag(String key, String value) {
return new com.amazonaws.services.ec2.model.Tag().withKey(key).withValue(value);
}
public static String loadFile(String filename) throws IOException {
return FileUtils.readFileToString(new File(filename), Charset.defaultCharset());
}
public static Instance createSimpleInstance(AmazonEC2Client ec2Client) {
RunInstancesRequest runInstancesRequest = new RunInstancesRequest(EnvironmentSetupForTests.AMI_FOR_INSTANCE, 1, 1).
withInstanceType(InstanceType.T1Micro);
RunInstancesResult instancesResults = ec2Client.runInstances(runInstancesRequest);
List<Instance> instances = instancesResults.getReservation().getInstances();
return instances.get(0);
}
public static void checkKeyPairFilePermissions(Set<PosixFilePermission> permissions) {
assertTrue(permissions.contains(OWNER_READ));
assertTrue(permissions.contains(OWNER_WRITE));
// no exec
assertFalse(permissions.contains(OWNER_EXECUTE));
// no group
assertFalse(permissions.contains(GROUP_EXECUTE));
assertFalse(permissions.contains(GROUP_READ));
assertFalse(permissions.contains(GROUP_WRITE));
// no other
assertFalse(permissions.contains(OTHERS_EXECUTE));
assertFalse(permissions.contains(OTHERS_READ));
assertFalse(permissions.contains(OTHERS_WRITE));
}
}