mirror of https://github.com/apache/jclouds.git
Added check for web server in IsoToIMachine.
This commit is contained in:
parent
e6200d6374
commit
57cef512cb
|
@ -20,6 +20,7 @@
|
||||||
package org.jclouds.virtualbox.functions;
|
package org.jclouds.virtualbox.functions;
|
||||||
|
|
||||||
import com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
|
import com.google.common.base.Predicate;
|
||||||
import com.google.inject.Inject;
|
import com.google.inject.Inject;
|
||||||
import org.jclouds.compute.ComputeServiceContext;
|
import org.jclouds.compute.ComputeServiceContext;
|
||||||
import org.jclouds.compute.domain.ExecResponse;
|
import org.jclouds.compute.domain.ExecResponse;
|
||||||
|
@ -27,6 +28,7 @@ import org.jclouds.compute.options.RunScriptOptions;
|
||||||
import org.jclouds.compute.reference.ComputeServiceConstants;
|
import org.jclouds.compute.reference.ComputeServiceConstants;
|
||||||
import org.jclouds.javax.annotation.Nullable;
|
import org.jclouds.javax.annotation.Nullable;
|
||||||
import org.jclouds.logging.Logger;
|
import org.jclouds.logging.Logger;
|
||||||
|
import org.jclouds.net.IPSocket;
|
||||||
import org.jclouds.ssh.SshException;
|
import org.jclouds.ssh.SshException;
|
||||||
import org.jclouds.virtualbox.domain.ExecutionType;
|
import org.jclouds.virtualbox.domain.ExecutionType;
|
||||||
import org.jclouds.virtualbox.settings.KeyboardScancodes;
|
import org.jclouds.virtualbox.settings.KeyboardScancodes;
|
||||||
|
@ -65,11 +67,15 @@ public class IsoToIMachine implements Function<String, IMachine> {
|
||||||
private ComputeServiceContext context;
|
private ComputeServiceContext context;
|
||||||
private String hostId;
|
private String hostId;
|
||||||
private String guestId;
|
private String guestId;
|
||||||
|
private Predicate<IPSocket> socketTester;
|
||||||
|
private String webServerHost;
|
||||||
|
private int webServerPort;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public IsoToIMachine(VirtualBoxManager manager, String adminDisk, String diskFormat, String settingsFile,
|
public IsoToIMachine(VirtualBoxManager manager, String adminDisk, String diskFormat, String settingsFile,
|
||||||
String vmName, String osTypeId, String vmId, boolean forceOverwrite, String controllerIDE,
|
String vmName, String osTypeId, String vmId, boolean forceOverwrite, String controllerIDE,
|
||||||
ComputeServiceContext context, String hostId, String guestId) {
|
ComputeServiceContext context, String hostId, String guestId, Predicate<IPSocket> socketTester,
|
||||||
|
String webServerHost, int webServerPort) {
|
||||||
this.manager = manager;
|
this.manager = manager;
|
||||||
this.adminDisk = adminDisk;
|
this.adminDisk = adminDisk;
|
||||||
this.diskFormat = diskFormat;
|
this.diskFormat = diskFormat;
|
||||||
|
@ -82,12 +88,15 @@ public class IsoToIMachine implements Function<String, IMachine> {
|
||||||
this.context = context;
|
this.context = context;
|
||||||
this.hostId = hostId;
|
this.hostId = hostId;
|
||||||
this.guestId = guestId;
|
this.guestId = guestId;
|
||||||
|
this.socketTester = socketTester;
|
||||||
|
this.webServerHost = webServerHost;
|
||||||
|
this.webServerPort = webServerPort;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IMachine apply(@Nullable String isoName) {
|
public IMachine apply(@Nullable String isoName) {
|
||||||
|
|
||||||
// TODO: Check Web Server is started and provides a preseed.cfg
|
ensureWebServerIsRunning();
|
||||||
|
|
||||||
final IMachine vm = new CreateAndRegisterMachineFromIsoIfNotAlreadyExists(settingsFile, osTypeId, vmId, forceOverwrite,
|
final IMachine vm = new CreateAndRegisterMachineFromIsoIfNotAlreadyExists(settingsFile, osTypeId, vmId, forceOverwrite,
|
||||||
manager).apply(vmName);
|
manager).apply(vmName);
|
||||||
|
@ -161,6 +170,13 @@ public class IsoToIMachine implements Function<String, IMachine> {
|
||||||
return vm;
|
return vm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void ensureWebServerIsRunning() {
|
||||||
|
final IPSocket webServerSocket = new IPSocket(webServerHost, webServerPort);
|
||||||
|
if (!socketTester.apply(webServerSocket)) {
|
||||||
|
throw new IllegalStateException(String.format("Web server is not running on host %s:%s which is needed to serve preseed.cfg.", webServerHost, webServerPort));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void ensureMachineIsLaunched(String vmName) {
|
private void ensureMachineIsLaunched(String vmName) {
|
||||||
applyForMachine(manager, vmName, new LaunchMachineIfNotAlreadyRunning(manager, ExecutionType.HEADLESS, ""));
|
applyForMachine(manager, vmName, new LaunchMachineIfNotAlreadyRunning(manager, ExecutionType.HEADLESS, ""));
|
||||||
}
|
}
|
||||||
|
@ -258,7 +274,7 @@ public class IsoToIMachine implements Function<String, IMachine> {
|
||||||
|
|
||||||
private String defaultInstallSequence() {
|
private String defaultInstallSequence() {
|
||||||
return "<Esc><Esc><Enter> "
|
return "<Esc><Esc><Enter> "
|
||||||
+ "/install/vmlinuz noapic preseed/url=http://10.0.2.2:8080/src/test/resources/preseed.cfg "
|
+ "/install/vmlinuz noapic preseed/url=http://10.0.2.2:" + webServerPort + "/src/test/resources/preseed.cfg "
|
||||||
+ "debian-installer=en_US auto locale=en_US kbd-chooser/method=us " + "hostname=" + vmName + " "
|
+ "debian-installer=en_US auto locale=en_US kbd-chooser/method=us " + "hostname=" + vmName + " "
|
||||||
+ "fb=false debconf/frontend=noninteractive "
|
+ "fb=false debconf/frontend=noninteractive "
|
||||||
+ "keyboard-configuration/layout=USA keyboard-configuration/variant=USA console-setup/ask_detect=false "
|
+ "keyboard-configuration/layout=USA keyboard-configuration/variant=USA console-setup/ask_detect=false "
|
||||||
|
@ -272,18 +288,19 @@ public class IsoToIMachine implements Function<String, IMachine> {
|
||||||
String converted = stringToKeycode(line);
|
String converted = stringToKeycode(line);
|
||||||
for (String word : converted.split(" ")) {
|
for (String word : converted.split(" ")) {
|
||||||
sb.append("vboxmanage controlvm ").append(vmName).append(" keyboardputscancode ").append(word).append("; ");
|
sb.append("vboxmanage controlvm ").append(vmName).append(" keyboardputscancode ").append(word).append("; ");
|
||||||
if (word.endsWith(KeyboardScancodes.SPECIAL_KEYBOARD_BUTTON_MAP.get("<Enter>"))) {
|
runScriptIfWordEndsWith(sb, word, "<Enter>");
|
||||||
runScriptOnNode(hostId, sb.toString(), runAsRoot(false).wrapInInitScript(false));
|
runScriptIfWordEndsWith(sb, word, "<Return>");
|
||||||
sb.delete(0, sb.length() - 1);
|
|
||||||
}
|
|
||||||
if (word.endsWith(KeyboardScancodes.SPECIAL_KEYBOARD_BUTTON_MAP.get("<Return>"))) {
|
|
||||||
runScriptOnNode(hostId, sb.toString(), runAsRoot(false).wrapInInitScript(false));
|
|
||||||
sb.delete(0, sb.length() - 1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void runScriptIfWordEndsWith(StringBuilder sb, String word, String key) {
|
||||||
|
if (word.endsWith(KeyboardScancodes.SPECIAL_KEYBOARD_BUTTON_MAP.get(key))) {
|
||||||
|
runScriptOnNode(hostId, sb.toString(), runAsRoot(false).wrapInInitScript(false));
|
||||||
|
sb.delete(0, sb.length() - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private String stringToKeycode(String s) {
|
private String stringToKeycode(String s) {
|
||||||
StringBuilder keycodes = new StringBuilder();
|
StringBuilder keycodes = new StringBuilder();
|
||||||
if (s.startsWith("<")) {
|
if (s.startsWith("<")) {
|
||||||
|
|
|
@ -26,15 +26,22 @@ import static org.testng.Assert.assertTrue;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import com.google.common.base.Predicate;
|
||||||
import org.jclouds.compute.ComputeServiceContext;
|
import org.jclouds.compute.ComputeServiceContext;
|
||||||
import org.jclouds.compute.config.BaseComputeServiceContextModule;
|
import org.jclouds.compute.config.BaseComputeServiceContextModule;
|
||||||
import org.jclouds.compute.domain.Image;
|
import org.jclouds.compute.domain.Image;
|
||||||
import org.jclouds.compute.domain.OsFamily;
|
import org.jclouds.compute.domain.OsFamily;
|
||||||
|
import org.jclouds.compute.predicates.SocketOpenPredicates;
|
||||||
import org.jclouds.compute.reference.ComputeServiceConstants;
|
import org.jclouds.compute.reference.ComputeServiceConstants;
|
||||||
import org.jclouds.domain.Credentials;
|
import org.jclouds.domain.Credentials;
|
||||||
import org.jclouds.json.Json;
|
import org.jclouds.json.Json;
|
||||||
import org.jclouds.json.config.GsonModule;
|
import org.jclouds.json.config.GsonModule;
|
||||||
|
import org.jclouds.net.IPSocket;
|
||||||
|
import org.jclouds.predicates.InetSocketAddressConnect;
|
||||||
|
import org.jclouds.predicates.RetryablePredicate;
|
||||||
|
import org.jclouds.predicates.SocketOpen;
|
||||||
import org.jclouds.virtualbox.BaseVirtualBoxClientLiveTest;
|
import org.jclouds.virtualbox.BaseVirtualBoxClientLiveTest;
|
||||||
import org.jclouds.virtualbox.functions.admin.UnregisterMachineIfExists;
|
import org.jclouds.virtualbox.functions.admin.UnregisterMachineIfExists;
|
||||||
import org.testng.annotations.BeforeGroups;
|
import org.testng.annotations.BeforeGroups;
|
||||||
|
@ -79,8 +86,9 @@ public class IsoToIMachineLiveTest extends BaseVirtualBoxClientLiveTest {
|
||||||
VirtualBoxManager manager = (VirtualBoxManager) context.getProviderSpecificContext().getApi();
|
VirtualBoxManager manager = (VirtualBoxManager) context.getProviderSpecificContext().getApi();
|
||||||
ComputeServiceContext localHostContext = computeServiceForLocalhostAndGuest(hostId, "localhost", guestId,
|
ComputeServiceContext localHostContext = computeServiceForLocalhostAndGuest(hostId, "localhost", guestId,
|
||||||
"localhost", new Credentials("toor", "password"));
|
"localhost", new Credentials("toor", "password"));
|
||||||
|
Predicate<IPSocket> socketTester = new RetryablePredicate<IPSocket>(new InetSocketAddressConnect(), 10, 1, TimeUnit.SECONDS);
|
||||||
IMachine imageMachine = new IsoToIMachine(manager, adminDisk, diskFormat, settingsFile, vmName, osTypeId, vmId,
|
IMachine imageMachine = new IsoToIMachine(manager, adminDisk, diskFormat, settingsFile, vmName, osTypeId, vmId,
|
||||||
forceOverwrite, controllerIDE, localHostContext, hostId, guestId)
|
forceOverwrite, controllerIDE, localHostContext, hostId, guestId, socketTester, "127.0.0.1", 8080)
|
||||||
.apply("ubuntu-11.04-server-i386.iso");
|
.apply("ubuntu-11.04-server-i386.iso");
|
||||||
|
|
||||||
IMachineToImage iMachineToImage = new IMachineToImage(manager, map);
|
IMachineToImage iMachineToImage = new IMachineToImage(manager, map);
|
||||||
|
|
Loading…
Reference in New Issue