Skip to content
This repository has been archived by the owner on Apr 20, 2024. It is now read-only.

Commit

Permalink
Ensure that grub-bhyve is handed an available console
Browse files Browse the repository at this point in the history
Fix: #34
  • Loading branch information
io7m committed Jul 30, 2020
1 parent 389a52f commit d4f683e
Show file tree
Hide file tree
Showing 24 changed files with 221 additions and 51 deletions.
2 changes: 1 addition & 1 deletion com.io7m.waxmill.boot/pom.xml
Expand Up @@ -9,7 +9,7 @@
<parent>
<artifactId>com.io7m.waxmill</artifactId>
<groupId>com.io7m.waxmill</groupId>
<version>0.0.9</version>
<version>0.0.10-SNAPSHOT</version>
</parent>

<artifactId>com.io7m.waxmill.boot</artifactId>
Expand Down
Expand Up @@ -31,6 +31,7 @@
import com.io7m.waxmill.machines.WXMBootConfigurationUEFI;
import com.io7m.waxmill.machines.WXMBootDiskAttachment;
import com.io7m.waxmill.machines.WXMCommandExecution;
import com.io7m.waxmill.machines.WXMConsoles;
import com.io7m.waxmill.machines.WXMDeviceAHCIDisk;
import com.io7m.waxmill.machines.WXMDeviceAHCIOpticalDisk;
import com.io7m.waxmill.machines.WXMDeviceE1000;
Expand Down Expand Up @@ -75,6 +76,7 @@

import static com.io7m.waxmill.machines.WXMBootConfigurationType.WXMEvaluatedBootConfigurationType;
import static com.io7m.waxmill.machines.WXMDeviceType.WXMDeviceVirtioNetworkType.WXMTTYBackendType;
import static com.io7m.waxmill.machines.WXMDeviceType.WXMLPCTTYNames.WXM_COM1;
import static com.io7m.waxmill.machines.WXMDeviceType.WXMStorageBackendType;
import static com.io7m.waxmill.machines.WXMTTYBackends.NMDMSide.NMDM_GUEST;
import static com.io7m.waxmill.machines.WXMTTYBackends.nmdmPath;
Expand Down Expand Up @@ -502,16 +504,76 @@ private WXMCommandExecution generateGRUBBhyveCommand()
this.machine.memory()
.totalMegabytes();

return WXMCommandExecution.builder()
.setExecutable(this.clientConfiguration.grubBhyveExecutable())
.addArguments(String.format("--device-map=%s", deviceMapPath))
final WXMCommandExecution.Builder builder =
WXMCommandExecution.builder();

builder.setExecutable(this.clientConfiguration.grubBhyveExecutable());

final var consoleOpt = WXMConsoles.findDefaultConsole(this.machine);
consoleOpt.ifPresent(device -> {
this.generateGRUBBhyveCommandConsoleDevice(builder, device);
});

return builder.addArguments(String.format("--device-map=%s", deviceMapPath))
.addArguments("--root=host")
.addArguments(String.format("--directory=%s", basePath))
.addArguments(String.format("--memory=%sM", memoryMB))
.addArguments(WXMShortIDs.encode(this.machine.id()))
.build();
}

private void generateGRUBBhyveCommandConsoleDevice(
final WXMCommandExecution.Builder builder,
final WXMDeviceType device)
{
switch (device.kind()) {
case WXM_LPC: {
final var lpc = (WXMDeviceLPC) device;
final var backend = lpc.backendMap().get(WXM_COM1.deviceName());
this.generateGRUBBhyveCommandConsoleDeviceLPCBackend(builder, backend);
return;
}

case WXM_HOSTBRIDGE:
case WXM_VIRTIO_NETWORK:
case WXM_VIRTIO_BLOCK:
case WXM_AHCI_HD:
case WXM_AHCI_CD:
case WXM_PASSTHRU:
case WXM_E1000:
case WXM_FRAMEBUFFER:
throw new UnreachableCodeException();
}

throw new UnreachableCodeException();
}

