fixed aws-ec2 image parsing

This commit is contained in:
Adrian Cole 2012-04-21 09:57:55 -07:00
parent eda3f05c8e
commit f1010e13a4
11 changed files with 38 additions and 28 deletions

View File

@ -72,7 +72,7 @@ public class EC2ComputeServiceContextModule extends BaseComputeServiceContextMod
}
@Override
protected boolean shouldParseImagesOnDemand(Injector injector) {
protected boolean shouldEagerlyParseImages(Injector injector) {
// If no owners to query, then will never lookup all images
String[] amiOwners = injector.getInstance(Key.get(String[].class, Names.named(PROPERTY_EC2_AMI_OWNERS)));
return (amiOwners.length > 0);

View File

@ -227,14 +227,14 @@ public abstract class BaseComputeServiceContextModule extends AbstractModule {
@Memoized
protected Supplier<Set<? extends Image>> supplyImageCache(AtomicReference<AuthorizationException> authException, @Named(PROPERTY_SESSION_INTERVAL) long seconds,
final Supplier<Set<? extends Image>> imageSupplier, Injector injector) {
if (shouldParseImagesOnDemand(injector)) {
if (shouldEagerlyParseImages(injector)) {
return supplyImageCache(authException, seconds, imageSupplier);
} else {
return supplyNonParsingImageCache(authException, seconds, imageSupplier, injector);
}
}
protected boolean shouldParseImagesOnDemand(Injector injector) {
protected boolean shouldEagerlyParseImages(Injector injector) {
return true;
}

View File

@ -19,7 +19,6 @@
package org.jclouds.config;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Strings.emptyToNull;
import static com.google.inject.name.Names.named;
import javax.inject.Inject;
@ -47,7 +46,7 @@ public class ValueOfConfigurationKeyOrNull implements Function<String, String> {
public String apply(String configurationKey) {
checkNotNull(configurationKey, "configurationKey");
try {
return emptyToNull(injector.getInstance(Key.get(String.class, named(configurationKey))));
return injector.getInstance(Key.get(String.class, named(configurationKey)));
} catch (ConfigurationException e) {
return null;
}

View File

@ -20,8 +20,6 @@ package org.jclouds.config;
import static org.testng.Assert.assertEquals;
import java.util.concurrent.ExecutionException;
import org.testng.annotations.Test;
import com.google.inject.AbstractModule;
@ -37,12 +35,12 @@ import com.google.inject.name.Names;
public class ValueOfConfigurationKeyOrNullTest {
@Test
public void testNotThere() throws InterruptedException, ExecutionException {
public void testNotThere() {
assertEquals(new ValueOfConfigurationKeyOrNull(Guice.createInjector()).apply("foo"), null);
}
@Test
public void testThere() throws InterruptedException, ExecutionException {
public void testThere() {
assertEquals(new ValueOfConfigurationKeyOrNull(Guice.createInjector(new AbstractModule() {
@Override
@ -53,5 +51,17 @@ public class ValueOfConfigurationKeyOrNullTest {
})).apply("foo"), "bar");
}
@Test
public void testEmptyIsThere() {
assertEquals(new ValueOfConfigurationKeyOrNull(Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
bindConstant().annotatedWith(Names.named("foo")).to("");
}
})).apply("foo"), "");
}
}

View File

@ -19,6 +19,7 @@
package org.jclouds.aws.ec2;
import static org.jclouds.aws.ec2.reference.AWSEC2Constants.PROPERTY_EC2_GENERATE_INSTANCE_NAMES;
import static org.jclouds.ec2.reference.EC2Constants.PROPERTY_EC2_AMI_OWNERS;
import java.util.Properties;
@ -67,6 +68,7 @@ public class AWSEC2ApiMetadata extends EC2ApiMetadata {
public static Properties defaultProperties() {
Properties properties = EC2ApiMetadata.defaultProperties();
properties.remove(PROPERTY_EC2_AMI_OWNERS);
// auth fail sometimes happens in EC2, as the rc.local script that injects the
// authorized key executes after ssh has started.
properties.setProperty("jclouds.ssh.max-retries", "7");

View File

@ -22,7 +22,6 @@ import static org.jclouds.aws.ec2.reference.AWSEC2Constants.PROPERTY_EC2_AMI_QUE
import static org.jclouds.aws.ec2.reference.AWSEC2Constants.PROPERTY_EC2_CC_AMI_QUERY;
import static org.jclouds.aws.ec2.reference.AWSEC2Constants.PROPERTY_EC2_CC_REGIONS;
import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_SUSPENDED;
import static org.jclouds.ec2.reference.EC2Constants.PROPERTY_EC2_AMI_OWNERS;
import java.net.URI;
import java.util.Properties;
@ -63,7 +62,6 @@ public class AWSEC2ProviderMetadata extends BaseProviderMetadata {
// from stopping->stopped state on an ec2 micro
properties.setProperty(TIMEOUT_NODE_SUSPENDED, 120 * 1000 + "");
properties.putAll(Region.regionProperties());
properties.remove(PROPERTY_EC2_AMI_OWNERS);
// amazon, alestic, canonical, and rightscale
properties.setProperty(PROPERTY_EC2_AMI_QUERY,
"owner-id=137112412989,063491364108,099720109477,411009282317;state=available;image-type=machine");

View File

@ -102,10 +102,11 @@ public class AWSEC2ComputeServiceContextModule extends BaseComputeServiceContext
}
@Override
protected boolean shouldParseImagesOnDemand(Injector injector) {
protected boolean shouldEagerlyParseImages(Injector injector) {
Map<String, String> queries = injector.getInstance(Key.get(new TypeLiteral<Map<String, String>>() {
}, ImageQuery.class));
// If no queries defined, then will never lookup all images
return injector.getInstance(Key.get(new TypeLiteral<Map<String, String>>() {
}, ImageQuery.class)).size() > 0;
return queries.size() > 0;
}
// duplicates EC2ComputeServiceContextModule; but that's easiest thing to do with guice; could extract to common util

View File

@ -18,7 +18,8 @@
*/
package org.jclouds.aws.ec2.compute.config;
import static org.jclouds.aws.ec2.reference.AWSEC2Constants.*;
import static org.jclouds.aws.ec2.reference.AWSEC2Constants.PROPERTY_EC2_AMI_QUERY;
import static org.jclouds.aws.ec2.reference.AWSEC2Constants.PROPERTY_EC2_CC_AMI_QUERY;
import static org.jclouds.ec2.reference.EC2Constants.PROPERTY_EC2_AMI_OWNERS;
import java.util.Map;
@ -63,8 +64,8 @@ import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Sets;
import com.google.common.collect.ImmutableMap.Builder;
import com.google.common.collect.Sets;
import com.google.inject.Provides;
import com.google.inject.TypeLiteral;
import com.google.inject.assistedinject.FactoryModuleBuilder;
@ -100,18 +101,18 @@ public class AWSEC2ComputeServiceDependenciesModule extends EC2ComputeServiceDep
@ImageQuery
protected Map<String, String> imageQuery(ValueOfConfigurationKeyOrNull config) {
String amiQuery = Strings.emptyToNull(config.apply(PROPERTY_EC2_AMI_QUERY));
if (config.apply(PROPERTY_EC2_AMI_OWNERS) != null) {
String owners = config.apply(PROPERTY_EC2_AMI_OWNERS);
if ("".equals(owners)) {
amiQuery = null;
} else if (owners != null) {
StringBuilder query = new StringBuilder();
String owners = config.apply(PROPERTY_EC2_AMI_OWNERS).toString();
if ("*".equals(owners))
query.append("state=available;image-type=machine");
else if (!"".equals(owners))
else
query.append("owner-id=").append(owners).append(";state=available;image-type=machine");
else if ("".equals(owners))
query = new StringBuilder();
Logger.getAnonymousLogger().warning(
String.format("Property %s is deprecated, please use new syntax: %s=%s", PROPERTY_EC2_AMI_OWNERS,
PROPERTY_EC2_AMI_QUERY, query.toString()));
String.format("Property %s is deprecated, please use new syntax: %s=%s", PROPERTY_EC2_AMI_OWNERS,
PROPERTY_EC2_AMI_QUERY, query.toString()));
amiQuery = query.toString();
}
Builder<String, String> builder = ImmutableMap.<String, String> builder();

View File

@ -97,7 +97,7 @@ public class AWSEC2ImageSupplier implements Supplier<Set<? extends Image>> {
@Override
public Set<? extends Image> get() {
String amiQuery = queries.get(PROPERTY_EC2_AMI_QUERY);
String ccAmiQuery= queries.get(PROPERTY_EC2_CC_AMI_QUERY);
String ccAmiQuery = queries.get(PROPERTY_EC2_CC_AMI_QUERY);
Future<Iterable<Image>> normalImages = images(regions.get(), amiQuery, PROPERTY_EC2_AMI_QUERY);
ImmutableSet<Image> clusterImages;

View File

@ -60,12 +60,11 @@ public class AWSEC2ContextBuilderTest {
assertEquals(queries.get(PROPERTY_EC2_AMI_QUERY), "state=available;image-type=machine");
}
public void testStaysPutWhenBlank() {
public void testBlankAmiOwnersRemovesAmiQuery() {
Properties input = new Properties();
input.setProperty(PROPERTY_EC2_AMI_OWNERS, "");
Map<String, String> queries = queriesForProperties(input);
assertEquals(queries.get(PROPERTY_EC2_AMI_OWNERS), null);
assertEquals(queries.get(PROPERTY_EC2_AMI_QUERY), new AWSEC2ProviderMetadata().getDefaultProperties()
.getProperty(PROPERTY_EC2_AMI_QUERY));
assertEquals(queries.get(PROPERTY_EC2_AMI_QUERY), null);
}
}

View File

@ -59,7 +59,7 @@ import com.google.inject.Module;
*
* @author Adrian Cole
*/
@Test(groups = "live")
@Test(groups = "live", testName = "AWSEC2TemplateBuilderLiveTest")
public class AWSEC2TemplateBuilderLiveTest extends EC2TemplateBuilderLiveTest {
public AWSEC2TemplateBuilderLiveTest() {