// Copyright 2019 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

syntax = "proto3";

package chromiumos;

import "google/protobuf/descriptor.proto";

option go_package = "go.chromium.org/chromiumos/infra/proto/go/chromiumos";
option java_package = "com.google.chrome.crosinfra.proto";

// TODO(b/177487002): cannot include prototype.milestone at this time.
// import "prototype/milestone.proto";

// Common message definitions.

// A BuildTarget encapsulates a board and an associated profile, and mirrors a
// chromite.lib.build_target_lib.BuildTarget.
message BuildTarget {
  // The name of the build target (a.k.a. board name).
  string name = 1;

  // The profile to use.
  Profile profile = 2;
}

// Generic GCS path split into bucket name and path within
message GcsPath {
  string bucket = 1;
  string path = 2;
}

// Chroot is used to define how to enter a chroot.
message Chroot {
  // Deprecated fields.
  // R80 was the last release branch to use 'goma'.
  reserved 5;
  reserved "goma";

  message ChrootEnv {
    // USE flags to set.
    repeated UseFlag use_flags = 1;
    // FEATURES flags to set.
    repeated Feature features = 2;
  }

  // The directory containing the chroot.
  string path = 1;
  // The cache directory override.
  string cache_dir = 2;
  // Environment configuration.
  ChrootEnv env = 3;
  // The directory where the chrome source should be mounted.
  string chrome_dir = 4;
  // The directory where build state and output artifacts should be placed.
  string out_path = 6;
}

// FEATURES environment variable component message.
message Feature { string feature = 1; }

message RemoteexecConfig {
  // The location of the re-client binaries needed for remote execution.
  string reclient_dir = 1;
  // The config file to pass in to reproxy.
  string reproxy_cfg_file = 2;
  // The directory where the logs will be extracted.
  SyncedDir log_dir = 3;
}

message RemoteexecArtifacts {
  // List of log files.
  repeated string log_files = 1;
}

message GomaConfig {
  reserved 2;
  reserved "goma_client_json";

  // The goma install location.
  // Required.
  string goma_dir = 1;
  // Path to the Goma client used for build package.
  // If None, goma_dir will be used instead.
  string chromeos_goma_dir = 3;

  // Facilitates testing new Goma approaches before rolling them out
  // more widely.
  enum GomaApproach {
    GOMA_APPROACH_UNSPECIFIED = 0;
    DEFAULT = 1;
    RBE_PROD = 2;
    RBE_STAGING = 3;
    RBE_CHROMEOS = 4;
  }
  GomaApproach goma_approach = 4;

  // The directory where the goma logs will be extracted.
  SyncedDir log_dir = 5;
  // The name of the goma stats file. It will be dumped inside log_dir.
  string stats_file = 6;
  // The name of the goma counterz file. It will be dumped inside log_dir.
  string counterz_file = 7;
}

message GomaArtifacts {
  // The Goma artifacts (stats file, counterz file, and log files) are placed
  // in the directory specified by the GomaConfig.log_dir.

  // Goma stats file.
  string stats_file = 1;
  // Goma counterz file.
  string counterz_file = 2;
  // Goma log files.
  repeated string log_files = 3;
}

// Message describing a package, The corresponding variable names are from
// https://devmanual.gentoo.org/ebuild-writing/variables/index.html
message PackageInfo {
  // The package name (PN variable).
  string package_name = 1;

  // The package category (CATEGORY variable).
  string category = 2;

  // The package version and revision (PVR variable).
  string version = 3;
}

// Information about the sysroot's profile.
message Profile {
  // The name of the profile.
  string name = 1;
}

// Message describing a package index (binhost) file.
message PackageIndexInfo {
  // The snapshot SHA
  string snapshot_sha = 1;

  // The snapshot number.  Higher is newer.
  int32 snapshot_number = 2;

  // The build target.
  BuildTarget build_target = 3;

  // The full URI of the package index file.
  string location = 4;

  // The sysroot profile.
  Profile profile = 5;

  // TODO(crbug/1088059): Add status of the prebuilts:
  // - Passed HW Tests?
  // - Marked stable?
  // Etc
}

// A message to clarify inside/outside chroot paths.
message Path {
  // Location enum; whether the resource is inside or outside of the chroot.
  enum Location {
    NO_LOCATION = 0;
    INSIDE = 1;
    OUTSIDE = 2;
  }

  // The path to the resource.
  string path = 1;
  // The path location.
  Location location = 2;
}

// A message used to indicate an output location for results. Specifically,
// this is used to automatically transfer files out of the chroot when needed.
// Note: No more than one ResultPath per message can be supported.
message ResultPath {
  // Required unless type is TRANSFER_TRANSLATE.
  // The result directory information.
  Path path = 1;

  // Transfer enum; how Paths in the response are transferred out of the chroot.
  enum Transfer {
    TRANSFER_UNSPECIFIED = 0;

    // Paths are copied to ResultPath.path.  Default when unspecifed.
    TRANSFER_COPY = 1;

    // Path messages are updated from Path.Location.INSIDE to
    // Path.Location.OUTSIDE in place without copying, based on knowledge of the
    // chroot structure. Note that such resulting artifacts may be modified or
    // removed by future API calls, so callers should exercise care regarding
    // their longevity. ResultPath.path must be empty.
    TRANSFER_TRANSLATE = 2;
  }
  Transfer transfer = 2;
}

// A SyncedDir will have all of its contents transferred into a tmp directory
// in the chroot before the endpoint is called, and afterwords its contents
// will be exactly what was in the tmp directory when the endpoint completed.
message SyncedDir {
  // Required.
  // The directory being synced.
  string dir = 1;
}

