// Copyright 2019 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";

package chromiumos.config.api.test.tls;

option go_package = "go.chromium.org/chromiumos/config/go/api/test/tls";

import "google/protobuf/empty.proto";

import "dependencies/longrunning/operations.proto";

// Common lab services implemented on top of the wiring APIs.
//
// The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
// NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED",  "MAY", and
// "OPTIONAL" in this document are to be interpreted as described in
// RFC 2119.
//
// All clients SHOULD pass the gRPC metadata key request_trace_id with one
// value. The value is a unique string that is associated with the method call
// in metrics. Clients that do not pass request_trace_id MAY be rejected so that
// they can be fixed.
service Common {
  // ExecDutCommand runs a command on a DUT.
  //
  // The working directory is /.
  // A tty is not spawned for the command.
  // The user and group is root.
  // All signals have their default dispositions and are not masked.
  // The umask is set to 0.
  //
  // The environment contains:
  //
  //   TERM=dumb
  //   PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin
  //   LANG=en_US.UTF-8
  //   USER=root
  //   HOME=/root
  //
  // The environment MAY also contain SSH client variables.
  // The environment SHALL NOT contain variables not mentioned above.
  //
  // If the stream is interrupted, the implementation MAY attempt to
  // stop the command by sending SIGINT, SIGHUP, SIGTERM, or SIGKILL.
  rpc ExecDutCommand(ExecDutCommandRequest)
      returns (stream ExecDutCommandResponse);

  // ProvisionDut installs a specified version of Chrome OS on the DUT, along
  // with any specified DLCs.
  //
  // If the DUT is already on the specified version of Chrome OS, the OS will
  // not be provisioned.
  //
  // If the DUT already has the specified list of DLCs, only the missing DLCs
  // will be provisioned.
  rpc ProvisionDut(ProvisionDutRequest) returns (google.longrunning.Operation) {
    option (google.longrunning.operation_info) = {
      response_type: "ProvisionDutResponse",
      metadata_type: "ProvisionDutMetadata"
    };
  }

  // ProvisionLacros installs a specified version of Lacros on the DUT.
  //
  // If the DUT already has the specified version of Lacros, Lacros will not be
  // provisioned.
  rpc ProvisionLacros(ProvisionLacrosRequest) returns (google.longrunning.Operation) {
    option (google.longrunning.operation_info) = {
      response_type: "ProvisionLacrosResponse",
      metadata_type: "ProvisionLacrosMetadata"
    };
  }

  // FetchCrashes gets a stream of all crash reports currently on the DUT.
  //
  // The stream returned may split up a crash over multiple
  // `FetchCrashesResponse` protos. See the definition of that proto for
  // details.
  //
  // This call is read-only: it doesn't delete the crashes that it reads.
  rpc FetchCrashes(FetchCrashesRequest) returns (stream FetchCrashesResponse);

  // CreateFakeOmaha starts a fake Omaha service on TLS and exposes the
  // listened port to the DUT.
  rpc CreateFakeOmaha(CreateFakeOmahaRequest) returns (FakeOmaha);
  // DeleteFakeOmaha deletes the specified fake Omaha resource created by
  // CreateFakeOmaha.
  rpc DeleteFakeOmaha(DeleteFakeOmahaRequest) returns (google.protobuf.Empty);
}

