432 lines
16 KiB
Protocol Buffer
432 lines
16 KiB
Protocol Buffer
|
|
// 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 ChromeOS on the DUT, along
|
||
|
|
// with any specified DLCs.
|
||
|
|
//
|
||
|
|
// If the DUT is already on the specified version of ChromeOS, 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 ChromeOS 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;
|
||
|
|
}
|