// See also crrev.com/c/1929452 and:
//   https://cs.corp.google.com/piper///depot/google3/third_party/luci/buildbucket/proto/common.proto?l=147-176&rcl=257714215
// A Gerrit patchset.
message GerritChange {
  // Gerrit hostname, e.g. "chromium-review.googlesource.com".
  string host = 1;
  // Gerrit project, e.g. "chromium/src".
  string project = 2;
  // Change number, e.g. 12345.
  int64 change = 3;
  // Patch set number, e.g. 1.
  int64 patchset = 4;
}

message GitilesCommit {
  // Gitiles hostname, e.g. "chromium.googlesource.com".
  string host = 1;
  // Repository name on the host, e.g. "chromium/src".
  string project = 2;
  // Commit HEX SHA1.
  string id = 3;
  // Commit ref, e.g. "refs/heads/master".
  // NOT a branch name: if specified, must start with "refs/".
  string ref = 4;
  // Defines a total order of commits on the ref. Requires ref field.
  uint32 position = 5;
}

// Message for USE flags.
message UseFlag {
  // The use flag.
  string flag = 1;
}

// Message for defining a release builder.
// Used to generate release_builders.star.
message ReleaseBuilder {
  message Date {
    // Format: YYYY-MM-DD (ISO 8601)
    // E.g. 2020-02-10
    string value = 1;
  }

  // The release milestone. Needs to have "branch_name" filled out.
  // TODO(b/177487002): cannot include prototype.Milestone at this time.
  // prototype.Milestone milestone = 1;
  message Milestone {
    // E.g. 86
    int32 number = 1;

    // Initially planned branch date for the milestone.
    Date target_branch_date = 2;

    // Actual branch name when the branch is created.
    // E.g. release-R86-13421.B
    string branch_name = 3;
  }
  oneof milestone_message { Milestone milestone = 1; }

  // Schedule to use for release builder.
  // e.g. "0 5 * * *"
  string build_schedule = 2;

  // Expiration date of builder.
  // A builder with an expiration date set (that has not yet occurred)
  // will not be pruned as a stale milestone by automatic release config
  // management.
  Date expiration_date = 3;

  // Mapping from Android package names to their corresponding Android branches
  // for this release, e.g. "android-vm-rvc" -> "git_rvc-arc-m110".
  // Android uprev builders are automatically set up according to this mapping.
  map<string, string> android_branches = 4;
}

message ReleaseBuilders {
  // Release builders to generate _define_release blocks for
  // in release_builders.star.
  repeated ReleaseBuilder builders = 1;
}

// The types of images that can be built.
// These correspond to support types in lib/constants.py such
// as IMAGE_TYPE_BASE, IMAGE_TYPE_RECOVERY, and so on.
enum ImageType {
  // Please only use prefixed IMAGE_TYPE values. See: b/187214166
  // Removed in R92.
  reserved "BASE", "TEST", "DEV", "BASE_VM", "TEST_VM", "RECOVERY", "FACTORY";
  reserved "FIRMWARE", "CR50_FIRMWARE", "BASE_GUEST_VM", "TEST_GUEST_VM", "DLC";
  reserved "GSC_FIRMWARE", "ACCESSORY_USBPD", "ACCESSORY_RWSIG", "HPS_FIRMWARE";

  IMAGE_TYPE_UNDEFINED = 0;

  IMAGE_TYPE_BASE = 1;
  IMAGE_TYPE_DEV = 2;
  IMAGE_TYPE_TEST = 3;
  IMAGE_TYPE_BASE_VM = 4;
  IMAGE_TYPE_TEST_VM = 5;
  IMAGE_TYPE_RECOVERY = 6;
  IMAGE_TYPE_FACTORY = 7;
  IMAGE_TYPE_FIRMWARE = 8;
  IMAGE_TYPE_CR50_FIRMWARE = 9;
  IMAGE_TYPE_BASE_GUEST_VM = 10;
  IMAGE_TYPE_TEST_GUEST_VM = 11;
  IMAGE_TYPE_DLC = 12;
  IMAGE_TYPE_GSC_FIRMWARE = 13;
  IMAGE_TYPE_ACCESSORY_USBPD = 14;
  IMAGE_TYPE_ACCESSORY_RWSIG = 15;
  IMAGE_TYPE_HPS_FIRMWARE = 16;
  IMAGE_TYPE_NETBOOT = 17;
  // Used for payload signing.
  IMAGE_TYPE_UPDATE_PAYLOAD = 18;
  IMAGE_TYPE_FLEXOR_KERNEL = 19;
}

// The various channels that we release through.
enum Channel {
  CHANNEL_UNSPECIFIED = 0;
  CHANNEL_STABLE = 1;
  CHANNEL_BETA = 2;
  CHANNEL_DEV = 3;
  CHANNEL_CANARY = 4;
  CHANNEL_LTS = 5;
  CHANNEL_LTC = 6;
}

// A map of release milestones to their appropriate channels.
message ReleaseChannels {
  message ChannelList { repeated Channel channels = 1; }
  map<int32, ChannelList> release_channels = 1;
}

// The available delta types.
enum DeltaType {
  DELTA_UNKNOWN = 0;
  NO_DELTA = 1;
  FSI = 2;
  MILESTONE = 3;
  OMAHA = 4;
  STEPPING_STONE = 5;
  N2N = 6;
}

// A wrapper around a serialized protocol buffer.
message ProtoBytes { bytes serialized_proto = 1; }

