fixed username shadowing in elastichosts; added retry on auth fail

This commit is contained in:
Adrian Cole 2011-12-22 04:33:47 -08:00
parent 8369ffae35
commit 016b0c6eb5
2 changed files with 12 additions and 2 deletions

View File

@ -37,6 +37,10 @@ public class ElasticStackPropertiesBuilder extends PropertiesBuilder {
Properties properties = super.defaultProperties(); Properties properties = super.defaultProperties();
properties.setProperty(PROPERTY_API_VERSION, "1.0"); properties.setProperty(PROPERTY_API_VERSION, "1.0");
properties.setProperty(PROPERTY_VNC_PASSWORD, "IL9vs34d"); properties.setProperty(PROPERTY_VNC_PASSWORD, "IL9vs34d");
// passwords are set post-boot, so auth failures are possible
// from a race condition applying the password set script
properties.setProperty("jclouds.ssh.max-retries", "5");
properties.setProperty("jclouds.ssh.retry-auth", "true");
return properties; return properties;
} }

View File

@ -26,6 +26,7 @@ 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.domain.LoginCredentials;
import org.jclouds.elasticstack.domain.DriveInfo; import org.jclouds.elasticstack.domain.DriveInfo;
@ -42,22 +43,27 @@ import com.google.common.collect.ImmutableMap;
public class WellKnownImageToImage implements Function<DriveInfo, Image> { public class WellKnownImageToImage implements Function<DriveInfo, Image> {
private final Supplier<Location> locationSupplier; private final Supplier<Location> locationSupplier;
private final Map<String, WellKnownImage> preinstalledImages; private final Map<String, WellKnownImage> preinstalledImages;
private final Map<String, Credentials> credentialStore;
@Inject @Inject
public WellKnownImageToImage(Supplier<Location> locationSupplier, Map<String, WellKnownImage> preinstalledImages) { public WellKnownImageToImage(Supplier<Location> locationSupplier, Map<String, WellKnownImage> preinstalledImages, Map<String, Credentials> credentialStore) {
this.locationSupplier = locationSupplier; this.locationSupplier = locationSupplier;
this.preinstalledImages = preinstalledImages; this.preinstalledImages = preinstalledImages;
this.credentialStore = credentialStore;
} }
@Override @Override
public Image apply(DriveInfo drive) { public Image apply(DriveInfo drive) {
WellKnownImage input = preinstalledImages.get(drive.getUuid()); WellKnownImage input = preinstalledImages.get(drive.getUuid());
// set credentials in the store here, as opposed to directly modifying the image. we need to
// set credentials on the image outside of this function so that they can be for example
// overridden by properties
credentialStore.put("image#" + drive.getUuid(), LoginCredentials.builder().user(input.getLoginUser()).build());
return new ImageBuilder() return new ImageBuilder()
.ids(drive.getUuid()) .ids(drive.getUuid())
.userMetadata( .userMetadata(
ImmutableMap.<String, String> builder().putAll(drive.getUserMetadata()) ImmutableMap.<String, String> builder().putAll(drive.getUserMetadata())
.put("size", input.getSize() + "").build()) .put("size", input.getSize() + "").build())
.defaultCredentials(LoginCredentials.builder().user(input.getLoginUser()).build())
.location(locationSupplier.get()) .location(locationSupplier.get())
.name(input.getDescription()) .name(input.getDescription())
.description(drive.getName()) .description(drive.getName())