package tw.com.integration;
import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;
import com.amazonaws.regions.Region;
import com.amazonaws.services.ec2.AmazonEC2Client;
import com.amazonaws.services.ec2.model.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import tw.com.AwsFacade;
import tw.com.EnvironmentSetupForTests;
import tw.com.exceptions.CannotFindVpcException;
import tw.com.exceptions.WrongNumberOfInstancesException;
import tw.com.providers.CloudClient;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import static org.hamcrest.CoreMatchers.startsWith;
import static org.hamcrest.core.StringEndsWith.endsWith;
import static org.junit.Assert.*;
public class TestCloudClient {
private CloudClient cloudClient;
private AmazonEC2Client ec2Client;
private String VpcId = EnvironmentSetupForTests.VPC_ID_FOR_ALT_ENV;
private Tag expectedTag = EnvironmentSetupForTests.createEc2Tag(AwsFacade.ENVIRONMENT_TAG, EnvironmentSetupForTests.ALT_ENV);
private com.amazonaws.services.ec2.model.Instance instance;
@Before
public void beforeEachTestIsRun() {
ec2Client = EnvironmentSetupForTests.createEC2Client(new DefaultAWSCredentialsProviderChain());
cloudClient = new CloudClient(ec2Client);
}
@After
public void afterEachTestIsRun() {
if (instance!=null) {
ec2Client.terminateInstances(new TerminateInstancesRequest().withInstanceIds(instance.getInstanceId()));
}
}
@Test
public void testCanSetAnDeleteTagsForResource() throws CannotFindVpcException {
List<Tag> tags = new LinkedList<>();
Tag tagA = EnvironmentSetupForTests.createEc2Tag("T1", "Value1");
Tag tagB = EnvironmentSetupForTests.createEc2Tag("T2", "Value2");
tags.add(tagA);
tags.add(tagB);
List<String> resources = new LinkedList<>();
resources.add(VpcId);
cloudClient.addTagsToResources(resources, tags);
DescribeVpcsResult queryResult = ec2Client.describeVpcs(new DescribeVpcsRequest().withVpcIds(VpcId));
List<Tag> results = queryResult.getVpcs().get(0).getTags();
assertTrue(results.contains(tagA));
assertTrue(results.contains(tagB));
// Now delete
cloudClient.deleteTagsFromResources(resources, tagA);
cloudClient.deleteTagsFromResources(resources, tagB);
queryResult = ec2Client.describeVpcs(new DescribeVpcsRequest().withVpcIds(VpcId));
List<Tag> deleteResults = queryResult.getVpcs().get(0).getTags();
assertFalse(deleteResults.contains(tagA));
assertFalse(deleteResults.contains(tagB));
}
@Test
public void testCanQueryVpcById() {
Vpc result = cloudClient.describeVpc(VpcId);
List<Tag> tags = result.getTags();
assertTrue(tags.contains(expectedTag));
}
@Test
public void testCanGetAllVpcs() {
List<Vpc> results = cloudClient.describeVpcs();
boolean matched = false;
for(Vpc candidate : results) {
matched = candidate.getTags().contains(expectedTag);
if (matched) break;
}
assertTrue(matched);
}
@Test
public void shouldGetAvailabilityZones() {
Region region = EnvironmentSetupForTests.getRegion();
String regionName = EnvironmentSetupForTests.getRegion().getName();
Map<String, AvailabilityZone> zones = cloudClient.getAvailabilityZones(regionName);
assertEquals(3, zones.size());
zones.forEach((name, zone) -> assertEquals(region.getName(), zone.getRegionName()));
assertTrue(zones.containsKey("a"));
assertTrue(zones.containsKey("b"));
}
@Test
public void testShouldBeAbleToGetInstanceById() throws WrongNumberOfInstancesException {
instance = EnvironmentSetupForTests.createSimpleInstance(ec2Client);
String instanceId = instance.getInstanceId();
Instance result = cloudClient.getInstanceById(instanceId);
assertEquals(instanceId, result.getInstanceId());
}
@Test
public void shouldCreateKeyPair() {
String testKeypairName = "testKeyPairName";
KeyPair keyPair = cloudClient.createKeyPair(testKeypairName);
DeleteKeyPairRequest deleteRequest = new DeleteKeyPairRequest().withKeyName(testKeypairName);
ec2Client.deleteKeyPair(deleteRequest);
assertEquals(testKeypairName, keyPair.getKeyName());
assertThat(keyPair.getKeyMaterial(), startsWith("-----BEGIN RSA PRIVATE KEY-----"));
assertThat(keyPair.getKeyMaterial(), endsWith("-----END RSA PRIVATE KEY-----"));
}
}