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

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

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


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

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

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

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

      reserved 32;

      // FirmwareService: LCOV code coverage files.
      FIRMWARE_LCOV = 33;
    }
    // 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;

      // The firmware location.
      FwLocation location = 6;
    }
    // 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;

      // The firmware location.
      FwLocation location = 3;
    }
    repeated ArtifactPaths artifacts = 1;
  }
  Firmware firmware = 7;
}
