diff --git a/labs/virtualbox/src/main/java/org/jclouds/virtualbox/functions/CreateAndInstallVm.java b/labs/virtualbox/src/main/java/org/jclouds/virtualbox/functions/CreateAndInstallVm.java index 316157a226..336225926f 100644 --- a/labs/virtualbox/src/main/java/org/jclouds/virtualbox/functions/CreateAndInstallVm.java +++ b/labs/virtualbox/src/main/java/org/jclouds/virtualbox/functions/CreateAndInstallVm.java @@ -20,6 +20,7 @@ package org.jclouds.virtualbox.functions; import static com.google.common.base.Preconditions.checkState; import static com.google.common.collect.Iterables.transform; +import static org.jclouds.scriptbuilder.domain.Statements.call; import java.net.URI; import java.util.List; @@ -28,6 +29,9 @@ import javax.annotation.Resource; import javax.inject.Named; import javax.inject.Singleton; +import org.jclouds.compute.domain.ExecResponse; +import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.options.RunScriptOptions; import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.logging.Logger; import org.jclouds.ssh.SshClient; @@ -40,13 +44,13 @@ import org.jclouds.virtualbox.util.MachineController; import org.jclouds.virtualbox.util.MachineUtils; import org.virtualbox_4_1.IMachine; import org.virtualbox_4_1.LockType; -import org.virtualbox_4_1.VirtualBoxManager; import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.base.Splitter; -import com.google.common.base.Supplier; import com.google.common.cache.LoadingCache; +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.ListenableFuture; import com.google.inject.Inject; @Singleton @@ -56,7 +60,6 @@ public class CreateAndInstallVm implements Function { @Named(ComputeServiceConstants.COMPUTE_LOGGER) protected Logger logger = Logger.NULL; - private final Supplier manager; private final CreateAndRegisterMachineFromIsoIfNotAlreadyExists createAndRegisterMachineFromIsoIfNotAlreadyExists; private final GuestAdditionsInstaller guestAdditionsInstaller; private final Predicate sshResponds; @@ -69,7 +72,6 @@ public class CreateAndInstallVm implements Function { @Inject public CreateAndInstallVm( - Supplier manager, CreateAndRegisterMachineFromIsoIfNotAlreadyExists CreateAndRegisterMachineFromIsoIfNotAlreadyExists, GuestAdditionsInstaller guestAdditionsInstaller, IMachineToNodeMetadata imachineToNodeMetadata, @@ -77,7 +79,6 @@ public class CreateAndInstallVm implements Function { Function sshClientForIMachine, MachineUtils machineUtils, @Preconfiguration LoadingCache preConfiguration, MachineController machineController) { - this.manager = manager; this.createAndRegisterMachineFromIsoIfNotAlreadyExists = CreateAndRegisterMachineFromIsoIfNotAlreadyExists; this.sshResponds = sshResponds; this.sshClientForIMachine = sshClientForIMachine; @@ -121,13 +122,13 @@ public class CreateAndInstallVm implements Function { logger.debug(">> awaiting post-installation actions on vm: %s", vmName); -// NodeMetadata vmMetadata = imachineToNodeMetadata.apply(vm); + NodeMetadata vmMetadata = imachineToNodeMetadata.apply(vm); -// ListenableFuture execFuture = -// machineUtils.runScriptOnNode(vmMetadata, call("cleanupUdevIfNeeded"), RunScriptOptions.NONE); + ListenableFuture execFuture = + machineUtils.runScriptOnNode(vmMetadata, call("cleanupUdevIfNeeded"), RunScriptOptions.NONE); -// ExecResponse execResponse = Futures.getUnchecked(execFuture); -// checkState(execResponse.getExitStatus() == 0); + ExecResponse execResponse = Futures.getUnchecked(execFuture); + checkState(execResponse.getExitStatus() == 0); logger.debug( "<< installation of image complete. Powering down node(%s)", diff --git a/labs/virtualbox/src/main/java/org/jclouds/virtualbox/functions/MastersLoadingCache.java b/labs/virtualbox/src/main/java/org/jclouds/virtualbox/functions/MastersLoadingCache.java index 801f1840fb..85b81bf3ac 100644 --- a/labs/virtualbox/src/main/java/org/jclouds/virtualbox/functions/MastersLoadingCache.java +++ b/labs/virtualbox/src/main/java/org/jclouds/virtualbox/functions/MastersLoadingCache.java @@ -64,18 +64,21 @@ import com.google.common.base.Function; import com.google.common.base.Splitter; import com.google.common.base.Supplier; import com.google.common.cache.AbstractLoadingCache; +import com.google.common.cache.LoadingCache; import com.google.common.collect.Iterables; import com.google.common.collect.Maps; /** - * Does most of the work wrt to creating the master image. + * A {@link LoadingCache} for masters. If the requested master has been previously created this + * returns it, if not it coordinates its creation including downloading isos and creating + * cache/config directories. * * @author dralves * */ @Singleton public class MastersLoadingCache extends AbstractLoadingCache { - + // TODO parameterize public static final int MASTER_PORT = 2222; @@ -114,7 +117,7 @@ public class MastersLoadingCache extends AbstractLoadingCache { this.version = Iterables.get(Splitter.on('r').split(version), 0); this.isoDownloader = isoDownloader; } - + @PostConstruct public void createCacheDirStructure() { if (!new File(workingDir).exists()) { @@ -201,7 +204,7 @@ public class MastersLoadingCache extends AbstractLoadingCache { } return null; } - + private String getFilePathOrDownload(String httpUrl) throws ExecutionException { String fileName = httpUrl.substring(httpUrl.lastIndexOf('/') + 1, httpUrl.length()); File localFile = new File(isosDir, fileName); diff --git a/labs/virtualbox/src/main/java/org/jclouds/virtualbox/functions/NodeCreator.java b/labs/virtualbox/src/main/java/org/jclouds/virtualbox/functions/NodeCreator.java index 3c71c7b700..505d50d6e2 100644 --- a/labs/virtualbox/src/main/java/org/jclouds/virtualbox/functions/NodeCreator.java +++ b/labs/virtualbox/src/main/java/org/jclouds/virtualbox/functions/NodeCreator.java @@ -54,6 +54,13 @@ import org.virtualbox_4_1.VirtualBoxManager; import com.google.common.base.Function; import com.google.common.base.Supplier; +/** + * Creates nodes, by cloning a master vm and based on the provided {@link NodeSpec}. Must be + * synchronized mainly because of snapshot creation (must be synchronized on a per-master-basis). + * + * @author dralves + * + */ @Singleton public class NodeCreator implements Function> {