// Copyright 2018 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 fuchsia.sys;

protocol Realm {
    /// Launch a new guest instance into this environment. The `cid` of the
    /// instance is returned so that it can be uniquely identified.
    LaunchInstance(resource struct {
        url fuchsia.sys.component_url;
        label string:<MAX, optional>;
        guest_config GuestConfig;
        controller server_end:Guest;
    }) -> (struct {
        cid uint32;
    });

    /// Query for guests running in this environment.
    ListInstances() -> (struct {
        instances vector<InstanceInfo>;
    });

    /// Connect to a currently running guest instance identified by `cid`. The
    /// `cid` can be found via the return value of `LaunchInstance` or a call to
    /// `ListInstances`.
    ConnectToInstance(resource struct {
        cid uint32;
        controller server_end:Guest;
    });

    /// Connect to the memory balloon of a currently running guest instance
    /// identified by `cid`.
    ConnectToBalloon(resource struct {
        cid uint32;
        controller server_end:BalloonController;
    });

    /// Returns an interface that can be used to access the host vsock endpoint.
    GetHostVsockEndpoint(resource struct {
        endpoint server_end:HostVsockEndpoint;
    });
};
