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

// Portage environment variable that points to a remote binhost.
enum BinhostKey {
  // No binhost key was specified.
  UNSPECIFIED = 0;

  // Contains prebuilts generated by the postsubmit builder.
  POSTSUBMIT_BINHOST = 1;

  // Contains prebuilts generated by the PFQ.
  LATEST_RELEASE_CHROME_BINHOST = 2;

  // Contains prebuilts generated by pre-flight builders.
  PREFLIGHT_BINHOST = 3;
}

message Binhost {
  // The binhost URI.
  string uri = 1;
  // The package index file name relative to the base binhost uri.
  string package_index = 2;
}

// Local package index file message.
message PackageIndex {
  chromiumos.Path path = 1;
}

// Get the private prebuilts' ACL args for a build target.
message AclArgsRequest {
  // Required. The build target whose Prebuilt ACL args are being fetched.
  chromiumos.BuildTarget build_target = 1;
}

message AclArgsResponse {
  // An ACL command argument.
  message AclArg {
    // The argument (usually -g or -u).
    string arg = 1;
    // The argument value ([group_id|user]:PERMISSION)
    string value = 2;
  }

  repeated AclArg args = 1;
}

// Get the binhosts for the build target.
message BinhostGetRequest {
  // Required.
  // The build target whose binhosts are being fetched.
  chromiumos.BuildTarget build_target = 1;
  // Required.
  // Whether to include private binhosts.
  bool private = 2;
}

message BinhostGetResponse {
  // The binhosts.
  repeated Binhost binhosts = 1;
}

// Describes where prebuilts will be uploaded so package index and other
// Portage metadata can be updated appropriately.
message PrepareBinhostUploadsRequest {
  // Deprecated.
  // Build target to prepare prebuilts for.
  chromiumos.BuildTarget build_target = 1;

  // Full URI where we wish to store prebuilts. Note that this service
  // call does NOT upload them, it only updates metadata.
  // Example: gs://chromeos-prebuilt/board/amd64-generic/packages/
  string uri = 2;

  // Required when chroot not at default location.
  // The chroot where the sysroot lives.
  chromiumos.Chroot chroot = 3;

  // Required.
  // The sysroot whose prebuilts are being uploaded.
  Sysroot sysroot = 4;

  // The package index files to deduplicate the prebuilt list.
  repeated PackageIndex package_index_files = 5;
}

// An upload target is a file in the uploads_dir, and is used by
// PrepareBinhostUploadsResponse and PrepareDevInstallBinhostUploadsResponse.
message UploadTarget {
  // Paths relative to uploads_dir.
  string path = 1;
}

// Return all files to upload.
message PrepareBinhostUploadsResponse {
  // Absolute chroot path to the local directory containing files to upload.
  string uploads_dir = 1;

  // All targets to be uploaded to the binhost.
  repeated UploadTarget upload_targets = 2;
}

// Describes where dev-install prebuilts will be uploaded so package index and
// other Portage metadata can be updated appropriately.
message PrepareDevInstallBinhostUploadsRequest {

  // Absolute path to the local directory that will contain all of the files to
  // upload.  This directory must already exist before calling
  // PrepareDevInstallBinhostUploads.
  string uploads_dir = 1;

  // Full URI where we wish to store prebuilts. Note that this service
  // call does NOT upload them, it only updates metadata.
  // Example: gs://chromeos-prebuilt/board/amd64-generic/packages/
  string uri = 2;

  // Required when chroot not at default location.
  // The chroot where the sysroot lives.
  chromiumos.Chroot chroot = 3;

  // Required.
  // The sysroot whose prebuilts are being uploaded.
  Sysroot sysroot = 4;
}

// Return all dev-install files to upload.
message PrepareDevInstallBinhostUploadsResponse {

  // All targets to be uploaded to the binhost.
  repeated UploadTarget upload_targets = 1;
}

// Set a binhost URL for the given build target.
message SetBinhostRequest {
  // Build target to update binhost for.
  chromiumos.BuildTarget build_target = 1;

  // Whether or not the binhost is private.
  bool private = 2;

  // Binhost key to set or update.
  BinhostKey key = 3;

  // URI storing all the binaries.
  string uri = 4;
}

// Response for SetBinhost service call.
message SetBinhostResponse {
  // Absolute path to the updated binhost conf file.
  string output_file = 1;
}

// Overlay types for push_overlays.
enum OverlayType {
  // Not specified.
  OVERLAYTYPE_UNSPECIFIED = 0;

  // Both public and private.
  OVERLAYTYPE_BOTH = 1;

  // Only public overlays.
  OVERLAYTYPE_PUBLIC = 2;

  // Only private overlays.
  OVERLAYTYPE_PRIVATE = 3;

  // No overlays will be used.
  OVERLAYTYPE_NONE = 4;
}

// Regenerate the build cache.
message RegenBuildCacheRequest {
  // Required.
  // The type of overlays to push:  "public", "private", or "both".
  OverlayType overlay_type = 1;
  // Required if not in the default location.
  // The chroot to be used.
  chromiumos.Chroot chroot = 2;
}

message RegenBuildCacheResponse {
  // Message to encapsulate the modified overlays.
  message Overlay {
    string path = 1;
  }

  // The overlays that have outstanding cache updates.
  repeated Overlay modified_overlays = 1;
}

// Service for reading and writing to Portage package index.
service BinhostService {
  option (service_options) = {
    module: "binhost",
    service_chroot_assert: OUTSIDE,
  };

  // Get the binhosts for a build target.
  rpc Get(BinhostGetRequest) returns (BinhostGetResponse) {
    option (method_options) = {
      implementation_name: "GetBinhosts",
    };
  }

  // Get the arguments from the private overlay's ACL file.
  rpc GetPrivatePrebuiltAclArgs(AclArgsRequest) returns (AclArgsResponse);

  // Return a list of files to upload to the binhost. Importantly, this method
  // assumes that all files, once uploaded, will share the same relative path
  // on the remote disk as they do on the remote disk. E.g., package foo/bar,
  // stored locally at /mnt/bin/foo/bar, must be uploaded to <uri>/foo/bar.
  rpc PrepareBinhostUploads(PrepareBinhostUploadsRequest)
    returns (PrepareBinhostUploadsResponse);

  // Return a list of dev-install files to upload to the binhost. Like
  // PrepareBinhostUploads, this method assumes that all files, once uploaded,
  // will share the same relative path on the remote disk as they do on the
  // remote disk.
  rpc PrepareDevInstallBinhostUploads(PrepareDevInstallBinhostUploadsRequest)
    returns (PrepareDevInstallBinhostUploadsResponse);

  // Update the binhost key for a build targets.
  rpc SetBinhost(SetBinhostRequest) returns (SetBinhostResponse);

  // Regenerate the builder cache.
  rpc RegenBuildCache(RegenBuildCacheRequest) returns (RegenBuildCacheResponse);
}
