syntax = "proto3";

package chromiumos;

option go_package = "go.chromium.org/chromiumos/infra/proto/go/chromiumos";

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

// Common message definitions.

// BuildTarget encapsulates a number of related arguments. At the moment, the
// usage of specific arguments is on a per endpoint basis, but will converge
// to support a standard set as time goes on.
// BuildTarget is a more appropriate name going forward for what we currently
// call "board".
message BuildTarget {
  // The name of the build target (a.k.a. board name).
  string name = 1;
}

// Chroot is used to define how to enter a chroot.
message Chroot {
  // Deprecated fields.
  reserved 5;

  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;
}

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

message GomaConfig {
  // The goma install location.
  // Required.
  string goma_dir = 1;
  // The goma client credentials file.
  string goma_client_json = 2;
  // 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.
  // The result directory information.
  Path path = 1;
}

// 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 {
  // 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 {
    message Date {
      // Format: YYYY-MM-DD (ISO 8601)
      // E.g. 2020-02-10
      string value = 1;
    }

    // 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;
}
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 {
  option allow_alias = true;

  IMAGE_TYPE_UNDEFINED = 0;

  // Use these.
  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;

  // Do not continue to use (or add to) these, use aliased enums above.
  // TODO: Deprecate non-prefixed enums (carefully considering branches).
  BASE = 1;
  DEV = 2;
  TEST = 3;
  BASE_VM = 4;
  TEST_VM = 5;
  RECOVERY = 6;
  FACTORY = 7;
  FIRMWARE = 8;
  CR50_FIRMWARE = 9;
  BASE_GUEST_VM = 10;
  TEST_GUEST_VM = 11;
  DLC = 12;
  GSC_FIRMWARE = 13;
}

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

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

// 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
}


// TODO(crbug.com/1020615): Drop this from chromite/api/toolchain.proto (and
// here) once usage has migrated to BuilderConfig.Artifacts.ArtifactType.
// Meanwhile, keep this in sync with chromite/api/toolchain.proto.  The various
// toolchain optimization artifact types.
enum AFDOArtifactType {
  // No AFDO artifact type specified.
  NONE_TYPE = 0;

  // The type is orderfile.
  ORDERFILE = 1;

  // The type is Chrome AFDO files generated by benchmarks.
  BENCHMARK_AFDO = 2;

  // The type is kernel AFDO files.
  KERNEL_AFDO = 3;

  // The type is Chrome AFDO used in release builders.
  CHROME_AFDO = 4;
}

// 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;
  }
}

