Issue 750:property to set the image id for the default template

This commit is contained in:
Adrian Cole 2011-11-14 19:23:06 +02:00
parent 69467b04e3
commit 4329129c25
43 changed files with 1124 additions and 289 deletions

View File

@ -20,7 +20,6 @@ package org.jclouds.byon.internal;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Map;
import java.util.Set;
import javax.inject.Inject;
@ -33,7 +32,6 @@ import org.jclouds.compute.domain.Hardware;
import org.jclouds.compute.domain.Image;
import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.compute.domain.Template;
import org.jclouds.domain.Credentials;
import org.jclouds.domain.Location;
import org.jclouds.domain.LocationBuilder;
import org.jclouds.domain.LocationScope;
@ -67,8 +65,7 @@ public class BYONComputeServiceAdapter implements JCloudsNativeComputeServiceAda
}
@Override
public NodeMetadata createNodeWithGroupEncodedIntoNameThenStoreCredentials(String tag, String name,
Template template, Map<String, Credentials> credentialStore) {
public NodeWithInitialCredentials createNodeWithGroupEncodedIntoName(String group, String name, Template template) {
throw new UnsupportedOperationException();
}

View File

@ -22,7 +22,6 @@ import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.collect.Iterables.filter;
import static org.jclouds.concurrent.FutureIterables.transformParallel;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
@ -107,8 +106,7 @@ public class CloudSigmaComputeServiceAdapter implements
}
@Override
public ServerInfo createNodeWithGroupEncodedIntoNameThenStoreCredentials(String tag, String name, Template template,
Map<String, Credentials> credentialStore) {
public NodeAndInitialCredentials<ServerInfo> createNodeWithGroupEncodedIntoName(String tag, String name, Template template) {
long bootSize = (long) (template.getHardware().getVolumes().get(0).getSize() * 1024 * 1024 * 1024l);
logger.debug(">> imaging boot drive source(%s) bytes(%d)", template.getImage().getId(), bootSize);
DriveInfo drive = client.cloneDrive(template.getImage().getId(), template.getImage().getId(),
@ -128,9 +126,8 @@ public class CloudSigmaComputeServiceAdapter implements
logger.debug("<< created server(%s)", from.getUuid());
logger.debug(">> starting server(%s)", from.getUuid());
client.startServer(from.getUuid());
// store the credentials so that later functions can use them
credentialStore.put("node#" + from.getUuid(), new Credentials("root", defaultVncPassword));
return from;
return new NodeAndInitialCredentials<ServerInfo>(from, from.getUuid(),
new Credentials("root", defaultVncPassword));
}
@Override

View File

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

View File

@ -21,7 +21,6 @@ package org.jclouds.deltacloud.compute.strategy;
import static com.google.common.base.Preconditions.checkNotNull;
import java.net.URI;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import javax.annotation.Resource;
@ -36,11 +35,11 @@ import org.jclouds.compute.reference.ComputeServiceConstants;
import org.jclouds.deltacloud.DeltacloudClient;
import org.jclouds.deltacloud.domain.HardwareProfile;
import org.jclouds.deltacloud.domain.Instance;
import org.jclouds.deltacloud.domain.Instance.State;
import org.jclouds.deltacloud.domain.PasswordAuthentication;
import org.jclouds.deltacloud.domain.Realm;
import org.jclouds.deltacloud.domain.Transition;
import org.jclouds.deltacloud.domain.TransitionOnAction;
import org.jclouds.deltacloud.domain.Instance.State;
import org.jclouds.deltacloud.options.CreateInstanceOptions;
import org.jclouds.deltacloud.predicates.InstanceFinished;
import org.jclouds.deltacloud.predicates.InstanceRunning;
@ -56,13 +55,13 @@ import com.google.common.collect.Iterables;
import com.google.common.collect.Multimap;
/**
* defines the connection between the {@link DeltacloudClient} implementation and the jclouds
* {@link ComputeService}
* defines the connection between the {@link DeltacloudClient} implementation
* and the jclouds {@link ComputeService}
*
*/
@Singleton
public class DeltacloudComputeServiceAdapter implements
ComputeServiceAdapter<Instance, HardwareProfile, org.jclouds.deltacloud.domain.Image, Realm> {
ComputeServiceAdapter<Instance, HardwareProfile, org.jclouds.deltacloud.domain.Image, Realm> {
@Resource
@Named(ComputeServiceConstants.COMPUTE_LOGGER)
protected Logger logger = Logger.NULL;
@ -75,24 +74,23 @@ public class DeltacloudComputeServiceAdapter implements
this.client = checkNotNull(client, "client");
// TODO: parameterize
stateChanges = ImmutableMap.<Instance.State, Predicate<Instance>> of(//
Instance.State.RUNNING, new RetryablePredicate<Instance>(new InstanceRunning(client), 600, 1,
TimeUnit.SECONDS),//
Instance.State.FINISH, new RetryablePredicate<Instance>(new InstanceFinished(client), 30, 1,
TimeUnit.SECONDS)//
);
Instance.State.RUNNING, new RetryablePredicate<Instance>(new InstanceRunning(client), 600, 1,
TimeUnit.SECONDS),//
Instance.State.FINISH, new RetryablePredicate<Instance>(new InstanceFinished(client), 30, 1,
TimeUnit.SECONDS)//
);
}
@Override
public Instance createNodeWithGroupEncodedIntoNameThenStoreCredentials(String tag, String name, Template template,
Map<String, Credentials> credentialStore) {
public NodeAndInitialCredentials<Instance> createNodeWithGroupEncodedIntoName(String tag, String name,
Template template) {
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;
if (instance.getAuthentication() != null && instance.getAuthentication() instanceof PasswordAuthentication) {
Credentials creds = PasswordAuthentication.class.cast(instance.getAuthentication()).getLoginCredentials();
// store the credentials so that later functions can use them
credentialStore.put(instance.getHref().toASCIIString(), creds);
creds = PasswordAuthentication.class.cast(instance.getAuthentication()).getLoginCredentials();
}
return instance;
return new NodeAndInitialCredentials<Instance>(instance, instance.getId(), creds);
}
@Override
@ -139,7 +137,7 @@ public class DeltacloudComputeServiceAdapter implements
}
Iterable<Transition> findChainTo(Instance.State desired, Instance.State currentState,
Multimap<Instance.State, ? extends Transition> states) {
Multimap<Instance.State, ? extends Transition> states) {
for (Transition transition : states.get(currentState)) {
if (currentState.ordinal() >= transition.getTo().ordinal())
continue;

View File

@ -27,7 +27,6 @@ import javax.inject.Inject;
import javax.inject.Singleton;
import org.jclouds.compute.domain.Image;
import org.jclouds.compute.strategy.PopulateDefaultLoginCredentialsForImageStrategy;
import org.jclouds.domain.Credentials;
import org.jclouds.ec2.compute.domain.RegionAndName;
import org.jclouds.ec2.domain.KeyPair;
@ -45,14 +44,12 @@ import com.google.common.cache.CacheLoader;
@Singleton
public class CredentialsForInstance extends CacheLoader<RunningInstance, Credentials> {
private final ConcurrentMap<RegionAndName, KeyPair> credentialsMap;
private final PopulateDefaultLoginCredentialsForImageStrategy credentialProvider;
private final Supplier<Cache<RegionAndName, ? extends Image>> imageMap;
@Inject
CredentialsForInstance(ConcurrentMap<RegionAndName, KeyPair> credentialsMap,
PopulateDefaultLoginCredentialsForImageStrategy credentialProvider, Supplier<Cache<RegionAndName, ? extends Image>> imageMap) {
Supplier<Cache<RegionAndName, ? extends Image>> imageMap) {
this.credentialsMap = checkNotNull(credentialsMap, "credentialsMap");
this.credentialProvider = checkNotNull(credentialProvider, "credentialProvider");
this.imageMap = imageMap;
}
@ -73,8 +70,6 @@ public class CredentialsForInstance extends CacheLoader<RunningInstance, Credent
@VisibleForTesting
String getLoginAccountFor(RunningInstance from) throws ExecutionException {
return checkNotNull(
credentialProvider.execute(imageMap.get().get(new RegionAndName(from.getRegion(), from.getImageId()))),
"login from image: " + from.getImageId()).identity;
return imageMap.get().get(new RegionAndName(from.getRegion(), from.getImageId())).getDefaultCredentials().identity;
}
}

View File

@ -20,21 +20,29 @@ package org.jclouds.ec2.compute.strategy;
import static com.google.common.base.Preconditions.checkArgument;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;
import org.jclouds.ec2.domain.Image;
import org.jclouds.compute.strategy.PopulateDefaultLoginCredentialsForImageStrategy;
import org.jclouds.compute.strategy.impl.ReturnCredentialsBoundToImage;
import org.jclouds.domain.Credentials;
import org.jclouds.ec2.domain.Image;
import org.jclouds.javax.annotation.Nullable;
/**
* @author Oleksiy Yarmula
*/
@Singleton
public class EC2PopulateDefaultLoginCredentialsForImageStrategy implements
PopulateDefaultLoginCredentialsForImageStrategy {
public class EC2PopulateDefaultLoginCredentialsForImageStrategy extends ReturnCredentialsBoundToImage {
@Inject
public EC2PopulateDefaultLoginCredentialsForImageStrategy(@Nullable @Named("image") Credentials creds) {
super(creds);
}
@Override
public Credentials execute(Object resourceToAuthenticate) {
if (creds != null)
return creds;
Credentials credentials = new Credentials("root", null);
if (resourceToAuthenticate != null) {
String owner = null;

View File

@ -83,7 +83,7 @@ public class EC2ImageParserTest {
.getInstance(Json.class));
Set<Image> result = DescribeImagesResponseHandlerTest.parseImages(resource);
EC2ImageParser parser = new EC2ImageParser(new EC2PopulateDefaultLoginCredentialsForImageStrategy(), map,
EC2ImageParser parser = new EC2ImageParser(new EC2PopulateDefaultLoginCredentialsForImageStrategy(null), map,
Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet.<Location> of(defaultLocation)), Suppliers
.ofInstance(defaultLocation), new ReviseParsedImage.NoopReviseParsedImage());
return Sets.newLinkedHashSet(Iterables.filter(Iterables.transform(result, parser), Predicates.notNull()));

View File

@ -103,8 +103,7 @@ public class ElasticStackComputeServiceAdapter implements
}
@Override
public ServerInfo createNodeWithGroupEncodedIntoNameThenStoreCredentials(String tag, String name, Template template,
Map<String, Credentials> credentialStore) {
public NodeAndInitialCredentials<ServerInfo> createNodeWithGroupEncodedIntoName(String tag, String name, Template template) {
long bootSize = (long) (template.getHardware().getVolumes().get(0).getSize() * 1024 * 1024 * 1024l);
logger.debug(">> creating boot drive bytes(%d)", bootSize);
@ -127,10 +126,7 @@ public class ElasticStackComputeServiceAdapter implements
ServerInfo from = client.createServer(toCreate);
client.startServer(from.getUuid());
from = client.getServerInfo(from.getUuid());
// store the credentials so that later functions can use them
credentialStore.put("node#" + from.getUuid(), new Credentials(
template.getImage().getDefaultCredentials().identity, from.getVnc().getPassword()));
return from;
return new NodeAndInitialCredentials<ServerInfo>(from, from.getUuid(), new Credentials(null, defaultVncPassword));
}
@Override

View File

@ -22,20 +22,29 @@ import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import static org.jclouds.vcloud.compute.util.VCloudComputeUtils.getCredentialsFrom;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;
import org.jclouds.compute.strategy.PopulateDefaultLoginCredentialsForImageStrategy;
import org.jclouds.compute.strategy.impl.ReturnCredentialsBoundToImage;
import org.jclouds.domain.Credentials;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.vcloud.domain.VAppTemplate;
/**
* @author Adrian Cole
*/
@Singleton
public class GetLoginCredentialsFromGuestConfiguration implements PopulateDefaultLoginCredentialsForImageStrategy {
public class GetLoginCredentialsFromGuestConfiguration extends ReturnCredentialsBoundToImage {
@Inject
public GetLoginCredentialsFromGuestConfiguration(@Nullable @Named("image") Credentials creds) {
super(creds);
}
@Override
public Credentials execute(Object resourceToAuthenticate) {
if (creds != null)
return creds;
checkNotNull(resourceToAuthenticate);
checkArgument(resourceToAuthenticate instanceof VAppTemplate, "Resource must be an VAppTemplate");
return getCredentialsFrom(VAppTemplate.class.cast(resourceToAuthenticate));

View File

@ -25,12 +25,14 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.annotation.Resource;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;
import org.jclouds.compute.reference.ComputeServiceConstants;
import org.jclouds.compute.strategy.PopulateDefaultLoginCredentialsForImageStrategy;
import org.jclouds.compute.strategy.impl.ReturnCredentialsBoundToImage;
import org.jclouds.domain.Credentials;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.logging.Logger;
import org.jclouds.trmk.vcloud_0_8.domain.VAppTemplate;
@ -38,21 +40,25 @@ import org.jclouds.trmk.vcloud_0_8.domain.VAppTemplate;
* @author Adrian Cole
*/
@Singleton
public class ParseVAppTemplateDescriptionToGetDefaultLoginCredentials implements
PopulateDefaultLoginCredentialsForImageStrategy {
public class ParseVAppTemplateDescriptionToGetDefaultLoginCredentials extends ReturnCredentialsBoundToImage {
@Inject
public ParseVAppTemplateDescriptionToGetDefaultLoginCredentials(@Nullable @Named("image") Credentials creds) {
super(creds);
}
@Resource
@Named(ComputeServiceConstants.COMPUTE_LOGGER)
protected Logger logger = Logger.NULL;
public static final Pattern USER_PASSWORD_PATTERN = Pattern
.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
public Credentials execute(Object resourceToAuthenticate) {
if (creds != null)
return creds;
checkNotNull(resourceToAuthenticate);
checkArgument(resourceToAuthenticate instanceof VAppTemplate,
"Resource must be an VAppTemplate (for Terremark)");
checkArgument(resourceToAuthenticate instanceof VAppTemplate, "Resource must be an VAppTemplate (for Terremark)");
VAppTemplate template = (VAppTemplate) resourceToAuthenticate;
String search = template.getDescription() != null ? template.getDescription() : template.getName();
if (search.indexOf("Windows") >= 0) {
@ -62,8 +68,7 @@ public class ParseVAppTemplateDescriptionToGetDefaultLoginCredentials implements
if (matcher.find()) {
return new Credentials(matcher.group(1), matcher.group(2));
} 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;
}
}

View File

@ -88,7 +88,7 @@ public class TerremarkVCloudComputeClientTest {
Map<Status, NodeState> vAppStatusToNodeState = createMock(Map.class);
TerremarkVCloudComputeClient computeClient = new TerremarkVCloudComputeClient(client,
new ParseVAppTemplateDescriptionToGetDefaultLoginCredentials(), new Provider<String>() {
new ParseVAppTemplateDescriptionToGetDefaultLoginCredentials(null), new Provider<String>() {
@Override
public String get() {

View File

@ -47,7 +47,7 @@ public class PopulateDefaultLoginCredentialsForVAppTemplateTest {
VAppTemplate template = createMock(VAppTemplate.class);
expect(template.getDescription()).andReturn(description).atLeastOnce();
replay(template);
ParseVAppTemplateDescriptionToGetDefaultLoginCredentials converter = new ParseVAppTemplateDescriptionToGetDefaultLoginCredentials();
ParseVAppTemplateDescriptionToGetDefaultLoginCredentials converter = new ParseVAppTemplateDescriptionToGetDefaultLoginCredentials(null);
Credentials creds = converter.execute(template);
assertEquals(creds.identity, "vcloud");
assertEquals(creds.credential, "$Ep455l0ud!2");
@ -61,7 +61,7 @@ public class PopulateDefaultLoginCredentialsForVAppTemplateTest {
VAppTemplate template = createMock(VAppTemplate.class);
expect(template.getDescription()).andReturn(description).atLeastOnce();
replay(template);
ParseVAppTemplateDescriptionToGetDefaultLoginCredentials converter = new ParseVAppTemplateDescriptionToGetDefaultLoginCredentials();
ParseVAppTemplateDescriptionToGetDefaultLoginCredentials converter = new ParseVAppTemplateDescriptionToGetDefaultLoginCredentials(null);
Credentials creds = converter.execute(template);
assertEquals(creds.identity, "ecloud");
assertEquals(creds.credential, "$Ep455l0ud!2");
@ -75,7 +75,7 @@ public class PopulateDefaultLoginCredentialsForVAppTemplateTest {
VAppTemplate template = createMock(VAppTemplate.class);
expect(template.getDescription()).andReturn(description).atLeastOnce();
replay(template);
ParseVAppTemplateDescriptionToGetDefaultLoginCredentials converter = new ParseVAppTemplateDescriptionToGetDefaultLoginCredentials();
ParseVAppTemplateDescriptionToGetDefaultLoginCredentials converter = new ParseVAppTemplateDescriptionToGetDefaultLoginCredentials(null);
Credentials creds = converter.execute(template);
assertEquals(creds.identity, "vpncubed");
assertEquals(creds.credential, "vpncubed");
@ -89,7 +89,7 @@ public class PopulateDefaultLoginCredentialsForVAppTemplateTest {
VAppTemplate template = createMock(VAppTemplate.class);
expect(template.getDescription()).andReturn(description).atLeastOnce();
replay(template);
ParseVAppTemplateDescriptionToGetDefaultLoginCredentials converter = new ParseVAppTemplateDescriptionToGetDefaultLoginCredentials();
ParseVAppTemplateDescriptionToGetDefaultLoginCredentials converter = new ParseVAppTemplateDescriptionToGetDefaultLoginCredentials(null);
Credentials creds = converter.execute(template);
assertEquals(creds.identity, "ecloud");
assertEquals(creds.credential, "TmrkCl0ud1s#1!");
@ -103,7 +103,7 @@ public class PopulateDefaultLoginCredentialsForVAppTemplateTest {
VAppTemplate template = createMock(VAppTemplate.class);
expect(template.getDescription()).andReturn(description).atLeastOnce();
replay(template);
ParseVAppTemplateDescriptionToGetDefaultLoginCredentials converter = new ParseVAppTemplateDescriptionToGetDefaultLoginCredentials();
ParseVAppTemplateDescriptionToGetDefaultLoginCredentials converter = new ParseVAppTemplateDescriptionToGetDefaultLoginCredentials(null);
Credentials creds = converter.execute(template);
assertEquals(creds.identity, "Administrator");
assertEquals(creds.credential, null);

View File

@ -18,14 +18,16 @@
*/
package org.jclouds.compute;
import java.util.Map;
import static com.google.common.base.Preconditions.checkNotNull;
import org.jclouds.compute.domain.Template;
import org.jclouds.domain.Credentials;
import org.jclouds.javax.annotation.Nullable;
/**
* A means of specifying the interface between the {@link ComputeService ComputeServices} and a concrete compute
* cloud implementation, jclouds or otherwise.
* A means of specifying the interface between the {@link ComputeService
* ComputeServices} and a concrete compute cloud implementation, jclouds or
* otherwise.
*
* @author Adrian Cole
*
@ -33,41 +35,79 @@ import org.jclouds.domain.Credentials;
public interface ComputeServiceAdapter<N, H, I, L> {
/**
* {@link ComputeService#runNodesWithTag(String, int, Template)} generates the parameters passed
* into this method such that each node in the set has a unique name.
* {@link ComputeService#runNodesWithTag(String, int, Template)} generates
* the parameters passed into this method such that each node in the set has
* a unique name.
*
* <h4>note</h4> It is intentional to return the library native node object, as generic type
* {@code N}. If you are not using library-native objects (such as libvirt {@code Domain}) use
* <h4>note</h4> It is intentional to return the library native node object,
* as generic type {@code N}. If you are not using library-native objects
* (such as libvirt {@code Domain}) use
* {@link JCloudsNativeComputeServiceAdapter} instead.
*
* <h4>note</h4> Your responsibility is to create a node with the underlying library and return
* after storing its credentials in the supplied map corresponding to
* {@link ComputeServiceContext#getCredentialStore credentialStore}
* <h4>note</h4> Your responsibility is to create a node with the underlying
* library and return after storing its credentials in the supplied map
* corresponding to {@link ComputeServiceContext#getCredentialStore
* credentialStore}
*
* @param tag
* used to aggregate nodes with identical configuration
* @param name
* unique supplied name for the node, which has the tag encoded into it.
* unique supplied name for the node, which has the tag encoded
* into it.
* @param template
* includes {@code imageId}, {@code locationId}, and {@code hardwareId} used to resume
* the instance.
* @param credentialStore
* once the node is resumeed, its login user and password must be stored keyed on
* {@code node#id}.
* includes {@code imageId}, {@code locationId}, and
* {@code hardwareId} used to resume the instance.
* @return library-native representation of a node.
*
* @see ComputeService#runNodesWithTag(String, int, Template)
* @see ComputeServiceContext#getCredentialStore
*/
N createNodeWithGroupEncodedIntoNameThenStoreCredentials(String tag, String name, Template template,
Map<String, Credentials> credentialStore);
NodeAndInitialCredentials<N> createNodeWithGroupEncodedIntoName(String tag, String name, Template template);
public static class NodeAndInitialCredentials<N> {
private final N node;
private final String nodeId;
private final Credentials credentials;
public NodeAndInitialCredentials(N node, String nodeId, @Nullable Credentials credentials) {
this.node = checkNotNull(node, "node");
this.nodeId = checkNotNull(nodeId, "nodeId");
this.credentials = credentials;
}
/**
*
* @return cloud specific representation of the newly created node
*/
public N getNode() {
return node;
}
/**
*
* @return Stringifed version of the new node's id.
*/
public String getNodeId() {
return nodeId;
}
/**
*
* @return credentials given by the api for the node, or null if this
* information is not available
*/
@Nullable
public Credentials getCredentials() {
return credentials;
}
}
/**
* Hardware profiles describe available cpu, memory, and disk configurations that can be used to
* run a node.
* Hardware profiles describe available cpu, memory, and disk configurations
* that can be used to run a node.
* <p/>
* To implement this method, return the library native hardware profiles available to the user.
* These will be used to launch nodes as a part of the template.
* To implement this method, return the library native hardware profiles
* available to the user. These will be used to launch nodes as a part of the
* template.
*
* @return a non-null iterable of available hardware profiles.
* @see ComputeService#listHardwareProfiles()
@ -75,10 +115,11 @@ public interface ComputeServiceAdapter<N, H, I, L> {
Iterable<H> listHardwareProfiles();
/**
* Images are the available configured operating systems that someone can run a node with. *
* Images are the available configured operating systems that someone can run
* a node with. *
* <p/>
* To implement this method, return the library native images available to the user. These will
* be used to launch nodes as a part of the template.
* To implement this method, return the library native images available to
* the user. These will be used to launch nodes as a part of the template.
*
* @return a non-null iterable of available images.
* @see ComputeService#listImages()

View File

@ -18,17 +18,15 @@
*/
package org.jclouds.compute;
import java.util.Map;
import org.jclouds.compute.domain.Hardware;
import org.jclouds.compute.domain.Image;
import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.compute.domain.Template;
import org.jclouds.domain.Credentials;
import org.jclouds.domain.Location;
/**
* A means of specifying the implementation of a service that uses jclouds types.
* A means of specifying the implementation of a service that uses jclouds
* types.
*
* @author Adrian Cole
*
@ -39,8 +37,14 @@ public interface JCloudsNativeComputeServiceAdapter extends
* {@inheritDoc}
*/
@Override
NodeMetadata createNodeWithGroupEncodedIntoNameThenStoreCredentials(String tag, String name, Template template,
Map<String, Credentials> credentialStore);
NodeWithInitialCredentials createNodeWithGroupEncodedIntoName(String group, String name, Template template);
public static class NodeWithInitialCredentials extends ComputeServiceAdapter.NodeAndInitialCredentials<NodeMetadata> {
public NodeWithInitialCredentials(NodeMetadata node) {
super(node, node.getId(), node.getCredentials());
}
}
/**
* {@inheritDoc}

View File

@ -41,8 +41,10 @@ import org.jclouds.compute.domain.Hardware;
import org.jclouds.compute.domain.Image;
import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.compute.domain.OsFamily;
import org.jclouds.compute.domain.Template;
import org.jclouds.compute.domain.TemplateBuilder;
import org.jclouds.compute.functions.CreateSshClientOncePortIsListeningOnNode;
import org.jclouds.compute.functions.DefaultCredentialsFromImageOrOverridingCredentials;
import org.jclouds.compute.functions.TemplateOptionsToStatement;
import org.jclouds.compute.options.RunScriptOptions;
import org.jclouds.compute.options.TemplateOptions;
@ -50,6 +52,7 @@ import org.jclouds.compute.reference.ComputeServiceConstants;
import org.jclouds.compute.strategy.CustomizeNodeAndAddToGoodMapOrPutExceptionIntoBadMap;
import org.jclouds.compute.strategy.InitializeRunScriptOnNodeOrPlaceInBadMap;
import org.jclouds.config.ValueOfConfigurationKeyOrNull;
import org.jclouds.domain.Credentials;
import org.jclouds.json.Json;
import org.jclouds.location.Provider;
import org.jclouds.location.config.LocationModule;
@ -84,7 +87,11 @@ public abstract class BaseComputeServiceContextModule extends AbstractModule {
}).to(CreateSshClientOncePortIsListeningOnNode.class);
bind(new TypeLiteral<Function<TemplateOptions, Statement>>() {
}).to(TemplateOptionsToStatement.class);
bind(Credentials.class).annotatedWith(Names.named("image")).toProvider(
GetLoginForProviderFromPropertiesAndStoreCredentialsOrReturnNull.class);
bind(new TypeLiteral<Function<Template, Credentials>>() {
}).to(DefaultCredentialsFromImageOrOverridingCredentials.class);
install(new FactoryModuleBuilder()
.implement(RunScriptOnNodeUsingSsh.class, Names.named("direct"), RunScriptOnNodeUsingSsh.class)
.implement(RunScriptOnNodeAsInitScriptUsingSshAndBlockUntilComplete.class, Names.named("blocking"),

View File

@ -20,6 +20,7 @@ package org.jclouds.compute.config;
import java.util.Set;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.jclouds.collect.TransformingSetSupplier;
@ -27,18 +28,22 @@ import org.jclouds.compute.ComputeServiceAdapter;
import org.jclouds.compute.ComputeServiceContext;
import org.jclouds.compute.domain.Hardware;
import org.jclouds.compute.domain.Image;
import org.jclouds.compute.domain.ImageBuilder;
import org.jclouds.compute.internal.ComputeServiceContextImpl;
import org.jclouds.compute.strategy.CreateNodeWithGroupEncodedIntoName;
import org.jclouds.compute.strategy.DestroyNodeStrategy;
import org.jclouds.compute.strategy.GetNodeMetadataStrategy;
import org.jclouds.compute.strategy.ListNodesStrategy;
import org.jclouds.compute.strategy.PopulateDefaultLoginCredentialsForImageStrategy;
import org.jclouds.compute.strategy.RebootNodeStrategy;
import org.jclouds.compute.strategy.ResumeNodeStrategy;
import org.jclouds.compute.strategy.SuspendNodeStrategy;
import org.jclouds.compute.strategy.impl.AdaptingComputeServiceStrategies;
import org.jclouds.domain.Credentials;
import org.jclouds.domain.Location;
import com.google.common.base.Function;
import com.google.common.base.Functions;
import com.google.common.base.Supplier;
import com.google.inject.Provides;
import com.google.inject.Scopes;
@ -59,20 +64,19 @@ public class ComputeServiceAdapterContextModule<S, A, N, H, I, L> extends BaseCo
this.asyncClientType = asyncClientType;
}
@SuppressWarnings( { "unchecked", "rawtypes" })
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
protected void configure() {
super.configure();
bind(new TypeLiteral<ComputeServiceContext>() {
}).to(
(TypeLiteral) TypeLiteral.get(Types.newParameterizedType(ComputeServiceContextImpl.class,
syncClientType, asyncClientType))).in(Scopes.SINGLETON);
}).to((TypeLiteral) TypeLiteral.get(Types.newParameterizedType(ComputeServiceContextImpl.class, syncClientType,
asyncClientType))).in(Scopes.SINGLETON);
}
@Provides
@Singleton
protected Supplier<Set<? extends Location>> provideLocations(final ComputeServiceAdapter<N, H, I, L> adapter,
Function<L, Location> transformer) {
Function<L, Location> transformer) {
return new TransformingSetSupplier<L, Location>(new Supplier<Iterable<L>>() {
@Override
@ -86,7 +90,7 @@ public class ComputeServiceAdapterContextModule<S, A, N, H, I, L> extends BaseCo
@Provides
@Singleton
protected Supplier<Set<? extends Hardware>> provideHardware(final ComputeServiceAdapter<N, H, I, L> adapter,
Function<H, Hardware> transformer) {
Function<H, Hardware> transformer) {
return new TransformingSetSupplier<H, Hardware>(new Supplier<Iterable<H>>() {
@Override
@ -100,7 +104,7 @@ public class ComputeServiceAdapterContextModule<S, A, N, H, I, L> extends BaseCo
@Provides
@Singleton
protected Supplier<Set<? extends Image>> provideImages(final ComputeServiceAdapter<N, H, I, L> adapter,
Function<I, Image> transformer) {
Function<I, Image> transformer, AddDefaultCredentialsToImage addDefaultCredentialsToImage) {
return new TransformingSetSupplier<I, Image>(new Supplier<Iterable<I>>() {
@Override
@ -108,12 +112,34 @@ public class ComputeServiceAdapterContextModule<S, A, N, H, I, L> extends BaseCo
return adapter.listImages();
}
}, transformer);
}, Functions.compose(addDefaultCredentialsToImage, transformer));
}
@Singleton
public static class AddDefaultCredentialsToImage implements Function<Image, Image> {
private final PopulateDefaultLoginCredentialsForImageStrategy credsForImage;
@Inject
public AddDefaultCredentialsToImage(PopulateDefaultLoginCredentialsForImageStrategy credsForImage) {
this.credsForImage = credsForImage;
}
@Override
public Image apply(Image arg0) {
Credentials credentials = credsForImage.execute(arg0);
return credentials != null ? ImageBuilder.fromImage(arg0).defaultCredentials(credentials).build() : arg0;
}
@Override
public String toString() {
return "addDefaultCredentialsToImage()";
}
}
@Provides
@Singleton
protected CreateNodeWithGroupEncodedIntoName defineAddNodeWithTagStrategy(AdaptingComputeServiceStrategies<N, H, I, L> in) {
protected CreateNodeWithGroupEncodedIntoName defineAddNodeWithTagStrategy(
AdaptingComputeServiceStrategies<N, H, I, L> in) {
return in;
}

View File

@ -0,0 +1,72 @@
/**
* 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.compute.config;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Map;
import javax.inject.Singleton;
import org.jclouds.config.ValueOfConfigurationKeyOrNull;
import org.jclouds.domain.Credentials;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.location.Provider;
import com.google.inject.Inject;
/**
* @author Adrian Cole
*/
@Singleton
public class GetLoginForProviderFromPropertiesAndStoreCredentialsOrReturnNull implements
javax.inject.Provider<Credentials> {
private final ValueOfConfigurationKeyOrNull config;
private final String provider;
private final Map<String, Credentials> credentialStore;
@Inject
public GetLoginForProviderFromPropertiesAndStoreCredentialsOrReturnNull(@Provider String provider,
ValueOfConfigurationKeyOrNull config, Map<String, Credentials> credentialStore) {
this.config = checkNotNull(config, "config");
this.provider = checkNotNull(provider, "provider");
this.credentialStore = checkNotNull(credentialStore, "credentialStore");
}
@Override
@Nullable
public Credentials get() {
if (credentialStore.containsKey("image"))
return credentialStore.get("image");
Credentials creds = null;
String loginUser = config.apply(provider + ".login-user");
if (loginUser == null)
loginUser = config.apply("jclouds.login-user");
if (loginUser != null) {
int pos = loginUser.indexOf(':');
if (pos != -1) {
creds = new Credentials(loginUser.substring(0, pos), loginUser.substring(pos + 1));
} else
creds = new Credentials(loginUser, null);
credentialStore.put("image", creds);
}
return creds;
}
}

View File

@ -0,0 +1,53 @@
/**
* 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.compute.functions;
import static org.jclouds.domain.Credentials.NO_CREDENTIALS;
import javax.inject.Singleton;
import org.jclouds.compute.domain.Template;
import org.jclouds.compute.options.TemplateOptions;
import org.jclouds.domain.Credentials;
import com.google.common.base.Function;
/**
*
* @author Adrian Cole
*/
@Singleton
public class DefaultCredentialsFromImageOrOverridingCredentials implements Function<Template, Credentials> {
@Override
public Credentials apply(Template template) {
TemplateOptions options = template.getOptions();
Credentials creds = template.getImage().getDefaultCredentials();
Credentials overridingCredentials = options.getOverridingCredentials();
Credentials overrideCreds = (overridingCredentials != null) ? overridingCredentials : NO_CREDENTIALS;
if (creds == null)
creds = overrideCreds;
if (overrideCreds.identity != null)
creds = creds.toBuilder().identity(overrideCreds.identity).build();
if (overrideCreds.credential != null)
creds = creds.toBuilder().credential(overrideCreds.credential).build();
return creds.equals(NO_CREDENTIALS) ? null : creds;
}
}

View File

@ -18,7 +18,7 @@
*/
package org.jclouds.compute.strategy;
import org.jclouds.compute.strategy.impl.ReturnNullCredentials;
import org.jclouds.compute.strategy.impl.ReturnCredentialsBoundToImage;
import org.jclouds.domain.Credentials;
import com.google.inject.ImplementedBy;
@ -26,7 +26,7 @@ import com.google.inject.ImplementedBy;
/**
* @author Oleksiy Yarmula
*/
@ImplementedBy(ReturnNullCredentials.class)
@ImplementedBy(ReturnCredentialsBoundToImage.class)
public interface PopulateDefaultLoginCredentialsForImageStrategy {
/**

View File

@ -0,0 +1,60 @@
/**
* 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.compute.strategy;
import static com.google.common.base.Preconditions.checkNotNull;
import static org.jclouds.domain.Credentials.NO_CREDENTIALS;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.jclouds.compute.domain.Template;
import org.jclouds.domain.Credentials;
import com.google.common.base.Function;
/**
*
* @author Adrian Cole
*/
@Singleton
public class PrioritizeCredentialsFromTemplate {
private final Function<Template, Credentials> credentialsFromImageOrTemplateOptions;
@Inject
public PrioritizeCredentialsFromTemplate(Function<Template, Credentials> credentialsFromImageOrTemplateOptions) {
this.credentialsFromImageOrTemplateOptions = checkNotNull(credentialsFromImageOrTemplateOptions,
"credentialsFromImageOrTemplateOptions");
}
public Credentials apply(Template template, Credentials fromNode) {
Credentials creds = (fromNode != null) ? fromNode : NO_CREDENTIALS;
Credentials credsFromParameters = credentialsFromImageOrTemplateOptions.apply(template);
if (credsFromParameters != null) {
if (credsFromParameters.identity != null)
creds = creds.toBuilder().identity(credsFromParameters.identity).build();
if (credsFromParameters.credential != null)
creds = creds.toBuilder().credential(credsFromParameters.credential).build();
}
if (creds.equals(NO_CREDENTIALS))
creds = null;
return creds;
}
}

View File

@ -29,6 +29,7 @@ import javax.inject.Named;
import javax.inject.Singleton;
import org.jclouds.compute.ComputeServiceAdapter;
import org.jclouds.compute.ComputeServiceAdapter.NodeAndInitialCredentials;
import org.jclouds.compute.domain.ComputeMetadata;
import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.compute.domain.NodeState;
@ -39,6 +40,7 @@ import org.jclouds.compute.strategy.CreateNodeWithGroupEncodedIntoName;
import org.jclouds.compute.strategy.DestroyNodeStrategy;
import org.jclouds.compute.strategy.GetNodeMetadataStrategy;
import org.jclouds.compute.strategy.ListNodesStrategy;
import org.jclouds.compute.strategy.PrioritizeCredentialsFromTemplate;
import org.jclouds.compute.strategy.RebootNodeStrategy;
import org.jclouds.compute.strategy.ResumeNodeStrategy;
import org.jclouds.compute.strategy.SuspendNodeStrategy;
@ -54,20 +56,25 @@ import com.google.common.collect.Iterables;
*
*/
@Singleton
public class AdaptingComputeServiceStrategies<N, H, I, L> implements CreateNodeWithGroupEncodedIntoName, DestroyNodeStrategy,
GetNodeMetadataStrategy, ListNodesStrategy, RebootNodeStrategy, ResumeNodeStrategy, SuspendNodeStrategy {
public class AdaptingComputeServiceStrategies<N, H, I, L> implements CreateNodeWithGroupEncodedIntoName,
DestroyNodeStrategy, GetNodeMetadataStrategy, ListNodesStrategy, RebootNodeStrategy, ResumeNodeStrategy,
SuspendNodeStrategy {
@Resource
@Named(ComputeServiceConstants.COMPUTE_LOGGER)
protected Logger logger = Logger.NULL;
private final Map<String, Credentials> credentialStore;
private final PrioritizeCredentialsFromTemplate prioritizeCredentialsFromTemplate;
private final ComputeServiceAdapter<N, H, I, L> client;
private final Function<N, NodeMetadata> nodeMetadataAdapter;
@Inject
public AdaptingComputeServiceStrategies(Map<String, Credentials> credentialStore,
ComputeServiceAdapter<N, H, I, L> client, Function<N, NodeMetadata> nodeMetadataAdapter) {
PrioritizeCredentialsFromTemplate prioritizeCredentialsFromTemplate, ComputeServiceAdapter<N, H, I, L> client,
Function<N, NodeMetadata> nodeMetadataAdapter) {
this.credentialStore = checkNotNull(credentialStore, "credentialStore");
this.prioritizeCredentialsFromTemplate = checkNotNull(prioritizeCredentialsFromTemplate,
"prioritizeCredentialsFromTemplate");
this.client = checkNotNull(client, "client");
this.nodeMetadataAdapter = checkNotNull(nodeMetadataAdapter, "nodeMetadataAdapter");
}
@ -133,8 +140,12 @@ public class AdaptingComputeServiceStrategies<N, H, I, L> implements CreateNodeW
checkState(name != null && name.indexOf(group) != -1, "name should have %s encoded into it", group);
checkState(template != null, "template must be specified");
N from = client.createNodeWithGroupEncodedIntoNameThenStoreCredentials(group, name, template, credentialStore);
NodeMetadata node = nodeMetadataAdapter.apply(from);
NodeAndInitialCredentials<N> from = client.createNodeWithGroupEncodedIntoName(group, name, template);
Credentials fromNode = from.getCredentials();
Credentials creds = prioritizeCredentialsFromTemplate.apply(template, fromNode);
if (creds != null)
credentialStore.put("node#" + from.getNodeId(), creds);
NodeMetadata node = nodeMetadataAdapter.apply(from.getNode());
return node;
}

View File

@ -18,19 +18,29 @@
*/
package org.jclouds.compute.strategy.impl;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;
import org.jclouds.compute.strategy.PopulateDefaultLoginCredentialsForImageStrategy;
import org.jclouds.domain.Credentials;
import org.jclouds.javax.annotation.Nullable;
/**
* @author Adrian Cole
*/
@Singleton
public class ReturnNullCredentials implements PopulateDefaultLoginCredentialsForImageStrategy {
public class ReturnCredentialsBoundToImage implements PopulateDefaultLoginCredentialsForImageStrategy {
protected final Credentials creds;
@Inject
public ReturnCredentialsBoundToImage(@Nullable @Named("image") Credentials creds) {
this.creds = creds;
}
@Override
public Credentials execute(Object resourceToAuthenticate) {
return null;
return creds;
}
}

View File

@ -19,8 +19,8 @@
package org.jclouds.compute.stub.config;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.ConcurrentMap;
import javax.inject.Inject;
@ -46,8 +46,8 @@ import org.jclouds.rest.ResourceNotFoundException;
import com.google.common.base.Supplier;
import com.google.common.base.Throwables;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableList.Builder;
import com.google.common.collect.ImmutableSet;
/**
*
@ -67,10 +67,10 @@ public class StubComputeServiceAdapter implements JCloudsNativeComputeServiceAda
@Inject
public StubComputeServiceAdapter(ConcurrentMap<String, NodeMetadata> nodes, Supplier<Location> location,
@Named("NODE_ID") Provider<Integer> idProvider, @Named("PUBLIC_IP_PREFIX") String publicIpPrefix,
@Named("PRIVATE_IP_PREFIX") String privateIpPrefix, @Named("PASSWORD_PREFIX") String passwordPrefix,
JustProvider locationSupplier, Map<OsFamily, Map<String, String>> osToVersionMap,
Map<String, Credentials> credentialStore) {
@Named("NODE_ID") Provider<Integer> idProvider, @Named("PUBLIC_IP_PREFIX") String publicIpPrefix,
@Named("PRIVATE_IP_PREFIX") String privateIpPrefix, @Named("PASSWORD_PREFIX") String passwordPrefix,
JustProvider locationSupplier, Map<OsFamily, Map<String, String>> osToVersionMap,
Map<String, Credentials> credentialStore) {
this.nodes = nodes;
this.location = location;
this.idProvider = idProvider;
@ -83,8 +83,7 @@ public class StubComputeServiceAdapter implements JCloudsNativeComputeServiceAda
}
@Override
public NodeMetadata createNodeWithGroupEncodedIntoNameThenStoreCredentials(String group, String name, Template template,
Map<String, Credentials> credentialStore) {
public NodeWithInitialCredentials createNodeWithGroupEncodedIntoName(String group, String name, Template template) {
NodeMetadataBuilder builder = new NodeMetadataBuilder();
String id = idProvider.get() + "";
builder.ids(id);
@ -100,41 +99,35 @@ public class StubComputeServiceAdapter implements JCloudsNativeComputeServiceAda
builder.state(NodeState.PENDING);
builder.publicAddresses(ImmutableSet.<String> of(publicIpPrefix + id));
builder.privateAddresses(ImmutableSet.<String> of(privateIpPrefix + id));
Credentials creds = template.getOptions().getOverridingCredentials();
if (creds == null)
creds = new Credentials(null, null);
if (creds.identity == null)
creds = creds.toBuilder().identity("root").build();
if (creds.credential == null)
creds = creds.toBuilder().credential(passwordPrefix + id).build();
builder.credentials(creds);
builder.credentials(new Credentials(null, passwordPrefix + id));
NodeMetadata node = builder.build();
credentialStore.put("node#" + node.getId(), node.getCredentials());
nodes.put(node.getId(), node);
StubComputeServiceDependenciesModule.setState(node, NodeState.RUNNING, 100);
return node;
return new NodeWithInitialCredentials(node);
}
@Override
public Iterable<Hardware> listHardwareProfiles() {
return ImmutableSet.<Hardware> of(StubComputeServiceDependenciesModule.stub("small", 1, 1740, 160),
StubComputeServiceDependenciesModule.stub("medium", 4, 7680, 850), StubComputeServiceDependenciesModule
.stub("large", 8, 15360, 1690));
StubComputeServiceDependenciesModule.stub("medium", 4, 7680, 850),
StubComputeServiceDependenciesModule.stub("large", 8, 15360, 1690));
}
@Override
public Iterable<Image> listImages() {
Credentials defaultCredentials = new Credentials("root", null);
// initializing as a List, as ImmutableSet does not allow you to put duplicates
Builder<Image> images = ImmutableList.<Image>builder();
// initializing as a List, as ImmutableSet does not allow you to put
// duplicates
Builder<Image> images = ImmutableList.<Image> builder();
int id = 1;
for (boolean is64Bit : new boolean[] { true, false })
for (Entry<OsFamily, Map<String, String>> osVersions : this.osToVersionMap.entrySet()) {
for (String version : ImmutableSet.copyOf(osVersions.getValue().values())) {
String desc = String.format("stub %s %s", osVersions.getKey(), is64Bit);
images.add(new ImageBuilder().ids(id++ + "").name(osVersions.getKey().name()).location(location.get())
.operatingSystem(new OperatingSystem(osVersions.getKey(), desc, version, null, desc, is64Bit))
.description(desc).defaultCredentials(defaultCredentials).build());
.operatingSystem(new OperatingSystem(osVersions.getKey(), desc, version, null, desc, is64Bit))
.description(desc).defaultCredentials(defaultCredentials).build());
}
}
return images.build();
@ -154,8 +147,8 @@ public class StubComputeServiceAdapter implements JCloudsNativeComputeServiceAda
@Override
public NodeMetadata getNode(String id) {
NodeMetadata node = nodes.get(id);
return node == null ? null : NodeMetadataBuilder.fromNodeMetadata(node).credentials(
credentialStore.get("node#" + node.getId())).build();
return node == null ? null : NodeMetadataBuilder.fromNodeMetadata(node)
.credentials(credentialStore.get("node#" + node.getId())).build();
}
@Override

View File

@ -37,6 +37,7 @@ import org.jclouds.compute.domain.OsFamilyVersion64Bit;
import org.jclouds.compute.domain.Template;
import org.jclouds.compute.domain.TemplateBuilder;
import org.jclouds.compute.reference.ComputeServiceConstants;
import org.jclouds.domain.Credentials;
import org.jclouds.domain.Location;
import org.jclouds.domain.LocationScope;
import org.jclouds.json.Json;
@ -89,20 +90,20 @@ public abstract class BaseTemplateBuilderLiveTest extends BaseVersionedServiceLi
public void testFromTemplate() {
Template defaultTemplate = context.getComputeService().templateBuilder().build();
assertEquals(context.getComputeService().templateBuilder().fromTemplate(defaultTemplate).build().toString(),
defaultTemplate.toString());
defaultTemplate.toString());
}
@BeforeClass
public void setupClient() throws InterruptedException, ExecutionException, TimeoutException, IOException {
setupCredentials();
context = new ComputeServiceContextFactory(setupRestProperties()).createContext(provider, ImmutableSet
.<Module> of(new Log4JLoggingModule()), setupProperties());
context = new ComputeServiceContextFactory(setupRestProperties()).createContext(provider,
ImmutableSet.<Module> of(new Log4JLoggingModule()), setupProperties());
}
@DataProvider(name = "osSupported")
public Object[][] osSupported() {
return convertToArray(Sets.filter(provideAllOperatingSystems(), Predicates
.not(defineUnsupportedOperatingSystems())));
return convertToArray(Sets.filter(provideAllOperatingSystems(),
Predicates.not(defineUnsupportedOperatingSystems())));
}
protected Object[][] convertToArray(Set<OsFamilyVersion64Bit> supportedOperatingSystems) {
@ -125,7 +126,7 @@ public abstract class BaseTemplateBuilderLiveTest extends BaseVersionedServiceLi
protected Set<OsFamilyVersion64Bit> provideAllOperatingSystems() {
Map<OsFamily, Map<String, String>> map = new BaseComputeServiceContextModule() {
}.provideOsVersionMap(new ComputeServiceConstants.ReferenceData(), Guice.createInjector(new GsonModule())
.getInstance(Json.class));
.getInstance(Json.class));
Set<OsFamilyVersion64Bit> supportedOperatingSystems = Sets.newHashSet();
for (Entry<OsFamily, Map<String, String>> osVersions : map.entrySet()) {
@ -139,8 +140,8 @@ public abstract class BaseTemplateBuilderLiveTest extends BaseVersionedServiceLi
@Test(dataProvider = "osSupported")
public void testTemplateBuilderCanFind(OsFamilyVersion64Bit matrix) throws InterruptedException {
TemplateBuilder builder = context.getComputeService().templateBuilder().osFamily(matrix.family).os64Bit(
matrix.is64Bit);
TemplateBuilder builder = context.getComputeService().templateBuilder().osFamily(matrix.family)
.os64Bit(matrix.is64Bit);
if (!matrix.version.equals(""))
builder.osVersionMatches("^" + matrix.version + "$");
Template template = builder.build();
@ -152,8 +153,8 @@ public abstract class BaseTemplateBuilderLiveTest extends BaseVersionedServiceLi
@Test(dataProvider = "osNotSupported", expectedExceptions = NoSuchElementException.class)
public void testTemplateBuilderCannotFind(OsFamilyVersion64Bit matrix) throws InterruptedException {
TemplateBuilder builder = context.getComputeService().templateBuilder().osFamily(matrix.family).os64Bit(
matrix.is64Bit);
TemplateBuilder builder = context.getComputeService().templateBuilder().osFamily(matrix.family)
.os64Bit(matrix.is64Bit);
if (!matrix.version.equals(""))
builder.osVersionMatches("^" + matrix.version + "$");
builder.build();
@ -164,7 +165,7 @@ public abstract class BaseTemplateBuilderLiveTest extends BaseVersionedServiceLi
Template defaultTemplate = context.getComputeService().templateBuilder().build();
Template template = context.getComputeService().templateBuilder().imageId(defaultTemplate.getImage().getId())
.locationId(defaultTemplate.getLocation().getId()).build();
.locationId(defaultTemplate.getLocation().getId()).build();
assertEquals(template.getImage(), defaultTemplate.getImage());
}
@ -172,7 +173,7 @@ public abstract class BaseTemplateBuilderLiveTest extends BaseVersionedServiceLi
public void testDefaultTemplateBuilder() throws IOException {
Template defaultTemplate = context.getComputeService().templateBuilder().build();
assert defaultTemplate.getImage().getOperatingSystem().getVersion().matches("1[012].[10][04]") : defaultTemplate
.getImage().getOperatingSystem().getVersion();
.getImage().getOperatingSystem().getVersion();
assertEquals(defaultTemplate.getImage().getOperatingSystem().is64Bit(), true);
assertEquals(defaultTemplate.getImage().getOperatingSystem().getFamily(), OsFamily.UBUNTU);
assertEquals(getCores(defaultTemplate.getHardware()), 1.0d);
@ -189,38 +190,38 @@ public abstract class BaseTemplateBuilderLiveTest extends BaseVersionedServiceLi
assert location != location.getParent() : location;
assert location.getScope() != null : location;
switch (location.getScope()) {
case PROVIDER:
assertProvider(location);
break;
case REGION:
assertProvider(location.getParent());
assert location.getIso3166Codes().size() == 0
|| location.getParent().getIso3166Codes().containsAll(location.getIso3166Codes()) : location
+ " ||" + location.getParent();
break;
case ZONE:
Location provider = location.getParent().getParent();
// zone can be a direct descendant of provider
if (provider == null)
provider = location.getParent();
assertProvider(provider);
assert location.getIso3166Codes().size() == 0
|| location.getParent().getIso3166Codes().containsAll(location.getIso3166Codes()) : location
+ " ||" + location.getParent();
break;
case HOST:
Location provider2 = location.getParent().getParent().getParent();
// zone can be a direct descendant of provider
if (provider2 == null)
provider2 = location.getParent().getParent();
assertProvider(provider2);
break;
case PROVIDER:
assertProvider(location);
break;
case REGION:
assertProvider(location.getParent());
assert location.getIso3166Codes().size() == 0
|| location.getParent().getIso3166Codes().containsAll(location.getIso3166Codes()) : location + " ||"
+ location.getParent();
break;
case ZONE:
Location provider = location.getParent().getParent();
// zone can be a direct descendant of provider
if (provider == null)
provider = location.getParent();
assertProvider(provider);
assert location.getIso3166Codes().size() == 0
|| location.getParent().getIso3166Codes().containsAll(location.getIso3166Codes()) : location + " ||"
+ location.getParent();
break;
case HOST:
Location provider2 = location.getParent().getParent().getParent();
// zone can be a direct descendant of provider
if (provider2 == null)
provider2 = location.getParent().getParent();
assertProvider(provider2);
break;
}
}
}
@Test
public void testTemplateBuilderWithImageIdsSpecified() throws IOException {
public void testTemplateBuilderWithImageIdSpecified() throws IOException {
Template defaultTemplate = context.getComputeService().templateBuilder().build();
ComputeServiceContext context = null;
@ -252,6 +253,40 @@ public abstract class BaseTemplateBuilderLiveTest extends BaseVersionedServiceLi
}
}
@Test
public void testTemplateBuilderWithLoginUserSpecified() throws IOException {
ComputeServiceContext context = null;
try {
Properties overrides = setupProperties();
overrides.setProperty("jclouds.login-user", "foo:bar");
context = new ComputeServiceContextFactory().createContext(provider,
ImmutableSet.<Module> of(new Log4JLoggingModule()), overrides);
assertEquals(context.getComputeService().templateBuilder().build().getImage().getDefaultCredentials(),
new Credentials("foo", "bar"));
} finally {
if (context != null)
context.close();
}
context = null;
try {
Properties overrides = setupProperties();
overrides.setProperty(provider + ".login-user", "foo:bar");
context = new ComputeServiceContextFactory().createContext(provider,
ImmutableSet.<Module> of(new Log4JLoggingModule()), overrides);
assertEquals(context.getComputeService().templateBuilder().build().getImage().getDefaultCredentials(),
new Credentials("foo", "bar"));
} finally {
if (context != null)
context.close();
}
}
void assertProvider(Location provider) {
assertEquals(provider.getScope(), LocationScope.PROVIDER);
assertEquals(provider.getParent(), null);

View File

@ -18,15 +18,16 @@
*/
package org.jclouds.compute;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Strings.emptyToNull;
import java.util.Properties;
import java.util.logging.Logger;
import org.jclouds.Constants;
import org.jclouds.rest.RestContextFactory;
import org.testng.annotations.BeforeClass;
import java.util.Properties;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Strings.emptyToNull;
/**
*
* @author Jason King
@ -39,15 +40,18 @@ public abstract class BaseVersionedServiceLiveTest {
protected String endpoint;
protected String apiversion;
protected String imageId;
protected String loginUser;
protected Properties setupRestProperties() {
return RestContextFactory.getPropertiesFromResource("/rest.properties");
}
protected Properties setupProperties() {
if (emptyToNull(provider) == null) throw new NullPointerException("provider must not be null or empty:"+provider);
if (emptyToNull(identity) == null) throw new NullPointerException("identity must not be null or empty:"+provider);
if (emptyToNull(provider) == null)
throw new NullPointerException("provider must not be null or empty:" + provider);
if (emptyToNull(identity) == null)
throw new NullPointerException("identity must not be null or empty:" + provider);
Properties overrides = new Properties();
overrides.setProperty(Constants.PROPERTY_TRUST_ALL_CERTS, "true");
@ -63,6 +67,8 @@ public abstract class BaseVersionedServiceLiveTest {
overrides.setProperty(provider + ".apiversion", apiversion);
if (imageId != null)
overrides.setProperty(provider + ".image-id", imageId);
if (loginUser != null)
overrides.setProperty(provider + ".login-user", loginUser);
return overrides;
}
@ -74,7 +80,7 @@ public abstract class BaseVersionedServiceLiveTest {
endpoint = System.getProperty("test." + provider + ".endpoint");
apiversion = System.getProperty("test." + provider + ".apiversion");
imageId = System.getProperty("test." + provider + ".image-id");
loginUser = System.getProperty("test." + provider + ".login-user");
}
}

View File

@ -0,0 +1,179 @@
/**
* 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.compute.config;
import static org.easymock.EasyMock.expect;
import static org.easymock.classextension.EasyMock.createMock;
import static org.easymock.classextension.EasyMock.replay;
import static org.easymock.classextension.EasyMock.verify;
import static org.testng.Assert.assertEquals;
import java.util.Map;
import org.jclouds.config.ValueOfConfigurationKeyOrNull;
import org.jclouds.domain.Credentials;
import org.testng.annotations.Test;
/**
*
* @author Adrian Cole
*/
@Test(groups = "unit", testName = "GetLoginForProviderFromPropertiesAndStoreCredentialsOrReturnNullTest")
public class GetLoginForProviderFromPropertiesAndStoreCredentialsOrReturnNullTest {
public void testWhenCredentialsNotPresentReturnsNull() {
@SuppressWarnings("unchecked")
Map<String, Credentials> credstore = createMock(Map.class);
Credentials expected = null;
ValueOfConfigurationKeyOrNull config = createMock(ValueOfConfigurationKeyOrNull.class);
expect(credstore.containsKey("image")).andReturn(false);
expect(config.apply("provider.login-user")).andReturn(null);
expect(config.apply("jclouds.login-user")).andReturn(null);
replay(config);
replay(credstore);
GetLoginForProviderFromPropertiesAndStoreCredentialsOrReturnNull fn = new GetLoginForProviderFromPropertiesAndStoreCredentialsOrReturnNull(
"provider", config, credstore);
assertEquals(fn.get(), expected);
verify(config);
verify(credstore);
}
public void testWhenCredentialsNotPresentAndProviderPropertyHasUser() {
@SuppressWarnings("unchecked")
Map<String, Credentials> credstore = createMock(Map.class);
Credentials expected = new Credentials("ubuntu", null);
ValueOfConfigurationKeyOrNull config = createMock(ValueOfConfigurationKeyOrNull.class);
expect(credstore.containsKey("image")).andReturn(false);
expect(config.apply("provider.login-user")).andReturn("ubuntu");
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 testWhenCredentialsNotPresentAndJcloudsPropertyHasUser() {
@SuppressWarnings("unchecked")
Map<String, Credentials> credstore = createMock(Map.class);
Credentials expected = new Credentials("ubuntu", null);
ValueOfConfigurationKeyOrNull config = createMock(ValueOfConfigurationKeyOrNull.class);
expect(credstore.containsKey("image")).andReturn(false);
expect(config.apply("provider.login-user")).andReturn(null);
expect(config.apply("jclouds.login-user")).andReturn("ubuntu");
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 testWhenCredentialsAlreadyPresentReturnsSame() {
@SuppressWarnings("unchecked")
Map<String, Credentials> credstore = createMock(Map.class);
Credentials expected = new Credentials("root", null);
ValueOfConfigurationKeyOrNull config = createMock(ValueOfConfigurationKeyOrNull.class);
expect(credstore.containsKey("image")).andReturn(true);
expect(credstore.get("image")).andReturn(expected);
replay(config);
replay(credstore);
GetLoginForProviderFromPropertiesAndStoreCredentialsOrReturnNull fn = new GetLoginForProviderFromPropertiesAndStoreCredentialsOrReturnNull(
"provider", config, credstore);
assertEquals(fn.get(), expected);
verify(config);
verify(credstore);
}
public void testWhenCredentialsNotPresentAndProviderPropertyHasUserAndPassword() {
@SuppressWarnings("unchecked")
Map<String, Credentials> credstore = createMock(Map.class);
Credentials expected = new Credentials("ubuntu", "password");
ValueOfConfigurationKeyOrNull config = createMock(ValueOfConfigurationKeyOrNull.class);
expect(credstore.containsKey("image")).andReturn(false);
expect(config.apply("provider.login-user")).andReturn("ubuntu:password");
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 testWhenCredentialsNotPresentAndJcloudsPropertyHasUserAndPassword() {
@SuppressWarnings("unchecked")
Map<String, Credentials> credstore = createMock(Map.class);
Credentials expected = new Credentials("ubuntu", "password");
ValueOfConfigurationKeyOrNull config = createMock(ValueOfConfigurationKeyOrNull.class);
expect(credstore.containsKey("image")).andReturn(false);
expect(config.apply("provider.login-user")).andReturn(null);
expect(config.apply("jclouds.login-user")).andReturn("ubuntu:password");
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);
}
}

View File

@ -0,0 +1,140 @@
/**
* 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.compute.functions;
import static org.easymock.EasyMock.expect;
import static org.easymock.classextension.EasyMock.createMock;
import static org.easymock.classextension.EasyMock.replay;
import static org.easymock.classextension.EasyMock.verify;
import static org.testng.Assert.assertEquals;
import org.jclouds.compute.domain.Image;
import org.jclouds.compute.domain.Template;
import org.jclouds.compute.options.TemplateOptions;
import org.jclouds.domain.Credentials;
import org.testng.annotations.Test;
/**
*
* @author Adrian Cole
*/
@Test(groups = "unit", testName = "DefaultCredentialsFromImageOrOverridingCredentialsTest")
public class DefaultCredentialsFromImageOrOverridingCredentialsTest {
private static final DefaultCredentialsFromImageOrOverridingCredentials fn = new DefaultCredentialsFromImageOrOverridingCredentials();
public void testWhenCredentialsNotPresentInImageOrTemplateOptionsReturnNull() {
Credentials expected = null;
Image image = createMock(Image.class);
Template template = createMock(Template.class);
expect(template.getImage()).andReturn(image);
expect(image.getDefaultCredentials()).andReturn(null);
expect(template.getOptions()).andReturn(new TemplateOptions());
replay(template);
replay(image);
assertEquals(fn.apply(template), expected);
verify(template);
verify(image);
}
public void testWhenCredentialsNotPresentInImageReturnsOneInTemplateOptions() {
Credentials expected = new Credentials("ubuntu", "password");
Image image = createMock(Image.class);
Template template = createMock(Template.class);
expect(template.getImage()).andReturn(image);
expect(image.getDefaultCredentials()).andReturn(null);
expect(template.getOptions()).andReturn(TemplateOptions.Builder.overrideCredentialsWith(expected));
replay(template);
replay(image);
assertEquals(fn.apply(template), expected);
verify(template);
verify(image);
}
public void testWhenCredentialsNotPresentInTemplateOptionsReturnsOneInImage() {
Credentials expected = new Credentials("ubuntu", "password");
Image image = createMock(Image.class);
Template template = createMock(Template.class);
expect(template.getImage()).andReturn(image);
expect(image.getDefaultCredentials()).andReturn(expected);
expect(template.getOptions()).andReturn(new TemplateOptions());
replay(template);
replay(image);
assertEquals(fn.apply(template), expected);
verify(template);
verify(image);
}
public void testWhenCredentialsPresentInImageOverridesIdentityFromCredentialsInTemplateOptions() {
Credentials expected = new Credentials("ubuntu", "password");
Image image = createMock(Image.class);
Template template = createMock(Template.class);
expect(template.getImage()).andReturn(image);
expect(image.getDefaultCredentials()).andReturn(new Credentials("user", "password"));
expect(template.getOptions()).andReturn(TemplateOptions.Builder.overrideLoginUserWith("ubuntu"));
replay(template);
replay(image);
assertEquals(fn.apply(template), expected);
verify(template);
verify(image);
}
public void testWhenCredentialsPresentInImageOverridesCredentialFromCredentialsInTemplateOptions() {
Credentials expected = new Credentials("ubuntu", "password");
Image image = createMock(Image.class);
Template template = createMock(Template.class);
expect(template.getImage()).andReturn(image);
expect(image.getDefaultCredentials()).andReturn(new Credentials("ubuntu", "password2"));
expect(template.getOptions()).andReturn(TemplateOptions.Builder.overrideLoginCredentialWith("password"));
replay(template);
replay(image);
assertEquals(fn.apply(template), expected);
verify(template);
verify(image);
}
}

View File

@ -0,0 +1,182 @@
/**
* 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.compute.strategy;
import static org.easymock.EasyMock.expect;
import static org.easymock.classextension.EasyMock.createMock;
import static org.easymock.classextension.EasyMock.replay;
import static org.easymock.classextension.EasyMock.verify;
import static org.testng.Assert.assertEquals;
import org.jclouds.compute.domain.Image;
import org.jclouds.compute.domain.Template;
import org.jclouds.compute.functions.DefaultCredentialsFromImageOrOverridingCredentials;
import org.jclouds.compute.options.TemplateOptions;
import org.jclouds.domain.Credentials;
import org.testng.annotations.Test;
/**
*
* @author Adrian Cole
*/
@Test(groups = "unit", testName = "PrioritizeCredentialsFromTemplateTest")
public class PrioritizeCredentialsFromTemplateTest {
private static final PrioritizeCredentialsFromTemplate fn = new PrioritizeCredentialsFromTemplate(
new DefaultCredentialsFromImageOrOverridingCredentials());
public void testWhenCredentialsNotPresentInImageTemplateOptionsOrParameterReturnNull() {
Credentials expected = null;
Image image = createMock(Image.class);
Template template = createMock(Template.class);
expect(template.getImage()).andReturn(image);
expect(image.getDefaultCredentials()).andReturn(null);
expect(template.getOptions()).andReturn(new TemplateOptions());
replay(template);
replay(image);
assertEquals(fn.apply(template, null), expected);
verify(template);
verify(image);
}
public void testWhenCredentialsNotPresentInImageTemplateOptionsReturnsFromParameter() {
Credentials expected = new Credentials("foo", "bar");
Image image = createMock(Image.class);
Template template = createMock(Template.class);
expect(template.getImage()).andReturn(image);
expect(image.getDefaultCredentials()).andReturn(null);
expect(template.getOptions()).andReturn(new TemplateOptions());
replay(template);
replay(image);
assertEquals(fn.apply(template, expected), expected);
verify(template);
verify(image);
}
public void testWhenCredentialsNotPresentInImageReturnsOneInTemplateOptionsAndNotParameter() {
Credentials expected = new Credentials("ubuntu", "password");
Image image = createMock(Image.class);
Template template = createMock(Template.class);
expect(template.getImage()).andReturn(image);
expect(image.getDefaultCredentials()).andReturn(null);
expect(template.getOptions()).andReturn(TemplateOptions.Builder.overrideCredentialsWith(expected));
replay(template);
replay(image);
assertEquals(fn.apply(template, new Credentials("foo", "bar")), expected);
verify(template);
verify(image);
}
public void testWhenCredentialsNotPresentInImageReturnsCredentialFromTemplateOptionsAndUserFromParameter() {
Credentials expected = new Credentials("ubuntu", "password");
Image image = createMock(Image.class);
Template template = createMock(Template.class);
expect(template.getImage()).andReturn(image);
expect(image.getDefaultCredentials()).andReturn(null);
expect(template.getOptions()).andReturn(TemplateOptions.Builder.overrideLoginUserWith("ubuntu"));
replay(template);
replay(image);
assertEquals(fn.apply(template, new Credentials("foo", "password")), expected);
verify(template);
verify(image);
}
public void testWhenCredentialsNotPresentInTemplateOptionsReturnsOneInImageAndNotParameter() {
Credentials expected = new Credentials("ubuntu", "password");
Image image = createMock(Image.class);
Template template = createMock(Template.class);
expect(template.getImage()).andReturn(image);
expect(image.getDefaultCredentials()).andReturn(expected);
expect(template.getOptions()).andReturn(new TemplateOptions());
replay(template);
replay(image);
assertEquals(fn.apply(template, new Credentials("foo", "bar")), expected);
verify(template);
verify(image);
}
public void testWhenCredentialsPresentInImageOverridesIdentityFromCredentialsInTemplateOptionsAndNotParameter() {
Credentials expected = new Credentials("ubuntu", "password");
Image image = createMock(Image.class);
Template template = createMock(Template.class);
expect(template.getImage()).andReturn(image);
expect(image.getDefaultCredentials()).andReturn(new Credentials("user", "password"));
expect(template.getOptions()).andReturn(TemplateOptions.Builder.overrideLoginUserWith("ubuntu"));
replay(template);
replay(image);
assertEquals(fn.apply(template, new Credentials("foo", "bar")), expected);
verify(template);
verify(image);
}
public void testWhenCredentialsPresentInImageOverridesCredentialFromCredentialsInTemplateOptionsAndNotParameter() {
Credentials expected = new Credentials("ubuntu", "password");
Image image = createMock(Image.class);
Template template = createMock(Template.class);
expect(template.getImage()).andReturn(image);
expect(image.getDefaultCredentials()).andReturn(new Credentials("ubuntu", "password2"));
expect(template.getOptions()).andReturn(TemplateOptions.Builder.overrideLoginCredentialWith("password"));
replay(template);
replay(image);
assertEquals(fn.apply(template, new Credentials("foo", "bar")), expected);
verify(template);
verify(image);
}
}

View File

@ -32,6 +32,7 @@ import com.google.common.collect.Lists;
* @author Adrian Cole
*/
public class Credentials {
public static final Credentials NO_CREDENTIALS = new Credentials(null, null);
public static class Builder<T extends Credentials> {
private String identity;

View File

@ -162,7 +162,7 @@ public class AWSEC2ImageParserTest {
.getInstance(Json.class));
Set<Image> result = DescribeImagesResponseHandlerTest.parseImages(resource);
EC2ImageParser parser = new EC2ImageParser(new EC2PopulateDefaultLoginCredentialsForImageStrategy(), map,
EC2ImageParser parser = new EC2ImageParser(new EC2PopulateDefaultLoginCredentialsForImageStrategy(null), map,
Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet.<Location> of(defaultLocation)), Suppliers
.ofInstance(defaultLocation), new AWSEC2ReviseParsedImage(map));
return Sets.newLinkedHashSet(Iterables.filter(Iterables.transform(result, parser), Predicates.notNull()));

View File

@ -55,12 +55,12 @@ public class CloudSigmaLasVegasTemplateBuilderLiveTest extends BaseTemplateBuild
return (input.version.equals("11.04") && input.is64Bit)
|| (input.version.equals("10.04") && !input.is64Bit) || input.version.equals("");
case SOLARIS:
return false;
return input.version.equals("") && input.is64Bit;
case DEBIAN:
return false;
case CENTOS:
return input.version.equals("") || (input.version.equals("6.0") && !input.is64Bit)
|| (input.version.equals("5.5") && input.is64Bit);
return (input.version.equals("") || input.version.equals("6.0") || input.version.equals("5.7"))
&& input.is64Bit;
case WINDOWS:
return ((input.version.equals("2008 R2") || input.version.equals("2003") || input.version.equals("")) && input.is64Bit);
default:
@ -76,8 +76,9 @@ public class CloudSigmaLasVegasTemplateBuilderLiveTest extends BaseTemplateBuild
Template defaultTemplate = context.getComputeService().templateBuilder().build();
assertEquals(defaultTemplate.getImage().getOperatingSystem().getVersion(), "11.04");
assertEquals(defaultTemplate.getImage().getOperatingSystem().is64Bit(), true);
assertEquals(defaultTemplate.getImage().getId(), "af8bfee4-d249-4d91-b157-b01ee1ce1943");
assertEquals(defaultTemplate.getImage().getId(), "6aab1938-71b3-4252-ac1c-a3cb17c284ab");
assertEquals(defaultTemplate.getImage().getOperatingSystem().getFamily(), OsFamily.UBUNTU);
assertEquals(defaultTemplate.getImage().getDefaultCredentials().identity, "cloudsigma");
assertEquals(getCores(defaultTemplate.getHardware()), 1.0d);
}

View File

@ -80,6 +80,7 @@ public class CloudSigmaZurichTemplateBuilderLiveTest extends BaseTemplateBuilder
assertEquals(defaultTemplate.getImage().getOperatingSystem().is64Bit(), true);
assertEquals(defaultTemplate.getImage().getId(), "7fad4fe1-daf3-4cb8-a847-082aae4d8506");
assertEquals(defaultTemplate.getImage().getOperatingSystem().getFamily(), OsFamily.UBUNTU);
assertEquals(defaultTemplate.getImage().getDefaultCredentials().identity, "cloudsigma");
assertEquals(getCores(defaultTemplate.getHardware()), 1.0d);
}

View File

@ -99,7 +99,7 @@ public class EucalyptusPartnerCloudReviseParsedImageTest {
.getInstance(Json.class));
Set<Image> result = DescribeImagesResponseHandlerTest.parseImages(resource);
EC2ImageParser parser = new EC2ImageParser(new EC2PopulateDefaultLoginCredentialsForImageStrategy(), map,
EC2ImageParser parser = new EC2ImageParser(new EC2PopulateDefaultLoginCredentialsForImageStrategy(null), map,
Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet.<Location> of(defaultLocation)), Suppliers
.ofInstance(defaultLocation), new EucalyptusPartnerCloudReviseParsedImage(map));
return Sets.newLinkedHashSet(Iterables.filter(Iterables.transform(result, parser), Predicates.notNull()));

View File

@ -18,11 +18,15 @@
*/
package org.jclouds.gogrid.config.internal;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;
import org.jclouds.compute.config.ResolvesImages;
import org.jclouds.compute.strategy.PopulateDefaultLoginCredentialsForImageStrategy;
import org.jclouds.compute.strategy.impl.ReturnCredentialsBoundToImage;
import org.jclouds.domain.Credentials;
import org.jclouds.javax.annotation.Nullable;
import com.google.inject.AbstractModule;
@ -34,15 +38,20 @@ public class GoGridResolveImagesModule extends AbstractModule {
@Override
protected void configure() {
bind(PopulateDefaultLoginCredentialsForImageStrategy.class).to(
GoGridPopulateDefaultLoginCredentialsForImageStrategy.class);
GoGridPopulateDefaultLoginCredentialsForImageStrategy.class);
}
@Singleton
public static class GoGridPopulateDefaultLoginCredentialsForImageStrategy implements
PopulateDefaultLoginCredentialsForImageStrategy {
public static class GoGridPopulateDefaultLoginCredentialsForImageStrategy extends ReturnCredentialsBoundToImage {
@Inject
public GoGridPopulateDefaultLoginCredentialsForImageStrategy(@Nullable @Named("image") Credentials creds) {
super(creds);
}
@Override
public Credentials execute(Object resourceToAuthenticate) {
if (creds != null)
return creds;
return new Credentials("root", null);
}
}

View File

@ -23,7 +23,6 @@ import static org.jclouds.savvis.vpdc.options.GetVMOptions.Builder.withPowerStat
import static org.jclouds.savvis.vpdc.reference.VPDCConstants.PROPERTY_VPDC_VDC_EMAIL;
import java.net.URI;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import javax.inject.Named;
@ -34,7 +33,6 @@ import org.jclouds.compute.ComputeServiceAdapter;
import org.jclouds.compute.domain.CIMOperatingSystem;
import org.jclouds.compute.domain.Template;
import org.jclouds.compute.domain.Volume;
import org.jclouds.domain.Credentials;
import org.jclouds.predicates.RetryablePredicate;
import org.jclouds.savvis.vpdc.VPDCClient;
import org.jclouds.savvis.vpdc.domain.Network;
@ -49,15 +47,15 @@ import org.jclouds.savvis.vpdc.reference.VCloudMediaType;
import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import com.google.common.collect.ImmutableSet.Builder;
import com.google.common.collect.Iterables;
import com.google.inject.Inject;
;
/**
* defines the connection between the {@link VPDCClient} implementation and the jclouds
* {@link ComputeService}
* defines the connection between the {@link VPDCClient} implementation and the
* jclouds {@link ComputeService}
*
*/
@Singleton
@ -73,12 +71,11 @@ public class VPDCComputeServiceAdapter implements ComputeServiceAdapter<VM, VMSp
this.client = checkNotNull(client, "client");
// TODO: parameterize
this.taskTester = new RetryablePredicate<String>(checkNotNull(taskSuccess, "taskSuccess"), 650, 10,
TimeUnit.SECONDS);
TimeUnit.SECONDS);
}
@Override
public VM createNodeWithGroupEncodedIntoNameThenStoreCredentials(String tag, String name, Template template,
Map<String, Credentials> credentialStore) {
public NodeAndInitialCredentials<VM> createNodeWithGroupEncodedIntoName(String tag, String name, Template template) {
String networkTierName = template.getLocation().getId();
String vpdcId = template.getLocation().getParent().getId();
String billingSiteId = template.getLocation().getParent().getParent().getId();
@ -104,7 +101,8 @@ public class VPDCComputeServiceAdapter implements ComputeServiceAdapter<VM, VMSp
if (taskTester.apply(task.getId())) {
try {
return this.getNode(task.getResult().getHref().toASCIIString());
VM returnVal = this.getNode(task.getResult().getHref().toASCIIString());
return new NodeAndInitialCredentials<VM>(returnVal, returnVal.getId(), null);
} finally {
// TODO: get the credentials relevant to the billingSiteId/Org
// credentialStore.put(id, new Credentials(orgId, orgUser));
@ -118,7 +116,7 @@ public class VPDCComputeServiceAdapter implements ComputeServiceAdapter<VM, VMSp
public Iterable<VMSpec> listHardwareProfiles() {
// TODO don't depend on OS
return ImmutableSet.of(VMSpec.builder().operatingSystem(Iterables.get(listImages(), 0)).memoryInGig(2)
.addDataDrive("/data01", 25).build());
.addDataDrive("/data01", 25).build());
}
@Override
@ -142,7 +140,7 @@ public class VPDCComputeServiceAdapter implements ComputeServiceAdapter<VM, VMSp
})) {
builder.add(client.getBrowsingClient().getVMInVDC(org.getId(), vdc.getId(), vApp.getId(),
withPowerState()));
withPowerState()));
}
}
}

View File

@ -56,7 +56,7 @@ public class SoftLayerPropertiesBuilder extends PropertiesBuilder {
properties.setProperty(PROPERTY_SOFTLAYER_VIRTUALGUEST_DISK0_TYPE, "LOCAL");
// 10, 100, 1000
properties.setProperty(PROPERTY_SOFTLAYER_VIRTUALGUEST_PORT_SPEED, "10");
properties.setProperty(PROPERTY_ISO3166_CODES, "SG,US-CA,US-TX,US-VA,US-WA,US-TX");
properties.setProperty(PROPERTY_ISO3166_CODES, "SG,NL,US-CA,US-TX,US-VA,US-WA,US-TX");
Builder<String> prices = ImmutableSet.<String> builder();
prices.add("21"); // 1 IP Address
prices.add("55"); // Host Ping: categoryCode: monitoring, notification

View File

@ -18,24 +18,27 @@
*/
package org.jclouds.softlayer.compute.functions;
import com.google.common.base.Function;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.NoSuchElementException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.annotation.Resource;
import javax.inject.Named;
import javax.inject.Singleton;
import org.jclouds.compute.domain.Image;
import org.jclouds.compute.domain.ImageBuilder;
import org.jclouds.compute.domain.OperatingSystem;
import org.jclouds.compute.domain.OsFamily;
import org.jclouds.compute.reference.ComputeServiceConstants;
import org.jclouds.domain.Credentials;
import org.jclouds.logging.Logger;
import org.jclouds.softlayer.domain.ProductItem;
import org.jclouds.softlayer.domain.ProductItemPrice;
import javax.annotation.Resource;
import javax.inject.Named;
import javax.inject.Singleton;
import java.util.NoSuchElementException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static com.google.common.base.Preconditions.checkNotNull;
import com.google.common.base.Function;
/**
* @author Jason King
@ -73,6 +76,7 @@ public class ProductItemToImage implements Function<ProductItem, Image> {
return new ImageBuilder()
.ids(imageId().apply(productItem))
.description(productItem.getDescription())
.defaultCredentials(new Credentials("root", null))
.operatingSystem(os)
.build();
}

View File

@ -33,7 +33,6 @@ import static org.jclouds.softlayer.reference.SoftLayerConstants.PROPERTY_SOFTLA
import static org.jclouds.softlayer.reference.SoftLayerConstants.PROPERTY_SOFTLAYER_VIRTUALGUEST_LOGIN_DETAILS_DELAY;
import static org.jclouds.softlayer.reference.SoftLayerConstants.PROPERTY_SOFTLAYER_VIRTUALGUEST_PORT_SPEED;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;
@ -65,17 +64,17 @@ import com.google.common.base.Predicate;
import com.google.common.base.Splitter;
import com.google.common.base.Supplier;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import com.google.common.collect.ImmutableSet.Builder;
import com.google.common.collect.Iterables;
/**
* defines the connection between the {@link SoftLayerClient} implementation and the jclouds
* {@link ComputeService}
* defines the connection between the {@link SoftLayerClient} implementation and
* the jclouds {@link ComputeService}
*
*/
@Singleton
public class SoftLayerComputeServiceAdapter implements
ComputeServiceAdapter<VirtualGuest, Iterable<ProductItem>, ProductItem, Datacenter> {
ComputeServiceAdapter<VirtualGuest, Iterable<ProductItem>, ProductItem, Datacenter> {
@Resource
@Named(ComputeServiceConstants.COMPUTE_LOGGER)
@ -92,18 +91,18 @@ public class SoftLayerComputeServiceAdapter implements
@Inject
public SoftLayerComputeServiceAdapter(SoftLayerClient client,
VirtualGuestHasLoginDetailsPresent virtualGuestHasLoginDetailsPresent,
@Memoized Supplier<ProductPackage> productPackageSupplier, Iterable<ProductItemPrice> prices,
@Named(PROPERTY_SOFTLAYER_VIRTUALGUEST_CPU_REGEX) String cpuRegex,
@Named(PROPERTY_SOFTLAYER_VIRTUALGUEST_DISK0_TYPE) String disk0Type,
@Named(PROPERTY_SOFTLAYER_VIRTUALGUEST_PORT_SPEED) float portSpeed,
@Named(PROPERTY_SOFTLAYER_VIRTUALGUEST_LOGIN_DETAILS_DELAY) long guestLoginDelay) {
VirtualGuestHasLoginDetailsPresent virtualGuestHasLoginDetailsPresent,
@Memoized Supplier<ProductPackage> productPackageSupplier, Iterable<ProductItemPrice> prices,
@Named(PROPERTY_SOFTLAYER_VIRTUALGUEST_CPU_REGEX) String cpuRegex,
@Named(PROPERTY_SOFTLAYER_VIRTUALGUEST_DISK0_TYPE) String disk0Type,
@Named(PROPERTY_SOFTLAYER_VIRTUALGUEST_PORT_SPEED) float portSpeed,
@Named(PROPERTY_SOFTLAYER_VIRTUALGUEST_LOGIN_DETAILS_DELAY) long guestLoginDelay) {
this.client = checkNotNull(client, "client");
this.guestLoginDelay = guestLoginDelay;
this.productPackageSupplier = checkNotNull(productPackageSupplier, "productPackageSupplier");
checkArgument(guestLoginDelay > 500, "guestOrderDelay must be in milliseconds and greater than 500");
this.loginDetailsTester = new RetryablePredicate<VirtualGuest>(virtualGuestHasLoginDetailsPresent,
guestLoginDelay);
guestLoginDelay);
this.cpuPattern = Pattern.compile(checkNotNull(cpuRegex, "cpuRegex"));
this.prices = checkNotNull(prices, "prices");
this.portSpeed = portSpeed;
@ -112,21 +111,21 @@ public class SoftLayerComputeServiceAdapter implements
}
@Override
public VirtualGuest createNodeWithGroupEncodedIntoNameThenStoreCredentials(String group, String name,
Template template, Map<String, Credentials> credentialStore) {
public NodeAndInitialCredentials<VirtualGuest> createNodeWithGroupEncodedIntoName(String group, String name,
Template template) {
checkNotNull(template, "template was null");
checkNotNull(template.getOptions(), "template options was null");
checkArgument(template.getOptions().getClass().isAssignableFrom(SoftLayerTemplateOptions.class),
"options class %s should have been assignable from SoftLayerTemplateOptions", template.getOptions()
.getClass());
"options class %s should have been assignable from SoftLayerTemplateOptions", template.getOptions()
.getClass());
String domainName = template.getOptions().as(SoftLayerTemplateOptions.class).getDomainName();
VirtualGuest newGuest = VirtualGuest.builder().domain(domainName).hostname(name).build();
ProductOrder order = ProductOrder.builder().packageId(productPackageSupplier.get().getId()).location(
template.getLocation().getId()).quantity(1).useHourlyPricing(true).prices(getPrices(template))
.virtualGuest(newGuest).build();
ProductOrder order = ProductOrder.builder().packageId(productPackageSupplier.get().getId())
.location(template.getLocation().getId()).quantity(1).useHourlyPricing(true).prices(getPrices(template))
.virtualGuest(newGuest).build();
logger.debug(">> ordering new virtualGuest domain(%s) hostname(%s)", domainName, name);
ProductOrderReceipt productOrderReceipt = client.getVirtualGuestClient().orderVirtualGuest(order);
@ -137,14 +136,13 @@ public class SoftLayerComputeServiceAdapter implements
boolean orderInSystem = loginDetailsTester.apply(result);
logger.trace("<< virtualGuest(%s) complete(%s)", result.getId(), orderInSystem);
checkState(orderInSystem, "order for guest %s doesn't have login details within %sms", result, Long
.toString(guestLoginDelay));
checkState(orderInSystem, "order for guest %s doesn't have login details within %sms", result,
Long.toString(guestLoginDelay));
result = client.getVirtualGuestClient().getVirtualGuest(result.getId());
Password pw = get(result.getOperatingSystem().getPasswords(), 0);
Credentials credentials = new Credentials(pw.getUsername(), pw.getPassword());
credentialStore.put("node#" + result.getId(), credentials);
return result;
return new NodeAndInitialCredentials<VirtualGuest>(result, result.getId() + "", new Credentials(pw.getUsername(),
pw.getPassword()));
}
private Iterable<ProductItemPrice> getPrices(Template template) {
@ -158,8 +156,8 @@ public class SoftLayerComputeServiceAdapter implements
int id = Integer.parseInt(hardwareId);
result.add(ProductItemPrice.builder().id(id).build());
}
ProductItem uplinkItem = find(productPackageSupplier.get().getItems(), and(capacity(portSpeed),
categoryCode("port_speed")));
ProductItem uplinkItem = find(productPackageSupplier.get().getItems(),
and(capacity(portSpeed), categoryCode("port_speed")));
result.add(get(uplinkItem.getPrices(), 0));
result.addAll(prices);
return result.build();
@ -187,7 +185,7 @@ public class SoftLayerComputeServiceAdapter implements
@Override
public Iterable<VirtualGuest> listNodes() {
return Iterables.filter(client.getVirtualGuestClient().listVirtualGuests(), new Predicate<VirtualGuest>(){
return Iterables.filter(client.getVirtualGuestClient().listVirtualGuests(), new Predicate<VirtualGuest>() {
@Override
public boolean apply(VirtualGuest arg0) {
@ -197,7 +195,7 @@ public class SoftLayerComputeServiceAdapter implements
logger.trace("guest invalid, as it has no billing item %s", arg0);
return false;
}
});
}
@ -220,7 +218,7 @@ public class SoftLayerComputeServiceAdapter implements
if (guest.getBillingItemId() == -1)
throw new IllegalStateException(String.format("no billing item for guest(%s) so we cannot cancel the order",
id));
id));
logger.debug(">> canceling service for guest(%s) billingItem(%s)", id, guest.getBillingItemId());
client.getVirtualGuestClient().cancelService(guest.getBillingItemId());
@ -257,7 +255,7 @@ public class SoftLayerComputeServiceAdapter implements
boolean hasBackendIp = newGuest.getPrimaryBackendIpAddress() != null;
boolean hasPrimaryIp = newGuest.getPrimaryIpAddress() != null;
boolean hasPasswords = newGuest.getOperatingSystem() != null
&& newGuest.getOperatingSystem().getPasswords().size() > 0;
&& newGuest.getOperatingSystem().getPasswords().size() > 0;
return hasBackendIp && hasPrimaryIp && hasPasswords;
}

View File

@ -21,11 +21,13 @@ package org.jclouds.softlayer.compute;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import java.util.Map;
import java.util.Random;
import org.jclouds.compute.ComputeServiceAdapter.NodeAndInitialCredentials;
import org.jclouds.compute.domain.ExecResponse;
import org.jclouds.compute.domain.Template;
import org.jclouds.compute.functions.DefaultCredentialsFromImageOrOverridingCredentials;
import org.jclouds.compute.strategy.PrioritizeCredentialsFromTemplate;
import org.jclouds.domain.Credentials;
import org.jclouds.logging.log4j.config.Log4JLoggingModule;
import org.jclouds.net.IPSocket;
@ -40,7 +42,6 @@ import org.testng.annotations.BeforeGroups;
import org.testng.annotations.Test;
import com.google.common.collect.Iterables;
import com.google.common.collect.Maps;
import com.google.common.net.InetAddresses;
import com.google.inject.Guice;
@ -48,13 +49,13 @@ import com.google.inject.Guice;
public class SoftLayerComputeServiceAdapterLiveTest extends BaseSoftLayerClientLiveTest {
private SoftLayerComputeServiceAdapter adapter;
private VirtualGuest guest;
private NodeAndInitialCredentials<VirtualGuest> guest;
@BeforeGroups(groups = { "live" })
public void setupClient() {
super.setupClient();
adapter = Guice.createInjector(module, new Log4JLoggingModule())
.getInstance(SoftLayerComputeServiceAdapter.class);
.getInstance(SoftLayerComputeServiceAdapter.class);
}
@Test
@ -62,6 +63,9 @@ public class SoftLayerComputeServiceAdapterLiveTest extends BaseSoftLayerClientL
assertFalse(Iterables.isEmpty(adapter.listLocations()));
}
private static final PrioritizeCredentialsFromTemplate prioritizeCredentialsFromTemplate = new PrioritizeCredentialsFromTemplate(
new DefaultCredentialsFromImageOrOverridingCredentials());
@Test
public void testCreateNodeWithGroupEncodedIntoNameThenStoreCredentials() {
String group = "foo";
@ -71,15 +75,13 @@ public class SoftLayerComputeServiceAdapterLiveTest extends BaseSoftLayerClientL
// test passing custom options
template.getOptions().as(SoftLayerTemplateOptions.class).domainName("me.org");
Map<String, Credentials> credentialStore = Maps.newLinkedHashMap();
guest = adapter.createNodeWithGroupEncodedIntoNameThenStoreCredentials(group, name, template, credentialStore);
assertEquals(guest.getHostname(), name);
assertEquals(guest.getDomain(), template.getOptions().as(SoftLayerTemplateOptions.class).getDomainName());
// check other things, like cpu correct, mem correct, image/os is correct
// (as possible)
assert credentialStore.containsKey("node#" + guest.getId()) : "credentials to log into guest not found " + guest;
assert InetAddresses.isInetAddress(guest.getPrimaryBackendIpAddress()) : guest;
doConnectViaSsh(guest, credentialStore.get("node#" + guest.getId()));
guest = adapter.createNodeWithGroupEncodedIntoName(group, name, template);
assertEquals(guest.getNode().getHostname(), name);
assertEquals(guest.getNodeId(), guest.getNode().getId());
assertEquals(guest.getNode().getDomain(), template.getOptions().as(SoftLayerTemplateOptions.class)
.getDomainName());
assert InetAddresses.isInetAddress(guest.getNode().getPrimaryBackendIpAddress()) : guest;
doConnectViaSsh(guest.getNode(), prioritizeCredentialsFromTemplate.apply(template, guest.getCredentials()));
}
protected void doConnectViaSsh(VirtualGuest guest, Credentials creds) {
@ -111,7 +113,7 @@ public class SoftLayerComputeServiceAdapterLiveTest extends BaseSoftLayerClientL
@AfterGroups(groups = "live")
protected void tearDown() {
if (guest != null)
adapter.destroyNode(guest.getId() + "");
adapter.destroyNode(guest.getNodeId() + "");
super.tearDown();
}
}

View File

@ -68,7 +68,7 @@ public class SoftLayerTemplateBuilderLiveTest extends BaseTemplateBuilderLiveTes
case UBUNTU:
return input.version.equals("") || input.version.equals("10.04") || input.version.equals("8");
case DEBIAN:
return input.version.equals("") || input.version.equals("5.0");
return input.version.equals("") || input.version.matches("[56].0");
case FEDORA:
return input.version.equals("") || input.version.equals("13") || input.version.equals("15");
case RHEL:
@ -219,6 +219,6 @@ public class SoftLayerTemplateBuilderLiveTest extends BaseTemplateBuilderLiveTes
@Override
protected Set<String> getIso3166Codes() {
return ImmutableSet.<String> of("SG", "US-CA", "US-TX", "US-VA", "US-WA", "US-TX");
return ImmutableSet.<String> of("SG", "NL", "US-CA", "US-TX", "US-VA", "US-WA", "US-TX");
}
}

View File

@ -25,14 +25,12 @@ import static com.google.common.collect.Iterables.transform;
import static org.jclouds.virtualbox.config.VirtualBoxConstants.VIRTUALBOX_IMAGE_PREFIX;
import java.util.Collections;
import java.util.Map;
import javax.inject.Inject;
import org.jclouds.compute.ComputeServiceAdapter;
import org.jclouds.compute.domain.Image;
import org.jclouds.compute.domain.Template;
import org.jclouds.domain.Credentials;
import org.jclouds.domain.Location;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.location.suppliers.JustProvider;
@ -71,8 +69,8 @@ public class VirtualBoxComputeServiceAdapter implements ComputeServiceAdapter<IM
}
@Override
public IMachine createNodeWithGroupEncodedIntoNameThenStoreCredentials(String tag, String name, Template template,
Map<String, Credentials> credentialStore) {
public NodeAndInitialCredentials<IMachine> createNodeWithGroupEncodedIntoName(String tag, String name,
Template template) {
return null;
}

View File

@ -25,12 +25,15 @@ import static org.testng.Assert.assertFalse;
import java.net.URI;
import java.util.Map;
import org.jclouds.compute.ComputeServiceAdapter.NodeAndInitialCredentials;
import org.jclouds.compute.config.BaseComputeServiceContextModule;
import org.jclouds.compute.domain.ExecResponse;
import org.jclouds.compute.domain.Image;
import org.jclouds.compute.domain.OsFamily;
import org.jclouds.compute.domain.Template;
import org.jclouds.compute.functions.DefaultCredentialsFromImageOrOverridingCredentials;
import org.jclouds.compute.reference.ComputeServiceConstants;
import org.jclouds.compute.strategy.PrioritizeCredentialsFromTemplate;
import org.jclouds.domain.Credentials;
import org.jclouds.json.Json;
import org.jclouds.json.config.GsonModule;
@ -48,14 +51,13 @@ import org.virtualbox_4_1.VirtualBoxManager;
import com.google.common.base.Function;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import com.google.common.collect.Maps;
import com.google.inject.Guice;
@Test(groups = "live", singleThreaded = true, testName = "VirtualBoxComputeServiceAdapterLiveTest")
public class VirtualBoxComputeServiceAdapterLiveTest extends BaseVirtualBoxClientLiveTest {
private VirtualBoxComputeServiceAdapter adapter;
private IMachine machine;
private NodeAndInitialCredentials<IMachine> machine;
private final Map<OsFamily, Map<String, String>> osVersionMap = new BaseComputeServiceContextModule() {
}.provideOsVersionMap(new ComputeServiceConstants.ReferenceData(), Guice.createInjector(new GsonModule())
.getInstance(Json.class));
@ -78,24 +80,26 @@ public class VirtualBoxComputeServiceAdapterLiveTest extends BaseVirtualBoxClien
assertFalse(Iterables.isEmpty(adapter.listLocations()));
}
private static final PrioritizeCredentialsFromTemplate prioritizeCredentialsFromTemplate = new PrioritizeCredentialsFromTemplate(
new DefaultCredentialsFromImageOrOverridingCredentials());
@Test
public void testCreateNodeWithGroupEncodedIntoNameThenStoreCredentials() {
String group = "foo";
String name = "foo-ef4";
Template template = context.getComputeService().templateBuilder().build();
Map<String, Credentials> credentialStore = Maps.newLinkedHashMap();
machine = adapter.createNodeWithGroupEncodedIntoNameThenStoreCredentials(group, name, template, credentialStore);
assertEquals(machine.getName(), name);
machine = adapter.createNodeWithGroupEncodedIntoName(group, name, template);
assertEquals(machine.getNode().getName(), name);
assertEquals(machine.getNodeId(), machine.getNode().getId());
// is there a place for group?
// check other things, like cpu correct, mem correct, image/os is correct
// (as possible)
assert credentialStore.containsKey("node#" + machine.getId()) : "credentials to log into machine not found "
+ machine;
// TODO: what's the IP address?
// assert
// InetAddresses.isInetAddress(machine.getPrimaryBackendIpAddress()) :
// machine;
doConnectViaSsh(machine, credentialStore.get("node#" + machine.getId()));
doConnectViaSsh(machine.getNode(), prioritizeCredentialsFromTemplate.apply(template, machine.getCredentials()));
}
protected void doConnectViaSsh(IMachine machine, Credentials creds) {
@ -132,7 +136,7 @@ public class VirtualBoxComputeServiceAdapterLiveTest extends BaseVirtualBoxClien
@AfterGroups(groups = "live")
protected void tearDown() throws Exception {
if (machine != null)
adapter.destroyNode(machine.getId() + "");
adapter.destroyNode(machine.getNodeId() + "");
super.tearDown();
}
}

View File

@ -20,8 +20,6 @@ package org.jclouds.servermanager.compute.strategy;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Map;
import javax.inject.Inject;
import javax.inject.Singleton;
@ -52,15 +50,12 @@ public class ServerManagerComputeServiceAdapter implements ComputeServiceAdapter
}
@Override
public Server createNodeWithGroupEncodedIntoNameThenStoreCredentials(String tag, String name, Template template,
Map<String, Credentials> credentialStore) {
public NodeAndInitialCredentials<Server> createNodeWithGroupEncodedIntoName(String tag, String name, Template template) {
// create the backend object using parameters from the template.
Server from = client.createServerInDC(template.getLocation().getId(), name,
Integer.parseInt(template.getImage().getProviderId()),
Integer.parseInt(template.getHardware().getProviderId()));
// store the credentials so that later functions can use them
credentialStore.put(from.id + "", new Credentials(from.loginUser, from.password));
return from;
return new NodeAndInitialCredentials<Server>(from, from.id + "", new Credentials(from.loginUser, from.password));
}
@Override