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

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

  // Prepare to build artifacts.
  rpc PrepareForBuild(PrepareForBuildRequest) returns (PrepareForBuildResponse);

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

  // Fetch the pinned guest image locations.
  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.
  rpc BundleChromeOSConfig(BundleRequest) returns (BundleResponse);

  // TODO(crbug/1034529): DEPRECATED use Get
  // Create a tar archive of debug symbols.
  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.
  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.
  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.
  rpc ExportCpeReport(BundleRequest) returns (BundleResponse);

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

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

  // Generate all Remote Test Driver metadata.
  //
  // 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.
  //
  // 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);
}