message ExecDutCommandRequest {
  // name is the resource name for the DUT.
  // The DUT name is passed to the RTD when the RTD is started.
  // It is not specified whether the name is the DUT hostname.
  string name = 1;
  // command is the command to run.
  // If this contains no slashes, it is resolved using PATH.
  // If this starts with /, it is used as an absolute path to the
  // program to run.
  // Otherwise, this is treated as a path relative to the working
  // directory.
  string command = 2;
  // args are the arguments to pass to the command.
  repeated string args = 3;
  // stdin is passed to the command as the program's stdin.
  // The stream does not support seeking.
  // An empty bytes is not treated specially; if the command reads
  // from stdin, it will receive zero bytes.
  bytes stdin = 4;
  // stdout indicates how to handle the command's stdout.
  Output stdout = 5;
  // stderr indicates how to handle the command's stderr.
  Output stderr = 6;
}
message ExecDutCommandResponse {
  message ExitInfo {
    // status provides information about how the command process
    // terminated.
    //
    // If the command failed to start, status is set to an arbitrary
    // non-zero value.
    //
    // If signaled is set, status is set to the signal that caused
    // the command to terminate.
    //
    // Otherwise, status is set to the exit status of the process.
    // Exit statuses outside of 0 to 255 inclusive are not supported;
    // they will be mapped to an arbitrary non-zero value.
    //
    // status is zero if and only if the process was successfully
    // started and exited with a zero status.
    int32 status = 1;
    // signaled indicates whether the command exited due to a signal.
    // If set, status contains the signal.
    bool signaled = 2;
    // started indicates whether the command was started.
    bool started = 3;
    // error_message provides a human readable explanation for some errors.
    // This MUST NOT be inspected by programs.
    string error_message = 4;
  }
  // exit_info contains exit information.
  // This is set when the command has exited or failed to start.
  // This is set on the last message in the response stream.
  ExitInfo exit_info = 1;
  // stdout contains the shell command's stdout output since the last
  // response in the stream.
  // The implementation MAY batch or delay output to later
  // responses in the stream.
  bytes stdout = 2;
  // stderr contains the shell command's stderr output since the last
  // response in the stream.
  // The implementation MAY batch or delay output to later
  // responses in the stream.
  bytes stderr = 3;
}

// Output enumeration for ExecDutCommandRequest.
enum Output {
  // OUTPUT_PIPE means to collect output and return it.
  OUTPUT_PIPE = 0;
  // OUTPUT_STDOUT is a special value for stderr which means to merge stderr
  // into stdout.
  OUTPUT_STDOUT = 1;
}

message ProvisionDutRequest {
  // name is the resource name for the DUT.
  // The DUT name is passed to the RTD when the RTD is started.
  // It is not specified whether the name is the DUT hostname.
  string name = 1;

  // TODO(crbug.com/1155247) Deprecate this nested message and replace with
  // top level ChromeOsImage.
  message ChromeOSImage {
    oneof path_oneof {
      // gs_path_prefix is the GS path to where kernel, rootfs, and stateful
      // images are located. If DLCs are to be provisioned, it must be a GS path
      // that also has the dlc directory.
      // Only gs://chromeos-image-archive bucket is supported.
      // For example the format should be:
      // - gs://chromeos-image-archive/eve-release/R86-13380.0.0
      string gs_path_prefix = 1;
    }
  }
  // image specifies the Chrome OS image with which to provision the DUT.
  ChromeOSImage image = 2;

  // Reference DLCs developer documentation:
  // https://source.corp.google.com/chromeos_public/src/platform2/dlcservice/docs/developer.md
  message DLCSpec {
    // id is the DLC ID which is a unique identifier.
    // The DLC ID must follow a specific format that can be found in the DLC
    // developer doc below.
    string id = 1;
  }
  // dlc_specs specifies which DLCs to install on the DUT after provisioning.
  repeated DLCSpec dlc_specs = 3;
  // preserve_stateful specifies whether the stateful partition should be preserved during
  // provisioning. If preserve_stateful is not set to true, the stateful partition is
  // block-level wiped and reset during provisioning.
  bool preserve_stateful = 4;
}

message ProvisionDutResponse {
  // When the status code is other than OK, details in Status message should be
  // parsed for ErrorInfo message with the following Reasons as the reason.
  enum Reason {
    // status code: INVALID_ARGUMENT
    REASON_INVALID_REQUEST = 0;
    // status code: FAILED_PRECONDITION
    REASON_DUT_UNREACHABLE_PRE_PROVISION = 1;
    // status code: FAILED_PRECONDITION
    REASON_DOWNLOADING_IMAGE_FAILED = 2;
    // status code: DEADLINE_EXCEEDED
    REASON_PROVISIONING_TIMEDOUT = 3;
    // status code: ABORTED
    REASON_PROVISIONING_FAILED = 4;
    // status code: ABORTED
    REASON_DUT_UNREACHABLE_POST_PROVISION = 5;
  }
}

