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

// Request describing where build artifact bundles for a given build target
// should be dumped.
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,
  };

  // Create a tar archive with all files needed for Autotest HW testing.
  rpc BundleAutotestFiles(BundleRequest) returns (BundleResponse);

  // Create the ChromeOS Config JSON payload.
  rpc BundleChromeOSConfig(BundleRequest) returns (BundleResponse);

  // Create a tar archive with ebuild logs.
  rpc BundleEbuildLogs(BundleRequest) returns (BundleResponse);

  // Create a tar archive with unsigned firmware images.
  rpc BundleFirmware(BundleRequest) returns (BundleResponse);

  // Create a tar.xz archive for each image that has been created.
  rpc BundleImageArchives(BundleRequest) returns (BundleResponse);

  // Generate zip containing all built images for the target.
  rpc BundleImageZip(BundleRequest) returns (BundleResponse);

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

  // Create a tar archive with all guest images test bundles.
  rpc BundlePinnedGuestImages(BundleRequest) returns (BundleResponse);

  // Create the simple chrome artifacts.
  rpc BundleSimpleChromeArtifacts(BundleRequest) returns (BundleResponse);

  // Create a tar archive with all files needed for Tast HW testing.
  rpc BundleTastFiles(BundleRequest) returns (BundleResponse);

  // Generate minimal update payloads to be used in HW testing.
  rpc BundleTestUpdatePayloads(BundleRequest) returns (BundleResponse);

  // Create a tar archive with VM memory and disk images.
  rpc BundleVmFiles(BundleVmFilesRequest) returns (BundleResponse);

  // Generate a CPE report to a file.
  rpc ExportCpeReport(BundleRequest) returns (BundleResponse);

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