// Artifact information. Used bythe  ArtifactsService.PrepareForBuild and
// BundleArtifacts endpoints to dispatch the appropriate service routines to
// prepare or bundle as a batch.
message ArtifactsByService {
  // When to publish the artifact.
  enum PublishCondition {
    PUBLISH_UNSPECIFIED = 0;

    // Publish only for successful builds.  This is the default.
    PUBLISH_ON_SUCCESS = 1;

    // Publish always.  (Useful for error diagnostics.)
    PUBLISH_ALWAYS = 2;
  }

  // TODO(crbug/1034529): 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(crbug/1034529): moves to ArtifactsByService.Image
      IMAGE_ZIP = 1;
      // Indicates wanting update payloads.
      // TODO(crbug/1034529): moves to ArtifactsByService.Test
      TEST_UPDATE_PAYLOAD = 2;
      // Indicates wanting the autotest tarballs.
      // TODO(crbug/1034529): moves to ArtifactsByService.Test
      AUTOTEST_FILES = 3;
      // Indicates wanting a tarball containing private TAST test bundles.
      // TODO(crbug/1034529): moves to ArtifactsByService.Test
      TAST_FILES = 4;
      // Indicates wanting a tarball containing guest images and test bundles.
      // TODO(crbug/1034529): moves to ArtifactsByService.Test
      PINNED_GUEST_IMAGES = 5;
      // Indicates wanting an archive of firmware images built from source.
      // TODO(crbug/1034529): moves to ArtifactsByService.Package
      FIRMWARE = 6;
      // Indicates wanting a tarball of the Ebuilds logs.
      // TODO(crbug/1034529): moves to ArtifactsByService.Sysroot
      EBUILD_LOGS = 7;
      // Indicates wanting an archive of the ChromeOS Config.
      // TODO(crbug/1034529): moves to ArtifactsByService.Sysroot
      CHROMEOS_CONFIG = 8;
      // Indicates wanting the CPE report.
      // TODO(crbug/1034529): moves to ArtifactsByService.Package
      CPE_REPORT = 9;
      // Indicates wanting a tar.xz archive for each image created.
      // TODO(crbug/1034529): moves to ArtifactsByService.Image
      IMAGE_ARCHIVES = 10;

      // TODO(crbug/1034529): 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(crbug/1034529): moves to ArtifactsByService.Test
      FPMCU_UNITTESTS = 27;
      // Indicates wanting a test image tarball suitable for importing into GCE.
      // TODO(crbug/1034529): moves to ArtifactsByService.Image
      GCE_TARBALL = 28;

      reserved 29 to 31;
    }
    // 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;

      reserved 3;

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

      // When to publish the artifact.
      PublishCondition publish_condition = 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(crbug/1034529): BuilderConfig.Artifacts.ArtifactTypes is a common
      // namespace for all services.  We must reserve numbers until that is
      // gone.
      reserved 1 to 10;

      // Indicates an unvetted orderfile for Chrome.
      UNVERIFIED_CHROME_LLVM_ORDERFILE = 11;
      // Indicates a vetted orderfile for Chrome.
      VERIFIED_CHROME_LLVM_ORDERFILE = 12;
      // Indicates a clang-tidy artifact.
      CHROME_CLANG_WARNINGS_FILE = 13;
      // Indicates a PGO artifact for the compiler.
      UNVERIFIED_LLVM_PGO_FILE = 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(crbug/1034529): 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(crbug/1034529): BuilderConfig.Artifacts.ArtifactTypes is a common
      // namespace for all services.  We must reserve numbers until that is
      // gone.
      reserved 30 to 31;
    }
    // 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;

      // When to publish the artifact.
      PublishCondition publish_condition = 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(crbug/1034529): 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(crbug/1034529): BuilderConfig.Artifacts.ArtifactTypes is a common
      // namespace for all services.  We must reserve numbers until that is
      // gone.
      reserved 1 to 31;
    }
    // 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;

      // When to publish the artifact.
      PublishCondition publish_condition = 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(crbug/1034529): BuilderConfig.Artifacts.ArtifactTypes is a common
      // namespace for all services.  We must reserve numbers until that is
      // gone.
      reserved 1 to 31;
    }
    // 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;

      // When to publish the artifact.
      PublishCondition publish_condition = 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(crbug/1034529): BuilderConfig.Artifacts.ArtifactTypes is a common
      // namespace for all services.  We must reserve numbers until that is
      // gone.
      reserved 1 to 31;
    }
    // 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;

      // When to publish the artifact.
      PublishCondition publish_condition = 5;
    }
    // Input artifact information
    repeated ArtifactInfo input_artifacts = 1;

    // Output artifact information
    repeated ArtifactInfo output_artifacts = 2;
  }
  Sysroot sysroot = 5;

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

      // TODO(crbug/1034529): BuilderConfig.Artifacts.ArtifactTypes is a common
      // namespace for all services.  We must reserve numbers until that is
      // gone.
      reserved 1 to 31;
    }
    // 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;

      // When to publish the artifact.
      PublishCondition publish_condition = 5;
    }
    // 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(crbug/1034529): 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;
    }
    // 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;

      // When to publish the artifact.
      PublishCondition publish_condition = 5;
    }
    // Input artifact information
    repeated ArtifactInfo input_artifacts = 1;

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

// Artifact information. Used bythe  ArtifactsService.PrepareForBuild and
// BundleArtifacts endpoints Response messages.
message UploadedArtifactsByService {
  // Legacy artifacts, handled directly ArtifactsService.
  // Artifacts handled within the ArtifactsService endpoints directly.
  // TODO(crbug/1034529): 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;
    }
    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;
    }
    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;
    }
    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;
    }
    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;
    }
    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;
    }
    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;
    }
    repeated ArtifactPaths artifacts = 1;
  }
  Firmware firmware = 7;
}