// List of known location that firmware can be built from
enum FwLocation {
  FW_LOCATION_UNKNOWN = 0;
  PLATFORM_EC = 1;        // platform/ec/firmware_builder.py
  PLATFORM_ZEPHYR = 2;    // platform/zephyr-chrome/firmware_builder.py
  PLATFORM_TI50 = 3;      // platform/ti50/common/firmware_builder.py
  PLATFORM_CR50 = 4;      // platform/cr50/firmware_builder.py
  PLATFORM_CHAMELEON = 5; // platform/chameleon/v3/ec/firmware_builder.py
}

// Additional information about artifacts used by PrepareForBuild endpoints.
// TODO(crbug/1019868): This is migrating to ArtifactProfileInfo.
message PrepareForBuildAdditionalArgs {
  oneof prepare_for_build_args {
    // ToolchainService Chrome AFDO artifacts require profile name.
    string chrome_cwp_profile = 1;

    // ToolchainService Kernel AFDO artifacts require a kernel version.
    string kernel_version = 2;
  }
}

// ToolchainService Unverified Release AFDO artifacts require information
// about the builder that created the image used to generate the unverified
// chrome benchmark perf file.
message AfdoRelease {
  // ToolchainService Chrome AFDO artifacts require profile name.
  string chrome_cwp_profile = 1;

  // The build id of the image_build.  Used to generate the location for the
  // image archive.
  int64 image_build_id = 2;
}

// Artifact profile information used by artifact prepare/bundle endpoints in
// addition to input_artifacts.
message ArtifactProfileInfo {
  oneof artifact_profile_info {
    // ToolchainService Chrome AFDO artifacts require profile name.
    string chrome_cwp_profile = 1;

    // ToolchainService Kernel AFDO artifacts require a kernel version.
    string kernel_version = 2;

    // ToolchainService Unverified Release AFDO artifacts require more.
    AfdoRelease afdo_release = 3;
  }
  // Profile architecture, required in all artifacts.
  string arch = 4;
}

