package tw.com.integration; import com.amazonaws.auth.DefaultAWSCredentialsProviderChain; import com.amazonaws.services.ec2.AmazonEC2Client; import com.amazonaws.services.ec2.model.Instance; import com.amazonaws.services.ec2.model.TerminateInstancesRequest; import com.amazonaws.services.elasticloadbalancing.AmazonElasticLoadBalancingClient; import com.amazonaws.services.elasticloadbalancing.model.*; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import tw.com.AwsFacade; import tw.com.EnvironmentSetupForTests; import tw.com.providers.LoadBalancerClient; import java.util.LinkedList; import java.util.List; import static org.junit.Assert.*; public class TestLoadBalancerClient { private static final String LB_NAME = "cfnAssistTest"; private LoadBalancerClient client; private static AmazonElasticLoadBalancingClient elbClient; private static AmazonEC2Client ec2Client; private static Instance instance; @BeforeClass public static void onceBeforeSuiteOfTestsRun() { DefaultAWSCredentialsProviderChain credentialsProvider = new DefaultAWSCredentialsProviderChain(); elbClient = EnvironmentSetupForTests.createELBClient(credentialsProvider); ec2Client = EnvironmentSetupForTests.createEC2Client(credentialsProvider); createLoadBalancer(); instance = EnvironmentSetupForTests.createSimpleInstance(ec2Client); } @AfterClass public static void onceAfterAllTestsHaveRun() { deleteLoadBalancer(); deleteInstance(); } @Before public void beforeEachTestRuns() { client = new LoadBalancerClient(elbClient); } @Test public void shouldDescribeELBs() { List<LoadBalancerDescription> results = client.describeLoadBalancers(); List<Tag> tags = null; boolean found = false; for(LoadBalancerDescription candidate : results) { if (candidate.getLoadBalancerName().equals(LB_NAME)) { tags = client.getTagsFor(LB_NAME); found = true; break; } } assertTrue(found); assertEquals(1, tags.size()); Tag theTag = tags.get(0); assertEquals(AwsFacade.TYPE_TAG, theTag.getKey()); assertEquals("tagValue", theTag.getValue()); } @Test public void shouldRegisterAndDeregisterInstances() throws InterruptedException { List<com.amazonaws.services.elasticloadbalancing.model.Instance> instances = new LinkedList<>(); instances.add(new com.amazonaws.services.elasticloadbalancing.model.Instance(instance.getInstanceId())); client.registerInstances(instances, LB_NAME); LoadBalancerDescription lbDescription = getUpToDateLBDescription(); boolean found = false; List<com.amazonaws.services.elasticloadbalancing.model.Instance> results = lbDescription.getInstances(); for(com.amazonaws.services.elasticloadbalancing.model.Instance candidate : results) { if (candidate.getInstanceId().equals(instance.getInstanceId())) { found = true; break; } } assertTrue(found); client.degisterInstancesFromLB(instances, LB_NAME); lbDescription = getUpToDateLBDescription(); results = lbDescription.getInstances(); assertEquals(0, results.size()); } private LoadBalancerDescription getUpToDateLBDescription() { DescribeLoadBalancersResult result = elbClient.describeLoadBalancers(); List<LoadBalancerDescription> lbDesc = result.getLoadBalancerDescriptions(); for(LoadBalancerDescription candidate : lbDesc) { if (candidate.getLoadBalancerName().equals(LB_NAME)) { return candidate; } } fail("could not find instance"); return null; } private static void createLoadBalancer() { CreateLoadBalancerRequest createLoadBalancerRequest = new CreateLoadBalancerRequest(). withLoadBalancerName(LB_NAME). withListeners(new Listener("HTTP",8000,8000)). withAvailabilityZones(EnvironmentSetupForTests.AVAILABILITY_ZONE).withTags(createTags()); elbClient.createLoadBalancer(createLoadBalancerRequest); } private static Tag createTags() { return new Tag().withKey(AwsFacade.TYPE_TAG).withValue("tagValue"); } private static void deleteLoadBalancer() { elbClient.deleteLoadBalancer(new DeleteLoadBalancerRequest(LB_NAME)); } private static void deleteInstance() { if (instance!=null) { ec2Client.terminateInstances(new TerminateInstancesRequest().withInstanceIds(instance.getInstanceId())); } } }