message ProvisionDutMetadata {
}

message ProvisionLacrosRequest {
  // name is the resource name for the DUT.
  // The DUT name is passed to the RTD when the RTD is started.
  // It is not specified whether the name is the DUT hostname.
  string name = 1;

  message LacrosImage {
    oneof path_oneof {
      // gs_path_prefix is the GS path prefix to where Lacros is located.
      string gs_path_prefix = 1;
    }
  }
  // image specifies the Lacros image with which to provision the DUT.
  LacrosImage image = 2;
}

message ProvisionLacrosResponse {
  // When the status code is other than OK, details in Status message should be
  // parsed for ErrorInfo message with the following Reasons as the reason.
  enum Reason {
    // Failed as the ProvisionLacros request is invalid.
    REASON_INVALID_REQUEST = 0;
    // Failed to connect to the DUT prior to provisioning Lacros.
    REASON_DUT_UNREACHABLE_PRE_PROVISION = 1;
    // Failed to download the Lacros image or a timeout during download.
    REASON_DOWNLOADING_IMAGE_FAILED = 2;
    // Failed due to a timeout during the main Lacros provisioning.
    // Excludes timeout during other steps.
    REASON_PROVISIONING_TIMEDOUT = 3;
    // General failure in Lacros provisioning.
    REASON_PROVISIONING_FAILED = 4;
  }
}

message ProvisionLacrosMetadata {
}

message FetchCrashesRequest {
    // dut is the resource name for the DUT from which to fetch crashes.
    // The DUT name is passed to the RTD when the RTD is started.
    // It is not specified whether the name is the DUT hostname.
    string dut = 1;
    // If true, fetch the core file.
    // For uploads to the crash server, that should generally be false.
    // If the crash file is likely to be used for manual debugging (e.g. on
    // a manually-invoked test suite run), this might be true.
    // Coredumps can be extremely large (even gigabytes), so if resource usage
    // is a concern, this should probably be false.
    bool fetch_core = 2;
}

// When this response is streamed, the first proto with a given crash ID will
// always contain the CrashInfo.
// Files and core dumps (if present) may be streamed. If they are,
// subsequent protos with the same crash ID will follow, each containing a chunk
// of file/coredump. To reassemble these, concatenate the bytes received from
// each subsequent proto with a matching crash_id (concatenate blobs that have
// matching crash_ids and keys).
// Additional crashes may be reported in the same stream with a new crash ID.
message FetchCrashesResponse {
    // Crash id. unique only within responses to a single FetchCrashes request.
    // Used to assemble multiple streamed |FetchCrashesResponse| protos into a
    // single crash report.
    int64 crash_id = 1;
    oneof data {
      // Full details of crash report.
      CrashInfo crash = 2;
      // Misc file (e.g. minidump, large binary log, etc)
      CrashBlob blob = 3;
      // Coredump. Present iff fetch_core was true in FetchCrashesRequest and
      // the crash has a coredump. (kernel warnings, for example, do not have
      // one).
      bytes core = 4;
    }
}

// The data in this proto matches the metadata from crash-reporter's meta files.
// Sender::CreateCrashFormData puts this data into crash upload POST requests.
// (See src/platform2/crash-reporter/crash_sender_util.cc.)
// The names in this proto MUST match the names that crash-reporter uses so
// that, when crashes are uploaded to the crash server, they are interpreted
// as they are when crash-reporter uploads them.
// Similarly, when this proto is converted into a POST request to send to the
// crash server, the names must not be altered.
message CrashInfo {
    // Name of executable that crashed (e.g. "chrome")
    string exec_name = 1;
    // Product name (e.g. "Chrome_ChromeOS" or "ChromeOS")
    string prod = 2;
    // Product version (e.g. "12345.0.0")
    string ver = 3;
    // Crash signature (may not be populated for all crashes)
    string sig = 4;
    // The name of the integration test that was running when this crash
    // happened, if any.
    string in_progress_integration_test = 5;
    // The name of the collector (e.g. chrome_collector, arc_collector)
    string collector = 6;
    // Additional key-value pairs of metadata (e.g. "crash_loop_mode = true").
    // These should be included in any POSTs to the crash server in a standard
    // POST form, as seen in CreateCrashFormData.
    // (despite the fact that this message is a subfield, it should be a flat
    // structure in any POSTs).
    repeated CrashMetadata fields = 7;
}