// Artifact information. Used by the ArtifactsService.PrepareForBuild and
// BundleArtifacts endpoints to dispatch the appropriate service routines to
// prepare or bundle as a batch.
message ArtifactsByService {

  // How to publish code coverage information for an artifact.
  message CodeCoverageUploadInfo {
    // The type of code coverage information the artifact represents.
    enum CodeCoverageType {
      UNSPECIFIED = 0;

      // LLVM Code Coverage is generated.
      LLVM = 1;

      // LCOV Code Coverage is generated.
      LCOV = 2;
    }
    CodeCoverageType coverage_type = 1;
  }

  // TODO(b/187790484): Drop this message.
  // Artifacts handled within the ArtifactsService endpoints directly.
  message Legacy {
    // Legacy artifacts, handled in cros_artifacts. DO NOT ADD TO THIS.
    enum ArtifactType {
      UNSPECIFIED = 0;
      // Indicates wanting a zip file of everything in the image directory.
      // TODO(b/187790484): moves to ArtifactsByService.Image
      IMAGE_ZIP = 1;
      // Indicates wanting update payloads.
      // TODO(b/187790484): moves to ArtifactsByService.Test
      TEST_UPDATE_PAYLOAD = 2;
      // Indicates wanting the autotest tarballs.
      // TODO(b/187790484): moves to ArtifactsByService.Test
      AUTOTEST_FILES = 3;
      // Indicates wanting a tarball containing private TAST test bundles.
      // TODO(b/187790484): moves to ArtifactsByService.Test
      TAST_FILES = 4;
      // Indicates wanting a tarball containing guest images and test bundles.
      // TODO(b/187790484): moves to ArtifactsByService.Test
      PINNED_GUEST_IMAGES = 5;
      // Indicates wanting an archive of firmware images built from source.
      // TODO(b/187790484): moves to ArtifactsByService.Package
      FIRMWARE = 6;
      // Indicates wanting a tarball of the Ebuilds logs.
      // TODO(b/187790484): moves to ArtifactsByService.Sysroot
      EBUILD_LOGS = 7;
      // Indicates wanting an archive of the ChromeOS Config.
      // TODO(b/187790484): moves to ArtifactsByService.Sysroot
      CHROMEOS_CONFIG = 8;

      reserved 9;

      // Indicates wanting a tar.xz archive for each image created.
      // TODO(b/187790484): moves to ArtifactsByService.Image
      IMAGE_ARCHIVES = 10;

      // TODO(b/187790484): BuilderConfig.Artifacts.ArtifactTypes is a common
      // namespace for all services.  We must reserve numbers until that is
      // gone.
      reserved 11 to 26;

      // Indicates wanting a tarball containing fingerprint MCU test binaries.
      // TODO(b/187790484): moves to ArtifactsByService.Test
      FPMCU_UNITTESTS = 27;
      // Indicates wanting a test image tarball suitable for importing into GCE.
      // TODO(b/187790484): moves to ArtifactsByService.Image
      GCE_TARBALL = 28;

      reserved 29 to 31;

      // Indicates wanting the Bundled debug symbol files.
      // TODO(b/187790484): Moves from legacy to ArtifactsByService/Get.
      DEBUG_SYMBOLS = 32;

      reserved 33 to 56;
    }
    // Information about one or more artifacts.
    message ArtifactInfo {
      // The ArtifactType.  One or more types to which the rest of the fields
      // apply.
      repeated ArtifactType artifact_types = 1;

      // GS location in which to upload artifacts ("gs://" is prepended).
      // Several fields can be logically specified:
      //   %(kind)s: BuilderConfig.Id.Type with underscores turned into hyphens.
      //   %(version)s: Chromeos version (e.g., R81-12813.0.0)
      //   %(build_id)s: Buildbucket job ID.
      //   %(target)s: build target name.
      //   %(builder_name)s: The builder name (e.g. octopus-cq), lowercase with
      //       underscores turned into hyphens.
      //   %(gs_path)s: "%(builder_name)s/%(version)s-%(build_id)s".
      //   %(artifact_name)s: The name of the artifact being published.
      //
      // BuilderConfig.Artifacts.artifacts_gs_location is used for all
      // artifacts.  Artifact can be published to additional locations by
      // specifying those here.  Examples: include AFDO artifacts and Release
      // images.
      repeated string gs_locations = 2;

      // R83 was the last release branch to use profile_info.
      reserved 3;
      reserved "profile_info";

      // Any acl to apply, such as "public-read".
      string acl_name = 4;

      // This used to be PublishCondition, which is deprecated as per
      // b/202987478.
      reserved 5;
    }
    // Input artifact information
    repeated ArtifactInfo input_artifacts = 1;

    // Output artifact information
    repeated ArtifactInfo output_artifacts = 2;
  }
  Legacy legacy = 1;

  message Toolchain {
    // Artifacts which the ArtifactsService endpoints pass to ToolchainService.
    enum ArtifactType {
      UNSPECIFIED = 0;

      // TODO(b/187790484): BuilderConfig.Artifacts.ArtifactTypes is a common
      // namespace for all services.  We must reserve numbers until that is
      // gone.
      reserved 1 to 10;

      // These values were previously used by now-turned-down orderfile,
      // clang-tidy, and llvm-PGO builders.
      reserved 11 to 14;

      // Indicates an unvetted AFDO Chrome profile.  (Generated by HW Tests in
      // the benchmark-afdo-generate builder.)
      UNVERIFIED_CHROME_BENCHMARK_AFDO_FILE = 15;
      // Indicates a vetted AFDO Chrome profile.
      VERIFIED_CHROME_BENCHMARK_AFDO_FILE = 16;

      // Indicates a vetted AFDO Kernel profile.
      VERIFIED_KERNEL_CWP_AFDO_FILE = 17;
      // Indicates an unvetted AFDO Kernel CWP profile.
      UNVERIFIED_KERNEL_CWP_AFDO_FILE = 18;

      // Indicates an unvetted AFDO Chrome CWP profile.
      UNVERIFIED_CHROME_CWP_AFDO_FILE = 19;
      // Indicates a vetted AFDO Chrome CWP profile.
      VERIFIED_CHROME_CWP_AFDO_FILE = 20;
      // Indicates a vetted AFDO profile for release.
      VERIFIED_RELEASE_AFDO_FILE = 21;

      // Indicates an unvetted AFDO perf data file (from HW Test).
      UNVERIFIED_CHROME_BENCHMARK_PERF_FILE = 22;
      // Indicates an unstripped Chrome binary.
      CHROME_DEBUG_BINARY = 23;

      // Indicates toolchain logs for the compiler warnings for werror monitor
      TOOLCHAIN_WARNING_LOGS = 24;

      // Indicates a prod Chrome AFDO profile for Android/Linux.
      CHROME_AFDO_PROFILE_FOR_ANDROID_LINUX = 25;

      // Indicates diagnoses for Clang crashes
      CLANG_CRASH_DIAGNOSES = 26;

      // TODO(b/187790484): BuilderConfig.Artifacts.ArtifactTypes is a common
      // namespace for all services.  We must reserve numbers until that is
      // gone.
      reserved 27 to 28;

      // Indicates Rusage logs from Compiler Invocations
      COMPILER_RUSAGE_LOG = 29;

      // TODO(b/187790484): BuilderConfig.Artifacts.ArtifactTypes is a common
      // namespace for all services.  We must reserve numbers until that is
      // gone.
      reserved 30 to 51;

      // Tarballs of cross-compiling toolchain prebuilts.
      SDK_TOOLCHAIN_PREBUILTS = 52;

      // TODO(b/187790484): BuilderConfig.Artifacts.ArtifactTypes is a common
      // namespace for all services.  We must reserve numbers until that is
      // gone.
      reserved 53 to 56;
    }
    // Information about one or more artifacts.  This should match the rest of
    // the ArtifactInfo definitions in ArtifactsByService, other than having
    // it's own (service-specific) definition for ArtifactType.
    message ArtifactInfo {
      // The ArtifactType.  One or more types to which the rest of the fields
      // apply.
      repeated ArtifactType artifact_types = 1;

      // GS location in which to upload artifacts ("gs://" is prepended).
      // Several fields can be logically specified:
      //   %(kind)s: BuilderConfig.Id.Type with underscores turned into hyphens.
      //   %(version)s: Chromeos version (e.g., R81-12813.0.0)
      //   %(build_id)s: Buildbucket job ID.
      //   %(target)s: build target name.
      //   %(builder_name)s: The builder name (e.g. octopus-cq), lowercase with
      //       underscores turned into hyphens.
      // specifying those here.  Examples include AFDO artifacts and release
      //   %(artifact_name)s: The name of the artifact being published.
      //
      // BuilderConfig.Artifacts.artifacts_gs_location is used for all
      // artifacts.  Artifact can be published to additional locations by
      // specifying those here.  Examples: include AFDO artifacts and Release
      // images.
      repeated string gs_locations = 2;

      // Any acl to apply, such as "public-read".
      string acl_name = 4;

      // This used to be PublishCondition, which is deprecated as per
      // b/202987478.
      reserved 5;
    }
    // Input artifact information
    repeated ArtifactInfo input_artifacts = 1;

    // Output artifact information
    repeated ArtifactInfo output_artifacts = 2;
  }
  Toolchain toolchain = 2;

  message Image {
    // Artifacts which the ArtifactsService endpoints pass to ImageService.
    enum ArtifactType {
      UNSPECIFIED = 0;

      // TODO(b/187790484): once an IMAGE_ZIP value is added here, please
      // update the build planner (in chromiumos/infra/go), where it says
      // "use the new output artifacts IMAGE_ZIP"

      // TODO(b/187790484): BuilderConfig.Artifacts.ArtifactTypes is a common
      // namespace for all services.  We must reserve numbers until that is
      // gone.
      reserved 1 to 33;

      // DLC image (squashfs).  Added in R91.
      DLC_IMAGE = 34;

      reserved 35 to 37;

      // license_credits.html.
      LICENSE_CREDITS = 38;

      reserved 39 to 42;

      // factory_image.zip.
      FACTORY_IMAGE = 43;

      reserved 44;

      // stripped-packages.tar archive.
      STRIPPED_PACKAGES = 45;

      reserved 46 to 48;

      // image_scripts.tar.xz archive.
      IMAGE_SCRIPTS = 49;

      reserved 50 to 56;
    }
    // Information about one or more artifacts.  This should match the rest of
    // the ArtifactInfo definitions in ArtifactsByService, other than having
    // it's own (service-specific) definition for ArtifactType.
    message ArtifactInfo {
      // The ArtifactType.  One or more types to which the rest of the fields
      // apply.
      repeated ArtifactType artifact_types = 1;

      // GS location in which to upload artifacts ("gs://" is prepended).
      // Several fields can be logically specified:
      //   %(kind)s: BuilderConfig.Id.Type with underscores turned into hyphens.
      //   %(version)s: Chromeos version (e.g., R81-12813.0.0)
      //   %(build_id)s: Buildbucket job ID.
      //   %(target)s: build target name.
      //   %(builder_name)s: The builder name (e.g. octopus-cq), lowercase with
      //       underscores turned into hyphens.
      //   %(gs_path)s: "%(builder_name)s/%(version)s-%(build_id)s".
      //   %(artifact_name)s: The name of the artifact being published.
      //
      // BuilderConfig.Artifacts.artifacts_gs_location is used for all
      // artifacts.  Artifact can be published to additional locations by
      // specifying those here.  Examples: include AFDO artifacts and Release
      // images.
      repeated string gs_locations = 2;

      // Any acl to apply, such as "public-read".
      string acl_name = 4;

      // This used to be PublishCondition, which is deprecated as per
      // b/202987478.
      reserved 5;
    }
    // Input artifact information
    repeated ArtifactInfo input_artifacts = 1;

    // Output artifact information
    repeated ArtifactInfo output_artifacts = 2;
  }
  Image image = 3;

  message Package {
    // Artifacts which the ArtifactsService endpoints pass to PackageService.
    enum ArtifactType {
      UNSPECIFIED = 0;

      // TODO(b/187790484): BuilderConfig.Artifacts.ArtifactTypes is a common
      // namespace for all services.  We must reserve numbers until that is
      // gone.
      reserved 1 to 56;
    }
    // Information about one or more artifacts.  This should match the rest of
    // the ArtifactInfo definitions in ArtifactsByService, other than having
    // it's own (service-specific) definition for ArtifactType.
    message ArtifactInfo {
      // The ArtifactType.  One or more types to which the rest of the fields
      // apply.
      repeated ArtifactType artifact_types = 1;

      // GS location in which to upload artifacts ("gs://" is prepended).
      // Several fields can be logically specified:
      //   %(kind)s: BuilderConfig.Id.Type with underscores turned into hyphens.
      //   %(version)s: Chromeos version (e.g., R81-12813.0.0)
      //   %(build_id)s: Buildbucket job ID.
      //   %(target)s: build target name.
      //   %(builder_name)s: The builder name (e.g. octopus-cq), lowercase with
      //       underscores turned into hyphens.
      //   %(gs_path)s: "%(builder_name)s/%(version)s-%(build_id)s".
      //   %(artifact_name)s: The name of the artifact being published.
      //
      // BuilderConfig.Artifacts.artifacts_gs_location is used for all
      // artifacts.  Artifact can be published to additional locations by
      // specifying those here.  Examples: include AFDO artifacts and Release
      // images.
      repeated string gs_locations = 2;

      // Any acl to apply, such as "public-read".
      string acl_name = 4;

      // This used to be PublishCondition, which is deprecated as per
      // b/202987478.
      reserved 5;
    }
    // Input artifact information
    repeated ArtifactInfo input_artifacts = 1;

    // Output artifact information
    repeated ArtifactInfo output_artifacts = 2;
  }
  Package package = 4;

  message Sysroot {
    // Artifacts which the ArtifactsService endpoints pass to SysrootService.
    enum ArtifactType {
      UNSPECIFIED = 0;

      // TODO(b/187790484): BuilderConfig.Artifacts.ArtifactTypes is a common
      // namespace for all services.  We must reserve numbers until that is
      // gone.
      reserved 1 to 31;

      // Debug artifacts in a tarball.
      DEBUG_SYMBOLS = 32;

      reserved 33 to 34;

      // Breakpad sym files in a tarball.
      BREAKPAD_DEBUG_SYMBOLS = 35;

      reserved 36 to 39;

      // Simple Chrome Sysroot archive.
      SIMPLE_CHROME_SYSROOT = 40;

      // Chrome Ebuild Environment archive.
      CHROME_EBUILD_ENV = 41;

      reserved 42 to 46;

      // The fuzzer's sysroot as bundled via cros_generate_sysroot.py.
      FUZZER_SYSROOT = 47;

      reserved 48 to 49;

      // Archive the entire sysroot.
      SYSROOT_ARCHIVE = 50;

      reserved 52;

      // Bazel-specific performance artifacts.
      BAZEL_PERFORMANCE_ARTIFACTS = 53;

      reserved 54 to 55;

      // Merged compile_commands.json.
      COMPILE_COMMANDS_JSON = 56;
    }

    // Information about one or more artifacts.  This should match the rest of
    // the ArtifactInfo definitions in ArtifactsByService, other than having
    // it's own (service-specific) definition for ArtifactType.
    message ArtifactInfo {
      // The ArtifactType.  One or more types to which the rest of the fields
      // apply.
      repeated ArtifactType artifact_types = 1;

      // GS location in which to upload artifacts ("gs://" is prepended).
      // Several fields can be logically specified:
      //   %(kind)s: BuilderConfig.Id.Type with underscores turned into hyphens.
      //   %(version)s: Chromeos version (e.g., R81-12813.0.0)
      //   %(build_id)s: Buildbucket job ID.
      //   %(target)s: build target name.
      //   %(builder_name)s: The builder name (e.g. octopus-cq), lowercase with
      //       underscores turned into hyphens.
      //   %(gs_path)s: "%(builder_name)s/%(version)s-%(build_id)s".
      //   %(artifact_name)s: The name of the artifact being published.
      //
      // BuilderConfig.Artifacts.artifacts_gs_location is used for all
      // artifacts.  Artifact can be published to additional locations by
      // specifying those here.  Examples: include AFDO artifacts and Release
      // images.
      repeated string gs_locations = 2;

      // Any acl to apply, such as "public-read".
      string acl_name = 4;

      // This used to be PublishCondition, which is deprecated as per
      // b/202987478.
      reserved 5;
    }
    // Input artifact information
    repeated ArtifactInfo input_artifacts = 1;

    // Output artifact information
    repeated ArtifactInfo output_artifacts = 2;

    // If true, ignore errors during breakpad symbol generation.
    bool ignore_breakpad_symbol_generation_errors = 3;

    // The ExpectedFiles enum from cros_generate_breakpad_symbols.py.
    enum BreakpadSymbolGenerationExpectedFile {
      // Not used but required by proto3 syntax.
      EXPECTED_FILE_UNSET = 0;

      EXPECTED_FILE_ASH_CHROME = 1;
      EXPECTED_FILE_LIBC = 2;
      EXPECTED_FILE_CRASH_REPORTER = 3;
      EXPECTED_FILE_LIBMETRICS = 4;
    }
    // During BREAKPAD_DEBUG_SYMBOLS generation, do not complain about missing
    // any of the expected files in this list.
    repeated BreakpadSymbolGenerationExpectedFile
        ignore_breakpad_symbol_generation_expected_files = 4;
  }
  Sysroot sysroot = 5;

  message Test {
    // Artifacts which the ArtifactsService endpoints pass to TestService.
    enum ArtifactType {
      UNSPECIFIED = 0;

      // TODO(b/187790484): BuilderConfig.Artifacts.ArtifactTypes is a common
      // namespace for all services.  We must reserve numbers until that is
      // gone.
      reserved 1 to 36;

      UNIT_TESTS = 37;

      reserved 38;

      CODE_COVERAGE_LLVM_JSON = 39;

      reserved 40 to 41;

      // HWQual archive.
      HWQUAL = 42;

      reserved 43 to 45;

      // Code coverage artifacts generated by Rust CC builder.
      CODE_COVERAGE_RUST_LLVM_JSON = 46;

      reserved 47;

      // Code coverage artifacts generated by Go test.
      CODE_COVERAGE_GOLANG = 48;

      reserved 49 to 53;

      // Code coverage artifacts for E2E coverage.
      CODE_COVERAGE_E2E = 54;

      reserved 55 to 56;
    }
    // Information about one or more artifacts.  This should match the rest of
    // the ArtifactInfo definitions in ArtifactsByService, other than having
    // it's own (service-specific) definition for ArtifactType.
    message ArtifactInfo {
      // The ArtifactType.  One or more types to which the rest of the fields
      // apply.
      repeated ArtifactType artifact_types = 1;

      // GS location in which to upload artifacts ("gs://" is prepended).
      // Several fields can be logically specified:
      //   %(kind)s: BuilderConfig.Id.Type with underscores turned into hyphens.
      //   %(version)s: Chromeos version (e.g., R81-12813.0.0)
      //   %(build_id)s: Buildbucket job ID.
      //   %(target)s: build target name.
      //   %(builder_name)s: The builder name (e.g. octopus-cq), lowercase with
      //       underscores turned into hyphens.
      //   %(gs_path)s: "%(builder_name)s/%(version)s-%(build_id)s".
      //   %(artifact_name)s: The name of the artifact being published.
      //
      // BuilderConfig.Artifacts.artifacts_gs_location is used for all
      // artifacts.  Artifact can be published to additional locations by
      // specifying those here.  Examples: include AFDO artifacts and Release
      // images.
      repeated string gs_locations = 2;

      // Any acl to apply, such as "public-read".
      string acl_name = 4;

      // This used to be PublishCondition, which is deprecated as per
      // b/202987478.
      reserved 5;

      // Optional information related to code coverage.
      CodeCoverageUploadInfo code_coverage_upload_info = 6;
    }
    // Input artifact information
    repeated ArtifactInfo input_artifacts = 1;

    // Output artifact information
    repeated ArtifactInfo output_artifacts = 2;
  }
  Test test = 6;

  // Profile information needed by the artifact handler, if any.
  ArtifactProfileInfo profile_info = 7;

  message Firmware {
    // Artifacts which the ArtifactsService endpoints pass to FirmwareService.
    enum ArtifactType {
      UNSPECIFIED = 0;

      // TODO(b/187790484): BuilderConfig.Artifacts.ArtifactTypes is a common
      // namespace for all services.  We must reserve numbers until that is
      // gone.
      reserved 1 to 29;

      // Firmware artifacts in a tarball.
      FIRMWARE_TARBALL = 30;

      // Metadata about the firmware.
      FIRMWARE_TARBALL_INFO = 31;

      reserved 32;

      // FirmwareService: LCOV code coverage files.
      FIRMWARE_LCOV = 33;

      reserved 34 to 43;

      // Code coverage HTML report tar archive.
      CODE_COVERAGE_HTML = 44;

      reserved 45 to 54;

      // FirmwareService: Token Database.
      FIRMWARE_TOKEN_DATABASE = 55;

      reserved 56;
    }
    // Information about one or more artifacts.  This should match the rest of
    // the ArtifactInfo definitions in ArtifactsByService, other than having
    // it's own (service-specific) definition for ArtifactType.
    message ArtifactInfo {
      // The ArtifactType.  One or more types to which the rest of the fields
      // apply.
      repeated ArtifactType artifact_types = 1;

      // GS location in which to upload artifacts ("gs://" is prepended).
      // Several fields can be logically specified:
      //   %(kind)s: BuilderConfig.Id.Type with underscores turned into hyphens.
      //   %(version)s: Chromeos version (e.g., R81-12813.0.0)
      //   %(build_id)s: Buildbucket job ID.
      //   %(target)s: build target name.
      //   %(builder_name)s: The builder name (e.g. octopus-cq), lowercase with
      //       underscores turned into hyphens.
      //   %(gs_path)s: "%(builder_name)s/%(version)s-%(build_id)s".
      //   %(artifact_name)s: The name of the artifact being published.
      //
      // BuilderConfig.Artifacts.artifacts_gs_location is used for all
      // artifacts.  Artifact can be published to additional locations by
      // specifying those here.  Examples: include AFDO artifacts and Release
      // images.
      repeated string gs_locations = 2;

      // Any acl to apply, such as "public-read".
      string acl_name = 4;

      // This used to be PublishCondition, which is deprecated as per
      // b/202987478.
      reserved 5;

      // The firmware location.
      FwLocation location = 6;

      // Optional information related to code coverage.
      CodeCoverageUploadInfo code_coverage_upload_info = 7;
    }
    // Input artifact information
    repeated ArtifactInfo input_artifacts = 1;

    // Output artifact information
    repeated ArtifactInfo output_artifacts = 2;
  }
  Firmware firmware = 8;

  message Infra {
    // Infra artifacts, e.g. a pinned manifest.  Not actually passed to Build
    // API -- all artifacts in this message are handled by recipes. Chromite
    // should completely ignore this message.
    enum ArtifactType {
      UNSPECIFIED = 0;

      reserved 1 to 35;

      BUILD_MANIFEST = 36;

      reserved 37 to 56;
    }
    // Information about one or more artifacts.  This should match the rest of
    // the ArtifactInfo definitions in ArtifactsByService, other than having
    // it's own (service-specific) definition for ArtifactType.
    message ArtifactInfo {
      // The ArtifactType.  One or more types to which the rest of the fields
      // apply.
      repeated ArtifactType artifact_types = 1;

      // GS location in which to upload artifacts ("gs://" is prepended).
      // Several fields can be logically specified:
      //   %(kind)s: BuilderConfig.Id.Type with underscores turned into hyphens.
      //   %(version)s: Chromeos version (e.g., R81-12813.0.0)
      //   %(build_id)s: Buildbucket job ID.
      //   %(target)s: build target name.
      //   %(builder_name)s: The builder name (e.g. octopus-cq), lowercase with
      //       underscores turned into hyphens.
      //   %(gs_path)s: "%(builder_name)s/%(version)s-%(build_id)s".
      //   %(artifact_name)s: The name of the artifact being published.
      //
      // BuilderConfig.Artifacts.artifacts_gs_location is used for all
      // artifacts.  Artifact can be published to additional locations by
      // specifying those here.  Examples: include AFDO artifacts and Release
      // images.
      repeated string gs_locations = 2;

      // Any acl to apply, such as "public-read".
      string acl_name = 4;

      // This used to be PublishCondition, which is deprecated as per
      // b/202987478.
      reserved 5;
    }
    // Input artifact information
    repeated ArtifactInfo input_artifacts = 1;

    // Output artifact information
    repeated ArtifactInfo output_artifacts = 2;
  }
  Infra infra = 9;

  message Sdk {
    // Artifacts which the ArtifactsService endpoints pass to FirmwareService.
    enum ArtifactType {
      UNSPECIFIED = 0;

      reserved 1 to 50;

      // A tarball containing the SDK itself.
      SDK_TARBALL = 51;

      reserved 52 to 56;
    }
    // Information about one or more artifacts.  This should match the rest of
    // the ArtifactInfo definitions in ArtifactsByService, other than having
    // it's own (service-specific) definition for ArtifactType.
    message ArtifactInfo {
      // The ArtifactType.  One or more types to which the rest of the fields
      // apply.
      repeated ArtifactType artifact_types = 1;

      // GS location in which to upload artifacts ("gs://" is prepended).
      // Several fields can be logically specified:
      //   %(kind)s: BuilderConfig.Id.Type with underscores turned into hyphens.
      //   %(version)s: Chromeos version (e.g., R81-12813.0.0)
      //   %(build_id)s: Buildbucket job ID.
      //   %(target)s: build target name.
      //   %(builder_name)s: The builder name (e.g. octopus-cq), lowercase with
      //       underscores turned into hyphens.
      //   %(gs_path)s: "%(builder_name)s/%(version)s-%(build_id)s".
      //   %(artifact_name)s: The name of the artifact being published.
      //
      // BuilderConfig.Artifacts.artifacts_gs_location is used for all
      // artifacts.  Artifact can be published to additional locations by
      // specifying those here.  Examples: include AFDO artifacts and Release
      // images.
      repeated string gs_locations = 2;

      // Any acl to apply, such as "public-read".
      string acl_name = 4;

      // This used to be PublishCondition, which is deprecated as per
      // b/202987478.
      reserved 5;
    }
    // Input artifact information
    repeated ArtifactInfo input_artifacts = 1;

    // Output artifact information
    repeated ArtifactInfo output_artifacts = 2;
  }
  Sdk sdk = 10;
}

