You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by ad...@apache.org on 2014/10/27 17:36:42 UTC

[6/9] JCLOUDS-758 Drop VirtualBox labs provider.

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/75178c77/virtualbox/src/main/java/org/jclouds/virtualbox/functions/LaunchMachineIfNotAlreadyRunning.java
----------------------------------------------------------------------
diff --git a/virtualbox/src/main/java/org/jclouds/virtualbox/functions/LaunchMachineIfNotAlreadyRunning.java b/virtualbox/src/main/java/org/jclouds/virtualbox/functions/LaunchMachineIfNotAlreadyRunning.java
deleted file mode 100644
index 90ab02d..0000000
--- a/virtualbox/src/main/java/org/jclouds/virtualbox/functions/LaunchMachineIfNotAlreadyRunning.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF 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.virtualbox.functions;
-
-import static com.google.common.base.Throwables.propagate;
-
-import javax.annotation.Resource;
-import javax.inject.Named;
-
-import org.jclouds.compute.reference.ComputeServiceConstants;
-import org.jclouds.logging.Logger;
-import org.jclouds.virtualbox.domain.ErrorCode;
-import org.jclouds.virtualbox.domain.ExecutionType;
-import org.virtualbox_4_2.IMachine;
-import org.virtualbox_4_2.IProgress;
-import org.virtualbox_4_2.ISession;
-import org.virtualbox_4_2.SessionState;
-import org.virtualbox_4_2.VBoxException;
-import org.virtualbox_4_2.VirtualBoxManager;
-
-import com.google.common.base.Function;
-
-/**
- * Starts a machine using launchMachine() with the provided type and
- * environment.
- * <p/>
- * Note that launchMachine() may throw VBoxException with the following error
- * codes:
- * <p/>
- * VBOX_E_UNEXPECTED: Virtual machine not registered. VBOX_E_INVALIDARG: Invalid
- * session type type. VBOX_E_OBJECT_NOT_FOUND: No machine matching machineId
- * found. VBOX_E_INVALID_OBJECT_STATE: Session already open or being opened.
- * VBOX_E_IPRT_ERROR: Launching process for machine failed. VBOX_E_VM_ERROR:
- * Failed to assign machine to session.
- *
- * @see ErrorCode
- */
-public class LaunchMachineIfNotAlreadyRunning implements Function<IMachine, ISession> {
-
-   @Resource
-   @Named(ComputeServiceConstants.COMPUTE_LOGGER)
-   protected Logger logger = Logger.NULL;
-
-   private final VirtualBoxManager manager;
-   private final ExecutionType type;
-   private final String environment;
-
-   public LaunchMachineIfNotAlreadyRunning(VirtualBoxManager manager, ExecutionType type, String environment) {
-      this.manager = manager;
-      this.type = type;
-      this.environment = environment;
-   }
-
-   @Override
-   public ISession apply(IMachine machine) {
-      ISession session = manager.getSessionObject();
-      try {
-         final IProgress progress = machine
-                 .launchVMProcess(session, type.stringValue(), environment);
-         progress.waitForCompletion(-1);
-      } catch (VBoxException e) {
-         ErrorCode errorCode = ErrorCode.valueOf(e);
-         switch (errorCode) {
-            case VBOX_E_INVALID_OBJECT_STATE:
-               logger.warn(e, "Could not start machine. Got error code %s from launchMachine(). "
-                       + "The machine might already be running.", errorCode);
-               break;
-            default:
-               propagate(e);
-         }
-      } finally {
-         if (session.getState() == SessionState.Locked) {
-            // Remove session lock taken by launchVmProcess()
-            session.unlockMachine();
-            // TODO this unlock is not IMMEDIATELY visible outside (vbox doc)
-         }
-      }
-      return session;
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/75178c77/virtualbox/src/main/java/org/jclouds/virtualbox/functions/MacAddressToBSD.java
----------------------------------------------------------------------
diff --git a/virtualbox/src/main/java/org/jclouds/virtualbox/functions/MacAddressToBSD.java b/virtualbox/src/main/java/org/jclouds/virtualbox/functions/MacAddressToBSD.java
deleted file mode 100644
index e058848..0000000
--- a/virtualbox/src/main/java/org/jclouds/virtualbox/functions/MacAddressToBSD.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF 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.virtualbox.functions;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-import com.google.common.base.Function;
-import com.google.common.base.Joiner;
-import com.google.common.base.Splitter;
-import com.google.common.collect.Iterables;
-
-public enum MacAddressToBSD implements Function<String, String> {
-
-   INSTANCE;
-
-   @Override
-   public String apply(String macAddress) {
-      checkArgument(macAddress.length() == 17);
-      return Joiner.on(":").join(
-              Iterables.transform(Splitter.on(":").split(macAddress),
-                      new Function<String, String>() {
-                         @Override
-                         public String apply(String addressPart) {
-                            if (addressPart.equals("00"))
-                               return "0";
-                            if (addressPart.startsWith("0"))
-                               return addressPart.substring(1);
-
-                            return addressPart;
-                         }
-                      }));
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/75178c77/virtualbox/src/main/java/org/jclouds/virtualbox/functions/MastersLoadingCache.java
----------------------------------------------------------------------
diff --git a/virtualbox/src/main/java/org/jclouds/virtualbox/functions/MastersLoadingCache.java b/virtualbox/src/main/java/org/jclouds/virtualbox/functions/MastersLoadingCache.java
deleted file mode 100644
index 658429a..0000000
--- a/virtualbox/src/main/java/org/jclouds/virtualbox/functions/MastersLoadingCache.java
+++ /dev/null
@@ -1,286 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF 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.virtualbox.functions;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-import static org.jclouds.compute.options.RunScriptOptions.Builder.runAsRoot;
-import static org.jclouds.virtualbox.config.VirtualBoxConstants.VIRTUALBOX_DEFAULT_DIR;
-import static org.jclouds.virtualbox.config.VirtualBoxConstants.VIRTUALBOX_IMAGE_PREFIX;
-import static org.jclouds.virtualbox.config.VirtualBoxConstants.VIRTUALBOX_NODE_NAME_SEPARATOR;
-import static org.jclouds.virtualbox.config.VirtualBoxConstants.VIRTUALBOX_PRECONFIGURATION_URL;
-import static org.jclouds.virtualbox.config.VirtualBoxConstants.VIRTUALBOX_WORKINGDIR;
-import static org.jclouds.virtualbox.util.MachineUtils.machineNotFoundException;
-
-import java.io.File;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.concurrent.ExecutionException;
-
-import javax.annotation.PostConstruct;
-import javax.annotation.Resource;
-import javax.inject.Inject;
-import javax.inject.Named;
-import javax.inject.Singleton;
-
-import org.jclouds.compute.callables.RunScriptOnNode.Factory;
-import org.jclouds.compute.domain.ExecResponse;
-import org.jclouds.compute.domain.Image;
-import org.jclouds.compute.domain.NodeMetadata;
-import org.jclouds.compute.reference.ComputeServiceConstants;
-import org.jclouds.domain.LoginCredentials;
-import org.jclouds.location.Provider;
-import org.jclouds.logging.Logger;
-import org.jclouds.rest.annotations.BuildVersion;
-import org.jclouds.scriptbuilder.domain.Statement;
-import org.jclouds.scriptbuilder.domain.StatementList;
-import org.jclouds.scriptbuilder.domain.Statements;
-import org.jclouds.virtualbox.domain.HardDisk;
-import org.jclouds.virtualbox.domain.IsoSpec;
-import org.jclouds.virtualbox.domain.Master;
-import org.jclouds.virtualbox.domain.MasterSpec;
-import org.jclouds.virtualbox.domain.NetworkAdapter;
-import org.jclouds.virtualbox.domain.NetworkInterfaceCard;
-import org.jclouds.virtualbox.domain.NetworkSpec;
-import org.jclouds.virtualbox.domain.StorageController;
-import org.jclouds.virtualbox.domain.VmSpec;
-import org.jclouds.virtualbox.domain.YamlImage;
-import org.jclouds.virtualbox.functions.admin.PreseedCfgServer;
-import org.jclouds.virtualbox.predicates.RetryIfSocketNotYetOpen;
-import org.jclouds.virtualbox.statements.Md5;
-import org.jclouds.virtualbox.util.NetworkUtils;
-import org.virtualbox_4_2.CleanupMode;
-import org.virtualbox_4_2.IMachine;
-import org.virtualbox_4_2.NetworkAttachmentType;
-import org.virtualbox_4_2.StorageBus;
-import org.virtualbox_4_2.VBoxException;
-import org.virtualbox_4_2.VirtualBoxManager;
-
-import com.google.common.base.CaseFormat;
-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.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Maps;
-import com.google.common.net.HostAndPort;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-
-/**
- * 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. This also
- * implements {@link Supplier} in order to provide jetty with the current image
- * (only one master can be created at a time).
- */
-@Singleton
-public class MastersLoadingCache extends AbstractLoadingCache<Image, Master> {
-
-   @Resource
-   @Named(ComputeServiceConstants.COMPUTE_LOGGER)
-   protected Logger logger = Logger.NULL;
-
-   private final Map<String, Master> masters = Maps.newHashMap();
-   private final Function<MasterSpec, IMachine> masterCreatorAndInstaller;
-   private final Map<String, YamlImage> imageMapping;
-   private final String workingDir;
-   private final String isosDir;
-   private final Supplier<VirtualBoxManager> manager;
-   private final String version;
-   private final String preconfigurationUrl;
-
-   private final Factory runScriptOnNodeFactory;
-   private final RetryIfSocketNotYetOpen socketTester;
-   private final Supplier<NodeMetadata> host;
-   private final Supplier<URI> providerSupplier;
-   private final HardcodedHostToHostNodeMetadata hardcodedHostToHostNodeMetadata;
-
-   @Inject
-   public MastersLoadingCache(@BuildVersion String version,
-         @Named(VIRTUALBOX_PRECONFIGURATION_URL) String preconfigurationUrl,
-         @Named(VIRTUALBOX_WORKINGDIR) String workingDir, Function<MasterSpec, IMachine> masterLoader,
-         Supplier<Map<Image, YamlImage>> yamlMapper, Supplier<VirtualBoxManager> manager,
-         Factory runScriptOnNodeFactory, RetryIfSocketNotYetOpen socketTester, Supplier<NodeMetadata> host,
-         @Provider Supplier<URI> providerSupplier, HardcodedHostToHostNodeMetadata hardcodedHostToHostNodeMetadata) {
-      this.manager = checkNotNull(manager, "vboxmanager can't be null");
-      this.masterCreatorAndInstaller = masterLoader;
-      this.workingDir = workingDir == null ? VIRTUALBOX_DEFAULT_DIR : workingDir;
-      this.isosDir = workingDir + File.separator + "isos";
-      this.imageMapping = Maps.newLinkedHashMap();
-      for (Entry<Image, YamlImage> entry : yamlMapper.get().entrySet()) {
-         this.imageMapping.put(entry.getKey().getId(), entry.getValue());
-      }
-      this.version = Iterables.get(Splitter.on('r').split(checkNotNull(version, "version")), 0);
-      this.preconfigurationUrl = preconfigurationUrl;
-
-      this.runScriptOnNodeFactory = checkNotNull(runScriptOnNodeFactory, "runScriptOnNodeFactory");
-      this.socketTester = checkNotNull(socketTester, "socketTester");
-      this.socketTester.seconds(3L);
-      this.host = checkNotNull(host, "host");
-      this.providerSupplier = checkNotNull(providerSupplier, "endpoint to virtualbox websrvd is needed");
-      this.hardcodedHostToHostNodeMetadata = hardcodedHostToHostNodeMetadata;
-   }
-
-   @PostConstruct
-   public void createCacheDirStructure() {
-      if (!new File(workingDir).exists()) {
-         new File(workingDir, "isos").mkdirs();
-      }
-   }
-
-   @Override
-   public synchronized Master get(Image key) throws ExecutionException {
-      // check if we have loaded this machine before
-      if (masters.containsKey(key.getId())) {
-         return masters.get(key.getId());
-      }
-      checkState(!key.getId().contains(VIRTUALBOX_NODE_NAME_SEPARATOR), "master image names cannot contain \""
-            + VIRTUALBOX_NODE_NAME_SEPARATOR + "\"");
-      String vmName = VIRTUALBOX_IMAGE_PREFIX + key.getId();
-      IMachine masterMachine;
-      Master master;
-      // ready the preseed file server
-      PreseedCfgServer server = new PreseedCfgServer();
-      try {
-         // try and find a master machine in vbox
-         masterMachine = manager.get().getVBox().findMachine(vmName);
-         master = Master.builder().machine(masterMachine).build();
-      } catch (VBoxException e) {
-         if (machineNotFoundException(e)) {
-            // machine was not found try to build one from a yaml file
-            YamlImage currentImage = checkNotNull(imageMapping.get(key.getId()), "currentImage");
-            URI preseedServer;
-            try {
-               preseedServer = new URI(preconfigurationUrl);
-               if (!socketTester.apply(HostAndPort.fromParts(preseedServer.getHost(), preseedServer.getPort()))) {
-                  server.start(preconfigurationUrl, currentImage.preseed_cfg);
-               }
-            } catch (URISyntaxException e1) {
-               logger.error("Cannot start the preseed server", e);
-               throw e;
-            }
-
-            MasterSpec masterSpec = buildMasterSpecFromYaml(currentImage, vmName);
-            masterMachine = masterCreatorAndInstaller.apply(masterSpec);
-            master = Master.builder().machine(masterMachine).spec(masterSpec).build();
-         } else {
-            logger.error("Problem during master creation", e);
-            throw e;
-         }
-      } finally {
-         server.stop();
-      }
-
-      masters.put(key.getId(), master);
-      return master;
-   }
-
-   private MasterSpec buildMasterSpecFromYaml(YamlImage currentImage, String vmName) throws ExecutionException {
-      String guestAdditionsFileName = String.format("VBoxGuestAdditions_%s.iso", version);
-      String guestAdditionsIso = String.format("%s/%s", isosDir, guestAdditionsFileName);
-      String guestAdditionsUri = "http://download.virtualbox.org/virtualbox/" + version + "/" + guestAdditionsFileName;
-      if (!new File(guestAdditionsIso).exists()) {
-         getFilePathOrDownload(guestAdditionsUri, null);
-      }
-      // check if the iso is here, download if not
-      String localIsoUrl = checkNotNull(getFilePathOrDownload(currentImage.iso, currentImage.iso_md5), "distro iso");
-      String adminDisk = workingDir + File.separator + vmName + ".vdi";
-      HardDisk hardDisk = HardDisk.builder().diskpath(adminDisk).autoDelete(true).controllerPort(0).deviceSlot(1)
-            .build();
-
-      StorageController ideController = StorageController.builder().name("IDE Controller").bus(StorageBus.IDE)
-            .attachISO(0, 0, localIsoUrl).attachHardDisk(hardDisk).build();
-
-      VmSpec vmSpecification = VmSpec.builder().id(currentImage.id).name(vmName).memoryMB(512)
-            .osTypeId(getOsTypeId(currentImage.os_family, currentImage.os_64bit)).controller(ideController)
-            .forceOverwrite(true).guestUser(currentImage.username).guestPassword(currentImage.credential)
-            .cleanUpMode(CleanupMode.Full).build();
-
-      NetworkAdapter networkAdapter = NetworkAdapter.builder().networkAttachmentType(NetworkAttachmentType.NAT)
-            .tcpRedirectRule(providerSupplier.get().getHost(), NetworkUtils.MASTER_PORT, "", 22).build();
-
-      NetworkInterfaceCard networkInterfaceCard = NetworkInterfaceCard.builder().addNetworkAdapter(networkAdapter)
-            .slot(0L).build();
-
-      NetworkSpec networkSpec = NetworkSpec.builder().addNIC(networkInterfaceCard).build();
-
-      String installationSequence = currentImage.keystroke_sequence.replace("HOSTNAME", vmSpecification.getVmName());
-      return MasterSpec.builder()
-                       .vm(vmSpecification)
-                       .iso(IsoSpec.builder()
-                                   .sourcePath(localIsoUrl)
-                                   .installationScript(installationSequence)
-                                   .build())
-                       .network(networkSpec)
-                       .credentials(LoginCredentials.builder()
-                                                    .user(currentImage.username)
-                                                    .password(currentImage.credential)
-                                                    .authenticateSudo(true)
-                                                    .build())
-                       .build();
-   }
-
-   @Override
-   public synchronized Master getIfPresent(Object key) {
-      checkArgument(key instanceof Image, "this cache is for entries who's keys are Images");
-      Image image = Image.class.cast(key);
-      if (masters.containsKey(image.getId())) {
-         return masters.get(image.getId());
-      }
-      return null;
-   }
-
-   private String getFilePathOrDownload(String httpUrl, String expectedMd5) throws ExecutionException {
-      String fileName = httpUrl.substring(httpUrl.lastIndexOf('/') + 1, httpUrl.length());
-      URI provider = providerSupplier.get();
-      if (!socketTester.apply(HostAndPort.fromParts(provider.getHost(), provider.getPort()))) {
-         throw new RuntimeException("could not connect to virtualbox");
-      }
-      File file = new File(isosDir, fileName);
-      List<Statement> statements = new ImmutableList.Builder<Statement>().add(
-            Statements.saveHttpResponseTo(URI.create(httpUrl), isosDir, fileName)).build();
-      StatementList statementList = new StatementList(statements);
-      NodeMetadata hostNode = checkNotNull(hardcodedHostToHostNodeMetadata.apply(host.get()), "hostNode");
-      ListenableFuture<ExecResponse> future = runScriptOnNodeFactory.submit(hostNode, statementList,
-            runAsRoot(false));
-      Futures.getUnchecked(future);
-
-      if (expectedMd5 != null) {
-         String filePath = isosDir + File.separator + fileName;
-         ListenableFuture<ExecResponse> md5future = runScriptOnNodeFactory.submit(hostNode, new Md5(filePath),
-               runAsRoot(false));
-
-         ExecResponse responseMd5 = Futures.getUnchecked(md5future);
-         assert responseMd5.getExitStatus() == 0 : hostNode.getId() + ": " + responseMd5;
-         checkNotNull(responseMd5.getOutput(), "iso_md5 missing");
-         String actualMd5 = responseMd5.getOutput().trim();
-         checkState(actualMd5.equals(expectedMd5), "md5 of %s is %s but expected %s", filePath, actualMd5, expectedMd5);
-      }
-      return file.getAbsolutePath();
-   }
-
-   private String getOsTypeId(String os_family, boolean os_64bit) {
-      String osFamily = CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_CAMEL, os_family);
-      return os_64bit ? osFamily + "_64" : osFamily;
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/75178c77/virtualbox/src/main/java/org/jclouds/virtualbox/functions/NodeCreator.java
----------------------------------------------------------------------
diff --git a/virtualbox/src/main/java/org/jclouds/virtualbox/functions/NodeCreator.java b/virtualbox/src/main/java/org/jclouds/virtualbox/functions/NodeCreator.java
deleted file mode 100644
index 739c197..0000000
--- a/virtualbox/src/main/java/org/jclouds/virtualbox/functions/NodeCreator.java
+++ /dev/null
@@ -1,294 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF 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.virtualbox.functions;
-
- import com.google.common.base.Charsets;
- import com.google.common.base.Function;
- import com.google.common.base.Optional;
- import com.google.common.base.Predicate;
- import com.google.common.base.Supplier;
- import com.google.common.collect.ImmutableSet;
- import com.google.common.collect.Iterables;
- import com.google.common.io.Files;
- import org.jclouds.compute.ComputeServiceAdapter.NodeAndInitialCredentials;
- import org.jclouds.compute.domain.NodeMetadata;
- import org.jclouds.compute.domain.NodeMetadataBuilder;
- import org.jclouds.compute.options.RunScriptOptions;
- import org.jclouds.compute.reference.ComputeServiceConstants;
- import org.jclouds.domain.LoginCredentials;
- import org.jclouds.logging.Logger;
- import org.jclouds.util.Strings2;
- import org.jclouds.virtualbox.config.VirtualBoxComputeServiceContextModule;
- import org.jclouds.virtualbox.domain.CloneSpec;
- import org.jclouds.virtualbox.domain.Master;
- import org.jclouds.virtualbox.domain.NetworkInterfaceCard;
- import org.jclouds.virtualbox.domain.NetworkSpec;
- import org.jclouds.virtualbox.domain.NodeSpec;
- import org.jclouds.virtualbox.domain.VmSpec;
- import org.jclouds.virtualbox.statements.DeleteGShadowLock;
- import org.jclouds.virtualbox.statements.PasswordlessSudo;
- import org.jclouds.virtualbox.util.MachineController;
- import org.jclouds.virtualbox.util.MachineUtils;
- import org.jclouds.virtualbox.util.NetworkUtils;
- import org.virtualbox_4_2.CleanupMode;
- import org.virtualbox_4_2.IMachine;
- import org.virtualbox_4_2.IProgress;
- import org.virtualbox_4_2.ISession;
- import org.virtualbox_4_2.LockType;
- import org.virtualbox_4_2.NetworkAttachmentType;
- import org.virtualbox_4_2.VirtualBoxManager;
- import com.google.common.collect.ImmutableList;
-
- import javax.annotation.Resource;
- import javax.inject.Inject;
- import javax.inject.Named;
- import javax.inject.Singleton;
-
- import java.io.File;
- import java.io.IOException;
-
- import static com.google.common.base.Preconditions.checkNotNull;
- import static com.google.common.base.Preconditions.checkState;
- import static org.jclouds.virtualbox.config.VirtualBoxConstants.GUEST_OS_PASSWORD;
- import static org.jclouds.virtualbox.config.VirtualBoxConstants.GUEST_OS_USER;
- import static org.jclouds.virtualbox.config.VirtualBoxConstants.VIRTUALBOX_GUEST_MEMORY;
- import static org.jclouds.virtualbox.config.VirtualBoxConstants.VIRTUALBOX_IMAGE_PREFIX;
- import static org.jclouds.virtualbox.config.VirtualBoxConstants.VIRTUALBOX_NODE_NAME_SEPARATOR;
- import static org.jclouds.virtualbox.config.VirtualBoxConstants.VIRTUALBOX_NODE_PREFIX;
- import static org.jclouds.virtualbox.config.VirtualBoxConstants.VIRTUALBOX_WORKINGDIR;
-
-/**
- * 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).
- */
-@Singleton
-public class NodeCreator implements Function<NodeSpec, NodeAndInitialCredentials<IMachine>> {
-   
-   @Resource
-   @Named(ComputeServiceConstants.COMPUTE_LOGGER)
-   protected Logger logger = Logger.NULL;
-   
-   private final Supplier<VirtualBoxManager> manager;
-   private final Function<CloneSpec, IMachine> cloner;
-   private final MachineUtils machineUtils;
-   private final MachineController machineController;
-   private final NetworkUtils networkUtils;
-   private final int ram;
-   private final String workingDir;
-   
-   @Inject
-   public NodeCreator(Supplier<VirtualBoxManager> manager, Function<CloneSpec, IMachine> cloner,
-            MachineUtils machineUtils, MachineController machineController,
-            NetworkUtils networkUtils,
-            @Named(VIRTUALBOX_GUEST_MEMORY) String ram,
-            @Named(VIRTUALBOX_WORKINGDIR) String workingDir) {
-      this.manager = checkNotNull(manager, "manager");
-      this.cloner = checkNotNull(cloner, "cloner");
-      this.networkUtils = checkNotNull(networkUtils, "networkUtils");
-      this.machineUtils = checkNotNull(machineUtils, "machineUtils");
-      this.machineController = checkNotNull(machineController, "machineController");
-      this.ram = checkNotNull(Integer.valueOf(ram), "ram");
-      this.workingDir = checkNotNull(workingDir, "workingDir");
-   }
-
-   @Override
-   public synchronized NodeAndInitialCredentials<IMachine> apply(NodeSpec nodeSpec) {
-      checkNotNull(nodeSpec, "NodeSpec");
-      Master master = checkNotNull(nodeSpec.getMaster(), "Master");
-      IMachine masterMachine = master.getMachine();
-      String guestOsUser = masterMachine.getExtraData(GUEST_OS_USER);
-      String guestOsPassword = masterMachine.getExtraData(GUEST_OS_PASSWORD);
-
-      cleanUpMaster(master);
-      CloneSpec cloneSpec = configureCloneSpec(nodeSpec, guestOsUser, guestOsPassword);
-      IMachine clone = cloner.apply(cloneSpec);
-      String cloneName =  cloneSpec.getVmSpec().getVmName();
-      logger.debug("<< cloned a vm(%s) from master(%s)", cloneName, nodeSpec.getMaster().getMachine().getName());
-      machineController.ensureMachineIsLaunched(cloneName);
-      logger.debug("<< cloned vm(%s) is up and running", cloneName);
-
-      reconfigureNetworkInterfaces(masterMachine, guestOsUser, guestOsPassword, cloneSpec.getNetworkSpec(), clone);
-
-      postConfigurations(clone, guestOsUser, guestOsPassword);
-
-      LoginCredentials credentials = LoginCredentials.builder()
-                                                     .user(guestOsUser)
-                                                     .password(guestOsPassword)
-                                                     .authenticateSudo(true)
-                                                     .build();
-      return new NodeAndInitialCredentials<IMachine>(clone, cloneName, credentials);
-   }
-
-   private void reconfigureNetworkInterfaces(IMachine masterMachine, String guestOsUser, String guestOsPassword, NetworkSpec networkSpec, IMachine clone) {
-      reconfigureHostOnlyInterfaceIfNeeded(guestOsUser, guestOsPassword, clone.getName(), masterMachine.getOSTypeId());
-      logger.debug("<< reconfigured hostOnly interface of node(%s)", clone.getName());
-      reconfigureNatInterfaceIfNeeded(guestOsUser, guestOsPassword, clone.getOSTypeId(), clone, networkSpec);
-      logger.debug("<< reconfigured NAT interface of node(%s)", clone.getName());
-   }
-
-   /**
-    * {@see DeleteGShadowLock} and {@see PasswordlessSudo} for a detailed explanation
-    *
-    * @param clone the target machine
-    * @param guestOsUser the user to access the target machine
-    * @param guestOsPassword the password to access the target machine
-    */
-   private void postConfigurations(IMachine clone, String guestOsUser, String guestOsPassword) {
-      NodeMetadata partialNodeMetadata = buildPartialNodeMetadata(clone, guestOsUser, guestOsPassword);
-      machineUtils.runScriptOnNode(partialNodeMetadata, new DeleteGShadowLock(), RunScriptOptions.NONE);
-      machineUtils.runScriptOnNode(partialNodeMetadata, new PasswordlessSudo(partialNodeMetadata.getCredentials().identity), RunScriptOptions.Builder.runAsRoot(true));
-   }
-
-   private CloneSpec configureCloneSpec(
-           NodeSpec nodeSpec, String guestOsUser, String guestOsPassword) {
-
-      String cloneName = generateCloneName(nodeSpec);
-
-      VmSpec cloneVmSpec = VmSpec.builder()
-              .id(cloneName)
-              .name(cloneName)
-              .memoryMB(ram)
-              .osTypeId(nodeSpec.getMaster().getMachine().getOSTypeId())
-              .guestUser(guestOsUser)
-              .guestPassword(guestOsPassword)
-              .cleanUpMode(CleanupMode.Full)
-              .forceOverwrite(true)
-              .build();
-
-      // case 'vbox host is localhost': NAT + HOST-ONLY
-      NetworkSpec networkSpec = networkUtils.createNetworkSpecWhenVboxIsLocalhost();
-
-      return CloneSpec.builder()
-              .linked(true)
-              .master(nodeSpec.getMaster().getMachine())
-              .network(networkSpec)
-              .vm(cloneVmSpec).build();
-   }
-
-   private void cleanUpMaster(Master master) {
-      deleteExistingSnapshot(master);
-   }
-
-   private void reconfigureHostOnlyInterfaceIfNeeded(final String username, final String password,
-                                                         String vmName, String osTypeId) {
-      final String scriptName = "hostOnly";
-      if (osTypeId.contains("RedHat")) {
-         File scriptFile = copyScriptToWorkingDir("redHatAndDerivatives", scriptName);
-         copyToNodeAndExecScript(username, password, vmName, scriptFile);
-      }
-   }
-
-   private void reconfigureNatInterfaceIfNeeded(final String guestOsUser, final String guestOsPassword,
-                                                String osTypeId, IMachine clone, NetworkSpec networkSpec) {
-
-      final String scriptName = "nat";
-      final String folder = "redHatAndDerivatives";
-      if (osTypeId.contains("RedHat")) {
-         File scriptFile = copyScriptToWorkingDir(folder, scriptName);
-         copyToNodeAndExecScript(guestOsUser, guestOsPassword, clone.getName(), scriptFile);
-      } else if (osTypeId.contains("Ubuntu") || osTypeId.contains("Debian")) {
-         NodeMetadata partialNodeMetadata = buildPartialNodeMetadata(clone, guestOsUser, guestOsPassword);
-
-         Optional<NetworkInterfaceCard> optionalNatIfaceCard = Iterables.tryFind(
-                 networkSpec.getNetworkInterfaceCards(),
-                 new Predicate<NetworkInterfaceCard>() {
-
-                    @Override
-                    public boolean apply(NetworkInterfaceCard nic) {
-                       return nic.getNetworkAdapter().getNetworkAttachmentType()
-                               .equals(NetworkAttachmentType.NAT);
-                    }
-                 });
-
-         checkState(networkUtils.enableNetworkInterface(partialNodeMetadata, optionalNatIfaceCard.get()),
-                 "cannot enable NAT Interface on vm(%s)", clone.getName());
-      }
-   }
-
-   private File copyScriptToWorkingDir(String folder, String scriptName) {
-      File scriptFile = new File(workingDir + "/conf/" + "/" + folder + "/" + scriptName);
-      scriptFile.getParentFile().mkdirs();
-      if (!scriptFile.exists()) {
-         try {
-            Files.write(Strings2.toStringAndClose(getClass().getResourceAsStream("/" + folder + "/" + scriptName)), scriptFile, Charsets.UTF_8);
-         } catch (IOException e) {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-         }
-      }
-      return scriptFile;
-   }
-
-   private void copyToNodeAndExecScript(final String username, final String password,
-                                        String vmName, final File scriptFile) {
-      machineUtils.sharedLockMachineAndApplyToSession(vmName, new Function<ISession, Void>() {
-
-         @Override
-         public Void apply(ISession session) {
-            String scriptName = scriptFile.getName();
-
-            manager.get().getSessionObject().getConsole().getGuest()
-                    .createSession(username, password, null, null)
-                    .copyTo(scriptFile.getAbsolutePath(), "/tmp/" + scriptName, null);
-
-            manager.get().getSessionObject().getConsole().getGuest()
-                    .createSession(username, password, null, null)
-                    .processCreate("/bin/chmod", ImmutableList.of("777", "/tmp/" + scriptName), null, null, 5 * 1000l);
-
-            manager.get().getSessionObject().getConsole().getGuest()
-                    .createSession(username, password, null, null)
-                    .processCreate("/bin/sh", ImmutableList.of("/tmp/" + scriptName), null, null, 5 * 1000l);
-            return null;
-         }
-      });
-   }
-
-   private String generateCloneName(NodeSpec nodeSpec) {
-      String masterNameWithoutPrefix = nodeSpec.getMaster().getMachine().getName().replace(VIRTUALBOX_IMAGE_PREFIX, "");
-      return VIRTUALBOX_NODE_PREFIX + masterNameWithoutPrefix + VIRTUALBOX_NODE_NAME_SEPARATOR
-               + nodeSpec.getTag() + VIRTUALBOX_NODE_NAME_SEPARATOR + nodeSpec.getName();
-   }
-
-   private void deleteExistingSnapshot(Master master) {
-      if (master.getMachine().getCurrentSnapshot() != null) {
-         ISession session;
-         try {
-            session = manager.get().getSessionObject();
-            master.getMachine().lockMachine(session, LockType.Write);
-            IProgress progress = session.getConsole().deleteSnapshot(master.getMachine().getCurrentSnapshot().getId());
-            progress.waitForCompletion(-1);
-            session.unlockMachine();
-         } catch (Exception e) {
-            throw new RuntimeException("error opening vbox machine session: " + e.getMessage(), e);
-         }
-         logger.debug("<< deleted an existing snapshot of vm(%s)", master.getMachine().getName());
-      }
-   }
-
-   private NodeMetadata buildPartialNodeMetadata(IMachine clone, String guestOsUser, String guestOsPassword) {
-      NodeMetadataBuilder nodeMetadataBuilder = new NodeMetadataBuilder();
-      nodeMetadataBuilder.id(clone.getName());
-      nodeMetadataBuilder.status(VirtualBoxComputeServiceContextModule.toPortableNodeStatus.get(clone.getState()));
-      nodeMetadataBuilder.publicAddresses(ImmutableSet.of(networkUtils.getValidHostOnlyIpFromVm(clone.getName())));
-      nodeMetadataBuilder.credentials(LoginCredentials.builder()
-                                                      .user(guestOsUser)
-                                                      .password(guestOsPassword)
-                                                      .authenticateSudo(true).build());
-      return nodeMetadataBuilder.build();
-   }
-
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/75178c77/virtualbox/src/main/java/org/jclouds/virtualbox/functions/RetrieveActiveBridgedInterfaces.java
----------------------------------------------------------------------
diff --git a/virtualbox/src/main/java/org/jclouds/virtualbox/functions/RetrieveActiveBridgedInterfaces.java b/virtualbox/src/main/java/org/jclouds/virtualbox/functions/RetrieveActiveBridgedInterfaces.java
deleted file mode 100644
index 8c076c2..0000000
--- a/virtualbox/src/main/java/org/jclouds/virtualbox/functions/RetrieveActiveBridgedInterfaces.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF 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.virtualbox.functions;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.collect.Iterables.filter;
-import static org.jclouds.compute.options.RunScriptOptions.Builder.runAsRoot;
-
-import java.net.NetworkInterface;
-import java.net.SocketException;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.List;
-import java.util.regex.Pattern;
-
-import javax.annotation.Resource;
-
-import org.jclouds.compute.callables.RunScriptOnNode.Factory;
-import org.jclouds.compute.domain.NodeMetadata;
-import org.jclouds.compute.reference.ComputeServiceConstants;
-import org.jclouds.logging.Logger;
-import org.jclouds.scriptbuilder.domain.Statement;
-import org.jclouds.scriptbuilder.domain.Statements;
-import org.jclouds.virtualbox.domain.BridgedIf;
-
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-import com.google.common.base.Splitter;
-import com.google.common.base.Throwables;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.inject.Inject;
-import com.google.inject.name.Named;
-
-public class RetrieveActiveBridgedInterfaces implements Function<NodeMetadata, List<BridgedIf>> {
-
-@Resource
-   @Named(ComputeServiceConstants.COMPUTE_LOGGER)
-   protected Logger logger = Logger.NULL;
-
-   private final Factory runScriptOnNodeFactory;
-
-   @Inject
-   public RetrieveActiveBridgedInterfaces(Factory runScriptOnNodeFactory) {	   
-      this.runScriptOnNodeFactory = checkNotNull(runScriptOnNodeFactory, "runScriptOnNodeFactory");
-   }
-
-   @Override
-   public List<BridgedIf> apply(NodeMetadata host) {
-      // Bridged Network
-      Statement command = Statements.exec("VBoxManage list bridgedifs");
-      String bridgedIfBlocks = runScriptOnNodeFactory.create(host, command, runAsRoot(false).wrapInInitScript(false))
-               .init().call().getOutput();
-
-      List<BridgedIf> bridgedInterfaces = retrieveBridgedInterfaceNames(bridgedIfBlocks);
-      checkNotNull(bridgedInterfaces);
-
-      // union of bridgedNetwork with inet up and !loopback
-      List<BridgedIf> activeNetworkInterfaces = Lists.newArrayList();
-      try {
-         Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces();
-         for (NetworkInterface inet : Collections.list(nets)) {
-            Iterable<BridgedIf> filteredBridgedInterface = filter(bridgedInterfaces, new IsActiveBridgedInterface(inet));
-            Iterables.addAll(activeNetworkInterfaces, filteredBridgedInterface);
-         }
-      } catch (SocketException e) {
-         logger.error(e, "Problem in listing network interfaces.");
-         throw Throwables.propagate(e);
-      }
-      return activeNetworkInterfaces;
-   }
-
-   protected static List<BridgedIf> retrieveBridgedInterfaceNames(String bridgedIfBlocks) {
-      List<BridgedIf> bridgedInterfaces = Lists.newArrayList();
-      // separate the different bridge block
-      for (String bridgedIfBlock : Splitter.on(Pattern.compile("(?m)^[ \t]*\r?\n")).split(bridgedIfBlocks)) {
-    	  if (!bridgedIfBlock.isEmpty())
-    		  bridgedInterfaces.add(new BridgedIfStringToBridgedIf().apply(bridgedIfBlock));
-      }
-      return bridgedInterfaces;
-   }
-
-   private class IsActiveBridgedInterface implements Predicate<BridgedIf> {
-
-      private NetworkInterface networkInterface;
-
-      public IsActiveBridgedInterface(NetworkInterface networkInterface) {
-         this.networkInterface = networkInterface;
-      }
-
-      @Override
-      public boolean apply(BridgedIf bridgedInterface) {
-         try {
-            return bridgedInterface.getName().startsWith(networkInterface.getDisplayName()) &&
-            		bridgedInterface.getStatus().equals("Up") &&
-            		networkInterface.isUp() && 
-            		!networkInterface.isLoopback();
-         } catch (SocketException e) {
-            logger.error(e, "Problem in listing network interfaces.");
-            throw Throwables.propagate(e);
-         }
-      }
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/75178c77/virtualbox/src/main/java/org/jclouds/virtualbox/functions/SendScancodes.java
----------------------------------------------------------------------
diff --git a/virtualbox/src/main/java/org/jclouds/virtualbox/functions/SendScancodes.java b/virtualbox/src/main/java/org/jclouds/virtualbox/functions/SendScancodes.java
deleted file mode 100644
index e5929c6..0000000
--- a/virtualbox/src/main/java/org/jclouds/virtualbox/functions/SendScancodes.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF 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.virtualbox.functions;
-
-import static com.google.common.base.Predicates.in;
-import static com.google.common.collect.Iterables.any;
-import static com.google.common.collect.Lists.partition;
-import static org.jclouds.compute.reference.ComputeServiceConstants.COMPUTE_LOGGER;
-import static org.jclouds.virtualbox.settings.KeyboardScancodes.SPECIAL_KEYBOARD_BUTTON_MAP_LIST;
-
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
-import javax.annotation.Resource;
-import javax.inject.Named;
-
-import org.jclouds.logging.Logger;
-import org.virtualbox_4_2.ISession;
-
-import com.google.common.base.Function;
-import com.google.common.util.concurrent.Uninterruptibles;
-
-class SendScancodes implements Function<ISession, Void> {
-
-   @Resource
-   @Named(COMPUTE_LOGGER)
-   protected Logger logger = Logger.NULL;
-
-   private static final int MAX_SIZE = 30;
-
-   private final List<Integer> scancodes;
-
-   public SendScancodes(List<Integer> scancodes) {
-      this.scancodes = scancodes;
-   }
-
-   @Override
-   public Void apply(ISession iSession) {
-      for (List<Integer> maxOrLess : partition(scancodes, MAX_SIZE)) {
-         long codesSent = iSession.getConsole().getKeyboard().putScancodes(maxOrLess);
-         logger.debug("List of scancodes sent: ", maxOrLess);
-         assert codesSent == maxOrLess.size();
-         if (any(maxOrLess, in(SPECIAL_KEYBOARD_BUTTON_MAP_LIST.values()))) {
-            // in case of special keystroke we assume more time needed than normal (page refresh)
-            Uninterruptibles.sleepUninterruptibly(500, TimeUnit.MILLISECONDS);
-         } else {
-            Uninterruptibles.sleepUninterruptibly(250, TimeUnit.MILLISECONDS);
-         }
-      }
-      return null;
-   }
-
-   @Override
-   public String toString() {
-      return "sendScancodes(" + scancodes + ")";
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/75178c77/virtualbox/src/main/java/org/jclouds/virtualbox/functions/StringToKeyCode.java
----------------------------------------------------------------------
diff --git a/virtualbox/src/main/java/org/jclouds/virtualbox/functions/StringToKeyCode.java b/virtualbox/src/main/java/org/jclouds/virtualbox/functions/StringToKeyCode.java
deleted file mode 100644
index 3c9af94..0000000
--- a/virtualbox/src/main/java/org/jclouds/virtualbox/functions/StringToKeyCode.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF 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.virtualbox.functions;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.jclouds.virtualbox.settings.KeyboardScancodes;
-
-import com.google.common.base.Function;
-import com.google.common.base.Splitter;
-import com.google.common.collect.Lists;
-
-public class StringToKeyCode implements Function<String, List<Integer>> {
-
-   @Override
-   public List<Integer> apply(String subsequence) {
-	   return stringToKeycode(subsequence);
-   }
-   
-   private List<Integer> stringToKeycode(String s) {
-      if (containsSpecialCharacter(s)) {
-         return transformSpecialCharIntoKeycodes(s);
-      } else {
-         return transformStandardCharacterIntoKeycodes(s);
-      }
-   }
-   
-   private List<Integer> transformStandardCharacterIntoKeycodes(String s) {
-      List<Integer> values = Lists.newArrayList();
-      for (String digit : Splitter.fixedLength(1).split(s)) {
-         Collection<Integer> hex = KeyboardScancodes.NORMAL_KEYBOARD_BUTTON_MAP_LIST.get(digit);
-         if (hex != null)
-            values.addAll(hex);
-      }
-      values.addAll(KeyboardScancodes.SPECIAL_KEYBOARD_BUTTON_MAP_LIST.get("<Spacebar>"));
-      return values;
-   }
-
-   private List<Integer> transformSpecialCharIntoKeycodes(String s) {
-      List<Integer> values = Lists.newArrayList();
-      for (String special : s.split("<")) {
-         Collection<Integer> value = KeyboardScancodes.SPECIAL_KEYBOARD_BUTTON_MAP_LIST.get("<" + special);
-         if (value != null)
-            values.addAll(value);
-      }
-      return values;
-   }
-
-   private boolean containsSpecialCharacter(String s) {
-      return s.startsWith("<");
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/75178c77/virtualbox/src/main/java/org/jclouds/virtualbox/functions/TakeSnapshotIfNotAlreadyAttached.java
----------------------------------------------------------------------
diff --git a/virtualbox/src/main/java/org/jclouds/virtualbox/functions/TakeSnapshotIfNotAlreadyAttached.java b/virtualbox/src/main/java/org/jclouds/virtualbox/functions/TakeSnapshotIfNotAlreadyAttached.java
deleted file mode 100644
index e7dad2b..0000000
--- a/virtualbox/src/main/java/org/jclouds/virtualbox/functions/TakeSnapshotIfNotAlreadyAttached.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF 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.virtualbox.functions;
-
-import java.util.concurrent.TimeUnit;
-
-import org.jclouds.logging.Logger;
-import org.virtualbox_4_2.IMachine;
-import org.virtualbox_4_2.IProgress;
-import org.virtualbox_4_2.ISession;
-import org.virtualbox_4_2.ISnapshot;
-import org.virtualbox_4_2.MachineState;
-import org.virtualbox_4_2.VirtualBoxManager;
-
-import com.google.common.base.Function;
-import com.google.common.base.Supplier;
-import com.google.common.base.Throwables;
-import com.google.common.util.concurrent.Uninterruptibles;
-
-public class TakeSnapshotIfNotAlreadyAttached implements Function<IMachine, ISnapshot> {
-
-   private Supplier<VirtualBoxManager> manager;
-   private String snapshotName;
-   private String snapshotDesc;
-   private Logger logger;
-
-   public TakeSnapshotIfNotAlreadyAttached(Supplier<VirtualBoxManager> manager, String snapshotName,
-            String snapshotDesc, Logger logger) {
-      this.manager = manager;
-      this.snapshotName = snapshotName;
-      this.snapshotDesc = snapshotDesc;
-      this.logger = logger;
-   }
-
-   @Override
-   public ISnapshot apply(IMachine machine) {
-      // Snapshot a machine
-      ISession session = null;
-      ISnapshot snap = machine.getCurrentSnapshot();
-
-      if (snap == null) {
-         try {
-            session = manager.get().openMachineSession(machine);
-            int retries = 10;
-            while (true) {
-               try {
-
-                  // running machines need to be pause before a snapshot can be taken
-                  // due to a vbox bug see https://www.virtualbox.org/ticket/9255
-                  boolean paused = false;
-                  if (machine.getState() == MachineState.Running) {
-                     session.getConsole().pause();
-                     paused = true;
-                  }
-
-                  IProgress progress = session.getConsole().takeSnapshot(snapshotName, snapshotDesc);
-                  progress.waitForCompletion(-1);
-
-                  if (paused) {
-                     session.getConsole().resume();
-                  }
-
-                  snap = machine.getCurrentSnapshot();
-                  logger.debug("<< snapshot(%s) with description(%s) taken from master(%s)", snapshotName, snapshotDesc,
-                           machine.getName());
-                  break;
-               } catch (Exception e) {
-                  if (e.getMessage().contains("VirtualBox error: The object is not ready")
-                           || e.getMessage().contains("This machine does not have any snapshots")) {
-                     retries--;
-                     if (retries == 0) {
-                        logger.error(e,
-                                 "Problem creating snapshot (too many retries) %s (description: %s) from machine %s",
-                                 snapshotName, snapshotDesc, machine.getName());
-                        throw Throwables.propagate(e);
-                     }
-                     Uninterruptibles.sleepUninterruptibly(1, TimeUnit.SECONDS);
-                     continue;
-                  }
-                  logger.error(e, "Problem creating snapshot %s (description: %s) from machine %s", snapshotName,
-                           snapshotDesc, machine.getName());
-                  throw Throwables.propagate(e);
-               }
-            }
-         } catch (Exception e) {
-            Throwables.propagate(e);
-         } finally {
-            if (session != null) {
-               manager.get().closeMachineSession(session);
-            }
-         }
-
-      }
-      return snap;
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/75178c77/virtualbox/src/main/java/org/jclouds/virtualbox/functions/YamlImagesFromFileConfig.java
----------------------------------------------------------------------
diff --git a/virtualbox/src/main/java/org/jclouds/virtualbox/functions/YamlImagesFromFileConfig.java b/virtualbox/src/main/java/org/jclouds/virtualbox/functions/YamlImagesFromFileConfig.java
deleted file mode 100644
index 0415ad9..0000000
--- a/virtualbox/src/main/java/org/jclouds/virtualbox/functions/YamlImagesFromFileConfig.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF 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.virtualbox.functions;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.io.File;
-import java.io.IOException;
-
-import javax.inject.Inject;
-import javax.inject.Named;
-
-import org.jclouds.util.Strings2;
-import org.jclouds.virtualbox.config.VirtualBoxConstants;
-
-import com.google.common.base.Charsets;
-import com.google.common.base.Supplier;
-import com.google.common.io.Files;
-
-/**
- * A supplier for vbox yaml config that reads a yaml whose path is stored under
- * VirtualBoxConstants.VIRTUALBOX_IMAGES_DESCRIPTOR.
- */
-public class YamlImagesFromFileConfig implements Supplier<String> {
-
-   private String yamlFilePath;
-
-   @Inject
-   public YamlImagesFromFileConfig(@Named(VirtualBoxConstants.VIRTUALBOX_IMAGES_DESCRIPTOR) String yamlFilePath) {
-      this.yamlFilePath = yamlFilePath;
-   }
-
-   @Override
-   public String get() {
-      try {
-         File yamlFile = new File(yamlFilePath);
-         String yamlDesc = null;
-         // if the yaml file does not exist just use default-images.yaml
-         if (!yamlFile.exists()) {
-            yamlDesc = Strings2.toStringAndClose(getClass().getResourceAsStream("/default-images.yaml"));
-         } else {
-            yamlDesc = Files.toString(yamlFile, Charsets.UTF_8);
-         }
-         checkNotNull(yamlDesc, "yaml descriptor");
-         return yamlDesc;
-      } catch (IOException e) {
-         throw new RuntimeException("error reading yaml file");
-      }
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/75178c77/virtualbox/src/main/java/org/jclouds/virtualbox/functions/admin/FileDownloadFromURI.java
----------------------------------------------------------------------
diff --git a/virtualbox/src/main/java/org/jclouds/virtualbox/functions/admin/FileDownloadFromURI.java b/virtualbox/src/main/java/org/jclouds/virtualbox/functions/admin/FileDownloadFromURI.java
deleted file mode 100644
index f9b8a14..0000000
--- a/virtualbox/src/main/java/org/jclouds/virtualbox/functions/admin/FileDownloadFromURI.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF 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.virtualbox.functions.admin;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.jclouds.util.Closeables2.closeQuietly;
-import static org.jclouds.virtualbox.config.VirtualBoxConstants.VIRTUALBOX_WORKINGDIR;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URI;
-
-import javax.annotation.Resource;
-import javax.inject.Inject;
-import javax.inject.Named;
-
-import org.jclouds.compute.reference.ComputeServiceConstants;
-import org.jclouds.javax.annotation.Nullable;
-import org.jclouds.logging.Logger;
-import org.jclouds.rest.HttpClient;
-
-import com.google.common.base.Function;
-import com.google.common.base.Throwables;
-import com.google.common.io.Files;
-
-public class FileDownloadFromURI implements Function<URI, File> {
-
-   @Resource
-   @Named(ComputeServiceConstants.COMPUTE_LOGGER)
-   protected Logger logger = Logger.NULL;
-
-   private final HttpClient client;
-   private final String isosDir;
-
-   @Inject
-   public FileDownloadFromURI(HttpClient client, @Named(VIRTUALBOX_WORKINGDIR) String workingDir) {
-      this.client = client;
-      this.isosDir = workingDir + File.separator + "isos";
-   }
-
-   @Override
-   public File apply(@Nullable URI input) {
-      final File file = new File(isosDir, new File(input.getPath()).getName());
-      try {
-         if (!file.exists()) {
-            final InputStream inputStream = client.get(input);
-            checkNotNull(inputStream, "%s not found", input);
-            try {
-               Files.asByteSink(file).writeFrom(inputStream);
-               return file;
-            } catch (FileNotFoundException e) {
-               logger.error(e, "File %s could not be found", file.getPath());
-            } catch (IOException e) {
-               logger.error(e, "Error when downloading file %s", input.toString());
-            } finally {
-               closeQuietly(inputStream);
-            }
-            return null;
-         } else {
-            logger.debug("File %s already exists. Skipping download", file.getPath());
-            return file;
-         }
-      } catch (Exception e) {
-         throw Throwables.propagate(e);
-      }
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/75178c77/virtualbox/src/main/java/org/jclouds/virtualbox/functions/admin/ImagesToYamlImagesFromYamlDescriptor.java
----------------------------------------------------------------------
diff --git a/virtualbox/src/main/java/org/jclouds/virtualbox/functions/admin/ImagesToYamlImagesFromYamlDescriptor.java b/virtualbox/src/main/java/org/jclouds/virtualbox/functions/admin/ImagesToYamlImagesFromYamlDescriptor.java
deleted file mode 100644
index 5159f24..0000000
--- a/virtualbox/src/main/java/org/jclouds/virtualbox/functions/admin/ImagesToYamlImagesFromYamlDescriptor.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF 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.virtualbox.functions.admin;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-
-import java.util.List;
-import java.util.Map;
-
-import javax.inject.Inject;
-import javax.inject.Singleton;
-
-import org.jclouds.compute.domain.Image;
-import org.jclouds.virtualbox.domain.YamlImage;
-import org.jclouds.virtualbox.functions.YamlImagesFromFileConfig;
-import org.yaml.snakeyaml.Loader;
-import org.yaml.snakeyaml.TypeDescription;
-import org.yaml.snakeyaml.Yaml;
-import org.yaml.snakeyaml.constructor.Constructor;
-
-import com.google.common.base.Supplier;
-import com.google.common.collect.Maps;
-
-@Singleton
-public class ImagesToYamlImagesFromYamlDescriptor implements Supplier<Map<Image, YamlImage>> {
-
-   private String yamlDescriptor;
-
-   @Inject
-   public ImagesToYamlImagesFromYamlDescriptor(YamlImagesFromFileConfig yamlDescriptorSupplier) {
-      this.yamlDescriptor = yamlDescriptorSupplier.get();
-      checkNotNull(yamlDescriptor, "yaml descriptor");
-      checkState(!yamlDescriptor.equals(""), "yaml descriptor is empty");
-   }
-
-   /**
-    * Type-safe config class for YAML
-    * 
-    */
-   public static class Config {
-      public List<YamlImage> images;
-   }
-
-   @Override
-   public Map<Image, YamlImage> get() {
-
-      Constructor constructor = new Constructor(Config.class);
-
-      TypeDescription imageDesc = new TypeDescription(YamlImage.class);
-      imageDesc.putListPropertyType("images", String.class);
-      constructor.addTypeDescription(imageDesc);
-
-      // Issue 855: testng is rev-locking us to snakeyaml 1.6
-      // we have to use old constructor until this is fixed
-      Yaml yaml = new Yaml(new Loader(constructor));
-      Config config = (Config) yaml.load(yamlDescriptor);
-      checkState(config != null, "missing config: class");
-      checkState(config.images != null, "missing images: collection");
-
-      Map<Image, YamlImage> backingMap = Maps.newLinkedHashMap();
-      for (YamlImage yamlImage : config.images) {
-         backingMap.put(YamlImage.toImage.apply(yamlImage), yamlImage);
-      }
-      return backingMap;
-   }
-
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/75178c77/virtualbox/src/main/java/org/jclouds/virtualbox/functions/admin/PreseedCfgServer.java
----------------------------------------------------------------------
diff --git a/virtualbox/src/main/java/org/jclouds/virtualbox/functions/admin/PreseedCfgServer.java b/virtualbox/src/main/java/org/jclouds/virtualbox/functions/admin/PreseedCfgServer.java
deleted file mode 100644
index 4f5d410..0000000
--- a/virtualbox/src/main/java/org/jclouds/virtualbox/functions/admin/PreseedCfgServer.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF 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.virtualbox.functions.admin;
-
-import java.io.IOException;
-import java.net.URI;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.eclipse.jetty.server.Request;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.handler.AbstractHandler;
-
-import com.google.common.base.Throwables;
-
-/**
- * Sets up jetty so that it can serve the preseed.cfg file to automate master creation.
- */
-public class PreseedCfgServer {
-
-   private Server jetty;
-
-   public void start(String preconfigurationUrl, final String preseedCfg) {
-      this.jetty = new Server(URI.create(preconfigurationUrl).getPort());
-      try {
-         // since we're only serving the preseed.cfg file respond to all requests with it
-         jetty.setHandler(new AbstractHandler() {
-            @Override
-            public void handle(String target, Request baseRequest, HttpServletRequest request,
-                     HttpServletResponse response) throws IOException, ServletException {
-               response.setContentType("text/plain;charset=utf-8");
-               response.setStatus(HttpServletResponse.SC_OK);
-               baseRequest.setHandled(true);
-               response.getWriter().println(preseedCfg);
-            }
-         });
-         jetty.start();
-      } catch (Exception e) {
-         throw Throwables.propagate(e);
-      }
-   }
-
-   public void stop() {
-      try {
-         if (jetty != null) {
-            jetty.stop();
-         }
-      } catch (Exception e) {
-         throw Throwables.propagate(e);
-      }
-   }
-
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/75178c77/virtualbox/src/main/java/org/jclouds/virtualbox/functions/admin/StartVBoxIfNotAlreadyRunning.java
----------------------------------------------------------------------
diff --git a/virtualbox/src/main/java/org/jclouds/virtualbox/functions/admin/StartVBoxIfNotAlreadyRunning.java b/virtualbox/src/main/java/org/jclouds/virtualbox/functions/admin/StartVBoxIfNotAlreadyRunning.java
deleted file mode 100644
index 8324838..0000000
--- a/virtualbox/src/main/java/org/jclouds/virtualbox/functions/admin/StartVBoxIfNotAlreadyRunning.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF 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.virtualbox.functions.admin;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-import static org.jclouds.compute.options.RunScriptOptions.Builder.runAsRoot;
-import static org.jclouds.scriptbuilder.domain.Statements.exec;
-import static org.jclouds.scriptbuilder.domain.Statements.findPid;
-import static org.jclouds.scriptbuilder.domain.Statements.kill;
-
-import java.net.URI;
-import java.util.List;
-
-import javax.annotation.PostConstruct;
-import javax.annotation.Resource;
-import javax.inject.Inject;
-import javax.inject.Named;
-import javax.inject.Singleton;
-
-import org.jclouds.compute.callables.RunScriptOnNode.Factory;
-import org.jclouds.compute.domain.ExecResponse;
-import org.jclouds.compute.domain.NodeMetadata;
-import org.jclouds.compute.reference.ComputeServiceConstants;
-import org.jclouds.location.Provider;
-import org.jclouds.logging.Logger;
-import org.jclouds.scriptbuilder.domain.Statement;
-import org.jclouds.scriptbuilder.domain.StatementList;
-import org.jclouds.virtualbox.functions.HardcodedHostToHostNodeMetadata;
-import org.jclouds.virtualbox.predicates.RetryIfSocketNotYetOpen;
-import org.virtualbox_4_2.SessionState;
-import org.virtualbox_4_2.VirtualBoxManager;
-
-import com.google.common.base.Function;
-import com.google.common.base.Supplier;
-import com.google.common.collect.ImmutableList;
-import com.google.common.net.HostAndPort;
-import com.google.common.util.concurrent.UncheckedTimeoutException;
-
-@Singleton
-public class StartVBoxIfNotAlreadyRunning implements Supplier<VirtualBoxManager> {
-
-   @Resource
-   @Named(ComputeServiceConstants.COMPUTE_LOGGER)
-   protected Logger logger = Logger.NULL;
-
-   private final Factory runScriptOnNodeFactory;
-   private final RetryIfSocketNotYetOpen socketTester;
-   private final Supplier<NodeMetadata> host;
-   private final Supplier<URI> providerSupplier;
-   private final Function<Supplier<NodeMetadata>, VirtualBoxManager> managerForNode;
-   private transient VirtualBoxManager manager;
-   private final HardcodedHostToHostNodeMetadata hardcodedHostToHostNodeMetadata;
-
-   // the functions and suppliers here are to ensure we don't do heavy i/o in injection
-   @Inject
-   public StartVBoxIfNotAlreadyRunning(Function<Supplier<NodeMetadata>, VirtualBoxManager> managerForNode,
-         Factory runScriptOnNodeFactory, RetryIfSocketNotYetOpen socketTester, Supplier<NodeMetadata> host,
-         @Provider Supplier<URI> providerSupplier, HardcodedHostToHostNodeMetadata hardcodedHostToHostNodeMetadata) {
-      this.runScriptOnNodeFactory = checkNotNull(runScriptOnNodeFactory, "runScriptOnNodeFactory");
-      this.socketTester = checkNotNull(socketTester, "socketTester");
-      this.socketTester.seconds(3L);
-      this.host = checkNotNull(host, "host");
-      this.providerSupplier = checkNotNull(providerSupplier, "endpoint to virtualbox websrvd is needed");
-      this.managerForNode = checkNotNull(managerForNode, "managerForNode");
-      this.hardcodedHostToHostNodeMetadata = hardcodedHostToHostNodeMetadata;
-   }
-
-   @PostConstruct
-   public void start() {
-      URI provider = providerSupplier.get();
-      NodeMetadata hostNodeMetadata = hardcodedHostToHostNodeMetadata.apply(host.get());
-
-      if (!socketTester.apply(HostAndPort.fromParts(provider.getHost(), provider.getPort()))) {
-         logger.debug("disabling password access");
-         runScriptOnNodeFactory
-               .create(hostNodeMetadata, exec("VBoxManage setproperty websrvauthlibrary null"),
-                     runAsRoot(false).wrapInInitScript(false)).init().call();
-
-         logger.debug(">> starting vboxwebsrv");
-         String vboxwebsrv = "vboxwebsrv -t0 -v -b -H " + providerSupplier.get().getHost();
-         runScriptOnNodeFactory
-               .create(hostNodeMetadata, exec(vboxwebsrv),
-                     runAsRoot(false).wrapInInitScript(false).blockOnComplete(false).nameTask("vboxwebsrv")).init()
-               .call();
-
-         if (!socketTester.apply(HostAndPort.fromParts(provider.getHost(), provider.getPort()))) {
-            throw new UncheckedTimeoutException(String.format("could not connect to virtualbox at %s", provider));
-         }
-      }
-
-      manager = managerForNode.apply(host);
-      manager.connect(provider.toASCIIString(), "", "");
-      if (logger.isDebugEnabled())
-         if (manager.getSessionObject().getState() != SessionState.Unlocked)
-            logger.warn("manager is not in unlocked state " + manager.getSessionObject().getState());
-
-   }
-
-   public void cleanUpHost() {
-      // kill previously started vboxwebsrv (possibly dirty session)
-      URI provider = providerSupplier.get();
-      NodeMetadata hostNodeMetadata = hardcodedHostToHostNodeMetadata.apply(host.get());
-      List<Statement> statements = new ImmutableList.Builder<Statement>()
-            .add(findPid("vboxwebsrv"))
-            .add(kill()).build();
-      StatementList statementList = new StatementList(statements);
-
-      if (socketTester.apply(HostAndPort.fromParts(provider.getHost(), provider.getPort()))) {
-         logger.debug(String.format("shutting down previously started vboxwewbsrv at %s", provider));
-         ExecResponse execResponse = runScriptOnNodeFactory.create(hostNodeMetadata, statementList, runAsRoot(false))
-               .init().call();
-         if (execResponse.getExitStatus() != 0)
-            throw new RuntimeException(String.format("Cannot shutdown a running vboxwebsrv at %s. ExecResponse: %s", provider, execResponse));
-      }
-   }
-
-   @Override
-   public VirtualBoxManager get() {
-      checkState(manager != null, "VirtualBoxManager is not initialised");
-      return manager;
-   }
-
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/75178c77/virtualbox/src/main/java/org/jclouds/virtualbox/functions/admin/UnregisterMachineIfExistsAndDeleteItsMedia.java
----------------------------------------------------------------------
diff --git a/virtualbox/src/main/java/org/jclouds/virtualbox/functions/admin/UnregisterMachineIfExistsAndDeleteItsMedia.java b/virtualbox/src/main/java/org/jclouds/virtualbox/functions/admin/UnregisterMachineIfExistsAndDeleteItsMedia.java
deleted file mode 100644
index 4437c79..0000000
--- a/virtualbox/src/main/java/org/jclouds/virtualbox/functions/admin/UnregisterMachineIfExistsAndDeleteItsMedia.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF 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.virtualbox.functions.admin;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.collect.Iterables.filter;
-import static com.google.common.collect.Iterables.transform;
-
-import java.util.List;
-
-import javax.annotation.Resource;
-import javax.inject.Named;
-import javax.inject.Singleton;
-
-import org.jclouds.compute.reference.ComputeServiceConstants;
-import org.jclouds.logging.Logger;
-import org.jclouds.virtualbox.domain.ErrorCode;
-import org.jclouds.virtualbox.domain.StorageController;
-import org.jclouds.virtualbox.domain.VmSpec;
-import org.virtualbox_4_2.DeviceType;
-import org.virtualbox_4_2.IMachine;
-import org.virtualbox_4_2.IMedium;
-import org.virtualbox_4_2.IProgress;
-import org.virtualbox_4_2.VBoxException;
-
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-import com.google.common.base.Throwables;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-
-@Singleton
-public class UnregisterMachineIfExistsAndDeleteItsMedia implements Function<IMachine, Void> {
-
-   @Resource
-   @Named(ComputeServiceConstants.COMPUTE_LOGGER)
-   protected Logger logger = Logger.NULL;
-
-   private final VmSpec vmSpec;
-
-   public UnregisterMachineIfExistsAndDeleteItsMedia(VmSpec vmSpec) {
-      this.vmSpec = vmSpec;
-   }
-
-   @Override
-   public Void apply(IMachine machine) {
-      List<IMedium> mediaToBeDeleted = ImmutableList.of();
-      try {
-         mediaToBeDeleted = machine.unregister(vmSpec.getCleanupMode());
-      } catch (VBoxException e) {
-         ErrorCode errorCode = ErrorCode.valueOf(e);
-         switch (errorCode) {
-            case VBOX_E_OBJECT_NOT_FOUND:
-               logger.debug("Machine %s does not exists, cannot unregister", vmSpec.getVmName());
-               break;
-            default:
-               throw e;
-         }
-      }
-
-      List<IMedium> filteredMediaToBeDeleted = Lists.newArrayList(transform(
-               filter(mediaToBeDeleted, new AutoDeleteHardDiskPredicate(vmSpec)), new DeleteChildrenOfMedium()));
-
-      if (!filteredMediaToBeDeleted.isEmpty()) {
-         try {
-            IProgress deletion = machine.delete(filteredMediaToBeDeleted);
-            deletion.waitForCompletion(-1);
-         } catch (Exception e) {
-            logger.error(e, "Problem in deleting the media attached to %s", machine.getName());
-            Throwables.propagate(e);
-         }
-      }
-
-      return null;
-   }
-
-   private static class AutoDeleteHardDiskPredicate implements Predicate<IMedium> {
-
-      private VmSpec vmSpec;
-
-      public AutoDeleteHardDiskPredicate(VmSpec vmSpec) {
-         this.vmSpec = vmSpec;
-      }
-
-      @Override
-      public boolean apply(IMedium medium) {
-         for (StorageController controller : vmSpec.getControllers()) {
-            if (controller.getHardDisk(medium.getName()).isAutoDelete())
-               return true;
-         }
-         return false;
-      }
-
-   };
-
-   private static class DeleteChildrenOfMedium implements Function<IMedium, IMedium> {
-      @Override
-      public IMedium apply(IMedium medium) {
-         checkNotNull(medium.getChildren());
-         if (medium.getDeviceType().equals(DeviceType.HardDisk)) {
-            for (IMedium child : medium.getChildren()) {
-               IProgress deletion = child.deleteStorage();
-               deletion.waitForCompletion(-1);
-            }
-         }
-         return medium;
-      }
-
-   };
-
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/75178c77/virtualbox/src/main/java/org/jclouds/virtualbox/functions/admin/UnregisterMachineIfExistsAndForceDeleteItsMedia.java
----------------------------------------------------------------------
diff --git a/virtualbox/src/main/java/org/jclouds/virtualbox/functions/admin/UnregisterMachineIfExistsAndForceDeleteItsMedia.java b/virtualbox/src/main/java/org/jclouds/virtualbox/functions/admin/UnregisterMachineIfExistsAndForceDeleteItsMedia.java
deleted file mode 100644
index 487bd9e..0000000
--- a/virtualbox/src/main/java/org/jclouds/virtualbox/functions/admin/UnregisterMachineIfExistsAndForceDeleteItsMedia.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF 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.virtualbox.functions.admin;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.collect.Iterables.transform;
-
-import java.util.List;
-
-import javax.annotation.Resource;
-import javax.inject.Named;
-import javax.inject.Singleton;
-
-import org.jclouds.compute.reference.ComputeServiceConstants;
-import org.jclouds.logging.Logger;
-import org.jclouds.virtualbox.domain.ErrorCode;
-import org.virtualbox_4_2.CleanupMode;
-import org.virtualbox_4_2.DeviceType;
-import org.virtualbox_4_2.IMachine;
-import org.virtualbox_4_2.IMedium;
-import org.virtualbox_4_2.IProgress;
-import org.virtualbox_4_2.VBoxException;
-
-import com.google.common.base.Function;
-import com.google.common.base.Throwables;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-
-@Singleton
-public class UnregisterMachineIfExistsAndForceDeleteItsMedia implements Function<IMachine, Void> {
-
-   @Resource
-   @Named(ComputeServiceConstants.COMPUTE_LOGGER)
-   protected Logger logger = Logger.NULL;
-
-   @Override
-   public Void apply(IMachine machine) {
-      List<IMedium> mediaToBeDeleted = ImmutableList.of();
-      try {
-         mediaToBeDeleted = machine.unregister(CleanupMode.Full);
-      } catch (VBoxException e) {
-         ErrorCode errorCode = ErrorCode.valueOf(e);
-         switch (errorCode) {
-            case VBOX_E_OBJECT_NOT_FOUND:
-               logger.debug("Machine %s does not exists, cannot unregister", machine.getName());
-               break;
-            default:
-               throw e;
-         }
-      }
-
-      List<IMedium> filteredMediaToBeDeleted = Lists.newArrayList(transform(mediaToBeDeleted,
-               new DeleteChildrenOfMedium()));
-      if (!filteredMediaToBeDeleted.isEmpty()) {
-         try {
-            IProgress deletion = machine.delete(filteredMediaToBeDeleted);
-            deletion.waitForCompletion(100);
-         } catch (Exception e) {
-            logger.error(e, "Problem in deleting the media attached to %s", machine.getName());
-            Throwables.propagate(e);
-         }
-      }
-
-      return null;
-   }
-
-   private class DeleteChildrenOfMedium implements Function<IMedium, IMedium> {
-      @Override
-      public IMedium apply(IMedium medium) {
-         checkNotNull(medium.getChildren());
-         if (medium.getDeviceType().equals(DeviceType.HardDisk)) {
-            for (IMedium child : medium.getChildren()) {
-               try {
-                  IProgress deletion = child.deleteStorage();
-                  deletion.waitForCompletion(-1);
-               } catch (Exception e) {
-                  // work around media that are still attached to other vm's. this can happen when a
-                  // running node is used to create a new image and then an attempt at deleting it
-                  // is made
-                  if (e.getMessage().contains("is still attached to the following")) {
-                     logger.warn("Media could not be deleted. Ignoring... [Message %s]", e.getMessage());
-                  }
-               }
-            }
-         }
-         return medium;
-      }
-
-   };
-
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/75178c77/virtualbox/src/main/java/org/jclouds/virtualbox/predicates/IMachinePredicates.java
----------------------------------------------------------------------
diff --git a/virtualbox/src/main/java/org/jclouds/virtualbox/predicates/IMachinePredicates.java b/virtualbox/src/main/java/org/jclouds/virtualbox/predicates/IMachinePredicates.java
deleted file mode 100644
index 3db5121..0000000
--- a/virtualbox/src/main/java/org/jclouds/virtualbox/predicates/IMachinePredicates.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF 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.virtualbox.predicates;
-
-import static com.google.common.base.Predicates.and;
-import static com.google.common.collect.Iterables.any;
-import static com.google.common.collect.Iterables.transform;
-import static org.jclouds.virtualbox.predicates.IMediumPredicates.deviceTypeEquals;
-import static org.jclouds.virtualbox.predicates.IMediumPredicates.hasParent;
-import static org.jclouds.virtualbox.predicates.IMediumPredicates.machineIdsContain;
-import static org.jclouds.virtualbox.util.IMediumAttachments.toMedium;
-import static org.virtualbox_4_2.DeviceType.HardDisk;
-
-import org.virtualbox_4_2.IMachine;
-import org.virtualbox_4_2.IMedium;
-
-import com.google.common.base.Predicate;
-
-public class IMachinePredicates {
-   /**
-    * TODO: andrea please explain
-    * 
-    */
-   static enum IsLinkedClone implements Predicate<IMachine> {
-      INSTANCE;
-
-      @SuppressWarnings("unchecked")
-      @Override
-      public boolean apply(IMachine machine) {
-         Iterable<IMedium> mediumsOnMachine = transform(machine.getMediumAttachments(), toMedium());
-         // TODO: previous impl walked the parent medium back to the child
-         // before checking machine ids. Determine if that extra walk was really
-         // necessary
-         return any(mediumsOnMachine, and(deviceTypeEquals(HardDisk), hasParent(), machineIdsContain(machine.getId())));
-      }
-
-      @Override
-      public String toString() {
-         return "isLinkedClone()";
-      }
-   }
-
-   public static Predicate<IMachine> isLinkedClone() {
-      return IsLinkedClone.INSTANCE;
-   }
-}