// Arbitrary text-only key-value pair corresponding to the key-value pairs in
// crash report metadata files.
message CrashMetadata {
    // This value is a UTF8, human-readable, description of the data.
    string key = 1;
    // The value will be a human-readable string (e.g. "12345.0.0"), which must
    // be valid UTF-8.
    string text = 2;
};

// Arbitrary non-UTF8 key-value pair from crash report metadata files.
message CrashBlob {
    // This value is a UTF8, human-readable, description of the data.
    // This should be passed as the 'name' to the crash server.
    // For instance, upload_file_fake_payload
    string key = 1;
    // The value is a blob (e.g. a file from sysfs or a minidump), which need
    // not be valid UTF-8, and may be large.
    bytes blob = 2;
    // The basename of the file. Must be specified as the filename in data
    // uploaded to the crash server.
    // e.g. foo_binary.20201027.102345.0.dmp
    string filename = 3;
};

message ChromeOsImage {
  oneof path_oneof {
    // gs_path_prefix is the GS path to where the payloads are located. For
    // example the format MAY be:
    // gs://chromeos-image-archive/eve-release/R86-13380.0.0
    string gs_path_prefix = 1;
  }
}

message FakeOmaha {
  // name is the resource name of the fake Omaha service.
  // Format: fakeOmaha/{fake-omaha-id}
  // The implementation MUST set it after creating the fake Omaha service.
  // Clients SHOULD NOT set it.
  string name = 1;
  // dut is the resource name for the DUT.
  // The DUT name is passed to the RTD when the RTD is started.
  // It is not specified whether the name is the DUT hostname.
  string dut = 2;

  // target_build is the ChromeOS build that the fake Omaha service will serve
  // payloads for.
  ChromeOsImage target_build = 3;

  message Payload {
    enum Type {
      TYPE_UNSPECIFIED = 0;
      FULL = 1;
      DELTA = 2;
    }
    // id is the id of the payload. It MAY be "ROOTFS" or a DLC id, etc.
    string id = 1;
    // type is the payload type, e.g. TYPE_FULL or TYPE_DELTA.
    Type type = 2;
  }
  // payloads is the payloads can be served by the fake Omaha service.
  repeated Payload payloads = 4;
  // exposed_via_proxy indicates that the fake Omaha service is exposed to a
  // DUT via a proxy server, instead of exposing to the DUT directly. So the
  // service exposing won't be impacted by rebooting the DUT, disconnecting the
  // DUT network, etc.
  bool exposed_via_proxy = 5;
  // critical_update instructs the fake Omaha created that the update is
  // critical if set.
  bool critical_update = 6;
  // return_noupdate_starting indicates from which update check to start returning noupdate.
  // It MUST be 0 or greater.
  // When set to 0 (the default value), disables returning noupdate.
  // If set to positive N, returns noupdate for the Nth check and for every
  // check thereafter.
  // For example, if set to 1, returns noupdate starting from the first check,
  // i.e., always returns noupdate.
  int32 return_noupdate_starting = 7;
  // omaha_url is the current fake Omaha service URL which is reachable from
  // the specified DUT.
  // The URL can be used as input of the update engine client of the DUT.
  // The implementation MUST set it after creating the fake Omaha service.
  // Clients SHOULD NOT set it.
  string omaha_url = 8;
}

message CreateFakeOmahaRequest {
  // fake_omaha is the fake omaha service to be created.
  FakeOmaha fake_omaha = 1;
}

message DeleteFakeOmahaRequest {
  // The resource name of the fake Omaha service to stop.
  // Format: fakeOmahaServices/{fake-omaha-id}
  string name = 1;
}
