// Copyright 2017 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

syntax = "proto3";

option cc_enable_arenas = true;

// This file defines services that will be running in the guest VM.
package vm_tools;

import "common.proto";
import "google/protobuf/timestamp.proto";

// Parameters for setting up IPv4 networking inside the VM.  Each parameter
// is stored in network-byte order (for example from the output of inet_pton).
message IPv4Config {
  // IPv4 address for the VM.
  fixed32 address = 1;
  // VM subnet.
  fixed32 netmask = 2;
  // Gateway for sending packets out to the internet.
  fixed32 gateway = 3;
}

// DNS parameters for the VM. These correspond to settings in resolv.conf(5).
message ResolvConfig {
  // The nameservers to use for DNS resolution.
  repeated string nameservers = 1;

  // The search domains for hostname lookup. See resolv.conf(5).
  repeated string search_domains = 2;
}

message NetworkConfigRequest {
  // IPv4 configuration for the VM.
  IPv4Config ipv4_config = 1;

  // DNS configuration for the VM.
  ResolvConfig resolv_config = 2;
}

// Description of a single process that should be spawned by maitre'd.
message LaunchProcessRequest {
  // Process arguments.  argv[0] must be either an absolute path or the name of
  // an executable program that can be found in the default PATH inside the VM.
  repeated string argv = 1;

  // Any additional environment variables that should be set before spawning
  // the process.  Can be empty.
  map<string, string> env = 2;

  // If |true| the process will be respawned when it exits or is killed.
  // Processes that respawn too frequently will be stopped and will need to be
  // explicitly restarted via a LaunchProcess rpc.  Cannot be true if
  // |wait_for_exit| is true.
  bool respawn = 3;

  // If |true| the process will use /dev/console for its standard I/O.
  // Otherwise all standard I/O is redirected to /dev/null.
  bool use_console = 4;

  // If |true| then maitre'd will wait for the process to exit and include its
  // exit status in the response. Cannot be true if |respawn| is true.
  bool wait_for_exit = 5;
}

// The current status of a process launched via LaunchProcess.
enum ProcessStatus {
  // ¯\_(ツ)_/¯
  UNKNOWN = 0;

  // The process exited normally.
  EXITED = 1;

  // The process was killed by a signal.
  SIGNALED = 2;

  // Successfully launched but may or may not have exited yet.
  LAUNCHED = 3;

  // One or more setup steps failed and the process did not launch.
  FAILED = 4;
}

// Response sent back after maitre'd launches a process.  Will only be filled in
// if the |wait_for_exit| field of the LaunchProcessRequest was set to true.
message LaunchProcessResponse {
  // The status of the launched process.
  ProcessStatus status = 1;

  // If |status| is EXITED then this contains the exit status of the process. If
  // |status| is SIGNALED then this contains the signal number that killed the
  // process.  Otherwise the contents of this field are undefined.
  sint32 code = 2;
}

// Request for maitred to mount a filesystem.
message MountRequest {
  string source = 1;
  string target = 2;
  string fstype = 3;
  uint64 mountflags = 4;
  string options = 5;
}

// Request to mount a 9P filesystem via a vsock socket using the trans=fd
// option.
message Mount9PRequest {
  // The port number on the host where the server is listening for connections.
  uint32 port = 1;

  // The path where the filesystem should be mounted.
  string target = 2;
}

// Response after maitred attempts to mount a filesystem.
message MountResponse {
  sint32 error = 1;
}

// The request protobuf for a StartTermina message. StartTermina requests that
// maitred run all VM guest setup necessary to start containers.
message StartTerminaRequest {
  enum Feature {
    UNKNOWN = 0;
    USED_BY_TESTS = 1;
    START_LXD = 2;
  }
  // The address for tremplin to connect to.
  uint32 tremplin_ipv4_address = 1;

  // The IPv4 address config for LXD. Expected to be in a "xxx.xxx.xxx.xxx/yy"
  // format.
  string lxd_ipv4_subnet = 2;

  // Name of the device containing the stateful partition.
  string stateful_device = 3;

  // Allow termina to support privileged containers.
  bool allow_privileged_containers = 4;

  // Which termina features to enable.
  repeated Feature feature = 5;
}

message StartTerminaResponse {
  enum MountResult {
    // The mountability of the disk is unknown, typically because the
    // call failed before trying to mount the disk.
    UNKNOWN = 0;

    // The disk mount succeeded completely.
    SUCCESS = 1;

    // The disk mount succeeded, but some data loss is
    // likely. Currently this occurrs when the initial mount fails,
    // but succeeds on a retry with -o usebackuproots.
    PARTIAL_DATA_LOSS = 2;

    // The disk is unmountable.
    FAILURE = 3;
  }

  MountResult mount_result = 1;
}

