// Copyright 2021 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;

/// The status of the Linux container.
type ContainerStatus = strict enum {
    TRANSIENT = 1;
    LAUNCHING_GUEST = 2;
    STARTING_VM = 3;
    DOWNLOADING = 4;
    EXTRACTING = 5;
    STARTING = 6;
    READY = 7;
    FAILED = 8;
};

/// Linux guest information.
type LinuxGuestInfo = table {
    /// Linux guest CID.
    1: cid uint32;

    /// The current container status.
    2: container_status ContainerStatus;

    /// Container download in percentage. Download percent is only
    /// available if container status is DOWNLOADING.
    3: download_percent int32;

    /// The reason for failure if the container could not be created,
    /// set if container status is FAILED.
    4: failure_reason string:MAX;
};

/// A `LinuxManager` provides access to the status of Linux guest instances.
@discoverable
closed protocol LinuxManager {
    /// Get Linux guest environment info.
    ///
    /// Returns ZX_ERR_UNAVAILABLE if the Linux guest is not available.
    strict StartAndGetLinuxGuestInfo(struct {
        label string:MAX;
    }) -> (struct {
        info LinuxGuestInfo;
    }) error zx.Status;

    /// Linux guest info event.
    ///
    /// Sent to the client when the status of the container changed.
    strict -> OnGuestInfoChanged(struct {
        label string:MAX;
        info LinuxGuestInfo;
    });

    /// Clears the stateful data. This includes any installed containers and any user data
    /// they may contain.
    ///
    /// Returns ZX_ERR_BAD_STATE if this is called while the VM is running.
    /// Returns ZX_ERR_IO if there was an IO failure while performing the
    /// operation.
    strict WipeData() -> () error zx.Status;

    /// Attempts to gracefully shut down a running guest. The caller must ensure that the guest
    /// has actually stopped (such as by waiting on a Guest client PEER_CLOSED signal and checking
    /// the epitaph) before attempting to launch another guest.
    ///
    /// On a clean shutdown the Guest client will contain a ZX_OK epitaph, and on an unexpected
    /// shutdown the client will contain a ZX_ERR_INTERNAL epitaph (or no epitaph if there was
    /// a component crash).
    strict GracefulShutdown();
};
