Issue 441: added new type: LoginCredentials, and (jclouds|provider).image.(login-user|authenticate-sudo) context properties

This commit is contained in:
Adrian Cole 2011-11-21 10:57:58 +02:00
parent 1b2a221744
commit 4a5af1e7a5
139 changed files with 2558 additions and 1693 deletions

View File

@ -42,6 +42,8 @@ import org.jclouds.compute.domain.OsFamily;
import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.compute.reference.ComputeServiceConstants;
import org.jclouds.domain.Credentials; import org.jclouds.domain.Credentials;
import org.jclouds.domain.Location; import org.jclouds.domain.Location;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.domain.LoginCredentials.Builder;
import org.jclouds.logging.Logger; import org.jclouds.logging.Logger;
import org.jclouds.util.Strings2; import org.jclouds.util.Strings2;
@ -92,24 +94,25 @@ public class NodeToNodeMetadata implements Function<Node, NodeMetadata> {
builder.publicAddresses(ImmutableSet.<String> of(from.getHostname())); builder.publicAddresses(ImmutableSet.<String> of(from.getHostname()));
if (from.getUsername() != null) { if (from.getUsername() != null) {
Credentials creds = null; Builder credBuilder = LoginCredentials.builder().user(from.getUsername());
if (from.getCredentialUrl() != null) { if (from.getCredentialUrl() != null) {
try { try {
creds = new Credentials(from.getUsername(), Strings2.toStringAndClose(slurp.apply(from credBuilder.credential(Strings2.toStringAndClose(slurp.apply(from.getCredentialUrl())));
.getCredentialUrl())));
} catch (IOException e) { } catch (IOException e) {
logger.error(e, "URI could not be read: %s", from.getCredentialUrl()); logger.error(e, "URI could not be read: %s", from.getCredentialUrl());
} }
} else if (from.getCredential() != null) { } else if (from.getCredential() != null) {
creds = new Credentials(from.getUsername(), from.getCredential()); credBuilder.credential(from.getCredential());
} }
if (creds != null) if (from.getSudoPassword() != null){
builder.credentials(creds); credBuilder.password(from.getSudoPassword());
credBuilder.authenticateSudo(true);
}
LoginCredentials creds = credBuilder.build();
builder.credentials(creds);
credentialStore.put("node#" + from.getId(), creds); credentialStore.put("node#" + from.getId(), creds);
} }
if (from.getSudoPassword() != null)
builder.adminPassword(from.getSudoPassword());
return builder.build(); return builder.build();
} }

View File

@ -30,13 +30,16 @@ import org.jclouds.byon.config.CacheNodeStoreModule;
import org.jclouds.byon.functions.NodesFromYamlTest; import org.jclouds.byon.functions.NodesFromYamlTest;
import org.jclouds.compute.ComputeServiceContext; import org.jclouds.compute.ComputeServiceContext;
import org.jclouds.compute.ComputeServiceContextFactory; import org.jclouds.compute.ComputeServiceContextFactory;
import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.domain.Location; import org.jclouds.domain.Location;
import org.jclouds.domain.LoginCredentials;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import com.google.common.base.Supplier; import com.google.common.base.Supplier;
import com.google.common.cache.Cache; import com.google.common.cache.Cache;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import com.google.inject.Module; import com.google.inject.Module;
/** /**
@ -83,8 +86,8 @@ public class BYONComputeServiceTest {
assertEquals(supplier.get().asMap(), assertEquals(supplier.get().asMap(),
ImmutableMap.<String, Node> of(NodesFromYamlTest.TEST1.getId(), NodesFromYamlTest.TEST1)); ImmutableMap.<String, Node> of(NodesFromYamlTest.TEST1.getId(), NodesFromYamlTest.TEST1));
assertEquals(context.getComputeService().listNodes(), assertEquals(context.getComputeService().listNodes().toString(),
ImmutableSet.of(expectedNodeMetadataFromResource(endpoint))); ImmutableSet.of(expectedNodeMetadataFromResource(endpoint)).toString());
assertEquals(context.getComputeService().listAssignableLocations(), ImmutableSet.of(providerLocation)); assertEquals(context.getComputeService().listAssignableLocations(), ImmutableSet.of(providerLocation));
} finally { } finally {
if (context != null) if (context != null)
@ -98,8 +101,8 @@ public class BYONComputeServiceTest {
String endpoint = "file://" + getClass().getResource("/test_location.yaml").getPath(); String endpoint = "file://" + getClass().getResource("/test_location.yaml").getPath();
Properties props = new Properties(); Properties props = new Properties();
props.setProperty("byon.endpoint", endpoint); props.setProperty("byon.endpoint", endpoint);
context = new ComputeServiceContextFactory().createContext("byon", "foo", "bar", context = new ComputeServiceContextFactory().createContext("byon", "foo", "bar", ImmutableSet.<Module> of(),
ImmutableSet.<Module> of(), props); props);
assertEquals(context.getProviderSpecificContext().getEndpoint(), URI.create(endpoint)); assertEquals(context.getProviderSpecificContext().getEndpoint(), URI.create(endpoint));
@ -115,9 +118,26 @@ public class BYONComputeServiceTest {
Location virginia = zoneCalled("virginia", providerLocation); Location virginia = zoneCalled("virginia", providerLocation);
Location maryland = zoneCalled("maryland", providerLocation); Location maryland = zoneCalled("maryland", providerLocation);
assertEquals(context.getComputeService().listNodes(), ImmutableSet.of( assertEquals(
expectedNodeMetadataFromResource(1, endpoint, virginia), context.getComputeService().listNodes().toString(),
expectedNodeMetadataFromResource(2, endpoint, maryland, 2022))); ImmutableSet.of(expectedNodeMetadataFromResource(1, endpoint, virginia),
expectedNodeMetadataFromResource(2, endpoint, maryland, 2022)).toString());
assertEquals(NodeMetadata.class.cast(Iterables.get(context.getComputeService().listNodes(), 0))
.getCredentials(),
LoginCredentials
.builder()
.user("myUser")
.password("happy bear")
.authenticateSudo(true)
.privateKey(
"-----BEGIN RSA PRIVATE KEY-----\n"
+ "MIIEowIBAAKCAQEAuzaE6azgUxwESX1rCGdJ5xpdrc1XC311bOGZBCE8NA+CpFh2\n"
+ "u01Vfv68NC4u6LFgdXSY1vQt6hiA5TNqQk0TyVfFAunbXgTekF6XqDPQUf1nq9aZ\n"
+ "lMvo4vlaLDKBkhG5HJE/pIa0iB+RMZLS0GhxsIWerEDmYdHKM25o\n"
+ "-----END RSA PRIVATE KEY-----\n").build()
);
assertEquals(context.getComputeService().listAssignableLocations(), ImmutableSet.of(virginia, maryland)); assertEquals(context.getComputeService().listAssignableLocations(), ImmutableSet.of(virginia, maryland));
} finally { } finally {

View File

@ -34,6 +34,7 @@ import org.jclouds.domain.Credentials;
import org.jclouds.domain.Location; import org.jclouds.domain.Location;
import org.jclouds.domain.LocationBuilder; import org.jclouds.domain.LocationBuilder;
import org.jclouds.domain.LocationScope; import org.jclouds.domain.LocationScope;
import org.jclouds.domain.LoginCredentials;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import com.google.common.base.Suppliers; import com.google.common.base.Suppliers;
@ -86,11 +87,15 @@ public class NodeToNodeMetadataTest {
.hostname("cluster-" + id + ".mydomain.com") .hostname("cluster-" + id + ".mydomain.com")
.location(location) .location(location)
.userMetadata(ImmutableMap.of("Name", "foo")) .userMetadata(ImmutableMap.of("Name", "foo"))
.tags(ImmutableSet.of("vanilla"))
.state(NodeState.RUNNING) .state(NodeState.RUNNING)
.operatingSystem( .operatingSystem(
OperatingSystem.builder().description("redhat").family(OsFamily.RHEL).arch("x86").version("5.3") OperatingSystem.builder().description("redhat").family(OsFamily.RHEL).arch("x86").version("5.3")
.build()).publicAddresses(ImmutableSet.of("cluster-" + id + ".mydomain.com")) .build())
.credentials(new Credentials("myUser", NodesFromYamlTest.key)).adminPassword("happy bear").build(); .publicAddresses(ImmutableSet.of("cluster-" + id + ".mydomain.com"))
.credentials(
LoginCredentials.builder().user("myUser").privateKey(NodesFromYamlTest.key).password("happy bear")
.authenticateSudo(true).build()).build();
} }
@Test @Test

View File

@ -40,7 +40,8 @@
<test.cloudservers.identity>${test.rackspace.identity}</test.cloudservers.identity> <test.cloudservers.identity>${test.rackspace.identity}</test.cloudservers.identity>
<test.cloudservers.credential>${test.rackspace.credential}</test.cloudservers.credential> <test.cloudservers.credential>${test.rackspace.credential}</test.cloudservers.credential>
<test.cloudservers.image-id></test.cloudservers.image-id> <test.cloudservers.image-id></test.cloudservers.image-id>
<test.cloudservers.login-user></test.cloudservers.login-user> <test.cloudservers.image.login-user></test.cloudservers.image.login-user>
<test.cloudservers.image.authenticate-sudo></test.cloudservers.image.authenticate-sudo>
</properties> </properties>
<dependencies> <dependencies>
@ -111,7 +112,8 @@
<test.cloudstack.identity>${test.cloudstack.identity}</test.cloudstack.identity> <test.cloudstack.identity>${test.cloudstack.identity}</test.cloudstack.identity>
<test.cloudstack.credential>${test.cloudstack.credential}</test.cloudstack.credential> <test.cloudstack.credential>${test.cloudstack.credential}</test.cloudstack.credential>
<test.cloudstack.image-id>${test.cloudstack.image-id}</test.cloudstack.image-id> <test.cloudstack.image-id>${test.cloudstack.image-id}</test.cloudstack.image-id>
<test.cloudstack.login-user>${test.cloudstack.login-user}</test.cloudstack.login-user> <test.cloudstack.image.login-user>${test.cloudstack.image.login-user}</test.cloudstack.image.login-user>
<test.cloudstack.image.authenticate-sudo>${test.cloudstack.image.authenticate-sudo}</test.cloudstack.image.authenticate-sudo>
</systemPropertyVariables> </systemPropertyVariables>
</configuration> </configuration>
</execution> </execution>

View File

@ -39,7 +39,8 @@
<test.cloudsigma.identity>FIXME</test.cloudsigma.identity> <test.cloudsigma.identity>FIXME</test.cloudsigma.identity>
<test.cloudsigma.credential>FIXME</test.cloudsigma.credential> <test.cloudsigma.credential>FIXME</test.cloudsigma.credential>
<test.cloudsigma.image-id></test.cloudsigma.image-id> <test.cloudsigma.image-id></test.cloudsigma.image-id>
<test.cloudsigma.login-user></test.cloudsigma.login-user> <test.cloudsigma.image.login-user></test.cloudsigma.image.login-user>
<test.cloudsigma.image.authenticate-sudo></test.cloudsigma.image.authenticate-sudo>
</properties> </properties>
<dependencies> <dependencies>
@ -97,7 +98,8 @@
<test.cloudsigma.identity>${test.cloudsigma.identity}</test.cloudsigma.identity> <test.cloudsigma.identity>${test.cloudsigma.identity}</test.cloudsigma.identity>
<test.cloudsigma.credential>${test.cloudsigma.credential}</test.cloudsigma.credential> <test.cloudsigma.credential>${test.cloudsigma.credential}</test.cloudsigma.credential>
<test.cloudsigma.image-id>${test.cloudsigma.image-id}</test.cloudsigma.image-id> <test.cloudsigma.image-id>${test.cloudsigma.image-id}</test.cloudsigma.image-id>
<test.cloudsigma.login-user>${test.cloudsigma.login-user}</test.cloudsigma.login-user> <test.cloudsigma.image.login-user>${test.cloudsigma.image.login-user}</test.cloudsigma.image.login-user>
<test.cloudsigma.image.authenticate-sudo>${test.cloudsigma.image.authenticate-sudo}</test.cloudsigma.image.authenticate-sudo>
</systemPropertyVariables> </systemPropertyVariables>
</configuration> </configuration>
</execution> </execution>

View File

@ -50,8 +50,8 @@ import org.jclouds.compute.domain.Template;
import org.jclouds.compute.domain.Volume; import org.jclouds.compute.domain.Volume;
import org.jclouds.compute.domain.internal.VolumeImpl; import org.jclouds.compute.domain.internal.VolumeImpl;
import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.compute.reference.ComputeServiceConstants;
import org.jclouds.domain.Credentials;
import org.jclouds.domain.Location; import org.jclouds.domain.Location;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.location.suppliers.JustProvider; import org.jclouds.location.suppliers.JustProvider;
import org.jclouds.logging.Logger; import org.jclouds.logging.Logger;
@ -126,8 +126,8 @@ public class CloudSigmaComputeServiceAdapter implements
logger.debug("<< created server(%s)", from.getUuid()); logger.debug("<< created server(%s)", from.getUuid());
logger.debug(">> starting server(%s)", from.getUuid()); logger.debug(">> starting server(%s)", from.getUuid());
client.startServer(from.getUuid()); client.startServer(from.getUuid());
return new NodeAndInitialCredentials<ServerInfo>(from, from.getUuid(), return new NodeAndInitialCredentials<ServerInfo>(from, from.getUuid(), LoginCredentials.builder()
new Credentials("root", defaultVncPassword)); .password(defaultVncPassword).authenticateSudo(true).build());
} }
@Override @Override

View File

@ -27,8 +27,8 @@ import org.jclouds.compute.domain.ImageBuilder;
import org.jclouds.compute.domain.OperatingSystem; import org.jclouds.compute.domain.OperatingSystem;
import org.jclouds.compute.domain.OperatingSystem.Builder; import org.jclouds.compute.domain.OperatingSystem.Builder;
import org.jclouds.compute.domain.OsFamilyVersion64Bit; import org.jclouds.compute.domain.OsFamilyVersion64Bit;
import org.jclouds.domain.Credentials;
import org.jclouds.domain.Location; import org.jclouds.domain.Location;
import org.jclouds.domain.LoginCredentials;
import com.google.common.base.Function; import com.google.common.base.Function;
import com.google.common.base.Supplier; import com.google.common.base.Supplier;
@ -59,9 +59,10 @@ public class PreinstalledDiskToImage implements Function<DriveInfo, Image> {
builder.name(drive.getName()).description(description) builder.name(drive.getName()).description(description)
.is64Bit(drive.getBits() != null ? drive.getBits() == 64 : parsed.is64Bit).version(parsed.version) .is64Bit(drive.getBits() != null ? drive.getBits() == 64 : parsed.is64Bit).version(parsed.version)
.family(parsed.family); .family(parsed.family);
return new ImageBuilder().ids(drive.getUuid()).adminPassword("cloudsigma") return new ImageBuilder().ids(drive.getUuid())
.userMetadata(ImmutableMap.<String, String> of("size", drive.getSize() / 1024 / 1024 / 1024 + "")) .userMetadata(ImmutableMap.<String, String> of("size", drive.getSize() / 1024 / 1024 / 1024 + ""))
.defaultCredentials(new Credentials("cloudsigma", null)).location(locationSupplier.get()) .defaultCredentials(new LoginCredentials("cloudsigma", "cloudsigma", null, true))
.name(drive.getName()).description(description).operatingSystem(builder.build()).version("").build(); .location(locationSupplier.get()).name(drive.getName()).description(description)
.operatingSystem(builder.build()).version("").build();
} }
} }

View File

@ -44,7 +44,6 @@ import org.jclouds.compute.domain.NodeState;
import org.jclouds.compute.domain.Processor; import org.jclouds.compute.domain.Processor;
import org.jclouds.compute.domain.Volume; import org.jclouds.compute.domain.Volume;
import org.jclouds.compute.domain.VolumeBuilder; import org.jclouds.compute.domain.VolumeBuilder;
import org.jclouds.domain.Credentials;
import org.jclouds.domain.Location; import org.jclouds.domain.Location;
import org.jclouds.logging.Logger; import org.jclouds.logging.Logger;
@ -73,15 +72,12 @@ public class ServerInfoToNodeMetadata implements Function<ServerInfo, NodeMetada
private final Function<Server, String> getImageIdFromServer; private final Function<Server, String> getImageIdFromServer;
private final Function<String, Image> findImageForId; private final Function<String, Image> findImageForId;
private final Map<String, Credentials> credentialStore;
private final Supplier<Location> locationSupplier; private final Supplier<Location> locationSupplier;
private final Function<Device, Volume> deviceToVolume; private final Function<Device, Volume> deviceToVolume;
@Inject @Inject
ServerInfoToNodeMetadata(Map<String, Credentials> credentialStore, Function<Server, String> getImageIdFromServer, ServerInfoToNodeMetadata(Function<Server, String> getImageIdFromServer, Function<String, Image> findImageForId,
Function<String, Image> findImageForId, Function<Device, Volume> deviceToVolume, Function<Device, Volume> deviceToVolume, Supplier<Location> locationSupplier) {
Supplier<Location> locationSupplier) {
this.credentialStore = checkNotNull(credentialStore, "credentialStore");
this.locationSupplier = checkNotNull(locationSupplier, "locationSupplier"); this.locationSupplier = checkNotNull(locationSupplier, "locationSupplier");
this.deviceToVolume = checkNotNull(deviceToVolume, "deviceToVolume"); this.deviceToVolume = checkNotNull(deviceToVolume, "deviceToVolume");
this.findImageForId = checkNotNull(findImageForId, "findImageForId"); this.findImageForId = checkNotNull(findImageForId, "findImageForId");
@ -102,7 +98,6 @@ public class ServerInfoToNodeMetadata implements Function<ServerInfo, NodeMetada
Image image = findImageForId.apply(imageId); Image image = findImageForId.apply(imageId);
if (image != null) { if (image != null) {
builder.operatingSystem(image.getOperatingSystem()); builder.operatingSystem(image.getOperatingSystem());
builder.adminPassword(image.getAdminPassword());
} }
} }
builder.hardware(new HardwareBuilder().ids(from.getUuid()) builder.hardware(new HardwareBuilder().ids(from.getUuid())
@ -111,7 +106,6 @@ public class ServerInfoToNodeMetadata implements Function<ServerInfo, NodeMetada
builder.state(serverStatusToNodeState.get(from.getStatus())); builder.state(serverStatusToNodeState.get(from.getStatus()));
builder.publicAddresses(ImmutableSet.<String> of(from.getVnc().getIp())); builder.publicAddresses(ImmutableSet.<String> of(from.getVnc().getIp()));
builder.privateAddresses(ImmutableSet.<String> of()); builder.privateAddresses(ImmutableSet.<String> of());
builder.credentials(credentialStore.get("node#"+ from.getUuid()));
return builder.build(); return builder.build();
} }
@ -144,8 +138,8 @@ public class ServerInfoToNodeMetadata implements Function<ServerInfo, NodeMetada
} }
/** /**
* When we create the boot drive of the server, by convention we set the name to the image it * When we create the boot drive of the server, by convention we set the name
* came from. * to the image it came from.
* *
* @author Adrian Cole * @author Adrian Cole
* *

View File

@ -55,7 +55,8 @@
<test.cloudstack.domainAdminIdentity></test.cloudstack.domainAdminIdentity> <test.cloudstack.domainAdminIdentity></test.cloudstack.domainAdminIdentity>
<test.cloudstack.domainAdminCredential></test.cloudstack.domainAdminCredential> <test.cloudstack.domainAdminCredential></test.cloudstack.domainAdminCredential>
<test.cloudstack.image-id></test.cloudstack.image-id> <test.cloudstack.image-id></test.cloudstack.image-id>
<test.cloudstack.login-user></test.cloudstack.login-user> <test.cloudstack.image.login-user></test.cloudstack.image.login-user>
<test.cloudstack.image.authenticate-sudo></test.cloudstack.image.authenticate-sudo>
</properties> </properties>
<dependencies> <dependencies>
<dependency> <dependency>
@ -119,7 +120,8 @@
<test.cloudstack.identity>${test.cloudstack.identity}</test.cloudstack.identity> <test.cloudstack.identity>${test.cloudstack.identity}</test.cloudstack.identity>
<test.cloudstack.credential>${test.cloudstack.credential}</test.cloudstack.credential> <test.cloudstack.credential>${test.cloudstack.credential}</test.cloudstack.credential>
<test.cloudstack.image-id>${test.cloudstack.image-id}</test.cloudstack.image-id> <test.cloudstack.image-id>${test.cloudstack.image-id}</test.cloudstack.image-id>
<test.cloudstack.login-user>${test.cloudstack.login-user}</test.cloudstack.login-user> <test.cloudstack.image.login-user>${test.cloudstack.image.login-user}</test.cloudstack.image.login-user>
<test.cloudstack.image.authenticate-sudo>${test.cloudstack.image.authenticate-sudo}</test.cloudstack.image.authenticate-sudo>
<test.cloudstack.domainAdminIdentity>${test.cloudstack.domainAdminIdentity}</test.cloudstack.domainAdminIdentity> <test.cloudstack.domainAdminIdentity>${test.cloudstack.domainAdminIdentity}</test.cloudstack.domainAdminIdentity>
<test.cloudstack.domainAdminCredential>${test.cloudstack.domainAdminCredential}</test.cloudstack.domainAdminCredential> <test.cloudstack.domainAdminCredential>${test.cloudstack.domainAdminCredential}</test.cloudstack.domainAdminCredential>
</systemPropertyVariables> </systemPropertyVariables>

View File

@ -36,7 +36,6 @@ import org.jclouds.compute.domain.Image;
import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.compute.domain.NodeMetadataBuilder; import org.jclouds.compute.domain.NodeMetadataBuilder;
import org.jclouds.compute.domain.NodeState; import org.jclouds.compute.domain.NodeState;
import org.jclouds.domain.Credentials;
import org.jclouds.domain.Location; import org.jclouds.domain.Location;
import org.jclouds.rest.ResourceNotFoundException; import org.jclouds.rest.ResourceNotFoundException;
import org.jclouds.util.InetAddresses2; import org.jclouds.util.InetAddresses2;
@ -68,19 +67,16 @@ public class VirtualMachineToNodeMetadata implements Function<VirtualMachine, No
.put(VirtualMachine.State.SHUTDOWNED, NodeState.PENDING) .put(VirtualMachine.State.SHUTDOWNED, NodeState.PENDING)
.put(VirtualMachine.State.UNRECOGNIZED, NodeState.UNRECOGNIZED).build(); .put(VirtualMachine.State.UNRECOGNIZED, NodeState.UNRECOGNIZED).build();
private final Map<String, Credentials> credentialStore;
private final FindLocationForVirtualMachine findLocationForVirtualMachine; private final FindLocationForVirtualMachine findLocationForVirtualMachine;
private final FindHardwareForVirtualMachine findHardwareForVirtualMachine; private final FindHardwareForVirtualMachine findHardwareForVirtualMachine;
private final FindImageForVirtualMachine findImageForVirtualMachine; private final FindImageForVirtualMachine findImageForVirtualMachine;
private final Cache<Long, IPForwardingRule> getIPForwardingRuleByVirtualMachine; private final Cache<Long, IPForwardingRule> getIPForwardingRuleByVirtualMachine;
@Inject @Inject
VirtualMachineToNodeMetadata(Map<String, Credentials> credentialStore, VirtualMachineToNodeMetadata(FindLocationForVirtualMachine findLocationForVirtualMachine,
FindLocationForVirtualMachine findLocationForVirtualMachine,
FindHardwareForVirtualMachine findHardwareForVirtualMachine, FindHardwareForVirtualMachine findHardwareForVirtualMachine,
FindImageForVirtualMachine findImageForVirtualMachine, FindImageForVirtualMachine findImageForVirtualMachine,
Cache<Long, IPForwardingRule> getIPForwardingRuleByVirtualMachine) { Cache<Long, IPForwardingRule> getIPForwardingRuleByVirtualMachine) {
this.credentialStore = checkNotNull(credentialStore, "credentialStore");
this.findLocationForVirtualMachine = checkNotNull(findLocationForVirtualMachine, "findLocationForVirtualMachine"); this.findLocationForVirtualMachine = checkNotNull(findLocationForVirtualMachine, "findLocationForVirtualMachine");
this.findHardwareForVirtualMachine = checkNotNull(findHardwareForVirtualMachine, "findHardwareForVirtualMachine"); this.findHardwareForVirtualMachine = checkNotNull(findHardwareForVirtualMachine, "findHardwareForVirtualMachine");
this.findImageForVirtualMachine = checkNotNull(findImageForVirtualMachine, "findImageForVirtualMachine"); this.findImageForVirtualMachine = checkNotNull(findImageForVirtualMachine, "findImageForVirtualMachine");
@ -127,7 +123,6 @@ public class VirtualMachineToNodeMetadata implements Function<VirtualMachine, No
throw e; throw e;
} }
} }
builder.credentials(credentialStore.get("node#" + from.getId()));
return builder.build(); return builder.build();
} }

View File

@ -55,6 +55,7 @@ import org.jclouds.compute.ComputeService;
import org.jclouds.compute.ComputeServiceAdapter; import org.jclouds.compute.ComputeServiceAdapter;
import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.compute.reference.ComputeServiceConstants;
import org.jclouds.domain.Credentials; import org.jclouds.domain.Credentials;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.logging.Logger; import org.jclouds.logging.Logger;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
@ -161,12 +162,12 @@ public class CloudStackComputeServiceAdapter implements
private static final long serialVersionUID = 4371112085613620239L; private static final long serialVersionUID = 4371112085613620239L;
}); });
VirtualMachine vm = jobWithResult.getResult(); VirtualMachine vm = jobWithResult.getResult();
Credentials credentials = null; LoginCredentials credentials = null;
if (vm.isPasswordEnabled()) { if (vm.isPasswordEnabled()) {
assert vm.getPassword() != null : vm; assert vm.getPassword() != null : vm;
credentials = new Credentials(null, vm.getPassword()); credentials = LoginCredentials.builder().password(vm.getPassword()).build();
} else { } else {
credentials = credentialStore.get("keypair#" + templateOptions.getKeyPair()); credentials = LoginCredentials.builder(credentialStore.get("keypair#" + templateOptions.getKeyPair())).build();
} }
if (templateOptions.shouldSetupStaticNat()) { if (templateOptions.shouldSetupStaticNat()) {
// TODO: possibly not all network ids, do we want to do this // TODO: possibly not all network ids, do we want to do this

View File

@ -19,14 +19,12 @@
package org.jclouds.cloudstack.compute; package org.jclouds.cloudstack.compute;
import static com.google.common.collect.Iterables.concat; import static com.google.common.collect.Iterables.concat;
import static com.google.common.collect.Iterables.filter;
import static com.google.common.collect.Iterables.get; import static com.google.common.collect.Iterables.get;
import static com.google.common.collect.Sets.newTreeSet; import static com.google.common.collect.Sets.newTreeSet;
import static org.jclouds.cloudstack.options.CreateNetworkOptions.Builder.vlan; import static org.jclouds.cloudstack.options.CreateNetworkOptions.Builder.vlan;
import static org.jclouds.cloudstack.options.ListNetworkOfferingsOptions.Builder.specifyVLAN; import static org.jclouds.cloudstack.options.ListNetworkOfferingsOptions.Builder.specifyVLAN;
import java.net.URI; import java.net.URI;
import java.net.URISyntaxException;
import java.util.Set; import java.util.Set;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;

View File

@ -21,7 +21,6 @@ package org.jclouds.cloudstack.compute.functions;
import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertEquals;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import java.util.Map;
import java.util.Set; import java.util.Set;
import org.jclouds.cloudstack.compute.functions.VirtualMachineToNodeMetadata.FindHardwareForVirtualMachine; import org.jclouds.cloudstack.compute.functions.VirtualMachineToNodeMetadata.FindHardwareForVirtualMachine;
@ -35,7 +34,6 @@ import org.jclouds.compute.domain.Image;
import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.compute.domain.NodeMetadataBuilder; import org.jclouds.compute.domain.NodeMetadataBuilder;
import org.jclouds.compute.domain.NodeState; import org.jclouds.compute.domain.NodeState;
import org.jclouds.domain.Credentials;
import org.jclouds.domain.Location; import org.jclouds.domain.Location;
import org.jclouds.rest.ResourceNotFoundException; import org.jclouds.rest.ResourceNotFoundException;
import org.testng.annotations.Test; import org.testng.annotations.Test;
@ -44,7 +42,6 @@ import com.google.common.base.Supplier;
import com.google.common.base.Suppliers; import com.google.common.base.Suppliers;
import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader; import com.google.common.cache.CacheLoader;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
@ -57,11 +54,6 @@ public class VirtualMachineToNodeMetadataTest {
@Test @Test
public void testApplyWhereVirtualMachineWithIPForwardingRule() throws UnknownHostException { public void testApplyWhereVirtualMachineWithIPForwardingRule() throws UnknownHostException {
// note we are testing when no credentials are here. otherwise would be
// ("node#416696", new
// Credentials("root", "password"))
Map<String, Credentials> credentialStore = ImmutableMap.<String, Credentials> of();
Supplier<Set<? extends Location>> locationSupplier = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet Supplier<Set<? extends Location>> locationSupplier = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet
.<Location> of(ZoneToLocationTest.one, ZoneToLocationTest.two)); .<Location> of(ZoneToLocationTest.one, ZoneToLocationTest.two));
@ -70,17 +62,17 @@ public class VirtualMachineToNodeMetadataTest {
Supplier<Set<? extends Image>> imageSupplier = Suppliers.<Set<? extends Image>> ofInstance(ImmutableSet Supplier<Set<? extends Image>> imageSupplier = Suppliers.<Set<? extends Image>> ofInstance(ImmutableSet
.<Image> of(TemplateToImageTest.one, TemplateToImageTest.two)); .<Image> of(TemplateToImageTest.one, TemplateToImageTest.two));
VirtualMachineToNodeMetadata parser = new VirtualMachineToNodeMetadata(credentialStore, VirtualMachineToNodeMetadata parser = new VirtualMachineToNodeMetadata(new FindLocationForVirtualMachine(
new FindLocationForVirtualMachine(locationSupplier), new FindHardwareForVirtualMachine(hardwareSupplier), locationSupplier), new FindHardwareForVirtualMachine(hardwareSupplier), new FindImageForVirtualMachine(
new FindImageForVirtualMachine(imageSupplier), CacheBuilder.newBuilder().<Long, IPForwardingRule> build( imageSupplier), CacheBuilder.newBuilder().<Long, IPForwardingRule> build(
new CacheLoader<Long, IPForwardingRule>() { new CacheLoader<Long, IPForwardingRule>() {
@Override @Override
public IPForwardingRule load(Long arg0) throws Exception { public IPForwardingRule load(Long arg0) throws Exception {
return IPForwardingRule.builder().id(1234l).IPAddress("1.1.1.1").build(); return IPForwardingRule.builder().id(1234l).IPAddress("1.1.1.1").build();
} }
})); }));
// notice if we've already parsed this properly here, we can rely on it. // notice if we've already parsed this properly here, we can rely on it.
VirtualMachine guest = Iterables.get(new ListVirtualMachinesResponseTest().expected(), 0); VirtualMachine guest = Iterables.get(new ListVirtualMachinesResponseTest().expected(), 0);
@ -89,24 +81,17 @@ public class VirtualMachineToNodeMetadataTest {
assertEquals( assertEquals(
node.toString(), node.toString(),
new NodeMetadataBuilder().id("54").providerId("54").name("i-3-54-VM").group("i-3").location(ZoneToLocationTest.one) new NodeMetadataBuilder().id("54").providerId("54").name("i-3-54-VM").group("i-3")
.state(NodeState.PENDING).privateAddresses(ImmutableSet.of("10.1.1.18")) .location(ZoneToLocationTest.one).state(NodeState.PENDING)
.publicAddresses(ImmutableSet.of("1.1.1.1")).hardware(ServiceOfferingToHardwareTest.one) .privateAddresses(ImmutableSet.of("10.1.1.18")).publicAddresses(ImmutableSet.of("1.1.1.1"))
.imageId(TemplateToImageTest.one.getId()) .hardware(ServiceOfferingToHardwareTest.one).imageId(TemplateToImageTest.one.getId())
.operatingSystem(TemplateToImageTest.one.getOperatingSystem()).build().toString()); .operatingSystem(TemplateToImageTest.one.getOperatingSystem()).build().toString());
// because it wasn't present in the credential store.
assertEquals(node.getCredentials(), null);
} }
@Test @Test
public void testApplyWhereVirtualMachineWithNoPassword() throws UnknownHostException { public void testApplyWhereVirtualMachineWithNoPassword() throws UnknownHostException {
// note we are testing when no credentials are here. otherwise would be
// ("node#416696", new
// Credentials("root", "password"))
Map<String, Credentials> credentialStore = ImmutableMap.<String, Credentials> of();
Supplier<Set<? extends Location>> locationSupplier = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet Supplier<Set<? extends Location>> locationSupplier = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet
.<Location> of(ZoneToLocationTest.one, ZoneToLocationTest.two)); .<Location> of(ZoneToLocationTest.one, ZoneToLocationTest.two));
@ -115,17 +100,17 @@ public class VirtualMachineToNodeMetadataTest {
Supplier<Set<? extends Image>> imageSupplier = Suppliers.<Set<? extends Image>> ofInstance(ImmutableSet Supplier<Set<? extends Image>> imageSupplier = Suppliers.<Set<? extends Image>> ofInstance(ImmutableSet
.<Image> of(TemplateToImageTest.one, TemplateToImageTest.two)); .<Image> of(TemplateToImageTest.one, TemplateToImageTest.two));
VirtualMachineToNodeMetadata parser = new VirtualMachineToNodeMetadata(credentialStore, VirtualMachineToNodeMetadata parser = new VirtualMachineToNodeMetadata(new FindLocationForVirtualMachine(
new FindLocationForVirtualMachine(locationSupplier), new FindHardwareForVirtualMachine(hardwareSupplier), locationSupplier), new FindHardwareForVirtualMachine(hardwareSupplier), new FindImageForVirtualMachine(
new FindImageForVirtualMachine(imageSupplier), CacheBuilder.newBuilder().<Long, IPForwardingRule> build( imageSupplier), CacheBuilder.newBuilder().<Long, IPForwardingRule> build(
new CacheLoader<Long, IPForwardingRule>() { new CacheLoader<Long, IPForwardingRule>() {
@Override @Override
public IPForwardingRule load(Long arg0) throws Exception { public IPForwardingRule load(Long arg0) throws Exception {
throw new ResourceNotFoundException("no ip forwarding rule for: " + arg0); throw new ResourceNotFoundException("no ip forwarding rule for: " + arg0);
} }
})); }));
// notice if we've already parsed this properly here, we can rely on it. // notice if we've already parsed this properly here, we can rely on it.
VirtualMachine guest = Iterables.get(new ListVirtualMachinesResponseTest().expected(), 0); VirtualMachine guest = Iterables.get(new ListVirtualMachinesResponseTest().expected(), 0);
@ -134,55 +119,11 @@ public class VirtualMachineToNodeMetadataTest {
assertEquals( assertEquals(
node.toString(), node.toString(),
new NodeMetadataBuilder().id("54").providerId("54").name("i-3-54-VM").group("i-3").location(ZoneToLocationTest.one) new NodeMetadataBuilder().id("54").providerId("54").name("i-3-54-VM").group("i-3")
.state(NodeState.PENDING).privateAddresses(ImmutableSet.of("10.1.1.18")) .location(ZoneToLocationTest.one).state(NodeState.PENDING)
.hardware(ServiceOfferingToHardwareTest.one).imageId(TemplateToImageTest.one.getId()) .privateAddresses(ImmutableSet.of("10.1.1.18")).hardware(ServiceOfferingToHardwareTest.one)
.imageId(TemplateToImageTest.one.getId())
.operatingSystem(TemplateToImageTest.one.getOperatingSystem()).build().toString()); .operatingSystem(TemplateToImageTest.one.getOperatingSystem()).build().toString());
// because it wasn't present in the credential store.
assertEquals(node.getCredentials(), null);
} }
@Test
public void testApplyWhereVirtualMachineWithPassword() throws UnknownHostException {
Map<String, Credentials> credentialStore = ImmutableMap.<String, Credentials> of("node#54", new Credentials(
"root", "password"));
Supplier<Set<? extends Location>> locationSupplier = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet
.<Location> of(ZoneToLocationTest.one, ZoneToLocationTest.two));
Supplier<Set<? extends Hardware>> hardwareSupplier = Suppliers.<Set<? extends Hardware>> ofInstance(ImmutableSet
.<Hardware> of(ServiceOfferingToHardwareTest.one, ServiceOfferingToHardwareTest.two));
Supplier<Set<? extends Image>> imageSupplier = Suppliers.<Set<? extends Image>> ofInstance(ImmutableSet
.<Image> of(TemplateToImageTest.one, TemplateToImageTest.two));
VirtualMachineToNodeMetadata parser = new VirtualMachineToNodeMetadata(credentialStore,
new FindLocationForVirtualMachine(locationSupplier), new FindHardwareForVirtualMachine(hardwareSupplier),
new FindImageForVirtualMachine(imageSupplier), CacheBuilder.newBuilder().<Long, IPForwardingRule> build(
new CacheLoader<Long, IPForwardingRule>() {
@Override
public IPForwardingRule load(Long arg0) throws Exception {
throw new ResourceNotFoundException("no ip forwarding rule for: " + arg0);
}
}));
// notice if we've already parsed this properly here, we can rely on it.
VirtualMachine guest = Iterables.get(new ListVirtualMachinesResponseTest().expected(), 0);
NodeMetadata node = parser.apply(guest);
assertEquals(
node.toString(),
new NodeMetadataBuilder().id("54").providerId("54").name("i-3-54-VM").group("i-3").location(ZoneToLocationTest.one)
.state(NodeState.PENDING).privateAddresses(ImmutableSet.of("10.1.1.18"))
.hardware(ServiceOfferingToHardwareTest.one).imageId(TemplateToImageTest.one.getId())
.credentials(new Credentials("root", "password"))
.operatingSystem(TemplateToImageTest.one.getOperatingSystem()).build().toString());
assertEquals(node.getCredentials(), new Credentials("root", "password"));
}
} }

View File

@ -53,7 +53,8 @@
<test.deltacloud.identity>mockuser</test.deltacloud.identity> <test.deltacloud.identity>mockuser</test.deltacloud.identity>
<test.deltacloud.credential>mockpassword</test.deltacloud.credential> <test.deltacloud.credential>mockpassword</test.deltacloud.credential>
<test.deltacloud.image-id></test.deltacloud.image-id> <test.deltacloud.image-id></test.deltacloud.image-id>
<test.deltacloud.login-user></test.deltacloud.login-user> <test.deltacloud.image.login-user></test.deltacloud.image.login-user>
<test.deltacloud.image.authenticate-sudo></test.deltacloud.image.authenticate-sudo>
</properties> </properties>
<dependencies> <dependencies>
<dependency> <dependency>
@ -110,7 +111,8 @@
<test.deltacloud.identity>${test.deltacloud.identity}</test.deltacloud.identity> <test.deltacloud.identity>${test.deltacloud.identity}</test.deltacloud.identity>
<test.deltacloud.credential>${test.deltacloud.credential}</test.deltacloud.credential> <test.deltacloud.credential>${test.deltacloud.credential}</test.deltacloud.credential>
<test.deltacloud.image-id>${test.deltacloud.image-id}</test.deltacloud.image-id> <test.deltacloud.image-id>${test.deltacloud.image-id}</test.deltacloud.image-id>
<test.deltacloud.login-user>${test.deltacloud.login-user}</test.deltacloud.login-user> <test.deltacloud.image.login-user>${test.deltacloud.image.login-user}</test.deltacloud.image.login-user>
<test.deltacloud.image.authenticate-sudo>${test.deltacloud.image.authenticate-sudo}</test.deltacloud.image.authenticate-sudo>
</systemPropertyVariables> </systemPropertyVariables>
</configuration> </configuration>
</execution> </execution>

View File

@ -39,7 +39,6 @@ import org.jclouds.compute.domain.NodeState;
import org.jclouds.compute.domain.OperatingSystem; import org.jclouds.compute.domain.OperatingSystem;
import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.compute.reference.ComputeServiceConstants;
import org.jclouds.deltacloud.domain.Instance; import org.jclouds.deltacloud.domain.Instance;
import org.jclouds.domain.Credentials;
import org.jclouds.domain.Location; import org.jclouds.domain.Location;
import org.jclouds.logging.Logger; import org.jclouds.logging.Logger;
@ -56,16 +55,15 @@ import com.google.common.collect.Iterables;
public class InstanceToNodeMetadata implements Function<Instance, NodeMetadata> { public class InstanceToNodeMetadata implements Function<Instance, NodeMetadata> {
public static final Map<Instance.State, NodeState> instanceToNodeState = ImmutableMap public static final Map<Instance.State, NodeState> instanceToNodeState = ImmutableMap
.<Instance.State, NodeState> builder().put(Instance.State.STOPPED, NodeState.SUSPENDED).put( .<Instance.State, NodeState> builder().put(Instance.State.STOPPED, NodeState.SUSPENDED)
Instance.State.RUNNING, NodeState.RUNNING).put(Instance.State.PENDING, NodeState.PENDING).put( .put(Instance.State.RUNNING, NodeState.RUNNING).put(Instance.State.PENDING, NodeState.PENDING)
Instance.State.UNRECOGNIZED, NodeState.UNRECOGNIZED).put(Instance.State.SHUTTING_DOWN, .put(Instance.State.UNRECOGNIZED, NodeState.UNRECOGNIZED).put(Instance.State.SHUTTING_DOWN, NodeState.PENDING)
NodeState.PENDING).put(Instance.State.START, NodeState.PENDING).build(); .put(Instance.State.START, NodeState.PENDING).build();
@Resource @Resource
@Named(ComputeServiceConstants.COMPUTE_LOGGER) @Named(ComputeServiceConstants.COMPUTE_LOGGER)
protected Logger logger = Logger.NULL; protected Logger logger = Logger.NULL;
protected final Map<String, Credentials> credentialStore;
protected final Supplier<Set<? extends Location>> locations; protected final Supplier<Set<? extends Location>> locations;
protected final Supplier<Set<? extends Image>> images; protected final Supplier<Set<? extends Image>> images;
protected final Supplier<Set<? extends Hardware>> hardwares; protected final Supplier<Set<? extends Hardware>> hardwares;
@ -137,10 +135,8 @@ public class InstanceToNodeMetadata implements Function<Instance, NodeMetadata>
} }
@Inject @Inject
InstanceToNodeMetadata(Map<String, Credentials> credentialStore, InstanceToNodeMetadata(@Memoized Supplier<Set<? extends Location>> locations,
@Memoized Supplier<Set<? extends Location>> locations, @Memoized Supplier<Set<? extends Image>> images, @Memoized Supplier<Set<? extends Image>> images, @Memoized Supplier<Set<? extends Hardware>> hardwares) {
@Memoized Supplier<Set<? extends Hardware>> hardwares) {
this.credentialStore = checkNotNull(credentialStore, "credentialStore");
this.images = checkNotNull(images, "images"); this.images = checkNotNull(images, "images");
this.locations = checkNotNull(locations, "locations"); this.locations = checkNotNull(locations, "locations");
this.hardwares = checkNotNull(hardwares, "hardwares"); this.hardwares = checkNotNull(hardwares, "hardwares");
@ -159,7 +155,6 @@ public class InstanceToNodeMetadata implements Function<Instance, NodeMetadata>
builder.state(instanceToNodeState.get(from.getState())); builder.state(instanceToNodeState.get(from.getState()));
builder.publicAddresses(from.getPublicAddresses()); builder.publicAddresses(from.getPublicAddresses());
builder.privateAddresses(from.getPrivateAddresses()); builder.privateAddresses(from.getPrivateAddresses());
builder.credentials(credentialStore.get(from.getHref().toASCIIString()));
return builder.build(); return builder.build();
} }
} }

View File

@ -43,7 +43,7 @@ import org.jclouds.deltacloud.domain.TransitionOnAction;
import org.jclouds.deltacloud.options.CreateInstanceOptions; import org.jclouds.deltacloud.options.CreateInstanceOptions;
import org.jclouds.deltacloud.predicates.InstanceFinished; import org.jclouds.deltacloud.predicates.InstanceFinished;
import org.jclouds.deltacloud.predicates.InstanceRunning; import org.jclouds.deltacloud.predicates.InstanceRunning;
import org.jclouds.domain.Credentials; import org.jclouds.domain.LoginCredentials;
import org.jclouds.http.HttpRequest; import org.jclouds.http.HttpRequest;
import org.jclouds.logging.Logger; import org.jclouds.logging.Logger;
import org.jclouds.predicates.RetryablePredicate; import org.jclouds.predicates.RetryablePredicate;
@ -86,7 +86,7 @@ public class DeltacloudComputeServiceAdapter implements
Template template) { Template template) {
Instance instance = client.createInstance(template.getImage().getProviderId(), CreateInstanceOptions.Builder Instance instance = client.createInstance(template.getImage().getProviderId(), CreateInstanceOptions.Builder
.named(name).hardwareProfile(template.getHardware().getId()).realm(template.getLocation().getId())); .named(name).hardwareProfile(template.getHardware().getId()).realm(template.getLocation().getId()));
Credentials creds = null; LoginCredentials creds = null;
if (instance.getAuthentication() != null && instance.getAuthentication() instanceof PasswordAuthentication) { if (instance.getAuthentication() != null && instance.getAuthentication() instanceof PasswordAuthentication) {
creds = PasswordAuthentication.class.cast(instance.getAuthentication()).getLoginCredentials(); creds = PasswordAuthentication.class.cast(instance.getAuthentication()).getLoginCredentials();
} }

View File

@ -22,7 +22,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.io.Serializable; import java.io.Serializable;
import org.jclouds.domain.Credentials; import org.jclouds.domain.LoginCredentials;
/** /**
* *
@ -32,13 +32,13 @@ public class PasswordAuthentication implements Instance.Authentication, Serializ
/** The serialVersionUID */ /** The serialVersionUID */
private static final long serialVersionUID = 7669076186483470376L; private static final long serialVersionUID = 7669076186483470376L;
private final Credentials login; private final LoginCredentials login;
public PasswordAuthentication(Credentials login) { public PasswordAuthentication(LoginCredentials login) {
this.login = checkNotNull(login, "login"); this.login = checkNotNull(login, "login");
} }
public Credentials getLoginCredentials() { public LoginCredentials getLoginCredentials() {
return login; return login;
} }

View File

@ -27,10 +27,11 @@ import java.util.Set;
import javax.annotation.Resource; import javax.annotation.Resource;
import org.jclouds.deltacloud.domain.Instance; import org.jclouds.deltacloud.domain.Instance;
import org.jclouds.deltacloud.domain.Instance.Authentication;
import org.jclouds.deltacloud.domain.KeyAuthentication; import org.jclouds.deltacloud.domain.KeyAuthentication;
import org.jclouds.deltacloud.domain.PasswordAuthentication; import org.jclouds.deltacloud.domain.PasswordAuthentication;
import org.jclouds.deltacloud.domain.Instance.Authentication; import org.jclouds.domain.LoginCredentials;
import org.jclouds.domain.Credentials; import org.jclouds.domain.LoginCredentials.Builder;
import org.jclouds.http.HttpRequest; import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseSax; import org.jclouds.http.functions.ParseSax;
import org.jclouds.logging.Logger; import org.jclouds.logging.Logger;
@ -67,7 +68,7 @@ public class InstanceHandler extends ParseSax.HandlerWithResult<Instance> {
private Instance instance; private Instance instance;
private Credentials.Builder<Credentials> credentialsBuilder = new Credentials.Builder<Credentials>(); private Builder credentialsBuilder = LoginCredentials.builder();
private String keyName; private String keyName;
private Authentication authentication; private Authentication authentication;
@ -125,19 +126,19 @@ public class InstanceHandler extends ParseSax.HandlerWithResult<Instance> {
} else if (qName.equalsIgnoreCase("keyname")) { } else if (qName.equalsIgnoreCase("keyname")) {
this.keyName = currentOrNull(currentText); this.keyName = currentOrNull(currentText);
} else if (qName.equalsIgnoreCase("username")) { } else if (qName.equalsIgnoreCase("username")) {
this.credentialsBuilder.identity(currentOrNull(currentText)); this.credentialsBuilder.user(currentOrNull(currentText));
} else if (qName.equalsIgnoreCase("password")) { } else if (qName.equalsIgnoreCase("password")) {
this.credentialsBuilder.credential(currentOrNull(currentText)); this.credentialsBuilder.password(currentOrNull(currentText));
} else if (qName.equalsIgnoreCase("authentication")) { } else if (qName.equalsIgnoreCase("authentication")) {
if (keyName != null) { if (keyName != null) {
this.authentication = new KeyAuthentication(keyName); this.authentication = new KeyAuthentication(keyName);
} else { } else {
Credentials creds = credentialsBuilder.build(); LoginCredentials creds = credentialsBuilder.build();
if (creds.identity != null) if (creds != null && creds.identity != null)
this.authentication = new PasswordAuthentication(creds); this.authentication = new PasswordAuthentication(creds);
} }
this.keyName = null; this.keyName = null;
this.credentialsBuilder = new Credentials.Builder<Credentials>(); this.credentialsBuilder = LoginCredentials.builder();
} else if (qName.equalsIgnoreCase("state")) { } else if (qName.equalsIgnoreCase("state")) {
this.state = Instance.State.fromValue(currentOrNull(currentText)); this.state = Instance.State.fromValue(currentOrNull(currentText));
} else if (qName.equalsIgnoreCase("address")) { } else if (qName.equalsIgnoreCase("address")) {

View File

@ -24,10 +24,10 @@ import java.io.InputStream;
import java.net.URI; import java.net.URI;
import org.jclouds.deltacloud.domain.Instance; import org.jclouds.deltacloud.domain.Instance;
import org.jclouds.deltacloud.domain.Instance.Authentication;
import org.jclouds.deltacloud.domain.KeyAuthentication; import org.jclouds.deltacloud.domain.KeyAuthentication;
import org.jclouds.deltacloud.domain.PasswordAuthentication; import org.jclouds.deltacloud.domain.PasswordAuthentication;
import org.jclouds.deltacloud.domain.Instance.Authentication; import org.jclouds.domain.LoginCredentials;
import org.jclouds.domain.Credentials;
import org.jclouds.http.HttpRequest; import org.jclouds.http.HttpRequest;
import org.jclouds.http.functions.ParseSax; import org.jclouds.http.functions.ParseSax;
import org.jclouds.http.functions.config.SaxParserModule; import org.jclouds.http.functions.config.SaxParserModule;
@ -49,7 +49,7 @@ public class InstanceHandlerTest {
static ParseSax<Instance> createParser() { static ParseSax<Instance> createParser() {
Injector injector = Guice.createInjector(new SaxParserModule()); Injector injector = Guice.createInjector(new SaxParserModule());
ParseSax<Instance> parser = injector.getInstance(ParseSax.Factory.class).create( ParseSax<Instance> parser = injector.getInstance(ParseSax.Factory.class).create(
injector.getInstance(InstanceHandler.class)); injector.getInstance(InstanceHandler.class));
return parser; return parser;
} }
@ -68,7 +68,8 @@ public class InstanceHandlerTest {
} }
public void testWithPasswordAuthentication() { public void testWithPasswordAuthentication() {
Instance expects = instanceWithAuthentication(new PasswordAuthentication(new Credentials("root", "FOO"))); Instance expects = instanceWithAuthentication(new PasswordAuthentication(LoginCredentials.builder().user("root")
.password("FOO").build()));
assertEquals(parseInstance("/test_get_instance_pw.xml").toString(), expects.toString()); assertEquals(parseInstance("/test_get_instance_pw.xml").toString(), expects.toString());
} }
@ -84,15 +85,15 @@ public class InstanceHandlerTest {
private Instance instanceWithAuthentication(Authentication authentication) { private Instance instanceWithAuthentication(Authentication authentication) {
return new Instance(URI.create("http://fancycloudprovider.com/api/instances/inst1"), "inst1", "larry", return new Instance(URI.create("http://fancycloudprovider.com/api/instances/inst1"), "inst1", "larry",
"Production JBoss Instance", URI.create("http://fancycloudprovider.com/api/images/img3"), URI "Production JBoss Instance", URI.create("http://fancycloudprovider.com/api/images/img3"),
.create("http://fancycloudprovider.com/api/hardware_profiles/m1-small"), URI URI.create("http://fancycloudprovider.com/api/hardware_profiles/m1-small"),
.create("http://fancycloudprovider.com/api/realms/us"), Instance.State.RUNNING, ImmutableMap URI.create("http://fancycloudprovider.com/api/realms/us"), Instance.State.RUNNING, ImmutableMap.of(
.of(Instance.Action.REBOOT, new HttpRequest("POST", URI Instance.Action.REBOOT,
.create("http://fancycloudprovider.com/api/instances/inst1/reboot")), new HttpRequest("POST", URI.create("http://fancycloudprovider.com/api/instances/inst1/reboot")),
Instance.Action.STOP, new HttpRequest("POST", URI Instance.Action.STOP,
.create("http://fancycloudprovider.com/api/instances/inst1/stop"))), new HttpRequest("POST", URI.create("http://fancycloudprovider.com/api/instances/inst1/stop"))),
authentication, ImmutableSet.of("inst1.larry.fancycloudprovider.com"), ImmutableSet authentication, ImmutableSet.of("inst1.larry.fancycloudprovider.com"),
.of("inst1.larry.internal")); ImmutableSet.of("inst1.larry.internal"));
} }
} }

View File

@ -39,7 +39,8 @@
<test.ec2.identity>${test.aws.identity}</test.ec2.identity> <test.ec2.identity>${test.aws.identity}</test.ec2.identity>
<test.ec2.credential>${test.aws.credential}</test.ec2.credential> <test.ec2.credential>${test.aws.credential}</test.ec2.credential>
<test.ec2.image-id></test.ec2.image-id> <test.ec2.image-id></test.ec2.image-id>
<test.ec2.login-user></test.ec2.login-user> <test.ec2.image.login-user></test.ec2.image.login-user>
<test.ec2.image.authenticate-sudo></test.ec2.image.authenticate-sudo>
</properties> </properties>
<dependencies> <dependencies>
@ -105,7 +106,8 @@
<test.ec2.identity>${test.ec2.identity}</test.ec2.identity> <test.ec2.identity>${test.ec2.identity}</test.ec2.identity>
<test.ec2.credential>${test.ec2.credential}</test.ec2.credential> <test.ec2.credential>${test.ec2.credential}</test.ec2.credential>
<test.ec2.image-id>${test.ec2.image-id}</test.ec2.image-id> <test.ec2.image-id>${test.ec2.image-id}</test.ec2.image-id>
<test.ec2.login-user>${test.ec2.login-user}</test.ec2.login-user> <test.ec2.image.login-user>${test.ec2.image.login-user}</test.ec2.image.login-user>
<test.ec2.image.authenticate-sudo>${test.ec2.image.authenticate-sudo}</test.ec2.image.authenticate-sudo>
</systemPropertyVariables> </systemPropertyVariables>
</configuration> </configuration>
</execution> </execution>

View File

@ -102,7 +102,7 @@ public class EC2ImageParser implements Function<org.jclouds.ec2.domain.Image, Im
reviseParsedImage.reviseParsedImage(from, builder, family, osBuilder); reviseParsedImage.reviseParsedImage(from, builder, family, osBuilder);
builder.defaultCredentials(credentialProvider.execute(from)); builder.defaultCredentials(credentialProvider.apply(from));
try { try {
builder.location(Iterables.find(locations.get(), new Predicate<Location>() { builder.location(Iterables.find(locations.get(), new Predicate<Location>() {

View File

@ -41,6 +41,7 @@ import org.jclouds.compute.domain.Volume;
import org.jclouds.compute.domain.internal.VolumeImpl; import org.jclouds.compute.domain.internal.VolumeImpl;
import org.jclouds.domain.Credentials; import org.jclouds.domain.Credentials;
import org.jclouds.domain.Location; import org.jclouds.domain.Location;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.ec2.compute.domain.RegionAndName; import org.jclouds.ec2.compute.domain.RegionAndName;
import org.jclouds.ec2.domain.BlockDevice; import org.jclouds.ec2.domain.BlockDevice;
import org.jclouds.ec2.domain.InstanceState; import org.jclouds.ec2.domain.InstanceState;
@ -125,7 +126,7 @@ public class RunningInstanceToNodeMetadata implements Function<RunningInstance,
} }
protected void addCredentialsForInstance(NodeMetadataBuilder builder, RunningInstance instance) { protected void addCredentialsForInstance(NodeMetadataBuilder builder, RunningInstance instance) {
builder.credentials(credentialStore.get("node#" + instance.getRegion() + "/" + instance.getId())); builder.credentials(LoginCredentials.builder(credentialStore.get("node#" + instance.getRegion() + "/" + instance.getId())).build());
} }
protected Hardware parseHardware(final RunningInstance instance) { protected Hardware parseHardware(final RunningInstance instance) {

View File

@ -28,6 +28,7 @@ import java.util.Set;
import org.jclouds.compute.options.TemplateOptions; import org.jclouds.compute.options.TemplateOptions;
import org.jclouds.domain.Credentials; import org.jclouds.domain.Credentials;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.ec2.domain.BlockDeviceMapping; import org.jclouds.ec2.domain.BlockDeviceMapping;
import org.jclouds.ec2.domain.BlockDeviceMapping.MapEBSSnapshotToDevice; import org.jclouds.ec2.domain.BlockDeviceMapping.MapEBSSnapshotToDevice;
import org.jclouds.ec2.domain.BlockDeviceMapping.MapEphemeralDeviceToDevice; import org.jclouds.ec2.domain.BlockDeviceMapping.MapEphemeralDeviceToDevice;
@ -299,13 +300,49 @@ public class EC2TemplateOptions extends TemplateOptions implements Cloneable {
return EC2TemplateOptions.class.cast(options.userMetadata(userMetadata)); return EC2TemplateOptions.class.cast(options.userMetadata(userMetadata));
} }
/** @Deprecated
* @see TemplateOptions#userMetadata(String, String) public static EC2TemplateOptions overrideLoginUserWith(String user) {
*/
public static EC2TemplateOptions userMetadata(String key, String value) {
EC2TemplateOptions options = new EC2TemplateOptions(); EC2TemplateOptions options = new EC2TemplateOptions();
return EC2TemplateOptions.class.cast(options.userMetadata(key, value)); return options.overrideLoginUserWith(user);
} }
public static EC2TemplateOptions overrideLoginUser(String user) {
EC2TemplateOptions options = new EC2TemplateOptions();
return options.overrideLoginUser(user);
}
public static EC2TemplateOptions overrideLoginPassword(String password) {
EC2TemplateOptions options = new EC2TemplateOptions();
return options.overrideLoginPassword(password);
}
public static EC2TemplateOptions overrideLoginPrivateKey(String privateKey) {
EC2TemplateOptions options = new EC2TemplateOptions();
return options.overrideLoginPrivateKey(privateKey);
}
public static EC2TemplateOptions overrideAuthenticateSudo(boolean authenticateSudo) {
EC2TemplateOptions options = new EC2TemplateOptions();
return options.overrideAuthenticateSudo(authenticateSudo);
}
@Deprecated
public static EC2TemplateOptions overrideLoginCredentialWith(String credential) {
EC2TemplateOptions options = new EC2TemplateOptions();
return options.overrideLoginCredentialWith(credential);
}
@Deprecated
public static EC2TemplateOptions overrideCredentialsWith(Credentials credentials) {
EC2TemplateOptions options = new EC2TemplateOptions();
return options.overrideCredentialsWith(credentials);
}
public static EC2TemplateOptions overrideLoginCredentials(LoginCredentials credentials) {
EC2TemplateOptions options = new EC2TemplateOptions();
return options.overrideLoginCredentials(credentials);
}
} }
// methods that only facilitate returning the correct object type // methods that only facilitate returning the correct object type
@ -420,11 +457,70 @@ public class EC2TemplateOptions extends TemplateOptions implements Cloneable {
/** /**
* {@inheritDoc} * {@inheritDoc}
*/ */
@Deprecated
@Override @Override
public EC2TemplateOptions overrideCredentialsWith(Credentials overridingCredentials) { public EC2TemplateOptions overrideCredentialsWith(Credentials overridingCredentials) {
return EC2TemplateOptions.class.cast(super.overrideCredentialsWith(overridingCredentials)); return EC2TemplateOptions.class.cast(super.overrideCredentialsWith(overridingCredentials));
} }
/**
* {@inheritDoc}
*/
@Deprecated
@Override
public EC2TemplateOptions overrideLoginUserWith(String loginUser) {
return EC2TemplateOptions.class.cast(super.overrideLoginUserWith(loginUser));
}
/**
* {@inheritDoc}
*/
@Deprecated
@Override
public EC2TemplateOptions overrideLoginCredentialWith(String loginCredential) {
return EC2TemplateOptions.class.cast(super.overrideLoginCredentialWith(loginCredential));
}
/**
* {@inheritDoc}
*/
@Override
public EC2TemplateOptions overrideLoginCredentials(LoginCredentials overridingCredentials) {
return EC2TemplateOptions.class.cast(super.overrideLoginCredentials(overridingCredentials));
}
/**
* {@inheritDoc}
*/
@Override
public EC2TemplateOptions overrideLoginPassword(String password) {
return EC2TemplateOptions.class.cast(super.overrideLoginPassword(password));
}
/**
* {@inheritDoc}
*/
@Override
public EC2TemplateOptions overrideLoginPrivateKey(String privateKey) {
return EC2TemplateOptions.class.cast(super.overrideLoginPrivateKey(privateKey));
}
/**
* {@inheritDoc}
*/
@Override
public EC2TemplateOptions overrideLoginUser(String loginUser) {
return EC2TemplateOptions.class.cast(super.overrideLoginUser(loginUser));
}
/**
* {@inheritDoc}
*/
@Override
public EC2TemplateOptions overrideAuthenticateSudo(boolean authenticateSudo) {
return EC2TemplateOptions.class.cast(super.overrideAuthenticateSudo(authenticateSudo));
}
/** /**
* {@inheritDoc} * {@inheritDoc}
*/ */

View File

@ -122,8 +122,8 @@ public class CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions {
if (keyPairName == null && shouldAutomaticallyCreateKeyPair) { if (keyPairName == null && shouldAutomaticallyCreateKeyPair) {
keyPairName = createOrImportKeyPair(region, group, options); keyPairName = createOrImportKeyPair(region, group, options);
} else if (keyPairName != null) { } else if (keyPairName != null) {
if (options.getOverridingCredentials() != null && options.getOverridingCredentials().credential != null) { if (options.getLoginPrivateKey() != null) {
String pem = options.getOverridingCredentials().credential; String pem = options.getLoginPrivateKey();
KeyPair keyPair = KeyPair.builder().region(region).keyName(keyPairName).fingerprint( KeyPair keyPair = KeyPair.builder().region(region).keyName(keyPairName).fingerprint(
fingerprintPrivateKey(pem)).sha1OfPrivateKey(sha1PrivateKey(pem)).keyMaterial(pem).build(); fingerprintPrivateKey(pem)).sha1OfPrivateKey(sha1PrivateKey(pem)).keyMaterial(pem).build();
RegionAndName key = new RegionAndName(region, keyPairName); RegionAndName key = new RegionAndName(region, keyPairName);

View File

@ -25,7 +25,8 @@ import javax.inject.Named;
import javax.inject.Singleton; import javax.inject.Singleton;
import org.jclouds.compute.strategy.impl.ReturnCredentialsBoundToImage; import org.jclouds.compute.strategy.impl.ReturnCredentialsBoundToImage;
import org.jclouds.domain.Credentials; import org.jclouds.domain.LoginCredentials;
import org.jclouds.domain.LoginCredentials.Builder;
import org.jclouds.ec2.domain.Image; import org.jclouds.ec2.domain.Image;
import org.jclouds.javax.annotation.Nullable; import org.jclouds.javax.annotation.Nullable;
@ -39,15 +40,15 @@ public class EC2PopulateDefaultLoginCredentialsForImageStrategy extends ReturnCr
} }
@Inject @Inject
public EC2PopulateDefaultLoginCredentialsForImageStrategy(@Nullable @Named("image") Credentials creds) { public EC2PopulateDefaultLoginCredentialsForImageStrategy(@Nullable @Named("image") LoginCredentials creds) {
super(creds); super(creds);
} }
@Override @Override
public Credentials execute(Object resourceToAuthenticate) { public LoginCredentials apply(Object resourceToAuthenticate) {
if (creds != null) if (creds != null)
return creds; return creds;
Credentials credentials = new Credentials("root", null); Builder credentials = LoginCredentials.builder().user("root");
if (resourceToAuthenticate != null) { if (resourceToAuthenticate != null) {
String owner = null; String owner = null;
if (resourceToAuthenticate instanceof Image) { if (resourceToAuthenticate instanceof Image) {
@ -58,12 +59,12 @@ public class EC2PopulateDefaultLoginCredentialsForImageStrategy extends ReturnCr
checkArgument(owner != null, "Resource must be an image (for EC2)"); checkArgument(owner != null, "Resource must be an image (for EC2)");
// canonical/alestic images use the ubuntu user to login // canonical/alestic images use the ubuntu user to login
if (owner.matches("063491364108|099720109477")) { if (owner.matches("063491364108|099720109477")) {
credentials = new Credentials("ubuntu", null); credentials.user("ubuntu");
// http://typepad.com/2010/09/introducing-amazon-linux-ami.html // http://typepad.com/2010/09/introducing-amazon-linux-ami.html
} else if (owner.equals("137112412989")) { } else if (owner.equals("137112412989")) {
credentials = new Credentials("ec2-user", null); credentials.user("ec2-user");
} }
} }
return credentials; return credentials.build();
} }
} }

View File

@ -165,7 +165,7 @@ public class CloudApplicationArchitecturesEC2ClientLiveTest {
keyPair = client.getKeyPairServices().createKeyPairInRegion(null, keyName); keyPair = client.getKeyPairServices().createKeyPairInRegion(null, keyName);
assertNotNull(keyPair); assertNotNull(keyPair);
assertNotNull(keyPair.getKeyMaterial()); assertNotNull(keyPair.getKeyMaterial());
assertNotNull(keyPair.getKeyFingerprint()); assertNotNull(keyPair.getSha1OfPrivateKey());
assertEquals(keyPair.getKeyName(), keyName); assertEquals(keyPair.getKeyName(), keyName);
} }

View File

@ -212,7 +212,7 @@ public class EBSBootEC2ClientLiveTest {
keyPair = client.getKeyPairServices().createKeyPairInRegion(null, keyName); keyPair = client.getKeyPairServices().createKeyPairInRegion(null, keyName);
assertNotNull(keyPair); assertNotNull(keyPair);
assertNotNull(keyPair.getKeyMaterial()); assertNotNull(keyPair.getKeyMaterial());
assertNotNull(keyPair.getKeyFingerprint()); assertNotNull(keyPair.getSha1OfPrivateKey());
assertEquals(keyPair.getKeyName(), keyName); assertEquals(keyPair.getKeyName(), keyName);
} }

View File

@ -30,9 +30,9 @@ import org.jclouds.compute.domain.OsFamily;
import org.jclouds.compute.domain.Template; import org.jclouds.compute.domain.Template;
import org.jclouds.compute.options.TemplateOptions; import org.jclouds.compute.options.TemplateOptions;
import org.jclouds.compute.predicates.NodePredicates; import org.jclouds.compute.predicates.NodePredicates;
import org.jclouds.domain.Credentials;
import org.jclouds.domain.Location; import org.jclouds.domain.Location;
import org.jclouds.domain.LocationScope; import org.jclouds.domain.LocationScope;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.ec2.EC2Client; import org.jclouds.ec2.EC2Client;
import org.jclouds.ec2.compute.options.EC2TemplateOptions; import org.jclouds.ec2.compute.options.EC2TemplateOptions;
import org.jclouds.ec2.domain.BlockDevice; import org.jclouds.ec2.domain.BlockDevice;
@ -123,7 +123,7 @@ public class EC2ComputeServiceLiveTest extends BaseComputeServiceLiveTest {
// pass in the private key, so that we can run a script with it // pass in the private key, so that we can run a script with it
assert result.getKeyMaterial() != null : result; assert result.getKeyMaterial() != null : result;
options.overrideLoginCredentialWith(result.getKeyMaterial()); options.overrideLoginPrivateKey(result.getKeyMaterial());
// an arbitrary command to run // an arbitrary command to run
options.runScript(Statements.exec("find /usr")); options.runScript(Statements.exec("find /usr"));
@ -149,8 +149,9 @@ public class EC2ComputeServiceLiveTest extends BaseComputeServiceLiveTest {
assert secgroup.getIpPermissions().size() == 0 : secgroup; assert secgroup.getIpPermissions().size() == 0 : secgroup;
// try to run a script with the original keyPair // try to run a script with the original keyPair
runScriptWithCreds(group, first.getOperatingSystem(), new Credentials(first.getCredentials().identity, result runScriptWithCreds(group, first.getOperatingSystem(),
.getKeyMaterial())); LoginCredentials.builder().user(first.getCredentials().identity).privateKey(result.getKeyMaterial())
.build());
} finally { } finally {
client.destroyNodesMatching(NodePredicates.inGroup(group)); client.destroyNodesMatching(NodePredicates.inGroup(group));

View File

@ -48,10 +48,10 @@ import org.jclouds.compute.domain.Template;
import org.jclouds.compute.domain.TemplateBuilder; import org.jclouds.compute.domain.TemplateBuilder;
import org.jclouds.compute.domain.internal.TemplateBuilderImpl; import org.jclouds.compute.domain.internal.TemplateBuilderImpl;
import org.jclouds.compute.options.TemplateOptions; import org.jclouds.compute.options.TemplateOptions;
import org.jclouds.domain.Credentials;
import org.jclouds.domain.Location; import org.jclouds.domain.Location;
import org.jclouds.domain.LocationBuilder; import org.jclouds.domain.LocationBuilder;
import org.jclouds.domain.LocationScope; import org.jclouds.domain.LocationScope;
import org.jclouds.domain.LoginCredentials;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import com.google.common.base.Function; import com.google.common.base.Function;
@ -153,11 +153,11 @@ public class EC2TemplateBuilderTest {
Supplier<Set<? extends Image>> images = Suppliers.<Set<? extends Image>> ofInstance(ImmutableSet.<Image> of( Supplier<Set<? extends Image>> images = Suppliers.<Set<? extends Image>> ofInstance(ImmutableSet.<Image> of(
new ImageBuilder().providerId("cc-image").name("image").id("us-east-1/cc-image").location(location) new ImageBuilder().providerId("cc-image").name("image").id("us-east-1/cc-image").location(location)
.operatingSystem(new OperatingSystem(OsFamily.UBUNTU, null, "1.0", "hvm", "ubuntu", true)) .operatingSystem(new OperatingSystem(OsFamily.UBUNTU, null, "1.0", "hvm", "ubuntu", true))
.description("description").version("1.0").defaultCredentials(new Credentials("root", null)) .description("description").version("1.0").defaultCredentials(new LoginCredentials("root", null, null, false))
.build(), new ImageBuilder().providerId("normal-image").name("image").id("us-east-1/cc-image") .build(), new ImageBuilder().providerId("normal-image").name("image").id("us-east-1/cc-image")
.location(location).operatingSystem( .location(location).operatingSystem(
new OperatingSystem(OsFamily.UBUNTU, null, "1.0", "paravirtual", "ubuntu", true)) new OperatingSystem(OsFamily.UBUNTU, null, "1.0", "paravirtual", "ubuntu", true))
.description("description").version("1.0").defaultCredentials(new Credentials("root", null)) .description("description").version("1.0").defaultCredentials(new LoginCredentials("root", null, null, false))
.build())); .build()));
Supplier<Set<? extends Hardware>> sizes = Suppliers.<Set<? extends Hardware>> ofInstance(ImmutableSet Supplier<Set<? extends Hardware>> sizes = Suppliers.<Set<? extends Hardware>> ofInstance(ImmutableSet
.<Hardware> of(t1_micro().build(), c1_medium().build(), c1_xlarge().build(), m1_large().build(), .<Hardware> of(t1_micro().build(), c1_medium().build(), c1_xlarge().build(), m1_large().build(),

View File

@ -28,10 +28,10 @@ import org.jclouds.compute.domain.ImageBuilder;
import org.jclouds.compute.domain.OperatingSystem; import org.jclouds.compute.domain.OperatingSystem;
import org.jclouds.compute.domain.OsFamily; import org.jclouds.compute.domain.OsFamily;
import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.compute.reference.ComputeServiceConstants;
import org.jclouds.domain.Credentials;
import org.jclouds.domain.Location; import org.jclouds.domain.Location;
import org.jclouds.domain.LocationBuilder; import org.jclouds.domain.LocationBuilder;
import org.jclouds.domain.LocationScope; import org.jclouds.domain.LocationScope;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.ec2.compute.strategy.EC2PopulateDefaultLoginCredentialsForImageStrategy; import org.jclouds.ec2.compute.strategy.EC2PopulateDefaultLoginCredentialsForImageStrategy;
import org.jclouds.ec2.compute.strategy.ReviseParsedImage; import org.jclouds.ec2.compute.strategy.ReviseParsedImage;
import org.jclouds.ec2.domain.Image; import org.jclouds.ec2.domain.Image;
@ -61,14 +61,14 @@ public class EC2ImageParserTest {
assertEquals(Iterables.get(result, 0), new ImageBuilder().operatingSystem( assertEquals(Iterables.get(result, 0), new ImageBuilder().operatingSystem(
new OperatingSystem.Builder().family(OsFamily.UNRECOGNIZED).arch("paravirtual").version("").description( new OperatingSystem.Builder().family(OsFamily.UNRECOGNIZED).arch("paravirtual").version("").description(
"137112412989/amzn-ami-0.9.7-beta.i386-ebs").is64Bit(false).build()).description("Amazon") "137112412989/amzn-ami-0.9.7-beta.i386-ebs").is64Bit(false).build()).description("Amazon")
.defaultCredentials(new Credentials("ec2-user", null)).id("us-east-1/ami-82e4b5c7").providerId( .defaultCredentials(new LoginCredentials("ec2-user", null, null, false)).id("us-east-1/ami-82e4b5c7").providerId(
"ami-82e4b5c7").location(defaultLocation).userMetadata( "ami-82e4b5c7").location(defaultLocation).userMetadata(
ImmutableMap.of("owner", "137112412989", "rootDeviceType", "ebs")).build()); ImmutableMap.of("owner", "137112412989", "rootDeviceType", "ebs")).build());
assertEquals(Iterables.get(result, 3), new ImageBuilder().operatingSystem( assertEquals(Iterables.get(result, 3), new ImageBuilder().operatingSystem(
new OperatingSystem.Builder().family(OsFamily.UNRECOGNIZED).arch("paravirtual").version("").description( new OperatingSystem.Builder().family(OsFamily.UNRECOGNIZED).arch("paravirtual").version("").description(
"amzn-ami-us-west-1/amzn-ami-0.9.7-beta.x86_64.manifest.xml").is64Bit(true).build()) "amzn-ami-us-west-1/amzn-ami-0.9.7-beta.x86_64.manifest.xml").is64Bit(true).build())
.description("Amazon Linux AMI x86_64 S3").defaultCredentials(new Credentials("ec2-user", null)).id( .description("Amazon Linux AMI x86_64 S3").defaultCredentials(new LoginCredentials("ec2-user", null, null, false)).id(
"us-east-1/ami-f2e4b5b7").providerId("ami-f2e4b5b7").location(defaultLocation).userMetadata( "us-east-1/ami-f2e4b5b7").providerId("ami-f2e4b5b7").location(defaultLocation).userMetadata(
ImmutableMap.of("owner", "137112412989", "rootDeviceType", "ebs")).build()); ImmutableMap.of("owner", "137112412989", "rootDeviceType", "ebs")).build());
} }

View File

@ -36,6 +36,7 @@ import org.jclouds.domain.Credentials;
import org.jclouds.domain.Location; import org.jclouds.domain.Location;
import org.jclouds.domain.LocationBuilder; import org.jclouds.domain.LocationBuilder;
import org.jclouds.domain.LocationScope; import org.jclouds.domain.LocationScope;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.ec2.compute.config.EC2ComputeServiceDependenciesModule; import org.jclouds.ec2.compute.config.EC2ComputeServiceDependenciesModule;
import org.jclouds.ec2.compute.domain.RegionAndName; import org.jclouds.ec2.compute.domain.RegionAndName;
import org.jclouds.ec2.domain.InstanceState; import org.jclouds.ec2.domain.InstanceState;
@ -75,7 +76,7 @@ public class RunningInstanceToNodeMetadataTest {
@Test @Test
public void testApplyWhereTagDoesntMatchAndImageHardwareAndLocationNotFoundButCredentialsFound() public void testApplyWhereTagDoesntMatchAndImageHardwareAndLocationNotFoundButCredentialsFound()
throws UnknownHostException { throws UnknownHostException {
Credentials creds = new Credentials("root", "abdce"); LoginCredentials creds = LoginCredentials.builder().user("root").password("abdce").build();
RunningInstanceToNodeMetadata parser = createNodeParser(ImmutableSet.<Hardware> of(), ImmutableSet RunningInstanceToNodeMetadata parser = createNodeParser(ImmutableSet.<Hardware> of(), ImmutableSet
.<Location> of(), ImmutableSet.<Image> of(), ImmutableMap.<String, Credentials> of( .<Location> of(), ImmutableSet.<Image> of(), ImmutableMap.<String, Credentials> of(

View File

@ -35,7 +35,7 @@ import org.jclouds.aws.domain.Region;
import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Hardware;
import org.jclouds.compute.domain.Template; import org.jclouds.compute.domain.Template;
import org.jclouds.compute.options.TemplateOptions; import org.jclouds.compute.options.TemplateOptions;
import org.jclouds.domain.Credentials; import org.jclouds.domain.LoginCredentials;
import org.jclouds.ec2.compute.domain.EC2HardwareBuilder; import org.jclouds.ec2.compute.domain.EC2HardwareBuilder;
import org.jclouds.ec2.compute.domain.RegionAndName; import org.jclouds.ec2.compute.domain.RegionAndName;
import org.jclouds.ec2.compute.domain.RegionNameAndIngressRules; import org.jclouds.ec2.compute.domain.RegionNameAndIngressRules;
@ -58,33 +58,36 @@ import com.google.common.collect.ImmutableSet;
@Test(groups = "unit", singleThreaded = true, testName = "CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptionsTest") @Test(groups = "unit", singleThreaded = true, testName = "CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptionsTest")
public class CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptionsTest { public class CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptionsTest {
public static final Credentials CREDENTIALS = new Credentials(null, "-----BEGIN RSA PRIVATE KEY-----\n" public static final LoginCredentials CREDENTIALS = LoginCredentials
+ "MIIEowIBAAKCAQEA0CbFlhSdbMdad2ux2BVqk6Ut5fLKb0CdbqubGcEBfwsSz9Rp4Ile76P90MpV\n" .builder()
+ "W1BGKL5V4MO+flG6dZnRWPVmgrNVyDTmEsALiMGjfEwbACEZ1A8C6mPa36wWO7MlxuyMjg8OczTB\n" .privateKey(
+ "EXnHNDpxE5a6KowJtzFlmgjHk2Y+Q42UIqPx47lQUv5bdMDCnfNNomSzTVRjOZLUkDja+ybCKdux\n" "-----BEGIN RSA PRIVATE KEY-----\n"
+ "gqTsuInhuBRMx+wxff8Z43ECdJV6UPoXK3der1dlZunxGCFkCeYq0kCX7FZ7PV35X744jqhD8P+7\n" + "MIIEowIBAAKCAQEA0CbFlhSdbMdad2ux2BVqk6Ut5fLKb0CdbqubGcEBfwsSz9Rp4Ile76P90MpV\n"
+ "y5prO4W+M3DWgChUx0OlbDbSHtDVlcfdbj/+4AKYKU6rQOqh+4DPDQIDAQABAoIBAHjQuEiXKJSV\n" + "W1BGKL5V4MO+flG6dZnRWPVmgrNVyDTmEsALiMGjfEwbACEZ1A8C6mPa36wWO7MlxuyMjg8OczTB\n"
+ "1U2RZcVtENInws9AL/2I/Jfa5Qh6vTqXG9EjklywfzkK72x7tDVvD3ngmAoAs5WwLFDL+fXvYhOk\n" + "EXnHNDpxE5a6KowJtzFlmgjHk2Y+Q42UIqPx47lQUv5bdMDCnfNNomSzTVRjOZLUkDja+ybCKdux\n"
+ "sbql8ZCahVdYRWME7XsSu2IZYHDZipXe1XzLS7b9X8uos5Ns4E8bZuNKtI1RJDdD1vPMqRNR2z0T\n" + "gqTsuInhuBRMx+wxff8Z43ECdJV6UPoXK3der1dlZunxGCFkCeYq0kCX7FZ7PV35X744jqhD8P+7\n"
+ "0Dn3eC7t+t+t7PWaK5AXu2ot7DoOeG1QhqJbwd5pMkIn2ydBILytgmDk/2P3EtJGePIJIeQBicmw\n" + "y5prO4W+M3DWgChUx0OlbDbSHtDVlcfdbj/+4AKYKU6rQOqh+4DPDQIDAQABAoIBAHjQuEiXKJSV\n"
+ "Z0KrJFa/K2cC8AtmMJUoZMo+mh1yemDbDLCZW30PjFHbZtcszS2cydAgq/HDFkZynvZG0zhbx/To\n" + "1U2RZcVtENInws9AL/2I/Jfa5Qh6vTqXG9EjklywfzkK72x7tDVvD3ngmAoAs5WwLFDL+fXvYhOk\n"
+ "jzcNza1AyypYwOwb2/9/ulXZp0UCgYEA+QFgWDfYLH2zwjU5b6e0UbIyd/X/yRZ+L8lOEBd0Bbu8\n" + "sbql8ZCahVdYRWME7XsSu2IZYHDZipXe1XzLS7b9X8uos5Ns4E8bZuNKtI1RJDdD1vPMqRNR2z0T\n"
+ "qO3txaDbwi7o2mG7pJENHJ3u62CHjgTGDNW9V9Q8eNoGtj3uHvMvi7FdDEK8B6izdZyR7hmZmQ/5\n" + "0Dn3eC7t+t+t7PWaK5AXu2ot7DoOeG1QhqJbwd5pMkIn2ydBILytgmDk/2P3EtJGePIJIeQBicmw\n"
+ "MIldelyiGZlz1KBSoy4FsCpA7hV7cI6H6x+Im24NxG90/wd/EgMCgYEA1f+cUyUisIO3yKOCf0hQ\n" + "Z0KrJFa/K2cC8AtmMJUoZMo+mh1yemDbDLCZW30PjFHbZtcszS2cydAgq/HDFkZynvZG0zhbx/To\n"
+ "aL289q2//F2cbvBxtki6I8JzTg1H3oTO2WVrXQeCA3a/yiuRUatgGH4mxrpCF6byVJyqrEWAj4kU\n" + "jzcNza1AyypYwOwb2/9/ulXZp0UCgYEA+QFgWDfYLH2zwjU5b6e0UbIyd/X/yRZ+L8lOEBd0Bbu8\n"
+ "uTbhMgIYhLGoaF1e+vMirCRXUXox0i5X976ASzHn64V9JSd1B+UbKfpcFTYYnChmrRDzmhKN1a8C\n" + "qO3txaDbwi7o2mG7pJENHJ3u62CHjgTGDNW9V9Q8eNoGtj3uHvMvi7FdDEK8B6izdZyR7hmZmQ/5\n"
+ "gYBTvIHAyO7ab18/BRUOllAOVSWhr8lXv0eqHEEzKh/rOaoFCRY3qpOcZpgJsGogumK1Z+sLnoeX\n" + "MIldelyiGZlz1KBSoy4FsCpA7hV7cI6H6x+Im24NxG90/wd/EgMCgYEA1f+cUyUisIO3yKOCf0hQ\n"
+ "W8WaVVp6KbY4UeGF8aedItyvVnLbB6ohzTqkZ4Wvk05S6cs75kXYO0SL5U3NiCiiFXz2NA9nwTOk\n" + "aL289q2//F2cbvBxtki6I8JzTg1H3oTO2WVrXQeCA3a/yiuRUatgGH4mxrpCF6byVJyqrEWAj4kU\n"
+ "s1nD2PPgiQ76Kx0mEkhKLwKBgFhHEJqv+AZu37Kx2NRe5WS/2KK9/DPD/hM5tv7mM3sq7Nvm2J3v\n" + "uTbhMgIYhLGoaF1e+vMirCRXUXox0i5X976ASzHn64V9JSd1B+UbKfpcFTYYnChmrRDzmhKN1a8C\n"
+ "lVDS6J5AyZ5aLzXcER9qncKcz6wtC7SsFs1Wr4VPSoBroRPikrVJbgnXK8yZr+O/xq7Scv7WdJTq\n" + "gYBTvIHAyO7ab18/BRUOllAOVSWhr8lXv0eqHEEzKh/rOaoFCRY3qpOcZpgJsGogumK1Z+sLnoeX\n"
+ "rzkw6cWbObvLnltkUn/GQBVqBPBvF2nbtLdyBbuqKb5bAoGBAI1+aoJnvXEXxT4UHrMkQcY0eXRz\n" + "W8WaVVp6KbY4UeGF8aedItyvVnLbB6ohzTqkZ4Wvk05S6cs75kXYO0SL5U3NiCiiFXz2NA9nwTOk\n"
+ "3UdbzJmtjMW9CR6l9s11mV6PcZP4qnODp3nd6a+lPeL3wVYQ47DsTJ/Bx5dI17zA5mU57n6mV0a3\n" + "s1nD2PPgiQ76Kx0mEkhKLwKBgFhHEJqv+AZu37Kx2NRe5WS/2KK9/DPD/hM5tv7mM3sq7Nvm2J3v\n"
+ "DbSoPKSdaKTQdo2THnVE9P9sPKZWueAcsE4Yw/qcTjoxrtUnAH/AXN250v0tkKIOvMhu\n" + "lVDS6J5AyZ5aLzXcER9qncKcz6wtC7SsFs1Wr4VPSoBroRPikrVJbgnXK8yZr+O/xq7Scv7WdJTq\n"
+ "-----END RSA PRIVATE KEY-----"); + "rzkw6cWbObvLnltkUn/GQBVqBPBvF2nbtLdyBbuqKb5bAoGBAI1+aoJnvXEXxT4UHrMkQcY0eXRz\n"
+ "3UdbzJmtjMW9CR6l9s11mV6PcZP4qnODp3nd6a+lPeL3wVYQ47DsTJ/Bx5dI17zA5mU57n6mV0a3\n"
+ "DbSoPKSdaKTQdo2THnVE9P9sPKZWueAcsE4Yw/qcTjoxrtUnAH/AXN250v0tkKIOvMhu\n"
+ "-----END RSA PRIVATE KEY-----").build();
public static final KeyPair KEYPAIR = KeyPair.builder().region(Region.AP_SOUTHEAST_1).keyName("myKeyPair") public static final KeyPair KEYPAIR = KeyPair.builder().region(Region.AP_SOUTHEAST_1).keyName("myKeyPair")
.sha1OfPrivateKey("13:36:74:b9:56:bb:07:96:c0:19:ab:00:7f:9f:06:d2:16:a0:45:32").fingerprint( .sha1OfPrivateKey("13:36:74:b9:56:bb:07:96:c0:19:ab:00:7f:9f:06:d2:16:a0:45:32")
"60:15:d1:f1:d9:e2:3c:e2:ee:a9:64:6a:42:a7:34:0c").keyMaterial(CREDENTIALS.credential).build(); .fingerprint("60:15:d1:f1:d9:e2:3c:e2:ee:a9:64:6a:42:a7:34:0c").keyMaterial(CREDENTIALS.credential).build();
private static final Provider<RunInstancesOptions> OPTIONS_PROVIDER = new javax.inject.Provider<RunInstancesOptions>() { private static final Provider<RunInstancesOptions> OPTIONS_PROVIDER = new javax.inject.Provider<RunInstancesOptions>() {
@ -106,15 +109,15 @@ public class CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptionsTest {
// create mocks // create mocks
CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions strategy = createMock( CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions strategy = createMock(
CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class, new Method[] { CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class,
CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class new Method[] {
.getDeclaredMethod("getOptionsProvider"), CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class
CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class.getDeclaredMethod( .getDeclaredMethod("getOptionsProvider"),
"createNewKeyPairUnlessUserSpecifiedOtherwise", String.class, String.class, CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class.getDeclaredMethod(
TemplateOptions.class), "createNewKeyPairUnlessUserSpecifiedOtherwise", String.class, String.class,
CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class TemplateOptions.class),
.getDeclaredMethod("getSecurityGroupsForTagAndOptions", String.class, String.class, CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class.getDeclaredMethod(
TemplateOptions.class) }); "getSecurityGroupsForTagAndOptions", String.class, String.class, TemplateOptions.class) });
EC2TemplateOptions options = createMock(EC2TemplateOptions.class); EC2TemplateOptions options = createMock(EC2TemplateOptions.class);
Template template = createMock(Template.class); Template template = createMock(Template.class);
@ -125,7 +128,7 @@ public class CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptionsTest {
expect(template.getOptions()).andReturn(options).atLeastOnce(); expect(template.getOptions()).andReturn(options).atLeastOnce();
expect(options.getBlockDeviceMappings()).andReturn(ImmutableSet.<BlockDeviceMapping> of()).atLeastOnce(); expect(options.getBlockDeviceMappings()).andReturn(ImmutableSet.<BlockDeviceMapping> of()).atLeastOnce();
expect(strategy.createNewKeyPairUnlessUserSpecifiedOtherwise(region, group, options)).andReturn( expect(strategy.createNewKeyPairUnlessUserSpecifiedOtherwise(region, group, options)).andReturn(
systemGeneratedKeyPairName); systemGeneratedKeyPairName);
expect(strategy.getSecurityGroupsForTagAndOptions(region, group, options)).andReturn(generatedGroups); expect(strategy.getSecurityGroupsForTagAndOptions(region, group, options)).andReturn(generatedGroups);
expect(options.getUserData()).andReturn(null); expect(options.getUserData()).andReturn(null);
@ -137,9 +140,10 @@ public class CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptionsTest {
// run // run
RunInstancesOptions customize = strategy.execute(region, group, template); RunInstancesOptions customize = strategy.execute(region, group, template);
assertEquals(customize.buildQueryParameters(), ImmutableMultimap.<String, String> of()); assertEquals(customize.buildQueryParameters(), ImmutableMultimap.<String, String> of());
assertEquals(customize.buildFormParameters().entries(), ImmutableMultimap.<String, String> of("InstanceType", assertEquals(
size.getProviderId(), "SecurityGroup.1", generatedGroup, "KeyName", systemGeneratedKeyPairName) customize.buildFormParameters().entries(),
.entries()); ImmutableMultimap.<String, String> of("InstanceType", size.getProviderId(), "SecurityGroup.1",
generatedGroup, "KeyName", systemGeneratedKeyPairName).entries());
assertEquals(customize.buildMatrixParameters(), ImmutableMultimap.<String, String> of()); assertEquals(customize.buildMatrixParameters(), ImmutableMultimap.<String, String> of());
assertEquals(customize.buildRequestHeaders(), ImmutableMultimap.<String, String> of()); assertEquals(customize.buildRequestHeaders(), ImmutableMultimap.<String, String> of());
assertEquals(customize.buildStringPayload(), null); assertEquals(customize.buildStringPayload(), null);
@ -161,15 +165,15 @@ public class CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptionsTest {
// create mocks // create mocks
CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions strategy = createMock( CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions strategy = createMock(
CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class, new Method[] { CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class,
CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class new Method[] {
.getDeclaredMethod("getOptionsProvider"), CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class
CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class.getDeclaredMethod( .getDeclaredMethod("getOptionsProvider"),
"createNewKeyPairUnlessUserSpecifiedOtherwise", String.class, String.class, CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class.getDeclaredMethod(
TemplateOptions.class), "createNewKeyPairUnlessUserSpecifiedOtherwise", String.class, String.class,
CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class TemplateOptions.class),
.getDeclaredMethod("getSecurityGroupsForTagAndOptions", String.class, String.class, CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class.getDeclaredMethod(
TemplateOptions.class) }); "getSecurityGroupsForTagAndOptions", String.class, String.class, TemplateOptions.class) });
EC2TemplateOptions options = createMock(EC2TemplateOptions.class); EC2TemplateOptions options = createMock(EC2TemplateOptions.class);
Template template = createMock(Template.class); Template template = createMock(Template.class);
@ -180,7 +184,7 @@ public class CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptionsTest {
expect(template.getOptions()).andReturn(options).atLeastOnce(); expect(template.getOptions()).andReturn(options).atLeastOnce();
expect(options.getBlockDeviceMappings()).andReturn(ImmutableSet.<BlockDeviceMapping> of()).atLeastOnce(); expect(options.getBlockDeviceMappings()).andReturn(ImmutableSet.<BlockDeviceMapping> of()).atLeastOnce();
expect(strategy.createNewKeyPairUnlessUserSpecifiedOtherwise(region, group, options)).andReturn( expect(strategy.createNewKeyPairUnlessUserSpecifiedOtherwise(region, group, options)).andReturn(
systemGeneratedKeyPairName); systemGeneratedKeyPairName);
expect(strategy.getSecurityGroupsForTagAndOptions(region, group, options)).andReturn(generatedGroups); expect(strategy.getSecurityGroupsForTagAndOptions(region, group, options)).andReturn(generatedGroups);
expect(options.getUserData()).andReturn("hello".getBytes()); expect(options.getUserData()).andReturn("hello".getBytes());
@ -192,9 +196,10 @@ public class CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptionsTest {
// run // run
RunInstancesOptions customize = strategy.execute(region, group, template); RunInstancesOptions customize = strategy.execute(region, group, template);
assertEquals(customize.buildQueryParameters(), ImmutableMultimap.<String, String> of()); assertEquals(customize.buildQueryParameters(), ImmutableMultimap.<String, String> of());
assertEquals(customize.buildFormParameters().entries(), ImmutableMultimap.<String, String> of("InstanceType", assertEquals(
size.getProviderId(), "SecurityGroup.1", "group", "KeyName", systemGeneratedKeyPairName, "UserData", customize.buildFormParameters().entries(),
Base64.encodeBytes("hello".getBytes())).entries()); ImmutableMultimap.<String, String> of("InstanceType", size.getProviderId(), "SecurityGroup.1", "group",
"KeyName", systemGeneratedKeyPairName, "UserData", Base64.encodeBytes("hello".getBytes())).entries());
assertEquals(customize.buildMatrixParameters(), ImmutableMultimap.<String, String> of()); assertEquals(customize.buildMatrixParameters(), ImmutableMultimap.<String, String> of());
assertEquals(customize.buildRequestHeaders(), ImmutableMultimap.<String, String> of()); assertEquals(customize.buildRequestHeaders(), ImmutableMultimap.<String, String> of());
assertEquals(customize.buildStringPayload(), null); assertEquals(customize.buildStringPayload(), null);
@ -218,7 +223,7 @@ public class CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptionsTest {
// setup expectations // setup expectations
expect(options.getKeyPair()).andReturn(userSuppliedKeyPair); expect(options.getKeyPair()).andReturn(userSuppliedKeyPair);
expect(options.getOverridingCredentials()).andReturn(null); expect(options.getLoginPrivateKey()).andReturn(null);
expect(options.getRunScript()).andReturn(null); expect(options.getRunScript()).andReturn(null);
// replay mocks // replay mocks
@ -249,7 +254,10 @@ public class CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptionsTest {
// setup expectations // setup expectations
expect(options.getKeyPair()).andReturn(userSuppliedKeyPair); expect(options.getKeyPair()).andReturn(userSuppliedKeyPair);
expect(options.getOverridingCredentials()).andReturn(null); expect(options.getLoginUser()).andReturn(null);
expect(options.getLoginPassword()).andReturn(null);
expect(options.getLoginPrivateKey()).andReturn(null);
expect(options.shouldAuthenticateSudo()).andReturn(null);
expect(options.getRunScript()).andReturn(Statements.exec("echo foo")); expect(options.getRunScript()).andReturn(Statements.exec("echo foo"));
expect(strategy.credentialsMap.containsKey(new RegionAndName(region, userSuppliedKeyPair))).andReturn(false); expect(strategy.credentialsMap.containsKey(new RegionAndName(region, userSuppliedKeyPair))).andReturn(false);
@ -281,7 +289,7 @@ public class CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptionsTest {
// setup expectations // setup expectations
expect(options.getKeyPair()).andReturn(userSuppliedKeyPair); expect(options.getKeyPair()).andReturn(userSuppliedKeyPair);
expect(options.getOverridingCredentials()).andReturn(null); expect(options.getLoginPrivateKey()).andReturn(null);
expect(options.getRunScript()).andReturn(Statements.exec("echo foo")); expect(options.getRunScript()).andReturn(Statements.exec("echo foo"));
expect(strategy.credentialsMap.containsKey(new RegionAndName(region, userSuppliedKeyPair))).andReturn(true); expect(strategy.credentialsMap.containsKey(new RegionAndName(region, userSuppliedKeyPair))).andReturn(true);
@ -313,7 +321,7 @@ public class CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptionsTest {
// setup expectations // setup expectations
expect(options.getKeyPair()).andReturn(userSuppliedKeyPair); expect(options.getKeyPair()).andReturn(userSuppliedKeyPair);
expect(options.getOverridingCredentials()).andReturn(CREDENTIALS).atLeastOnce(); expect(options.getLoginPrivateKey()).andReturn(CREDENTIALS.getPrivateKey()).atLeastOnce();
// Notice that the fingerprint and sha1 generated // Notice that the fingerprint and sha1 generated
expect(strategy.credentialsMap.put(new RegionAndName(region, userSuppliedKeyPair), KEYPAIR)).andReturn(null); expect(strategy.credentialsMap.put(new RegionAndName(region, userSuppliedKeyPair), KEYPAIR)).andReturn(null);
@ -335,7 +343,7 @@ public class CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptionsTest {
} }
public void testCreateNewKeyPairUnlessUserSpecifiedOtherwise_createsNewKeyPairAndReturnsItsNameByDefault() public void testCreateNewKeyPairUnlessUserSpecifiedOtherwise_createsNewKeyPairAndReturnsItsNameByDefault()
throws ExecutionException { throws ExecutionException {
// setup constants // setup constants
String region = Region.AP_SOUTHEAST_1; String region = Region.AP_SOUTHEAST_1;
String group = "group"; String group = "group";
@ -363,7 +371,7 @@ public class CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptionsTest {
// run // run
assertEquals(strategy.createNewKeyPairUnlessUserSpecifiedOtherwise(region, group, options), assertEquals(strategy.createNewKeyPairUnlessUserSpecifiedOtherwise(region, group, options),
systemGeneratedKeyPairName); systemGeneratedKeyPairName);
// verify mocks // verify mocks
verify(options); verify(options);
@ -404,7 +412,7 @@ public class CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptionsTest {
} }
public void testGetSecurityGroupsForTagAndOptions_createsNewGroupByDefaultWhenNoPortsAreSpecifiedWhenDoesntExist() public void testGetSecurityGroupsForTagAndOptions_createsNewGroupByDefaultWhenNoPortsAreSpecifiedWhenDoesntExist()
throws ExecutionException { throws ExecutionException {
// setup constants // setup constants
String region = Region.AP_SOUTHEAST_1; String region = Region.AP_SOUTHEAST_1;
String group = "group"; String group = "group";
@ -422,7 +430,7 @@ public class CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptionsTest {
expect(options.getGroups()).andReturn(groupIds).atLeastOnce(); expect(options.getGroups()).andReturn(groupIds).atLeastOnce();
expect(options.getInboundPorts()).andReturn(ports).atLeastOnce(); expect(options.getInboundPorts()).andReturn(ports).atLeastOnce();
RegionNameAndIngressRules regionNameAndIngressRules = new RegionNameAndIngressRules(region, generatedMarkerGroup, RegionNameAndIngressRules regionNameAndIngressRules = new RegionNameAndIngressRules(region, generatedMarkerGroup,
ports, shouldAuthorizeSelf); ports, shouldAuthorizeSelf);
expect(strategy.securityGroupMap.getUnchecked(regionNameAndIngressRules)).andReturn(group); expect(strategy.securityGroupMap.getUnchecked(regionNameAndIngressRules)).andReturn(group);
// replay mocks // replay mocks
@ -438,7 +446,7 @@ public class CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptionsTest {
} }
public void testGetSecurityGroupsForTagAndOptions_createsNewGroupByDefaultWhenPortsAreSpecifiedWhenDoesntExist() public void testGetSecurityGroupsForTagAndOptions_createsNewGroupByDefaultWhenPortsAreSpecifiedWhenDoesntExist()
throws ExecutionException { throws ExecutionException {
// setup constants // setup constants
String region = Region.AP_SOUTHEAST_1; String region = Region.AP_SOUTHEAST_1;
String group = "group"; String group = "group";
@ -456,7 +464,7 @@ public class CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptionsTest {
expect(options.getGroups()).andReturn(groupIds).atLeastOnce(); expect(options.getGroups()).andReturn(groupIds).atLeastOnce();
expect(options.getInboundPorts()).andReturn(ports).atLeastOnce(); expect(options.getInboundPorts()).andReturn(ports).atLeastOnce();
RegionNameAndIngressRules regionNameAndIngressRules = new RegionNameAndIngressRules(region, generatedMarkerGroup, RegionNameAndIngressRules regionNameAndIngressRules = new RegionNameAndIngressRules(region, generatedMarkerGroup,
ports, shouldAuthorizeSelf); ports, shouldAuthorizeSelf);
expect(strategy.securityGroupMap.getUnchecked(regionNameAndIngressRules)).andReturn(generatedMarkerGroup); expect(strategy.securityGroupMap.getUnchecked(regionNameAndIngressRules)).andReturn(generatedMarkerGroup);
// replay mocks // replay mocks
@ -472,7 +480,7 @@ public class CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptionsTest {
} }
public void testGetSecurityGroupsForTagAndOptions_reusesGroupByDefaultWhenNoPortsAreSpecifiedWhenDoesExist() public void testGetSecurityGroupsForTagAndOptions_reusesGroupByDefaultWhenNoPortsAreSpecifiedWhenDoesExist()
throws ExecutionException { throws ExecutionException {
// setup constants // setup constants
String region = Region.AP_SOUTHEAST_1; String region = Region.AP_SOUTHEAST_1;
String group = "group"; String group = "group";
@ -490,7 +498,7 @@ public class CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptionsTest {
expect(options.getGroups()).andReturn(groupIds).atLeastOnce(); expect(options.getGroups()).andReturn(groupIds).atLeastOnce();
expect(options.getInboundPorts()).andReturn(ports).atLeastOnce(); expect(options.getInboundPorts()).andReturn(ports).atLeastOnce();
RegionNameAndIngressRules regionNameAndIngressRules = new RegionNameAndIngressRules(region, generatedMarkerGroup, RegionNameAndIngressRules regionNameAndIngressRules = new RegionNameAndIngressRules(region, generatedMarkerGroup,
ports, shouldAuthorizeSelf); ports, shouldAuthorizeSelf);
expect(strategy.securityGroupMap.getUnchecked(regionNameAndIngressRules)).andReturn(generatedMarkerGroup); expect(strategy.securityGroupMap.getUnchecked(regionNameAndIngressRules)).andReturn(generatedMarkerGroup);
// replay mocks // replay mocks
@ -523,10 +531,10 @@ public class CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptionsTest {
// setup expectations // setup expectations
expect(options.getGroups()).andReturn(groupIds).atLeastOnce(); expect(options.getGroups()).andReturn(groupIds).atLeastOnce();
RegionNameAndIngressRules regionNameAndIngressRules = new RegionNameAndIngressRules(region, generatedMarkerGroup, RegionNameAndIngressRules regionNameAndIngressRules = new RegionNameAndIngressRules(region, generatedMarkerGroup,
ports, shouldAuthorizeSelf); ports, shouldAuthorizeSelf);
expect(strategy.securityGroupMap.getUnchecked(regionNameAndIngressRules)) expect(strategy.securityGroupMap.getUnchecked(regionNameAndIngressRules))
.andReturn(groupExisted ? "group" : null); .andReturn(groupExisted ? "group" : null);
// replay mocks // replay mocks
replay(options); replay(options);
@ -552,7 +560,7 @@ public class CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptionsTest {
ConcurrentMap<RegionAndName, KeyPair> credentialsMap = createMock(ConcurrentMap.class); ConcurrentMap<RegionAndName, KeyPair> credentialsMap = createMock(ConcurrentMap.class);
Cache<RegionAndName, String> securityGroupMap = createMock(Cache.class); Cache<RegionAndName, String> securityGroupMap = createMock(Cache.class);
return new CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions(makeKeyPair, credentialsMap, return new CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions(makeKeyPair, credentialsMap,
securityGroupMap, OPTIONS_PROVIDER); securityGroupMap, OPTIONS_PROVIDER);
} }
private void replayStrategy(CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions strategy) { private void replayStrategy(CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions strategy) {

View File

@ -121,7 +121,7 @@ public class KeyPairClientLiveTest {
KeyPair result = client.createKeyPairInRegion(null, keyName); KeyPair result = client.createKeyPairInRegion(null, keyName);
assertNotNull(result); assertNotNull(result);
assertNotNull(result.getKeyMaterial()); assertNotNull(result.getKeyMaterial());
assertNotNull(result.getKeyFingerprint()); assertNotNull(result.getSha1OfPrivateKey());
assertEquals(result.getKeyName(), keyName); assertEquals(result.getKeyName(), keyName);
Set<KeyPair> twoResults = Sets.newLinkedHashSet(client.describeKeyPairsInRegion(null, keyName)); Set<KeyPair> twoResults = Sets.newLinkedHashSet(client.describeKeyPairsInRegion(null, keyName));
@ -129,7 +129,7 @@ public class KeyPairClientLiveTest {
assertEquals(twoResults.size(), 1); assertEquals(twoResults.size(), 1);
KeyPair listPair = twoResults.iterator().next(); KeyPair listPair = twoResults.iterator().next();
assertEquals(listPair.getKeyName(), result.getKeyName()); assertEquals(listPair.getKeyName(), result.getKeyName());
assertEquals(listPair.getKeyFingerprint(), result.getKeyFingerprint()); assertEquals(listPair.getSha1OfPrivateKey(), result.getSha1OfPrivateKey());
} }
@AfterTest @AfterTest

View File

@ -53,7 +53,8 @@
<test.elasticstack.identity>FIXME</test.elasticstack.identity> <test.elasticstack.identity>FIXME</test.elasticstack.identity>
<test.elasticstack.credential>FIXME</test.elasticstack.credential> <test.elasticstack.credential>FIXME</test.elasticstack.credential>
<test.elasticstack.image-id></test.elasticstack.image-id> <test.elasticstack.image-id></test.elasticstack.image-id>
<test.elasticstack.login-user></test.elasticstack.login-user> <test.elasticstack.image.login-user></test.elasticstack.image.login-user>
<test.elasticstack.image.authenticate-sudo></test.elasticstack.image.authenticate-sudo>
</properties> </properties>
<dependencies> <dependencies>
<dependency> <dependency>
@ -110,7 +111,8 @@
<test.elasticstack.identity>${test.elasticstack.identity}</test.elasticstack.identity> <test.elasticstack.identity>${test.elasticstack.identity}</test.elasticstack.identity>
<test.elasticstack.credential>${test.elasticstack.credential}</test.elasticstack.credential> <test.elasticstack.credential>${test.elasticstack.credential}</test.elasticstack.credential>
<test.elasticstack.image-id>${test.elasticstack.image-id}</test.elasticstack.image-id> <test.elasticstack.image-id>${test.elasticstack.image-id}</test.elasticstack.image-id>
<test.elasticstack.login-user>${test.elasticstack.login-user}</test.elasticstack.login-user> <test.elasticstack.image.login-user>${test.elasticstack.image.login-user}</test.elasticstack.image.login-user>
<test.elasticstack.image.authenticate-sudo>${test.elasticstack.image.authenticate-sudo}</test.elasticstack.image.authenticate-sudo>
</systemPropertyVariables> </systemPropertyVariables>
</configuration> </configuration>
</execution> </execution>

View File

@ -44,8 +44,8 @@ import org.jclouds.compute.domain.Template;
import org.jclouds.compute.domain.Volume; import org.jclouds.compute.domain.Volume;
import org.jclouds.compute.domain.internal.VolumeImpl; import org.jclouds.compute.domain.internal.VolumeImpl;
import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.compute.reference.ComputeServiceConstants;
import org.jclouds.domain.Credentials;
import org.jclouds.domain.Location; import org.jclouds.domain.Location;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.elasticstack.ElasticStackClient; import org.jclouds.elasticstack.ElasticStackClient;
import org.jclouds.elasticstack.domain.Device; import org.jclouds.elasticstack.domain.Device;
import org.jclouds.elasticstack.domain.Drive; import org.jclouds.elasticstack.domain.Drive;
@ -126,7 +126,8 @@ public class ElasticStackComputeServiceAdapter implements
ServerInfo from = client.createServer(toCreate); ServerInfo from = client.createServer(toCreate);
client.startServer(from.getUuid()); client.startServer(from.getUuid());
from = client.getServerInfo(from.getUuid()); from = client.getServerInfo(from.getUuid());
return new NodeAndInitialCredentials<ServerInfo>(from, from.getUuid(), new Credentials(null, defaultVncPassword)); return new NodeAndInitialCredentials<ServerInfo>(from, from.getUuid(), LoginCredentials.builder()
.password(defaultVncPassword).build());
} }
@Override @Override

View File

@ -39,7 +39,6 @@ import org.jclouds.compute.domain.NodeState;
import org.jclouds.compute.domain.Processor; import org.jclouds.compute.domain.Processor;
import org.jclouds.compute.domain.Volume; import org.jclouds.compute.domain.Volume;
import org.jclouds.compute.domain.VolumeBuilder; import org.jclouds.compute.domain.VolumeBuilder;
import org.jclouds.domain.Credentials;
import org.jclouds.domain.Location; import org.jclouds.domain.Location;
import org.jclouds.elasticstack.domain.Device; import org.jclouds.elasticstack.domain.Device;
import org.jclouds.elasticstack.domain.DriveInfo; import org.jclouds.elasticstack.domain.DriveInfo;
@ -73,15 +72,12 @@ public class ServerInfoToNodeMetadata implements Function<ServerInfo, NodeMetada
private final Function<Server, String> getImageIdFromServer; private final Function<Server, String> getImageIdFromServer;
private final Function<String, Image> findImageForId; private final Function<String, Image> findImageForId;
private final Map<String, Credentials> credentialStore;
private final Supplier<Location> locationSupplier; private final Supplier<Location> locationSupplier;
private final Function<Device, Volume> deviceToVolume; private final Function<Device, Volume> deviceToVolume;
@Inject @Inject
ServerInfoToNodeMetadata(Map<String, Credentials> credentialStore, Function<Server, String> getImageIdFromServer, ServerInfoToNodeMetadata(Function<Server, String> getImageIdFromServer, Function<String, Image> findImageForId,
Function<String, Image> findImageForId, Function<Device, Volume> deviceToVolume, Function<Device, Volume> deviceToVolume, Supplier<Location> locationSupplier) {
Supplier<Location> locationSupplier) {
this.credentialStore = checkNotNull(credentialStore, "credentialStore");
this.locationSupplier = checkNotNull(locationSupplier, "locationSupplier"); this.locationSupplier = checkNotNull(locationSupplier, "locationSupplier");
this.deviceToVolume = checkNotNull(deviceToVolume, "deviceToVolume"); this.deviceToVolume = checkNotNull(deviceToVolume, "deviceToVolume");
this.findImageForId = checkNotNull(findImageForId, "findImageForId"); this.findImageForId = checkNotNull(findImageForId, "findImageForId");
@ -110,7 +106,6 @@ public class ServerInfoToNodeMetadata implements Function<ServerInfo, NodeMetada
builder.state(serverStatusToNodeState.get(from.getStatus())); builder.state(serverStatusToNodeState.get(from.getStatus()));
builder.publicAddresses(ImmutableSet.<String> of(from.getNics().get(0).getDhcp())); builder.publicAddresses(ImmutableSet.<String> of(from.getNics().get(0).getDhcp()));
builder.privateAddresses(ImmutableSet.<String> of()); builder.privateAddresses(ImmutableSet.<String> of());
builder.credentials(credentialStore.get("node#" + from.getUuid()));
return builder.build(); return builder.build();
} }

View File

@ -26,8 +26,8 @@ import javax.inject.Singleton;
import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.Image;
import org.jclouds.compute.domain.ImageBuilder; import org.jclouds.compute.domain.ImageBuilder;
import org.jclouds.compute.domain.OperatingSystem; import org.jclouds.compute.domain.OperatingSystem;
import org.jclouds.domain.Credentials;
import org.jclouds.domain.Location; import org.jclouds.domain.Location;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.elasticstack.domain.DriveInfo; import org.jclouds.elasticstack.domain.DriveInfo;
import org.jclouds.elasticstack.domain.WellKnownImage; import org.jclouds.elasticstack.domain.WellKnownImage;
@ -52,13 +52,18 @@ public class WellKnownImageToImage implements Function<DriveInfo, Image> {
@Override @Override
public Image apply(DriveInfo drive) { public Image apply(DriveInfo drive) {
WellKnownImage input = preinstalledImages.get(drive.getUuid()); WellKnownImage input = preinstalledImages.get(drive.getUuid());
return new ImageBuilder().ids(drive.getUuid()).userMetadata( return new ImageBuilder()
ImmutableMap.<String, String> builder().putAll(drive.getUserMetadata()) .ids(drive.getUuid())
.put("size", input.getSize() + "").build()).defaultCredentials( .userMetadata(
new Credentials(input.getLoginUser(), null)).location(locationSupplier.get()).name( ImmutableMap.<String, String> builder().putAll(drive.getUserMetadata())
input.getDescription()).description(drive.getName()).operatingSystem( .put("size", input.getSize() + "").build())
new OperatingSystem.Builder().family(input.getOsFamily()).version(input.getOsVersion()).name( .defaultCredentials(LoginCredentials.builder().user(input.getLoginUser()).build())
input.getDescription()).description(drive.getName()).is64Bit(input.is64bit()).build()).version( .location(locationSupplier.get())
"").build(); .name(input.getDescription())
.description(drive.getName())
.operatingSystem(
new OperatingSystem.Builder().family(input.getOsFamily()).version(input.getOsVersion())
.name(input.getDescription()).description(drive.getName()).is64Bit(input.is64bit()).build())
.version("").build();
} }
} }

View File

@ -39,7 +39,8 @@
<test.eucalyptus.identity>FIXME_IDENTITY</test.eucalyptus.identity> <test.eucalyptus.identity>FIXME_IDENTITY</test.eucalyptus.identity>
<test.eucalyptus.credential>FIXME_CREDENTIAL</test.eucalyptus.credential> <test.eucalyptus.credential>FIXME_CREDENTIAL</test.eucalyptus.credential>
<test.eucalyptus.image-id></test.eucalyptus.image-id> <test.eucalyptus.image-id></test.eucalyptus.image-id>
<test.eucalyptus.login-user></test.eucalyptus.login-user> <test.eucalyptus.image.login-user></test.eucalyptus.image.login-user>
<test.eucalyptus.image.authenticate-sudo></test.eucalyptus.image.authenticate-sudo>
</properties> </properties>
<dependencies> <dependencies>
@ -105,7 +106,8 @@
<test.eucalyptus.identity>${test.eucalyptus.identity}</test.eucalyptus.identity> <test.eucalyptus.identity>${test.eucalyptus.identity}</test.eucalyptus.identity>
<test.eucalyptus.credential>${test.eucalyptus.credential}</test.eucalyptus.credential> <test.eucalyptus.credential>${test.eucalyptus.credential}</test.eucalyptus.credential>
<test.eucalyptus.image-id>${test.eucalyptus.image-id}</test.eucalyptus.image-id> <test.eucalyptus.image-id>${test.eucalyptus.image-id}</test.eucalyptus.image-id>
<test.eucalyptus.login-user>${test.eucalyptus.login-user}</test.eucalyptus.login-user> <test.eucalyptus.image.login-user>${test.eucalyptus.image.login-user}</test.eucalyptus.image.login-user>
<test.eucalyptus.image.authenticate-sudo>${test.eucalyptus.image.authenticate-sudo}</test.eucalyptus.image.authenticate-sudo>
</systemPropertyVariables> </systemPropertyVariables>
</configuration> </configuration>
</execution> </execution>

View File

@ -38,6 +38,7 @@ import java.util.Properties;
import java.util.Set; import java.util.Set;
import junit.framework.Assert; import junit.framework.Assert;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.jclouds.blobstore.BlobRequestSigner; import org.jclouds.blobstore.BlobRequestSigner;
@ -46,7 +47,6 @@ import org.jclouds.blobstore.BlobStoreContext;
import org.jclouds.blobstore.BlobStoreContextFactory; import org.jclouds.blobstore.BlobStoreContextFactory;
import org.jclouds.blobstore.ContainerNotFoundException; import org.jclouds.blobstore.ContainerNotFoundException;
import org.jclouds.blobstore.domain.Blob; import org.jclouds.blobstore.domain.Blob;
import org.jclouds.blobstore.domain.BlobBuilder;
import org.jclouds.blobstore.domain.BlobMetadata; import org.jclouds.blobstore.domain.BlobMetadata;
import org.jclouds.blobstore.domain.MutableBlobMetadata; import org.jclouds.blobstore.domain.MutableBlobMetadata;
import org.jclouds.blobstore.domain.PageSet; import org.jclouds.blobstore.domain.PageSet;
@ -66,6 +66,7 @@ import org.testng.annotations.DataProvider;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import com.google.inject.CreationException; import com.google.inject.CreationException;
import com.google.inject.Module;
/** /**
* Test class for {@link FilesystemAsyncBlobStore} class * Test class for {@link FilesystemAsyncBlobStore} class
@ -95,7 +96,7 @@ public class FilesystemAsyncBlobStoreTest {
// create context for filesystem container // create context for filesystem container
Properties prop = new Properties(); Properties prop = new Properties();
prop.setProperty(FilesystemConstants.PROPERTY_BASEDIR, TestUtils.TARGET_BASE_DIR); prop.setProperty(FilesystemConstants.PROPERTY_BASEDIR, TestUtils.TARGET_BASE_DIR);
context = (BlobStoreContext) new BlobStoreContextFactory().createContext(PROVIDER, "identity", "credential", Collections.EMPTY_LIST, prop); context = (BlobStoreContext) new BlobStoreContextFactory().createContext(PROVIDER, "identity", "credential", Collections.<Module>emptyList(), prop);
// create a container in the default location // create a container in the default location
blobStore = context.getBlobStore(); blobStore = context.getBlobStore();

View File

@ -39,7 +39,8 @@
<test.nova.identity>FIXME_IDENTITY</test.nova.identity> <test.nova.identity>FIXME_IDENTITY</test.nova.identity>
<test.nova.credential>FIXME_CREDENTIALS</test.nova.credential> <test.nova.credential>FIXME_CREDENTIALS</test.nova.credential>
<test.nova.image-id></test.nova.image-id> <test.nova.image-id></test.nova.image-id>
<test.nova.login-user></test.nova.login-user> <test.nova.image.login-user></test.nova.image.login-user>
<test.nova.image.authenticate-sudo></test.nova.image.authenticate-sudo>
<test.ssh.keyfile.public></test.ssh.keyfile.public> <test.ssh.keyfile.public></test.ssh.keyfile.public>
<test.ssh.keyfile.private></test.ssh.keyfile.private> <test.ssh.keyfile.private></test.ssh.keyfile.private>
</properties> </properties>
@ -130,7 +131,8 @@
<test.nova.identity>${test.nova.identity}</test.nova.identity> <test.nova.identity>${test.nova.identity}</test.nova.identity>
<test.nova.credential>${test.nova.credential}</test.nova.credential> <test.nova.credential>${test.nova.credential}</test.nova.credential>
<test.nova.image-id>${test.nova.image-id}</test.nova.image-id> <test.nova.image-id>${test.nova.image-id}</test.nova.image-id>
<test.nova.login-user>${test.nova.login-user}</test.nova.login-user> <test.nova.image.login-user>${test.nova.image.login-user}</test.nova.image.login-user>
<test.nova.image.authenticate-sudo>${test.nova.image.authenticate-sudo}</test.nova.image.authenticate-sudo>
<test.ssh.keyfile.public>${test.ssh.keyfile.public}</test.ssh.keyfile.public> <test.ssh.keyfile.public>${test.ssh.keyfile.public}</test.ssh.keyfile.public>
<test.ssh.keyfile.private>${test.ssh.keyfile.private}</test.ssh.keyfile.private> <test.ssh.keyfile.private>${test.ssh.keyfile.private}</test.ssh.keyfile.private>
</systemPropertyVariables> </systemPropertyVariables>

View File

@ -20,10 +20,9 @@ package org.jclouds.openstack.nova;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import javax.ws.rs.PathParam;
import org.jclouds.concurrent.Timeout; import org.jclouds.concurrent.Timeout;
import org.jclouds.openstack.nova.domain.Addresses; import org.jclouds.openstack.nova.domain.Addresses;
import org.jclouds.openstack.nova.domain.Flavor; import org.jclouds.openstack.nova.domain.Flavor;
@ -35,8 +34,6 @@ import org.jclouds.openstack.nova.options.ListOptions;
import org.jclouds.openstack.nova.options.RebuildServerOptions; import org.jclouds.openstack.nova.options.RebuildServerOptions;
import org.jclouds.rest.ResourceNotFoundException; import org.jclouds.rest.ResourceNotFoundException;
import java.util.concurrent.Future;
/** /**
* Provides access to OpenStack Nova via their REST API. * Provides access to OpenStack Nova via their REST API.
* <p/> * <p/>

View File

@ -24,7 +24,6 @@ import javax.inject.Singleton;
import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.Image;
import org.jclouds.compute.domain.ImageBuilder; import org.jclouds.compute.domain.ImageBuilder;
import org.jclouds.compute.domain.OperatingSystem; import org.jclouds.compute.domain.OperatingSystem;
import org.jclouds.domain.Credentials;
import com.google.common.base.Function; import com.google.common.base.Function;
@ -48,7 +47,6 @@ public class NovaImageToImage implements Function<org.jclouds.openstack.nova.dom
builder.description(from.getName() != null ? from.getName() : "unspecified"); builder.description(from.getName() != null ? from.getName() : "unspecified");
builder.version(from.getUpdated() != null ? from.getUpdated().getTime() + "" : "-1"); builder.version(from.getUpdated() != null ? from.getUpdated().getTime() + "" : "-1");
builder.operatingSystem(imageToOs.apply(from)); //image name may not represent the OS type builder.operatingSystem(imageToOs.apply(from)); //image name may not represent the OS type
builder.defaultCredentials(new Credentials("root", null));
builder.uri(from.getURI()); builder.uri(from.getURI());
Image image = builder.build(); Image image = builder.build();
return image; return image;

View File

@ -18,14 +18,25 @@
*/ */
package org.jclouds.openstack.nova.compute.functions; package org.jclouds.openstack.nova.compute.functions;
import com.google.common.base.Function; import static com.google.common.base.Preconditions.checkNotNull;
import com.google.common.base.Predicate; import static org.jclouds.compute.util.ComputeServiceUtils.parseGroupFromName;
import com.google.common.base.Supplier;
import com.google.common.collect.Iterables; import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Set;
import javax.annotation.Resource;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;
import org.jclouds.collect.Memoized; import org.jclouds.collect.Memoized;
import org.jclouds.compute.domain.*; import org.jclouds.compute.domain.Hardware;
import org.jclouds.compute.domain.Image;
import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.compute.domain.NodeMetadataBuilder;
import org.jclouds.compute.domain.NodeState;
import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.compute.reference.ComputeServiceConstants;
import org.jclouds.domain.Credentials;
import org.jclouds.domain.Location; import org.jclouds.domain.Location;
import org.jclouds.domain.LocationBuilder; import org.jclouds.domain.LocationBuilder;
import org.jclouds.domain.LocationScope; import org.jclouds.domain.LocationScope;
@ -34,16 +45,10 @@ import org.jclouds.openstack.nova.domain.Address;
import org.jclouds.openstack.nova.domain.Server; import org.jclouds.openstack.nova.domain.Server;
import org.jclouds.openstack.nova.domain.ServerStatus; import org.jclouds.openstack.nova.domain.ServerStatus;
import javax.annotation.Resource; import com.google.common.base.Function;
import javax.inject.Inject; import com.google.common.base.Predicate;
import javax.inject.Named; import com.google.common.base.Supplier;
import javax.inject.Singleton; import com.google.common.collect.Iterables;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Set;
import static com.google.common.base.Preconditions.checkNotNull;
import static org.jclouds.compute.util.ComputeServiceUtils.parseGroupFromName;
/** /**
* @author Adrian Cole * @author Adrian Cole
@ -55,7 +60,6 @@ public class ServerToNodeMetadata implements Function<Server, NodeMetadata> {
protected Logger logger = Logger.NULL; protected Logger logger = Logger.NULL;
protected final Supplier<Location> location; protected final Supplier<Location> location;
protected final Map<String, Credentials> credentialStore;
protected final Map<ServerStatus, NodeState> serverToNodeState; protected final Map<ServerStatus, NodeState> serverToNodeState;
protected final Supplier<Set<? extends Image>> images; protected final Supplier<Set<? extends Image>> images;
protected final Supplier<Set<? extends Hardware>> hardwares; protected final Supplier<Set<? extends Hardware>> hardwares;
@ -87,11 +91,10 @@ public class ServerToNodeMetadata implements Function<Server, NodeMetadata> {
} }
@Inject @Inject
ServerToNodeMetadata(Map<ServerStatus, NodeState> serverStateToNodeState, Map<String, Credentials> credentialStore, ServerToNodeMetadata(Map<ServerStatus, NodeState> serverStateToNodeState,
@Memoized Supplier<Set<? extends Image>> images, Supplier<Location> location, @Memoized Supplier<Set<? extends Image>> images, Supplier<Location> location,
@Memoized Supplier<Set<? extends Hardware>> hardwares) { @Memoized Supplier<Set<? extends Hardware>> hardwares) {
this.serverToNodeState = checkNotNull(serverStateToNodeState, "serverStateToNodeState"); this.serverToNodeState = checkNotNull(serverStateToNodeState, "serverStateToNodeState");
this.credentialStore = checkNotNull(credentialStore, "credentialStore");
this.images = checkNotNull(images, "images"); this.images = checkNotNull(images, "images");
this.location = checkNotNull(location, "location"); this.location = checkNotNull(location, "location");
this.hardwares = checkNotNull(hardwares, "hardwares"); this.hardwares = checkNotNull(hardwares, "hardwares");
@ -115,7 +118,6 @@ public class ServerToNodeMetadata implements Function<Server, NodeMetadata> {
builder.state(serverToNodeState.get(from.getStatus())); builder.state(serverToNodeState.get(from.getStatus()));
builder.publicAddresses(Iterables.transform(from.getAddresses().getPublicAddresses(), Address.newAddress2StringFunction())); builder.publicAddresses(Iterables.transform(from.getAddresses().getPublicAddresses(), Address.newAddress2StringFunction()));
builder.privateAddresses(Iterables.transform(from.getAddresses().getPrivateAddresses(), Address.newAddress2StringFunction())); builder.privateAddresses(Iterables.transform(from.getAddresses().getPrivateAddresses(), Address.newAddress2StringFunction()));
builder.credentials(credentialStore.get("node#" + from.getId()));
builder.uri(from.getURI()); builder.uri(from.getURI());
return builder.build(); return builder.build();
} }

View File

@ -30,6 +30,7 @@ import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.compute.domain.Template; import org.jclouds.compute.domain.Template;
import org.jclouds.compute.strategy.CreateNodeWithGroupEncodedIntoName; import org.jclouds.compute.strategy.CreateNodeWithGroupEncodedIntoName;
import org.jclouds.domain.Credentials; import org.jclouds.domain.Credentials;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.openstack.nova.NovaClient; import org.jclouds.openstack.nova.NovaClient;
import org.jclouds.openstack.nova.domain.Server; import org.jclouds.openstack.nova.domain.Server;
@ -56,7 +57,7 @@ public class NovaCreateNodeWithGroupEncodedIntoName implements CreateNodeWithGro
public NodeMetadata createNodeWithGroupEncodedIntoName(String group, String name, Template template) { public NodeMetadata createNodeWithGroupEncodedIntoName(String group, String name, Template template) {
Server from = client.createServer(name, template.getImage().getId(), template.getHardware().getId(), Server from = client.createServer(name, template.getImage().getId(), template.getHardware().getId(),
withMetadata(template.getOptions().getUserMetadata())); withMetadata(template.getOptions().getUserMetadata()));
credentialStore.put("node#" + from.getId(), new Credentials("root", from.getAdminPass())); credentialStore.put("node#" + from.getId(), LoginCredentials.builder().password(from.getAdminPass()).build());
return serverToNodeMetadata.apply(from); return serverToNodeMetadata.apply(from);
} }

View File

@ -18,24 +18,22 @@
*/ */
package org.jclouds.openstack.nova.compute.functions; package org.jclouds.openstack.nova.compute.functions;
import com.google.inject.Guice; import static org.testng.Assert.assertEquals;
import java.net.URI;
import org.jclouds.compute.config.BaseComputeServiceContextModule; import org.jclouds.compute.config.BaseComputeServiceContextModule;
import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.Image;
import org.jclouds.compute.domain.ImageBuilder; import org.jclouds.compute.domain.ImageBuilder;
import org.jclouds.compute.domain.OperatingSystem; import org.jclouds.compute.domain.OperatingSystem;
import org.jclouds.compute.domain.OsFamily; import org.jclouds.compute.domain.OsFamily;
import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.compute.reference.ComputeServiceConstants;
import org.jclouds.domain.Credentials;
import org.jclouds.json.Json; import org.jclouds.json.Json;
import org.jclouds.json.config.GsonModule; import org.jclouds.json.config.GsonModule;
import org.jclouds.openstack.nova.functions.ParseImageFromJsonResponseTest; import org.jclouds.openstack.nova.functions.ParseImageFromJsonResponseTest;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import java.net.URI; import com.google.inject.Guice;
import java.net.URISyntaxException;
import java.net.UnknownHostException;
import static org.testng.Assert.assertEquals;
/** /**
* @author Adrian Cole * @author Adrian Cole
@ -44,13 +42,13 @@ import static org.testng.Assert.assertEquals;
public class NovaImageToImageTest { public class NovaImageToImageTest {
@Test @Test
public void testApplyWhereImageNotFound() throws UnknownHostException, URISyntaxException { public void testApplyWhereImageNotFound() {
Image image = new ImageBuilder() Image image = new ImageBuilder()
.name("CentOS 5.2") .name("CentOS 5.2")
.operatingSystem( .operatingSystem(
new OperatingSystem.Builder().family(OsFamily.CENTOS).version("5.2").description("CentOS 5.2").is64Bit(true) new OperatingSystem.Builder().family(OsFamily.CENTOS).version("5.2").description("CentOS 5.2")
.build()).description("CentOS 5.2").defaultCredentials(new Credentials("root", null)) .is64Bit(true).build()).description("CentOS 5.2").ids("2").version("1286712000000")
.ids("2").version("1286712000000").uri(new URI("https://servers.api.rackspacecloud.com/v1.1/1234/images/1")).build(); .uri(URI.create("https://servers.api.rackspacecloud.com/v1.1/1234/images/1")).build();
Image parsedImage = convertImage(); Image parsedImage = convertImage();
assertEquals(parsedImage, image); assertEquals(parsedImage, image);
@ -59,9 +57,10 @@ public class NovaImageToImageTest {
public static Image convertImage() { public static Image convertImage() {
org.jclouds.openstack.nova.domain.Image image = ParseImageFromJsonResponseTest.parseImage(); org.jclouds.openstack.nova.domain.Image image = ParseImageFromJsonResponseTest.parseImage();
NovaImageToImage parser = new NovaImageToImage(new NovaImageToOperatingSystem(new BaseComputeServiceContextModule() { NovaImageToImage parser = new NovaImageToImage(new NovaImageToOperatingSystem(
}.provideOsVersionMap(new ComputeServiceConstants.ReferenceData(), Guice.createInjector(new GsonModule()) new BaseComputeServiceContextModule() {
.getInstance(Json.class)))); }.provideOsVersionMap(new ComputeServiceConstants.ReferenceData(), Guice.createInjector(new GsonModule())
.getInstance(Json.class))));
return parser.apply(image); return parser.apply(image);
} }

View File

@ -16,155 +16,138 @@
* specific language governing permissions and limitations * specific language governing permissions and limitations
* under the License. * under the License.
*/ */
package org.jclouds.openstack.nova.compute.functions; package org.jclouds.openstack.nova.compute.functions;
import com.google.common.base.Suppliers; import static org.testng.Assert.assertEquals;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap; import java.net.URI;
import com.google.common.collect.ImmutableSet; import java.net.URISyntaxException;
import org.jclouds.compute.domain.*; import java.net.UnknownHostException;
import org.jclouds.domain.Credentials; import java.util.Map;
import org.jclouds.domain.Location; import java.util.Set;
import org.jclouds.domain.LocationBuilder;
import org.jclouds.domain.LocationScope; import org.jclouds.compute.domain.Hardware;
import org.jclouds.openstack.nova.compute.config.NovaComputeServiceDependenciesModule; import org.jclouds.compute.domain.HardwareBuilder;
import org.jclouds.openstack.nova.domain.Server; import org.jclouds.compute.domain.Image;
import org.jclouds.openstack.nova.domain.ServerStatus; import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.openstack.nova.functions.ParseServerFromJsonResponseTest; import org.jclouds.compute.domain.NodeMetadataBuilder;
import org.testng.annotations.Test; import org.jclouds.compute.domain.NodeState;
import org.jclouds.compute.domain.OperatingSystem;
import java.net.URI; import org.jclouds.compute.domain.OsFamily;
import java.net.URISyntaxException; import org.jclouds.compute.domain.Processor;
import java.net.UnknownHostException; import org.jclouds.compute.domain.Volume;
import java.util.Map; import org.jclouds.compute.domain.VolumeBuilder;
import java.util.Set; import org.jclouds.domain.Location;
import org.jclouds.domain.LocationBuilder;
import static org.testng.Assert.assertEquals; import org.jclouds.domain.LocationScope;
import org.jclouds.openstack.nova.compute.config.NovaComputeServiceDependenciesModule;
/** import org.jclouds.openstack.nova.domain.Server;
* @author Adrian Cole import org.jclouds.openstack.nova.domain.ServerStatus;
*/ import org.jclouds.openstack.nova.functions.ParseServerFromJsonResponseTest;
@Test(groups = "unit") import org.testng.annotations.Test;
public class ServerToNodeMetadataTest {
Location provider = new LocationBuilder().scope(LocationScope.ZONE).id("dallas").description("description").build(); import com.google.common.base.Suppliers;
import com.google.common.collect.ImmutableList;
@Test import com.google.common.collect.ImmutableMap;
public void testApplyWhereImageAndHardwareNotFoundButCredentialsFound() throws UnknownHostException, NoSuchMethodException, ClassNotFoundException, URISyntaxException { import com.google.common.collect.ImmutableSet;
Credentials creds = new Credentials("root", "abdce");
/**
Map<ServerStatus, NodeState> serverStateToNodeState = NovaComputeServiceDependenciesModule.serverToNodeState; * @author Adrian Cole
Set<org.jclouds.compute.domain.Image> images = ImmutableSet.of(); */
Set<org.jclouds.compute.domain.Hardware> hardwares = ImmutableSet.of(); @Test(groups = "unit")
Server server = ParseServerFromJsonResponseTest.parseServer(); public class ServerToNodeMetadataTest {
Location provider = new LocationBuilder().scope(LocationScope.ZONE).id("dallas").description("description").build();
ServerToNodeMetadata parser = new ServerToNodeMetadata(serverStateToNodeState, ImmutableMap
.<String, Credentials>of("node#1234", creds), Suppliers.<Set<? extends Image>>ofInstance(images), @Test
Suppliers.ofInstance(provider), Suppliers.<Set<? extends Hardware>>ofInstance(hardwares)); public void testApplyWhereImageAndHardwareNotFound() throws UnknownHostException, NoSuchMethodException,
ClassNotFoundException, URISyntaxException {
NodeMetadata metadata = parser.apply(server); Map<ServerStatus, NodeState> serverStateToNodeState = NovaComputeServiceDependenciesModule.serverToNodeState;
Set<org.jclouds.compute.domain.Image> images = ImmutableSet.of();
NodeMetadata constructedMetadata = newNodeMetadataBuilder() Set<org.jclouds.compute.domain.Hardware> hardwares = ImmutableSet.of();
.credentials(creds).build(); Server server = ParseServerFromJsonResponseTest.parseServer();
assertEquals(metadata, constructedMetadata);
} ServerToNodeMetadata parser = new ServerToNodeMetadata(serverStateToNodeState,
Suppliers.<Set<? extends Image>> ofInstance(images), Suppliers.ofInstance(provider),
@Test Suppliers.<Set<? extends Hardware>> ofInstance(hardwares));
public void testApplyWhereImageAndHardwareNotFound() throws UnknownHostException, NoSuchMethodException, ClassNotFoundException, URISyntaxException {
Map<ServerStatus, NodeState> serverStateToNodeState = NovaComputeServiceDependenciesModule.serverToNodeState; NodeMetadata metadata = parser.apply(server);
Set<org.jclouds.compute.domain.Image> images = ImmutableSet.of();
Set<org.jclouds.compute.domain.Hardware> hardwares = ImmutableSet.of(); NodeMetadata constructedMetadata = newNodeMetadataBuilder().build();
Server server = ParseServerFromJsonResponseTest.parseServer();
assertEquals(metadata, constructedMetadata);
ServerToNodeMetadata parser = new ServerToNodeMetadata(serverStateToNodeState, ImmutableMap
.<String, Credentials>of(), Suppliers.<Set<? extends Image>>ofInstance(images), Suppliers }
.ofInstance(provider), Suppliers.<Set<? extends Hardware>>ofInstance(hardwares));
private NodeMetadataBuilder newNodeMetadataBuilder() throws URISyntaxException {
NodeMetadata metadata = parser.apply(server); return new NodeMetadataBuilder()
.state(NodeState.PENDING)
NodeMetadata constructedMetadata = newNodeMetadataBuilder().build(); .publicAddresses(ImmutableSet.of("67.23.10.132", "::babe:67.23.10.132", "67.23.10.131", "::babe:4317:0A83"))
.privateAddresses(ImmutableSet.of("10.176.42.16", "::babe:10.176.42.16"))
assertEquals(metadata, constructedMetadata); .id("1234")
.providerId("1234")
} .name("sample-server")
.location(
private NodeMetadataBuilder newNodeMetadataBuilder() throws URISyntaxException { new LocationBuilder().scope(LocationScope.HOST).id("e4d909c290d0fb1ca068ffaddf22cbd0")
return new NodeMetadataBuilder() .description("e4d909c290d0fb1ca068ffaddf22cbd0").parent(provider).build())
.state(NodeState.PENDING) .userMetadata(ImmutableMap.of("Server Label", "Web Head 1", "Image Version", "2.1"))
.publicAddresses(ImmutableSet.of("67.23.10.132", "::babe:67.23.10.132", "67.23.10.131", "::babe:4317:0A83")) .uri(new URI("http://servers.api.openstack.org/1234/servers/1234"));
.privateAddresses(ImmutableSet.of("10.176.42.16", "::babe:10.176.42.16")) }
.id("1234")
.providerId("1234") @Test
.name("sample-server") public void testApplyWhereImageFoundAndHardwareNotFound() throws UnknownHostException, NoSuchMethodException,
.location(new LocationBuilder() ClassNotFoundException, URISyntaxException {
.scope(LocationScope.HOST) Map<ServerStatus, NodeState> serverStateToNodeState = NovaComputeServiceDependenciesModule.serverToNodeState;
.id("e4d909c290d0fb1ca068ffaddf22cbd0") org.jclouds.compute.domain.Image jcImage = NovaImageToImageTest.convertImage();
.description("e4d909c290d0fb1ca068ffaddf22cbd0") Set<org.jclouds.compute.domain.Image> images = ImmutableSet.of(jcImage);
.parent(provider).build()) Set<org.jclouds.compute.domain.Hardware> hardwares = ImmutableSet.of();
.userMetadata(ImmutableMap.of("Server Label", "Web Head 1", "Image Version", "2.1")) Server server = ParseServerFromJsonResponseTest.parseServer();
.uri(new URI("http://servers.api.openstack.org/1234/servers/1234"));
} ServerToNodeMetadata parser = new ServerToNodeMetadata(serverStateToNodeState,
Suppliers.<Set<? extends Image>> ofInstance(images), Suppliers.ofInstance(provider),
@Test Suppliers.<Set<? extends Hardware>> ofInstance(hardwares));
public void testApplyWhereImageFoundAndHardwareNotFound() throws UnknownHostException, NoSuchMethodException, ClassNotFoundException, URISyntaxException {
Map<ServerStatus, NodeState> serverStateToNodeState = NovaComputeServiceDependenciesModule.serverToNodeState; NodeMetadata metadata = parser.apply(server);
org.jclouds.compute.domain.Image jcImage = NovaImageToImageTest.convertImage();
Set<org.jclouds.compute.domain.Image> images = ImmutableSet.of(jcImage); NodeMetadata constructedMetadata = newNodeMetadataBuilder()
Set<org.jclouds.compute.domain.Hardware> hardwares = ImmutableSet.of();
Server server = ParseServerFromJsonResponseTest.parseServer();
ServerToNodeMetadata parser = new ServerToNodeMetadata(serverStateToNodeState, ImmutableMap
.<String, Credentials>of(), Suppliers.<Set<? extends Image>>ofInstance(images), Suppliers
.ofInstance(provider), Suppliers.<Set<? extends Hardware>>ofInstance(hardwares));
NodeMetadata metadata = parser.apply(server);
NodeMetadata constructedMetadata = newNodeMetadataBuilder()
.imageId("2")
.operatingSystem(new OperatingSystem.Builder()
.family(OsFamily.CENTOS)
.description("CentOS 5.2")
.version("5.2")
.is64Bit(true).build())
.build();
assertEquals(metadata, constructedMetadata);
}
@Test
public void testApplyWhereImageAndHardwareFound() throws UnknownHostException, NoSuchMethodException, ClassNotFoundException, URISyntaxException {
Map<ServerStatus, NodeState> serverStateToNodeState = NovaComputeServiceDependenciesModule.serverToNodeState;
Set<org.jclouds.compute.domain.Image> images = ImmutableSet.of(NovaImageToImageTest.convertImage());
Set<org.jclouds.compute.domain.Hardware> hardwares = ImmutableSet.of(FlavorToHardwareTest.convertFlavor());
Server server = ParseServerFromJsonResponseTest.parseServer();
ServerToNodeMetadata parser = new ServerToNodeMetadata(serverStateToNodeState, ImmutableMap
.<String, Credentials>of(), Suppliers.<Set<? extends Image>>ofInstance(images), Suppliers
.ofInstance(provider), Suppliers.<Set<? extends Hardware>>ofInstance(hardwares));
NodeMetadata metadata = parser.apply(server);
NodeMetadata constructedMetadata = newNodeMetadataBuilder()
.imageId("2") .imageId("2")
.operatingSystem(new OperatingSystem.Builder() .operatingSystem(
.family(OsFamily.CENTOS) new OperatingSystem.Builder().family(OsFamily.CENTOS).description("CentOS 5.2").version("5.2")
.description("CentOS 5.2") .is64Bit(true).build()).build();
.version("5.2")
.is64Bit(true).build()) assertEquals(metadata, constructedMetadata);
.hardware(new HardwareBuilder()
.ids("1") }
.name("256 MB Server")
.processors(ImmutableList.of(new Processor(1.0, 1.0))) @Test
.ram(256) public void testApplyWhereImageAndHardwareFound() throws UnknownHostException, NoSuchMethodException,
.volumes(ImmutableList.of(new VolumeBuilder() ClassNotFoundException, URISyntaxException {
.type(Volume.Type.LOCAL) Map<ServerStatus, NodeState> serverStateToNodeState = NovaComputeServiceDependenciesModule.serverToNodeState;
.size(10.0f) Set<org.jclouds.compute.domain.Image> images = ImmutableSet.of(NovaImageToImageTest.convertImage());
.durable(true) Set<org.jclouds.compute.domain.Hardware> hardwares = ImmutableSet.of(FlavorToHardwareTest.convertFlavor());
.bootDevice(true).build())) Server server = ParseServerFromJsonResponseTest.parseServer();
.uri(new URI("http://servers.api.openstack.org/1234/flavors/1"))
.build()) ServerToNodeMetadata parser = new ServerToNodeMetadata(serverStateToNodeState,
.build(); Suppliers.<Set<? extends Image>> ofInstance(images), Suppliers.ofInstance(provider),
Suppliers.<Set<? extends Hardware>> ofInstance(hardwares));
assertEquals(metadata, constructedMetadata);
} NodeMetadata metadata = parser.apply(server);
}
NodeMetadata constructedMetadata = newNodeMetadataBuilder()
.imageId("2")
.operatingSystem(
new OperatingSystem.Builder().family(OsFamily.CENTOS).description("CentOS 5.2").version("5.2")
.is64Bit(true).build())
.hardware(
new HardwareBuilder()
.ids("1")
.name("256 MB Server")
.processors(ImmutableList.of(new Processor(1.0, 1.0)))
.ram(256)
.volumes(
ImmutableList.of(new VolumeBuilder().type(Volume.Type.LOCAL).size(10.0f).durable(true)
.bootDevice(true).build()))
.uri(new URI("http://servers.api.openstack.org/1234/flavors/1")).build()).build();
assertEquals(metadata, constructedMetadata);
}
}

View File

@ -18,10 +18,13 @@
*/ */
package org.jclouds.openstack.nova.functions; package org.jclouds.openstack.nova.functions;
import com.google.inject.Guice; import static org.testng.Assert.assertEquals;
import com.google.inject.Injector; import static org.testng.Assert.assertTrue;
import com.google.inject.Key;
import com.google.inject.TypeLiteral; import java.io.InputStream;
import java.net.UnknownHostException;
import java.text.ParseException;
import org.jclouds.http.HttpResponse; import org.jclouds.http.HttpResponse;
import org.jclouds.http.functions.UnwrapOnlyJsonValue; import org.jclouds.http.functions.UnwrapOnlyJsonValue;
import org.jclouds.io.Payloads; import org.jclouds.io.Payloads;
@ -30,12 +33,10 @@ import org.jclouds.openstack.nova.domain.Server;
import org.jclouds.openstack.nova.domain.ServerStatus; import org.jclouds.openstack.nova.domain.ServerStatus;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import java.io.InputStream; import com.google.inject.Guice;
import java.net.UnknownHostException; import com.google.inject.Injector;
import java.text.ParseException; import com.google.inject.Key;
import com.google.inject.TypeLiteral;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
@Test(groups = "unit") @Test(groups = "unit")
public class ParseServerFromJsonNoAddressesResponseTest { public class ParseServerFromJsonNoAddressesResponseTest {

View File

@ -18,13 +18,16 @@
*/ */
package org.jclouds.openstack.nova.functions; package org.jclouds.openstack.nova.functions;
import com.google.common.collect.ImmutableList; import static org.testng.Assert.assertEquals;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables; import java.io.InputStream;
import com.google.inject.Guice; import java.net.URI;
import com.google.inject.Injector; import java.text.SimpleDateFormat;
import com.google.inject.Key; import java.util.HashSet;
import com.google.inject.TypeLiteral; import java.util.List;
import java.util.Locale;
import java.util.SimpleTimeZone;
import org.jclouds.http.HttpResponse; import org.jclouds.http.HttpResponse;
import org.jclouds.http.functions.UnwrapOnlyJsonValue; import org.jclouds.http.functions.UnwrapOnlyJsonValue;
import org.jclouds.io.Payloads; import org.jclouds.io.Payloads;
@ -35,17 +38,13 @@ import org.jclouds.openstack.nova.domain.Server;
import org.jclouds.openstack.nova.domain.ServerStatus; import org.jclouds.openstack.nova.domain.ServerStatus;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import java.io.InputStream; import com.google.common.collect.ImmutableList;
import java.net.URI; import com.google.common.collect.ImmutableMap;
import java.net.UnknownHostException; import com.google.common.collect.Iterables;
import java.text.ParseException; import com.google.inject.Guice;
import java.text.SimpleDateFormat; import com.google.inject.Injector;
import java.util.HashSet; import com.google.inject.Key;
import java.util.List; import com.google.inject.TypeLiteral;
import java.util.Locale;
import java.util.SimpleTimeZone;
import static org.testng.Assert.assertEquals;
/** /**
* Tests behavior of {@code ParseServerFromJsonResponse} for the transitional nova api 1.1 in the Diablo release * Tests behavior of {@code ParseServerFromJsonResponse} for the transitional nova api 1.1 in the Diablo release

View File

@ -18,22 +18,7 @@
*/ */
package org.jclouds.openstack.nova.functions; package org.jclouds.openstack.nova.functions;
import com.google.common.collect.ImmutableList; import static org.testng.Assert.assertEquals;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.inject.TypeLiteral;
import org.jclouds.http.HttpResponse;
import org.jclouds.http.functions.UnwrapOnlyJsonValue;
import org.jclouds.io.Payloads;
import org.jclouds.json.config.GsonModule;
import org.jclouds.openstack.nova.domain.Address;
import org.jclouds.openstack.nova.domain.Addresses;
import org.jclouds.openstack.nova.domain.Server;
import org.jclouds.openstack.nova.domain.ServerStatus;
import org.testng.annotations.Test;
import java.io.InputStream; import java.io.InputStream;
import java.net.UnknownHostException; import java.net.UnknownHostException;
@ -44,7 +29,23 @@ import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.SimpleTimeZone; import java.util.SimpleTimeZone;
import static org.testng.Assert.assertEquals; import org.jclouds.http.HttpResponse;
import org.jclouds.http.functions.UnwrapOnlyJsonValue;
import org.jclouds.io.Payloads;
import org.jclouds.json.config.GsonModule;
import org.jclouds.openstack.nova.domain.Address;
import org.jclouds.openstack.nova.domain.Addresses;
import org.jclouds.openstack.nova.domain.Server;
import org.jclouds.openstack.nova.domain.ServerStatus;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.inject.TypeLiteral;
/** /**
* Tests behavior of {@code ParseServerFromJsonResponse} * Tests behavior of {@code ParseServerFromJsonResponse}

View File

@ -70,6 +70,7 @@ import org.jclouds.compute.options.TemplateOptions;
import org.jclouds.domain.Credentials; import org.jclouds.domain.Credentials;
import org.jclouds.domain.Location; import org.jclouds.domain.Location;
import org.jclouds.domain.LocationScope; import org.jclouds.domain.LocationScope;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.logging.slf4j.config.SLF4JLoggingModule; import org.jclouds.logging.slf4j.config.SLF4JLoggingModule;
import org.jclouds.rest.AuthorizationException; import org.jclouds.rest.AuthorizationException;
import org.jclouds.scriptbuilder.domain.Statements; import org.jclouds.scriptbuilder.domain.Statements;
@ -85,7 +86,7 @@ import com.google.inject.Module;
/** /**
* Generally disabled, as it incurs higher fees. * Generally disabled, as it incurs higher fees.
* *
* @author Adrian Cole * @author Adrian Cole
*/ */
@Test(groups = "novalive", enabled = true, sequential = true) @Test(groups = "novalive", enabled = true, sequential = true)
@ -93,27 +94,25 @@ public class NovaComputeServiceLiveTest extends ComputeBase {
private static String group = "compute service test group"; private static String group = "compute service test group";
protected void checkNodes(Iterable<? extends NodeMetadata> nodes, String tag) throws IOException { protected void checkNodes(Iterable<? extends NodeMetadata> nodes, String tag) throws IOException {
for (NodeMetadata node : nodes) { for (NodeMetadata node : nodes) {
assertNotNull(node.getProviderId()); assertNotNull(node.getProviderId());
assertNotNull(node.getGroup()); assertNotNull(node.getGroup());
assertEquals(node.getGroup(), group); assertEquals(node.getGroup(), group);
//assertEquals(node.getState(), NodeState.RUNNING); // assertEquals(node.getState(), NodeState.RUNNING);
Credentials fromStore = context.getCredentialStore().get("node#" + node.getId()); Credentials fromStore = context.getCredentialStore().get("node#" + node.getId());
assertEquals(fromStore, node.getCredentials()); assertEquals(fromStore, node.getCredentials());
assert node.getPublicAddresses().size() >= 1 || node.getPrivateAddresses().size() >= 1 : "no ips in" + node; assert node.getPublicAddresses().size() >= 1 || node.getPrivateAddresses().size() >= 1 : "no ips in" + node;
// assertNotNull(node.getCredentials()); // assertNotNull(node.getCredentials());
// if (node.getCredentials().identity != null) { // if (node.getCredentials().identity != null) {
// assertNotNull(node.getCredentials().identity); // assertNotNull(node.getCredentials().identity);
// assertNotNull(node.getCredentials().credential); // assertNotNull(node.getCredentials().credential);
// doCheckJavaIsInstalledViaSsh(node); // doCheckJavaIsInstalledViaSsh(node);
// } // }
assertEquals(node.getLocation().getScope(), LocationScope.HOST); assertEquals(node.getLocation().getScope(), LocationScope.HOST);
} }
} }
@BeforeTest @BeforeTest
@Override @Override
public void before() throws IOException, ExecutionException, TimeoutException, InterruptedException { public void before() throws IOException, ExecutionException, TimeoutException, InterruptedException {
@ -128,8 +127,8 @@ public class NovaComputeServiceLiveTest extends ComputeBase {
properties.remove(provider + ".identity"); properties.remove(provider + ".identity");
ComputeServiceContext context = null; ComputeServiceContext context = null;
try { try {
context = new ComputeServiceContextFactory().createContext(provider, "MOMMA", "MIA", ImmutableSet context = new ComputeServiceContextFactory().createContext(provider, "MOMMA", "MIA",
.<Module>of(new SLF4JLoggingModule()), properties); ImmutableSet.<Module> of(new SLF4JLoggingModule()), properties);
context.getComputeService().listNodes(); context.getComputeService().listNodes();
} finally { } finally {
if (context != null) if (context != null)
@ -148,8 +147,8 @@ public class NovaComputeServiceLiveTest extends ComputeBase {
@Test(enabled = true, expectedExceptions = NoSuchElementException.class, timeOut = 60000) @Test(enabled = true, expectedExceptions = NoSuchElementException.class, timeOut = 60000)
public void testCorrectExceptionRunningNodesNotFound() throws Exception { public void testCorrectExceptionRunningNodesNotFound() throws Exception {
computeService.runScriptOnNodesMatching(runningInGroup("zebras-are-awesome"), buildScript(new OperatingSystem.Builder() computeService.runScriptOnNodesMatching(runningInGroup("zebras-are-awesome"),
.family(OsFamily.UBUNTU).description("ffoo").build())); buildScript(new OperatingSystem.Builder().family(OsFamily.UBUNTU).description("ffoo").build()));
} }
@Test(expectedExceptions = UserAuthException.class, timeOut = 240000) @Test(expectedExceptions = UserAuthException.class, timeOut = 240000)
@ -160,35 +159,38 @@ public class NovaComputeServiceLiveTest extends ComputeBase {
OperatingSystem os = node.getOperatingSystem(); OperatingSystem os = node.getOperatingSystem();
try { try {
@SuppressWarnings("unused") @SuppressWarnings("unused")
Map<? extends NodeMetadata, ExecResponse> responses = runJavaInstallationScriptWithCreds(group, os, new Credentials( Map<? extends NodeMetadata, ExecResponse> responses = runJavaInstallationScriptWithCreds(group, os,
"root", "romeo")); LoginCredentials.builder().user("root").password("romeo").build());
} catch (RunScriptOnNodesException e) { } catch (RunScriptOnNodesException e) {
throw e.getNodeErrors().values().iterator().next().getCause(); throw e.getNodeErrors().values().iterator().next().getCause();
} }
} }
@Test(timeOut = 240000) @Test(timeOut = 240000)
public void testScriptExecutionAfterBootWithBasicTemplate() throws InterruptedException, RunNodesException, RunScriptOnNodesException, URISyntaxException, IOException { public void testScriptExecutionAfterBootWithBasicTemplate() throws InterruptedException, RunNodesException,
RunScriptOnNodesException, URISyntaxException, IOException {
NodeMetadata node = getDefaultNodeImmediately(group); NodeMetadata node = getDefaultNodeImmediately(group);
String address = awaitForStartup(node.getId()); String address = awaitForStartup(node.getId());
awaitForSshPort(address, new Credentials("root", keyPair.get("private"))); awaitForSshPort(address, new Credentials("root", keyPair.get("private")));
for (Map.Entry<? extends NodeMetadata, ExecResponse> response : computeService.runScriptOnNodesMatching( for (Map.Entry<? extends NodeMetadata, ExecResponse> response : computeService.runScriptOnNodesMatching(
runningInGroup(group), Statements.exec("echo hello"), runningInGroup(group),
overrideCredentialsWith(new Credentials("root", keyPair.get("private"))).wrapInInitScript(false).runAsRoot(false)).entrySet()) Statements.exec("echo hello"),
assert response.getValue().getOutput().trim().equals("hello") : response.getKey() + ": " overrideCredentialsWith(LoginCredentials.builder().user("root").privateKey(keyPair.get("private")).build())
+ response.getValue(); .wrapInInitScript(false).runAsRoot(false)).entrySet())
assert response.getValue().getOutput().trim().equals("hello") : response.getKey() + ": " + response.getValue();
//TODO runJavaInstallationScriptWithCreds(group, os, new Credentials("root", keyPair.get("private"))); // TODO runJavaInstallationScriptWithCreds(group, os, new
//TODO no response? if os is null (ZYPPER) // Credentials("root", keyPair.get("private")));
// TODO no response? if os is null (ZYPPER)
node = computeService.getNodeMetadata(node.getId()); node = computeService.getNodeMetadata(node.getId());
checkNodes(Sets.newHashSet(node), group); checkNodes(Sets.newHashSet(node), group);
@SuppressWarnings("unused") @SuppressWarnings("unused")
Credentials good = node.getCredentials(); Credentials good = node.getCredentials();
//TODO check good is being private key .overrideCredentialsWith // TODO check good is being private key .overrideCredentialsWith
//TODO test for .blockOnPort // TODO test for .blockOnPort
} }
@Test(timeOut = 60000) @Test(timeOut = 60000)
@ -198,9 +200,9 @@ public class NovaComputeServiceLiveTest extends ComputeBase {
assertEquals(toMatch.getImage(), template.getImage()); assertEquals(toMatch.getImage(), template.getImage());
} }
// protected void checkHttpGet(NodeMetadata node) { // protected void checkHttpGet(NodeMetadata node) {
// ComputeTestUtils.checkHttpGet(context.utils().http(), node, 8080); // ComputeTestUtils.checkHttpGet(context.utils().http(), node, 8080);
// } // }
@Test(timeOut = 60000) @Test(timeOut = 60000)
public void testCreateTwoNodesWithRunScript() throws Exception { public void testCreateTwoNodesWithRunScript() throws Exception {
@ -219,18 +221,21 @@ public class NovaComputeServiceLiveTest extends ComputeBase {
assertLocationSameOrChild(node2.getLocation(), template.getLocation()); assertLocationSameOrChild(node2.getLocation(), template.getLocation());
assertEquals(node1.getImageId(), template.getImage().getId()); assertEquals(node1.getImageId(), template.getImage().getId());
assertEquals(node2.getImageId(), template.getImage().getId()); assertEquals(node2.getImageId(), template.getImage().getId());
// checkOsMatchesTemplate(node1); // checkOsMatchesTemplate(node1);
// checkOsMatchesTemplate(node2); // checkOsMatchesTemplate(node2);
//TODO add with script; // TODO add with script;
} }
// protected void checkOsMatchesTemplate(NodeMetadata node) { // protected void checkOsMatchesTemplate(NodeMetadata node) {
// if (node.getOperatingSystem() != null) // if (node.getOperatingSystem() != null)
// assert node.getOperatingSystem().getFamily().equals(getDefaultTemplateBuilder().build().getImage().getOperatingSystem().getFamily()) : String // assert
// .format("expecting family %s but got %s", getDefaultTemplateBuilder().build().getImage().getOperatingSystem().getFamily(), node // node.getOperatingSystem().getFamily().equals(getDefaultTemplateBuilder().build().getImage().getOperatingSystem().getFamily())
// .getOperatingSystem()); // : String
// } // .format("expecting family %s but got %s",
// getDefaultTemplateBuilder().build().getImage().getOperatingSystem().getFamily(),
// node
// .getOperatingSystem());
// }
@Test(timeOut = 60000) @Test(timeOut = 60000)
public void testCreateAnotherNodeWithNewContextToEnsureSharedMemIsntRequired() throws Exception { public void testCreateAnotherNodeWithNewContextToEnsureSharedMemIsntRequired() throws Exception {
@ -238,9 +243,9 @@ public class NovaComputeServiceLiveTest extends ComputeBase {
initializeContextAndComputeService(overrides); initializeContextAndComputeService(overrides);
NodeMetadata node = createDefaultNode(TemplateOptions.Builder.blockUntilRunning(true), group); NodeMetadata node = createDefaultNode(TemplateOptions.Builder.blockUntilRunning(true), group);
checkNodes(Sets.<NodeMetadata>newHashSet(node), group); checkNodes(Sets.<NodeMetadata> newHashSet(node), group);
assertLocationSameOrChild(node.getLocation(), getDefaultTemplateBuilder().build().getLocation()); assertLocationSameOrChild(node.getLocation(), getDefaultTemplateBuilder().build().getLocation());
// checkOsMatchesTemplate(node); // checkOsMatchesTemplate(node);
} }
@Test(timeOut = 60000) @Test(timeOut = 60000)
@ -254,14 +259,13 @@ public class NovaComputeServiceLiveTest extends ComputeBase {
assert (context.getCredentialStore().get("node#" + node.getId()) != null) : "credentials for " + node.getId(); assert (context.getCredentialStore().get("node#" + node.getId()) != null) : "credentials for " + node.getId();
} }
protected Map<? extends NodeMetadata, ExecResponse> runJavaInstallationScriptWithCreds(final String group, OperatingSystem os, protected Map<? extends NodeMetadata, ExecResponse> runJavaInstallationScriptWithCreds(final String group,
Credentials creds) throws RunScriptOnNodesException { OperatingSystem os, LoginCredentials creds) throws RunScriptOnNodesException {
return computeService.runScriptOnNodesMatching(runningInGroup(group), buildScript(os), overrideCredentialsWith(creds) return computeService.runScriptOnNodesMatching(runningInGroup(group), buildScript(os),
.nameTask("runJavaInstallationScriptWithCreds")); overrideCredentialsWith(creds).nameTask("runJavaInstallationScriptWithCreds"));
} }
protected Template buildTemplate(TemplateBuilder templateBuilder) { protected Template buildTemplate(TemplateBuilder templateBuilder) {
return templateBuilder.build(); return templateBuilder.build();
} }
@ -269,8 +273,8 @@ public class NovaComputeServiceLiveTest extends ComputeBase {
@Test(timeOut = 120000) @Test(timeOut = 120000)
public void testGetNodeMetadata() throws Exception { public void testGetNodeMetadata() throws Exception {
Set<NodeMetadata> nodes = Sets.newHashSet(getDefaultNodeImmediately(group)); Set<NodeMetadata> nodes = Sets.newHashSet(getDefaultNodeImmediately(group));
Map<String, ? extends NodeMetadata> metadataMap = newLinkedHashMap(uniqueIndex(filter(computeService Map<String, ? extends NodeMetadata> metadataMap = newLinkedHashMap(uniqueIndex(
.listNodesDetailsMatching(all()), and(inGroup(group), not(TERMINATED))), filter(computeService.listNodesDetailsMatching(all()), and(inGroup(group), not(TERMINATED))),
new Function<NodeMetadata, String>() { new Function<NodeMetadata, String>() {
@Override @Override
@ -288,7 +292,7 @@ public class NovaComputeServiceLiveTest extends ComputeBase {
assertEquals(nodeMetadata.getGroup(), node.getGroup()); assertEquals(nodeMetadata.getGroup(), node.getGroup());
assertLocationSameOrChild(nodeMetadata.getLocation(), getDefaultTemplateBuilder().build().getLocation()); assertLocationSameOrChild(nodeMetadata.getLocation(), getDefaultTemplateBuilder().build().getLocation());
assertEquals(nodeMetadata.getImageId(), getDefaultTemplateBuilder().build().getImage().getId()); assertEquals(nodeMetadata.getImageId(), getDefaultTemplateBuilder().build().getImage().getId());
// checkOsMatchesTemplate(metadata); // checkOsMatchesTemplate(metadata);
assertEquals(nodeMetadata.getState(), NodeState.RUNNING); assertEquals(nodeMetadata.getState(), NodeState.RUNNING);
// due to DHCP the addresses can actually change in-between runs. // due to DHCP the addresses can actually change in-between runs.
assertTrue(nodeMetadata.getPrivateAddresses().size() > 0); assertTrue(nodeMetadata.getPrivateAddresses().size() > 0);
@ -297,13 +301,11 @@ public class NovaComputeServiceLiveTest extends ComputeBase {
assertNodeZero(metadataMap.values(), nodes); assertNodeZero(metadataMap.values(), nodes);
} }
protected void assertNodeZero(Collection<? extends NodeMetadata> metadataSet, Set<NodeMetadata> nodes) { protected void assertNodeZero(Collection<? extends NodeMetadata> metadataSet, Set<NodeMetadata> nodes) {
assert metadataSet.size() == 0 : String.format("nodes left in set: [%s] which didn't match set: [%s]", assert metadataSet.size() == 0 : String.format("nodes left in set: [%s] which didn't match set: [%s]",
metadataSet, nodes); metadataSet, nodes);
} }
@Test(timeOut = 60000) @Test(timeOut = 60000)
public void testListNodes() throws Exception { public void testListNodes() throws Exception {
for (ComputeMetadata node : computeService.listNodes()) { for (ComputeMetadata node : computeService.listNodes()) {
@ -323,7 +325,8 @@ public class NovaComputeServiceLiveTest extends ComputeBase {
// nullable // nullable
// assert nodeMetadata.getImage() != null : node; // assert nodeMetadata.getImage() != null : node;
// user specified name is not always supported // user specified name is not always supported
// assert nodeMetadata.getName().parseGroupFromName() != null : nodeMetadata; // assert nodeMetadata.getName().parseGroupFromName() != null :
// nodeMetadata;
if (node.getState() == NodeState.RUNNING) { if (node.getState() == NodeState.RUNNING) {
assert node.getPublicAddresses() != null : node; assert node.getPublicAddresses() != null : node;
@ -344,15 +347,14 @@ public class NovaComputeServiceLiveTest extends ComputeBase {
} }
} }
@Test(timeOut = 60000) @Test(timeOut = 60000)
public void testCreateAndRunService() throws Exception { public void testCreateAndRunService() throws Exception {
@SuppressWarnings("unused") @SuppressWarnings("unused")
NodeMetadata node = getDefaultNodeImmediately(group); NodeMetadata node = getDefaultNodeImmediately(group);
//TODO .inboundPorts // TODO .inboundPorts
//checkHttpGet(node); // checkHttpGet(node);
} }
public void testListImages() throws Exception { public void testListImages() throws Exception {
for (Image image : computeService.listImages()) { for (Image image : computeService.listImages()) {
assert image.getProviderId() != null : image; assert image.getProviderId() != null : image;
@ -369,35 +371,37 @@ public class NovaComputeServiceLiveTest extends ComputeBase {
assert location != location.getParent() : location; assert location != location.getParent() : location;
assert location.getScope() != null : location; assert location.getScope() != null : location;
switch (location.getScope()) { switch (location.getScope()) {
case PROVIDER: case PROVIDER:
assertProvider(location); assertProvider(location);
break; break;
case REGION: case REGION:
assertProvider(location.getParent()); assertProvider(location.getParent());
break; break;
case ZONE: case ZONE:
Location provider = location.getParent().getParent(); Location provider = location.getParent().getParent();
// zone can be a direct descendant of provider // zone can be a direct descendant of provider
if (provider == null) if (provider == null)
provider = location.getParent(); provider = location.getParent();
assertProvider(provider); assertProvider(provider);
break; break;
case HOST: case HOST:
Location provider2 = location.getParent().getParent().getParent(); Location provider2 = location.getParent().getParent().getParent();
// zone can be a direct descendant of provider // zone can be a direct descendant of provider
if (provider2 == null) if (provider2 == null)
provider2 = location.getParent().getParent(); provider2 = location.getParent().getParent();
assertProvider(provider2); assertProvider(provider2);
break; break;
} }
} }
} }
public void testOptionToNotBlock() throws Exception { public void testOptionToNotBlock() throws Exception {
//TODO no inbound ports // TODO no inbound ports
//TemplateOptions options = computeService.templateOptions().blockUntilRunning(false).inboundPorts(); // TemplateOptions options =
// computeService.templateOptions().blockUntilRunning(false).inboundPorts();
long time = System.currentTimeMillis(); long time = System.currentTimeMillis();
NodeMetadata node = getOnlyElement(computeService.createNodesInGroup(group, 1, getDefaultTemplateBuilder().build())); NodeMetadata node = getOnlyElement(computeService.createNodesInGroup(group, 1, getDefaultTemplateBuilder()
.build()));
assert node.getState() != NodeState.RUNNING; assert node.getState() != NodeState.RUNNING;
long duration = System.currentTimeMillis() - time; long duration = System.currentTimeMillis() - time;
assert duration < 30 * 1000 : "duration longer than 30 seconds!: " + duration / 1000; assert duration < 30 * 1000 : "duration longer than 30 seconds!: " + duration / 1000;
@ -410,7 +414,7 @@ public class NovaComputeServiceLiveTest extends ComputeBase {
@Test(timeOut = 60000, enabled = false) @Test(timeOut = 60000, enabled = false)
public void testListHardwareProfiles() throws Exception { public void testListHardwareProfiles() throws Exception {
//TODO: failing, OpenStack returns a hardware with 0 CPU cores // TODO: failing, OpenStack returns a hardware with 0 CPU cores
for (Hardware hardware : computeService.listHardwareProfiles()) { for (Hardware hardware : computeService.listHardwareProfiles()) {
assert hardware.getProviderId() != null; assert hardware.getProviderId() != null;
assert getCores(hardware) > 0; assert getCores(hardware) > 0;
@ -420,7 +424,6 @@ public class NovaComputeServiceLiveTest extends ComputeBase {
} }
} }
@Test(timeOut = 60000) @Test(timeOut = 60000)
public void testCompareSizes() throws Exception { public void testCompareSizes() throws Exception {
TemplateBuilder templateBuilder = getDefaultTemplateBuilder(); TemplateBuilder templateBuilder = getDefaultTemplateBuilder();
@ -447,7 +450,6 @@ public class NovaComputeServiceLiveTest extends ComputeBase {
assert getCores(fastest) >= getCores(smallest); assert getCores(fastest) >= getCores(smallest);
} }
protected void doCheckJavaIsInstalledViaSsh(NodeMetadata node) throws IOException { protected void doCheckJavaIsInstalledViaSsh(NodeMetadata node) throws IOException {
SshClient ssh = context.utils().sshForNode().apply(node); SshClient ssh = context.utils().sshForNode().apply(node);

View File

@ -18,23 +18,31 @@
*/ */
package org.jclouds.openstack.nova.live.novaclient; package org.jclouds.openstack.nova.live.novaclient;
import com.google.common.collect.Iterables; import static org.jclouds.openstack.nova.options.ListOptions.Builder.withDetails;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertTrue;
import java.io.IOException;
import java.util.Set;
import org.jclouds.domain.Credentials; import org.jclouds.domain.Credentials;
import org.jclouds.http.HttpResponseException; import org.jclouds.http.HttpResponseException;
import org.jclouds.io.Payload; import org.jclouds.io.Payload;
import org.jclouds.net.IPSocket; import org.jclouds.net.IPSocket;
import org.jclouds.openstack.nova.domain.*; import org.jclouds.openstack.nova.domain.Flavor;
import org.jclouds.openstack.nova.domain.Image;
import org.jclouds.openstack.nova.domain.ImageStatus;
import org.jclouds.openstack.nova.domain.RebootType;
import org.jclouds.openstack.nova.domain.Server;
import org.jclouds.openstack.nova.domain.ServerStatus;
import org.jclouds.openstack.nova.options.RebuildServerOptions; import org.jclouds.openstack.nova.options.RebuildServerOptions;
import org.jclouds.ssh.SshClient; import org.jclouds.ssh.SshClient;
import org.jclouds.util.Strings2; import org.jclouds.util.Strings2;
import org.testng.annotations.AfterTest; import org.testng.annotations.AfterTest;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import java.io.IOException; import com.google.common.collect.Iterables;
import java.util.Set;
import static org.jclouds.openstack.nova.options.ListOptions.Builder.withDetails;
import static org.testng.Assert.*;
/** /**
* Tests behavior of {@code NovaClient} * Tests behavior of {@code NovaClient}

View File

@ -39,7 +39,8 @@
<test.vcloud.identity>FIXME</test.vcloud.identity> <test.vcloud.identity>FIXME</test.vcloud.identity>
<test.vcloud.credential>FIXME</test.vcloud.credential> <test.vcloud.credential>FIXME</test.vcloud.credential>
<test.vcloud.image-id></test.vcloud.image-id> <test.vcloud.image-id></test.vcloud.image-id>
<test.vcloud.login-user></test.vcloud.login-user> <test.vcloud.image.login-user></test.vcloud.image.login-user>
<test.vcloud.image.authenticate-sudo></test.vcloud.image.authenticate-sudo>
</properties> </properties>
<dependencies> <dependencies>
@ -108,7 +109,8 @@
<test.vcloud.identity>${test.vcloud.identity}</test.vcloud.identity> <test.vcloud.identity>${test.vcloud.identity}</test.vcloud.identity>
<test.vcloud.credential>${test.vcloud.credential}</test.vcloud.credential> <test.vcloud.credential>${test.vcloud.credential}</test.vcloud.credential>
<test.vcloud.image-id>${test.vcloud.image-id}</test.vcloud.image-id> <test.vcloud.image-id>${test.vcloud.image-id}</test.vcloud.image-id>
<test.vcloud.login-user>${test.vcloud.login-user}</test.vcloud.login-user> <test.vcloud.image.login-user>${test.vcloud.image.login-user}</test.vcloud.image.login-user>
<test.vcloud.image.authenticate-sudo>${test.vcloud.image.authenticate-sudo}</test.vcloud.image.authenticate-sudo>
</systemPropertyVariables> </systemPropertyVariables>
</configuration> </configuration>
</execution> </execution>

View File

@ -65,7 +65,7 @@ public class ImageForVAppTemplate implements Function<VAppTemplate, Image> {
builder.description(from.getDescription() != null ? from.getDescription() : from.getName()); builder.description(from.getDescription() != null ? from.getDescription() : from.getName());
Envelope ovf = client.getVAppTemplateClient().getOvfEnvelopeForVAppTemplate(from.getHref()); Envelope ovf = client.getVAppTemplateClient().getOvfEnvelopeForVAppTemplate(from.getHref());
builder.operatingSystem(CIMOperatingSystem.toComputeOs(ovf)); builder.operatingSystem(CIMOperatingSystem.toComputeOs(ovf));
builder.defaultCredentials(credentialsProvider.execute(from)); builder.defaultCredentials(credentialsProvider.apply(from));
return builder.build(); return builder.build();
} }

View File

@ -38,6 +38,7 @@ import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.compute.domain.NodeMetadataBuilder; import org.jclouds.compute.domain.NodeMetadataBuilder;
import org.jclouds.compute.domain.NodeState; import org.jclouds.compute.domain.NodeState;
import org.jclouds.domain.Credentials; import org.jclouds.domain.Credentials;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.logging.Logger; import org.jclouds.logging.Logger;
import org.jclouds.util.InetAddresses2.IsPrivateIPAddress; import org.jclouds.util.InetAddresses2.IsPrivateIPAddress;
import org.jclouds.vcloud.domain.Status; import org.jclouds.vcloud.domain.Status;
@ -80,11 +81,11 @@ public class VAppToNodeMetadata implements Function<VApp, NodeMetadata> {
Set<String> addresses = getIpsFromVApp(from); Set<String> addresses = getIpsFromVApp(from);
builder.publicAddresses(filter(addresses, not(IsPrivateIPAddress.INSTANCE))); builder.publicAddresses(filter(addresses, not(IsPrivateIPAddress.INSTANCE)));
builder.privateAddresses(filter(addresses, IsPrivateIPAddress.INSTANCE)); builder.privateAddresses(filter(addresses, IsPrivateIPAddress.INSTANCE));
builder.credentials(getCredentialsFrom(from));
Credentials fromApi = getCredentialsFrom(from); Credentials fromApi = getCredentialsFrom(from);
if (fromApi != null && !credentialStore.containsKey("node#" + from.getHref().toASCIIString())) if (fromApi != null && !credentialStore.containsKey("node#" + from.getHref().toASCIIString()))
credentialStore.put("node#" + from.getHref().toASCIIString(), fromApi); credentialStore.put("node#" + from.getHref().toASCIIString(), fromApi);
builder.credentials(credentialStore.get("node#" + from.getHref().toASCIIString())); builder.credentials(LoginCredentials.builder(credentialStore.get("node#" + from.getHref().toASCIIString()))
.build());
return builder.build(); return builder.build();
} }
} }

View File

@ -27,7 +27,7 @@ import javax.inject.Named;
import javax.inject.Singleton; import javax.inject.Singleton;
import org.jclouds.compute.strategy.impl.ReturnCredentialsBoundToImage; import org.jclouds.compute.strategy.impl.ReturnCredentialsBoundToImage;
import org.jclouds.domain.Credentials; import org.jclouds.domain.LoginCredentials;
import org.jclouds.javax.annotation.Nullable; import org.jclouds.javax.annotation.Nullable;
import org.jclouds.vcloud.domain.VAppTemplate; import org.jclouds.vcloud.domain.VAppTemplate;
@ -37,12 +37,12 @@ import org.jclouds.vcloud.domain.VAppTemplate;
@Singleton @Singleton
public class GetLoginCredentialsFromGuestConfiguration extends ReturnCredentialsBoundToImage { public class GetLoginCredentialsFromGuestConfiguration extends ReturnCredentialsBoundToImage {
@Inject @Inject
public GetLoginCredentialsFromGuestConfiguration(@Nullable @Named("image") Credentials creds) { public GetLoginCredentialsFromGuestConfiguration(@Nullable @Named("image") LoginCredentials creds) {
super(creds); super(creds);
} }
@Override @Override
public Credentials execute(Object resourceToAuthenticate) { public LoginCredentials apply(Object resourceToAuthenticate) {
if (creds != null) if (creds != null)
return creds; return creds;
checkNotNull(resourceToAuthenticate); checkNotNull(resourceToAuthenticate);

View File

@ -27,7 +27,7 @@ import org.jclouds.cim.ResourceAllocationSettingData;
import org.jclouds.cim.ResourceAllocationSettingData.ResourceType; import org.jclouds.cim.ResourceAllocationSettingData.ResourceType;
import org.jclouds.compute.domain.CIMOperatingSystem; import org.jclouds.compute.domain.CIMOperatingSystem;
import org.jclouds.compute.domain.OperatingSystem; import org.jclouds.compute.domain.OperatingSystem;
import org.jclouds.domain.Credentials; import org.jclouds.domain.LoginCredentials;
import org.jclouds.vcloud.domain.NetworkConnection; import org.jclouds.vcloud.domain.NetworkConnection;
import org.jclouds.vcloud.domain.VApp; import org.jclouds.vcloud.domain.VApp;
import org.jclouds.vcloud.domain.VAppTemplate; import org.jclouds.vcloud.domain.VAppTemplate;
@ -35,8 +35,8 @@ import org.jclouds.vcloud.domain.Vm;
import org.jclouds.vcloud.domain.ovf.VCloudNetworkAdapter; import org.jclouds.vcloud.domain.ovf.VCloudNetworkAdapter;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import com.google.common.collect.ImmutableSet.Builder; import com.google.common.collect.ImmutableSet.Builder;
import com.google.common.collect.Iterables;
/** /**
* *
@ -67,23 +67,23 @@ public class VCloudComputeUtils {
return null; return null;
} }
public static Credentials getCredentialsFrom(VApp vApp) { public static LoginCredentials getCredentialsFrom(VApp vApp) {
return vApp.getChildren().size() > 0 ? getCredentialsFrom(Iterables.get(vApp.getChildren(), 0)) : null; return vApp.getChildren().size() > 0 ? getCredentialsFrom(Iterables.get(vApp.getChildren(), 0)) : null;
} }
public static Credentials getCredentialsFrom(VAppTemplate vApp) { public static LoginCredentials getCredentialsFrom(VAppTemplate vApp) {
return vApp.getChildren().size() > 0 ? getCredentialsFrom(Iterables.get(vApp.getChildren(), 0)) : null; return vApp.getChildren().size() > 0 ? getCredentialsFrom(Iterables.get(vApp.getChildren(), 0)) : null;
} }
public static Credentials getCredentialsFrom(Vm vm) { public static LoginCredentials getCredentialsFrom(Vm vm) {
String user = "root"; LoginCredentials.Builder builder = LoginCredentials.builder();
builder.user("root");
if (vm.getOperatingSystemSection() != null && vm.getOperatingSystemSection().getDescription() != null if (vm.getOperatingSystemSection() != null && vm.getOperatingSystemSection().getDescription() != null
&& vm.getOperatingSystemSection().getDescription().indexOf("Windows") >= 0) && vm.getOperatingSystemSection().getDescription().indexOf("Windows") >= 0)
user = "Administrator"; builder.user("Administrator");
String password = null;
if (vm.getGuestCustomizationSection() != null) if (vm.getGuestCustomizationSection() != null)
password = vm.getGuestCustomizationSection().getAdminPassword(); builder.password(vm.getGuestCustomizationSection().getAdminPassword());
return new Credentials(user, password); return builder.build();
} }
public static Set<String> getIpsFromVApp(VApp vApp) { public static Set<String> getIpsFromVApp(VApp vApp) {

View File

@ -18,13 +18,10 @@
*/ */
package org.jclouds.vcloud.internal; package org.jclouds.vcloud.internal;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Properties; import java.util.Properties;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeoutException; import java.util.concurrent.TimeoutException;
import org.jclouds.Constants;
import org.jclouds.compute.BaseVersionedServiceLiveTest; import org.jclouds.compute.BaseVersionedServiceLiveTest;
import org.jclouds.compute.ComputeService; import org.jclouds.compute.ComputeService;
import org.jclouds.compute.ComputeServiceContextFactory; import org.jclouds.compute.ComputeServiceContextFactory;
@ -33,7 +30,6 @@ import org.jclouds.rest.RestContextFactory;
import org.jclouds.sshj.config.SshjSshClientModule; import org.jclouds.sshj.config.SshjSshClientModule;
import org.jclouds.vcloud.VCloudClient; import org.jclouds.vcloud.VCloudClient;
import org.testng.annotations.AfterGroups; import org.testng.annotations.AfterGroups;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeGroups; import org.testng.annotations.BeforeGroups;
import org.testng.annotations.Test; import org.testng.annotations.Test;

View File

@ -29,7 +29,6 @@ import java.util.Map.Entry;
import java.util.NoSuchElementException; import java.util.NoSuchElementException;
import java.util.Set; import java.util.Set;
import org.jclouds.javax.annotation.Nullable;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named; import javax.inject.Named;
@ -40,6 +39,8 @@ import org.jclouds.compute.domain.NodeState;
import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.compute.reference.ComputeServiceConstants;
import org.jclouds.compute.strategy.PopulateDefaultLoginCredentialsForImageStrategy; import org.jclouds.compute.strategy.PopulateDefaultLoginCredentialsForImageStrategy;
import org.jclouds.domain.Credentials; import org.jclouds.domain.Credentials;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.logging.Logger; import org.jclouds.logging.Logger;
import org.jclouds.trmk.vcloud_0_8.TerremarkVCloudClient; import org.jclouds.trmk.vcloud_0_8.TerremarkVCloudClient;
import org.jclouds.trmk.vcloud_0_8.domain.InternetService; import org.jclouds.trmk.vcloud_0_8.domain.InternetService;
@ -134,7 +135,7 @@ public class TerremarkVCloudComputeClient {
password = passwordGenerator.get(); password = passwordGenerator.get();
options.getProperties().put("password", password); options.getProperties().put("password", password);
} }
Credentials defaultCredentials = credentialsProvider.execute(template); LoginCredentials defaultCredentials = credentialsProvider.apply(template);
checkNotNull(options, "options"); checkNotNull(options, "options");
logger.debug(">> instantiating vApp vDC(%s) template(%s) name(%s) options(%s) ", VDC, templateId, name, options); logger.debug(">> instantiating vApp vDC(%s) template(%s) name(%s) options(%s) ", VDC, templateId, name, options);

View File

@ -31,7 +31,7 @@ import javax.inject.Singleton;
import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.compute.reference.ComputeServiceConstants;
import org.jclouds.compute.strategy.impl.ReturnCredentialsBoundToImage; import org.jclouds.compute.strategy.impl.ReturnCredentialsBoundToImage;
import org.jclouds.domain.Credentials; import org.jclouds.domain.LoginCredentials;
import org.jclouds.javax.annotation.Nullable; import org.jclouds.javax.annotation.Nullable;
import org.jclouds.logging.Logger; import org.jclouds.logging.Logger;
import org.jclouds.trmk.vcloud_0_8.domain.VAppTemplate; import org.jclouds.trmk.vcloud_0_8.domain.VAppTemplate;
@ -42,7 +42,7 @@ import org.jclouds.trmk.vcloud_0_8.domain.VAppTemplate;
@Singleton @Singleton
public class ParseVAppTemplateDescriptionToGetDefaultLoginCredentials extends ReturnCredentialsBoundToImage { public class ParseVAppTemplateDescriptionToGetDefaultLoginCredentials extends ReturnCredentialsBoundToImage {
@Inject @Inject
public ParseVAppTemplateDescriptionToGetDefaultLoginCredentials(@Nullable @Named("image") Credentials creds) { public ParseVAppTemplateDescriptionToGetDefaultLoginCredentials(@Nullable @Named("image") LoginCredentials creds) {
super(creds); super(creds);
} }
@ -54,7 +54,7 @@ public class ParseVAppTemplateDescriptionToGetDefaultLoginCredentials extends Re
.compile(".*[Uu]sername: ([a-z]+) ?.*\n[Pp]assword: ([^ \n\r]+) ?\r?\n.*"); .compile(".*[Uu]sername: ([a-z]+) ?.*\n[Pp]assword: ([^ \n\r]+) ?\r?\n.*");
@Override @Override
public Credentials execute(Object resourceToAuthenticate) { public LoginCredentials apply(Object resourceToAuthenticate) {
if (creds != null) if (creds != null)
return creds; return creds;
checkNotNull(resourceToAuthenticate); checkNotNull(resourceToAuthenticate);
@ -62,11 +62,11 @@ public class ParseVAppTemplateDescriptionToGetDefaultLoginCredentials extends Re
VAppTemplate template = (VAppTemplate) resourceToAuthenticate; VAppTemplate template = (VAppTemplate) resourceToAuthenticate;
String search = template.getDescription() != null ? template.getDescription() : template.getName(); String search = template.getDescription() != null ? template.getDescription() : template.getName();
if (search.indexOf("Windows") >= 0) { if (search.indexOf("Windows") >= 0) {
return new Credentials("Administrator", null); return LoginCredentials.builder().user("Administrator").build();
} else { } else {
Matcher matcher = USER_PASSWORD_PATTERN.matcher(search); Matcher matcher = USER_PASSWORD_PATTERN.matcher(search);
if (matcher.find()) { if (matcher.find()) {
return new Credentials(matcher.group(1), matcher.group(2)); return LoginCredentials.builder().user(matcher.group(1)).password(matcher.group(2)).build();
} else { } else {
logger.warn("could not parse username/password for image: " + template.getHref() + "\n" + search); logger.warn("could not parse username/password for image: " + template.getHref() + "\n" + search);
return null; return null;

View File

@ -18,8 +18,6 @@
*/ */
package org.jclouds.trmk.vcloud_0_8.internal; package org.jclouds.trmk.vcloud_0_8.internal;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Properties; import java.util.Properties;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;

View File

@ -21,7 +21,7 @@ package org.jclouds.compute;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import org.jclouds.compute.domain.Template; import org.jclouds.compute.domain.Template;
import org.jclouds.domain.Credentials; import org.jclouds.domain.LoginCredentials;
import org.jclouds.javax.annotation.Nullable; import org.jclouds.javax.annotation.Nullable;
/** /**
@ -66,9 +66,9 @@ public interface ComputeServiceAdapter<N, H, I, L> {
public static class NodeAndInitialCredentials<N> { public static class NodeAndInitialCredentials<N> {
private final N node; private final N node;
private final String nodeId; private final String nodeId;
private final Credentials credentials; private final LoginCredentials credentials;
public NodeAndInitialCredentials(N node, String nodeId, @Nullable Credentials credentials) { public NodeAndInitialCredentials(N node, String nodeId, @Nullable LoginCredentials credentials) {
this.node = checkNotNull(node, "node"); this.node = checkNotNull(node, "node");
this.nodeId = checkNotNull(nodeId, "nodeId"); this.nodeId = checkNotNull(nodeId, "nodeId");
this.credentials = credentials; this.credentials = credentials;
@ -96,7 +96,7 @@ public interface ComputeServiceAdapter<N, H, I, L> {
* information is not available * information is not available
*/ */
@Nullable @Nullable
public Credentials getCredentials() { public LoginCredentials getCredentials() {
return credentials; return credentials;
} }
} }

View File

@ -31,6 +31,7 @@ import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.compute.domain.NodeMetadataBuilder; import org.jclouds.compute.domain.NodeMetadataBuilder;
import org.jclouds.compute.options.RunScriptOptions; import org.jclouds.compute.options.RunScriptOptions;
import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.compute.reference.ComputeServiceConstants;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.logging.Logger; import org.jclouds.logging.Logger;
import org.jclouds.scriptbuilder.InitBuilder; import org.jclouds.scriptbuilder.InitBuilder;
import org.jclouds.scriptbuilder.domain.AdminAccessVisitor; import org.jclouds.scriptbuilder.domain.AdminAccessVisitor;
@ -106,8 +107,8 @@ public class RunScriptOnNodeAsInitScriptUsingSsh extends SudoAwareInitManager im
if (input.getAdminCredentials() != null && input.shouldGrantSudoToAdminUser()) { if (input.getAdminCredentials() != null && input.shouldGrantSudoToAdminUser()) {
ssh.disconnect(); ssh.disconnect();
logger.debug(">> reconnecting as %s@%s", input.getAdminCredentials().identity, ssh.getHostAddress()); logger.debug(">> reconnecting as %s@%s", input.getAdminCredentials().identity, ssh.getHostAddress());
ssh = sshFactory.apply(node = NodeMetadataBuilder.fromNodeMetadata(node).adminPassword(null).credentials( ssh = sshFactory.apply(node = NodeMetadataBuilder.fromNodeMetadata(node).credentials(LoginCredentials.builder(
input.getAdminCredentials()).build()); input.getAdminCredentials()).build()).build());
ssh.connect(); ssh.connect();
setupLinkToInitFile(); setupLinkToInitFile();
} }

View File

@ -59,7 +59,7 @@ public class RunScriptOnNodeUsingSsh implements RunScriptOnNode {
@AssistedInject @AssistedInject
public RunScriptOnNodeUsingSsh(Function<NodeMetadata, SshClient> sshFactory, @Assisted NodeMetadata node, public RunScriptOnNodeUsingSsh(Function<NodeMetadata, SshClient> sshFactory, @Assisted NodeMetadata node,
@Assisted Statement statement, @Assisted RunScriptOptions options) { @Assisted Statement statement, @Assisted RunScriptOptions options) {
this.sshFactory = checkNotNull(sshFactory, "sshFactory"); this.sshFactory = checkNotNull(sshFactory, "sshFactory");
this.node = checkNotNull(node, "node"); this.node = checkNotNull(node, "node");
this.statement = checkNotNull(statement, "statement"); this.statement = checkNotNull(statement, "statement");
@ -73,7 +73,7 @@ public class RunScriptOnNodeUsingSsh implements RunScriptOnNode {
ssh.connect(); ssh.connect();
ExecResponse returnVal; ExecResponse returnVal;
String command = (runAsRoot) ? execAsRoot(statement.render(OsFamily.UNIX)) : execScriptAsDefaultUser(statement String command = (runAsRoot) ? execAsRoot(statement.render(OsFamily.UNIX)) : execScriptAsDefaultUser(statement
.render(OsFamily.UNIX)); .render(OsFamily.UNIX));
returnVal = runCommand(command); returnVal = runCommand(command);
if (logger.isTraceEnabled()) if (logger.isTraceEnabled())
logger.trace("<< %s[%s]", statement, returnVal); logger.trace("<< %s[%s]", statement, returnVal);
@ -94,8 +94,8 @@ public class RunScriptOnNodeUsingSsh implements RunScriptOnNode {
protected ExecResponse runCommand(String command) { protected ExecResponse runCommand(String command) {
ExecResponse returnVal; ExecResponse returnVal;
logger.debug(">> running [%s] as %s@%s", command.replace(node.getAdminPassword() != null ? node logger.debug(">> running [%s] as %s@%s", command.replace(node.getCredentials().getPassword() != null ? node
.getAdminPassword() : "XXXXX", "XXXXX"), ssh.getUsername(), ssh.getHostAddress()); .getCredentials().getPassword() : "XXXXX", "XXXXX"), ssh.getUsername(), ssh.getHostAddress());
returnVal = ssh.exec(command); returnVal = ssh.exec(command);
return returnVal; return returnVal;
} }
@ -103,10 +103,10 @@ public class RunScriptOnNodeUsingSsh implements RunScriptOnNode {
@VisibleForTesting @VisibleForTesting
public String execAsRoot(String command) { public String execAsRoot(String command) {
if (node.getCredentials().identity.equals("root")) { if (node.getCredentials().identity.equals("root")) {
} else if (node.getAdminPassword() != null) { } else if (node.getCredentials().shouldAuthenticateSudo()) {
command = String.format("sudo -S sh <<'%s'\n%s\n%s%s\n", MARKER, node.getAdminPassword(), command, MARKER); command = String.format("sudo -S sh <<'%s'\n%s\n%s%s\n", MARKER, node.getCredentials().getPassword(), command, MARKER);
} else { } else {
command = String.format("sudo sh <<'%s'\n%s%s\n", MARKER, command, MARKER); command = String.format("sudo sh <<'%s'\n%s%s\n", MARKER, command, MARKER);
} }
return command; return command;
} }
@ -122,7 +122,7 @@ public class RunScriptOnNodeUsingSsh implements RunScriptOnNode {
@Override @Override
public String toString() { public String toString() {
return Objects.toStringHelper(this).add("node", node).add("name", statement).add("runAsRoot", runAsRoot) return Objects.toStringHelper(this).add("node", node).add("name", statement).add("runAsRoot", runAsRoot)
.toString(); .toString();
} }
@Override @Override

View File

@ -54,7 +54,7 @@ public class SudoAwareInitManager {
protected SshClient ssh; protected SshClient ssh;
public SudoAwareInitManager(Function<NodeMetadata, SshClient> sshFactory, boolean runAsRoot, NodeMetadata node, public SudoAwareInitManager(Function<NodeMetadata, SshClient> sshFactory, boolean runAsRoot, NodeMetadata node,
InitBuilder init) { InitBuilder init) {
this.sshFactory = checkNotNull(sshFactory, "sshFactory"); this.sshFactory = checkNotNull(sshFactory, "sshFactory");
this.runAsRoot = runAsRoot; this.runAsRoot = runAsRoot;
this.node = checkNotNull(node, "node"); this.node = checkNotNull(node, "node");
@ -81,7 +81,7 @@ public class SudoAwareInitManager {
public ExecResponse runAction(String action) { public ExecResponse runAction(String action) {
ExecResponse returnVal; ExecResponse returnVal;
String command = (runAsRoot && Predicates.in(ImmutableSet.of("start", "stop", "run")).apply(action)) ? execScriptAsRoot(action) String command = (runAsRoot && Predicates.in(ImmutableSet.of("start", "stop", "run")).apply(action)) ? execScriptAsRoot(action)
: execScriptAsDefaultUser(action); : execScriptAsDefaultUser(action);
returnVal = runCommand(command); returnVal = runCommand(command);
if ("status".equals(action)) if ("status".equals(action))
logger.trace("<< %s(%d)", action, returnVal.getExitCode()); logger.trace("<< %s(%d)", action, returnVal.getExitCode());
@ -94,8 +94,8 @@ public class SudoAwareInitManager {
ExecResponse runCommand(String command) { ExecResponse runCommand(String command) {
String statement = String.format(">> running [%s] as %s@%s", command.replace( String statement = String.format(">> running [%s] as %s@%s", command.replace(
node.getAdminPassword() != null ? node.getAdminPassword() : "XXXXX", "XXXXX"), ssh.getUsername(), ssh node.getCredentials().getPassword() != null ? node.getCredentials().getPassword() : "XXXXX", "XXXXX"), ssh
.getHostAddress()); .getUsername(), ssh.getHostAddress());
if (command.endsWith("status")) if (command.endsWith("status"))
logger.trace(statement); logger.trace(statement);
else else
@ -108,8 +108,9 @@ public class SudoAwareInitManager {
String command; String command;
if (node.getCredentials().identity.equals("root")) { if (node.getCredentials().identity.equals("root")) {
command = "./" + init.getInstanceName() + " " + action; command = "./" + init.getInstanceName() + " " + action;
} else if (node.getAdminPassword() != null) { } else if (node.getCredentials().shouldAuthenticateSudo()) {
command = String.format("echo '%s'|sudo -S ./%s %s", node.getAdminPassword(), init.getInstanceName(), action); command = String.format("echo '%s'|sudo -S ./%s %s", node.getCredentials().getPassword(),
init.getInstanceName(), action);
} else { } else {
command = "sudo ./" + init.getInstanceName() + " " + action; command = "sudo ./" + init.getInstanceName() + " " + action;
} }
@ -126,8 +127,8 @@ public class SudoAwareInitManager {
@Override @Override
public String toString() { public String toString() {
return Objects.toStringHelper(this).add("node", node).add("name", init.getInstanceName()).add("runAsRoot", return Objects.toStringHelper(this).add("node", node).add("name", init.getInstanceName())
runAsRoot).toString(); .add("runAsRoot", runAsRoot).toString();
} }
public InitBuilder getStatement() { public InitBuilder getStatement() {

View File

@ -52,7 +52,7 @@ import org.jclouds.compute.reference.ComputeServiceConstants;
import org.jclouds.compute.strategy.CustomizeNodeAndAddToGoodMapOrPutExceptionIntoBadMap; import org.jclouds.compute.strategy.CustomizeNodeAndAddToGoodMapOrPutExceptionIntoBadMap;
import org.jclouds.compute.strategy.InitializeRunScriptOnNodeOrPlaceInBadMap; import org.jclouds.compute.strategy.InitializeRunScriptOnNodeOrPlaceInBadMap;
import org.jclouds.config.ValueOfConfigurationKeyOrNull; import org.jclouds.config.ValueOfConfigurationKeyOrNull;
import org.jclouds.domain.Credentials; import org.jclouds.domain.LoginCredentials;
import org.jclouds.json.Json; import org.jclouds.json.Json;
import org.jclouds.location.Provider; import org.jclouds.location.Provider;
import org.jclouds.location.config.LocationModule; import org.jclouds.location.config.LocationModule;
@ -87,9 +87,9 @@ public abstract class BaseComputeServiceContextModule extends AbstractModule {
}).to(CreateSshClientOncePortIsListeningOnNode.class); }).to(CreateSshClientOncePortIsListeningOnNode.class);
bind(new TypeLiteral<Function<TemplateOptions, Statement>>() { bind(new TypeLiteral<Function<TemplateOptions, Statement>>() {
}).to(TemplateOptionsToStatement.class); }).to(TemplateOptionsToStatement.class);
bind(Credentials.class).annotatedWith(Names.named("image")).toProvider( bind(LoginCredentials.class).annotatedWith(Names.named("image")).toProvider(
GetLoginForProviderFromPropertiesAndStoreCredentialsOrReturnNull.class); GetLoginForProviderFromPropertiesAndStoreCredentialsOrReturnNull.class);
bind(new TypeLiteral<Function<Template, Credentials>>() { bind(new TypeLiteral<Function<Template, LoginCredentials>>() {
}).to(DefaultCredentialsFromImageOrOverridingCredentials.class); }).to(DefaultCredentialsFromImageOrOverridingCredentials.class);
install(new FactoryModuleBuilder() install(new FactoryModuleBuilder()

View File

@ -39,8 +39,8 @@ import org.jclouds.compute.strategy.RebootNodeStrategy;
import org.jclouds.compute.strategy.ResumeNodeStrategy; import org.jclouds.compute.strategy.ResumeNodeStrategy;
import org.jclouds.compute.strategy.SuspendNodeStrategy; import org.jclouds.compute.strategy.SuspendNodeStrategy;
import org.jclouds.compute.strategy.impl.AdaptingComputeServiceStrategies; import org.jclouds.compute.strategy.impl.AdaptingComputeServiceStrategies;
import org.jclouds.domain.Credentials;
import org.jclouds.domain.Location; import org.jclouds.domain.Location;
import org.jclouds.domain.LoginCredentials;
import com.google.common.base.Function; import com.google.common.base.Function;
import com.google.common.base.Functions; import com.google.common.base.Functions;
@ -126,7 +126,7 @@ public class ComputeServiceAdapterContextModule<S, A, N, H, I, L> extends BaseCo
@Override @Override
public Image apply(Image arg0) { public Image apply(Image arg0) {
Credentials credentials = credsForImage.execute(arg0); LoginCredentials credentials = credsForImage.apply(arg0);
return credentials != null ? ImageBuilder.fromImage(arg0).defaultCredentials(credentials).build() : arg0; return credentials != null ? ImageBuilder.fromImage(arg0).defaultCredentials(credentials).build() : arg0;
} }

View File

@ -26,6 +26,8 @@ import javax.inject.Singleton;
import org.jclouds.config.ValueOfConfigurationKeyOrNull; import org.jclouds.config.ValueOfConfigurationKeyOrNull;
import org.jclouds.domain.Credentials; import org.jclouds.domain.Credentials;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.domain.LoginCredentials.Builder;
import org.jclouds.javax.annotation.Nullable; import org.jclouds.javax.annotation.Nullable;
import org.jclouds.location.Provider; import org.jclouds.location.Provider;
@ -36,7 +38,7 @@ import com.google.inject.Inject;
*/ */
@Singleton @Singleton
public class GetLoginForProviderFromPropertiesAndStoreCredentialsOrReturnNull implements public class GetLoginForProviderFromPropertiesAndStoreCredentialsOrReturnNull implements
javax.inject.Provider<Credentials> { javax.inject.Provider<LoginCredentials> {
private final ValueOfConfigurationKeyOrNull config; private final ValueOfConfigurationKeyOrNull config;
private final String provider; private final String provider;
private final Map<String, Credentials> credentialStore; private final Map<String, Credentials> credentialStore;
@ -51,22 +53,33 @@ public class GetLoginForProviderFromPropertiesAndStoreCredentialsOrReturnNull im
@Override @Override
@Nullable @Nullable
public Credentials get() { public LoginCredentials get() {
if (credentialStore.containsKey("image")) if (credentialStore.containsKey("image")) {
return credentialStore.get("image"); return LoginCredentials.builder(credentialStore.get("image")).build();
Credentials creds = null; }
String loginUser = config.apply(provider + ".login-user"); Builder builder = LoginCredentials.builder();
String loginUser = config.apply(provider + ".image.login-user");
if (loginUser == null) if (loginUser == null)
loginUser = config.apply("jclouds.login-user"); loginUser = config.apply("jclouds.image.login-user");
if (loginUser != null) { if (loginUser != null) {
int pos = loginUser.indexOf(':'); int pos = loginUser.indexOf(':');
if (pos != -1) { if (pos != -1) {
creds = new Credentials(loginUser.substring(0, pos), loginUser.substring(pos + 1)); builder.user(loginUser.substring(0, pos)).password(loginUser.substring(pos + 1));
} else } else
creds = new Credentials(loginUser, null); builder.user(loginUser);
credentialStore.put("image", creds);
} }
String authenticateSudo = config.apply(provider + ".image.authenticate-sudo");
if (authenticateSudo == null)
authenticateSudo = config.apply("jclouds.image.authenticate-sudo");
if (authenticateSudo != null) {
builder.authenticateSudo(Boolean.valueOf(authenticateSudo));
}
LoginCredentials creds = builder.build();
if (creds != null)
credentialStore.put("image", creds);
return creds; return creds;
} }
} }

View File

@ -20,12 +20,12 @@ package org.jclouds.compute.config;
import java.util.Map; import java.util.Map;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.compute.domain.NodeMetadataBuilder; import org.jclouds.compute.domain.NodeMetadataBuilder;
import org.jclouds.compute.internal.PersistNodeCredentials; import org.jclouds.compute.internal.PersistNodeCredentials;
import org.jclouds.domain.Credentials; import org.jclouds.domain.Credentials;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.scriptbuilder.domain.Statement; import org.jclouds.scriptbuilder.domain.Statement;
import org.jclouds.scriptbuilder.functions.CredentialsFromAdminAccess; import org.jclouds.scriptbuilder.functions.CredentialsFromAdminAccess;
@ -60,7 +60,8 @@ public class PersistNodeCredentialsModule extends AbstractModule {
return input; return input;
Credentials credentials = CredentialsFromAdminAccess.INSTANCE.apply(statement); Credentials credentials = CredentialsFromAdminAccess.INSTANCE.apply(statement);
if (credentials != null) { if (credentials != null) {
input = NodeMetadataBuilder.fromNodeMetadata(input).credentials(credentials).build(); LoginCredentials creds = LoginCredentials.builder(credentials).build();
input = NodeMetadataBuilder.fromNodeMetadata(input).credentials(creds).build();
credentialStore.put("node#" + input.getId(), input.getCredentials()); credentialStore.put("node#" + input.getId(), input.getCredentials());
} }
return input; return input;

View File

@ -18,10 +18,9 @@
*/ */
package org.jclouds.compute.domain; package org.jclouds.compute.domain;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.compute.domain.internal.ImageImpl; import org.jclouds.compute.domain.internal.ImageImpl;
import org.jclouds.domain.Credentials; import org.jclouds.domain.LoginCredentials;
import org.jclouds.javax.annotation.Nullable;
import com.google.common.annotations.Beta; import com.google.common.annotations.Beta;
import com.google.inject.ImplementedBy; import com.google.inject.ImplementedBy;
@ -50,19 +49,24 @@ public interface Image extends ComputeMetadata {
String getDescription(); String getDescription();
/** /**
* <h4>will be removed in jclouds 1.4.0</h4>
*
* secures access to root with a password. This password is required to access either the console * secures access to root with a password. This password is required to access either the console
* or run sudo as root. * or run sudo as root.
* <p/> * <p/>
* ex. {@code echo 'password' |sudo -S command} * ex. {@code echo 'password' |sudo -S command}
* *
*
* @return root or console password, if configured, or null. * @return root or console password, if configured, or null.
* @see LoginCredentials#shouldAuthenticateSudo
*/ */
@Nullable @Nullable
@Deprecated
String getAdminPassword(); String getAdminPassword();
/** /**
* Default credentials for the current image * Default credentials for the current image
*/ */
Credentials getDefaultCredentials(); LoginCredentials getDefaultCredentials();
} }

View File

@ -23,11 +23,12 @@ import static com.google.common.base.Preconditions.checkNotNull;
import java.net.URI; import java.net.URI;
import java.util.Map; import java.util.Map;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.compute.domain.internal.ImageImpl; import org.jclouds.compute.domain.internal.ImageImpl;
import org.jclouds.domain.Credentials; import org.jclouds.domain.Credentials;
import org.jclouds.domain.Location; import org.jclouds.domain.Location;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.domain.LoginCredentials.Builder;
import org.jclouds.javax.annotation.Nullable;
/** /**
* @author Adrian Cole * @author Adrian Cole
@ -36,9 +37,7 @@ public class ImageBuilder extends ComputeMetadataBuilder {
private OperatingSystem operatingSystem; private OperatingSystem operatingSystem;
private String version; private String version;
private String description; private String description;
@Nullable private LoginCredentials defaultLoginCredentials;
private String adminPassword;
private Credentials defaultCredentials;
public ImageBuilder() { public ImageBuilder() {
super(ComputeType.IMAGE); super(ComputeType.IMAGE);
@ -59,13 +58,30 @@ public class ImageBuilder extends ComputeMetadataBuilder {
return this; return this;
} }
/**
* <h4>will be removed in jclouds 1.4.0</h4>
*
* @see LoginCredentials#shouldAuthenticateSudo
*/
@Deprecated
public ImageBuilder adminPassword(@Nullable String adminPassword) { public ImageBuilder adminPassword(@Nullable String adminPassword) {
this.adminPassword = adminPassword; if (adminPassword != null) {
Builder builder = defaultLoginCredentials != null ? defaultLoginCredentials.toBuilder() : LoginCredentials
.builder();
builder.authenticateSudo(true);
builder.password(adminPassword);
this.defaultLoginCredentials = builder.build();
}
return this; return this;
} }
public ImageBuilder defaultCredentials(@Nullable Credentials defaultCredentials) { @Deprecated
this.defaultCredentials = defaultCredentials; public ImageBuilder defaultCredentials(@Nullable Credentials defaultLoginCredentials) {
return defaultCredentials(LoginCredentials.builder(defaultLoginCredentials).build());
}
public ImageBuilder defaultCredentials(@Nullable LoginCredentials defaultLoginCredentials) {
this.defaultLoginCredentials = defaultLoginCredentials;
return this; return this;
} }
@ -73,7 +89,7 @@ public class ImageBuilder extends ComputeMetadataBuilder {
public ImageBuilder id(String id) { public ImageBuilder id(String id) {
return ImageBuilder.class.cast(super.id(id)); return ImageBuilder.class.cast(super.id(id));
} }
public ImageBuilder tags(Iterable<String> tags) { public ImageBuilder tags(Iterable<String> tags) {
return ImageBuilder.class.cast(super.tags(tags)); return ImageBuilder.class.cast(super.tags(tags));
} }
@ -110,15 +126,15 @@ public class ImageBuilder extends ComputeMetadataBuilder {
@Override @Override
public Image build() { public Image build() {
return new ImageImpl(providerId, name, id, location, uri, userMetadata, tags, operatingSystem, description, version, return new ImageImpl(providerId, name, id, location, uri, userMetadata, tags, operatingSystem, description,
adminPassword, defaultCredentials); version, defaultLoginCredentials);
} }
public static ImageBuilder fromImage(Image image) { public static ImageBuilder fromImage(Image image) {
return new ImageBuilder().providerId(image.getProviderId()).name(image.getName()).id(image.getId()).location( return new ImageBuilder().providerId(image.getProviderId()).name(image.getName()).id(image.getId())
image.getLocation()).uri(image.getUri()).userMetadata(image.getUserMetadata()).tags(image.getTags()).version( .location(image.getLocation()).uri(image.getUri()).userMetadata(image.getUserMetadata())
image.getVersion()).description(image.getDescription()).operatingSystem(image.getOperatingSystem()) .tags(image.getTags()).version(image.getVersion()).description(image.getDescription())
.adminPassword(image.getAdminPassword()).defaultCredentials(image.getDefaultCredentials()); .operatingSystem(image.getOperatingSystem()).defaultCredentials(image.getDefaultCredentials());
} }
} }

View File

@ -20,10 +20,9 @@ package org.jclouds.compute.domain;
import java.util.Set; import java.util.Set;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.compute.domain.internal.NodeMetadataImpl; import org.jclouds.compute.domain.internal.NodeMetadataImpl;
import org.jclouds.domain.Credentials; import org.jclouds.domain.LoginCredentials;
import org.jclouds.javax.annotation.Nullable;
import com.google.inject.ImplementedBy; import com.google.inject.ImplementedBy;
@ -92,21 +91,25 @@ public interface NodeMetadata extends ComputeMetadata {
int getLoginPort(); int getLoginPort();
/** /**
* <h4>will be removed in jclouds 1.4.0</h4>
*
* secures access to root with a password. This password is required to access either the console * secures access to root with a password. This password is required to access either the console
* or run sudo as root. * or run sudo as root.
* <p/> * <p/>
* ex. {@code echo 'password' |sudo -S command} * ex. {@code echo 'password' |sudo -S command}
* *
* @return root or console password, if configured, or null. * @return root or console password, if configured, or null.
* @see LoginCredentials#shouldAuthenticateSudo
*/ */
@Nullable @Nullable
@Deprecated
String getAdminPassword(); String getAdminPassword();
/** /**
* If possible, these are returned upon all detail requests. However, it is often the case that * If possible, these are returned upon all detail requests. However, it is often the case that
* credentials are only available at "run" time. * credentials are only available at "run" time.
*/ */
Credentials getCredentials(); LoginCredentials getCredentials();
/** /**
* All public IP addresses, potentially including shared ips. * All public IP addresses, potentially including shared ips.

View File

@ -29,6 +29,8 @@ import org.jclouds.javax.annotation.Nullable;
import org.jclouds.compute.domain.internal.NodeMetadataImpl; import org.jclouds.compute.domain.internal.NodeMetadataImpl;
import org.jclouds.domain.Credentials; import org.jclouds.domain.Credentials;
import org.jclouds.domain.Location; import org.jclouds.domain.Location;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.domain.LoginCredentials.Builder;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
@ -41,9 +43,7 @@ public class NodeMetadataBuilder extends ComputeMetadataBuilder {
private Set<String> publicAddresses = Sets.newLinkedHashSet(); private Set<String> publicAddresses = Sets.newLinkedHashSet();
private Set<String> privateAddresses = Sets.newLinkedHashSet(); private Set<String> privateAddresses = Sets.newLinkedHashSet();
@Nullable @Nullable
private String adminPassword; private LoginCredentials credentials;
@Nullable
private Credentials credentials;
@Nullable @Nullable
private String group; private String group;
private int loginPort = 22; private int loginPort = 22;
@ -80,15 +80,33 @@ public class NodeMetadataBuilder extends ComputeMetadataBuilder {
return this; return this;
} }
/**
* <h4>will be removed in jclouds 1.4.0</h4>
*
* @see LoginCredentials#shouldAuthenticateSudo
*/
@Deprecated
public NodeMetadataBuilder adminPassword(@Nullable String adminPassword) {
if (adminPassword != null) {
Builder builder = credentials != null ? credentials.toBuilder() : LoginCredentials
.builder();
builder.authenticateSudo(true);
builder.password(adminPassword);
this.credentials = builder.build();
}
return this;
}
@Deprecated
public NodeMetadataBuilder credentials(@Nullable Credentials credentials) { public NodeMetadataBuilder credentials(@Nullable Credentials credentials) {
return credentials(LoginCredentials.builder(credentials).build());
}
public NodeMetadataBuilder credentials(@Nullable LoginCredentials credentials) {
this.credentials = credentials; this.credentials = credentials;
return this; return this;
} }
public NodeMetadataBuilder adminPassword(@Nullable String adminPassword) {
this.adminPassword = adminPassword;
return this;
}
public NodeMetadataBuilder group(@Nullable String group) { public NodeMetadataBuilder group(@Nullable String group) {
this.group = group; this.group = group;
@ -158,7 +176,7 @@ public class NodeMetadataBuilder extends ComputeMetadataBuilder {
@Override @Override
public NodeMetadata build() { public NodeMetadata build() {
return new NodeMetadataImpl(providerId, name, id, location, uri, userMetadata, tags, group, hardware, imageId, return new NodeMetadataImpl(providerId, name, id, location, uri, userMetadata, tags, group, hardware, imageId,
os, state, loginPort, publicAddresses, privateAddresses, adminPassword, credentials, hostname); os, state, loginPort, publicAddresses, privateAddresses, credentials, hostname);
} }
public static NodeMetadataBuilder fromNodeMetadata(NodeMetadata node) { public static NodeMetadataBuilder fromNodeMetadata(NodeMetadata node) {
@ -166,8 +184,7 @@ public class NodeMetadataBuilder extends ComputeMetadataBuilder {
node.getLocation()).uri(node.getUri()).userMetadata(node.getUserMetadata()).tags(node.getTags()).group( node.getLocation()).uri(node.getUri()).userMetadata(node.getUserMetadata()).tags(node.getTags()).group(
node.getGroup()).hardware(node.getHardware()).imageId(node.getImageId()).operatingSystem( node.getGroup()).hardware(node.getHardware()).imageId(node.getImageId()).operatingSystem(
node.getOperatingSystem()).state(node.getState()).loginPort(node.getLoginPort()).publicAddresses( node.getOperatingSystem()).state(node.getState()).loginPort(node.getLoginPort()).publicAddresses(
node.getPublicAddresses()).privateAddresses(node.getPrivateAddresses()).adminPassword( node.getPublicAddresses()).privateAddresses(node.getPrivateAddresses()).credentials(node.getCredentials()).hostname(node.getHostname());
node.getAdminPassword()).credentials(node.getCredentials()).hostname(node.getHostname());
} }
} }

View File

@ -24,13 +24,14 @@ import java.net.URI;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.compute.domain.ComputeType; import org.jclouds.compute.domain.ComputeType;
import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.Image;
import org.jclouds.compute.domain.OperatingSystem; import org.jclouds.compute.domain.OperatingSystem;
import org.jclouds.domain.Credentials; import org.jclouds.domain.Credentials;
import org.jclouds.domain.Location; import org.jclouds.domain.Location;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.domain.LoginCredentials.Builder;
import org.jclouds.javax.annotation.Nullable;
/** /**
* @author Adrian Cole * @author Adrian Cole
@ -43,18 +44,34 @@ public class ImageImpl extends ComputeMetadataImpl implements Image {
private final OperatingSystem operatingSystem; private final OperatingSystem operatingSystem;
private final String version; private final String version;
private final String description; private final String description;
@Nullable private final LoginCredentials defaultCredentials;
private final String adminPassword;
private final Credentials defaultCredentials;
/**
* <h4>will be removed in jclouds 1.4.0</h4>
*/
@Deprecated
public ImageImpl(String providerId, String name, String id, Location location, URI uri, public ImageImpl(String providerId, String name, String id, Location location, URI uri,
Map<String, String> userMetadata, Set<String> tags, OperatingSystem operatingSystem, String description, Map<String, String> userMetadata, Set<String> tags, OperatingSystem operatingSystem, String description,
@Nullable String version, @Nullable String adminPassword, @Nullable Credentials defaultCredentials) { @Nullable String version, @Nullable String adminPassword, @Nullable Credentials defaultCredentials) {
super(ComputeType.IMAGE, providerId, name, id, location, uri, userMetadata, tags);
this.operatingSystem = checkNotNull(operatingSystem, "operatingSystem");
this.version = version;
this.description = checkNotNull(description, "description");
Builder builder = LoginCredentials.builder(defaultCredentials);
if (adminPassword != null) {
builder.authenticateSudo(true);
builder.password(adminPassword);
}
this.defaultCredentials = builder.build();
}
public ImageImpl(String providerId, String name, String id, Location location, URI uri,
Map<String, String> userMetadata, Set<String> tags, OperatingSystem operatingSystem, String description,
@Nullable String version, @Nullable LoginCredentials defaultCredentials) {
super(ComputeType.IMAGE, providerId, name, id, location, uri, userMetadata, tags); super(ComputeType.IMAGE, providerId, name, id, location, uri, userMetadata, tags);
this.operatingSystem = checkNotNull(operatingSystem, "operatingSystem"); this.operatingSystem = checkNotNull(operatingSystem, "operatingSystem");
this.version = version; this.version = version;
this.description = checkNotNull(description, "description"); this.description = checkNotNull(description, "description");
this.adminPassword = adminPassword;
this.defaultCredentials = defaultCredentials; this.defaultCredentials = defaultCredentials;
} }
@ -86,7 +103,7 @@ public class ImageImpl extends ComputeMetadataImpl implements Image {
* {@inheritDoc} * {@inheritDoc}
*/ */
@Override @Override
public Credentials getDefaultCredentials() { public LoginCredentials getDefaultCredentials() {
return defaultCredentials; return defaultCredentials;
} }
@ -94,23 +111,24 @@ public class ImageImpl extends ComputeMetadataImpl implements Image {
* {@inheritDoc} * {@inheritDoc}
*/ */
@Override @Override
@Deprecated
public String getAdminPassword() { public String getAdminPassword() {
return adminPassword; return (defaultCredentials != null && defaultCredentials.shouldAuthenticateSudo()) ? defaultCredentials
.getPassword() : null;
} }
@Override @Override
public String toString() { public String toString() {
return "[id=" + getId() + ", name=" + getName() + ", operatingSystem=" + operatingSystem + ", description=" return "[id=" + getId() + ", name=" + getName() + ", operatingSystem=" + operatingSystem + ", description="
+ description + ", version=" + version + ", location=" + getLocation() + ", loginUser=" + description + ", version=" + version + ", location=" + getLocation() + ", loginUser="
+ ((defaultCredentials != null) ? defaultCredentials.identity : null) + ", userMetadata=" + ((defaultCredentials != null) ? defaultCredentials.identity : null) + ", userMetadata="
+ getUserMetadata() + ", tags=" + tags + "]"; + getUserMetadata() + ", tags=" + tags + "]";
} }
@Override @Override
public int hashCode() { public int hashCode() {
final int prime = 31; final int prime = 31;
int result = super.hashCode(); int result = super.hashCode();
result = prime * result + ((adminPassword == null) ? 0 : adminPassword.hashCode());
result = prime * result + ((defaultCredentials == null) ? 0 : defaultCredentials.hashCode()); result = prime * result + ((defaultCredentials == null) ? 0 : defaultCredentials.hashCode());
result = prime * result + ((description == null) ? 0 : description.hashCode()); result = prime * result + ((description == null) ? 0 : description.hashCode());
result = prime * result + ((operatingSystem == null) ? 0 : operatingSystem.hashCode()); result = prime * result + ((operatingSystem == null) ? 0 : operatingSystem.hashCode());
@ -127,11 +145,6 @@ public class ImageImpl extends ComputeMetadataImpl implements Image {
if (getClass() != obj.getClass()) if (getClass() != obj.getClass())
return false; return false;
ImageImpl other = (ImageImpl) obj; ImageImpl other = (ImageImpl) obj;
if (adminPassword == null) {
if (other.adminPassword != null)
return false;
} else if (!adminPassword.equals(other.adminPassword))
return false;
if (defaultCredentials == null) { if (defaultCredentials == null) {
if (other.defaultCredentials != null) if (other.defaultCredentials != null)
return false; return false;

View File

@ -33,6 +33,8 @@ import org.jclouds.compute.domain.NodeState;
import org.jclouds.compute.domain.OperatingSystem; import org.jclouds.compute.domain.OperatingSystem;
import org.jclouds.domain.Credentials; import org.jclouds.domain.Credentials;
import org.jclouds.domain.Location; import org.jclouds.domain.Location;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.domain.LoginCredentials.Builder;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
@ -50,9 +52,7 @@ public class NodeMetadataImpl extends ComputeMetadataImpl implements NodeMetadat
private final Set<String> publicAddresses; private final Set<String> publicAddresses;
private final Set<String> privateAddresses; private final Set<String> privateAddresses;
@Nullable @Nullable
private final String adminPassword; private final LoginCredentials credentials;
@Nullable
private final Credentials credentials;
@Nullable @Nullable
private final String group; private final String group;
@Nullable @Nullable
@ -63,12 +63,39 @@ public class NodeMetadataImpl extends ComputeMetadataImpl implements NodeMetadat
private final OperatingSystem os; private final OperatingSystem os;
@Nullable @Nullable
private final String hostname; private final String hostname;
/**
* <h4>will be removed in jclouds 1.4.0</h4>
*/
@Deprecated
public NodeMetadataImpl(String providerId, String name, String id, Location location, URI uri, public NodeMetadataImpl(String providerId, String name, String id, Location location, URI uri,
Map<String, String> userMetadata, Set<String> tags, @Nullable String group, @Nullable Hardware hardware, Map<String, String> userMetadata, Set<String> tags, @Nullable String group, @Nullable Hardware hardware,
@Nullable String imageId, @Nullable OperatingSystem os, NodeState state, int loginPort, @Nullable String imageId, @Nullable OperatingSystem os, NodeState state, int loginPort,
Iterable<String> publicAddresses, Iterable<String> privateAddresses, @Nullable String adminPassword, Iterable<String> publicAddresses, Iterable<String> privateAddresses, @Nullable String adminPassword,
@Nullable Credentials credentials, String hostname) { @Nullable Credentials credentials, String hostname) {
super(ComputeType.NODE, providerId, name, id, location, uri, userMetadata, tags);
this.group = group;
this.hardware = hardware;
this.imageId = imageId;
this.os = os;
this.state = checkNotNull(state, "state");
this.loginPort = loginPort;
this.publicAddresses = ImmutableSet.copyOf(checkNotNull(publicAddresses, "publicAddresses"));
this.privateAddresses = ImmutableSet.copyOf(checkNotNull(privateAddresses, "privateAddresses"));
this.hostname = hostname;
Builder builder = LoginCredentials.builder(credentials);
if (adminPassword != null) {
builder.authenticateSudo(true);
builder.password(adminPassword);
}
this.credentials = builder.build();
}
public NodeMetadataImpl(String providerId, String name, String id, Location location, URI uri,
Map<String, String> userMetadata, Set<String> tags, @Nullable String group, @Nullable Hardware hardware,
@Nullable String imageId, @Nullable OperatingSystem os, NodeState state, int loginPort,
Iterable<String> publicAddresses, Iterable<String> privateAddresses, @Nullable LoginCredentials credentials,
String hostname) {
super(ComputeType.NODE, providerId, name, id, location, uri, userMetadata, tags); super(ComputeType.NODE, providerId, name, id, location, uri, userMetadata, tags);
this.group = group; this.group = group;
this.hardware = hardware; this.hardware = hardware;
@ -78,7 +105,6 @@ public class NodeMetadataImpl extends ComputeMetadataImpl implements NodeMetadat
this.loginPort = loginPort; this.loginPort = loginPort;
this.publicAddresses = ImmutableSet.copyOf(checkNotNull(publicAddresses, "publicAddresses")); this.publicAddresses = ImmutableSet.copyOf(checkNotNull(publicAddresses, "publicAddresses"));
this.privateAddresses = ImmutableSet.copyOf(checkNotNull(privateAddresses, "privateAddresses")); this.privateAddresses = ImmutableSet.copyOf(checkNotNull(privateAddresses, "privateAddresses"));
this.adminPassword = adminPassword;
this.credentials = credentials; this.credentials = credentials;
this.hostname = hostname; this.hostname = hostname;
} }
@ -111,15 +137,16 @@ public class NodeMetadataImpl extends ComputeMetadataImpl implements NodeMetadat
* {@inheritDoc} * {@inheritDoc}
*/ */
@Override @Override
@Deprecated
public String getAdminPassword() { public String getAdminPassword() {
return adminPassword; return (credentials != null && credentials.shouldAuthenticateSudo()) ? credentials.getPassword() : null;
} }
/** /**
* {@inheritDoc} * {@inheritDoc}
*/ */
@Override @Override
public Credentials getCredentials() { public LoginCredentials getCredentials() {
return credentials; return credentials;
} }
@ -178,7 +205,7 @@ public class NodeMetadataImpl extends ComputeMetadataImpl implements NodeMetadat
public String getHostname() { public String getHostname() {
return hostname; return hostname;
} }
@Override @Override
public String toString() { public String toString() {
return "[id=" + getId() + ", providerId=" + getProviderId() + ", group=" + getTag() + ", name=" + getName() return "[id=" + getId() + ", providerId=" + getProviderId() + ", group=" + getTag() + ", name=" + getName()
@ -201,7 +228,6 @@ public class NodeMetadataImpl extends ComputeMetadataImpl implements NodeMetadat
result = prime * result + ((imageId == null) ? 0 : imageId.hashCode()); result = prime * result + ((imageId == null) ? 0 : imageId.hashCode());
result = prime * result + ((hardware == null) ? 0 : hardware.hashCode()); result = prime * result + ((hardware == null) ? 0 : hardware.hashCode());
result = prime * result + ((os == null) ? 0 : os.hashCode()); result = prime * result + ((os == null) ? 0 : os.hashCode());
result = prime * result + ((adminPassword == null) ? 0 : adminPassword.hashCode());
result = prime * result + ((credentials == null) ? 0 : credentials.hashCode()); result = prime * result + ((credentials == null) ? 0 : credentials.hashCode());
return result; return result;
} }
@ -252,11 +278,6 @@ public class NodeMetadataImpl extends ComputeMetadataImpl implements NodeMetadat
return false; return false;
} else if (!os.equals(other.os)) } else if (!os.equals(other.os))
return false; return false;
if (adminPassword == null) {
if (other.adminPassword != null)
return false;
} else if (!adminPassword.equals(other.adminPassword))
return false;
if (credentials == null) { if (credentials == null) {
if (other.credentials != null) if (other.credentials != null)
return false; return false;

View File

@ -18,13 +18,12 @@
*/ */
package org.jclouds.compute.functions; package org.jclouds.compute.functions;
import static org.jclouds.domain.Credentials.NO_CREDENTIALS;
import javax.inject.Singleton; import javax.inject.Singleton;
import org.jclouds.compute.domain.Template; import org.jclouds.compute.domain.Template;
import org.jclouds.compute.options.TemplateOptions; import org.jclouds.compute.options.TemplateOptions;
import org.jclouds.domain.Credentials; import org.jclouds.domain.LoginCredentials;
import org.jclouds.domain.LoginCredentials.Builder;
import com.google.common.base.Function; import com.google.common.base.Function;
@ -33,21 +32,21 @@ import com.google.common.base.Function;
* @author Adrian Cole * @author Adrian Cole
*/ */
@Singleton @Singleton
public class DefaultCredentialsFromImageOrOverridingCredentials implements Function<Template, Credentials> { public class DefaultCredentialsFromImageOrOverridingCredentials implements Function<Template, LoginCredentials> {
@Override @Override
public Credentials apply(Template template) { public LoginCredentials apply(Template template) {
TemplateOptions options = template.getOptions(); TemplateOptions options = template.getOptions();
Credentials creds = template.getImage().getDefaultCredentials(); Builder builder = LoginCredentials.builder(template.getImage().getDefaultCredentials());
Credentials overridingCredentials = options.getOverridingCredentials(); if (options.getLoginUser() != null)
Credentials overrideCreds = (overridingCredentials != null) ? overridingCredentials : NO_CREDENTIALS; builder.user(options.getLoginUser());
if (creds == null) if (options.getLoginPassword() != null)
creds = overrideCreds; builder.password(options.getLoginPassword());
if (overrideCreds.identity != null) if (options.getLoginPrivateKey() != null)
creds = creds.toBuilder().identity(overrideCreds.identity).build(); builder.privateKey(options.getLoginPrivateKey());
if (overrideCreds.credential != null) if (options.shouldAuthenticateSudo() != null)
creds = creds.toBuilder().credential(overrideCreds.credential).build(); builder.authenticateSudo(true);
return creds.equals(NO_CREDENTIALS) ? null : creds; return builder.build();
} }
} }

View File

@ -80,7 +80,8 @@ import org.jclouds.compute.strategy.RunScriptOnNodeAndAddToGoodMapOrPutException
import org.jclouds.compute.strategy.SuspendNodeStrategy; import org.jclouds.compute.strategy.SuspendNodeStrategy;
import org.jclouds.domain.Credentials; import org.jclouds.domain.Credentials;
import org.jclouds.domain.Location; import org.jclouds.domain.Location;
import org.jclouds.domain.Credentials.Builder; import org.jclouds.domain.LoginCredentials;
import org.jclouds.domain.LoginCredentials.Builder;
import org.jclouds.io.Payload; import org.jclouds.io.Payload;
import org.jclouds.logging.Logger; import org.jclouds.logging.Logger;
import org.jclouds.predicates.RetryablePredicate; import org.jclouds.predicates.RetryablePredicate;
@ -139,20 +140,18 @@ public class BaseComputeService implements ComputeService {
@Inject @Inject
protected BaseComputeService(ComputeServiceContext context, Map<String, Credentials> credentialStore, protected BaseComputeService(ComputeServiceContext context, Map<String, Credentials> credentialStore,
@Memoized Supplier<Set<? extends Image>> images, @Memoized Supplier<Set<? extends Image>> images, @Memoized Supplier<Set<? extends Hardware>> hardwareProfiles,
@Memoized Supplier<Set<? extends Hardware>> hardwareProfiles, @Memoized Supplier<Set<? extends Location>> locations, ListNodesStrategy listNodesStrategy,
@Memoized Supplier<Set<? extends Location>> locations, ListNodesStrategy listNodesStrategy, GetNodeMetadataStrategy getNodeMetadataStrategy, CreateNodesInGroupThenAddToSet runNodesAndAddToSetStrategy,
GetNodeMetadataStrategy getNodeMetadataStrategy, RebootNodeStrategy rebootNodeStrategy, DestroyNodeStrategy destroyNodeStrategy,
CreateNodesInGroupThenAddToSet runNodesAndAddToSetStrategy, RebootNodeStrategy rebootNodeStrategy, ResumeNodeStrategy resumeNodeStrategy, SuspendNodeStrategy suspendNodeStrategy,
DestroyNodeStrategy destroyNodeStrategy, ResumeNodeStrategy resumeNodeStrategy, Provider<TemplateBuilder> templateBuilderProvider, Provider<TemplateOptions> templateOptionsProvider,
SuspendNodeStrategy suspendNodeStrategy, Provider<TemplateBuilder> templateBuilderProvider, @Named("NODE_RUNNING") Predicate<NodeMetadata> nodeRunning,
Provider<TemplateOptions> templateOptionsProvider, @Named("NODE_TERMINATED") Predicate<NodeMetadata> nodeTerminated,
@Named("NODE_RUNNING") Predicate<NodeMetadata> nodeRunning, @Named("NODE_SUSPENDED") Predicate<NodeMetadata> nodeSuspended,
@Named("NODE_TERMINATED") Predicate<NodeMetadata> nodeTerminated, InitializeRunScriptOnNodeOrPlaceInBadMap.Factory initScriptRunnerFactory, InitAdminAccess initAdminAccess,
@Named("NODE_SUSPENDED") Predicate<NodeMetadata> nodeSuspended, RunScriptOnNode.Factory runScriptOnNodeFactory, PersistNodeCredentials persistNodeCredentials,
InitializeRunScriptOnNodeOrPlaceInBadMap.Factory initScriptRunnerFactory, InitAdminAccess initAdminAccess, Timeouts timeouts, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) {
RunScriptOnNode.Factory runScriptOnNodeFactory, PersistNodeCredentials persistNodeCredentials,
Timeouts timeouts, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) {
this.context = checkNotNull(context, "context"); this.context = checkNotNull(context, "context");
this.credentialStore = checkNotNull(credentialStore, "credentialStore"); this.credentialStore = checkNotNull(credentialStore, "credentialStore");
this.images = checkNotNull(images, "images"); this.images = checkNotNull(images, "images");
@ -191,7 +190,7 @@ public class BaseComputeService implements ComputeService {
*/ */
@Override @Override
public Set<? extends NodeMetadata> runNodesWithTag(String group, int count, Template template) public Set<? extends NodeMetadata> runNodesWithTag(String group, int count, Template template)
throws RunNodesException { throws RunNodesException {
return createNodesInGroup(group, count, template); return createNodesInGroup(group, count, template);
} }
@ -200,7 +199,7 @@ public class BaseComputeService implements ComputeService {
*/ */
@Override @Override
public Set<? extends NodeMetadata> runNodesWithTag(String group, int count, TemplateOptions templateOptions) public Set<? extends NodeMetadata> runNodesWithTag(String group, int count, TemplateOptions templateOptions)
throws RunNodesException { throws RunNodesException {
return createNodesInGroup(group, count, templateBuilder().any().options(templateOptions).build()); return createNodesInGroup(group, count, templateBuilder().any().options(templateOptions).build());
} }
@ -214,12 +213,12 @@ public class BaseComputeService implements ComputeService {
@Override @Override
public Set<? extends NodeMetadata> createNodesInGroup(String group, int count, Template template) public Set<? extends NodeMetadata> createNodesInGroup(String group, int count, Template template)
throws RunNodesException { throws RunNodesException {
checkNotNull(group, "group cannot be null"); checkNotNull(group, "group cannot be null");
checkNotNull(template.getLocation(), "location"); checkNotNull(template.getLocation(), "location");
logger.debug(">> running %d node%s group(%s) location(%s) image(%s) hardwareProfile(%s) options(%s)", count, logger.debug(">> running %d node%s group(%s) location(%s) image(%s) hardwareProfile(%s) options(%s)", count,
count > 1 ? "s" : "", group, template.getLocation().getId(), template.getImage().getId(), template count > 1 ? "s" : "", group, template.getLocation().getId(), template.getImage().getId(), template
.getHardware().getId(), template.getOptions()); .getHardware().getId(), template.getOptions());
Set<NodeMetadata> goodNodes = newLinkedHashSet(); Set<NodeMetadata> goodNodes = newLinkedHashSet();
Map<NodeMetadata, Exception> badNodes = newLinkedHashMap(); Map<NodeMetadata, Exception> badNodes = newLinkedHashMap();
Multimap<NodeMetadata, CustomizationResponse> customizationResponses = LinkedHashMultimap.create(); Multimap<NodeMetadata, CustomizationResponse> customizationResponses = LinkedHashMultimap.create();
@ -228,9 +227,9 @@ public class BaseComputeService implements ComputeService {
initAdminAccess.visit(template.getOptions().getRunScript()); initAdminAccess.visit(template.getOptions().getRunScript());
Map<?, Future<Void>> responses = runNodesAndAddToSetStrategy.execute(group, count, template, goodNodes, badNodes, Map<?, Future<Void>> responses = runNodesAndAddToSetStrategy.execute(group, count, template, goodNodes, badNodes,
customizationResponses); customizationResponses);
Map<?, Exception> executionExceptions = awaitCompletion(responses, executor, null, logger, "runNodesWithTag(" Map<?, Exception> executionExceptions = awaitCompletion(responses, executor, null, logger, "runNodesWithTag("
+ group + ")"); + group + ")");
Function<NodeMetadata, NodeMetadata> fn = persistNodeCredentials.always(template.getOptions().getRunScript()); Function<NodeMetadata, NodeMetadata> fn = persistNodeCredentials.always(template.getOptions().getRunScript());
badNodes = Maps2.transformKeys(badNodes, fn); badNodes = Maps2.transformKeys(badNodes, fn);
goodNodes = ImmutableSet.copyOf(Iterables.transform(goodNodes, fn)); goodNodes = ImmutableSet.copyOf(Iterables.transform(goodNodes, fn));
@ -242,7 +241,7 @@ public class BaseComputeService implements ComputeService {
@Override @Override
public Set<? extends NodeMetadata> createNodesInGroup(String group, int count, TemplateOptions templateOptions) public Set<? extends NodeMetadata> createNodesInGroup(String group, int count, TemplateOptions templateOptions)
throws RunNodesException { throws RunNodesException {
return createNodesInGroup(group, count, templateBuilder().any().options(templateOptions).build()); return createNodesInGroup(group, count, templateBuilder().any().options(templateOptions).build());
} }
@ -288,27 +287,27 @@ public class BaseComputeService implements ComputeService {
public Set<? extends NodeMetadata> destroyNodesMatching(Predicate<NodeMetadata> filter) { public Set<? extends NodeMetadata> destroyNodesMatching(Predicate<NodeMetadata> filter) {
logger.debug(">> destroying nodes matching(%s)", filter); logger.debug(">> destroying nodes matching(%s)", filter);
Set<NodeMetadata> set = newLinkedHashSet(transformParallel(nodesMatchingFilterAndNotTerminated(filter), Set<NodeMetadata> set = newLinkedHashSet(transformParallel(nodesMatchingFilterAndNotTerminated(filter),
new Function<NodeMetadata, Future<NodeMetadata>>() { new Function<NodeMetadata, Future<NodeMetadata>>() {
// TODO make an async interface instead of re-wrapping // TODO make an async interface instead of re-wrapping
@Override @Override
public Future<NodeMetadata> apply(final NodeMetadata from) { public Future<NodeMetadata> apply(final NodeMetadata from) {
return executor.submit(new Callable<NodeMetadata>() { return executor.submit(new Callable<NodeMetadata>() {
@Override @Override
public NodeMetadata call() throws Exception { public NodeMetadata call() throws Exception {
destroyNode(from.getId()); destroyNode(from.getId());
return from; return from;
} }
@Override @Override
public String toString() { public String toString() {
return "destroyNode(" + from.getId() + ")"; return "destroyNode(" + from.getId() + ")";
} }
}); });
} }
}, executor, null, logger, "destroyNodesMatching(" + filter + ")")); }, executor, null, logger, "destroyNodesMatching(" + filter + ")"));
logger.debug("<< destroyed(%d)", set.size()); logger.debug("<< destroyed(%d)", set.size());
return set; return set;
} }
@ -322,7 +321,7 @@ public class BaseComputeService implements ComputeService {
* if none found * if none found
*/ */
Iterable<? extends NodeMetadata> nodesMatchingFilterAndNotTerminatedExceptionIfNotFound( Iterable<? extends NodeMetadata> nodesMatchingFilterAndNotTerminatedExceptionIfNotFound(
Predicate<NodeMetadata> filter) { Predicate<NodeMetadata> filter) {
Iterable<? extends NodeMetadata> nodes = nodesMatchingFilterAndNotTerminated(filter); Iterable<? extends NodeMetadata> nodes = nodesMatchingFilterAndNotTerminated(filter);
if (Iterables.size(nodes) == 0) if (Iterables.size(nodes) == 0)
throw new NoSuchElementException("no nodes matched filter: " + filter); throw new NoSuchElementException("no nodes matched filter: " + filter);
@ -412,15 +411,15 @@ public class BaseComputeService implements ComputeService {
public void rebootNodesMatching(Predicate<NodeMetadata> filter) { public void rebootNodesMatching(Predicate<NodeMetadata> filter) {
logger.debug(">> rebooting nodes matching(%s)", filter); logger.debug(">> rebooting nodes matching(%s)", filter);
transformParallel(nodesMatchingFilterAndNotTerminatedExceptionIfNotFound(filter), transformParallel(nodesMatchingFilterAndNotTerminatedExceptionIfNotFound(filter),
new Function<NodeMetadata, Future<Void>>() { new Function<NodeMetadata, Future<Void>>() {
// TODO use native async // TODO use native async
@Override @Override
public Future<Void> apply(NodeMetadata from) { public Future<Void> apply(NodeMetadata from) {
rebootNode(from.getId()); rebootNode(from.getId());
return immediateFuture(null); return immediateFuture(null);
} }
}, executor, null, logger, "rebootNodesMatching(" + filter + ")"); }, executor, null, logger, "rebootNodesMatching(" + filter + ")");
logger.debug("<< rebooted"); logger.debug("<< rebooted");
} }
@ -443,15 +442,15 @@ public class BaseComputeService implements ComputeService {
public void resumeNodesMatching(Predicate<NodeMetadata> filter) { public void resumeNodesMatching(Predicate<NodeMetadata> filter) {
logger.debug(">> resuming nodes matching(%s)", filter); logger.debug(">> resuming nodes matching(%s)", filter);
transformParallel(nodesMatchingFilterAndNotTerminatedExceptionIfNotFound(filter), transformParallel(nodesMatchingFilterAndNotTerminatedExceptionIfNotFound(filter),
new Function<NodeMetadata, Future<Void>>() { new Function<NodeMetadata, Future<Void>>() {
// TODO use native async // TODO use native async
@Override @Override
public Future<Void> apply(NodeMetadata from) { public Future<Void> apply(NodeMetadata from) {
resumeNode(from.getId()); resumeNode(from.getId());
return immediateFuture(null); return immediateFuture(null);
} }
}, executor, null, logger, "resumeNodesMatching(" + filter + ")"); }, executor, null, logger, "resumeNodesMatching(" + filter + ")");
logger.debug("<< resumed"); logger.debug("<< resumed");
} }
@ -474,15 +473,15 @@ public class BaseComputeService implements ComputeService {
public void suspendNodesMatching(Predicate<NodeMetadata> filter) { public void suspendNodesMatching(Predicate<NodeMetadata> filter) {
logger.debug(">> suspending nodes matching(%s)", filter); logger.debug(">> suspending nodes matching(%s)", filter);
transformParallel(nodesMatchingFilterAndNotTerminatedExceptionIfNotFound(filter), transformParallel(nodesMatchingFilterAndNotTerminatedExceptionIfNotFound(filter),
new Function<NodeMetadata, Future<Void>>() { new Function<NodeMetadata, Future<Void>>() {
// TODO use native async // TODO use native async
@Override @Override
public Future<Void> apply(NodeMetadata from) { public Future<Void> apply(NodeMetadata from) {
suspendNode(from.getId()); suspendNode(from.getId());
return immediateFuture(null); return immediateFuture(null);
} }
}, executor, null, logger, "suspendNodesMatching(" + filter + ")"); }, executor, null, logger, "suspendNodesMatching(" + filter + ")");
logger.debug("<< suspended"); logger.debug("<< suspended");
} }
@ -491,7 +490,7 @@ public class BaseComputeService implements ComputeService {
*/ */
@Override @Override
public Map<NodeMetadata, ExecResponse> runScriptOnNodesMatching(Predicate<NodeMetadata> filter, Payload runScript) public Map<NodeMetadata, ExecResponse> runScriptOnNodesMatching(Predicate<NodeMetadata> filter, Payload runScript)
throws RunScriptOnNodesException { throws RunScriptOnNodesException {
return runScriptOnNodesMatching(filter, runScript, RunScriptOptions.NONE); return runScriptOnNodesMatching(filter, runScript, RunScriptOptions.NONE);
} }
@ -500,10 +499,10 @@ public class BaseComputeService implements ComputeService {
*/ */
@Override @Override
public Map<NodeMetadata, ExecResponse> runScriptOnNodesMatching(Predicate<NodeMetadata> filter, Payload runScript, public Map<NodeMetadata, ExecResponse> runScriptOnNodesMatching(Predicate<NodeMetadata> filter, Payload runScript,
RunScriptOptions options) throws RunScriptOnNodesException { RunScriptOptions options) throws RunScriptOnNodesException {
try { try {
return runScriptOnNodesMatching(filter, Statements.exec(Strings2.toStringAndClose(checkNotNull(runScript, return runScriptOnNodesMatching(filter,
"runScript").getInput())), options); Statements.exec(Strings2.toStringAndClose(checkNotNull(runScript, "runScript").getInput())), options);
} catch (IOException e) { } catch (IOException e) {
Throwables.propagate(e); Throwables.propagate(e);
return null; return null;
@ -515,7 +514,7 @@ public class BaseComputeService implements ComputeService {
*/ */
@Override @Override
public Map<NodeMetadata, ExecResponse> runScriptOnNodesMatching(Predicate<NodeMetadata> filter, String runScript) public Map<NodeMetadata, ExecResponse> runScriptOnNodesMatching(Predicate<NodeMetadata> filter, String runScript)
throws RunScriptOnNodesException { throws RunScriptOnNodesException {
return runScriptOnNodesMatching(filter, Statements.exec(checkNotNull(runScript, "runScript"))); return runScriptOnNodesMatching(filter, Statements.exec(checkNotNull(runScript, "runScript")));
} }
@ -524,13 +523,13 @@ public class BaseComputeService implements ComputeService {
*/ */
@Override @Override
public Map<NodeMetadata, ExecResponse> runScriptOnNodesMatching(Predicate<NodeMetadata> filter, Statement runScript) public Map<NodeMetadata, ExecResponse> runScriptOnNodesMatching(Predicate<NodeMetadata> filter, Statement runScript)
throws RunScriptOnNodesException { throws RunScriptOnNodesException {
return runScriptOnNodesMatching(filter, runScript, RunScriptOptions.NONE); return runScriptOnNodesMatching(filter, runScript, RunScriptOptions.NONE);
} }
@Override @Override
public Map<? extends NodeMetadata, ExecResponse> runScriptOnNodesMatching(Predicate<NodeMetadata> filter, public Map<? extends NodeMetadata, ExecResponse> runScriptOnNodesMatching(Predicate<NodeMetadata> filter,
String runScript, RunScriptOptions options) throws RunScriptOnNodesException { String runScript, RunScriptOptions options) throws RunScriptOnNodesException {
return runScriptOnNodesMatching(filter, Statements.exec(checkNotNull(runScript, "runScript")), options); return runScriptOnNodesMatching(filter, Statements.exec(checkNotNull(runScript, "runScript")), options);
} }
@ -539,7 +538,7 @@ public class BaseComputeService implements ComputeService {
*/ */
@Override @Override
public Map<NodeMetadata, ExecResponse> runScriptOnNodesMatching(Predicate<NodeMetadata> filter, Statement runScript, public Map<NodeMetadata, ExecResponse> runScriptOnNodesMatching(Predicate<NodeMetadata> filter, Statement runScript,
RunScriptOptions options) throws RunScriptOnNodesException { RunScriptOptions options) throws RunScriptOnNodesException {
checkNotNull(filter, "filter"); checkNotNull(filter, "filter");
checkNotNull(runScript, "runScript"); checkNotNull(runScript, "runScript");
@ -553,11 +552,11 @@ public class BaseComputeService implements ComputeService {
initAdminAccess.visit(runScript); initAdminAccess.visit(runScript);
Iterable<? extends RunScriptOnNode> scriptRunners = transformNodesIntoInitializedScriptRunners( Iterable<? extends RunScriptOnNode> scriptRunners = transformNodesIntoInitializedScriptRunners(
nodesMatchingFilterAndNotTerminatedExceptionIfNotFound(filter), runScript, options, badNodes); nodesMatchingFilterAndNotTerminatedExceptionIfNotFound(filter), runScript, options, badNodes);
if (Iterables.size(scriptRunners) > 0) { if (Iterables.size(scriptRunners) > 0) {
for (RunScriptOnNode runner : scriptRunners) { for (RunScriptOnNode runner : scriptRunners) {
responses.put(runner.getNode(), executor.submit(new RunScriptOnNodeAndAddToGoodMapOrPutExceptionIntoBadMap( responses.put(runner.getNode(), executor.submit(new RunScriptOnNodeAndAddToGoodMapOrPutExceptionIntoBadMap(
runner, goodNodes, badNodes))); runner, goodNodes, badNodes)));
} }
exceptions = awaitCompletion(responses, executor, null, logger, "runScriptOnNodesMatching(" + filter + ")"); exceptions = awaitCompletion(responses, executor, null, logger, "runScriptOnNodesMatching(" + filter + ")");
} }
@ -606,7 +605,7 @@ public class BaseComputeService implements ComputeService {
throw new NoSuchElementException(id); throw new NoSuchElementException(id);
if (node.getState() != NodeState.RUNNING) if (node.getState() != NodeState.RUNNING)
throw new IllegalStateException("node " + id throw new IllegalStateException("node " + id
+ " needs to be running before executing a script on it. current state: " + node.getState()); + " needs to be running before executing a script on it. current state: " + node.getState());
initAdminAccess.visit(runScript); initAdminAccess.visit(runScript);
node = updateNodeWithCredentialsIfPresent(node, options); node = updateNodeWithCredentialsIfPresent(node, options);
ExecResponse response = runScriptOnNodeFactory.create(node, runScript, options).init().call(); ExecResponse response = runScriptOnNodeFactory.create(node, runScript, options).init().call();
@ -619,13 +618,13 @@ public class BaseComputeService implements ComputeService {
*/ */
@Override @Override
public ListenableFuture<ExecResponse> submitScriptOnNode(String id, final Statement runScript, public ListenableFuture<ExecResponse> submitScriptOnNode(String id, final Statement runScript,
RunScriptOptions options) { RunScriptOptions options) {
NodeMetadata node = this.getNodeMetadata(id); NodeMetadata node = this.getNodeMetadata(id);
if (node == null) if (node == null)
throw new NoSuchElementException(id); throw new NoSuchElementException(id);
if (node.getState() != NodeState.RUNNING) if (node.getState() != NodeState.RUNNING)
throw new IllegalStateException("node " + id throw new IllegalStateException("node " + id
+ " needs to be running before executing a script on it. current state: " + node.getState()); + " needs to be running before executing a script on it. current state: " + node.getState());
initAdminAccess.visit(runScript); initAdminAccess.visit(runScript);
final NodeMetadata node1 = updateNodeWithCredentialsIfPresent(node, options); final NodeMetadata node1 = updateNodeWithCredentialsIfPresent(node, options);
ListenableFuture<ExecResponse> response = runScriptOnNodeFactory.submit(node1, runScript, options); ListenableFuture<ExecResponse> response = runScriptOnNodeFactory.submit(node1, runScript, options);
@ -641,10 +640,11 @@ public class BaseComputeService implements ComputeService {
} }
private Iterable<? extends RunScriptOnNode> transformNodesIntoInitializedScriptRunners( private Iterable<? extends RunScriptOnNode> transformNodesIntoInitializedScriptRunners(
Iterable<? extends NodeMetadata> nodes, Statement script, RunScriptOptions options, Iterable<? extends NodeMetadata> nodes, Statement script, RunScriptOptions options,
Map<NodeMetadata, Exception> badNodes) { Map<NodeMetadata, Exception> badNodes) {
return filter(transformParallel(nodes, new TransformNodesIntoInitializedScriptRunners(script, options, badNodes), return filter(
executor, null, logger, "initialize script runners"), notNull()); transformParallel(nodes, new TransformNodesIntoInitializedScriptRunners(script, options, badNodes),
executor, null, logger, "initialize script runners"), notNull());
} }
private Set<? extends NodeMetadata> detailsOnAllNodes() { private Set<? extends NodeMetadata> detailsOnAllNodes() {
@ -658,31 +658,26 @@ public class BaseComputeService implements ComputeService {
protected NodeMetadata updateNodeWithCredentialsIfPresent(NodeMetadata node, RunScriptOptions options) { protected NodeMetadata updateNodeWithCredentialsIfPresent(NodeMetadata node, RunScriptOptions options) {
checkNotNull(node, "node"); checkNotNull(node, "node");
if (options.getOverridingCredentials() != null) { Builder builder = LoginCredentials.builder(node.getCredentials());
Builder<? extends Credentials> builder = node.getCredentials() != null ? node.getCredentials().toBuilder() if (options.getLoginUser() != null)
: new Credentials.Builder<Credentials>(); builder.user(options.getLoginUser());
if (options.getOverridingCredentials().identity != null) if (options.getLoginPassword() != null)
builder.identity(options.getOverridingCredentials().identity); builder.password(options.getLoginPassword());
if (options.getOverridingCredentials().credential != null) { if (options.getLoginPrivateKey() != null)
// custom credentials are related to the input builder.privateKey(options.getLoginPrivateKey());
builder = options.getOverridingCredentials().toBuilder(); if (options.shouldAuthenticateSudo() != null)
Credentials cred = builder.build(); builder.authenticateSudo(true);
builder.identity(cred.identity); return NodeMetadataBuilder.fromNodeMetadata(node).credentials(builder.build()).build();
builder.credential(options.getOverridingCredentials().credential);
}
node = NodeMetadataBuilder.fromNodeMetadata(node).credentials(builder.build()).build();
}
return node;
} }
private final class TransformNodesIntoInitializedScriptRunners implements private final class TransformNodesIntoInitializedScriptRunners implements
Function<NodeMetadata, Future<RunScriptOnNode>> { Function<NodeMetadata, Future<RunScriptOnNode>> {
private final Map<NodeMetadata, Exception> badNodes; private final Map<NodeMetadata, Exception> badNodes;
private final Statement script; private final Statement script;
private final RunScriptOptions options; private final RunScriptOptions options;
private TransformNodesIntoInitializedScriptRunners(Statement script, RunScriptOptions options, private TransformNodesIntoInitializedScriptRunners(Statement script, RunScriptOptions options,
Map<NodeMetadata, Exception> badNodes) { Map<NodeMetadata, Exception> badNodes) {
this.badNodes = checkNotNull(badNodes, "badNodes"); this.badNodes = checkNotNull(badNodes, "badNodes");
this.script = checkNotNull(script, "script"); this.script = checkNotNull(script, "script");
this.options = checkNotNull(options, "options"); this.options = checkNotNull(options, "options");

View File

@ -22,6 +22,9 @@ import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import org.jclouds.domain.Credentials; import org.jclouds.domain.Credentials;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.util.CredentialUtils;
/** /**
* Enables additional options for running a script. * Enables additional options for running a script.
@ -52,12 +55,6 @@ public class RunScriptOptions {
return delegate.toString(); return delegate.toString();
} }
@Override
public Credentials getOverridingCredentials() {
return delegate.getOverridingCredentials();
}
@Override @Override
public boolean shouldRunAsRoot() { public boolean shouldRunAsRoot() {
return delegate.shouldRunAsRoot(); return delegate.shouldRunAsRoot();
@ -80,11 +77,62 @@ public class RunScriptOptions {
throw new IllegalArgumentException("blockOnComplete is immutable"); throw new IllegalArgumentException("blockOnComplete is immutable");
} }
@Override
public RunScriptOptions overrideLoginCredentials(LoginCredentials overridingCredentials) {
throw new IllegalArgumentException("overridingCredentials is immutable");
}
@Override
public RunScriptOptions overrideLoginPassword(String password) {
throw new IllegalArgumentException("password is immutable");
}
@Override
public RunScriptOptions overrideLoginPrivateKey(String privateKey) {
throw new IllegalArgumentException("privateKey is immutable");
}
@Override
public RunScriptOptions overrideAuthenticateSudo(boolean authenticateSudo) {
throw new IllegalArgumentException("authenticateSudo is immutable");
}
@Override
public String getLoginUser() {
return delegate.getLoginUser();
}
@Override
public Boolean shouldAuthenticateSudo() {
return delegate.shouldAuthenticateSudo();
}
@Override
public String getLoginPassword() {
return delegate.getLoginPassword();
}
@Override
public String getLoginPrivateKey() {
return delegate.getLoginPrivateKey();
}
@Override
public boolean shouldWrapInInitScript() {
return delegate.shouldWrapInInitScript();
}
@Deprecated
@Override @Override
public RunScriptOptions overrideLoginUserWith(String loginUser) { public RunScriptOptions overrideLoginUserWith(String loginUser) {
throw new IllegalArgumentException("loginUser is immutable"); throw new IllegalArgumentException("loginUser is immutable");
} }
@Override
public RunScriptOptions overrideLoginUser(String loginUser) {
throw new IllegalArgumentException("loginUser is immutable");
}
@Override @Override
public RunScriptOptions overrideLoginCredentialWith(String loginCredential) { public RunScriptOptions overrideLoginCredentialWith(String loginCredential) {
throw new IllegalArgumentException("loginCredential is immutable"); throw new IllegalArgumentException("loginCredential is immutable");
@ -95,6 +143,7 @@ public class RunScriptOptions {
throw new IllegalArgumentException("wrapInInitScript is immutable"); throw new IllegalArgumentException("wrapInInitScript is immutable");
} }
@Deprecated
@Override @Override
public RunScriptOptions overrideCredentialsWith(Credentials overridingCredentials) { public RunScriptOptions overrideCredentialsWith(Credentials overridingCredentials) {
throw new IllegalArgumentException("overridingCredentials is immutable"); throw new IllegalArgumentException("overridingCredentials is immutable");
@ -129,36 +178,72 @@ public class RunScriptOptions {
protected int port = -1; protected int port = -1;
protected int seconds = -1; protected int seconds = -1;
protected String taskName; protected String taskName;
protected Credentials overridingCredentials;
protected boolean runAsRoot = true; protected boolean runAsRoot = true;
protected boolean blockOnComplete = true; protected boolean blockOnComplete = true;
protected boolean wrapInInitScript = true; protected boolean wrapInInitScript = true;
protected String loginUser;
protected Boolean authenticateSudo;
protected String loginPassword;
protected String loginPrivateKey;
@Deprecated
public RunScriptOptions overrideCredentialsWith(Credentials overridingCredentials) { public RunScriptOptions overrideCredentialsWith(Credentials overridingCredentials) {
return overrideLoginCredentials(LoginCredentials.builder(overridingCredentials).build());
}
public RunScriptOptions overrideLoginCredentials(LoginCredentials overridingCredentials) {
checkNotNull(overridingCredentials, "overridingCredentials"); checkNotNull(overridingCredentials, "overridingCredentials");
this.overridingCredentials = overridingCredentials; this.loginUser = overridingCredentials.getUser();
this.loginPassword = overridingCredentials.getPassword();
this.loginPrivateKey = overridingCredentials.getPrivateKey();
this.authenticateSudo = overridingCredentials.shouldAuthenticateSudo() ? true : null;
return this; return this;
} }
@Deprecated
public RunScriptOptions overrideLoginUserWith(String loginUser) { public RunScriptOptions overrideLoginUserWith(String loginUser) {
return overrideLoginUser(loginUser);
}
public RunScriptOptions overrideLoginUser(String loginUser) {
checkNotNull(loginUser, "loginUser"); checkNotNull(loginUser, "loginUser");
org.jclouds.domain.Credentials.Builder<? extends Credentials> builder = overridingCredentials != null ? overridingCredentials this.loginUser = loginUser;
.toBuilder() : new Credentials.Builder<Credentials>();
this.overridingCredentials = builder.identity(loginUser).build();
return this; return this;
} }
@Deprecated
public RunScriptOptions overrideLoginCredentialWith(String loginCredential) { public RunScriptOptions overrideLoginCredentialWith(String loginCredential) {
checkNotNull(loginCredential, "loginCredential"); checkNotNull(loginCredential, "loginCredential");
org.jclouds.domain.Credentials.Builder<? extends Credentials> builder = overridingCredentials != null ? overridingCredentials if (CredentialUtils.isPrivateKeyCredential(loginCredential)) {
.toBuilder() : new Credentials.Builder<Credentials>(); this.loginPrivateKey = loginCredential;
this.overridingCredentials = builder.credential(loginCredential).build(); } else {
this.loginPassword = loginCredential;
}
return this;
}
public RunScriptOptions overrideLoginPassword(String password) {
checkNotNull(password, "password");
this.loginPassword = password;
return this;
}
public RunScriptOptions overrideLoginPrivateKey(String privateKey) {
checkNotNull(privateKey, "privateKey");
this.loginPrivateKey = privateKey;
return this;
}
public RunScriptOptions overrideAuthenticateSudo(boolean authenticateSudo) {
this.authenticateSudo = authenticateSudo;
return this; return this;
} }
/** /**
* @return What to call the task relating to this script; default * @return What to call the task relating to this script; default
* {@code jclouds-script-timestamp} where timestamp is millis since epoch * {@code jclouds-script-timestamp} where timestamp is millis since
* epoch
* *
*/ */
public RunScriptOptions nameTask(String name) { public RunScriptOptions nameTask(String name) {
@ -176,8 +261,9 @@ public class RunScriptOptions {
* <p/> * <p/>
* *
* @param wrapInInitScript * @param wrapInInitScript
* if the command is long-running, use this option to ensure it is wrapInInitScripted * if the command is long-running, use this option to ensure it is
* properly. (ex. have jclouds wrap it an init script, nohup, etc) * wrapInInitScripted properly. (ex. have jclouds wrap it an init
* script, nohup, etc)
* @return * @return
*/ */
public RunScriptOptions wrapInInitScript(boolean wrapInInitScript) { public RunScriptOptions wrapInInitScript(boolean wrapInInitScript) {
@ -189,10 +275,10 @@ public class RunScriptOptions {
* As of version 1.1.0, we cannot kick off a script unless a node is in * As of version 1.1.0, we cannot kick off a script unless a node is in
* RUNNING state. * RUNNING state.
* *
* @param blockOnComplete (default true) * @param blockOnComplete
* false means kick off the script in the background, but don't * (default true) false means kick off the script in the
* wait for it to finish. (as of version 1.1.0, implemented as * background, but don't wait for it to finish. (as of version
* nohup) * 1.1.0, implemented as nohup)
*/ */
public RunScriptOptions blockOnComplete(boolean blockOnComplete) { public RunScriptOptions blockOnComplete(boolean blockOnComplete) {
this.blockOnComplete = blockOnComplete; this.blockOnComplete = blockOnComplete;
@ -223,17 +309,52 @@ public class RunScriptOptions {
} }
/** /**
* Whether to override the credentials with ones supplied in call to
* {@link org.jclouds.compute.ComputeService#runScriptOnNodesWithTag}. By default, true.
* *
* @return value * @return the login user for
* {@link org.jclouds.compute.ComputeService#runScriptOnNode}. By
* default, null.
*/ */
public Credentials getOverridingCredentials() { @Nullable
return overridingCredentials; public String getLoginUser() {
return loginUser;
} }
/** /**
* Whether to run the script as root (or run with current privileges). By default, true. *
* @return Whether the login user should authenticate sudo during
* {@link org.jclouds.compute.ComputeService#runScriptOnNode}. By
* default, null.
*/
@Nullable
public Boolean shouldAuthenticateSudo() {
return authenticateSudo;
}
/**
*
* @return the login password for
* {@link org.jclouds.compute.ComputeService#runScriptOnNode}. By
* default, null.
*/
@Nullable
public String getLoginPassword() {
return loginPassword;
}
/**
*
* @return the login ssh key for
* {@link org.jclouds.compute.ComputeService#runScriptOnNode}. By
* default, null.
*/
@Nullable
public String getLoginPrivateKey() {
return loginPrivateKey;
}
/**
* Whether to run the script as root (or run with current privileges). By
* default, true.
* *
* @return value * @return value
*/ */
@ -264,26 +385,54 @@ public class RunScriptOptions {
return options.nameTask(name); return options.nameTask(name);
} }
@Deprecated
public static RunScriptOptions overrideLoginUserWith(String user) { public static RunScriptOptions overrideLoginUserWith(String user) {
RunScriptOptions options = new RunScriptOptions(); RunScriptOptions options = new RunScriptOptions();
return options.overrideLoginUserWith(user); return options.overrideLoginUserWith(user);
} }
public static RunScriptOptions overrideLoginUser(String user) {
RunScriptOptions options = new RunScriptOptions();
return options.overrideLoginUser(user);
}
public static RunScriptOptions overrideLoginPassword(String password) {
RunScriptOptions options = new RunScriptOptions();
return options.overrideLoginPassword(password);
}
public static RunScriptOptions overrideLoginPrivateKey(String privateKey) {
RunScriptOptions options = new RunScriptOptions();
return options.overrideLoginPrivateKey(privateKey);
}
public static RunScriptOptions overrideAuthenticateSudo(boolean authenticateSudo) {
RunScriptOptions options = new RunScriptOptions();
return options.overrideAuthenticateSudo(authenticateSudo);
}
@Deprecated
public static RunScriptOptions overrideLoginCredentialWith(String credential) { public static RunScriptOptions overrideLoginCredentialWith(String credential) {
RunScriptOptions options = new RunScriptOptions(); RunScriptOptions options = new RunScriptOptions();
return options.overrideLoginCredentialWith(credential); return options.overrideLoginCredentialWith(credential);
} }
@Deprecated
public static RunScriptOptions overrideCredentialsWith(Credentials credentials) { public static RunScriptOptions overrideCredentialsWith(Credentials credentials) {
RunScriptOptions options = new RunScriptOptions(); RunScriptOptions options = new RunScriptOptions();
return options.overrideCredentialsWith(credentials); return options.overrideCredentialsWith(credentials);
} }
public static RunScriptOptions overrideLoginCredentials(LoginCredentials credentials) {
RunScriptOptions options = new RunScriptOptions();
return options.overrideLoginCredentials(credentials);
}
public static RunScriptOptions runAsRoot(boolean value) { public static RunScriptOptions runAsRoot(boolean value) {
RunScriptOptions options = new RunScriptOptions(); RunScriptOptions options = new RunScriptOptions();
return options.runAsRoot(value); return options.runAsRoot(value);
} }
/** /**
* @see RunScriptOptions#blockOnComplete(boolean) * @see RunScriptOptions#blockOnComplete(boolean)
*/ */
@ -306,9 +455,74 @@ public class RunScriptOptions {
@Override @Override
public String toString() { public String toString() {
return "[overridingCredentials=" + (overridingCredentials != null) + ", port:seconds=" + port + ":" + seconds return "[loginUser=" + loginUser + ", loginPasswordPresent=" + (loginPassword != null)
+ ", runAsRoot=" + runAsRoot + ", blockOnComplete=" + blockOnComplete + ", wrapInInitScript=" + ", loginPrivateKeyPresent=" + (loginPrivateKey != null) + ", shouldAuthenticateSudo=" + authenticateSudo
+ wrapInInitScript + "]"; + ", port:seconds=" + port + ":" + seconds + ", runAsRoot=" + runAsRoot + ", blockOnComplete="
+ blockOnComplete + ", wrapInInitScript=" + wrapInInitScript + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((authenticateSudo == null) ? 0 : authenticateSudo.hashCode());
result = prime * result + (blockOnComplete ? 1231 : 1237);
result = prime * result + ((loginPassword == null) ? 0 : loginPassword.hashCode());
result = prime * result + ((loginPrivateKey == null) ? 0 : loginPrivateKey.hashCode());
result = prime * result + ((loginUser == null) ? 0 : loginUser.hashCode());
result = prime * result + port;
result = prime * result + (runAsRoot ? 1231 : 1237);
result = prime * result + seconds;
result = prime * result + ((taskName == null) ? 0 : taskName.hashCode());
result = prime * result + (wrapInInitScript ? 1231 : 1237);
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
RunScriptOptions other = (RunScriptOptions) obj;
if (authenticateSudo == null) {
if (other.authenticateSudo != null)
return false;
} else if (!authenticateSudo.equals(other.authenticateSudo))
return false;
if (blockOnComplete != other.blockOnComplete)
return false;
if (loginPassword == null) {
if (other.loginPassword != null)
return false;
} else if (!loginPassword.equals(other.loginPassword))
return false;
if (loginPrivateKey == null) {
if (other.loginPrivateKey != null)
return false;
} else if (!loginPrivateKey.equals(other.loginPrivateKey))
return false;
if (loginUser == null) {
if (other.loginUser != null)
return false;
} else if (!loginUser.equals(other.loginUser))
return false;
if (port != other.port)
return false;
if (runAsRoot != other.runAsRoot)
return false;
if (seconds != other.seconds)
return false;
if (taskName == null) {
if (other.taskName != null)
return false;
} else if (!taskName.equals(other.taskName))
return false;
if (wrapInInitScript != other.wrapInInitScript)
return false;
return true;
} }
} }

View File

@ -28,6 +28,7 @@ import java.util.Set;
import org.jclouds.compute.domain.NodeState; import org.jclouds.compute.domain.NodeState;
import org.jclouds.domain.Credentials; import org.jclouds.domain.Credentials;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.io.Payload; import org.jclouds.io.Payload;
import org.jclouds.scriptbuilder.domain.Statement; import org.jclouds.scriptbuilder.domain.Statement;
import org.jclouds.scriptbuilder.domain.Statements; import org.jclouds.scriptbuilder.domain.Statements;
@ -82,8 +83,14 @@ public class TemplateOptions extends RunScriptOptions implements Cloneable {
to.blockUntilRunning(false); to.blockUntilRunning(false);
if (!this.shouldBlockOnComplete()) if (!this.shouldBlockOnComplete())
to.blockOnComplete(false); to.blockOnComplete(false);
if (this.getOverridingCredentials() != null) if (this.getLoginUser() != null)
to.overrideCredentialsWith(this.getOverridingCredentials()); to.overrideLoginUser(this.getLoginUser());
if (this.getLoginPassword() != null)
to.overrideLoginPassword(this.getLoginPassword());
if (this.getLoginPrivateKey() != null)
to.overrideLoginPrivateKey(this.getLoginPrivateKey());
if (this.shouldAuthenticateSudo() != null)
to.overrideAuthenticateSudo(this.shouldAuthenticateSudo());
if (this.getTaskName() != null) if (this.getTaskName() != null)
to.nameTask(this.getTaskName()); to.nameTask(this.getTaskName());
} }
@ -113,11 +120,6 @@ public class TemplateOptions extends RunScriptOptions implements Cloneable {
return delegate.getSeconds(); return delegate.getSeconds();
} }
@Override
public Credentials getOverridingCredentials() {
return delegate.getOverridingCredentials();
}
@Override @Override
public boolean shouldRunAsRoot() { public boolean shouldRunAsRoot() {
return delegate.shouldRunAsRoot(); return delegate.shouldRunAsRoot();
@ -191,21 +193,6 @@ public class TemplateOptions extends RunScriptOptions implements Cloneable {
throw new IllegalArgumentException("runAsRoot is immutable"); throw new IllegalArgumentException("runAsRoot is immutable");
} }
@Override
public TemplateOptions overrideCredentialsWith(Credentials overridingCredentials) {
throw new IllegalArgumentException("credentials are immutable");
}
@Override
public TemplateOptions overrideLoginUserWith(String loginUser) {
throw new IllegalArgumentException("credentials are immutable");
}
@Override
public TemplateOptions overrideLoginCredentialWith(String loginCredential) {
throw new IllegalArgumentException("credentials are immutable");
}
@Override @Override
public TemplateOptions wrapInInitScript(boolean wrapInInitScript) { public TemplateOptions wrapInInitScript(boolean wrapInInitScript) {
throw new IllegalArgumentException("wrapInInitScript is immutable"); throw new IllegalArgumentException("wrapInInitScript is immutable");
@ -216,6 +203,68 @@ public class TemplateOptions extends RunScriptOptions implements Cloneable {
throw new IllegalArgumentException("blockOnComplete is immutable"); throw new IllegalArgumentException("blockOnComplete is immutable");
} }
@Override
public TemplateOptions overrideLoginCredentials(LoginCredentials overridingCredentials) {
throw new IllegalArgumentException("overridingCredentials is immutable");
}
@Override
public TemplateOptions overrideLoginPassword(String password) {
throw new IllegalArgumentException("password is immutable");
}
@Override
public TemplateOptions overrideLoginPrivateKey(String privateKey) {
throw new IllegalArgumentException("privateKey is immutable");
}
@Override
public TemplateOptions overrideAuthenticateSudo(boolean authenticateSudo) {
throw new IllegalArgumentException("authenticateSudo is immutable");
}
@Override
public String getLoginUser() {
return delegate.getLoginUser();
}
@Override
public Boolean shouldAuthenticateSudo() {
return delegate.shouldAuthenticateSudo();
}
@Override
public String getLoginPassword() {
return delegate.getLoginPassword();
}
@Override
public String getLoginPrivateKey() {
return delegate.getLoginPrivateKey();
}
@Deprecated
@Override
public TemplateOptions overrideCredentialsWith(Credentials overridingCredentials) {
throw new IllegalArgumentException("overridingCredentials is immutable");
}
@Deprecated
@Override
public TemplateOptions overrideLoginUserWith(String loginUser) {
throw new IllegalArgumentException("loginUser is immutable");
}
@Override
public TemplateOptions overrideLoginUser(String loginUser) {
throw new IllegalArgumentException("loginUser is immutable");
}
@Override
public TemplateOptions overrideLoginCredentialWith(String loginCredential) {
throw new IllegalArgumentException("loginCredential is immutable");
}
@Override @Override
public <T extends TemplateOptions> T as(Class<T> clazz) { public <T extends TemplateOptions> T as(Class<T> clazz) {
return delegate.as(clazz); return delegate.as(clazz);
@ -465,21 +514,49 @@ public class TemplateOptions extends RunScriptOptions implements Cloneable {
return options.nameTask(name); return options.nameTask(name);
} }
@Deprecated
public static TemplateOptions overrideLoginUserWith(String user) { public static TemplateOptions overrideLoginUserWith(String user) {
TemplateOptions options = new TemplateOptions(); TemplateOptions options = new TemplateOptions();
return options.overrideLoginUserWith(user); return options.overrideLoginUserWith(user);
} }
public static TemplateOptions overrideLoginUser(String user) {
TemplateOptions options = new TemplateOptions();
return options.overrideLoginUser(user);
}
public static TemplateOptions overrideLoginPassword(String password) {
TemplateOptions options = new TemplateOptions();
return options.overrideLoginPassword(password);
}
public static TemplateOptions overrideLoginPrivateKey(String privateKey) {
TemplateOptions options = new TemplateOptions();
return options.overrideLoginPrivateKey(privateKey);
}
public static TemplateOptions overrideAuthenticateSudo(boolean authenticateSudo) {
TemplateOptions options = new TemplateOptions();
return options.overrideAuthenticateSudo(authenticateSudo);
}
@Deprecated
public static TemplateOptions overrideLoginCredentialWith(String credential) { public static TemplateOptions overrideLoginCredentialWith(String credential) {
TemplateOptions options = new TemplateOptions(); TemplateOptions options = new TemplateOptions();
return options.overrideLoginCredentialWith(credential); return options.overrideLoginCredentialWith(credential);
} }
@Deprecated
public static TemplateOptions overrideCredentialsWith(Credentials credentials) { public static TemplateOptions overrideCredentialsWith(Credentials credentials) {
TemplateOptions options = new TemplateOptions(); TemplateOptions options = new TemplateOptions();
return options.overrideCredentialsWith(credentials); return options.overrideCredentialsWith(credentials);
} }
public static TemplateOptions overrideLoginCredentials(LoginCredentials credentials) {
TemplateOptions options = new TemplateOptions();
return options.overrideLoginCredentials(credentials);
}
public static TemplateOptions runAsRoot(boolean value) { public static TemplateOptions runAsRoot(boolean value) {
TemplateOptions options = new TemplateOptions(); TemplateOptions options = new TemplateOptions();
return options.runAsRoot(value); return options.runAsRoot(value);
@ -736,21 +813,6 @@ public class TemplateOptions extends RunScriptOptions implements Cloneable {
return TemplateOptions.class.cast(super.runAsRoot(runAsRoot)); return TemplateOptions.class.cast(super.runAsRoot(runAsRoot));
} }
@Override
public TemplateOptions overrideCredentialsWith(Credentials overridingCredentials) {
return TemplateOptions.class.cast(super.overrideCredentialsWith(overridingCredentials));
}
@Override
public TemplateOptions overrideLoginUserWith(String loginUser) {
return TemplateOptions.class.cast(super.overrideLoginUserWith(loginUser));
}
@Override
public TemplateOptions overrideLoginCredentialWith(String loginCredential) {
return TemplateOptions.class.cast(super.overrideLoginCredentialWith(loginCredential));
}
@Override @Override
public TemplateOptions wrapInInitScript(boolean wrapInInitScript) { public TemplateOptions wrapInInitScript(boolean wrapInInitScript) {
return TemplateOptions.class.cast(super.wrapInInitScript(wrapInInitScript)); return TemplateOptions.class.cast(super.wrapInInitScript(wrapInInitScript));
@ -760,4 +822,48 @@ public class TemplateOptions extends RunScriptOptions implements Cloneable {
public TemplateOptions blockOnComplete(boolean blockOnComplete) { public TemplateOptions blockOnComplete(boolean blockOnComplete) {
return TemplateOptions.class.cast(super.blockOnComplete(blockOnComplete)); return TemplateOptions.class.cast(super.blockOnComplete(blockOnComplete));
} }
@Deprecated
@Override
public TemplateOptions overrideCredentialsWith(Credentials overridingCredentials) {
return TemplateOptions.class.cast(super.overrideCredentialsWith(overridingCredentials));
}
@Deprecated
@Override
public TemplateOptions overrideLoginUserWith(String loginUser) {
return TemplateOptions.class.cast(super.overrideLoginUserWith(loginUser));
}
@Deprecated
@Override
public TemplateOptions overrideLoginCredentialWith(String loginCredential) {
return TemplateOptions.class.cast(super.overrideLoginCredentialWith(loginCredential));
}
@Override
public TemplateOptions overrideLoginCredentials(LoginCredentials overridingCredentials) {
return TemplateOptions.class.cast(super.overrideLoginCredentials(overridingCredentials));
}
@Override
public TemplateOptions overrideLoginPassword(String password) {
return TemplateOptions.class.cast(super.overrideLoginPassword(password));
}
@Override
public TemplateOptions overrideLoginPrivateKey(String privateKey) {
return TemplateOptions.class.cast(super.overrideLoginPrivateKey(privateKey));
}
@Override
public TemplateOptions overrideLoginUser(String loginUser) {
return TemplateOptions.class.cast(super.overrideLoginUser(loginUser));
}
@Override
public TemplateOptions overrideAuthenticateSudo(boolean authenticateSudo) {
return TemplateOptions.class.cast(super.overrideAuthenticateSudo(authenticateSudo));
}
} }

View File

@ -20,26 +20,39 @@ package org.jclouds.compute.strategy;
import org.jclouds.compute.strategy.impl.ReturnCredentialsBoundToImage; import org.jclouds.compute.strategy.impl.ReturnCredentialsBoundToImage;
import org.jclouds.domain.Credentials; import org.jclouds.domain.Credentials;
import org.jclouds.domain.LoginCredentials;
import com.google.common.base.Function;
import com.google.inject.ImplementedBy; import com.google.inject.ImplementedBy;
/** /**
* @author Oleksiy Yarmula * @author Oleksiy Yarmula
*/ */
@ImplementedBy(ReturnCredentialsBoundToImage.class) @ImplementedBy(ReturnCredentialsBoundToImage.class)
public interface PopulateDefaultLoginCredentialsForImageStrategy { public interface PopulateDefaultLoginCredentialsForImageStrategy extends Function<Object, LoginCredentials> {
/**
* Processes the resource to determine credentials.
*
* @param resourceToAuthenticate
* this can be any resource, such as an image,
* running server instance or other. It's the
* responsibility of an implementation to apply
* the cloud-specific logic.
* @return credentials object. Note: the key
* may not be set, but the identity must be set
*/
Credentials execute(Object resourceToAuthenticate);
/**
* <h4>will be removed in jclouds 1.4.0</h4> <br/>
*
* Processes the resource to determine credentials.
*
* @param resourceToAuthenticate
* this can be any resource, such as an image, running server
* instance or other. It's the responsibility of an implementation
* to apply the cloud-specific logic.
* @return credentials object. Note: the key may not be set, but the identity
* must be set
*/
@Deprecated
Credentials execute(Object resourceToAuthenticate);
/**
*
* Processes the cloud-specific resources to determine the login credentials.
*
* @param resourceToAuthenticate
* this is the cloud-specific representation of the image object.
* @return credentials parsed from the image if not null
*/
LoginCredentials apply(Object image);
} }

View File

@ -19,13 +19,13 @@
package org.jclouds.compute.strategy; package org.jclouds.compute.strategy;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import static org.jclouds.domain.Credentials.NO_CREDENTIALS;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
import org.jclouds.compute.domain.Template; import org.jclouds.compute.domain.Template;
import org.jclouds.domain.Credentials; import org.jclouds.domain.LoginCredentials;
import org.jclouds.domain.LoginCredentials.Builder;
import com.google.common.base.Function; import com.google.common.base.Function;
@ -35,25 +35,29 @@ import com.google.common.base.Function;
*/ */
@Singleton @Singleton
public class PrioritizeCredentialsFromTemplate { public class PrioritizeCredentialsFromTemplate {
private final Function<Template, Credentials> credentialsFromImageOrTemplateOptions; private final Function<Template, LoginCredentials> credentialsFromImageOrTemplateOptions;
@Inject @Inject
public PrioritizeCredentialsFromTemplate(Function<Template, Credentials> credentialsFromImageOrTemplateOptions) { public PrioritizeCredentialsFromTemplate(Function<Template, LoginCredentials> credentialsFromImageOrTemplateOptions) {
this.credentialsFromImageOrTemplateOptions = checkNotNull(credentialsFromImageOrTemplateOptions, this.credentialsFromImageOrTemplateOptions = checkNotNull(credentialsFromImageOrTemplateOptions,
"credentialsFromImageOrTemplateOptions"); "credentialsFromImageOrTemplateOptions");
} }
public Credentials apply(Template template, Credentials fromNode) { public LoginCredentials apply(Template template, LoginCredentials fromNode) {
Credentials creds = (fromNode != null) ? fromNode : NO_CREDENTIALS; LoginCredentials creds = fromNode;
Credentials credsFromParameters = credentialsFromImageOrTemplateOptions.apply(template); LoginCredentials credsFromParameters = credentialsFromImageOrTemplateOptions.apply(template);
if (credsFromParameters != null) { if (credsFromParameters != null) {
if (credsFromParameters.identity != null) Builder builder = LoginCredentials.builder(creds);
creds = creds.toBuilder().identity(credsFromParameters.identity).build(); if (credsFromParameters.getUser() != null)
if (credsFromParameters.credential != null) builder.user(credsFromParameters.getUser());
creds = creds.toBuilder().credential(credsFromParameters.credential).build(); if (credsFromParameters.getPassword() != null)
builder.password(credsFromParameters.getPassword());
if (credsFromParameters.getPrivateKey() != null)
builder.privateKey(credsFromParameters.getPrivateKey());
if (credsFromParameters.shouldAuthenticateSudo())
builder.authenticateSudo(true);
creds = builder.build();
} }
if (creds.equals(NO_CREDENTIALS))
creds = null;
return creds; return creds;
} }

View File

@ -32,6 +32,7 @@ import org.jclouds.compute.ComputeServiceAdapter;
import org.jclouds.compute.ComputeServiceAdapter.NodeAndInitialCredentials; import org.jclouds.compute.ComputeServiceAdapter.NodeAndInitialCredentials;
import org.jclouds.compute.domain.ComputeMetadata; import org.jclouds.compute.domain.ComputeMetadata;
import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.compute.domain.NodeMetadataBuilder;
import org.jclouds.compute.domain.NodeState; import org.jclouds.compute.domain.NodeState;
import org.jclouds.compute.domain.Template; import org.jclouds.compute.domain.Template;
import org.jclouds.compute.predicates.NodePredicates; import org.jclouds.compute.predicates.NodePredicates;
@ -45,9 +46,11 @@ import org.jclouds.compute.strategy.RebootNodeStrategy;
import org.jclouds.compute.strategy.ResumeNodeStrategy; import org.jclouds.compute.strategy.ResumeNodeStrategy;
import org.jclouds.compute.strategy.SuspendNodeStrategy; import org.jclouds.compute.strategy.SuspendNodeStrategy;
import org.jclouds.domain.Credentials; import org.jclouds.domain.Credentials;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.logging.Logger; import org.jclouds.logging.Logger;
import com.google.common.base.Function; import com.google.common.base.Function;
import com.google.common.base.Functions;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
@ -76,9 +79,25 @@ public class AdaptingComputeServiceStrategies<N, H, I, L> implements CreateNodeW
this.prioritizeCredentialsFromTemplate = checkNotNull(prioritizeCredentialsFromTemplate, this.prioritizeCredentialsFromTemplate = checkNotNull(prioritizeCredentialsFromTemplate,
"prioritizeCredentialsFromTemplate"); "prioritizeCredentialsFromTemplate");
this.client = checkNotNull(client, "client"); this.client = checkNotNull(client, "client");
this.nodeMetadataAdapter = checkNotNull(nodeMetadataAdapter, "nodeMetadataAdapter"); this.nodeMetadataAdapter = Functions.compose(addLoginCredentials,
checkNotNull(nodeMetadataAdapter, "nodeMetadataAdapter"));
} }
private final Function<NodeMetadata, NodeMetadata> addLoginCredentials = new Function<NodeMetadata, NodeMetadata>() {
@Override
public NodeMetadata apply(NodeMetadata arg0) {
return credentialStore.containsKey("node#" + arg0.getId()) ? NodeMetadataBuilder.fromNodeMetadata(arg0)
.credentials(LoginCredentials.builder(credentialStore.get("node#" + arg0.getId())).build()).build()
: arg0;
}
@Override
public String toString() {
return "addLoginCredentialsFromCredentialStore()";
}
};
@Override @Override
public Iterable<? extends ComputeMetadata> listNodes() { public Iterable<? extends ComputeMetadata> listNodes() {
return listDetailsOnNodesMatching(NodePredicates.all()); return listDetailsOnNodesMatching(NodePredicates.all());
@ -92,7 +111,9 @@ public class AdaptingComputeServiceStrategies<N, H, I, L> implements CreateNodeW
@Override @Override
public NodeMetadata getNode(String id) { public NodeMetadata getNode(String id) {
N node = client.getNode(checkNotNull(id, "id")); N node = client.getNode(checkNotNull(id, "id"));
return node == null ? null : nodeMetadataAdapter.apply(node); if (node == null)
return null;
return nodeMetadataAdapter.apply(node);
} }
@Override @Override
@ -141,8 +162,8 @@ public class AdaptingComputeServiceStrategies<N, H, I, L> implements CreateNodeW
checkState(template != null, "template must be specified"); checkState(template != null, "template must be specified");
NodeAndInitialCredentials<N> from = client.createNodeWithGroupEncodedIntoName(group, name, template); NodeAndInitialCredentials<N> from = client.createNodeWithGroupEncodedIntoName(group, name, template);
Credentials fromNode = from.getCredentials(); LoginCredentials fromNode = from.getCredentials();
Credentials creds = prioritizeCredentialsFromTemplate.apply(template, fromNode); LoginCredentials creds = prioritizeCredentialsFromTemplate.apply(template, fromNode);
if (creds != null) if (creds != null)
credentialStore.put("node#" + from.getNodeId(), creds); credentialStore.put("node#" + from.getNodeId(), creds);
NodeMetadata node = nodeMetadataAdapter.apply(from.getNode()); NodeMetadata node = nodeMetadataAdapter.apply(from.getNode());

View File

@ -28,6 +28,7 @@ import org.jclouds.compute.domain.Image;
import org.jclouds.compute.domain.OsFamily; import org.jclouds.compute.domain.OsFamily;
import org.jclouds.compute.strategy.PopulateDefaultLoginCredentialsForImageStrategy; import org.jclouds.compute.strategy.PopulateDefaultLoginCredentialsForImageStrategy;
import org.jclouds.domain.Credentials; import org.jclouds.domain.Credentials;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.javax.annotation.Nullable; import org.jclouds.javax.annotation.Nullable;
/** /**
@ -36,23 +37,28 @@ import org.jclouds.javax.annotation.Nullable;
@Singleton @Singleton
public class ReturnCredentialsBoundToImage implements PopulateDefaultLoginCredentialsForImageStrategy { public class ReturnCredentialsBoundToImage implements PopulateDefaultLoginCredentialsForImageStrategy {
protected final Credentials creds; protected final LoginCredentials creds;
@Inject @Inject
public ReturnCredentialsBoundToImage(@Nullable @Named("image") Credentials creds) { public ReturnCredentialsBoundToImage(@Nullable @Named("image") LoginCredentials creds) {
this.creds = creds; this.creds = creds;
} }
@Override @Override
public Credentials execute(Object resourceToAuthenticate) { public LoginCredentials apply(Object resourceToAuthenticate) {
checkState(resourceToAuthenticate instanceof Image, "this is only valid for images"); checkState(resourceToAuthenticate instanceof Image, "this is only valid for images");
if (creds != null) if (creds != null)
return creds; return creds;
Image image = Image.class.cast(resourceToAuthenticate); Image image = Image.class.cast(resourceToAuthenticate);
if (image.getOperatingSystem() != null && OsFamily.WINDOWS.equals(image.getOperatingSystem().getFamily())) { if (image.getOperatingSystem() != null && OsFamily.WINDOWS.equals(image.getOperatingSystem().getFamily())) {
return new Credentials("Administrator", null); return LoginCredentials.builder().user("Administrator").build();
} else { } else {
return new Credentials("root", null); return LoginCredentials.builder().user("root").build();
} }
} }
@Override
public Credentials execute(Object resourceToAuthenticate) {
return apply(resourceToAuthenticate);
}
} }

View File

@ -38,8 +38,8 @@ import org.jclouds.compute.domain.NodeState;
import org.jclouds.compute.domain.OperatingSystem; import org.jclouds.compute.domain.OperatingSystem;
import org.jclouds.compute.domain.OsFamily; import org.jclouds.compute.domain.OsFamily;
import org.jclouds.compute.domain.Template; import org.jclouds.compute.domain.Template;
import org.jclouds.domain.Credentials;
import org.jclouds.domain.Location; import org.jclouds.domain.Location;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.location.suppliers.JustProvider; import org.jclouds.location.suppliers.JustProvider;
import org.jclouds.rest.ResourceNotFoundException; import org.jclouds.rest.ResourceNotFoundException;
@ -63,14 +63,12 @@ public class StubComputeServiceAdapter implements JCloudsNativeComputeServiceAda
private final String passwordPrefix; private final String passwordPrefix;
private final Supplier<Set<? extends Location>> locationSupplier; private final Supplier<Set<? extends Location>> locationSupplier;
private final Map<OsFamily, Map<String, String>> osToVersionMap; private final Map<OsFamily, Map<String, String>> osToVersionMap;
private final Map<String, Credentials> credentialStore;
@Inject @Inject
public StubComputeServiceAdapter(ConcurrentMap<String, NodeMetadata> nodes, Supplier<Location> location, public StubComputeServiceAdapter(ConcurrentMap<String, NodeMetadata> nodes, Supplier<Location> location,
@Named("NODE_ID") Provider<Integer> idProvider, @Named("PUBLIC_IP_PREFIX") String publicIpPrefix, @Named("NODE_ID") Provider<Integer> idProvider, @Named("PUBLIC_IP_PREFIX") String publicIpPrefix,
@Named("PRIVATE_IP_PREFIX") String privateIpPrefix, @Named("PASSWORD_PREFIX") String passwordPrefix, @Named("PRIVATE_IP_PREFIX") String privateIpPrefix, @Named("PASSWORD_PREFIX") String passwordPrefix,
JustProvider locationSupplier, Map<OsFamily, Map<String, String>> osToVersionMap, JustProvider locationSupplier, Map<OsFamily, Map<String, String>> osToVersionMap) {
Map<String, Credentials> credentialStore) {
this.nodes = nodes; this.nodes = nodes;
this.location = location; this.location = location;
this.idProvider = idProvider; this.idProvider = idProvider;
@ -79,7 +77,6 @@ public class StubComputeServiceAdapter implements JCloudsNativeComputeServiceAda
this.passwordPrefix = passwordPrefix; this.passwordPrefix = passwordPrefix;
this.locationSupplier = locationSupplier; this.locationSupplier = locationSupplier;
this.osToVersionMap = osToVersionMap; this.osToVersionMap = osToVersionMap;
this.credentialStore = credentialStore;
} }
@Override @Override
@ -99,9 +96,8 @@ public class StubComputeServiceAdapter implements JCloudsNativeComputeServiceAda
builder.state(NodeState.PENDING); builder.state(NodeState.PENDING);
builder.publicAddresses(ImmutableSet.<String> of(publicIpPrefix + id)); builder.publicAddresses(ImmutableSet.<String> of(publicIpPrefix + id));
builder.privateAddresses(ImmutableSet.<String> of(privateIpPrefix + id)); builder.privateAddresses(ImmutableSet.<String> of(privateIpPrefix + id));
builder.credentials(new Credentials(null, passwordPrefix + id)); builder.credentials(LoginCredentials.builder().user("root").password(passwordPrefix + id).build());
NodeMetadata node = builder.build(); NodeMetadata node = builder.build();
credentialStore.put("node#" + node.getId(), node.getCredentials());
nodes.put(node.getId(), node); nodes.put(node.getId(), node);
StubComputeServiceDependenciesModule.setState(node, NodeState.RUNNING, 100); StubComputeServiceDependenciesModule.setState(node, NodeState.RUNNING, 100);
return new NodeWithInitialCredentials(node); return new NodeWithInitialCredentials(node);
@ -116,7 +112,6 @@ public class StubComputeServiceAdapter implements JCloudsNativeComputeServiceAda
@Override @Override
public Iterable<Image> listImages() { public Iterable<Image> listImages() {
Credentials defaultCredentials = new Credentials("root", null);
// initializing as a List, as ImmutableSet does not allow you to put // initializing as a List, as ImmutableSet does not allow you to put
// duplicates // duplicates
Builder<Image> images = ImmutableList.<Image> builder(); Builder<Image> images = ImmutableList.<Image> builder();
@ -127,7 +122,7 @@ public class StubComputeServiceAdapter implements JCloudsNativeComputeServiceAda
String desc = String.format("stub %s %s", osVersions.getKey(), is64Bit); String desc = String.format("stub %s %s", osVersions.getKey(), is64Bit);
images.add(new ImageBuilder().ids(id++ + "").name(osVersions.getKey().name()).location(location.get()) images.add(new ImageBuilder().ids(id++ + "").name(osVersions.getKey().name()).location(location.get())
.operatingSystem(new OperatingSystem(osVersions.getKey(), desc, version, null, desc, is64Bit)) .operatingSystem(new OperatingSystem(osVersions.getKey(), desc, version, null, desc, is64Bit))
.description(desc).defaultCredentials(defaultCredentials).build()); .description(desc).build());
} }
} }
return images.build(); return images.build();
@ -146,9 +141,7 @@ public class StubComputeServiceAdapter implements JCloudsNativeComputeServiceAda
@Override @Override
public NodeMetadata getNode(String id) { public NodeMetadata getNode(String id) {
NodeMetadata node = nodes.get(id); return nodes.get(id);
return node == null ? null : NodeMetadataBuilder.fromNodeMetadata(node)
.credentials(credentialStore.get("node#" + node.getId())).build();
} }
@Override @Override

View File

@ -40,7 +40,7 @@ import static org.jclouds.compute.RunScriptData.startJBoss;
import static org.jclouds.compute.options.RunScriptOptions.Builder.nameTask; import static org.jclouds.compute.options.RunScriptOptions.Builder.nameTask;
import static org.jclouds.compute.options.RunScriptOptions.Builder.wrapInInitScript; import static org.jclouds.compute.options.RunScriptOptions.Builder.wrapInInitScript;
import static org.jclouds.compute.options.TemplateOptions.Builder.inboundPorts; import static org.jclouds.compute.options.TemplateOptions.Builder.inboundPorts;
import static org.jclouds.compute.options.TemplateOptions.Builder.overrideCredentialsWith; import static org.jclouds.compute.options.TemplateOptions.Builder.overrideLoginCredentials;
import static org.jclouds.compute.options.TemplateOptions.Builder.runAsRoot; import static org.jclouds.compute.options.TemplateOptions.Builder.runAsRoot;
import static org.jclouds.compute.predicates.NodePredicates.TERMINATED; import static org.jclouds.compute.predicates.NodePredicates.TERMINATED;
import static org.jclouds.compute.predicates.NodePredicates.all; import static org.jclouds.compute.predicates.NodePredicates.all;
@ -85,6 +85,7 @@ import org.jclouds.compute.options.TemplateOptions;
import org.jclouds.domain.Credentials; import org.jclouds.domain.Credentials;
import org.jclouds.domain.Location; import org.jclouds.domain.Location;
import org.jclouds.domain.LocationScope; import org.jclouds.domain.LocationScope;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.logging.log4j.config.Log4JLoggingModule; import org.jclouds.logging.log4j.config.Log4JLoggingModule;
import org.jclouds.net.IPSocket; import org.jclouds.net.IPSocket;
import org.jclouds.predicates.RetryablePredicate; import org.jclouds.predicates.RetryablePredicate;
@ -228,13 +229,13 @@ public abstract class BaseComputeServiceLiveTest extends BaseVersionedServiceLiv
try { try {
Set<? extends NodeMetadata> nodes = client.createNodesInGroup(group, 1, options); Set<? extends NodeMetadata> nodes = client.createNodesInGroup(group, 1, options);
NodeMetadata node = get(nodes, 0); NodeMetadata node = get(nodes, 0);
Credentials good = node.getCredentials(); LoginCredentials good = node.getCredentials();
assert good.identity != null : nodes; assert good.identity != null : nodes;
assert good.credential != null : nodes; assert good.credential != null : nodes;
for (Entry<? extends NodeMetadata, ExecResponse> response : client.runScriptOnNodesMatching( for (Entry<? extends NodeMetadata, ExecResponse> response : client.runScriptOnNodesMatching(
runningInGroup(group), Statements.exec("hostname"), runningInGroup(group), Statements.exec("hostname"),
wrapInInitScript(false).runAsRoot(false).overrideCredentialsWith(good)).entrySet()) { wrapInInitScript(false).runAsRoot(false).overrideLoginCredentials(good)).entrySet()) {
checkResponseEqualsHostname(response.getValue(), response.getKey()); checkResponseEqualsHostname(response.getValue(), response.getKey());
} }
@ -281,10 +282,12 @@ public abstract class BaseComputeServiceLiveTest extends BaseVersionedServiceLiv
@Test(enabled = false) @Test(enabled = false)
protected void tryBadPassword(String group, Credentials good) throws AssertionError { protected void tryBadPassword(String group, Credentials good) throws AssertionError {
try { try {
Map<? extends NodeMetadata, ExecResponse> responses = client.runScriptOnNodesMatching(runningInGroup(group), Map<? extends NodeMetadata, ExecResponse> responses = client.runScriptOnNodesMatching(
runningInGroup(group),
"echo I put a bad password", "echo I put a bad password",
wrapInInitScript(false).runAsRoot(false) wrapInInitScript(false).runAsRoot(false).overrideLoginCredentials(
.overrideCredentialsWith(new Credentials(good.identity, "romeo"))); LoginCredentials.builder().user(good.identity).credential(null).privateKey(null).password("romeo")
.build()));
assert responses.size() == 0 : "shouldn't pass with a bad password\n" + responses; assert responses.size() == 0 : "shouldn't pass with a bad password\n" + responses;
} catch (AssertionError e) { } catch (AssertionError e) {
throw e; throw e;
@ -433,8 +436,8 @@ public abstract class BaseComputeServiceLiveTest extends BaseVersionedServiceLiv
} }
protected Map<? extends NodeMetadata, ExecResponse> runScriptWithCreds(final String group, OperatingSystem os, protected Map<? extends NodeMetadata, ExecResponse> runScriptWithCreds(final String group, OperatingSystem os,
Credentials creds) throws RunScriptOnNodesException { LoginCredentials creds) throws RunScriptOnNodesException {
return client.runScriptOnNodesMatching(runningInGroup(group), buildScript(os), overrideCredentialsWith(creds) return client.runScriptOnNodesMatching(runningInGroup(group), buildScript(os), overrideLoginCredentials(creds)
.nameTask("runScriptWithCreds")); .nameTask("runScriptWithCreds"));
} }

View File

@ -37,9 +37,9 @@ import org.jclouds.compute.domain.OsFamilyVersion64Bit;
import org.jclouds.compute.domain.Template; import org.jclouds.compute.domain.Template;
import org.jclouds.compute.domain.TemplateBuilder; import org.jclouds.compute.domain.TemplateBuilder;
import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.compute.reference.ComputeServiceConstants;
import org.jclouds.domain.Credentials;
import org.jclouds.domain.Location; import org.jclouds.domain.Location;
import org.jclouds.domain.LocationScope; import org.jclouds.domain.LocationScope;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.json.Json; import org.jclouds.json.Json;
import org.jclouds.json.config.GsonModule; import org.jclouds.json.config.GsonModule;
import org.jclouds.logging.log4j.config.Log4JLoggingModule; import org.jclouds.logging.log4j.config.Log4JLoggingModule;
@ -257,8 +257,8 @@ public abstract class BaseTemplateBuilderLiveTest extends BaseVersionedServiceLi
@Test @Test
public void testTemplateBuilderWithLoginUserSpecified() throws IOException { public void testTemplateBuilderWithLoginUserSpecified() throws IOException {
tryOverrideUsingPropertyKey("jclouds.login-user"); tryOverrideUsingPropertyKey("jclouds");
tryOverrideUsingPropertyKey(provider + ".login-user"); tryOverrideUsingPropertyKey(provider);
} }
protected void tryOverrideUsingPropertyKey(String propertyKey) { protected void tryOverrideUsingPropertyKey(String propertyKey) {
@ -266,7 +266,9 @@ public abstract class BaseTemplateBuilderLiveTest extends BaseVersionedServiceLi
try { try {
Properties overrides = setupProperties(); Properties overrides = setupProperties();
String login = loginUser != null ? loginUser : "foo:bar"; String login = loginUser != null ? loginUser : "foo:bar";
overrides.setProperty(propertyKey, login); overrides.setProperty(propertyKey + ".image.login-user", login);
boolean auth = authenticateSudo != null ? Boolean.valueOf(authenticateSudo) : true;
overrides.setProperty(propertyKey + ".image.authenticate-sudo", auth + "");
context = new ComputeServiceContextFactory().createContext(provider, context = new ComputeServiceContextFactory().createContext(provider,
ImmutableSet.<Module> of(new Log4JLoggingModule()), overrides); ImmutableSet.<Module> of(new Log4JLoggingModule()), overrides);
@ -275,7 +277,7 @@ public abstract class BaseTemplateBuilderLiveTest extends BaseVersionedServiceLi
String user = Iterables.get(userPass, 0); String user = Iterables.get(userPass, 0);
String pass = Iterables.size(userPass) > 1 ? Iterables.get(userPass, 1) : null; String pass = Iterables.size(userPass) > 1 ? Iterables.get(userPass, 1) : null;
assertEquals(context.getComputeService().templateBuilder().build().getImage().getDefaultCredentials(), assertEquals(context.getComputeService().templateBuilder().build().getImage().getDefaultCredentials(),
new Credentials(user, pass)); LoginCredentials.builder().user(user).password(pass).authenticateSudo(auth).build());
} finally { } finally {
if (context != null) if (context != null)
context.close(); context.close();

View File

@ -33,7 +33,7 @@ import org.testng.annotations.BeforeClass;
*/ */
public abstract class BaseVersionedServiceLiveTest { public abstract class BaseVersionedServiceLiveTest {
protected String prefix = System.getProperty("user.name"); protected String prefix = System.getProperty("user.name");
protected String provider; protected String provider;
protected String identity; protected String identity;
protected String credential; protected String credential;
@ -41,6 +41,7 @@ public abstract class BaseVersionedServiceLiveTest {
protected String apiversion; protected String apiversion;
protected String imageId; protected String imageId;
protected String loginUser; protected String loginUser;
protected String authenticateSudo;
protected Properties setupRestProperties() { protected Properties setupRestProperties() {
return RestContextFactory.getPropertiesFromResource("/rest.properties"); return RestContextFactory.getPropertiesFromResource("/rest.properties");
@ -68,7 +69,9 @@ public abstract class BaseVersionedServiceLiveTest {
if (imageId != null) if (imageId != null)
overrides.setProperty(provider + ".image-id", imageId); overrides.setProperty(provider + ".image-id", imageId);
if (loginUser != null) if (loginUser != null)
overrides.setProperty(provider + ".login-user", loginUser); overrides.setProperty(provider + ".image.login-user", loginUser);
if (authenticateSudo != null)
overrides.setProperty(provider + ".image.authenticate-sudo", authenticateSudo);
return overrides; return overrides;
} }
@ -80,7 +83,8 @@ public abstract class BaseVersionedServiceLiveTest {
endpoint = System.getProperty("test." + provider + ".endpoint"); endpoint = System.getProperty("test." + provider + ".endpoint");
apiversion = System.getProperty("test." + provider + ".apiversion"); apiversion = System.getProperty("test." + provider + ".apiversion");
imageId = System.getProperty("test." + provider + ".image-id"); imageId = System.getProperty("test." + provider + ".image-id");
loginUser = System.getProperty("test." + provider + ".login-user"); loginUser = System.getProperty("test." + provider + ".image.login-user");
authenticateSudo = System.getProperty("test." + provider + ".image.authenticate-sudo");
} }
} }

View File

@ -35,7 +35,7 @@ import org.jclouds.compute.reference.ComputeServiceConstants;
import org.jclouds.compute.reference.ComputeServiceConstants.Timeouts; import org.jclouds.compute.reference.ComputeServiceConstants.Timeouts;
import org.jclouds.concurrent.MoreExecutors; import org.jclouds.concurrent.MoreExecutors;
import org.jclouds.concurrent.config.ExecutorServiceModule; import org.jclouds.concurrent.config.ExecutorServiceModule;
import org.jclouds.domain.Credentials; import org.jclouds.domain.LoginCredentials;
import org.jclouds.scriptbuilder.InitBuilder; import org.jclouds.scriptbuilder.InitBuilder;
import org.jclouds.scriptbuilder.domain.OsFamily; import org.jclouds.scriptbuilder.domain.OsFamily;
import org.jclouds.scriptbuilder.domain.Statement; import org.jclouds.scriptbuilder.domain.Statement;
@ -84,7 +84,7 @@ public class RunScriptOnNodeAsInitScriptUsingSshAndBlockUntilCompleteTest {
public void testWithoutInitThrowsIllegalStateException() { public void testWithoutInitThrowsIllegalStateException() {
Statement command = exec("doFoo"); Statement command = exec("doFoo");
NodeMetadata node = new NodeMetadataBuilder().ids("id").state(NodeState.RUNNING).credentials( NodeMetadata node = new NodeMetadataBuilder().ids("id").state(NodeState.RUNNING).credentials(
new Credentials("tester", "notalot")).build(); new LoginCredentials("tester", "testpassword!", null, false)).build();
SshClient sshClient = createMock(SshClient.class); SshClient sshClient = createMock(SshClient.class);
@ -101,7 +101,7 @@ public class RunScriptOnNodeAsInitScriptUsingSshAndBlockUntilCompleteTest {
public void testDefault() { public void testDefault() {
Statement command = exec("doFoo"); Statement command = exec("doFoo");
NodeMetadata node = new NodeMetadataBuilder().ids("id").state(NodeState.RUNNING).credentials( NodeMetadata node = new NodeMetadataBuilder().ids("id").state(NodeState.RUNNING).credentials(
new Credentials("tester", "notalot")).build(); new LoginCredentials("tester", "testpassword!", null, false)).build();
SshClient sshClient = createMock(SshClient.class); SshClient sshClient = createMock(SshClient.class);
@ -150,7 +150,7 @@ public class RunScriptOnNodeAsInitScriptUsingSshAndBlockUntilCompleteTest {
public void testWithSudoPassword() { public void testWithSudoPassword() {
Statement command = exec("doFoo"); Statement command = exec("doFoo");
NodeMetadata node = new NodeMetadataBuilder().ids("id").state(NodeState.RUNNING).credentials( NodeMetadata node = new NodeMetadataBuilder().ids("id").state(NodeState.RUNNING).credentials(
new Credentials("tester", "notalot")).adminPassword("rootme").build(); new LoginCredentials("tester", "testpassword!", null, true)).build();
SshClient sshClient = createMock(SshClient.class); SshClient sshClient = createMock(SshClient.class);
@ -169,7 +169,7 @@ public class RunScriptOnNodeAsInitScriptUsingSshAndBlockUntilCompleteTest {
expect(sshClient.exec("./jclouds-script-0 init")).andReturn(new ExecResponse("", "", 0)); expect(sshClient.exec("./jclouds-script-0 init")).andReturn(new ExecResponse("", "", 0));
// since there's an adminPassword we must pass this in // since there's an adminPassword we must pass this in
expect(sshClient.exec("echo 'rootme'|sudo -S ./jclouds-script-0 start")).andReturn(new ExecResponse("", "", 0)); expect(sshClient.exec("echo 'testpassword!'|sudo -S ./jclouds-script-0 start")).andReturn(new ExecResponse("", "", 0));
// signal the command completed // signal the command completed
expect(sshClient.exec("./jclouds-script-0 status")).andReturn(new ExecResponse("", "", 1)); expect(sshClient.exec("./jclouds-script-0 status")).andReturn(new ExecResponse("", "", 1));
@ -198,7 +198,7 @@ public class RunScriptOnNodeAsInitScriptUsingSshAndBlockUntilCompleteTest {
public void testNotRoot() { public void testNotRoot() {
Statement command = exec("doFoo"); Statement command = exec("doFoo");
NodeMetadata node = new NodeMetadataBuilder().ids("id").state(NodeState.RUNNING).credentials( NodeMetadata node = new NodeMetadataBuilder().ids("id").state(NodeState.RUNNING).credentials(
new Credentials("tester", "notalot")).adminPassword("rootme").build(); new LoginCredentials("tester", "testpassword!", null, true)).build();
SshClient sshClient = createMock(SshClient.class); SshClient sshClient = createMock(SshClient.class);

View File

@ -30,7 +30,7 @@ import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.compute.domain.NodeMetadataBuilder; import org.jclouds.compute.domain.NodeMetadataBuilder;
import org.jclouds.compute.domain.NodeState; import org.jclouds.compute.domain.NodeState;
import org.jclouds.compute.options.RunScriptOptions; import org.jclouds.compute.options.RunScriptOptions;
import org.jclouds.domain.Credentials; import org.jclouds.domain.LoginCredentials;
import org.jclouds.scriptbuilder.InitBuilder; import org.jclouds.scriptbuilder.InitBuilder;
import org.jclouds.scriptbuilder.domain.OsFamily; import org.jclouds.scriptbuilder.domain.OsFamily;
import org.jclouds.scriptbuilder.domain.Statement; import org.jclouds.scriptbuilder.domain.Statement;
@ -51,7 +51,7 @@ public class RunScriptOnNodeAsInitScriptUsingSshTest {
public void testWithoutInitThrowsIllegalStateException() { public void testWithoutInitThrowsIllegalStateException() {
Statement command = exec("doFoo"); Statement command = exec("doFoo");
NodeMetadata node = new NodeMetadataBuilder().ids("id").state(NodeState.RUNNING).credentials( NodeMetadata node = new NodeMetadataBuilder().ids("id").state(NodeState.RUNNING).credentials(
new Credentials("tester", "notalot")).build(); LoginCredentials.builder().user("tester").password("notalot").build()).build();
SshClient sshClient = createMock(SshClient.class); SshClient sshClient = createMock(SshClient.class);
@ -67,7 +67,7 @@ public class RunScriptOnNodeAsInitScriptUsingSshTest {
public void testDefault() { public void testDefault() {
Statement command = exec("doFoo"); Statement command = exec("doFoo");
NodeMetadata node = new NodeMetadataBuilder().ids("id").state(NodeState.RUNNING).credentials( NodeMetadata node = new NodeMetadataBuilder().ids("id").state(NodeState.RUNNING).credentials(
new Credentials("tester", "notalot")).build(); LoginCredentials.builder().user("tester").password("notalot").build()).build();
SshClient sshClient = createMock(SshClient.class); SshClient sshClient = createMock(SshClient.class);
@ -108,7 +108,7 @@ public class RunScriptOnNodeAsInitScriptUsingSshTest {
public void testWithSudoPassword() { public void testWithSudoPassword() {
Statement command = exec("doFoo"); Statement command = exec("doFoo");
NodeMetadata node = new NodeMetadataBuilder().ids("id").state(NodeState.RUNNING).credentials( NodeMetadata node = new NodeMetadataBuilder().ids("id").state(NodeState.RUNNING).credentials(
new Credentials("tester", "notalot")).adminPassword("rootme").build(); LoginCredentials.builder().user("tester").password("notalot").authenticateSudo(true).build()).build();
SshClient sshClient = createMock(SshClient.class); SshClient sshClient = createMock(SshClient.class);
@ -126,7 +126,7 @@ public class RunScriptOnNodeAsInitScriptUsingSshTest {
expect(sshClient.exec("./jclouds-script-0 init")).andReturn(new ExecResponse("", "", 0)); expect(sshClient.exec("./jclouds-script-0 init")).andReturn(new ExecResponse("", "", 0));
// since there's an adminPassword we must pass this in // since there's an adminPassword we must pass this in
expect(sshClient.exec("echo 'rootme'|sudo -S ./jclouds-script-0 start")).andReturn(new ExecResponse("", "", 0)); expect(sshClient.exec("echo 'notalot'|sudo -S ./jclouds-script-0 start")).andReturn(new ExecResponse("", "", 0));
sshClient.disconnect(); sshClient.disconnect();
@ -150,7 +150,7 @@ public class RunScriptOnNodeAsInitScriptUsingSshTest {
public void testNotRoot() { public void testNotRoot() {
Statement command = exec("doFoo"); Statement command = exec("doFoo");
NodeMetadata node = new NodeMetadataBuilder().ids("id").state(NodeState.RUNNING).credentials( NodeMetadata node = new NodeMetadataBuilder().ids("id").state(NodeState.RUNNING).credentials(
new Credentials("tester", "notalot")).adminPassword("rootme").build(); LoginCredentials.builder().user("tester").password("notalot").authenticateSudo(true).build()).build();
SshClient sshClient = createMock(SshClient.class); SshClient sshClient = createMock(SshClient.class);

View File

@ -26,7 +26,7 @@ import static org.jclouds.scriptbuilder.domain.Statements.exec;
import org.jclouds.compute.domain.ExecResponse; import org.jclouds.compute.domain.ExecResponse;
import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.domain.Credentials; import org.jclouds.domain.LoginCredentials;
import org.jclouds.javax.annotation.Nullable; import org.jclouds.javax.annotation.Nullable;
import org.jclouds.scriptbuilder.statements.login.UserAdd; import org.jclouds.scriptbuilder.statements.login.UserAdd;
import org.jclouds.ssh.SshClient; import org.jclouds.ssh.SshClient;
@ -38,104 +38,98 @@ import com.google.common.base.Function;
/** /**
* @author Adam Lowe * @author Adam Lowe
*/ */
@Test(groups={"unit"}, singleThreaded = true) @Test(groups = { "unit" }, singleThreaded = true)
public class RunScriptOnNodeUsingSshTest { public class RunScriptOnNodeUsingSshTest {
private SshClient sshClient; private SshClient sshClient;
private NodeMetadata node; private NodeMetadata node;
private Function<NodeMetadata, SshClient> sshFactory; private Function<NodeMetadata, SshClient> sshFactory;
@BeforeMethod(groups={"unit"}) @BeforeMethod(groups = { "unit" })
public void init() { public void init() {
sshClient = createMock(SshClient.class); sshClient = createMock(SshClient.class);
sshFactory = new Function<NodeMetadata, SshClient>() { sshFactory = new Function<NodeMetadata, SshClient>() {
@Override @Override
public SshClient apply(@Nullable NodeMetadata nodeMetadata) { public SshClient apply(@Nullable NodeMetadata nodeMetadata) {
return sshClient; return sshClient;
} }
}; };
node = createMock(NodeMetadata.class); node = createMock(NodeMetadata.class);
expect(node.getCredentials()).andReturn(new Credentials("tester", "notalot")); expect(node.getCredentials()).andReturn(new LoginCredentials("tester", "notalot", null, false)).atLeastOnce();
expect(node.getAdminPassword()).andReturn(null).atLeastOnce(); replay(node);
replay(node); }
}
public void simpleTest() { public void simpleTest() {
RunScriptOnNodeUsingSsh testMe = new RunScriptOnNodeUsingSsh(sshFactory, node, exec("echo $USER\necho $USER"), RunScriptOnNodeUsingSsh testMe = new RunScriptOnNodeUsingSsh(sshFactory, node, exec("echo $USER\necho $USER"),
wrapInInitScript(false).runAsRoot(false)); wrapInInitScript(false).runAsRoot(false));
testMe.init(); testMe.init();
sshClient.connect(); sshClient.connect();
expect(sshClient.getUsername()).andReturn("tester"); expect(sshClient.getUsername()).andReturn("tester");
expect(sshClient.getHostAddress()).andReturn("somewhere.example.com"); expect(sshClient.getHostAddress()).andReturn("somewhere.example.com");
expect(sshClient.exec("echo $USER\n" + expect(sshClient.exec("echo $USER\n" + "echo $USER\n")).andReturn(new ExecResponse("tester\ntester\n", null, 0));
"echo $USER\n")).andReturn(new ExecResponse("tester\ntester\n", null, 0)); sshClient.disconnect();
sshClient.disconnect(); replay(sshClient);
replay(sshClient);
testMe.call(); testMe.call();
} }
public void simpleRootTest() { public void simpleRootTest() {
RunScriptOnNodeUsingSsh testMe = new RunScriptOnNodeUsingSsh(sshFactory, node, exec("echo $USER\necho $USER"), RunScriptOnNodeUsingSsh testMe = new RunScriptOnNodeUsingSsh(sshFactory, node, exec("echo $USER\necho $USER"),
wrapInInitScript(false).runAsRoot(true)); wrapInInitScript(false).runAsRoot(true));
testMe.init(); testMe.init();
sshClient.connect(); sshClient.connect();
expect(sshClient.getUsername()).andReturn("tester"); expect(sshClient.getUsername()).andReturn("tester");
expect(sshClient.getHostAddress()).andReturn("somewhere.example.com"); expect(sshClient.getHostAddress()).andReturn("somewhere.example.com");
expect(sshClient.exec("sudo sh <<'RUN_SCRIPT_AS_ROOT_SSH'\n" + expect(
"echo $USER\n" + sshClient.exec("sudo sh <<'RUN_SCRIPT_AS_ROOT_SSH'\n" + "echo $USER\n" + "echo $USER\n"
"echo $USER\n" + + "RUN_SCRIPT_AS_ROOT_SSH\n")).andReturn(new ExecResponse("root\nroot\n", null, 0));
"RUN_SCRIPT_AS_ROOT_SSH\n")).andReturn(new ExecResponse("root\nroot\n", null, 0)); sshClient.disconnect();
sshClient.disconnect(); replay(sshClient);
replay(sshClient);
testMe.call(); testMe.call();
} }
public void simpleRootTestWithSudoPassword() { public void simpleRootTestWithSudoPassword() {
node = createMock(NodeMetadata.class); node = createMock(NodeMetadata.class);
expect(node.getCredentials()).andReturn(new Credentials("tester", "notalot")); expect(node.getCredentials()).andReturn(new LoginCredentials("tester", "testpassword!", null, true))
expect(node.getAdminPassword()).andReturn("testpassword!").atLeastOnce(); .atLeastOnce();
replay(node); replay(node);
RunScriptOnNodeUsingSsh testMe = new RunScriptOnNodeUsingSsh(sshFactory, node, exec("echo $USER\necho $USER"), RunScriptOnNodeUsingSsh testMe = new RunScriptOnNodeUsingSsh(sshFactory, node, exec("echo $USER\necho $USER"),
wrapInInitScript(false).runAsRoot(true)); wrapInInitScript(false).runAsRoot(true));
testMe.init(); testMe.init();
sshClient.connect(); sshClient.connect();
expect(sshClient.getUsername()).andReturn("tester"); expect(sshClient.getUsername()).andReturn("tester");
expect(sshClient.getHostAddress()).andReturn("somewhere.example.com"); expect(sshClient.getHostAddress()).andReturn("somewhere.example.com");
expect(sshClient.exec("sudo -S sh <<'RUN_SCRIPT_AS_ROOT_SSH'\n" + expect(
"testpassword!\n" + sshClient.exec("sudo -S sh <<'RUN_SCRIPT_AS_ROOT_SSH'\n" + "testpassword!\n" + "echo $USER\n"
"echo $USER\n" + + "echo $USER\n" + "RUN_SCRIPT_AS_ROOT_SSH\n")).andReturn(new ExecResponse("root\nroot\n", null, 0));
"echo $USER\n" + sshClient.disconnect();
"RUN_SCRIPT_AS_ROOT_SSH\n")).andReturn(new ExecResponse("root\nroot\n", null, 0)); replay(sshClient);
sshClient.disconnect();
replay(sshClient);
testMe.call(); testMe.call();
} }
public void testUserAddAsRoot() { public void testUserAddAsRoot() {
RunScriptOnNodeUsingSsh testMe = new RunScriptOnNodeUsingSsh(sshFactory, node, RunScriptOnNodeUsingSsh testMe = new RunScriptOnNodeUsingSsh(sshFactory, node, UserAdd.builder()
UserAdd.builder().login("testuser").build(), .login("testuser").build(), wrapInInitScript(false).runAsRoot(true).overrideLoginPassword("test"));
wrapInInitScript(false).runAsRoot(true).overrideLoginCredentialWith("test"));
testMe.init(); testMe.init();
sshClient.connect(); sshClient.connect();
expect(sshClient.getUsername()).andReturn("tester"); expect(sshClient.getUsername()).andReturn("tester");
expect(sshClient.getHostAddress()).andReturn("somewhere.example.com"); expect(sshClient.getHostAddress()).andReturn("somewhere.example.com");
expect(sshClient.exec("sudo sh <<'RUN_SCRIPT_AS_ROOT_SSH'\n" + expect(
"mkdir -p /home/users\n" + sshClient.exec("sudo sh <<'RUN_SCRIPT_AS_ROOT_SSH'\n" + "mkdir -p /home/users\n"
"useradd -s /bin/bash -m -d /home/users/testuser testuser\n" + + "useradd -s /bin/bash -m -d /home/users/testuser testuser\n"
"chown -R testuser /home/users/testuser\n" + + "chown -R testuser /home/users/testuser\n" + "RUN_SCRIPT_AS_ROOT_SSH\n")).andReturn(
"RUN_SCRIPT_AS_ROOT_SSH\n")).andReturn(new ExecResponse("done", null, 0)); new ExecResponse("done", null, 0));
sshClient.disconnect(); sshClient.disconnect();
replay(sshClient); replay(sshClient);
testMe.call(); testMe.call();
} }
} }

View File

@ -28,6 +28,7 @@ import java.util.Map;
import org.jclouds.config.ValueOfConfigurationKeyOrNull; import org.jclouds.config.ValueOfConfigurationKeyOrNull;
import org.jclouds.domain.Credentials; import org.jclouds.domain.Credentials;
import org.jclouds.domain.LoginCredentials;
import org.testng.annotations.Test; import org.testng.annotations.Test;
/** /**
@ -45,8 +46,10 @@ public class GetLoginForProviderFromPropertiesAndStoreCredentialsOrReturnNullTes
ValueOfConfigurationKeyOrNull config = createMock(ValueOfConfigurationKeyOrNull.class); ValueOfConfigurationKeyOrNull config = createMock(ValueOfConfigurationKeyOrNull.class);
expect(credstore.containsKey("image")).andReturn(false); expect(credstore.containsKey("image")).andReturn(false);
expect(config.apply("provider.login-user")).andReturn(null); expect(config.apply("provider.image.login-user")).andReturn(null);
expect(config.apply("jclouds.login-user")).andReturn(null); expect(config.apply("jclouds.image.login-user")).andReturn(null);
expect(config.apply("provider.image.authenticate-sudo")).andReturn(null);
expect(config.apply("jclouds.image.authenticate-sudo")).andReturn(null);
replay(config); replay(config);
replay(credstore); replay(credstore);
@ -68,7 +71,9 @@ public class GetLoginForProviderFromPropertiesAndStoreCredentialsOrReturnNullTes
ValueOfConfigurationKeyOrNull config = createMock(ValueOfConfigurationKeyOrNull.class); ValueOfConfigurationKeyOrNull config = createMock(ValueOfConfigurationKeyOrNull.class);
expect(credstore.containsKey("image")).andReturn(false); expect(credstore.containsKey("image")).andReturn(false);
expect(config.apply("provider.login-user")).andReturn("ubuntu"); expect(config.apply("provider.image.login-user")).andReturn("ubuntu");
expect(config.apply("provider.image.authenticate-sudo")).andReturn(null);
expect(config.apply("jclouds.image.authenticate-sudo")).andReturn(null);
expect(credstore.put("image", expected)).andReturn(null); expect(credstore.put("image", expected)).andReturn(null);
replay(config); replay(config);
@ -91,8 +96,10 @@ public class GetLoginForProviderFromPropertiesAndStoreCredentialsOrReturnNullTes
ValueOfConfigurationKeyOrNull config = createMock(ValueOfConfigurationKeyOrNull.class); ValueOfConfigurationKeyOrNull config = createMock(ValueOfConfigurationKeyOrNull.class);
expect(credstore.containsKey("image")).andReturn(false); expect(credstore.containsKey("image")).andReturn(false);
expect(config.apply("provider.login-user")).andReturn(null); expect(config.apply("provider.image.login-user")).andReturn(null);
expect(config.apply("jclouds.login-user")).andReturn("ubuntu"); expect(config.apply("jclouds.image.login-user")).andReturn("ubuntu");
expect(config.apply("provider.image.authenticate-sudo")).andReturn(null);
expect(config.apply("jclouds.image.authenticate-sudo")).andReturn(null);
expect(credstore.put("image", expected)).andReturn(null); expect(credstore.put("image", expected)).andReturn(null);
replay(config); replay(config);
@ -137,7 +144,9 @@ public class GetLoginForProviderFromPropertiesAndStoreCredentialsOrReturnNullTes
ValueOfConfigurationKeyOrNull config = createMock(ValueOfConfigurationKeyOrNull.class); ValueOfConfigurationKeyOrNull config = createMock(ValueOfConfigurationKeyOrNull.class);
expect(credstore.containsKey("image")).andReturn(false); expect(credstore.containsKey("image")).andReturn(false);
expect(config.apply("provider.login-user")).andReturn("ubuntu:password"); expect(config.apply("provider.image.login-user")).andReturn("ubuntu:password");
expect(config.apply("provider.image.authenticate-sudo")).andReturn(null);
expect(config.apply("jclouds.image.authenticate-sudo")).andReturn(null);
expect(credstore.put("image", expected)).andReturn(null); expect(credstore.put("image", expected)).andReturn(null);
replay(config); replay(config);
@ -160,8 +169,62 @@ public class GetLoginForProviderFromPropertiesAndStoreCredentialsOrReturnNullTes
ValueOfConfigurationKeyOrNull config = createMock(ValueOfConfigurationKeyOrNull.class); ValueOfConfigurationKeyOrNull config = createMock(ValueOfConfigurationKeyOrNull.class);
expect(credstore.containsKey("image")).andReturn(false); expect(credstore.containsKey("image")).andReturn(false);
expect(config.apply("provider.login-user")).andReturn(null); expect(config.apply("provider.image.login-user")).andReturn(null);
expect(config.apply("jclouds.login-user")).andReturn("ubuntu:password"); expect(config.apply("jclouds.image.login-user")).andReturn("ubuntu:password");
expect(config.apply("provider.image.authenticate-sudo")).andReturn(null);
expect(config.apply("jclouds.image.authenticate-sudo")).andReturn(null);
expect(credstore.put("image", expected)).andReturn(null);
replay(config);
replay(credstore);
GetLoginForProviderFromPropertiesAndStoreCredentialsOrReturnNull fn = new GetLoginForProviderFromPropertiesAndStoreCredentialsOrReturnNull(
"provider", config, credstore);
assertEquals(fn.get(), expected);
verify(config);
verify(credstore);
}
public void testWhenCredentialsNotPresentAndJcloudsPropertyHasUserAndPasswordAndSudo() {
@SuppressWarnings("unchecked")
Map<String, Credentials> credstore = createMock(Map.class);
LoginCredentials expected = LoginCredentials.builder().user("ubuntu").password("password").authenticateSudo(true)
.build();
ValueOfConfigurationKeyOrNull config = createMock(ValueOfConfigurationKeyOrNull.class);
expect(credstore.containsKey("image")).andReturn(false);
expect(config.apply("provider.image.login-user")).andReturn(null);
expect(config.apply("jclouds.image.login-user")).andReturn("ubuntu:password");
expect(config.apply("provider.image.authenticate-sudo")).andReturn(null);
expect(config.apply("jclouds.image.authenticate-sudo")).andReturn("true");
expect(credstore.put("image", expected)).andReturn(null);
replay(config);
replay(credstore);
GetLoginForProviderFromPropertiesAndStoreCredentialsOrReturnNull fn = new GetLoginForProviderFromPropertiesAndStoreCredentialsOrReturnNull(
"provider", config, credstore);
assertEquals(fn.get(), expected);
verify(config);
verify(credstore);
}
public void testWhenCredentialsNotPresentAndProviderPropertyHasUserAndPasswordAndSudo() {
@SuppressWarnings("unchecked")
Map<String, Credentials> credstore = createMock(Map.class);
LoginCredentials expected = LoginCredentials.builder().user("ubuntu").password("password").authenticateSudo(true)
.build();
ValueOfConfigurationKeyOrNull config = createMock(ValueOfConfigurationKeyOrNull.class);
expect(credstore.containsKey("image")).andReturn(false);
expect(config.apply("provider.image.login-user")).andReturn("ubuntu:password");
expect(config.apply("provider.image.authenticate-sudo")).andReturn("true");
expect(credstore.put("image", expected)).andReturn(null); expect(credstore.put("image", expected)).andReturn(null);
replay(config); replay(config);

View File

@ -33,6 +33,7 @@ import org.jclouds.compute.domain.NodeMetadataBuilder;
import org.jclouds.compute.domain.NodeState; import org.jclouds.compute.domain.NodeState;
import org.jclouds.compute.internal.PersistNodeCredentials; import org.jclouds.compute.internal.PersistNodeCredentials;
import org.jclouds.domain.Credentials; import org.jclouds.domain.Credentials;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.scriptbuilder.statements.login.AdminAccess; import org.jclouds.scriptbuilder.statements.login.AdminAccess;
import org.testng.annotations.Test; import org.testng.annotations.Test;
@ -83,7 +84,7 @@ public class PersistNodeCredentialsTest {
public void testRefreshCredentialsForNodeWhenStatementIsNullSameCredentialsAndDoesCache() { public void testRefreshCredentialsForNodeWhenStatementIsNullSameCredentialsAndDoesCache() {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
Map<String, Credentials> credstore = createMock(Map.class); Map<String, Credentials> credstore = createMock(Map.class);
Credentials credentials = createMock(Credentials.class); LoginCredentials credentials = createMock(LoginCredentials.class);
expect(credstore.put("node#id", credentials)).andReturn(null); expect(credstore.put("node#id", credentials)).andReturn(null);
@ -102,7 +103,7 @@ public class PersistNodeCredentialsTest {
Map<String, Credentials> credstore = createMock(Map.class); Map<String, Credentials> credstore = createMock(Map.class);
AdminAccess statement = createMock(AdminAccess.class); AdminAccess statement = createMock(AdminAccess.class);
Credentials credentials = createMock(Credentials.class); LoginCredentials credentials = LoginCredentials.builder().user("foo").build();
expect(statement.getAdminCredentials()).andReturn(credentials).atLeastOnce(); expect(statement.getAdminCredentials()).andReturn(credentials).atLeastOnce();
expect(credstore.put("node#id", credentials)).andReturn(null); expect(credstore.put("node#id", credentials)).andReturn(null);
@ -125,7 +126,7 @@ public class PersistNodeCredentialsTest {
Map<String, Credentials> credstore = createMock(Map.class); Map<String, Credentials> credstore = createMock(Map.class);
AdminAccess statement = createMock(AdminAccess.class); AdminAccess statement = createMock(AdminAccess.class);
Credentials credentials = createMock(Credentials.class); LoginCredentials credentials = LoginCredentials.builder().user("foo").build();
expect(statement.getAdminCredentials()).andReturn(credentials).atLeastOnce(); expect(statement.getAdminCredentials()).andReturn(credentials).atLeastOnce();
expect(credstore.put("node#id", credentials)).andReturn(null); expect(credstore.put("node#id", credentials)).andReturn(null);
expect(credstore.put("node#id", credentials)).andReturn(null); // TODO expect(credstore.put("node#id", credentials)).andReturn(null); // TODO

View File

@ -27,19 +27,19 @@ import static org.testng.Assert.assertEquals;
import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.Image;
import org.jclouds.compute.domain.Template; import org.jclouds.compute.domain.Template;
import org.jclouds.compute.options.TemplateOptions; import org.jclouds.compute.options.TemplateOptions;
import org.jclouds.domain.Credentials; import org.jclouds.domain.LoginCredentials;
import org.testng.annotations.Test; import org.testng.annotations.Test;
/** /**
* *
* @author Adrian Cole * @author Adrian Cole
*/ */
@Test(groups = "unit", testName = "DefaultCredentialsFromImageOrOverridingCredentialsTest") @Test(groups = "unit", testName = "DefaultLoginCredentialsFromImageOrOverridingLoginCredentialsTest")
public class DefaultCredentialsFromImageOrOverridingCredentialsTest { public class DefaultCredentialsFromImageOrOverridingCredentialsTest {
private static final DefaultCredentialsFromImageOrOverridingCredentials fn = new DefaultCredentialsFromImageOrOverridingCredentials(); private static final DefaultCredentialsFromImageOrOverridingCredentials fn = new DefaultCredentialsFromImageOrOverridingCredentials();
public void testWhenCredentialsNotPresentInImageOrTemplateOptionsReturnNull() { public void testWhenLoginCredentialsNotPresentInImageOrTemplateOptionsReturnNull() {
Credentials expected = null; LoginCredentials expected = null;
Image image = createMock(Image.class); Image image = createMock(Image.class);
Template template = createMock(Template.class); Template template = createMock(Template.class);
@ -58,15 +58,15 @@ public class DefaultCredentialsFromImageOrOverridingCredentialsTest {
} }
public void testWhenCredentialsNotPresentInImageReturnsOneInTemplateOptions() { public void testWhenLoginCredentialsNotPresentInImageReturnsOneInTemplateOptions() {
Credentials expected = new Credentials("ubuntu", "password"); LoginCredentials expected = new LoginCredentials("ubuntu", "password", null, false);
Image image = createMock(Image.class); Image image = createMock(Image.class);
Template template = createMock(Template.class); Template template = createMock(Template.class);
expect(template.getImage()).andReturn(image); expect(template.getImage()).andReturn(image);
expect(image.getDefaultCredentials()).andReturn(null); expect(image.getDefaultCredentials()).andReturn(null);
expect(template.getOptions()).andReturn(TemplateOptions.Builder.overrideCredentialsWith(expected)); expect(template.getOptions()).andReturn(TemplateOptions.Builder.overrideLoginCredentials(expected));
replay(template); replay(template);
replay(image); replay(image);
@ -78,8 +78,8 @@ public class DefaultCredentialsFromImageOrOverridingCredentialsTest {
} }
public void testWhenCredentialsNotPresentInTemplateOptionsReturnsOneInImage() { public void testWhenLoginCredentialsNotPresentInTemplateOptionsReturnsOneInImage() {
Credentials expected = new Credentials("ubuntu", "password"); LoginCredentials expected = new LoginCredentials("ubuntu", "password", null, false);
Image image = createMock(Image.class); Image image = createMock(Image.class);
Template template = createMock(Template.class); Template template = createMock(Template.class);
@ -98,15 +98,15 @@ public class DefaultCredentialsFromImageOrOverridingCredentialsTest {
} }
public void testWhenCredentialsPresentInImageOverridesIdentityFromCredentialsInTemplateOptions() { public void testWhenLoginCredentialsPresentInImageOverridesIdentityFromLoginCredentialsInTemplateOptions() {
Credentials expected = new Credentials("ubuntu", "password"); LoginCredentials expected = new LoginCredentials("ubuntu", "password", null, false);
Image image = createMock(Image.class); Image image = createMock(Image.class);
Template template = createMock(Template.class); Template template = createMock(Template.class);
expect(template.getImage()).andReturn(image); expect(template.getImage()).andReturn(image);
expect(image.getDefaultCredentials()).andReturn(new Credentials("user", "password")); expect(image.getDefaultCredentials()).andReturn(new LoginCredentials("user", "password", null, false));
expect(template.getOptions()).andReturn(TemplateOptions.Builder.overrideLoginUserWith("ubuntu")); expect(template.getOptions()).andReturn(TemplateOptions.Builder.overrideLoginUser("ubuntu"));
replay(template); replay(template);
replay(image); replay(image);
@ -118,15 +118,15 @@ public class DefaultCredentialsFromImageOrOverridingCredentialsTest {
} }
public void testWhenCredentialsPresentInImageOverridesCredentialFromCredentialsInTemplateOptions() { public void testWhenLoginCredentialsPresentInImageOverridesCredentialFromLoginCredentialsInTemplateOptions() {
Credentials expected = new Credentials("ubuntu", "password"); LoginCredentials expected = new LoginCredentials("ubuntu", "password", null, false);
Image image = createMock(Image.class); Image image = createMock(Image.class);
Template template = createMock(Template.class); Template template = createMock(Template.class);
expect(template.getImage()).andReturn(image); expect(template.getImage()).andReturn(image);
expect(image.getDefaultCredentials()).andReturn(new Credentials("ubuntu", "password2")); expect(image.getDefaultCredentials()).andReturn(new LoginCredentials("ubuntu", "password2", null, false));
expect(template.getOptions()).andReturn(TemplateOptions.Builder.overrideLoginCredentialWith("password")); expect(template.getOptions()).andReturn(TemplateOptions.Builder.overrideLoginPassword("password"));
replay(template); replay(template);
replay(image); replay(image);

View File

@ -29,6 +29,7 @@ import org.jclouds.compute.domain.Template;
import org.jclouds.compute.functions.DefaultCredentialsFromImageOrOverridingCredentials; import org.jclouds.compute.functions.DefaultCredentialsFromImageOrOverridingCredentials;
import org.jclouds.compute.options.TemplateOptions; import org.jclouds.compute.options.TemplateOptions;
import org.jclouds.domain.Credentials; import org.jclouds.domain.Credentials;
import org.jclouds.domain.LoginCredentials;
import org.testng.annotations.Test; import org.testng.annotations.Test;
/** /**
@ -61,7 +62,7 @@ public class PrioritizeCredentialsFromTemplateTest {
} }
public void testWhenCredentialsNotPresentInImageTemplateOptionsReturnsFromParameter() { public void testWhenCredentialsNotPresentInImageTemplateOptionsReturnsFromParameter() {
Credentials expected = new Credentials("foo", "bar"); LoginCredentials expected = new LoginCredentials("foo", "bar", null, false);
Image image = createMock(Image.class); Image image = createMock(Image.class);
Template template = createMock(Template.class); Template template = createMock(Template.class);
@ -81,19 +82,19 @@ public class PrioritizeCredentialsFromTemplateTest {
} }
public void testWhenCredentialsNotPresentInImageReturnsOneInTemplateOptionsAndNotParameter() { public void testWhenCredentialsNotPresentInImageReturnsOneInTemplateOptionsAndNotParameter() {
Credentials expected = new Credentials("ubuntu", "password"); LoginCredentials expected = new LoginCredentials("ubuntu", "password", null, false);
Image image = createMock(Image.class); Image image = createMock(Image.class);
Template template = createMock(Template.class); Template template = createMock(Template.class);
expect(template.getImage()).andReturn(image); expect(template.getImage()).andReturn(image);
expect(image.getDefaultCredentials()).andReturn(null); expect(image.getDefaultCredentials()).andReturn(null);
expect(template.getOptions()).andReturn(TemplateOptions.Builder.overrideCredentialsWith(expected)); expect(template.getOptions()).andReturn(TemplateOptions.Builder.overrideLoginCredentials(expected));
replay(template); replay(template);
replay(image); replay(image);
assertEquals(fn.apply(template, new Credentials("foo", "bar")), expected); assertEquals(fn.apply(template, new LoginCredentials("foo", "bar", null, false)), expected);
verify(template); verify(template);
verify(image); verify(image);
@ -108,12 +109,12 @@ public class PrioritizeCredentialsFromTemplateTest {
expect(template.getImage()).andReturn(image); expect(template.getImage()).andReturn(image);
expect(image.getDefaultCredentials()).andReturn(null); expect(image.getDefaultCredentials()).andReturn(null);
expect(template.getOptions()).andReturn(TemplateOptions.Builder.overrideLoginUserWith("ubuntu")); expect(template.getOptions()).andReturn(TemplateOptions.Builder.overrideLoginUser("ubuntu"));
replay(template); replay(template);
replay(image); replay(image);
assertEquals(fn.apply(template, new Credentials("foo", "password")), expected); assertEquals(fn.apply(template, new LoginCredentials("foo", "password", null, false)), expected);
verify(template); verify(template);
verify(image); verify(image);
@ -121,7 +122,7 @@ public class PrioritizeCredentialsFromTemplateTest {
} }
public void testWhenCredentialsNotPresentInTemplateOptionsReturnsOneInImageAndNotParameter() { public void testWhenCredentialsNotPresentInTemplateOptionsReturnsOneInImageAndNotParameter() {
Credentials expected = new Credentials("ubuntu", "password"); LoginCredentials expected = new LoginCredentials("ubuntu", "password", null, false);
Image image = createMock(Image.class); Image image = createMock(Image.class);
Template template = createMock(Template.class); Template template = createMock(Template.class);
@ -133,7 +134,7 @@ public class PrioritizeCredentialsFromTemplateTest {
replay(template); replay(template);
replay(image); replay(image);
assertEquals(fn.apply(template, new Credentials("foo", "bar")), expected); assertEquals(fn.apply(template, new LoginCredentials("foo", "bar", null, false)), expected);
verify(template); verify(template);
verify(image); verify(image);
@ -147,13 +148,13 @@ public class PrioritizeCredentialsFromTemplateTest {
Template template = createMock(Template.class); Template template = createMock(Template.class);
expect(template.getImage()).andReturn(image); expect(template.getImage()).andReturn(image);
expect(image.getDefaultCredentials()).andReturn(new Credentials("user", "password")); expect(image.getDefaultCredentials()).andReturn(new LoginCredentials("user", "password", null, false));
expect(template.getOptions()).andReturn(TemplateOptions.Builder.overrideLoginUserWith("ubuntu")); expect(template.getOptions()).andReturn(TemplateOptions.Builder.overrideLoginUser("ubuntu"));
replay(template); replay(template);
replay(image); replay(image);
assertEquals(fn.apply(template, new Credentials("foo", "bar")), expected); assertEquals(fn.apply(template, new LoginCredentials("foo", "bar", null, false)), expected);
verify(template); verify(template);
verify(image); verify(image);
@ -161,19 +162,19 @@ public class PrioritizeCredentialsFromTemplateTest {
} }
public void testWhenCredentialsPresentInImageOverridesCredentialFromCredentialsInTemplateOptionsAndNotParameter() { public void testWhenCredentialsPresentInImageOverridesCredentialFromCredentialsInTemplateOptionsAndNotParameter() {
Credentials expected = new Credentials("ubuntu", "password"); LoginCredentials expected = new LoginCredentials("ubuntu", "password", null, false);
Image image = createMock(Image.class); Image image = createMock(Image.class);
Template template = createMock(Template.class); Template template = createMock(Template.class);
expect(template.getImage()).andReturn(image); expect(template.getImage()).andReturn(image);
expect(image.getDefaultCredentials()).andReturn(new Credentials("ubuntu", "password2")); expect(image.getDefaultCredentials()).andReturn(new LoginCredentials("ubuntu", "password2", null, false));
expect(template.getOptions()).andReturn(TemplateOptions.Builder.overrideLoginCredentialWith("password")); expect(template.getOptions()).andReturn(TemplateOptions.Builder.overrideLoginPassword("password"));
replay(template); replay(template);
replay(image); replay(image);
assertEquals(fn.apply(template, new Credentials("foo", "bar")), expected); assertEquals(fn.apply(template, new LoginCredentials("foo", "bar", null, false)), expected);
verify(template); verify(template);
verify(image); verify(image);

View File

@ -28,6 +28,7 @@ import org.jclouds.compute.domain.Image;
import org.jclouds.compute.domain.OperatingSystem; import org.jclouds.compute.domain.OperatingSystem;
import org.jclouds.compute.domain.OsFamily; import org.jclouds.compute.domain.OsFamily;
import org.jclouds.domain.Credentials; import org.jclouds.domain.Credentials;
import org.jclouds.domain.LoginCredentials;
import org.testng.annotations.Test; import org.testng.annotations.Test;
/** /**
@ -41,7 +42,7 @@ public class ReturnCredentialsBoundToImageTest {
Image image = createMock(Image.class); Image image = createMock(Image.class);
replay(image); replay(image);
Credentials creds = new Credentials("ubuntu", "foo"); LoginCredentials creds = new LoginCredentials("ubuntu", "foo", null, false);
assertEquals(new ReturnCredentialsBoundToImage(creds).execute(image), creds); assertEquals(new ReturnCredentialsBoundToImage(creds).execute(image), creds);
verify(image); verify(image);

View File

@ -35,8 +35,8 @@ public class Credentials {
public static final Credentials NO_CREDENTIALS = new Credentials(null, null); public static final Credentials NO_CREDENTIALS = new Credentials(null, null);
public static class Builder<T extends Credentials> { public static class Builder<T extends Credentials> {
private String identity; protected String identity;
private String credential; protected String credential;
public Builder<T> identity(String identity) { public Builder<T> identity(String identity) {
this.identity = identity; this.identity = identity;

View File

@ -0,0 +1,178 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds licenses this file
* to you 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 org.jclouds.domain;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.util.CredentialUtils;
/**
* @author Adrian Cole
*/
public class LoginCredentials extends Credentials {
public static Builder builder(Credentials creds) {
if (creds == null)
return builder();
if (creds instanceof LoginCredentials)
return LoginCredentials.class.cast(creds).toBuilder();
else
return builder().identity(creds.identity).credential(creds.credential);
}
public static Builder builder() {
return new Builder();
}
public static class Builder extends Credentials.Builder<LoginCredentials> {
private boolean authenticateSudo;
private String password;
private String privateKey;
public Builder identity(String identity) {
return Builder.class.cast(super.identity(identity));
}
public Builder user(String user) {
return identity(user);
}
public Builder password(String password) {
this.password = password;
return this;
}
public Builder privateKey(String privateKey) {
this.privateKey = privateKey;
return this;
}
public Builder credential(String credential) {
if (CredentialUtils.isPrivateKeyCredential(credential))
return privateKey(credential);
else if (credential != null)
return password(credential);
return this;
}
public Builder authenticateSudo(boolean authenticateSudo) {
this.authenticateSudo = authenticateSudo;
return this;
}
public LoginCredentials build() {
if (identity == null && password == null && privateKey == null && !authenticateSudo)
return null;
return new LoginCredentials(identity, password, privateKey, authenticateSudo);
}
}
private final boolean authenticateSudo;
private final String password;
private final String privateKey;
public LoginCredentials(String username, @Nullable String password, @Nullable String privateKey,
boolean authenticateSudo) {
super(username, CredentialUtils.isPrivateKeyCredential(privateKey) ? privateKey : password);
this.authenticateSudo = authenticateSudo;
this.password = password;
this.privateKey = privateKey;
}
/**
* @return the login user
*/
public String getUser() {
return identity;
}
/**
* @return the password of the login user or null
*/
@Nullable
public String getPassword() {
return password;
}
/**
* @return the private ssh key of the user or null
*/
@Nullable
public String getPrivateKey() {
return privateKey;
}
/**
* secures access to root requires a password. This password is required to
* access either the console or run sudo as root.
* <p/>
* ex. {@code echo 'password' |sudo -S command}
*
* @return if a password is required to access the root user
*/
public boolean shouldAuthenticateSudo() {
return authenticateSudo;
}
@Override
public Builder toBuilder() {
return new Builder().user(identity).password(password).privateKey(privateKey).authenticateSudo(authenticateSudo);
}
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + (authenticateSudo ? 1231 : 1237);
result = prime * result + ((password == null) ? 0 : password.hashCode());
result = prime * result + ((privateKey == null) ? 0 : privateKey.hashCode());
return result;
}
@Override
public String toString() {
return "[user=" + getUser() + ", passwordPresent=" + (password != null) + ", privateKeyPresent="
+ (privateKey != null) + ", shouldAuthenticateSudo=" + authenticateSudo + "]";
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!super.equals(obj))
return false;
if (getClass() != obj.getClass())
return false;
LoginCredentials other = (LoginCredentials) obj;
if (authenticateSudo != other.authenticateSudo)
return false;
if (password == null) {
if (other.password != null)
return false;
} else if (!password.equals(other.password))
return false;
if (privateKey == null) {
if (other.privateKey != null)
return false;
} else if (!privateKey.equals(other.privateKey))
return false;
return true;
}
}

View File

@ -30,6 +30,7 @@ import javax.inject.Singleton;
import org.jclouds.collect.TransformingMap; import org.jclouds.collect.TransformingMap;
import org.jclouds.domain.Credentials; import org.jclouds.domain.Credentials;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.io.CopyInputStreamInputSupplierMap; import org.jclouds.io.CopyInputStreamInputSupplierMap;
import org.jclouds.json.Json; import org.jclouds.json.Json;
import org.jclouds.logging.Logger; import org.jclouds.logging.Logger;
@ -90,10 +91,28 @@ public class CredentialStoreModule extends AbstractModule {
@Override @Override
public InputStream apply(Credentials from) { public InputStream apply(Credentials from) {
return Strings2.toInputStream(json.toJson(checkNotNull(from))); checkNotNull(from, "inputCredentials");
if (from instanceof LoginCredentials) {
LoginCredentials login = LoginCredentials.class.cast(from);
JsonLoginCredentials val = new JsonLoginCredentials();
val.user = login.getUser();
val.password = login.getPassword();
val.privateKey = login.getPrivateKey();
if (login.shouldAuthenticateSudo())
val.authenticateSudo = login.shouldAuthenticateSudo();
return Strings2.toInputStream(json.toJson(val));
}
return Strings2.toInputStream(json.toJson(from));
} }
} }
static class JsonLoginCredentials {
private String user;
private String password;
private String privateKey;
private Boolean authenticateSudo;
}
@Singleton @Singleton
public static class CredentialsFromJsonInputStream implements Function<InputStream, Credentials> { public static class CredentialsFromJsonInputStream implements Function<InputStream, Credentials> {
@Resource @Resource
@ -106,17 +125,17 @@ public class CredentialStoreModule extends AbstractModule {
this.json = json; this.json = json;
} }
private static class PrivateCredentials {
String identity;
String credential;
}
@Override @Override
public Credentials apply(InputStream from) { public Credentials apply(InputStream from) {
try { try {
PrivateCredentials credentials = json.fromJson(Strings2.toStringAndClose(checkNotNull(from)), String creds = Strings2.toStringAndClose(checkNotNull(from));
PrivateCredentials.class); if (creds.indexOf("\"user\":") == -1) {
return new Credentials(credentials.identity, credentials.credential); return json.fromJson(creds, Credentials.class);
} else {
JsonLoginCredentials val = json.fromJson(creds, JsonLoginCredentials.class);
return LoginCredentials.builder().user(val.user).password(val.password).privateKey(val.privateKey)
.authenticateSudo(Boolean.TRUE.equals(val.authenticateSudo)).build();
}
} catch (Exception e) { } catch (Exception e) {
logger.warn(e, "ignoring problem retrieving credentials"); logger.warn(e, "ignoring problem retrieving credentials");
return null; return null;

View File

@ -46,10 +46,12 @@ public class CredentialUtils {
} }
public static boolean isPrivateKeyCredential(Credentials credentials) { public static boolean isPrivateKeyCredential(Credentials credentials) {
return credentials != null return credentials != null && isPrivateKeyCredential(credentials.credential);
&& credentials.credential != null }
&& (credentials.credential.startsWith(Pems.PRIVATE_PKCS1_MARKER) || credentials.credential
.startsWith(Pems.PRIVATE_PKCS8_MARKER)); public static boolean isPrivateKeyCredential(String credential) {
return credential != null
&& (credential.startsWith(Pems.PRIVATE_PKCS1_MARKER) || credential.startsWith(Pems.PRIVATE_PKCS8_MARKER));
} }
public static boolean isPrivateKeyEncrypted(byte[] privateKey) { public static boolean isPrivateKeyEncrypted(byte[] privateKey) {

View File

@ -28,6 +28,7 @@ import java.util.concurrent.ConcurrentHashMap;
import org.jclouds.crypto.PemsTest; import org.jclouds.crypto.PemsTest;
import org.jclouds.domain.Credentials; import org.jclouds.domain.Credentials;
import org.jclouds.domain.LoginCredentials;
import org.jclouds.io.CopyInputStreamInputSupplierMap; import org.jclouds.io.CopyInputStreamInputSupplierMap;
import org.jclouds.json.Json; import org.jclouds.json.Json;
import org.jclouds.json.config.GsonModule; import org.jclouds.json.config.GsonModule;
@ -60,7 +61,7 @@ public class CredentialStoreModuleTest {
public void deleteObject(String identity, String credential) throws InterruptedException, IOException { public void deleteObject(String identity, String credential) throws InterruptedException, IOException {
Injector injector = createInjector(); Injector injector = createInjector();
Map<String, InputStream> map = getMap(injector); Map<String, InputStream> map = getMap(injector);
check(map, getStore(injector), "i-20312", identity, credential); check(map, getStore(injector), "i-20312", new Credentials(identity, credential));
} }
public void testProvidedMapWithValue() throws IOException { public void testProvidedMapWithValue() throws IOException {
@ -68,8 +69,8 @@ public class CredentialStoreModuleTest {
new ConcurrentHashMap<String, InputSupplier<InputStream>>()); new ConcurrentHashMap<String, InputSupplier<InputStream>>());
map.put("test", new ByteArrayInputStream(json.toJson(new Credentials("user", "pass")).getBytes())); map.put("test", new ByteArrayInputStream(json.toJson(new Credentials("user", "pass")).getBytes()));
checkConsistent(map, getStore(createInjectorWithProvidedMap(map)), "test", "user", "pass"); checkConsistent(map, getStore(createInjectorWithProvidedMap(map)), "test", new Credentials("user", "pass"));
checkConsistent(map, getStore(createInjectorWithProvidedMap(map)), "test", "user", "pass"); checkConsistent(map, getStore(createInjectorWithProvidedMap(map)), "test", new Credentials("user", "pass"));
remove(map, getStore(createInjectorWithProvidedMap(map)), "test"); remove(map, getStore(createInjectorWithProvidedMap(map)), "test");
} }
@ -84,7 +85,7 @@ public class CredentialStoreModuleTest {
Map<String, Credentials> store = getStore(injector); Map<String, Credentials> store = getStore(injector);
for (int i = 0; i < 10; i++) for (int i = 0; i < 10; i++)
check(map, store, "test" + i, "user" + i, "pass" + i); check(map, store, "test" + i, new Credentials("user" + i, "pass" + i));
} }
@ -92,9 +93,9 @@ public class CredentialStoreModuleTest {
Map<String, InputStream> map = new CopyInputStreamInputSupplierMap( Map<String, InputStream> map = new CopyInputStreamInputSupplierMap(
new ConcurrentHashMap<String, InputSupplier<InputStream>>()); new ConcurrentHashMap<String, InputSupplier<InputStream>>());
put(map, getStore(createInjectorWithProvidedMap(map)), "test", "user", "pass"); put(map, getStore(createInjectorWithProvidedMap(map)), "test", new Credentials("user", "pass"));
checkConsistent(map, getStore(createInjectorWithProvidedMap(map)), "test", "user", "pass"); checkConsistent(map, getStore(createInjectorWithProvidedMap(map)), "test", new Credentials("user", "pass"));
checkConsistent(map, getStore(createInjectorWithProvidedMap(map)), "test", "user", "pass"); checkConsistent(map, getStore(createInjectorWithProvidedMap(map)), "test", new Credentials("user", "pass"));
remove(map, getStore(createInjectorWithProvidedMap(map)), "test"); remove(map, getStore(createInjectorWithProvidedMap(map)), "test");
} }
@ -102,13 +103,33 @@ public class CredentialStoreModuleTest {
public void testDefaultConsistentAcrossMultipleInjectors() throws IOException { public void testDefaultConsistentAcrossMultipleInjectors() throws IOException {
Map<String, InputStream> map = getMap(createInjector()); Map<String, InputStream> map = getMap(createInjector());
put(map, getStore(createInjector()), "test", "user", "pass"); put(map, getStore(createInjector()), "test", new Credentials("user", "pass"));
checkConsistent(map, getStore(createInjector()), "test", "user", "pass"); checkConsistent(map, getStore(createInjector()), "test", new Credentials("user", "pass"));
checkConsistent(map, getStore(createInjector()), "test", "user", "pass"); checkConsistent(map, getStore(createInjector()), "test", new Credentials("user", "pass"));
remove(map, getStore(createInjector()), "test"); remove(map, getStore(createInjector()), "test");
} }
public void testLoginConsistentAcrossMultipleInjectorsAndLooksNice() throws IOException {
Map<String, InputStream> map = getMap(createInjector());
LoginCredentials creds = LoginCredentials.builder().user("user").password("pass").build();
put(map, getStore(createInjector()), "test", creds);
checkConsistent(map, getStore(createInjector()), "test", creds, "{\"user\":\"user\",\"password\":\"pass\"}");
checkConsistent(map, getStore(createInjector()), "test", creds, "{\"user\":\"user\",\"password\":\"pass\"}");
remove(map, getStore(createInjector()), "test");
}
public void testLoginConsistentAcrossMultipleInjectorsAndLooksNiceWithSudo() throws IOException {
Map<String, InputStream> map = getMap(createInjector());
LoginCredentials creds = LoginCredentials.builder().user("user").password("pass").authenticateSudo(true).build();
put(map, getStore(createInjector()), "test", creds);
checkConsistent(map, getStore(createInjector()), "test", creds,
"{\"user\":\"user\",\"password\":\"pass\",\"authenticateSudo\":true}");
checkConsistent(map, getStore(createInjector()), "test", creds,
"{\"user\":\"user\",\"password\":\"pass\",\"authenticateSudo\":true}");
remove(map, getStore(createInjector()), "test");
}
protected Map<String, Credentials> getStore(Injector injector) { protected Map<String, Credentials> getStore(Injector injector) {
return injector.getInstance(Key.get(new TypeLiteral<Map<String, Credentials>>() { return injector.getInstance(Key.get(new TypeLiteral<Map<String, Credentials>>() {
})); }));
@ -127,10 +148,10 @@ public class CredentialStoreModuleTest {
return Guice.createInjector(new CredentialStoreModule(), new GsonModule()); return Guice.createInjector(new CredentialStoreModule(), new GsonModule());
} }
protected void check(Map<String, InputStream> map, Map<String, Credentials> store, String key, String identity, protected void check(Map<String, InputStream> map, Map<String, Credentials> store, String key, Credentials creds)
String credential) throws IOException { throws IOException {
put(map, store, key, identity, credential); put(map, store, key, creds);
checkConsistent(map, store, key, identity, credential); checkConsistent(map, store, key, creds);
remove(map, store, key); remove(map, store, key);
} }
@ -143,26 +164,29 @@ public class CredentialStoreModuleTest {
} }
protected void checkConsistent(Map<String, InputStream> map, Map<String, Credentials> store, String key, protected void checkConsistent(Map<String, InputStream> map, Map<String, Credentials> store, String key,
String identity, String credential) throws IOException { Credentials creds) throws IOException {
checkConsistent(map, store, key, creds, json.toJson(creds));
}
protected void checkConsistent(Map<String, InputStream> map, Map<String, Credentials> store, String key,
Credentials creds, String expected) throws IOException {
assertEquals(store.size(), 1); assertEquals(store.size(), 1);
assertEquals(map.size(), 1); assertEquals(map.size(), 1);
// checkRepeatedRead // checkRepeatedRead
assertEquals(store.get(key), new Credentials(identity, credential)); assertEquals(store.get(key), creds);
assertEquals(store.get(key), new Credentials(identity, credential)); assertEquals(store.get(key), creds);
// checkRepeatedRead // checkRepeatedRead
checkToJson(map, key, identity, credential); checkToJson(map, key, expected);
checkToJson(map, key, identity, credential); checkToJson(map, key, expected);
} }
protected void checkToJson(Map<String, InputStream> map, String key, String identity, String credential) protected void checkToJson(Map<String, InputStream> map, String key, String expected) throws IOException {
throws IOException { assertEquals(Strings2.toStringAndClose(map.get(key)), expected);
assertEquals(Strings2.toStringAndClose(map.get(key)), json.toJson(new Credentials(identity, credential)));
} }
protected void put(Map<String, InputStream> map, Map<String, Credentials> store, String key, String identity, protected void put(Map<String, InputStream> map, Map<String, Credentials> store, String key, Credentials creds) {
String credential) {
assertEquals(store.size(), 0); assertEquals(store.size(), 0);
assertEquals(map.size(), 0); assertEquals(map.size(), 0);
store.put(key, new Credentials(identity, credential)); store.put(key, creds);
} }
} }

View File

@ -39,7 +39,8 @@
<test.aws-ec2.identity>${test.aws.identity}</test.aws-ec2.identity> <test.aws-ec2.identity>${test.aws.identity}</test.aws-ec2.identity>
<test.aws-ec2.credential>${test.aws.credential}</test.aws-ec2.credential> <test.aws-ec2.credential>${test.aws.credential}</test.aws-ec2.credential>
<test.aws-ec2.image-id></test.aws-ec2.image-id> <test.aws-ec2.image-id></test.aws-ec2.image-id>
<test.aws-ec2.login-user></test.aws-ec2.login-user> <test.aws-ec2.image.login-user></test.aws-ec2.image.login-user>
<test.aws-ec2.image.authenticate-sudo></test.aws-ec2.image.authenticate-sudo>
</properties> </properties>
<dependencies> <dependencies>
@ -116,7 +117,8 @@
<test.aws-ec2.identity>${test.aws-ec2.identity}</test.aws-ec2.identity> <test.aws-ec2.identity>${test.aws-ec2.identity}</test.aws-ec2.identity>
<test.aws-ec2.credential>${test.aws-ec2.credential}</test.aws-ec2.credential> <test.aws-ec2.credential>${test.aws-ec2.credential}</test.aws-ec2.credential>
<test.aws-ec2.image-id>${test.aws-ec2.image-id}</test.aws-ec2.image-id> <test.aws-ec2.image-id>${test.aws-ec2.image-id}</test.aws-ec2.image-id>
<test.aws-ec2.login-user>${test.aws-ec2.login-user}</test.aws-ec2.login-user> <test.aws-ec2.image.login-user>${test.aws-ec2.image.login-user}</test.aws-ec2.image.login-user>
<test.aws-ec2.image.authenticate-sudo>${test.aws-ec2.image.authenticate-sudo}</test.aws-ec2.image.authenticate-sudo>
</systemPropertyVariables> </systemPropertyVariables>
</configuration> </configuration>
</execution> </execution>

Some files were not shown because too many files have changed in this diff Show More