syntax = "proto3";
package chromite.api;

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

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

// Sysroot information.
message Sysroot {
  // Sysroot location.
  string path = 1;
  // The build target used to create the sysroot.
  chromiumos.BuildTarget build_target = 2;
}

// Information about the sysroot's profile.
message Profile {
  // The name of the profile.
  string name = 1;
}

// Sysroot create request.
message SysrootCreateRequest {
  // The Create flags.
  message Flags {
    // Triggers an update of the chroot unless the it is declared as current.
    bool chroot_current = 1;
    // Replace the existing sysroot when one already exists when set to true,
    // otherwise keep the existing sysroot. No effect when the sysroot does not
    // exist.
    bool replace = 2;
    // Whether a toolchain change has occurred.
    bool toolchain_changed = 3;
  }

  // The target whose sysroot is being created.
  chromiumos.BuildTarget build_target = 1;
  // The sysroot create flags.
  Flags flags = 2;
  // The profile to select for the sysroot.
  Profile profile = 3;
  // The chroot to use to execute the endpoint.
  chromiumos.Chroot chroot = 4;
}

// Create response.
message SysrootCreateResponse {
  // Information about the created sysroot. This sysroot can be passed directly
  // to the InstallToolchainRequest.
  Sysroot sysroot = 1;
}

// Sysroot generate archive request.
message SysrootGenerateArchiveRequest {
  // The target whose sysroot is being created.
  chromiumos.BuildTarget build_target = 1;
  // The chroot to use to execute the endpoint.
  chromiumos.Chroot chroot = 2;
  // Packages to generate the sysroot for, such as 'virtual/target-fuzzers'.
  // This is passed in based on the informaitonal builder type, see
  // chromite/config/chromeos_config.py for examples.
  repeated chromiumos.PackageInfo packages = 3;
  // Target directory for the sysroot tarball.
  chromiumos.ResultPath target_dir = 4;
}

// Generate archive response.
message SysrootGenerateArchiveResponse {
  // Path where the sysroot tarball is written.
  chromiumos.Path sysroot_archive = 1;
}

// Request to install the toolchain into the sysroot.
message InstallToolchainRequest {
  // The install toolchain flags.
  message Flags {
    // Compile from source (true), or use bin packages (false).
    bool compile_source = 1;
    // Whether a toolchain change has occurred.
    bool toolchain_changed = 2;
  }

  // The sysroot where the toolchain is being installed.
  // The path and build_target are required.
  Sysroot sysroot = 1;
  // The flags for the install.
  Flags flags = 2;
  // The chroot to use to execute the endpoint.
  chromiumos.Chroot chroot = 3;
}

message InstallToolchainResponse {
  // The packages that failed to install. Will populate at least the category
  // and package fields for any failed packages.
  repeated chromiumos.PackageInfo failed_packages = 1;
}

message InstallPackagesRequest {
  message Flags {
    reserved 2;

    // Compile from source (true), or use bin packages (false).
    bool compile_source = 1;
    // Whether to start goma.
    bool use_goma = 3;
    // Whether a toolchain change has occurred.
    bool toolchain_changed = 4;
  }

  // The sysroot into which the packages are being installed.
  // The path and build target are required.
  Sysroot sysroot = 1;
  // The install packages flags.
  Flags flags = 2;
  // A list of specific packages to install. Will generate the list of packages
  // for the build target if none are specified.
  repeated chromiumos.PackageInfo packages = 3;
  // The chroot to use to execute the endpoint.
  chromiumos.Chroot chroot = 4;
  // USE flags to set before building the packages.
  repeated chromiumos.UseFlag use_flags = 5;
  // Goma Config.
  chromiumos.GomaConfig goma_config = 6;
}

message InstallPackagesResponse {
  // The packages that failed to install. Will populate at least the category
  // and package fields for any failed packages.
  repeated chromiumos.PackageInfo failed_packages = 1;
  // The metric events that occurred during the running of InstallPackages.
  repeated chromiumos.MetricEvent events = 2;
  // Goma artifacts will only be populated if
  // InstallPackagesRequest.goma_config.log_dir was not empty.
  chromiumos.GomaArtifacts goma_artifacts = 3;
}

message CreateSimpleChromeSysrootRequest {
  // The board that is the build_target for the created sysroot.
  chromiumos.BuildTarget build_target = 1;
  // Additional environment flags which are set via the ENV VAR 'USE'.
  repeated string use_flags = 2;
  // Target directory for the sysroot tarball.
  chromiumos.ResultPath target_dir = 3;
}

message CreateSimpleChromeSysrootResponse {
  // Path where the sysroot tarball is written.
  chromiumos.Path sysroot_archive = 1;
}

// Service to manipulate a sysroot.
service SysrootService {
  option (service_options) = {
    module: "sysroot",
    service_chroot_assert: INSIDE,
  };

  // Create the base sysroot structure.
  rpc Create(SysrootCreateRequest) returns (SysrootCreateResponse);

  // Generate sysroot archive.
  rpc GenerateArchive(SysrootGenerateArchiveRequest)
    returns (SysrootGenerateArchiveResponse);

  // Install the toolchain into the sysroot.
  rpc InstallToolchain(InstallToolchainRequest)
    returns (InstallToolchainResponse);

  // Install packages into the sysroot. By default will install all packages.
  rpc InstallPackages(InstallPackagesRequest) returns (InstallPackagesResponse);

  // Install SimpleChrome sysroot.
  rpc CreateSimpleChromeSysroot(CreateSimpleChromeSysrootRequest)
    returns (CreateSimpleChromeSysrootResponse);
}
