mirror of https://github.com/apache/jclouds.git
issue:384
This commit is contained in:
parent
edc1b10610
commit
64605cd744
|
@ -0,0 +1,42 @@
|
||||||
|
# Administation viewpoint
|
||||||
|
|
||||||
|
These steps are usually in charge of cloud provider, in this case it's up to you
|
||||||
|
|
||||||
|
The experiment assumes almost nothing: only a running Ubuntu 11.04 where java6 and maven3 are installed.
|
||||||
|
|
||||||
|
## Prepare your Master VM
|
||||||
|
By launching "VirtualboxAdministrationTest" an helper class to execute a number of preliminary steps needed to have a properly configured ubuntu box
|
||||||
|
and to create a golden template for your experiment.
|
||||||
|
|
||||||
|
The "VirtualboxAdministrationTest" helper will run these preliminary steps:
|
||||||
|
|
||||||
|
1. Create a working dir on 'user.home' called by default "jclouds-virtualbox-test"
|
||||||
|
(this value can be overwritten directly on the commandline using -Dtest.virtualbox.workingDir)
|
||||||
|
2. Install VBOX-OSE (available through ubuntu repo)
|
||||||
|
3. Download a VDI from [here](http://downloads.sourceforge.net/virtualboximage/centos-5.2-x86.7z) into your working dir
|
||||||
|
3. Install p7zip on your ubuntu machine, if missing
|
||||||
|
3. Extract the 7z archive into your working dir
|
||||||
|
4. Download VirtualBox Guest Additions ISO (tested with VBoxGuestAdditions_4.0.2-update-69551.iso) into "jclouds-virtualbox-test"
|
||||||
|
5. Disable login credential: $ VBoxManage setproperty websrvauthlibrary null
|
||||||
|
6. Start webservice with increasead timeout: $ /usr/bin/vboxwebsrv --timeout 10000 and then will:
|
||||||
|
- Clone originalDisk to clonedDisk in workingDir
|
||||||
|
- Set NAT on network interface eth0
|
||||||
|
- Set port forwarding localhost:2222->guest:22
|
||||||
|
- Create a VM in the the vbox default machine folder ("/user.home/VirtualBox VMs")
|
||||||
|
- Mount guest additions ISO
|
||||||
|
- Install guest additions
|
||||||
|
- Shutdown VM
|
||||||
|
- Remove port forwarding rule
|
||||||
|
- Remove NAT network interface
|
||||||
|
- Detach vdisk from VM template
|
||||||
|
|
||||||
|
At this stage, you can use your template as a master for your "private" cloud through VirtualBoxLiveTest
|
||||||
|
|
||||||
|
## Bootstrap your private cloud through VirtualBoxLiveTest helper
|
||||||
|
To use this helper, you have to specify the name of the VM (-Dtest.virtualbox.vmname=<VM-NAME>)
|
||||||
|
and choose the numberOfVirtualMachine you need using -Dtest.virtualbox.numberOfVirtualMachine=<#ofVMs>,
|
||||||
|
These VMs will be cloned starting from the master VM created before
|
||||||
|
|
||||||
|
It will create a "numberOfVirtualMachine" in a vbox default machine folder with 'VMName_i' name
|
||||||
|
|
||||||
|
NB: for perfomance reason, these VM will share the same disk (the template created at step 1) attached in "multiattach mode" (http://www.virtualbox.org/manual/ch05.html#hdimagewrites)
|
|
@ -0,0 +1,128 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
|
||||||
|
Copyright (C) 2011 Cloud Conscious, LLC <info@cloudconscious.com>
|
||||||
|
|
||||||
|
====================================================================
|
||||||
|
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.html
|
||||||
|
|
||||||
|
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.
|
||||||
|
====================================================================
|
||||||
|
-->
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<groupId>org.jclouds</groupId>
|
||||||
|
<artifactId>jclouds-project</artifactId>
|
||||||
|
<version>1.1.0-SNAPSHOT</version>
|
||||||
|
<relativePath>../../project/pom.xml</relativePath>
|
||||||
|
</parent>
|
||||||
|
<groupId>org.jclouds.api</groupId>
|
||||||
|
<artifactId>virtualbox</artifactId>
|
||||||
|
<name>jclouds components for a virtualbox provider</name>
|
||||||
|
<properties>
|
||||||
|
<test.virtualbox.endpoint>test:///default</test.virtualbox.endpoint>
|
||||||
|
<test.virtualbox.apiversion>1.0</test.virtualbox.apiversion>
|
||||||
|
<test.virtualbox.identity>FIXME</test.virtualbox.identity>
|
||||||
|
<test.virtualbox.credential>FIXME</test.virtualbox.credential>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<!-- bootstrapping: need to fetch the project POM -->
|
||||||
|
<repositories>
|
||||||
|
<repository>
|
||||||
|
<id>clojars.org</id>
|
||||||
|
<url>http://clojars.org/repo</url>
|
||||||
|
</repository>
|
||||||
|
</repositories>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.clojars.tbatchelli</groupId>
|
||||||
|
<artifactId>vboxjws</artifactId>
|
||||||
|
<version>4.0.2</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jclouds</groupId>
|
||||||
|
<artifactId>jclouds-core</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
<type>test-jar</type>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jclouds</groupId>
|
||||||
|
<artifactId>jclouds-compute</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jclouds</groupId>
|
||||||
|
<artifactId>jclouds-compute</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
<type>test-jar</type>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jclouds.driver</groupId>
|
||||||
|
<artifactId>jclouds-log4j</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jclouds.driver</groupId>
|
||||||
|
<artifactId>jclouds-jsch</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.jponge</groupId>
|
||||||
|
<artifactId>lzma-java</artifactId>
|
||||||
|
<version>1.2</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
|
<artifactId>jetty-security</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
<profiles>
|
||||||
|
<profile>
|
||||||
|
<id>live</id>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>integration</id>
|
||||||
|
<phase>integration-test</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>test</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<systemPropertyVariables>
|
||||||
|
<test.virtualbox.endpoint>${test.virtualbox.endpoint}</test.virtualbox.endpoint>
|
||||||
|
<test.virtualbox.apiversion>${test.virtualbox.apiversion}</test.virtualbox.apiversion>
|
||||||
|
<test.virtualbox.identity>${test.virtualbox.identity}</test.virtualbox.identity>
|
||||||
|
<test.virtualbox.credential>${test.virtualbox.credential}</test.virtualbox.credential>
|
||||||
|
</systemPropertyVariables>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</profile>
|
||||||
|
</profiles>
|
||||||
|
</project>
|
|
@ -0,0 +1,29 @@
|
||||||
|
package org.jclouds.virtualbox.experiment;
|
||||||
|
|
||||||
|
import org.eclipse.jetty.server.Handler;
|
||||||
|
import org.eclipse.jetty.server.Server;
|
||||||
|
import org.eclipse.jetty.server.handler.DefaultHandler;
|
||||||
|
import org.eclipse.jetty.server.handler.HandlerList;
|
||||||
|
import org.eclipse.jetty.server.handler.ResourceHandler;
|
||||||
|
import org.eclipse.jetty.util.log.Log;
|
||||||
|
|
||||||
|
public class FileServer {
|
||||||
|
public static void main(String[] args) throws Exception {
|
||||||
|
Server server = new Server(args.length == 0?80:Integer.parseInt(args[0]));
|
||||||
|
|
||||||
|
ResourceHandler resource_handler = new ResourceHandler();
|
||||||
|
resource_handler.setDirectoriesListed(true);
|
||||||
|
resource_handler.setWelcomeFiles(new String[]{ "index.html" });
|
||||||
|
|
||||||
|
resource_handler.setResourceBase(args.length == 2?args[1]:".");
|
||||||
|
Log.info("serving " + resource_handler.getBaseResource());
|
||||||
|
|
||||||
|
HandlerList handlers = new HandlerList();
|
||||||
|
handlers.setHandlers(new Handler[] { resource_handler, new DefaultHandler() });
|
||||||
|
server.setHandler(handlers);
|
||||||
|
|
||||||
|
server.start();
|
||||||
|
server.join();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,726 @@
|
||||||
|
package org.jclouds.virtualbox.experiment;
|
||||||
|
|
||||||
|
import static com.google.common.base.Throwables.propagate;
|
||||||
|
import static com.google.common.io.ByteStreams.copy;
|
||||||
|
import static com.google.common.io.Closeables.closeQuietly;
|
||||||
|
import static org.testng.Assert.assertEquals;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.net.HttpURLConnection;
|
||||||
|
import java.net.InetSocketAddress;
|
||||||
|
import java.net.MalformedURLException;
|
||||||
|
import java.net.Proxy;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.rmi.RemoteException;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
import org.jclouds.compute.domain.ExecResponse;
|
||||||
|
import org.jclouds.crypto.CryptoStreams;
|
||||||
|
import org.jclouds.domain.Credentials;
|
||||||
|
import org.jclouds.logging.log4j.config.Log4JLoggingModule;
|
||||||
|
import org.jclouds.net.IPSocket;
|
||||||
|
import org.jclouds.predicates.InetSocketAddressConnect;
|
||||||
|
import org.jclouds.predicates.RetryablePredicate;
|
||||||
|
import org.jclouds.ssh.SshClient;
|
||||||
|
import org.jclouds.ssh.jsch.config.JschSshClientModule;
|
||||||
|
import org.jclouds.util.Strings2;
|
||||||
|
import org.jclouds.virtualbox.experiment.settings.KeyboardScancodes;
|
||||||
|
import org.testng.annotations.AfterClass;
|
||||||
|
import org.testng.annotations.AfterMethod;
|
||||||
|
import org.testng.annotations.BeforeGroups;
|
||||||
|
import org.testng.annotations.BeforeMethod;
|
||||||
|
import org.testng.annotations.Optional;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
import org.virtualbox_4_0.AccessMode;
|
||||||
|
import org.virtualbox_4_0.DeviceType;
|
||||||
|
import org.virtualbox_4_0.IMachine;
|
||||||
|
import org.virtualbox_4_0.IMedium;
|
||||||
|
import org.virtualbox_4_0.IProgress;
|
||||||
|
import org.virtualbox_4_0.ISession;
|
||||||
|
import org.virtualbox_4_0.IStorageController;
|
||||||
|
import org.virtualbox_4_0.LockType;
|
||||||
|
import org.virtualbox_4_0.MachineState;
|
||||||
|
import org.virtualbox_4_0.NATProtocol;
|
||||||
|
import org.virtualbox_4_0.NetworkAdapterType;
|
||||||
|
import org.virtualbox_4_0.SessionState;
|
||||||
|
import org.virtualbox_4_0.StorageBus;
|
||||||
|
import org.virtualbox_4_0.VirtualBoxManager;
|
||||||
|
import org.virtualbox_4_0.jaxws.MediumVariant;
|
||||||
|
|
||||||
|
import com.google.common.base.Predicate;
|
||||||
|
import com.google.common.base.Throwables;
|
||||||
|
import com.google.common.io.Files;
|
||||||
|
import com.google.common.io.InputSupplier;
|
||||||
|
import com.google.inject.Guice;
|
||||||
|
import com.google.inject.Injector;
|
||||||
|
|
||||||
|
import org.eclipse.jetty.server.Handler;
|
||||||
|
import org.eclipse.jetty.server.Request;
|
||||||
|
import org.eclipse.jetty.server.Server;
|
||||||
|
import org.eclipse.jetty.server.handler.AbstractHandler;
|
||||||
|
import org.eclipse.jetty.server.handler.DefaultHandler;
|
||||||
|
import org.eclipse.jetty.server.handler.HandlerList;
|
||||||
|
import org.eclipse.jetty.server.handler.ResourceHandler;
|
||||||
|
import org.eclipse.jetty.util.log.Log;
|
||||||
|
|
||||||
|
|
||||||
|
@Test(groups = "live", testName = "virtualbox.VirtualboxAdministrationKickstartTest")
|
||||||
|
public class VirtualboxAdministrationKickstartTest {
|
||||||
|
|
||||||
|
protected String provider = "virtualbox";
|
||||||
|
protected String identity;
|
||||||
|
protected String credential;
|
||||||
|
protected String endpoint;
|
||||||
|
protected String apiversion;
|
||||||
|
protected String vmName;
|
||||||
|
|
||||||
|
VirtualBoxManager manager = VirtualBoxManager.createInstance("");
|
||||||
|
|
||||||
|
protected Injector injector;
|
||||||
|
protected Predicate<IPSocket> socketTester;
|
||||||
|
protected SshClient.Factory sshFactory;
|
||||||
|
|
||||||
|
protected String settingsFile; // Fully qualified path where the settings
|
||||||
|
protected String osTypeId; // Guest OS Type ID.
|
||||||
|
protected String vmId; // Machine UUID (optional).
|
||||||
|
protected boolean forceOverwrite;
|
||||||
|
protected String osUsername;
|
||||||
|
protected String osPassword;
|
||||||
|
protected String diskFormat;
|
||||||
|
|
||||||
|
protected String workingDir;
|
||||||
|
protected String originalDisk;
|
||||||
|
protected String clonedDisk;
|
||||||
|
|
||||||
|
protected String guestAdditionsDvd;
|
||||||
|
private String gaIsoUrl;
|
||||||
|
private String vboxwebsrvStartCommand;
|
||||||
|
|
||||||
|
private String gaIsoName;
|
||||||
|
private String hostUsername;
|
||||||
|
private String hostPassword;
|
||||||
|
private String installVboxOse;
|
||||||
|
private String distroIsoUrl;
|
||||||
|
private String distroIsoName;
|
||||||
|
private String distroDvd;
|
||||||
|
private String controllerIDE;
|
||||||
|
private String controllerSATA;
|
||||||
|
private String keyboardSequence;
|
||||||
|
private String admin_pwd;
|
||||||
|
private String vdiName;
|
||||||
|
private String preseedUrl;
|
||||||
|
|
||||||
|
protected Server server = null;
|
||||||
|
private InetSocketAddress testPort;
|
||||||
|
private String vboxManageCommand;
|
||||||
|
|
||||||
|
|
||||||
|
protected void setupCredentials() {
|
||||||
|
identity = System.getProperty("test." + provider + ".identity",
|
||||||
|
"administrator");
|
||||||
|
credential = System.getProperty("test." + provider + ".credential",
|
||||||
|
"12345");
|
||||||
|
endpoint = System.getProperty("test." + provider + ".endpoint",
|
||||||
|
"http://localhost:18083/");
|
||||||
|
apiversion = System.getProperty("test." + provider + ".apiversion");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setupConfigurationProperties() {
|
||||||
|
|
||||||
|
admin_pwd = System.getProperty("test." + provider + ".admin_pwd",
|
||||||
|
"password");
|
||||||
|
// OS
|
||||||
|
osUsername = System.getProperty("test." + provider + ".osusername",
|
||||||
|
"toor");
|
||||||
|
osPassword = System.getProperty("test." + provider + ".ospassword",
|
||||||
|
"password");
|
||||||
|
controllerIDE = System.getProperty("test." + provider
|
||||||
|
+ ".controllerIde", "IDE Controller");
|
||||||
|
controllerSATA = System.getProperty("test." + provider
|
||||||
|
+ ".controllerSata", "SATA Controller");
|
||||||
|
// Create disk If the @a format attribute is empty or null then the
|
||||||
|
// default storage format specified by
|
||||||
|
// ISystemProperties#defaultHardDiskFormat
|
||||||
|
diskFormat = System.getProperty("test." + provider + ".diskformat", "");
|
||||||
|
|
||||||
|
// VBOX
|
||||||
|
settingsFile = null; // Fully qualified path where the settings file
|
||||||
|
osTypeId = System.getProperty("test." + provider + ".osTypeId", ""); // Guest
|
||||||
|
// OS
|
||||||
|
// Type
|
||||||
|
// ID.
|
||||||
|
vmId = System.getProperty("test." + provider + ".vmId", null); // Machine
|
||||||
|
// UUID
|
||||||
|
// (optional).
|
||||||
|
forceOverwrite = true; // If true, an existing machine settings file
|
||||||
|
// will be overwritten.
|
||||||
|
vmName = System.getProperty("test." + provider + ".vmname",
|
||||||
|
"jclouds-virtualbox-kickstart-admin");
|
||||||
|
|
||||||
|
workingDir = System.getProperty("user.home")
|
||||||
|
+ File.separator
|
||||||
|
+ System.getProperty("test." + provider + ".workingDir",
|
||||||
|
"jclouds-virtualbox-test");
|
||||||
|
if (new File(workingDir).mkdir());
|
||||||
|
vdiName = System.getProperty("test." + provider + ".vdiName",
|
||||||
|
"centos-5.2-x86.7z");
|
||||||
|
gaIsoName = System.getProperty("test." + provider + ".gaIsoName",
|
||||||
|
"VBoxGuestAdditions_4.0.2-update-69551.iso");
|
||||||
|
gaIsoUrl = System.getProperty("test." + provider + ".gaIsoUrl",
|
||||||
|
"http://download.virtualbox.org/virtualbox/4.0.2/VBoxGuestAdditions_4.0.2-update-69551.iso");
|
||||||
|
|
||||||
|
distroIsoName = System.getProperty("test." + provider
|
||||||
|
+ ".distroIsoName", "ubuntu-11.04-server-i386.iso");
|
||||||
|
distroIsoUrl = System
|
||||||
|
.getProperty("test." + provider + ".distroIsoUrl",
|
||||||
|
"http://releases.ubuntu.com/11.04/ubuntu-11.04-server-i386.iso");
|
||||||
|
|
||||||
|
originalDisk = workingDir
|
||||||
|
+ File.separator
|
||||||
|
+ "VDI"
|
||||||
|
+ File.separator
|
||||||
|
+ System.getProperty("test." + provider + ".originalDisk",
|
||||||
|
"centos-5.2-x86.vdi");
|
||||||
|
clonedDisk = workingDir
|
||||||
|
+ File.separator
|
||||||
|
+ System.getProperty("test." + provider + ".clonedDisk",
|
||||||
|
"template.vdi");
|
||||||
|
guestAdditionsDvd = workingDir
|
||||||
|
+ File.separator
|
||||||
|
+ System.getProperty("test." + provider + ".guestAdditionsDvd",
|
||||||
|
"VBoxGuestAdditions_4.0.2-update-69551.iso");
|
||||||
|
|
||||||
|
distroDvd = workingDir
|
||||||
|
+ File.separator
|
||||||
|
+ System.getProperty("test." + provider + ".distroDvd",
|
||||||
|
distroIsoName);
|
||||||
|
|
||||||
|
preseedUrl = System
|
||||||
|
.getProperty(
|
||||||
|
"test." + provider + ".preseedurl", "http://dl.dropbox.com/u/693111/preseed.cfg");
|
||||||
|
keyboardSequence = System
|
||||||
|
.getProperty(
|
||||||
|
"test." + provider + ".keyboardSequence",
|
||||||
|
"<Esc> <Esc> <Enter> "
|
||||||
|
//+ "/install/vmlinuz noapic preseed/url=http://192.168.1.12/src/test/resources/preseed.cfg "
|
||||||
|
+ "/install/vmlinuz noapic preseed/url=" + preseedUrl + " "
|
||||||
|
+ "debian-installer=en_US auto locale=en_US kbd-chooser/method=us "
|
||||||
|
+ "hostname=" + vmName + " "
|
||||||
|
+ "fb=false debconf/frontend=noninteractive "
|
||||||
|
+ "keyboard-configuration/layout=USA keyboard-configuration/variant=USA console-setup/ask_detect=false "
|
||||||
|
+ "initrd=/install/initrd.gz -- <Enter>");
|
||||||
|
|
||||||
|
vboxwebsrvStartCommand = System.getProperty("test." + provider
|
||||||
|
+ ".vboxwebsrvStartCommand", "/usr/bin/vboxwebsrv.exe");
|
||||||
|
vboxManageCommand = System
|
||||||
|
.getProperty(
|
||||||
|
"test." + provider + ".vboxmanage", "VBoxManage");
|
||||||
|
if (!new File(distroDvd).exists()) {
|
||||||
|
try {
|
||||||
|
downloadFile(distroIsoUrl, workingDir, distroIsoName, null);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!new File(guestAdditionsDvd).exists()) {
|
||||||
|
try {
|
||||||
|
downloadFile(gaIsoUrl, workingDir, gaIsoName, null);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@BeforeGroups(groups = "live")
|
||||||
|
protected void setupClient() throws IOException, InterruptedException {
|
||||||
|
hostUsername = System.getProperty("test." + provider + ".hostusername", "toor");
|
||||||
|
hostPassword = System.getProperty("test." + provider + ".hostpassword",
|
||||||
|
"password");
|
||||||
|
|
||||||
|
injector = Guice.createInjector(new JschSshClientModule(),
|
||||||
|
new Log4JLoggingModule());
|
||||||
|
sshFactory = injector.getInstance(SshClient.Factory.class);
|
||||||
|
socketTester = new RetryablePredicate<IPSocket>(
|
||||||
|
new InetSocketAddressConnect(), 3600, 1, TimeUnit.SECONDS);
|
||||||
|
injector.injectMembers(socketTester);
|
||||||
|
|
||||||
|
setupCredentials();
|
||||||
|
setupConfigurationProperties();
|
||||||
|
|
||||||
|
installVbox();
|
||||||
|
// startup vbox web server
|
||||||
|
startupVboxWebServer(vboxwebsrvStartCommand);
|
||||||
|
|
||||||
|
// configure jetty HTTP server
|
||||||
|
try {
|
||||||
|
configureJettyServer();
|
||||||
|
} catch (Exception e) {
|
||||||
|
propagate(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void configureJettyServer() throws Exception {
|
||||||
|
Server server = new Server(8080);
|
||||||
|
|
||||||
|
ResourceHandler resource_handler = new ResourceHandler();
|
||||||
|
resource_handler.setDirectoriesListed(true);
|
||||||
|
resource_handler.setWelcomeFiles(new String[]{ "index.html" });
|
||||||
|
|
||||||
|
resource_handler.setResourceBase(".");
|
||||||
|
Log.info("serving " + resource_handler.getBaseResource());
|
||||||
|
|
||||||
|
HandlerList handlers = new HandlerList();
|
||||||
|
handlers.setHandlers(new Handler[] { resource_handler, new DefaultHandler() });
|
||||||
|
server.setHandler(handlers);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void installVbox() throws IOException, InterruptedException {
|
||||||
|
IPSocket socket = new IPSocket("127.0.0.1", 22);
|
||||||
|
socketTester.apply(socket);
|
||||||
|
SshClient client = sshFactory.create(socket, new Credentials(
|
||||||
|
hostUsername, hostPassword));
|
||||||
|
try {
|
||||||
|
client.connect();
|
||||||
|
client.exec("echo " + hostPassword + " | " + installVboxOse);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} finally {
|
||||||
|
if (client != null)
|
||||||
|
client.disconnect();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param command
|
||||||
|
* absolute path to command. For ubuntu 10.04:
|
||||||
|
* /usr/bin/vboxwebsrv
|
||||||
|
* @throws IOException
|
||||||
|
* @throws InterruptedException
|
||||||
|
*/
|
||||||
|
private void startupVboxWebServer(String command) throws IOException,
|
||||||
|
InterruptedException {
|
||||||
|
// Disable login credential: $
|
||||||
|
// rt.exec("VBoxManage setproperty websrvauthlibrary null");
|
||||||
|
IPSocket socket = new IPSocket("127.0.0.1", 22);
|
||||||
|
socketTester.apply(socket);
|
||||||
|
SshClient client = sshFactory.create(socket, new Credentials(hostUsername, hostPassword));
|
||||||
|
try {
|
||||||
|
client.connect();
|
||||||
|
ExecResponse response = client.exec("start " + command);
|
||||||
|
System.out.println(response.getOutput());
|
||||||
|
} catch (Exception e) {
|
||||||
|
propagate(e);
|
||||||
|
} finally {
|
||||||
|
if (client != null)
|
||||||
|
client.disconnect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@BeforeMethod
|
||||||
|
protected void setupManager() {
|
||||||
|
manager.connect(endpoint, identity, credential);
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterMethod
|
||||||
|
protected void disconnectAndClenaupManager() throws RemoteException,
|
||||||
|
MalformedURLException {
|
||||||
|
manager.disconnect();
|
||||||
|
manager.cleanup();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testCreateVirtualMachine() {
|
||||||
|
IMachine newVM = manager.getVBox().createMachine(settingsFile, vmName,
|
||||||
|
osTypeId, vmId, forceOverwrite);
|
||||||
|
manager.getVBox().registerMachine(newVM);
|
||||||
|
assertEquals(newVM.getName(), vmName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(dependsOnMethods = "testCreateVirtualMachine")
|
||||||
|
public void testChangeRAM() {
|
||||||
|
Long memorySize = new Long(1024);
|
||||||
|
ISession session = manager.getSessionObject();
|
||||||
|
IMachine machine = manager.getVBox().findMachine(vmName);
|
||||||
|
machine.lockMachine(session, LockType.Write);
|
||||||
|
IMachine mutable = session.getMachine();
|
||||||
|
mutable.setMemorySize(memorySize);
|
||||||
|
mutable.saveSettings();
|
||||||
|
session.unlockMachine();
|
||||||
|
assertEquals(manager.getVBox().findMachine(vmName).getMemorySize(),
|
||||||
|
memorySize);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(dependsOnMethods = "testChangeRAM")
|
||||||
|
public void testCreateIDEController() {
|
||||||
|
ISession session = manager.getSessionObject();
|
||||||
|
IMachine machine = manager.getVBox().findMachine(vmName);
|
||||||
|
machine.lockMachine(session, LockType.Write);
|
||||||
|
IMachine mutable = session.getMachine();
|
||||||
|
mutable.addStorageController(controllerIDE, StorageBus.IDE);
|
||||||
|
mutable.saveSettings();
|
||||||
|
session.unlockMachine();
|
||||||
|
assertEquals(manager.getVBox().findMachine(vmName)
|
||||||
|
.getStorageControllers().size(), 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(dependsOnMethods = "testCreateIDEController")
|
||||||
|
public void testAttachIsoDvd() {
|
||||||
|
IMedium distroHD = manager.getVBox().openMedium(distroDvd,
|
||||||
|
DeviceType.DVD, AccessMode.ReadOnly);
|
||||||
|
|
||||||
|
ISession session = manager.getSessionObject();
|
||||||
|
IMachine machine = manager.getVBox().findMachine(vmName);
|
||||||
|
machine.lockMachine(session, LockType.Write);
|
||||||
|
IMachine mutable = session.getMachine();
|
||||||
|
mutable.attachDevice(controllerIDE, 0, 0, DeviceType.DVD, distroHD);
|
||||||
|
mutable.saveSettings(); // write settings to xml
|
||||||
|
session.unlockMachine();
|
||||||
|
assertEquals(distroHD.getId().equals(""), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(dependsOnMethods = "testAttachIsoDvd")
|
||||||
|
public void testCreateScsiController() {
|
||||||
|
ISession session = manager.getSessionObject();
|
||||||
|
IMachine machine = manager.getVBox().findMachine(vmName);
|
||||||
|
machine.lockMachine(session, LockType.Write);
|
||||||
|
IMachine mutable = session.getMachine();
|
||||||
|
mutable.addStorageController(controllerSATA, StorageBus.SATA);
|
||||||
|
mutable.saveSettings();
|
||||||
|
session.unlockMachine();
|
||||||
|
assertEquals(manager.getVBox().findMachine(vmName)
|
||||||
|
.getStorageControllers().size(), 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(dependsOnMethods = "testCreateScsiController")
|
||||||
|
public void testCreateAndAttachHardDisk() {
|
||||||
|
/*
|
||||||
|
* IMedium IVirtualBox::createHardDisk(String format, String location)
|
||||||
|
* If the format attribute is empty or null then the default
|
||||||
|
* storage format speciï¬<EFBFBD>ed by ISystemProperties::defaultHardDiskFormat will be used for creating
|
||||||
|
* a storage unit of the medium.
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
IMedium hd = manager.getVBox().createHardDisk(null, workingDir + File.separator + "disk.vdi");
|
||||||
|
IProgress progress = hd.createBaseStorage(new Long(8*1024), new Long(MediumVariant.STANDARD.ordinal()));
|
||||||
|
*/
|
||||||
|
IMedium hd = null;
|
||||||
|
if(!new File(clonedDisk).exists()) {
|
||||||
|
hd = manager.getVBox().createHardDisk(diskFormat, clonedDisk);
|
||||||
|
long size = 120*1024*1024;
|
||||||
|
hd.createBaseStorage(new Long(size), new Long(MediumVariant.FIXED.ordinal()));
|
||||||
|
} else
|
||||||
|
hd = manager.getVBox().openMedium(clonedDisk, DeviceType.HardDisk, AccessMode.ReadWrite);
|
||||||
|
ISession session = manager.getSessionObject();
|
||||||
|
IMachine machine = manager.getVBox().findMachine(vmName);
|
||||||
|
machine.lockMachine(session, LockType.Write);
|
||||||
|
IMachine mutable = session.getMachine();
|
||||||
|
mutable.attachDevice(controllerSATA, 0, 0, DeviceType.HardDisk, hd);
|
||||||
|
mutable.saveSettings(); // write settings to xml
|
||||||
|
session.unlockMachine();
|
||||||
|
assertEquals(hd.getId().equals(""), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test(dependsOnMethods = "testCreateAndAttachHardDisk")
|
||||||
|
public void testConfigureNIC() {
|
||||||
|
ISession session = manager.getSessionObject();
|
||||||
|
IMachine machine = manager.getVBox().findMachine(vmName);
|
||||||
|
machine.lockMachine(session, LockType.Write);
|
||||||
|
IMachine mutable = session.getMachine();
|
||||||
|
|
||||||
|
|
||||||
|
// network BRIDGED to access HTTP server
|
||||||
|
String hostInterface = null;
|
||||||
|
String command = vboxManageCommand + " list bridgedifs";
|
||||||
|
try {
|
||||||
|
Process child = Runtime.getRuntime().exec(command);
|
||||||
|
BufferedReader bufferedReader = new BufferedReader(
|
||||||
|
new InputStreamReader(child.getInputStream()));
|
||||||
|
String line = "";
|
||||||
|
boolean found = false;
|
||||||
|
|
||||||
|
while ( (line = bufferedReader.readLine()) != null && !found){
|
||||||
|
|
||||||
|
if(line.split(":")[0].contains("Name") ){
|
||||||
|
hostInterface = line.split(":")[1];
|
||||||
|
}
|
||||||
|
if( line.split(":")[0].contains("Status") && line.split(":")[1].contains("Up") ){
|
||||||
|
System.out.println("bridge: " + hostInterface.trim());
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bridged
|
||||||
|
/*
|
||||||
|
mutable.getNetworkAdapter(new Long(0)).attachToBridgedInterface();
|
||||||
|
mutable.getNetworkAdapter(new Long(0)).setHostInterface(hostInterface.trim());
|
||||||
|
mutable.getNetworkAdapter(new Long(0)).setEnabled(true);
|
||||||
|
*/
|
||||||
|
|
||||||
|
// NAT
|
||||||
|
mutable.getNetworkAdapter(new Long(0)).attachToNAT();
|
||||||
|
mutable.getNetworkAdapter(new Long(0)).setNATNetwork("");
|
||||||
|
machine.getNetworkAdapter(new Long(0)).getNatDriver().addRedirect("guestssh", NATProtocol.TCP, "127.0.0.1", 2222, "", 22);
|
||||||
|
mutable.getNetworkAdapter(new Long(0)).setEnabled(true);
|
||||||
|
|
||||||
|
mutable.saveSettings();
|
||||||
|
session.unlockMachine();
|
||||||
|
|
||||||
|
|
||||||
|
} catch (IOException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(dependsOnMethods = "testConfigureNIC")
|
||||||
|
public void testStartVirtualMachine() {
|
||||||
|
IMachine machine = manager.getVBox().findMachine(vmName);
|
||||||
|
ISession session = manager.getSessionObject();
|
||||||
|
launchVMProcess(machine, session);
|
||||||
|
assertEquals(machine.getState(), MachineState.Running);
|
||||||
|
try {
|
||||||
|
Thread.sleep(5000);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
sendKeyboardSequence(keyboardSequence);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(dependsOnMethods = "testStartVirtualMachine")
|
||||||
|
public void testConfigureGuestAdditions() {
|
||||||
|
|
||||||
|
// configure GA
|
||||||
|
IPSocket socket = new IPSocket("127.0.0.1", 2222);
|
||||||
|
socketTester.apply(socket);
|
||||||
|
SshClient client = sshFactory.create(socket, new Credentials(osUsername, osPassword));
|
||||||
|
try {
|
||||||
|
client.connect();
|
||||||
|
//Configure your system for building kernel modules by running
|
||||||
|
ExecResponse exec = client.exec("echo " + osPassword + " | " + "sudo -S m-a prepare -i");
|
||||||
|
System.out.println(exec);
|
||||||
|
} finally {
|
||||||
|
if (client != null) {
|
||||||
|
client.disconnect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
socketTester.apply(socket);
|
||||||
|
client = sshFactory.create(socket, new Credentials(osUsername,
|
||||||
|
osPassword));
|
||||||
|
try {
|
||||||
|
client.connect();
|
||||||
|
ExecResponse exec = client
|
||||||
|
.exec("echo " + osPassword + " | " + "sudo -S mount -o loop /usr/share/virtualbox/VBoxGuestAdditions.iso /mnt");
|
||||||
|
System.out.println(exec);
|
||||||
|
exec = client.exec("echo " + osPassword + " | " + "sudo -S sh /mnt/VBoxLinuxAdditions.run");
|
||||||
|
System.out.println(exec);
|
||||||
|
} finally {
|
||||||
|
if (client != null)
|
||||||
|
client.disconnect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(dependsOnMethods = "testConfigureGuestAdditions")
|
||||||
|
public void testStopVirtualMachine() {
|
||||||
|
IMachine machine = manager.getVBox().findMachine(vmName);
|
||||||
|
powerDownMachine(machine);
|
||||||
|
assertEquals(machine.getState(), MachineState.PoweredOff);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param machine
|
||||||
|
*/
|
||||||
|
private void powerDownMachine(IMachine machine) {
|
||||||
|
try {
|
||||||
|
ISession machineSession = manager.openMachineSession(machine);
|
||||||
|
IProgress progress = machineSession.getConsole().powerDown();
|
||||||
|
progress.waitForCompletion(-1);
|
||||||
|
machineSession.unlockMachine();
|
||||||
|
|
||||||
|
while (!machine.getSessionState().equals(SessionState.Unlocked)) {
|
||||||
|
try {
|
||||||
|
System.out
|
||||||
|
.println("waiting for unlocking session - session state: "
|
||||||
|
+ machine.getSessionState());
|
||||||
|
Thread.sleep(1000);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(dependsOnMethods = "testStopVirtualMachine")
|
||||||
|
public void cleanUp() throws IOException {
|
||||||
|
ISession session = manager.getSessionObject();
|
||||||
|
IMachine machine = manager.getVBox().findMachine(vmName);
|
||||||
|
machine.lockMachine(session, LockType.Write);
|
||||||
|
IMachine mutable = session.getMachine();
|
||||||
|
mutable.getNetworkAdapter(new Long(0)).getNatDriver()
|
||||||
|
.removeRedirect("guestssh");
|
||||||
|
// detach disk from controller
|
||||||
|
mutable.detachDevice(controllerIDE, 0, 0);
|
||||||
|
mutable.saveSettings();
|
||||||
|
session.unlockMachine();
|
||||||
|
|
||||||
|
for (IStorageController storageController : machine
|
||||||
|
.getStorageControllers()) {
|
||||||
|
if (storageController.getName().equals(controllerSATA)) {
|
||||||
|
session = manager.getSessionObject();
|
||||||
|
machine.lockMachine(session, LockType.Write);
|
||||||
|
|
||||||
|
mutable = session.getMachine();
|
||||||
|
mutable.detachDevice(storageController.getName(), 1, 1);
|
||||||
|
mutable.saveSettings();
|
||||||
|
session.unlockMachine();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterClass
|
||||||
|
void stopVboxWebServer() throws IOException {
|
||||||
|
// stop vbox web server
|
||||||
|
IPSocket socket = new IPSocket("127.0.0.1", 22);
|
||||||
|
socketTester.apply(socket);
|
||||||
|
SshClient client = sshFactory.create(socket, new Credentials(
|
||||||
|
hostUsername, hostPassword));
|
||||||
|
try {
|
||||||
|
client.connect();
|
||||||
|
ExecResponse exec = client.exec("pidof vboxwebsrv | xargs kill");
|
||||||
|
System.out.println(exec.getOutput());
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} finally {
|
||||||
|
if (client != null)
|
||||||
|
client.disconnect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param workingDir
|
||||||
|
* @param vdiUrl
|
||||||
|
* @param proxy
|
||||||
|
* Proxy proxy , new Proxy(Proxy.Type.HTTP, new
|
||||||
|
* InetSocketAddress("localhost", 5865));
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
private File downloadFile(String sourceURL, String destinationDir,
|
||||||
|
String vboxGuestAdditionsName, Proxy proxy) throws Exception {
|
||||||
|
|
||||||
|
String absolutePathName = destinationDir + File.separator
|
||||||
|
+ vboxGuestAdditionsName;
|
||||||
|
File iso = new File(absolutePathName);
|
||||||
|
|
||||||
|
final URL isoURL = new URL(sourceURL);
|
||||||
|
final HttpURLConnection uc = (HttpURLConnection) isoURL
|
||||||
|
.openConnection(); // isoURL.openConnection(proxy);
|
||||||
|
uc.connect();
|
||||||
|
if (!iso.exists()) {
|
||||||
|
System.out.println("Start download " + sourceURL + " to "
|
||||||
|
+ absolutePathName);
|
||||||
|
Files.copy(new InputSupplier<InputStream>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InputStream getInput() throws IOException {
|
||||||
|
return uc.getInputStream();
|
||||||
|
}
|
||||||
|
|
||||||
|
}, iso);
|
||||||
|
}
|
||||||
|
return iso;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sendKeyboardSequence(String keyboardSequence) {
|
||||||
|
String[] sequenceSplited = keyboardSequence.split(" ");
|
||||||
|
/*
|
||||||
|
for (String word : sequenceSplited) {
|
||||||
|
|
||||||
|
String converted = stringToKeycode(word);
|
||||||
|
for (String string : converted.split(" ")) {
|
||||||
|
try {
|
||||||
|
Thread.sleep(100);
|
||||||
|
Runtime.getRuntime().exec(vboxManageCommand + " controlvm " + vmName + " keyboardputscancode " + string);
|
||||||
|
Thread.sleep(50);
|
||||||
|
} catch (Exception e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
for (String word : sequenceSplited) {
|
||||||
|
IPSocket socket = new IPSocket("127.0.0.1", 22);
|
||||||
|
socketTester.apply(socket);
|
||||||
|
SshClient client = sshFactory.create(socket, new Credentials(hostUsername, hostPassword));
|
||||||
|
try {
|
||||||
|
client.connect();
|
||||||
|
String converted = stringToKeycode(word);
|
||||||
|
for (String string : converted.split(" ")) {
|
||||||
|
ExecResponse response = client.exec(vboxManageCommand + " controlvm " + vmName + " keyboardputscancode " + string);
|
||||||
|
System.out.println(response.getOutput());
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} finally {
|
||||||
|
if (client != null)
|
||||||
|
client.disconnect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private String stringToKeycode(String s) {
|
||||||
|
|
||||||
|
StringBuilder keycodes = new StringBuilder();
|
||||||
|
for (String specialButton : KeyboardScancodes.SPECIAL_KEYBOARD_BUTTON_MAP.keySet()) {
|
||||||
|
if(s.startsWith(specialButton)) {
|
||||||
|
keycodes.append(KeyboardScancodes.SPECIAL_KEYBOARD_BUTTON_MAP.get(specialButton));
|
||||||
|
return keycodes.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int i = 0, j = 0;
|
||||||
|
while(i < s.length()) {
|
||||||
|
String digit = s.substring(i, i+1);
|
||||||
|
String hex = KeyboardScancodes.NORMAL_KEYBOARD_BUTTON_MAP.get(digit);
|
||||||
|
keycodes.append(hex + " ");
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
keycodes.append(KeyboardScancodes.SPECIAL_KEYBOARD_BUTTON_MAP.get("<Spacebar>") + " ");
|
||||||
|
|
||||||
|
return keycodes.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param machine
|
||||||
|
* @param session
|
||||||
|
*/
|
||||||
|
private void launchVMProcess(IMachine machine, ISession session) {
|
||||||
|
IProgress prog = machine.launchVMProcess(session, "gui", "");
|
||||||
|
prog.waitForCompletion(-1);
|
||||||
|
session.unlockMachine();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,507 @@
|
||||||
|
package org.jclouds.virtualbox.experiment;
|
||||||
|
|
||||||
|
import static org.testng.Assert.assertEquals;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.net.HttpURLConnection;
|
||||||
|
import java.net.MalformedURLException;
|
||||||
|
import java.net.Proxy;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.rmi.RemoteException;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import org.jclouds.compute.domain.ExecResponse;
|
||||||
|
import org.jclouds.domain.Credentials;
|
||||||
|
import org.jclouds.logging.log4j.config.Log4JLoggingModule;
|
||||||
|
import org.jclouds.net.IPSocket;
|
||||||
|
import org.jclouds.predicates.InetSocketAddressConnect;
|
||||||
|
import org.jclouds.predicates.RetryablePredicate;
|
||||||
|
import org.jclouds.ssh.SshClient;
|
||||||
|
import org.jclouds.ssh.jsch.config.JschSshClientModule;
|
||||||
|
import org.testng.annotations.AfterClass;
|
||||||
|
import org.testng.annotations.AfterMethod;
|
||||||
|
import org.testng.annotations.BeforeGroups;
|
||||||
|
import org.testng.annotations.BeforeMethod;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
import org.virtualbox_4_0.AccessMode;
|
||||||
|
import org.virtualbox_4_0.DeviceType;
|
||||||
|
import org.virtualbox_4_0.IMachine;
|
||||||
|
import org.virtualbox_4_0.IMedium;
|
||||||
|
import org.virtualbox_4_0.IProgress;
|
||||||
|
import org.virtualbox_4_0.ISession;
|
||||||
|
import org.virtualbox_4_0.IStorageController;
|
||||||
|
import org.virtualbox_4_0.LockType;
|
||||||
|
import org.virtualbox_4_0.MachineState;
|
||||||
|
import org.virtualbox_4_0.NATProtocol;
|
||||||
|
import org.virtualbox_4_0.SessionState;
|
||||||
|
import org.virtualbox_4_0.StorageBus;
|
||||||
|
import org.virtualbox_4_0.VirtualBoxManager;
|
||||||
|
import org.virtualbox_4_0.jaxws.MediumVariant;
|
||||||
|
|
||||||
|
import com.google.common.base.Predicate;
|
||||||
|
import com.google.common.io.Files;
|
||||||
|
import com.google.common.io.InputSupplier;
|
||||||
|
import com.google.inject.Guice;
|
||||||
|
import com.google.inject.Injector;
|
||||||
|
|
||||||
|
@Test(groups = "live", testName = "virtualbox.VirtualboxAdministrationTest")
|
||||||
|
public class VirtualboxAdministrationTest {
|
||||||
|
|
||||||
|
protected String provider = "virtualbox";
|
||||||
|
protected String identity;
|
||||||
|
protected String credential;
|
||||||
|
protected String endpoint;
|
||||||
|
protected String apiversion;
|
||||||
|
protected String vmName;
|
||||||
|
|
||||||
|
VirtualBoxManager manager = VirtualBoxManager.createInstance("");
|
||||||
|
|
||||||
|
protected Injector injector;
|
||||||
|
protected Predicate<IPSocket> socketTester;
|
||||||
|
protected SshClient.Factory sshFactory;
|
||||||
|
|
||||||
|
protected String settingsFile; // Fully qualified path where the settings file should be created, or NULL for a default
|
||||||
|
// folder and file based on the name argument (see composeMachineFilename()).
|
||||||
|
|
||||||
|
protected String osTypeId; // Guest OS Type ID.
|
||||||
|
protected String vmId; // Machine UUID (optional).
|
||||||
|
protected boolean forceOverwrite; // If true, an existing machine settings file will be overwritten.
|
||||||
|
|
||||||
|
protected String osUsername;
|
||||||
|
protected String osPassword;
|
||||||
|
protected String controller;
|
||||||
|
protected String diskFormat;
|
||||||
|
|
||||||
|
protected String workingDir;
|
||||||
|
protected String originalDisk;
|
||||||
|
protected String clonedDisk;
|
||||||
|
|
||||||
|
protected String guestAdditionsDvdName;
|
||||||
|
private String vdiUrl;
|
||||||
|
private String gaIsoUrl;
|
||||||
|
private String vboxwebsrvStartCommand;
|
||||||
|
// private Process pr;
|
||||||
|
private String vdiName;
|
||||||
|
private String gaIsoName;
|
||||||
|
private String admin_pwd;
|
||||||
|
private String hostUsername;
|
||||||
|
private String hostPassword;
|
||||||
|
private String install7zip;
|
||||||
|
private String run7zip;
|
||||||
|
private String installVboxOse;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param workingDir
|
||||||
|
* @param vdiUrl
|
||||||
|
* @param proxy Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("localhost", 5865));
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
private File downloadFile(String sourceURL, String destinationDir, String vboxGuestAdditionsName, Proxy proxy) throws Exception {
|
||||||
|
|
||||||
|
String absolutePathName = destinationDir + File.separator + vboxGuestAdditionsName;
|
||||||
|
File iso = new File(absolutePathName);
|
||||||
|
|
||||||
|
final URL isoURL = new URL(sourceURL);
|
||||||
|
final HttpURLConnection uc = (HttpURLConnection) isoURL.openConnection(); // isoURL.openConnection(proxy);
|
||||||
|
uc.connect();
|
||||||
|
if(!iso.exists()) {
|
||||||
|
System.out.println("Start download " + sourceURL + " to " + absolutePathName);
|
||||||
|
Files.copy(new InputSupplier<InputStream>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InputStream getInput() throws IOException {
|
||||||
|
return uc.getInputStream();
|
||||||
|
}
|
||||||
|
|
||||||
|
}, iso);
|
||||||
|
}
|
||||||
|
return iso;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setupCredentials() {
|
||||||
|
identity = System.getProperty("test." + provider + ".identity", "administrator");
|
||||||
|
credential = System.getProperty("test." + provider + ".credential", "12345");
|
||||||
|
endpoint = System.getProperty("test." + provider + ".endpoint", "http://localhost:18083/");
|
||||||
|
apiversion = System.getProperty("test." + provider + ".apiversion");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setupConfigurationProperties() {
|
||||||
|
|
||||||
|
admin_pwd = System.getProperty("test." + provider + ".admin_pwd", "password");
|
||||||
|
// OS
|
||||||
|
osUsername = System.getProperty("test." + provider + ".osusername", "root");
|
||||||
|
osPassword = System.getProperty("test." + provider + ".ospassword", "toortoor");
|
||||||
|
controller = System.getProperty("test." + provider + ".controller", "IDE Controller");
|
||||||
|
// Create disk If the @a format attribute is empty or null then the default storage format specified by ISystemProperties#defaultHardDiskFormat
|
||||||
|
diskFormat = System.getProperty("test." + provider + ".diskformat", "");
|
||||||
|
|
||||||
|
//VBOX
|
||||||
|
settingsFile = null; // Fully qualified path where the settings file should be created, or NULL for a default
|
||||||
|
// folder and file based on the name argument (see composeMachineFilename()).
|
||||||
|
|
||||||
|
osTypeId = System.getProperty("test." + provider + ".osTypeId", ""); // Guest OS Type ID.
|
||||||
|
vmId = System.getProperty("test." + provider + ".vmId", null); // Machine UUID (optional).
|
||||||
|
forceOverwrite = true; // If true, an existing machine settings file will be overwritten.
|
||||||
|
vmName = System.getProperty("test." + provider + ".vmname", "jclouds-virtualbox-admin");
|
||||||
|
|
||||||
|
workingDir = System.getProperty("user.home") + File.separator + System.getProperty("test." + provider + ".workingDir", "jclouds-virtualbox-test") ;
|
||||||
|
if(new File(workingDir).mkdir());
|
||||||
|
vdiName = System.getProperty("test." + provider + ".vdiName", "centos-5.2-x86.7z");
|
||||||
|
vdiUrl = System.getProperty("test." + provider + ".vdiUrl", "http://leaseweb.dl.sourceforge.net/project/virtualboximage/CentOS/5.2/centos-5.2-x86.7z");
|
||||||
|
gaIsoName = System.getProperty("test." + provider + ".gaIsoName", "VBoxGuestAdditions_4.0.2-update-69551.iso");
|
||||||
|
gaIsoUrl = System.getProperty("test." + provider + ".gaIsoUrl", "http://download.virtualbox.org/virtualbox/4.0.2/VBoxGuestAdditions_4.0.2-update-69551.iso");
|
||||||
|
vboxwebsrvStartCommand = System.getProperty("test." + provider + ".vboxwebsrvStartCommand","/usr/bin/vboxwebsrv");
|
||||||
|
originalDisk = workingDir + File.separator + "VDI" +File.separator + System.getProperty("test." + provider + ".originalDisk", "centos-5.2-x86.vdi");
|
||||||
|
clonedDisk = workingDir + File.separator + System.getProperty("test." + provider + ".clonedDisk", "template.vdi");
|
||||||
|
guestAdditionsDvdName = workingDir + File.separator + System.getProperty("test." + provider + ".guestAdditionsDvdName", "VBoxGuestAdditions_4.0.2-update-69551.iso");
|
||||||
|
|
||||||
|
install7zip = System.getProperty("test." + provider + ".install7zip", "sudo -S apt-get --yes install p7zip");
|
||||||
|
run7zip = System.getProperty("test." + provider + ".run7zip", "p7zip -d ");
|
||||||
|
installVboxOse = System.getProperty("test." + provider + ".installvboxose", "sudo -S apt-get --yes install virtualbox-ose");
|
||||||
|
if(!new File(originalDisk).exists()) {
|
||||||
|
IPSocket socket = new IPSocket("127.0.0.1", 22);
|
||||||
|
socketTester.apply(socket);
|
||||||
|
SshClient client = sshFactory.create(socket, new Credentials(hostUsername, hostPassword));
|
||||||
|
try {
|
||||||
|
File vdi7z = downloadFile(vdiUrl, workingDir, vdiName, null);
|
||||||
|
client.connect();
|
||||||
|
ExecResponse exec = client.exec("echo " + admin_pwd + " | " + install7zip + "; cd " + workingDir + "; " + run7zip + vdi7z.getName());
|
||||||
|
System.out.println(exec);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} finally {
|
||||||
|
if (client != null)
|
||||||
|
client.disconnect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!new File(guestAdditionsDvdName).exists()) {
|
||||||
|
try {
|
||||||
|
File gaIso = downloadFile(gaIsoUrl, workingDir, gaIsoName, null);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@BeforeGroups(groups = "live")
|
||||||
|
protected void setupClient() throws IOException, InterruptedException {
|
||||||
|
|
||||||
|
hostUsername = System.getProperty("test." + provider + ".hostusername", "toor");
|
||||||
|
hostPassword = System.getProperty("test." + provider + ".hostpassword", "password");
|
||||||
|
|
||||||
|
injector = Guice.createInjector(new JschSshClientModule(),
|
||||||
|
new Log4JLoggingModule());
|
||||||
|
sshFactory = injector.getInstance(SshClient.Factory.class);
|
||||||
|
socketTester = new RetryablePredicate<IPSocket>(
|
||||||
|
new InetSocketAddressConnect(), 3600, 1, TimeUnit.SECONDS);
|
||||||
|
injector.injectMembers(socketTester);
|
||||||
|
|
||||||
|
setupCredentials();
|
||||||
|
setupConfigurationProperties();
|
||||||
|
|
||||||
|
installVbox();
|
||||||
|
// startup vbox web server
|
||||||
|
startupVboxWebServer(vboxwebsrvStartCommand);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void installVbox() throws IOException, InterruptedException {
|
||||||
|
IPSocket socket = new IPSocket("127.0.0.1", 22);
|
||||||
|
socketTester.apply(socket);
|
||||||
|
SshClient client = sshFactory.create(socket, new Credentials(hostUsername, hostPassword));
|
||||||
|
try {
|
||||||
|
client.connect();
|
||||||
|
ExecResponse exec = client.exec("echo " + hostPassword + " | " + installVboxOse);
|
||||||
|
System.out.println(exec);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} finally {
|
||||||
|
if (client != null)
|
||||||
|
client.disconnect();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param command absolute path to command. For ubuntu 10.04: /usr/bin/vboxwebsrv
|
||||||
|
* @throws IOException
|
||||||
|
* @throws InterruptedException
|
||||||
|
*/
|
||||||
|
private void startupVboxWebServer(String command) throws IOException, InterruptedException {
|
||||||
|
// Disable login credential: $
|
||||||
|
//rt.exec("VBoxManage setproperty websrvauthlibrary null");
|
||||||
|
IPSocket socket = new IPSocket("127.0.0.1", 22);
|
||||||
|
socketTester.apply(socket);
|
||||||
|
SshClient client = sshFactory.create(socket, new Credentials(hostUsername, hostPassword));
|
||||||
|
try {
|
||||||
|
client.connect();
|
||||||
|
ExecResponse exec = client.exec(command + " --timeout 50000 -b");
|
||||||
|
System.out.println(exec.getOutput());
|
||||||
|
System.out.println(exec);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} finally {
|
||||||
|
if (client != null)
|
||||||
|
client.disconnect();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@BeforeMethod
|
||||||
|
protected void setupManager() {
|
||||||
|
manager.connect(endpoint, identity, credential);
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterMethod
|
||||||
|
protected void disconnectAndClenaupManager() throws RemoteException,
|
||||||
|
MalformedURLException {
|
||||||
|
manager.disconnect();
|
||||||
|
manager.cleanup();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testCreateVirtualMachine() {
|
||||||
|
IMachine newVM = manager.getVBox().createMachine(settingsFile, vmName,
|
||||||
|
osTypeId, vmId, forceOverwrite);
|
||||||
|
manager.getVBox().registerMachine(newVM);
|
||||||
|
assertEquals(newVM.getName(), vmName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(dependsOnMethods = "testCreateVirtualMachine")
|
||||||
|
public void testChangeRAM() {
|
||||||
|
Long memorySize = new Long(2048);
|
||||||
|
ISession session = manager.getSessionObject();
|
||||||
|
IMachine machine = manager.getVBox().findMachine(vmName);
|
||||||
|
machine.lockMachine(session, LockType.Write);
|
||||||
|
IMachine mutable = session.getMachine();
|
||||||
|
mutable.setMemorySize(memorySize);
|
||||||
|
mutable.saveSettings();
|
||||||
|
session.unlockMachine();
|
||||||
|
assertEquals(manager.getVBox().findMachine(vmName)
|
||||||
|
.getMemorySize(), memorySize);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(dependsOnMethods = "testChangeRAM")
|
||||||
|
public void testCreateDiskController() {
|
||||||
|
ISession session = manager.getSessionObject();
|
||||||
|
IMachine machine = manager.getVBox().findMachine(vmName);
|
||||||
|
machine.lockMachine(session, LockType.Write);
|
||||||
|
IMachine mutable = session.getMachine();
|
||||||
|
mutable.addStorageController(controller, StorageBus.IDE);
|
||||||
|
mutable.saveSettings();
|
||||||
|
session.unlockMachine();
|
||||||
|
assertEquals(manager.getVBox().findMachine(vmName)
|
||||||
|
.getStorageControllers().size(), 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(dependsOnMethods = "testCreateDiskController")
|
||||||
|
public void testCloneAndAttachHardDisk() {
|
||||||
|
IMedium hd = manager.getVBox().openMedium(originalDisk,
|
||||||
|
DeviceType.HardDisk, AccessMode.ReadOnly);
|
||||||
|
IMedium clonedHd = null;
|
||||||
|
if(!new File(clonedDisk).exists()) {
|
||||||
|
clonedHd = manager.getVBox().createHardDisk(diskFormat, clonedDisk);
|
||||||
|
IProgress cloning = hd.cloneTo(clonedHd, new Long(MediumVariant.VMDK_SPLIT_2_G.ordinal()), null);
|
||||||
|
cloning.waitForCompletion(-1);
|
||||||
|
} else
|
||||||
|
clonedHd = manager.getVBox().openMedium(clonedDisk,
|
||||||
|
DeviceType.HardDisk, AccessMode.ReadOnly);
|
||||||
|
|
||||||
|
ISession session = manager.getSessionObject();
|
||||||
|
IMachine machine = manager.getVBox().findMachine(vmName);
|
||||||
|
machine.lockMachine(session, LockType.Write);
|
||||||
|
IMachine mutable = session.getMachine();
|
||||||
|
mutable.attachDevice(controller, 0, 0, DeviceType.HardDisk, clonedHd);
|
||||||
|
mutable.saveSettings(); // write settings to xml
|
||||||
|
session.unlockMachine();
|
||||||
|
assertEquals(hd.getId().equals(""), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(dependsOnMethods = "testCloneAndAttachHardDisk")
|
||||||
|
public void testConfigureNIC() {
|
||||||
|
ISession session = manager.getSessionObject();
|
||||||
|
IMachine machine = manager.getVBox().findMachine(vmName);
|
||||||
|
machine.lockMachine(session, LockType.Write);
|
||||||
|
IMachine mutable = session.getMachine();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NAT
|
||||||
|
*/
|
||||||
|
mutable.getNetworkAdapter(new Long(0)).attachToNAT();
|
||||||
|
mutable.getNetworkAdapter(new Long(0)).setNATNetwork("");
|
||||||
|
mutable.getNetworkAdapter(new Long(0)).setEnabled(true);
|
||||||
|
mutable.saveSettings();
|
||||||
|
session.unlockMachine();
|
||||||
|
|
||||||
|
machine.lockMachine(session, LockType.Write);
|
||||||
|
mutable = session.getMachine();
|
||||||
|
machine.getNetworkAdapter(new Long(0))
|
||||||
|
.getNatDriver()
|
||||||
|
.addRedirect("guestssh", NATProtocol.TCP, "127.0.0.1", 2222, "", 22);
|
||||||
|
mutable.saveSettings();
|
||||||
|
session.unlockMachine();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(dependsOnMethods = "testConfigureNIC")
|
||||||
|
public void testAttachGuestAdditions() {
|
||||||
|
ISession session = manager.getSessionObject();
|
||||||
|
IMachine machine = manager.getVBox().findMachine(vmName);
|
||||||
|
|
||||||
|
IMedium guestAdditionsDVD = manager.getVBox().openMedium(guestAdditionsDvdName,
|
||||||
|
DeviceType.DVD, AccessMode.ReadOnly);
|
||||||
|
for (IStorageController storageController : machine
|
||||||
|
.getStorageControllers()) {
|
||||||
|
// for DVD we choose IDE
|
||||||
|
if (storageController.getName().equals(controller)) {
|
||||||
|
|
||||||
|
machine.lockMachine(session, LockType.Write);
|
||||||
|
IMachine mutable = session.getMachine();
|
||||||
|
|
||||||
|
// IDE secondary slave [1:1]
|
||||||
|
mutable.attachDevice(storageController.getName(),
|
||||||
|
new Integer(1), new Integer(1), DeviceType.DVD,
|
||||||
|
guestAdditionsDVD);
|
||||||
|
mutable.saveSettings();
|
||||||
|
session.unlockMachine();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(dependsOnMethods = "testAttachGuestAdditions")
|
||||||
|
public void testStartVirtualMachine() {
|
||||||
|
IMachine machine = manager.getVBox().findMachine(vmName);
|
||||||
|
ISession session = manager.getSessionObject();
|
||||||
|
launchVMProcess(machine, session);
|
||||||
|
assertEquals(machine.getState(), MachineState.Running);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param machine
|
||||||
|
* @param session
|
||||||
|
*/
|
||||||
|
private void launchVMProcess(IMachine machine, ISession session) {
|
||||||
|
IProgress prog = machine.launchVMProcess(session, "gui", "");
|
||||||
|
prog.waitForCompletion(-1);
|
||||||
|
session.unlockMachine();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(dependsOnMethods = "testStartVirtualMachine")
|
||||||
|
public void testInstallGuestAdditionsThroughNATPortForwarding() {
|
||||||
|
|
||||||
|
IPSocket socket = new IPSocket("127.0.0.1", 2222);
|
||||||
|
socketTester.apply(socket);
|
||||||
|
SshClient client = sshFactory.create(socket, new Credentials(osUsername, osPassword));
|
||||||
|
try {
|
||||||
|
client.connect();
|
||||||
|
ExecResponse exec = client.exec("yum install gcc kernel kernel-devel -y");
|
||||||
|
System.out.println(exec);
|
||||||
|
} finally {
|
||||||
|
if (client != null)
|
||||||
|
client.disconnect();
|
||||||
|
}
|
||||||
|
|
||||||
|
//manually restart
|
||||||
|
IMachine machine = manager.getVBox().findMachine(vmName);
|
||||||
|
powerDownMachine(machine);
|
||||||
|
launchVMProcess(machine, manager.getSessionObject());
|
||||||
|
|
||||||
|
socketTester.apply(socket);
|
||||||
|
client = sshFactory.create(socket, new Credentials(osUsername, osPassword));
|
||||||
|
try {
|
||||||
|
client.connect();
|
||||||
|
ExecResponse exec = client.exec("mkdir -p /media/cdrom; mount /dev/cdrom /media/cdrom; sh /media/cdrom/VBoxLinuxAdditions.run --nox11 force");
|
||||||
|
System.out.println(exec);
|
||||||
|
exec = client.exec("echo '/usr/sbin/VBoxService' >> /etc/rc.d/rc.local");
|
||||||
|
System.out.println(exec);
|
||||||
|
} finally {
|
||||||
|
if (client != null)
|
||||||
|
client.disconnect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(dependsOnMethods = "testInstallGuestAdditionsThroughNATPortForwarding")
|
||||||
|
public void testStopVirtualMachine() {
|
||||||
|
IMachine machine = manager.getVBox().findMachine(vmName);
|
||||||
|
powerDownMachine(machine);
|
||||||
|
assertEquals(machine.getState(), MachineState.PoweredOff);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param machine
|
||||||
|
*/
|
||||||
|
private void powerDownMachine(IMachine machine) {
|
||||||
|
try {
|
||||||
|
ISession machineSession = manager.openMachineSession(machine);
|
||||||
|
IProgress progress = machineSession.getConsole().powerDown();
|
||||||
|
progress.waitForCompletion(-1);
|
||||||
|
machineSession.unlockMachine();
|
||||||
|
|
||||||
|
while(!machine.getSessionState().equals(SessionState.Unlocked)){
|
||||||
|
try {
|
||||||
|
System.out.println("waiting for unlocking session - session state: " + machine.getSessionState());
|
||||||
|
Thread.sleep(1000);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(dependsOnMethods = "testStopVirtualMachine")
|
||||||
|
public void cleanUp() throws IOException {
|
||||||
|
ISession session = manager.getSessionObject();
|
||||||
|
IMachine machine = manager.getVBox().findMachine(vmName);
|
||||||
|
machine.lockMachine(session, LockType.Write);
|
||||||
|
IMachine mutable = session.getMachine();
|
||||||
|
mutable.getNetworkAdapter(new Long(0)).getNatDriver().removeRedirect("guestssh");
|
||||||
|
// detach disk from controller
|
||||||
|
mutable.detachDevice(controller, 0, 0);
|
||||||
|
mutable.saveSettings();
|
||||||
|
session.unlockMachine();
|
||||||
|
|
||||||
|
for (IStorageController storageController : machine
|
||||||
|
.getStorageControllers()) {
|
||||||
|
if (storageController.getName().equals(controller)) {
|
||||||
|
session = manager.getSessionObject();
|
||||||
|
machine.lockMachine(session, LockType.Write);
|
||||||
|
|
||||||
|
mutable = session.getMachine();
|
||||||
|
mutable.detachDevice(storageController.getName(), 1, 1);
|
||||||
|
mutable.saveSettings();
|
||||||
|
session.unlockMachine();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterClass
|
||||||
|
void stopVboxWebServer() throws IOException{
|
||||||
|
// stop vbox web server
|
||||||
|
IPSocket socket = new IPSocket("127.0.0.1", 22);
|
||||||
|
socketTester.apply(socket);
|
||||||
|
SshClient client = sshFactory.create(socket, new Credentials(hostUsername, hostPassword));
|
||||||
|
try {
|
||||||
|
client.connect();
|
||||||
|
ExecResponse exec = client.exec("pidof vboxwebsrv | xargs kill");
|
||||||
|
System.out.println(exec.getOutput());
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} finally {
|
||||||
|
if (client != null)
|
||||||
|
client.disconnect();
|
||||||
|
} }
|
||||||
|
}
|
|
@ -0,0 +1,305 @@
|
||||||
|
package org.jclouds.virtualbox.experiment;
|
||||||
|
|
||||||
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
import static org.testng.Assert.assertEquals;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.net.MalformedURLException;
|
||||||
|
import java.rmi.RemoteException;
|
||||||
|
import java.util.Properties;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import org.jclouds.compute.domain.ExecResponse;
|
||||||
|
import org.jclouds.domain.Credentials;
|
||||||
|
import org.jclouds.logging.log4j.config.Log4JLoggingModule;
|
||||||
|
import org.jclouds.net.IPSocket;
|
||||||
|
import org.jclouds.predicates.InetSocketAddressConnect;
|
||||||
|
import org.jclouds.predicates.RetryablePredicate;
|
||||||
|
import org.jclouds.ssh.SshClient;
|
||||||
|
import org.jclouds.ssh.jsch.config.JschSshClientModule;
|
||||||
|
import org.testng.annotations.AfterMethod;
|
||||||
|
import org.testng.annotations.BeforeClass;
|
||||||
|
import org.testng.annotations.BeforeMethod;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
import org.virtualbox_4_0.AccessMode;
|
||||||
|
import org.virtualbox_4_0.DeviceType;
|
||||||
|
import org.virtualbox_4_0.IMachine;
|
||||||
|
import org.virtualbox_4_0.IMedium;
|
||||||
|
import org.virtualbox_4_0.IProgress;
|
||||||
|
import org.virtualbox_4_0.ISession;
|
||||||
|
import org.virtualbox_4_0.LockType;
|
||||||
|
import org.virtualbox_4_0.MachineState;
|
||||||
|
import org.virtualbox_4_0.MediumType;
|
||||||
|
import org.virtualbox_4_0.SessionState;
|
||||||
|
import org.virtualbox_4_0.StorageBus;
|
||||||
|
import org.virtualbox_4_0.VirtualBoxManager;
|
||||||
|
import org.virtualbox_4_0.jaxws.MediumState;
|
||||||
|
import org.virtualbox_4_0.jaxws.MediumVariant;
|
||||||
|
|
||||||
|
import com.google.common.base.Predicate;
|
||||||
|
import com.google.inject.Guice;
|
||||||
|
import com.google.inject.Injector;
|
||||||
|
|
||||||
|
@Test(groups = "live", testName = "virtualbox.VirtualboxLiveTest")
|
||||||
|
public class VirtualboxLiveTest {
|
||||||
|
|
||||||
|
protected String provider = "virtualbox";
|
||||||
|
protected String identity;
|
||||||
|
protected String credential;
|
||||||
|
protected String endpoint;
|
||||||
|
protected String apiversion;
|
||||||
|
protected String vmName;
|
||||||
|
|
||||||
|
VirtualBoxManager manager = VirtualBoxManager.createInstance(null);
|
||||||
|
|
||||||
|
protected Injector injector;
|
||||||
|
protected Predicate<IPSocket> socketTester;
|
||||||
|
protected SshClient.Factory sshFactory;
|
||||||
|
|
||||||
|
protected String osUsername;
|
||||||
|
protected String osPassword;
|
||||||
|
protected String controller;
|
||||||
|
protected String diskFormat;
|
||||||
|
|
||||||
|
protected String settingsFile; // Fully qualified path where the settings file should be created, or NULL for a default
|
||||||
|
// folder and file based on the name argument (see composeMachineFilename()).
|
||||||
|
|
||||||
|
protected String osTypeId; // Guest OS Type ID.
|
||||||
|
protected String vmId; // Machine UUID (optional).
|
||||||
|
protected boolean forceOverwrite; // If true, an existing machine settings file will be overwritten.
|
||||||
|
|
||||||
|
protected String workingDir;
|
||||||
|
protected String originalDiskPath;
|
||||||
|
protected String clonedDiskPath;
|
||||||
|
|
||||||
|
// Create disk If the @a format attribute is empty or null then the default
|
||||||
|
// storage format specified by ISystemProperties#defaultHardDiskFormat
|
||||||
|
String format = "vdi";
|
||||||
|
|
||||||
|
protected int numberOfVirtualMachine ;
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
protected void setupConfigurationProperties() {
|
||||||
|
//VBOX
|
||||||
|
settingsFile = null; // Fully qualified path where the settings file should be created, or NULL for a default
|
||||||
|
// folder and file based on the name argument (see composeMachineFilename()).
|
||||||
|
osTypeId = System.getProperty("test." + provider + ".osTypeId", ""); // Guest OS Type ID.
|
||||||
|
vmId = System.getProperty("test." + provider + ".vmId", null); // Machine UUID (optional).
|
||||||
|
forceOverwrite = true; // If true, an existing machine settings file will be overwritten.
|
||||||
|
|
||||||
|
// OS specific information
|
||||||
|
vmName = checkNotNull(System.getProperty("test." + provider + ".vmname"));
|
||||||
|
osUsername = System.getProperty("test." + provider + ".osusername", "root");
|
||||||
|
osPassword = System.getProperty("test." + provider + ".ospassword", "toortoor");
|
||||||
|
controller = System.getProperty("test." + provider + ".controller", "IDE Controller");
|
||||||
|
diskFormat = System.getProperty("test." + provider + ".diskformat", "");
|
||||||
|
|
||||||
|
workingDir = checkNotNull(
|
||||||
|
System.getProperty("test." + provider + ".workingDir"));
|
||||||
|
|
||||||
|
originalDiskPath = workingDir
|
||||||
|
+ File.separator
|
||||||
|
+ checkNotNull(System.getProperty("test." + provider
|
||||||
|
+ ".originalDisk"));
|
||||||
|
|
||||||
|
numberOfVirtualMachine = Integer.parseInt(checkNotNull(System.getProperty("test." + provider + ".numberOfVirtualMachine")));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
protected void setupCredentials() throws RemoteException,
|
||||||
|
MalformedURLException {
|
||||||
|
identity = System.getProperty("test." + provider + ".identity", "administrator");
|
||||||
|
credential = System.getProperty("test." + provider + ".credential", "12345");
|
||||||
|
endpoint = System.getProperty("test." + provider + ".endpoint", "http://localhost:18083/");
|
||||||
|
apiversion = System.getProperty("test." + provider + ".apiversion");
|
||||||
|
|
||||||
|
injector = Guice.createInjector(new JschSshClientModule(),
|
||||||
|
new Log4JLoggingModule());
|
||||||
|
sshFactory = injector.getInstance(SshClient.Factory.class);
|
||||||
|
socketTester = new RetryablePredicate<IPSocket>(
|
||||||
|
new InetSocketAddressConnect(), 180, 1, TimeUnit.SECONDS);
|
||||||
|
injector.injectMembers(socketTester);
|
||||||
|
}
|
||||||
|
|
||||||
|
@BeforeMethod
|
||||||
|
protected void setupManager() throws RemoteException, MalformedURLException {
|
||||||
|
manager.connect(endpoint, identity, credential);
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterMethod
|
||||||
|
protected void disconnectAndClenaupManager() throws RemoteException,
|
||||||
|
MalformedURLException {
|
||||||
|
manager.disconnect();
|
||||||
|
manager.cleanup();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testStartVirtualMachines() {
|
||||||
|
IMedium clonedHd = cloneDisk(MediumType.MultiAttach);
|
||||||
|
for (int i = 1; i < numberOfVirtualMachine + 1; i++) {
|
||||||
|
createVirtualMachine(i, clonedHd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createVirtualMachine(int i, IMedium clonedHd) {
|
||||||
|
|
||||||
|
String instanceName = vmName + "_" + i;
|
||||||
|
|
||||||
|
IMachine newVM = manager.getVBox().createMachine(settingsFile, instanceName, osTypeId, vmId, forceOverwrite);
|
||||||
|
manager.getVBox().registerMachine(newVM);
|
||||||
|
|
||||||
|
ISession session = manager.getSessionObject();
|
||||||
|
IMachine machine = manager.getVBox().findMachine(instanceName);
|
||||||
|
machine.lockMachine(session, LockType.Write);
|
||||||
|
IMachine mutable = session.getMachine();
|
||||||
|
|
||||||
|
// disk
|
||||||
|
mutable.addStorageController(controller, StorageBus.IDE);
|
||||||
|
mutable.attachDevice(controller, 0, 0, DeviceType.HardDisk, clonedHd);
|
||||||
|
|
||||||
|
// network
|
||||||
|
String hostInterface = null;
|
||||||
|
String command = "vboxmanage list bridgedifs";
|
||||||
|
try {
|
||||||
|
Process child = Runtime.getRuntime().exec(command);
|
||||||
|
BufferedReader bufferedReader = new BufferedReader(
|
||||||
|
new InputStreamReader(child.getInputStream()));
|
||||||
|
String line = "";
|
||||||
|
boolean found = false;
|
||||||
|
|
||||||
|
while ( (line = bufferedReader.readLine()) != null && !found){
|
||||||
|
|
||||||
|
if(line.split(":")[0].contains("Name") ){
|
||||||
|
hostInterface = line.split(":")[1];
|
||||||
|
}
|
||||||
|
if( line.split(":")[0].contains("Status") && line.split(":")[1].contains("Up") ){
|
||||||
|
System.out.println("bridge: " + hostInterface.trim());
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
mutable.getNetworkAdapter(new Long(0)).attachToBridgedInterface();
|
||||||
|
mutable.getNetworkAdapter(new Long(0)).setHostInterface(hostInterface.trim());
|
||||||
|
mutable.getNetworkAdapter(new Long(0)).setEnabled(true);
|
||||||
|
|
||||||
|
mutable.saveSettings();
|
||||||
|
session.unlockMachine();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param instanceName
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private IMedium cloneDisk(MediumType mediumType) {
|
||||||
|
|
||||||
|
String clonedDisk = System.getProperty("test." + provider + ".clonedDisk");
|
||||||
|
String instanceClonedDisk = clonedDisk.split("\\.")[0] + "." +clonedDisk.split("\\.")[1];
|
||||||
|
clonedDiskPath = workingDir + File.separator + instanceClonedDisk;
|
||||||
|
|
||||||
|
// use template disk in multiattach mode
|
||||||
|
IMedium clonedHd = manager.getVBox().openMedium(originalDiskPath, DeviceType.HardDisk, AccessMode.ReadOnly);
|
||||||
|
|
||||||
|
System.out.println("cloned HD state: " + clonedHd.getState());
|
||||||
|
/*
|
||||||
|
An image in multiattach mode can be attached to more than one virtual machine at the same time,
|
||||||
|
even if these machines are running simultaneously. For each virtual machine to which such an image is attached, a differencing image
|
||||||
|
is created. As a result, data that is written to such a virtual disk by one machine is not
|
||||||
|
seen by the other machines to which the image is attached; each machine creates its own write history of the multiattach image.
|
||||||
|
*/
|
||||||
|
while(clonedHd.getState().equals(MediumState.NOT_CREATED)) {
|
||||||
|
try {
|
||||||
|
Thread.sleep(1500);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
clonedHd.setType(mediumType);
|
||||||
|
return clonedHd;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void launchVMProcess(IMachine machine, ISession session) {
|
||||||
|
IProgress prog = machine.launchVMProcess(session, "gui", "");
|
||||||
|
prog.waitForCompletion(-1);
|
||||||
|
session.unlockMachine();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void checkSSH(IPSocket socket) {
|
||||||
|
socketTester.apply(socket);
|
||||||
|
SshClient client = sshFactory.create(socket, new Credentials(
|
||||||
|
osUsername, osPassword));
|
||||||
|
try {
|
||||||
|
client.connect();
|
||||||
|
ExecResponse exec = client.exec("touch /tmp/hello_" + System.currentTimeMillis());
|
||||||
|
exec = client.exec("echo hello");
|
||||||
|
System.out.println(exec);
|
||||||
|
assertEquals(exec.getOutput().trim(), "hello");
|
||||||
|
} finally {
|
||||||
|
if (client != null)
|
||||||
|
client.disconnect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(dependsOnMethods = "testStartVirtualMachines")
|
||||||
|
public void testSshLogin() {
|
||||||
|
String ipAddress = null;
|
||||||
|
for (int i = 1; i < numberOfVirtualMachine +1; i++) {
|
||||||
|
String instanceName = vmName + "_" + i;
|
||||||
|
IMachine machine = manager.getVBox().findMachine(instanceName);
|
||||||
|
|
||||||
|
System.out.println("\nLaunch VM named " + machine.getName() + " ...");
|
||||||
|
launchVMProcess(machine, manager.getSessionObject());
|
||||||
|
|
||||||
|
while(ipAddress==null || ipAddress.equals("")){
|
||||||
|
try {
|
||||||
|
ipAddress = machine.getGuestPropertyValue("/VirtualBox/GuestInfo/Net/0/V4/IP");
|
||||||
|
Thread.sleep(1000);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
System.out.println("VM " + instanceName + " started with IP " + ipAddress);
|
||||||
|
IPSocket socket = new IPSocket(ipAddress, 22);
|
||||||
|
|
||||||
|
System.out.println("Check SSH for " + instanceName + " ...");
|
||||||
|
checkSSH(socket);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(dependsOnMethods = "testSshLogin")
|
||||||
|
public void testStopVirtualMachine() {
|
||||||
|
for (int i = 1; i < numberOfVirtualMachine + 1; i++) {
|
||||||
|
String instanceName = vmName + "_" + i;
|
||||||
|
IMachine machine = manager.getVBox().findMachine(instanceName);
|
||||||
|
|
||||||
|
try {
|
||||||
|
ISession machineSession = manager.openMachineSession(machine);
|
||||||
|
IProgress progress = machineSession.getConsole().powerDown();
|
||||||
|
progress.waitForCompletion(-1);
|
||||||
|
machineSession.unlockMachine();
|
||||||
|
|
||||||
|
|
||||||
|
while(!machine.getSessionState().equals(SessionState.Unlocked)){
|
||||||
|
try {
|
||||||
|
System.out.println("waiting for unlocking session - session state: " + machine.getSessionState());
|
||||||
|
Thread.sleep(1000);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assertEquals(machine.getState(), MachineState.PoweredOff);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,143 @@
|
||||||
|
package org.jclouds.virtualbox.experiment.settings;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class KeyboardScancodes {
|
||||||
|
|
||||||
|
// http://www.win.tue.nl/~aeb/linux/kbd/scancodes-1.html
|
||||||
|
|
||||||
|
public static final Map<String, String> NORMAL_KEYBOARD_BUTTON_MAP = createMap();
|
||||||
|
public static final Map<String, String> SPECIAL_KEYBOARD_BUTTON_MAP = createSpecialMap();
|
||||||
|
|
||||||
|
private static Map<String, String> createMap() {
|
||||||
|
Map<String, String> alphaToHex = new HashMap<String, String>();
|
||||||
|
alphaToHex.put("1", "02 82");
|
||||||
|
alphaToHex.put("2", "03 83");
|
||||||
|
alphaToHex.put("3", "04 84");
|
||||||
|
alphaToHex.put("4", "05 85");
|
||||||
|
alphaToHex.put("5", "06 86");
|
||||||
|
alphaToHex.put("6", "07 87");
|
||||||
|
alphaToHex.put("7", "08 88");
|
||||||
|
alphaToHex.put("8", "09 89");
|
||||||
|
alphaToHex.put("9", "0a 8a");
|
||||||
|
alphaToHex.put("0", "0b 8b");
|
||||||
|
alphaToHex.put("-", "0c 8c");
|
||||||
|
alphaToHex.put("=", "0d 8d");
|
||||||
|
alphaToHex.put("Tab", "0f 8f");
|
||||||
|
alphaToHex.put("q", "10 90");
|
||||||
|
alphaToHex.put("w", "11 91");
|
||||||
|
alphaToHex.put("e", "12 92");
|
||||||
|
alphaToHex.put("r", "13 93");
|
||||||
|
alphaToHex.put("t", "14 94");
|
||||||
|
alphaToHex.put("y", "15 95");
|
||||||
|
alphaToHex.put("u", "16 96");
|
||||||
|
alphaToHex.put("i", "17 97");
|
||||||
|
alphaToHex.put("o", "18 98");
|
||||||
|
alphaToHex.put("p", "19 99");
|
||||||
|
|
||||||
|
alphaToHex.put("Q", "2a 10 aa");
|
||||||
|
alphaToHex.put("W", "2a 11 aa");
|
||||||
|
alphaToHex.put("E", "2a 12 aa");
|
||||||
|
alphaToHex.put("R", "2a 13 aa");
|
||||||
|
alphaToHex.put("T", "2a 14 aa");
|
||||||
|
alphaToHex.put("Y", "2a 15 aa");
|
||||||
|
alphaToHex.put("U", "2a 16 aa");
|
||||||
|
alphaToHex.put("I", "2a 17 aa");
|
||||||
|
alphaToHex.put("O", "2a 18 aa");
|
||||||
|
alphaToHex.put("P", "2a 19 aa");
|
||||||
|
|
||||||
|
alphaToHex.put("a", "1e 9e");
|
||||||
|
alphaToHex.put("s", "1f 9f");
|
||||||
|
alphaToHex.put("d", "20 a0");
|
||||||
|
alphaToHex.put("f", "21 a1");
|
||||||
|
alphaToHex.put("g", "22 a2");
|
||||||
|
alphaToHex.put("h", "23 a3");
|
||||||
|
alphaToHex.put("j", "24 a4");
|
||||||
|
alphaToHex.put("k", "25 a5");
|
||||||
|
alphaToHex.put("l", "26 a6");
|
||||||
|
|
||||||
|
alphaToHex.put("A", "2a 1e aa 9e");
|
||||||
|
alphaToHex.put("S", "2a 1f aa 9f");
|
||||||
|
alphaToHex.put("D", "2a 20 aa a0");
|
||||||
|
alphaToHex.put("F", "2a 21 aa a1");
|
||||||
|
alphaToHex.put("G", "2a 22 aa a2");
|
||||||
|
alphaToHex.put("H", "2a 23 aa a3");
|
||||||
|
alphaToHex.put("J", "2a 24 aa a4");
|
||||||
|
alphaToHex.put("K", "2a 25 aa a5");
|
||||||
|
alphaToHex.put("L", "2a 26 aa a6");
|
||||||
|
|
||||||
|
alphaToHex.put(");", "27 a7");
|
||||||
|
alphaToHex.put("\"", "2a 28 aa a8");
|
||||||
|
alphaToHex.put("\"", "28 a8");
|
||||||
|
alphaToHex.put("\\", "2b ab");
|
||||||
|
alphaToHex.put("|", "2a 2b aa 8b");
|
||||||
|
alphaToHex.put("[", "1a 9a");
|
||||||
|
alphaToHex.put("", "1b 9b");
|
||||||
|
alphaToHex.put("<", "2a 33 aa b3");
|
||||||
|
alphaToHex.put(">", "2a 34 aa b4");
|
||||||
|
alphaToHex.put("$", "2a 05 aa 85");
|
||||||
|
alphaToHex.put("+", "2a 0d aa 8d");
|
||||||
|
|
||||||
|
alphaToHex.put("z", "2c ac");
|
||||||
|
alphaToHex.put("x", "2d ad");
|
||||||
|
alphaToHex.put("c", "2e ae");
|
||||||
|
alphaToHex.put("v", "2f af");
|
||||||
|
alphaToHex.put("b", "30 b0");
|
||||||
|
alphaToHex.put("n", "31 b1");
|
||||||
|
alphaToHex.put("m", "32 b2");
|
||||||
|
alphaToHex.put("Z", "2a 2c aa ac");
|
||||||
|
alphaToHex.put("X", "2a 2d aa ad");
|
||||||
|
alphaToHex.put("C", "2a 2e aa ae");
|
||||||
|
alphaToHex.put("V", "2a 2f aa af");
|
||||||
|
alphaToHex.put("B", "2a 30 aa b0");
|
||||||
|
alphaToHex.put("N", "2a 31 aa b1");
|
||||||
|
alphaToHex.put("M", "2a 32 aa b2");
|
||||||
|
|
||||||
|
alphaToHex.put(",", "33 b3");
|
||||||
|
alphaToHex.put(".", "34 b4");
|
||||||
|
alphaToHex.put("/", "35 b5");
|
||||||
|
alphaToHex.put(":", "2a 27 aa a7");
|
||||||
|
alphaToHex.put("%", "2a 06 aa 86");
|
||||||
|
alphaToHex.put("_", "2a 0c aa 8c");
|
||||||
|
alphaToHex.put("&", "2a 08 aa 88");
|
||||||
|
alphaToHex.put("(", "2a 0a aa 8a");
|
||||||
|
alphaToHex.put(")", "2a 0b aa 8b");
|
||||||
|
return Collections.unmodifiableMap(alphaToHex);
|
||||||
|
}
|
||||||
|
private static Map<String, String> createSpecialMap() {
|
||||||
|
Map<String, String> special = new HashMap<String, String>();
|
||||||
|
special.put("<Enter>", "1c 9c");
|
||||||
|
special.put("<Backspace>", "0e 8e");
|
||||||
|
special.put("<Spacebar>", "39 b9");
|
||||||
|
special.put("<Return>", "1c 9c");
|
||||||
|
special.put("<Esc>", "01 81");
|
||||||
|
special.put("<Tab>", "0f 8f");
|
||||||
|
special.put("<KillX>", "1d 38 0e");
|
||||||
|
special.put("<Wait>", "wait");
|
||||||
|
|
||||||
|
special.put("<Up>", "48 c8");
|
||||||
|
special.put("<Down>", "50 d0");
|
||||||
|
special.put("<PageUp>", "49 c9");
|
||||||
|
special.put("<PageDown>", "51 d1");
|
||||||
|
special.put("<End>", "4f cf");
|
||||||
|
special.put("<Insert>", "52 d2");
|
||||||
|
special.put("<Delete>", "53 d3");
|
||||||
|
special.put("<Left>", "4b cb");
|
||||||
|
special.put("<Right>", "4d cd");
|
||||||
|
special.put("<Home>", "47 c7");
|
||||||
|
|
||||||
|
special.put("<F1>", "3b");
|
||||||
|
special.put("<F2>", "3c");
|
||||||
|
special.put("<F3>", "3d");
|
||||||
|
special.put("<F4>", "3e");
|
||||||
|
special.put("<F5>", "3f");
|
||||||
|
special.put("<F6>", "40");
|
||||||
|
special.put("<F7>", "41");
|
||||||
|
special.put("<F8>", "42");
|
||||||
|
special.put("<F9>", "43");
|
||||||
|
special.put("<F10>", "44");
|
||||||
|
return Collections.unmodifiableMap(special);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,87 @@
|
||||||
|
## Options to set on the command line
|
||||||
|
d-i debian-installer/locale string en_US.utf8
|
||||||
|
d-i console-setup/ask_detect boolean false
|
||||||
|
d-i console-setup/layout string USA
|
||||||
|
|
||||||
|
#d-i netcfg/get_hostname string dummy
|
||||||
|
d-i netcfg/get_hostname string unassigned-hostname
|
||||||
|
d-i netcfg/get_domain string unassigned-domain
|
||||||
|
|
||||||
|
# Continue without a default route
|
||||||
|
# Not working , specify a dummy in the DHCP
|
||||||
|
#d-i netcfg/no_default_route boolean
|
||||||
|
|
||||||
|
d-i time/zone string UTC
|
||||||
|
d-i clock-setup/utc-auto boolean true
|
||||||
|
d-i clock-setup/utc boolean true
|
||||||
|
|
||||||
|
d-i kbd-chooser/method select American English
|
||||||
|
|
||||||
|
d-i netcfg/wireless_wep string
|
||||||
|
|
||||||
|
d-i base-installer/kernel/override-image string linux-server
|
||||||
|
#d-i base-installer/kernel/override-image string linux-image-2.6.32-21-generic
|
||||||
|
|
||||||
|
# Choices: Dialog, Readline, Gnome, Kde, Editor, Noninteractive
|
||||||
|
d-i debconf debconf/frontend select Noninteractive
|
||||||
|
|
||||||
|
d-i pkgsel/install-language-support boolean false
|
||||||
|
tasksel tasksel/first multiselect standard, ubuntu-server
|
||||||
|
|
||||||
|
#d-i partman-auto/method string regular
|
||||||
|
d-i partman-auto/method string lvm
|
||||||
|
#d-i partman-auto/purge_lvm_from_device boolean true
|
||||||
|
|
||||||
|
d-i partman-lvm/confirm boolean true
|
||||||
|
d-i partman-lvm/device_remove_lvm boolean true
|
||||||
|
d-i partman-auto/choose_recipe select atomic
|
||||||
|
|
||||||
|
d-i partman/confirm_write_new_label boolean true
|
||||||
|
d-i partman/confirm_nooverwrite boolean true
|
||||||
|
d-i partman/choose_partition select finish
|
||||||
|
d-i partman/confirm boolean true
|
||||||
|
|
||||||
|
#http://ubuntu-virginia.ubuntuforums.org/showthread.php?p=9626883
|
||||||
|
#Message: "write the changes to disk and configure lvm preseed"
|
||||||
|
#http://serverfault.com/questions/189328/ubuntu-kickstart-installation-using-lvm-waits-for-input
|
||||||
|
#preseed partman-lvm/confirm_nooverwrite boolean true
|
||||||
|
|
||||||
|
# Write the changes to disks and configure LVM?
|
||||||
|
d-i partman-lvm/confirm boolean true
|
||||||
|
d-i partman-lvm/confirm_nooverwrite boolean true
|
||||||
|
d-i partman-auto-lvm/guided_size string max
|
||||||
|
|
||||||
|
## Default user, we can get away with a recipe to change this
|
||||||
|
d-i passwd/user-fullname string toor
|
||||||
|
d-i passwd/username string toor
|
||||||
|
d-i passwd/user-password password password
|
||||||
|
d-i passwd/user-password-again password password
|
||||||
|
d-i user-setup/encrypt-home boolean false
|
||||||
|
d-i user-setup/allow-password-weak boolean true
|
||||||
|
|
||||||
|
## minimum is puppet and ssh and ntp
|
||||||
|
# Individual additional packages to install
|
||||||
|
d-i pkgsel/include string openssh-server ntp dkms virtualbox-guest-additions build-essential module-assistant
|
||||||
|
|
||||||
|
# Whether to upgrade packages after debootstrap.
|
||||||
|
# Allowed values: none, safe-upgrade, full-upgrade
|
||||||
|
d-i pkgsel/upgrade select full-upgrade
|
||||||
|
|
||||||
|
d-i grub-installer/only_debian boolean true
|
||||||
|
d-i grub-installer/with_other_os boolean true
|
||||||
|
d-i finish-install/reboot_in_progress note
|
||||||
|
|
||||||
|
#For the update
|
||||||
|
d-i pkgsel/update-policy select none
|
||||||
|
|
||||||
|
# debconf-get-selections --install
|
||||||
|
#Use mirror
|
||||||
|
#d-i apt-setup/use_mirror boolean true
|
||||||
|
#d-i mirror/country string manual
|
||||||
|
#choose-mirror-bin mirror/protocol string http
|
||||||
|
#choose-mirror-bin mirror/http/hostname string 192.168.4.150
|
||||||
|
#choose-mirror-bin mirror/http/directory string /ubuntu
|
||||||
|
#choose-mirror-bin mirror/suite select maverick
|
||||||
|
#d-i debian-installer/allow_unauthenticated string true
|
||||||
|
|
||||||
|
choose-mirror-bin mirror/http/proxy string
|
Loading…
Reference in New Issue