private void generateGRUBBhyveCommandConsoleDeviceLPCBackend(
final WXMCommandExecution.Builder builder,
final WXMTTYBackendType backend)
{
switch (backend.kind()) {
case WXM_FILE: {
final var file = (WXMTTYBackendFile) backend;
builder.addArguments(String.format("--cons-dev=%s", file.path()));
break;
}
case WXM_NMDM: {
builder.addArguments(String.format("--cons-dev=%s", nmdmPath(
this.clientConfiguration.virtualMachineRuntimeFilesystem()
.mountPoint()
.getFileSystem(),
this.machine.id(),
NMDM_GUEST
)));
break;
}
case WXM_STDIO: {
break;
}
}
}

private WXMCommandExecution generateBhyveCommand(
final WXMBootConfigurationType bootConfiguration,
final Map<WXMDeviceSlot, WXMBootDiskAttachment> attachments)
Expand Down Expand Up @@ -867,7 +929,10 @@ private void configureBhyveFlags(
configureBhyveFlag(cmd, flags.generateACPITables(), "-A");
configureBhyveFlag(cmd, flags.guestAPICIsX2APIC(), "-x");
configureBhyveFlag(cmd, flags.includeGuestMemoryInCoreFiles(), "-C");
configureBhyveFlag(cmd, flags.ignoreUnimplementedModelSpecificRegisters(), "-w");
configureBhyveFlag(
cmd,
flags.ignoreUnimplementedModelSpecificRegisters(),
"-w");
configureBhyveFlag(cmd, flags.realTimeClockIsUTC(), "-u");
configureBhyveFlag(cmd, flags.wireGuestMemory(), "-S");
configureBhyveFlag(cmd, flags.yieldCPUOnHLT(), "-H");
Expand Down
2 changes: 1 addition & 1 deletion com.io7m.waxmill.client.api/pom.xml
Expand Up @@ -9,7 +9,7 @@
<parent>
<artifactId>com.io7m.waxmill</artifactId>
<groupId>com.io7m.waxmill</groupId>
<version>0.0.9</version>
<version>0.0.10-SNAPSHOT</version>
</parent>

<artifactId>com.io7m.waxmill.client.api</artifactId>
Expand Down
2 changes: 1 addition & 1 deletion com.io7m.waxmill.client.vanilla/pom.xml
Expand Up @@ -9,7 +9,7 @@
<parent>
<artifactId>com.io7m.waxmill</artifactId>
<groupId>com.io7m.waxmill</groupId>
<version>0.0.9</version>
<version>0.0.10-SNAPSHOT</version>
</parent>

<artifactId>com.io7m.waxmill.client.vanilla</artifactId>
Expand Down
Expand Up @@ -24,6 +24,7 @@
import com.io7m.waxmill.database.api.WXMVirtualMachineDatabaseType;
import com.io7m.waxmill.exceptions.WXMException;
import com.io7m.waxmill.machines.WXMBootConfigurationName;
import com.io7m.waxmill.machines.WXMConsoles;
import com.io7m.waxmill.machines.WXMDeviceLPC;
import com.io7m.waxmill.machines.WXMDeviceType;
import com.io7m.waxmill.machines.WXMDryRun;
Expand All @@ -42,9 +43,7 @@
import java.util.Objects;
import java.util.Optional;
import java.util.UUID;
import java.util.stream.Collectors;

import static com.io7m.waxmill.machines.WXMDeviceType.Kind.WXM_LPC;
import static com.io7m.waxmill.machines.WXMDeviceType.WXMLPCTTYNames.WXM_COM1;
import static com.io7m.waxmill.machines.WXMDryRun.DRY_RUN;
import static com.io7m.waxmill.machines.WXMDryRun.EXECUTE;
Expand Down Expand Up @@ -200,26 +199,7 @@ public Optional<WXMDeviceType> vmConsoleGet(
final WXMVirtualMachine machine)
{
Objects.requireNonNull(machine, "machine");

final var consoleDevices =
machine.devices()
.stream()
.filter(dev -> dev.kind() == WXM_LPC)
.map(WXMDeviceLPC.class::cast)
.filter(lpc -> lpc.backendMap().containsKey(WXM_COM1.deviceName()))
.collect(Collectors.toList());

final var deviceCount = consoleDevices.size();
LOG.debug(
"found {} console devices in machine {}",
Integer.valueOf(deviceCount),
machine.id()
);

if (deviceCount == 1) {
return Optional.of(consoleDevices.get(0));
}
return Optional.empty();
return WXMConsoles.findDefaultConsole(machine);
}

@Override
Expand Down
2 changes: 1 addition & 1 deletion com.io7m.waxmill.cmdline/pom.xml
Expand Up @@ -9,7 +9,7 @@
<parent>
<artifactId>com.io7m.waxmill</artifactId>
<groupId>com.io7m.waxmill</groupId>
<version>0.0.9</version>
<version>0.0.10-SNAPSHOT</version>
</parent>

<artifactId>com.io7m.waxmill.cmdline</artifactId>
Expand Down
2 changes: 1 addition & 1 deletion com.io7m.waxmill.database.api/pom.xml
Expand Up @@ -9,7 +9,7 @@
<parent>
<artifactId>com.io7m.waxmill</artifactId>
<groupId>com.io7m.waxmill</groupId>
<version>0.0.9</version>
<version>0.0.10-SNAPSHOT</version>
</parent>

<artifactId>com.io7m.waxmill.database.api</artifactId>
Expand Down
2 changes: 1 addition & 1 deletion com.io7m.waxmill.database.vanilla/pom.xml
Expand Up @@ -9,7 +9,7 @@
<parent>
<artifactId>com.io7m.waxmill</artifactId>
<groupId>com.io7m.waxmill</groupId>
<version>0.0.9</version>
<version>0.0.10-SNAPSHOT</version>
</parent>

<artifactId>com.io7m.waxmill.database.vanilla</artifactId>
Expand Down
2 changes: 1 addition & 1 deletion com.io7m.waxmill.documentation/pom.xml
Expand Up @@ -9,7 +9,7 @@
<parent>
<artifactId>com.io7m.waxmill</artifactId>
<groupId>com.io7m.waxmill</groupId>
<version>0.0.9</version>
<version>0.0.10-SNAPSHOT</version>
</parent>

<artifactId>com.io7m.waxmill.documentation</artifactId>
Expand Down
2 changes: 1 addition & 1 deletion com.io7m.waxmill.exceptions/pom.xml
Expand Up @@ -9,7 +9,7 @@
<parent>
<artifactId>com.io7m.waxmill</artifactId>
<groupId>com.io7m.waxmill</groupId>
<version>0.0.9</version>
<version>0.0.10-SNAPSHOT</version>
</parent>

<artifactId>com.io7m.waxmill.exceptions</artifactId>
Expand Down
2 changes: 1 addition & 1 deletion com.io7m.waxmill.locks/pom.xml
Expand Up @@ -9,7 +9,7 @@
<parent>
<artifactId>com.io7m.waxmill</artifactId>
<groupId>com.io7m.waxmill</groupId>
<version>0.0.9</version>
<version>0.0.10-SNAPSHOT</version>
</parent>

<artifactId>com.io7m.waxmill.locks</artifactId>
Expand Down
6 changes: 5 additions & 1 deletion com.io7m.waxmill.machines/pom.xml
Expand Up @@ -9,7 +9,7 @@
<parent>
<artifactId>com.io7m.waxmill</artifactId>
<groupId>com.io7m.waxmill</groupId>
<version>0.0.9</version>
<version>0.0.10-SNAPSHOT</version>
</parent>

<artifactId>com.io7m.waxmill.machines</artifactId>
Expand Down Expand Up @@ -42,6 +42,10 @@
<groupId>com.io7m.junreachable</groupId>
<artifactId>com.io7m.junreachable.core</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>

<dependency>
<groupId>org.osgi</groupId>
Expand Down
@@ -0,0 +1,76 @@
/*
* Copyright © 2020 Mark Raynsford <code@io7m.com> http://io7m.com
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
* IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/

package com.io7m.waxmill.machines;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;

import static com.io7m.waxmill.machines.WXMDeviceType.Kind.WXM_LPC;
import static com.io7m.waxmill.machines.WXMDeviceType.WXMLPCTTYNames.WXM_COM1;

/**
* Functions over consoles.
*/

public final class WXMConsoles
{
private static final Logger LOG =
LoggerFactory.getLogger(WXMConsoles.class);

private WXMConsoles()
{

}

/**
* Find the default console for the given machine.
*
* @param machine The machine
*
* @return The default console, if exactly one exists
*/

public static Optional<WXMDeviceType> findDefaultConsole(
final WXMVirtualMachine machine)
{
Objects.requireNonNull(machine, "machine");

final var consoleDevices =
machine.devices()
.stream()
.filter(dev -> dev.kind() == WXM_LPC)
.map(WXMDeviceLPC.class::cast)
.filter(lpc -> lpc.backendMap().containsKey(WXM_COM1.deviceName()))
.collect(Collectors.toList());

final var deviceCount = consoleDevices.size();
LOG.debug(
"found {} console devices in machine {}",
Integer.valueOf(deviceCount),
machine.id()
);

if (deviceCount == 1) {
return Optional.of(consoleDevices.get(0));
}
return Optional.empty();
}
}
1 change: 1 addition & 0 deletions com.io7m.waxmill.machines/src/main/java/module-info.java
Expand Up @@ -30,6 +30,7 @@
requires com.io7m.junreachable.core;
requires com.io7m.waxmill.exceptions;
requires com.io7m.waxmill.strings.api;
requires org.slf4j;

exports com.io7m.waxmill.machines;
}
2 changes: 1 addition & 1 deletion com.io7m.waxmill.parser.api/pom.xml
Expand Up @@ -9,7 +9,7 @@
<parent>
<artifactId>com.io7m.waxmill</artifactId>
<groupId>com.io7m.waxmill</groupId>
<version>0.0.9</version>
<version>0.0.10-SNAPSHOT</version>
</parent>

