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