blob: cfe9339ec7b36e968d5daf18466ebed43223c107 [file] [log] [blame]
// Copyright 2022 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
library fuchsia.virtualization;
using zx;
type GuestManagerError = strict enum {
/// The guest manager failed to parse the configuration from the guest package, or it was
/// otherwise invalid.
BAD_CONFIG = 1;
/// The guest is already running. Stop the guest before attempting to launch again.
ALREADY_RUNNING = 2;
/// Attempted to connect to a non-running guest.
NOT_RUNNING = 3;
/// Failed to start the guest. See VMM component logs for a more detailed reason.
START_FAILURE = 4;
/// The guest required allocating some persistant storage but was unable to
/// do so.
NO_STORAGE = 5;
};
type GuestStatus = strict enum {
/// Initial state when the guest manager is created but before the guest has ever been run.
NOT_STARTED = 1;
/// A client has instructed the guest manager to begin launching the guest.
STARTING = 2;
/// The guest's dispatch loops are running. This is the expected steady state.
RUNNING = 3;
/// A client has instructed the guest manager to begin stopping the guest. If a non-zero
/// has been provided, the guest manager may attempt to gracefully shutdown the guest.
STOPPING = 4;
/// The guest is no longer running. A stop reason may be present if the guest stopped due to
/// an error.
STOPPED = 5;
/// The VMM component terminated unexpectedly. Attempting to launch the guest again will
/// restart the component.
VMM_UNEXPECTED_TERMINATION = 6;
};
/// An informational only subset of the GuestConfig. If adding new non-handle entries to the
/// GuestConfig, consider also adding them here.
type GuestDescriptor = table {
/// Number of guest VCPUs.
1: num_cpus uint8;
/// Guest memory in bytes.
2: guest_memory uint64;
/// Whether the guest was started with the given virtual device.
3: wayland bool;
4: magma bool;
5: balloon bool;
6: console bool;
7: gpu bool;
8: rng bool;
9: vsock bool;
10: sound bool;
/// The configs for each net device the guest was started with. If empty, there is no
/// virtual net device (and the guest will have no networking).
11: networks vector<NetSpec>:MAX_NET_DEVICES;
12: mem bool;
};
type GuestInfo = table {
/// The current state of the guest.
1: guest_status GuestStatus;
/// Current uptime of the guest.
2: uptime zx.Duration;
/// A subset of the config used to start the guest.
3: guest_descriptor GuestDescriptor;
/// Contains the last value reported to the guest manager if stopped due to an error.
4: stop_error GuestError;
/// Possible problems with a running guest flagged by the guest manager. These are not fatal
/// errors, and should be actionable by a user.
///
/// Note that these strings are for diagnostic purposes only. Consumers should not take any
/// action based on specific strings as they are subject to change without warning.
5: detected_problems vector<string:MAX>:8;
};
@discoverable
closed protocol GuestManager {
/// Launch a new guest instance.
///
/// Possible errors:
/// - BAD_CONFIG: Failed to parse the config from the guest package, or other config
/// problems detected by the guest manager.
/// - ALREADY_RUNNING: The guest is already running. Stop the guest before launching again.
/// - START_FAILURE: Failed to initialize the VMM and devices, and start the guest. See
/// component logs for a more specific failure.
strict Launch(resource struct {
guest_config GuestConfig;
controller server_end:Guest;
}) -> () error GuestManagerError;
/// Forcibly shuts down a running guest. Immediately after ForceShutdown returns, Launch can
/// be used to launch another guest.
strict ForceShutdown() -> ();
/// Connect to a currently running guest.
///
/// Possible errors:
/// - NOT_RUNNING: Attempted to connect to a guest in a non-running state. Ensure the guest
/// has launched before attempting to reconnect.
strict Connect(resource struct {
controller server_end:Guest;
}) -> () error GuestManagerError;
/// Query guest info
strict GetInfo() -> (resource struct {
guest_info GuestInfo;
});
};
// TODO(https://fxbug.dev/42051238): Reconsider the use of composition here
@discoverable
closed protocol ZirconGuestManager {
compose GuestManager;
};
@discoverable
closed protocol DebianGuestManager {
compose GuestManager;
};
@discoverable
closed protocol TerminaGuestManager {
compose GuestManager;
};