syntax = "proto3";
package chromite.api;

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

import "chromite/api/build_api.proto";
import "chromite/api/sysroot.proto";
import "chromiumos/common.proto";

// An artifact is a file generated during or after a build.
message Artifact {
  // Absolute path to the artifact file.
  string path = 1;
}

// TODO(crbug/1034529): PrepareForBuild has never existed in chromite, and is
// being renamed to BuildSetup.  PrepareForBuildResponse is still used by
// ToolchainService.
message PrepareForBuildResponse {
  // Whether this artifact requires a build.
  enum BuildRelevance {
    UNSPECIFIED = 0;
    // Build is necessary to generate artifacts.
    NEEDED = 1;
    // Defer to other artifacts.  Used primarily for aggregation of artifact
    // results.
    UNKNOWN = 2;
    // Artifacts are already generated.  The build is pointless.
    POINTLESS = 3;
  }
  BuildRelevance build_relevance = 1;
}

message BuildSetupRequest {
  // The chroot where the sysroot lives.
  chromiumos.Chroot chroot = 1;

  // The sysroot where the files live.
  Sysroot sysroot = 2;

  // Information about the artifacts.
  chromiumos.ArtifactsByService artifact_info = 3;

  // Whether we will proceed even if the build is POINTLESS.
  bool forced_build_relevance = 4;
}

message BuildSetupResponse {
  // Whether this artifact requires a build.
  enum BuildRelevance {
    UNSPECIFIED = 0;
    // Build is necessary to generate artifacts.
    NEEDED = 1;
    // Defer to other artifacts.  Used primarily for aggregation of artifact
    // results.
    UNKNOWN = 2;
    // Artifacts are already generated.  The build is pointless.
    POINTLESS = 3;
  }
  BuildRelevance build_relevance = 1;
}

message GetRequest {
  // The chroot where the sysroot lives.
  chromiumos.Chroot chroot = 1;

  // The sysroot where the files live.
  Sysroot sysroot = 2;

  // Artifact information.
  chromiumos.ArtifactsByService artifact_info = 3;

  // Result path for artifacts.
  chromiumos.ResultPath result_path = 4;
}

message GetResponse {
  // The artifacts that were bundled.
  chromiumos.UploadedArtifactsByService artifacts = 1;
}

message BundleArtifactsRequest {
  // The chroot where the sysroot lives.
  chromiumos.Chroot chroot = 1;

  // The sysroot where the files live.
  Sysroot sysroot = 2;

  // Artifact information.
  chromiumos.ArtifactsByService artifact_info = 3;

  // Absolute path to the directory in which artifacts should be dropped.
  // TODO(crbug/1034529): Switch the recipes code to use result_path.
  string output_dir = 4;

  // Result path for artifacts.  If present this overrides output_dir.
  chromiumos.ResultPath result_path = 5;
}

message BundleArtifactsResponse {
  // The artifacts that were bundled.
  chromiumos.UploadedArtifactsByService artifacts = 1;
}

// Request describing where build artifact bundles for a given build target
// should be dumped.
// TODO(crbug/1034529): BundleRequest and BundleResponse are being deprecated
// (along with most of this file).  See BundleArtifactsRequest/Response
message BundleRequest {
  // The build target to bundle artifacts for.
  // Deprecated. Use sysroot instead.
  chromiumos.BuildTarget build_target = 1;

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

  // The chroot where the sysroot lives.
  chromiumos.Chroot chroot = 3;
  // The sysroot where the files live.
  chromite.api.Sysroot sysroot = 4;
}

// Response describing which bundles were dumped to the given output directory.
message BundleResponse {
  // The artifacts that added to the output directory.
  repeated Artifact artifacts = 1;
}

