diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/compute/strategy/EC2PopulateDefaultLoginCredentialsForImageStrategy.java b/apis/ec2/src/main/java/org/jclouds/ec2/compute/strategy/EC2PopulateDefaultLoginCredentialsForImageStrategy.java index 9ca3604366..8e4214a5ed 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/compute/strategy/EC2PopulateDefaultLoginCredentialsForImageStrategy.java +++ b/apis/ec2/src/main/java/org/jclouds/ec2/compute/strategy/EC2PopulateDefaultLoginCredentialsForImageStrategy.java @@ -26,6 +26,7 @@ import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; +import org.jclouds.compute.domain.OsFamily; import org.jclouds.compute.strategy.impl.ReturnCredentialsBoundToImage; import org.jclouds.domain.Credentials; import org.jclouds.domain.LoginCredentials; @@ -41,13 +42,13 @@ import com.google.common.collect.ImmutableMap; @Singleton public class EC2PopulateDefaultLoginCredentialsForImageStrategy extends ReturnCredentialsBoundToImage { public EC2PopulateDefaultLoginCredentialsForImageStrategy() { - this(null, ImmutableMap. of()); + this(null, ImmutableMap. of(), ImmutableMap.of()); } @Inject public EC2PopulateDefaultLoginCredentialsForImageStrategy(@Nullable @Named("image") LoginCredentials creds, - Map credentialStore) { - super(creds, credentialStore); + Map credentialStore, Map osFamilyToCredentials) { + super(creds, credentialStore, osFamilyToCredentials); } @Override diff --git a/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/compute/strategy/ParseVAppTemplateDescriptionToGetDefaultLoginCredentials.java b/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/compute/strategy/ParseVAppTemplateDescriptionToGetDefaultLoginCredentials.java index d7fe61d4ba..35d342a17d 100644 --- a/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/compute/strategy/ParseVAppTemplateDescriptionToGetDefaultLoginCredentials.java +++ b/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/compute/strategy/ParseVAppTemplateDescriptionToGetDefaultLoginCredentials.java @@ -30,6 +30,7 @@ import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; +import org.jclouds.compute.domain.OsFamily; import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.compute.strategy.impl.ReturnCredentialsBoundToImage; import org.jclouds.domain.Credentials; @@ -45,8 +46,8 @@ import org.jclouds.trmk.vcloud_0_8.domain.VAppTemplate; public class ParseVAppTemplateDescriptionToGetDefaultLoginCredentials extends ReturnCredentialsBoundToImage { @Inject public ParseVAppTemplateDescriptionToGetDefaultLoginCredentials(@Nullable @Named("image") LoginCredentials creds, - Map credentialStore) { - super(creds, credentialStore); + Map credentialStore, Map osFamilyToCredentials) { + super(creds, credentialStore, osFamilyToCredentials); } @Resource diff --git a/common/trmk/src/test/java/org/jclouds/trmk/vcloud_0_8/compute/strategy/PopulateDefaultLoginCredentialsForVAppTemplateTest.java b/common/trmk/src/test/java/org/jclouds/trmk/vcloud_0_8/compute/strategy/PopulateDefaultLoginCredentialsForVAppTemplateTest.java index 97003be038..deed36729c 100644 --- a/common/trmk/src/test/java/org/jclouds/trmk/vcloud_0_8/compute/strategy/PopulateDefaultLoginCredentialsForVAppTemplateTest.java +++ b/common/trmk/src/test/java/org/jclouds/trmk/vcloud_0_8/compute/strategy/PopulateDefaultLoginCredentialsForVAppTemplateTest.java @@ -18,17 +18,18 @@ */ package org.jclouds.trmk.vcloud_0_8.compute.strategy; +import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.expect; -import static org.easymock.classextension.EasyMock.createMock; -import static org.easymock.classextension.EasyMock.replay; -import static org.easymock.classextension.EasyMock.verify; +import static org.easymock.EasyMock.replay; +import static org.easymock.EasyMock.verify; import static org.testng.Assert.assertEquals; import java.io.IOException; import java.io.InputStream; +import org.jclouds.compute.domain.OsFamily; import org.jclouds.domain.Credentials; -import org.jclouds.trmk.vcloud_0_8.compute.strategy.ParseVAppTemplateDescriptionToGetDefaultLoginCredentials; +import org.jclouds.domain.LoginCredentials; import org.jclouds.trmk.vcloud_0_8.domain.VAppTemplate; import org.testng.annotations.Test; @@ -49,7 +50,7 @@ public class PopulateDefaultLoginCredentialsForVAppTemplateTest { expect(template.getDescription()).andReturn(description).atLeastOnce(); replay(template); ParseVAppTemplateDescriptionToGetDefaultLoginCredentials converter = new ParseVAppTemplateDescriptionToGetDefaultLoginCredentials( - null, ImmutableMap. of()); + null, ImmutableMap. of(), ImmutableMap. of()); Credentials creds = converter.execute(template); assertEquals(creds.identity, "vcloud"); assertEquals(creds.credential, "$Ep455l0ud!2"); @@ -64,7 +65,7 @@ public class PopulateDefaultLoginCredentialsForVAppTemplateTest { expect(template.getDescription()).andReturn(description).atLeastOnce(); replay(template); ParseVAppTemplateDescriptionToGetDefaultLoginCredentials converter = new ParseVAppTemplateDescriptionToGetDefaultLoginCredentials( - null, ImmutableMap. of()); + null, ImmutableMap. of(), ImmutableMap. of()); Credentials creds = converter.execute(template); assertEquals(creds.identity, "ecloud"); assertEquals(creds.credential, "$Ep455l0ud!2"); @@ -79,7 +80,7 @@ public class PopulateDefaultLoginCredentialsForVAppTemplateTest { expect(template.getDescription()).andReturn(description).atLeastOnce(); replay(template); ParseVAppTemplateDescriptionToGetDefaultLoginCredentials converter = new ParseVAppTemplateDescriptionToGetDefaultLoginCredentials( - null, ImmutableMap. of()); + null, ImmutableMap. of(), ImmutableMap. of()); Credentials creds = converter.execute(template); assertEquals(creds.identity, "vpncubed"); assertEquals(creds.credential, "vpncubed"); @@ -94,7 +95,7 @@ public class PopulateDefaultLoginCredentialsForVAppTemplateTest { expect(template.getDescription()).andReturn(description).atLeastOnce(); replay(template); ParseVAppTemplateDescriptionToGetDefaultLoginCredentials converter = new ParseVAppTemplateDescriptionToGetDefaultLoginCredentials( - null, ImmutableMap. of()); + null, ImmutableMap. of(), ImmutableMap. of()); Credentials creds = converter.execute(template); assertEquals(creds.identity, "ecloud"); assertEquals(creds.credential, "TmrkCl0ud1s#1!"); @@ -109,7 +110,7 @@ public class PopulateDefaultLoginCredentialsForVAppTemplateTest { expect(template.getDescription()).andReturn(description).atLeastOnce(); replay(template); ParseVAppTemplateDescriptionToGetDefaultLoginCredentials converter = new ParseVAppTemplateDescriptionToGetDefaultLoginCredentials( - null, ImmutableMap. of()); + null, ImmutableMap. of(), ImmutableMap. of()); Credentials creds = converter.execute(template); assertEquals(creds.identity, "Administrator"); assertEquals(creds.credential, null); diff --git a/compute/src/main/java/org/jclouds/compute/config/BaseComputeServiceContextModule.java b/compute/src/main/java/org/jclouds/compute/config/BaseComputeServiceContextModule.java index d5de71481b..f157506a12 100644 --- a/compute/src/main/java/org/jclouds/compute/config/BaseComputeServiceContextModule.java +++ b/compute/src/main/java/org/jclouds/compute/config/BaseComputeServiceContextModule.java @@ -63,6 +63,7 @@ import org.jclouds.ssh.SshClient; import com.google.common.base.Function; import com.google.common.base.Supplier; import com.google.common.base.Suppliers; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; import com.google.inject.AbstractModule; import com.google.inject.Inject; @@ -183,7 +184,13 @@ public abstract class BaseComputeServiceContextModule extends AbstractModule { protected TemplateBuilder provideTemplate(Injector injector, TemplateBuilder template) { return template.osFamily(UBUNTU).osVersionMatches("1[012].[01][04]").os64Bit(true); } - + + @Provides + @Singleton + protected Map osFamilyToCredentials(Injector injector) { + return ImmutableMap.of(OsFamily.WINDOWS, LoginCredentials.builder().user("Administrator").build()); + } + /** * The default options if none are provided. */ diff --git a/compute/src/main/java/org/jclouds/compute/strategy/impl/ReturnCredentialsBoundToImage.java b/compute/src/main/java/org/jclouds/compute/strategy/impl/ReturnCredentialsBoundToImage.java index 0d58fbe648..2bc3c15c52 100644 --- a/compute/src/main/java/org/jclouds/compute/strategy/impl/ReturnCredentialsBoundToImage.java +++ b/compute/src/main/java/org/jclouds/compute/strategy/impl/ReturnCredentialsBoundToImage.java @@ -40,13 +40,15 @@ import org.jclouds.javax.annotation.Nullable; public class ReturnCredentialsBoundToImage implements PopulateDefaultLoginCredentialsForImageStrategy { protected final LoginCredentials creds; - protected Map credentialStore; + protected final Map credentialStore; + protected final Map osFamilyToCredentials; @Inject public ReturnCredentialsBoundToImage(@Nullable @Named("image") LoginCredentials creds, - Map credentialStore) { + Map credentialStore, Map osFamilyToCredentials) { this.creds = creds; this.credentialStore = credentialStore; + this.osFamilyToCredentials = osFamilyToCredentials; } @Override @@ -58,8 +60,9 @@ public class ReturnCredentialsBoundToImage implements PopulateDefaultLoginCreden Image image = Image.class.cast(resourceToAuthenticate); if (credentialStore.containsKey("image#" + image.getId())) return LoginCredentials.fromCredentials(credentialStore.get("image#" + image.getId())); - if (image.getOperatingSystem() != null && OsFamily.WINDOWS.equals(image.getOperatingSystem().getFamily())) { - return LoginCredentials.builder().user("Administrator").build(); + if (image.getOperatingSystem() != null && image.getOperatingSystem().getFamily() != null + && osFamilyToCredentials.containsKey(image.getOperatingSystem().getFamily())) { + return osFamilyToCredentials.get(image.getOperatingSystem().getFamily()); } else { return LoginCredentials.builder().user("root").build(); } diff --git a/compute/src/test/java/org/jclouds/compute/strategy/impl/ReturnCredentialsBoundToImageTest.java b/compute/src/test/java/org/jclouds/compute/strategy/impl/ReturnCredentialsBoundToImageTest.java index 9f4101217a..a1d943883e 100644 --- a/compute/src/test/java/org/jclouds/compute/strategy/impl/ReturnCredentialsBoundToImageTest.java +++ b/compute/src/test/java/org/jclouds/compute/strategy/impl/ReturnCredentialsBoundToImageTest.java @@ -45,8 +45,8 @@ public class ReturnCredentialsBoundToImageTest { replay(image); LoginCredentials creds = new LoginCredentials("ubuntu", "foo", null, false); - assertEquals(new ReturnCredentialsBoundToImage(creds, ImmutableMap. of()).execute(image), - creds); + assertEquals(new ReturnCredentialsBoundToImage(creds, ImmutableMap. of(), ImmutableMap + . of()).execute(image), creds); verify(image); @@ -58,14 +58,14 @@ public class ReturnCredentialsBoundToImageTest { replay(image); LoginCredentials creds = new LoginCredentials("ubuntu", "foo", null, false); - assertEquals(new ReturnCredentialsBoundToImage(null, ImmutableMap. of("image#1",creds)).execute(image), - creds); + assertEquals(new ReturnCredentialsBoundToImage(null, ImmutableMap. of("image#1", creds), + ImmutableMap. of()).execute(image), creds); verify(image); } - public void testReturnAdministratorOnWindows() { + public void testReturnLoginCredentialAssociatedToOsFamily() { Image image = createMock(Image.class); expect(image.getId()).andReturn("1"); expect(image.getOperatingSystem()).andReturn( @@ -73,7 +73,8 @@ public class ReturnCredentialsBoundToImageTest { replay(image); Credentials creds = new Credentials("Administrator", null); - assertEquals(new ReturnCredentialsBoundToImage(null, ImmutableMap. of()).execute(image), creds); + assertEquals(new ReturnCredentialsBoundToImage(null, ImmutableMap. of(), ImmutableMap.of( + OsFamily.WINDOWS, LoginCredentials.builder().user("Administrator").build())).execute(image), creds); verify(image); @@ -87,7 +88,8 @@ public class ReturnCredentialsBoundToImageTest { replay(image); Credentials creds = new Credentials("root", null); - assertEquals(new ReturnCredentialsBoundToImage(null, ImmutableMap. of()).execute(image), creds); + assertEquals(new ReturnCredentialsBoundToImage(null, ImmutableMap. of(), ImmutableMap + . of()).execute(image), creds); verify(image); diff --git a/labs/hpcloud-compute/src/test/java/org/jclouds/hpcloud/compute/compute/HPCloudComputeTemplateBuilderLiveTest.java b/labs/hpcloud-compute/src/test/java/org/jclouds/hpcloud/compute/compute/HPCloudComputeTemplateBuilderLiveTest.java index 4f3c760046..676e2808e1 100644 --- a/labs/hpcloud-compute/src/test/java/org/jclouds/hpcloud/compute/compute/HPCloudComputeTemplateBuilderLiveTest.java +++ b/labs/hpcloud-compute/src/test/java/org/jclouds/hpcloud/compute/compute/HPCloudComputeTemplateBuilderLiveTest.java @@ -74,7 +74,8 @@ public class HPCloudComputeTemplateBuilderLiveTest extends BaseTemplateBuilderLi assertEquals(defaultTemplate.getImage().getOperatingSystem().getVersion(), "11.10"); assertEquals(defaultTemplate.getImage().getOperatingSystem().getFamily(), OsFamily.UBUNTU); assertEquals(defaultTemplate.getImage().getName(), "Ubuntu Oneiric 11.10 Server 64-bit 20111212"); - assertEquals(defaultTemplate.getLocation().getId(), "az-1.region-a.geo-1"); + assertEquals(defaultTemplate.getImage().getDefaultCredentials().getUser(), "ubuntu"); + assertEquals(defaultTemplate.getLocation().getId(), "az-2.region-a.geo-1"); assertEquals(defaultTemplate.getOptions().as(NovaTemplateOptions.class).shouldAutoAssignFloatingIp(), true); assertEquals(getCores(defaultTemplate.getHardware()), 1.0d); } diff --git a/labs/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/compute/config/NovaComputeServiceContextModule.java b/labs/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/compute/config/NovaComputeServiceContextModule.java index b4ac82de48..f043b20d25 100644 --- a/labs/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/compute/config/NovaComputeServiceContextModule.java +++ b/labs/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/compute/config/NovaComputeServiceContextModule.java @@ -35,9 +35,11 @@ import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.domain.OperatingSystem; +import org.jclouds.compute.domain.OsFamily; import org.jclouds.compute.options.TemplateOptions; import org.jclouds.compute.strategy.impl.CreateNodesWithGroupEncodedIntoNameThenAddToSet; import org.jclouds.domain.Location; +import org.jclouds.domain.LoginCredentials; import org.jclouds.functions.IdentityFunction; import org.jclouds.openstack.nova.v1_1.NovaAsyncClient; import org.jclouds.openstack.nova.v1_1.NovaClient; @@ -68,6 +70,7 @@ import com.google.common.base.Suppliers; 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.Maps; import com.google.common.collect.Multimap; import com.google.inject.Injector; @@ -159,6 +162,12 @@ public class NovaComputeServiceContextModule CacheLoader in) { return CacheBuilder.newBuilder().build(in); } + + @Override + protected Map osFamilyToCredentials(Injector injector) { + return ImmutableMap.of(OsFamily.WINDOWS, LoginCredentials.builder().user("Administrator").build(), + OsFamily.UBUNTU, LoginCredentials.builder().user("ubuntu").build()); + } @Provides @Singleton