/** * Copyright 2010 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package datameer.awstasks.aws.ec2; import static org.junit.Assert.*; import java.util.Arrays; import java.util.EnumSet; import java.util.List; import java.util.concurrent.TimeUnit; import org.junit.Test; import awstasks.com.amazonaws.services.ec2.AmazonEC2; import awstasks.com.amazonaws.services.ec2.model.AttachVolumeRequest; import awstasks.com.amazonaws.services.ec2.model.Instance; import awstasks.com.amazonaws.services.ec2.model.InstanceStateName; import awstasks.com.amazonaws.services.ec2.model.Reservation; import awstasks.com.amazonaws.services.ec2.model.Volume; import datameer.awstasks.util.Ec2Util; public class InstanceGroupImplIntegTest extends AbstractEc2IntegrationTest { @Test public void testLaunchWithoutWait() throws Exception { AmazonEC2 ec2 = _ec2Conf.createEc2(); InstanceGroup instanceGroup = new InstanceGroupImpl(ec2); // startup int instanceCount = 1; Reservation reservation = instanceGroup.launch(createLaunchConfiguration(instanceCount)); assertEquals(instanceCount, instanceGroup.instanceCount()); assertTrue(instanceGroup.isAssociated()); assertEquals(instanceCount, reservation.getInstances().size()); checkInstanceMode(reservation.getInstances(), InstanceStateName.Pending); // shutdown instanceGroup.terminate(); Thread.sleep(500); checkInstanceMode(Ec2Util.reloadInstanceDescriptions(ec2, reservation.getInstances()), InstanceStateName.ShuttingDown, InstanceStateName.Terminated); assertFalse(instanceGroup.isAssociated()); } @Test public void testLaunchWithWaitOnRunning() throws Exception { AmazonEC2 ec2 = _ec2Conf.createEc2(); InstanceGroup instanceGroup = new InstanceGroupImpl(ec2); // startup Reservation reservation = instanceGroup.launch(createLaunchConfiguration(1), TimeUnit.MINUTES, 10); assertTrue(instanceGroup.isAssociated()); assertEquals(1, reservation.getInstances().size()); checkInstanceMode(reservation.getInstances(), InstanceStateName.Running); // shutdown instanceGroup.terminate(); Thread.sleep(1000); checkInstanceMode(Ec2Util.reloadInstanceDescriptions(ec2, reservation.getInstances()), InstanceStateName.ShuttingDown, InstanceStateName.Terminated); assertFalse(instanceGroup.isAssociated()); } @Test public void testConnectToReservation() throws Exception { AmazonEC2 ec2 = _ec2Conf.createEc2(); InstanceGroup instanceGroup1 = new InstanceGroupImpl(ec2); InstanceGroup instanceGroup2 = new InstanceGroupImpl(ec2); // startup Reservation reservation = instanceGroup1.launch(createLaunchConfiguration(1), TimeUnit.MINUTES, 10); assertTrue(instanceGroup1.isAssociated()); // connect instanceGroup2.connectTo(reservation); assertTrue(instanceGroup2.isAssociated()); // shutdown instanceGroup2.terminate(); Thread.sleep(500); checkInstanceMode(Ec2Util.reloadInstanceDescriptions(ec2, reservation.getInstances()), InstanceStateName.ShuttingDown, InstanceStateName.Terminated); assertFalse(instanceGroup2.isAssociated()); } @Test public void testConnectToGroup() throws Exception { AmazonEC2 ec2 = _ec2Conf.createEc2(); InstanceGroup instanceGroup1 = new InstanceGroupImpl(ec2); InstanceGroup instanceGroup2 = new InstanceGroupImpl(ec2); // startup Reservation reservation = instanceGroup1.launch(createLaunchConfiguration(1), TimeUnit.MINUTES, 10); assertTrue(instanceGroup1.isAssociated()); // connect instanceGroup2.connectTo(TEST_SECURITY_GROUP); assertTrue(instanceGroup2.isAssociated()); // shutdown instanceGroup2.terminate(); Thread.sleep(500); checkInstanceMode(Ec2Util.reloadInstanceDescriptions(ec2, reservation.getInstances()), InstanceStateName.ShuttingDown, InstanceStateName.Terminated); assertFalse(instanceGroup2.isAssociated()); } @Test public void testStartStop() throws Exception { AmazonEC2 ec2 = _ec2Conf.createEc2(); InstanceGroup instanceGroup = new InstanceGroupImpl(ec2); // startup Reservation reservation = instanceGroup.launch(createEbsLaunchConfiguration(1), TimeUnit.MINUTES, 10); // instanceGroup.connectTo(TEST_SECURITY_GROUP); // Reservation reservation = Ec2Util.getReservation(ec2, // Ec2Util.toIds(instanceGroup.getInstances(false))); assertTrue(instanceGroup.isAssociated()); Volume volume = findEbsVolume(ec2); ec2.attachVolume(new AttachVolumeRequest(volume.getVolumeId(), reservation.getInstances().get(0).getInstanceId(), "/dev/sdb1")); // stop/start instanceGroup.stop(); assertFalse(instanceGroup.isAssociated()); Ec2Util.waitUntil(ec2, reservation.getInstances(), EnumSet.of(InstanceStateName.Stopping), InstanceStateName.Stopped); instanceGroup.start(Ec2Util.getInstanceIds(reservation), TimeUnit.MINUTES, 10); // instanceGroup.start(Arrays.asList("i-e8526c8a"), TimeUnit.MINUTES, 10); assertTrue(instanceGroup.isAssociated()); // shutdown instanceGroup.terminate(); Ec2Util.waitUntil(ec2, reservation.getInstances(), EnumSet.of(InstanceStateName.ShuttingDown), InstanceStateName.Terminated); Thread.sleep(500); } private void checkInstanceMode(List<Instance> instances, InstanceStateName... instanceModes) { for (Instance instance : instances) { boolean inOneOfDesiredStates = false; for (InstanceStateName instanceStateName : instanceModes) { if (instanceStateName.toString().equals(instance.getState().getName())) { inOneOfDesiredStates = true; } } if (!inOneOfDesiredStates) { fail("instance is in mode '" + instance.getState() + "' but should be (one of) '" + Arrays.asList(instanceModes) + "'"); } } } }