// Artifact information. Used by the ArtifactsService.PrepareForBuild and
// BundleArtifacts endpoints Response messages.
message UploadedArtifactsByService {
  // Legacy artifacts, handled directly ArtifactsService.
  // Artifacts handled within the ArtifactsService endpoints directly.
  // TODO(b/187790484): Drop this message.
  message Legacy {
    message ArtifactPaths {
      // The ArtifactType.
      ArtifactsByService.Legacy.ArtifactType artifact_type = 1;

      // Absolute path to the artifact file.
      repeated Path paths = 2;

      // Whether or not the artifact generation failed.
      bool failed = 3;

      // Failure reason that the artifact was not generated.
      string failure_reason = 4;
    }
    repeated ArtifactPaths artifacts = 1;
  }
  Legacy legacy = 1;

  message Toolchain {
    message ArtifactPaths {
      // The ArtifactType.
      ArtifactsByService.Toolchain.ArtifactType artifact_type = 1;

      // Absolute path to the artifact file.
      repeated Path paths = 2;

      // Whether or not the artifact generation failed.
      bool failed = 3;

      // Failure reason that the artifact was not generated.
      string failure_reason = 4;
    }
    repeated ArtifactPaths artifacts = 1;
  }
  Toolchain toolchain = 2;

  message Image {
    message ArtifactPaths {
      // The ArtifactType.
      ArtifactsByService.Image.ArtifactType artifact_type = 1;

      // Absolute path to the artifact file.
      repeated Path paths = 2;

      // Whether or not the artifact generation failed.
      bool failed = 3;

      // Failure reason that the artifact was not generated.
      string failure_reason = 4;
    }
    repeated ArtifactPaths artifacts = 1;
  }
  Image image = 3;

  message Package {
    message ArtifactPaths {
      // The ArtifactType.
      ArtifactsByService.Package.ArtifactType artifact_type = 1;

      // Absolute path to the artifact file.
      repeated Path paths = 2;

      // Whether or not the artifact generation failed.
      bool failed = 3;

      // Failure reason that the artifact was not generated.
      string failure_reason = 4;
    }
    repeated ArtifactPaths artifacts = 1;
  }
  Package package = 4;

  message Sysroot {
    message ArtifactPaths {
      // The ArtifactType.
      ArtifactsByService.Sysroot.ArtifactType artifact_type = 1;

      // Absolute path to the artifact file.
      repeated Path paths = 2;

      // Whether or not the artifact generation failed.
      bool failed = 3;

      // Failure reason that the artifact was not generated.
      string failure_reason = 4;
    }
    repeated ArtifactPaths artifacts = 1;
  }
  Sysroot sysroot = 5;

  message Test {
    message ArtifactPaths {
      // The ArtifactType.
      ArtifactsByService.Test.ArtifactType artifact_type = 1;

      // Absolute path to the artifact file.
      repeated Path paths = 2;

      // Whether or not the artifact generation failed.
      bool failed = 3;

      // Failure reason that the artifact was not generated.
      string failure_reason = 4;
    }
    repeated ArtifactPaths artifacts = 1;
  }
  Test test = 6;

  message Firmware {
    message ArtifactPaths {
      // The ArtifactType.
      ArtifactsByService.Firmware.ArtifactType artifact_type = 1;

      // Absolute path to the artifact file.
      repeated Path paths = 2;

      // The firmware location.
      FwLocation location = 3;

      // Whether or not the artifact generation failed.
      bool failed = 4;

      // Failure reason that the artifact was not generated.
      string failure_reason = 5;
    }
    repeated ArtifactPaths artifacts = 1;
  }
  Firmware firmware = 7;

  message Infra {
    message ArtifactPaths {
      // The ArtifactType.
      ArtifactsByService.Infra.ArtifactType artifact_type = 1;

      // Absolute path to the artifact file.
      repeated Path paths = 2;

      // Whether or not the artifact generation failed.
      bool failed = 3;

      // Failure reason that the artifact was not generated.
      string failure_reason = 4;
    }
    repeated ArtifactPaths artifacts = 1;
  }
  Infra infra = 8;

  message Sdk {
    message ArtifactPaths {
      // The ArtifactType.
      ArtifactsByService.Sdk.ArtifactType artifact_type = 1;

      // Absolute path to the artifact file.
      repeated Path paths = 2;

      // Whether or not the artifact generation failed.
      bool failed = 3;

      // Failure reason that the artifact was not generated.
      string failure_reason = 4;
    }
    repeated ArtifactPaths artifacts = 1;
  }
  Sdk sdk = 9;
}

// Field extension that indicates if the field
// can be removed from logging services
extend google.protobuf.FieldOptions { optional bool logging_optional = 54444; }