/* * Copyright (c) 2012 S.C. Axemblr Software Solutions S.R.L * * 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 com.axemblr.provisionr.amazon.activities; import static org.fest.assertions.api.Assertions.assertThat; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.amazonaws.services.ec2.model.DescribeSpotInstanceRequestsRequest; import com.amazonaws.services.ec2.model.DescribeSpotInstanceRequestsResult; import com.amazonaws.services.ec2.model.Filter; import com.axemblr.provisionr.amazon.ProcessVariables; import com.axemblr.provisionr.amazon.options.ProviderOptions; import com.axemblr.provisionr.core.CoreProcessVariables; import com.axemblr.provisionr.test.ProcessVariablesCollector; import com.google.common.util.concurrent.Uninterruptibles; public class RunSpotInstancesLiveTest extends CreatePoolLiveTest<RunSpotInstances> { /** * This should be set a bit higher than the on demand instance * price to avoid the situation in which the test fails because * the spot bid is too low. */ public static String AMAZON_SPOT_BID = "0.04"; @Override public void setUp() throws Exception { super.setUp(); final String region = getProviderProperty(ProviderOptions.REGION, ProviderOptions.DEFAULT_REGION); provider = collectProviderCredentialsFromSystemProperties() .option(ProviderOptions.REGION, region) .option(ProviderOptions.SPOT_BID, AMAZON_SPOT_BID) .createProvider(); when(pool.getProvider()).thenReturn(provider); } @Test public void testRunSpotInstances() throws Exception { ProcessVariablesCollector collector = new ProcessVariablesCollector(); collector.install(execution); activity.execute(execution); @SuppressWarnings("unchecked") ArgumentCaptor<List<String>> argument = (ArgumentCaptor<List<String>>) (Object) ArgumentCaptor.forClass(List.class); verify(execution).setVariable(eq(ProcessVariables.SPOT_INSTANCE_REQUEST_IDS), argument.capture()); when(execution.getVariable(ProcessVariables.SPOT_INSTANCE_REQUEST_IDS)).thenReturn(argument.getValue()); /* The timeout is needed because the describe calls don't return immediately. */ // TODO: see if we can eliminate this after adding the process variables conditions Uninterruptibles.sleepUninterruptibly(1, TimeUnit.MINUTES); // shouldn't do anything activity.execute(execution); Uninterruptibles.sleepUninterruptibly(1, TimeUnit.MINUTES); DescribeSpotInstanceRequestsResult result = client.describeSpotInstanceRequests( new DescribeSpotInstanceRequestsRequest().withFilters(new Filter() .withName("launch-group").withValues(BUSINESS_KEY))); assertThat(result.getSpotInstanceRequests()).hasSize(1); /* we also need to sleep before the teardown */ Uninterruptibles.sleepUninterruptibly(1, TimeUnit.MINUTES); } @SuppressWarnings("unchecked") @Override public void tearDown() throws Exception { // cleanup any pending requests or instances ArgumentCaptor<List<String>> argument = (ArgumentCaptor<List<String>>) (Object) ArgumentCaptor.forClass(List.class); executeActivitiesInSequence(execution, CancelSpotRequests.class, GetInstanceIdsFromSpotRequests.class); verify(execution).setVariable(eq(ProcessVariables.INSTANCE_IDS), argument.capture()); when(execution.getVariable(ProcessVariables.INSTANCE_IDS)).thenReturn(argument.getValue()); executeActivitiesInSequence(execution, TerminateInstances.class); super.tearDown(); } }