syntax = "proto3";
package chromite.api;

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

// Added in R77.

import "chromite/api/artifacts.proto";
import "chromite/api/build_api.proto";
import "chromite/api/sysroot.proto";
// TODO(crbug/1027720): Migrate BuilderConfig.Artifacts.ArtifactType to
// common.proto, and stop including builder_config.proto.
import "chromiumos/builder_config.proto";
import "chromiumos/common.proto";

// Information about a collection of artifacts.
message ArtifactInfo {
  // The ArtifactType.
  chromiumos.BuilderConfig.Artifacts.ArtifactTypes artifact_type = 1;

  // Artifacts for this ArtifactType.
  repeated Artifact artifacts = 2;
}

// TODO(crbug/1034529): Migrate this to ArtifactsService/BuildSetup.
//
// Prepare the build for artifact building.
message PrepareForToolchainBuildRequest {
  // The artifact types that this build should make.
  repeated chromiumos.BuilderConfig.Artifacts.ArtifactTypes artifact_types = 1;

  // Note: both chroot and sysroot may be unspecified, when the endpoint is
  // called prior to their creation.
  // The chroot where the sysroot lives.
  chromiumos.Chroot chroot = 2;
  // The sysroot where the files live.
  chromite.api.Sysroot sysroot = 3;

  // Information about artifacts available when preparing.
  repeated chromiumos.BuilderConfig.Artifacts.InputArtifactInfo input_artifacts = 4;

  // Additional arguments used in PrepareForBuild.
  // TODO(crbug/1019868): Transition to artifact_profile_info.
  chromiumos.PrepareForBuildAdditionalArgs additional_args = 5;

  // Profile information used for the artifact.
  chromiumos.ArtifactProfileInfo profile_info = 6;
}

message PrepareForToolchainBuildResponse {
  // Does this artifact require a build?  See artifacts.proto in this directory.
  PrepareForBuildResponse.BuildRelevance build_relevance = 1;
}

message BundleToolchainRequest {
  // The chroot where the sysroot lives.
  chromiumos.Chroot chroot = 1;
  // The sysroot where the files live.
  chromite.api.Sysroot sysroot = 2;

  // Absolute path to the directory in which artifacts should be dropped.
  string output_dir = 3;

  // Which artifacts are wanted?
  repeated chromiumos.BuilderConfig.Artifacts.ArtifactTypes artifact_types = 4;

  // Additional arguments that were used in PrepareForBuild.
  // TODO(crbug/1019868): Transition to artifact_profile_info.
  chromiumos.PrepareForBuildAdditionalArgs additional_args = 5;

  // Profile information used for the artifact.
  chromiumos.ArtifactProfileInfo profile_info = 6;
}

// Response describing which bundles were dumped to the given output directory.
message BundleToolchainResponse {
  // In R80 and earlier, artifacts_info had a different type.
  reserved 1;

  // The artifacts that added to the output directory.
  repeated ArtifactInfo artifacts_info = 2;
}

message GetUpdatedFilesRequest {
  // We need the artifact info from BundleResponse and the profile info
  // as the input of the request.
  message UploadedArtifacts {
    ArtifactInfo artifact_info = 1;
    chromiumos.ArtifactProfileInfo profile_info = 2;
  }
  repeated UploadedArtifacts uploaded_artifacts = 1;
}

message GetUpdatedFilesResponse {
  message UpdatedFile {
    // The path to the (uncommitted) file.
    string path = 1;
  }
  repeated UpdatedFile updated_files = 1;

  // The commit message to use.
  string commit_message = 2;

  // The Cq-Depend footer is used by LUCI (and Chrome OS Recipes) to operate
  // on interdependent changes at various steps.
  message CqDependFooter {
    // The gerrit change(s) we depend on.
    repeated chromiumos.GerritChange gerrit_change = 1;
  }

  // The Cq-Cl-Tag footer is used by cq-orchestrator to choose quota pools.
  message CqClTagFooter {
    // The Cq-Cl-Tag value.
    string tag = 1;
  }

  message CommitFooter {
    oneof footer {
      CqDependFooter cq_depend = 1;
      CqClTagFooter cq_cl_tag = 2;
    }
  }

  // Any footers to use.  Formatted to the current standard by Recipes.
  repeated CommitFooter commit_footer = 3;
}

// TODO(crbug.com/1020615): Drop this once this is live in production and all of
// the users have migrated to using BuilderConfig.Artifacts.ArtifactType
// Meanwhile, keep this in sync with chromiumos/builder_config.proto.
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;
}

message VerifyAFDOArtifactsRequest {
  chromiumos.BuildTarget build_target = 1;
  // The type of AFDO artifact to test.
  chromiumos.AFDOArtifactType artifact_type = 2;
}

message VerifyAFDOArtifactsResponse {
  // Status of the service
  bool status = 1;
}
// End of TODO(crbug.com/1020615).

// Service for Android/ARC related functionality.
service ToolchainService {
  option (service_options) = {
    module: "toolchain",
    service_chroot_assert: OUTSIDE,
  };

  // DEPRECATED for recipes: used only by legacy toolchain builders.
  // See also crbug/1019868.  R87 is the last release branch that supports the
  // legacy toolchain builders.
  // Update Chrome ebuild with most recent unvetted orderfile.  Added in R78.
  rpc UpdateEbuildWithAFDOArtifacts(VerifyAFDOArtifactsRequest)
    returns (VerifyAFDOArtifactsResponse) {
    option (method_options) = {
      method_chroot_assert: INSIDE;
    };
  }

  // DEPRECATED for recipes: used only by legacy toolchain builders.
  // See also crbug/1019868.  R87 is the last release branch that supports the
  // legacy toolchain builders.
  // Copy the orderfile from unvetted GS bucket to vetted bucket.  Added in R78.
  rpc UploadVettedAFDOArtifacts(VerifyAFDOArtifactsRequest)
    returns (VerifyAFDOArtifactsResponse) {
    option (method_options) = {
      method_chroot_assert: INSIDE;
    };
  }

  // TODO(crbug/1034529): Migrate this to ArtifactsService/BuildSetup.
  // Prepare to build toolchain artifacts.  This will be called twice:
  // Once with chroot and sysroot = None, before the chroot is created, and
  // again at the start of the 'install packages' step, if the build gets that
  // far.  Added in R80.
  rpc PrepareForBuild(PrepareForToolchainBuildRequest)
    returns (PrepareForToolchainBuildResponse);

  // TODO(crbug/1034529): Migrate this to ArtifactsService/Get.
  // Bundle toolchain artifacts.  Added in R80.
  rpc BundleArtifacts(BundleToolchainRequest)
    returns (BundleToolchainResponse);

  // Added in R90.
  rpc GetUpdatedFiles(GetUpdatedFilesRequest)
    returns (GetUpdatedFilesResponse);
}