<artifactId>com.io7m.waxmill.parser.api</artifactId>
Expand Down
2 changes: 1 addition & 1 deletion com.io7m.waxmill.process.api/pom.xml
Expand Up @@ -9,7 +9,7 @@
<parent>
<artifactId>com.io7m.waxmill</artifactId>
<groupId>com.io7m.waxmill</groupId>
<version>0.0.9</version>
<version>0.0.10-SNAPSHOT</version>
</parent>

<artifactId>com.io7m.waxmill.process.api</artifactId>
Expand Down
2 changes: 1 addition & 1 deletion com.io7m.waxmill.process.posix/pom.xml
Expand Up @@ -9,7 +9,7 @@
<parent>
<artifactId>com.io7m.waxmill</artifactId>
<groupId>com.io7m.waxmill</groupId>
<version>0.0.9</version>
<version>0.0.10-SNAPSHOT</version>
</parent>

<artifactId>com.io7m.waxmill.process.posix</artifactId>
Expand Down
2 changes: 1 addition & 1 deletion com.io7m.waxmill.realize/pom.xml
Expand Up @@ -9,7 +9,7 @@
<parent>
<artifactId>com.io7m.waxmill</artifactId>
<groupId>com.io7m.waxmill</groupId>
<version>0.0.9</version>
<version>0.0.10-SNAPSHOT</version>
</parent>

<artifactId>com.io7m.waxmill.realize</artifactId>
Expand Down
2 changes: 1 addition & 1 deletion com.io7m.waxmill.serializer.api/pom.xml
Expand Up @@ -8,7 +8,7 @@
<parent>
<artifactId>com.io7m.waxmill</artifactId>
<groupId>com.io7m.waxmill</groupId>
<version>0.0.9</version>
<version>0.0.10-SNAPSHOT</version>
</parent>

<artifactId>com.io7m.waxmill.serializer.api</artifactId>
Expand Down
2 changes: 1 addition & 1 deletion com.io7m.waxmill.strings.api/pom.xml
Expand Up @@ -9,7 +9,7 @@
<parent>
<artifactId>com.io7m.waxmill</artifactId>
<groupId>com.io7m.waxmill</groupId>
<version>0.0.9</version>
<version>0.0.10-SNAPSHOT</version>
</parent>

<artifactId>com.io7m.waxmill.strings.api</artifactId>
Expand Down

0 comments on commit d4f683e

Please sign in to comment.