// Request describing where to find build artifacts that are taken from a
// sysroot.
message BundleVmFilesRequest {
  // The chroot where the sysroot lives.
  chromiumos.Chroot chroot = 1;
  // The sysroot where the files live.
  chromite.api.Sysroot sysroot = 2;
  // Test results directory relative to the sysroot.
  string test_results_dir = 3;

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

// DEPRECATED for recipes: crbug/1019868: This is being replaced with
// BundleRequest.
// Request describing where to find Chrome AFDO artifacts
message BundleChromeAFDORequest {
  // The chroot where the orderfile lives.
  chromiumos.Chroot chroot = 1;
  // The build_target of the builder.
  chromiumos.BuildTarget build_target = 2;
  // Absolute path to the directory in which artifacts should be dropped.
  string output_dir = 3;
  // The type of AFDO artifact (benchmark-afdo or orderfile)
  chromiumos.AFDOArtifactType artifact_type = 4;
}

// Fetch the pinned guest image uris.
message PinnedGuestImageUriRequest {
  // The chroot where the sysroot lives.
  chromiumos.Chroot chroot = 1;
  // The sysroot where the files live.
  chromite.api.Sysroot sysroot = 2;
}

// Response from fetching pinned guest image uris.
message PinnedGuestImageUriResponse {
  message PinnedGuestImage {
    string filename = 1;
    string uri = 2;
  }

  // The pinned guest images.
  repeated PinnedGuestImage pinned_images = 1;
}

// Service for bundling build artifacts and dumping them somewhere on disk.
service ArtifactsService {
  option (service_options) = {
    module: "artifacts",
    service_chroot_assert: OUTSIDE,
  };

  // Perform pre-build setup for artifact builds.  Added in R90.
  rpc BuildSetup(BuildSetupRequest) returns (BuildSetupResponse);

  // Get artifacts for build. Added in R90.
  rpc Get(GetRequest) returns (GetResponse);

  // Fetch the pinned guest image locations.  Added in R77.
  rpc FetchPinnedGuestImageUris(PinnedGuestImageUriRequest)
    returns (PinnedGuestImageUriResponse);

  //
  // Everything that follows this line is planned to be deprecated
  // as part of a BuildAPI refactoring detailed in crbug/1034529.
  // Until that bug is closed, these endpoints are still used.
  //

  // TODO(crbug/1034529): DEPRECATED use Get
  // Create a tar archive with all files needed for Autotest HW testing.
  rpc BundleAutotestFiles(BundleRequest) returns (BundleResponse);

  // TODO(crbug/1034529): DEPRECATED use Get
  // Create the ChromeOS Config JSON payload.  Added in R78.
  rpc BundleChromeOSConfig(BundleRequest) returns (BundleResponse);

  // TODO(crbug/1034529): DEPRECATED use Get
  // Create a tar archive of debug symbols.  Added in R90.
  rpc BundleDebugSymbols(BundleRequest) returns (BundleResponse);

  // TODO(crbug/1034529): DEPRECATED use Get
  // Create a tar archive with ebuild logs.
  rpc BundleEbuildLogs(BundleRequest) returns (BundleResponse);

  // TODO(crbug/1034529): DEPRECATED use Get
  // Create a tar archive with unsigned firmware images.
  rpc BundleFirmware(BundleRequest) returns (BundleResponse);

  // TODO(crbug/1034529): DEPRECATED use Get
  // Create a tar.xz archive for each image that has been created.
  // Added in R79.
  rpc BundleImageArchives(BundleRequest) returns (BundleResponse);

  // TODO(crbug/1034529): DEPRECATED use Get
  // Generate zip containing all built images for the target.
  rpc BundleImageZip(BundleRequest) returns (BundleResponse);

  // TODO(crbug/1034529): DEPRECATED use Get
  // DEPRECATED for recipes: crbug/1019868: This are being replaced by
  // ToolchainService.Bundle{ArtifactType}()
  // Create Chrome Benchmark AFDO builder artifacts.  Added in R78.
  rpc BundleAFDOGenerationArtifacts(BundleChromeAFDORequest)
    returns (BundleResponse);

  // TODO(crbug/1034529): DEPRECATED use Get
  // Create a tar archive with all guest images test bundles.
  rpc BundlePinnedGuestImages(BundleRequest) returns (BundleResponse);

  // TODO(crbug/1034529): DEPRECATED use Get
  // Create the simple chrome artifacts.
  rpc BundleSimpleChromeArtifacts(BundleRequest) returns (BundleResponse);

  // TODO(crbug/1034529): DEPRECATED use Get
  // Create a tar archive with all files needed for Tast HW testing.
  rpc BundleTastFiles(BundleRequest) returns (BundleResponse);

  // TODO(crbug/1034529): DEPRECATED use Get
  // Generate minimal update payloads to be used in HW testing.
  rpc BundleTestUpdatePayloads(BundleRequest) returns (BundleResponse);

  // TODO(crbug/1034529): DEPRECATED use Get
  // Create a tar archive with VM memory and disk images.
  rpc BundleVmFiles(BundleVmFilesRequest) returns (BundleResponse);

  // TODO(crbug/1034529): DEPRECATED use Get
  // Generate a CPE report to a file.  Added in R78.
  rpc ExportCpeReport(BundleRequest) returns (BundleResponse);

  // TODO(crbug/1034529): DEPRECATED use Get
  // Create a tar archive with fingerprint MCU on-device unittest binaries.
  // Added in R88.
  rpc BundleFpmcuUnittests(BundleRequest) returns (BundleResponse);

  // TODO(crbug/1034529): DEPRECATED use Get
  // Create a tarball from the test image suitable for importing into GCE.
  // Added in R89.
  rpc BundleGceTarball(BundleRequest) returns (BundleResponse);

  // Generate all Remote Test Driver metadata.  Added in R85.
  //
  // Response consists of one or more metadata files. Each file must contain a
  // single binary encoded chromiumos.config.api.test.metadata.v1.Specification
  // protobuf payload.
  // Schema defined at
  // https://chromium.googlesource.com/chromiumos/config/+/refs/heads/master/proto/chromiumos/config/api/test/metadata/v1/metadata.proto
  //
  // These artifacts partially replace chromiumos.ArtifactsByService.Test
  // artifacts. See also, GenerateRemoteTestDriverImages()
  //
  // TODO(crbug/1034529): DEPRECATED use Get
  rpc GenerateRemoteTestDriverSpecification(BundleRequest)
    returns (BundleResponse);

  // Generate all Remote Test Driver container images.  Added in R85.
  //
  // Response consists of one or more Docker container images.
  // The images are identified by their Docker image digest. The filenames of
  // the created artifacts are ignored.
  //
  // These artifacts partially replace chromiumos.ArtifactsByService.Test
  // artifacts. See also, GenerateRemoteTestDriverSpecification()
  //
  // TODO(crbug/1034529): DEPRECATED use Get
  rpc GenerateRemoteTestDriverImages(BundleRequest) returns (BundleResponse);
}