message SetResolvConfigRequest {
  // DNS configuration for the VM.
  ResolvConfig resolv_config = 1;
}

// Protos to update time in guest.
// This RPC is necessary because Linux on ARM does not have paravirtualized
// time, so (especially on resume) there can be significant clock drift as
// compared to the host.  We work around this on ARM by triggering guest clock
// update on resume, using this RPC.
// See https://crbug.com/823406 for details.
message SetTimeRequest {
  // The current time, as seconds and nanos since UTC epoch. (Jan 1, 1970)
  google.protobuf.Timestamp time = 1;
}

// Response to GetKernelVersion, containing detailed Termina kernel information
// for enterprise reporting.
message GetKernelVersionResponse {
  string kernel_release = 1;
  string kernel_version = 2;
}

// Request to resize the stateful filesystem to a new size.
// This is an asynchronous request; its state may be queried with
// the GetResizeStatus method.
message ResizeFilesystemRequest {
  // Requested size of the stateful filesystem in bytes.
  uint64 size = 1;
}

// Response to ResizeFilesystemRequest.
message ResizeFilesystemResponse {
  enum ResizeStatus {
    // Could not start the filesystem request due to an error.
    FAILED = 0;

    // Another resize request is already in progress; this request will not be
    // carried out.
    ALREADY_IN_PROGRESS = 1;

    // Resize is started and can be monitored via GetResizeStatus.
    STARTED = 2;
  }

  ResizeStatus status = 1;
}

// Response to GetResizeStatus request.
message GetResizeStatusResponse {
  // True if a resize operation started by ResizeFilesystemRequest is underway.
  bool resize_in_progress = 1;

  // Current size of the stateful partition.
  // If a resize is in progress, this is the size before the resize started.
  uint64 current_size = 2;

  // Final target size of the current resize operation, if one is in progress.
  uint64 target_size = 3;
}

// Response to GetResizeBounds request.
message GetResizeBoundsResponse {
  // Minimum size in bytes that can be passed to ResizeFilesystem.
  uint64 minimum_size = 1;
}

// Implemented by maitred inside the VM.
service Maitred {
  // Set up networking inside the VM so that it can access the internet.
  rpc ConfigureNetwork(NetworkConfigRequest) returns (EmptyMessage);

  // DEPRECATED. Use OnHostNetworkChanged instead.
  // Reset IPv6 in VM and restart SLAAC process to acquire a new configuration.
  rpc ResetIPv6(EmptyMessage) returns (EmptyMessage);

  // Informs the guest that the host network has changed. The guest should
  // perform any actions necessary, such as resetting potentially stale sockets,
  // flushing DNS caches, and renegotiating SLAAC addresses for IPv6.
  rpc OnHostNetworkChanged(EmptyMessage) returns (EmptyMessage);

  // Initiate a shut-down of the VM.
  rpc Shutdown(EmptyMessage) returns (EmptyMessage);

  // Launch one process inside the VM.
  rpc LaunchProcess(LaunchProcessRequest) returns (LaunchProcessResponse);

  // Mount a filesystem in the VM.
  rpc Mount(MountRequest) returns (MountResponse);

  // Start Termina-specific system services.
  rpc StartTermina(StartTerminaRequest) returns (StartTerminaResponse);

  // Set the VM time to a specified value.
  // If the new time is invalid (roughly 0), ignore it.
  // This RPC is to address cases where the guest loses time for some reason
  // (e.g. due to the host being suspended for a while).
  rpc SetTime(SetTimeRequest) returns (EmptyMessage);

  // Mount a 9P server using a vsock socket.  This uses the trans=fd option
  // when mounting the 9P server, which requires first connecting a socket
  // to the server.  Other transports should use the normal Mount rpc instead.
  rpc Mount9P(Mount9PRequest) returns (MountResponse);

  // Sets the resolv config (nameservers, search domains, and local domain).
  rpc SetResolvConfig(SetResolvConfigRequest) returns (EmptyMessage);

  // Returns the kernel release and version for enterprise reporting.
  rpc GetKernelVersion(EmptyMessage) returns (GetKernelVersionResponse);

  // Resizes the stateful filesystem.
  rpc ResizeFilesystem(ResizeFilesystemRequest)
      returns (ResizeFilesystemResponse);

  // Queries the status of the most recent ResizeFilesystem request.
  rpc GetResizeStatus(EmptyMessage) returns (GetResizeStatusResponse);

  // Gets information about the valid range of parameters to ResizeFilesystem.
  rpc GetResizeBounds(EmptyMessage) returns (GetResizeBoundsResponse);

  // Prepares to suspend the VM.
  rpc PrepareToSuspend(EmptyMessage) returns (EmptyMessage);
}
