syntax = "proto3";
package chromite.api;

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

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

// 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 {
  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.
  // Update Chrome ebuild with most recent unvetted orderfile
  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.
  // Copy the orderfile from unvetted GS bucket to vetted bucket.
  rpc UploadVettedAFDOArtifacts(VerifyAFDOArtifactsRequest)
    returns (VerifyAFDOArtifactsResponse) {
    option (method_options) = {
      method_chroot_assert: INSIDE;
    };
  }

  // 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.
  rpc PrepareForBuild(PrepareForToolchainBuildRequest)
    returns (PrepareForToolchainBuildResponse);

  // Bundle toolchain artifacts.
  rpc BundleArtifacts(BundleToolchainRequest)
    returns (BundleToolchainResponse);

  rpc GetUpdatedFiles(GetUpdatedFilesRequest)
    returns (GetUpdatedFilesResponse);
}
