// Copyright 2021 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

syntax = "proto3";

package protos;

option go_package = "golang.org/x/build/internal/gomote/protos";

// GomoteService can manage the lifecycle of gomote instances and interact with them.
service GomoteService {
  // Authenticate provides authentication information without any additional action.
  rpc Authenticate (AuthenticateRequest) returns (AuthenticateResponse) {}
  // AddBootstrap adds the bootstrap version of Go to the work directory.
  rpc AddBootstrap (AddBootstrapRequest) returns (AddBootstrapResponse) {}
  // CreateInstance creates a gomote instance.
  rpc CreateInstance (CreateInstanceRequest) returns (stream CreateInstanceResponse) {}
  // DestroyInstance destroys a gomote instance.
  rpc DestroyInstance (DestroyInstanceRequest) returns (DestroyInstanceResponse) {}
  // ExecuteCommand executes a command on the gomote instance.
  rpc ExecuteCommand (ExecuteCommandRequest) returns (stream ExecuteCommandResponse) {}
  // InstanceAlive gives the liveness state of a gomote instance.
  rpc InstanceAlive (InstanceAliveRequest) returns (InstanceAliveResponse) {}
  // ListDirectory lists the contents of a directory on an gomote instance.
  rpc ListDirectory (ListDirectoryRequest) returns (ListDirectoryResponse) {}
  // ListInstances lists all of the live gomote instances owned by the caller.
  rpc ListInstances (ListInstancesRequest) returns (ListInstancesResponse) {}
  // ListSwarmingBuilders lists all of the swarming builders for the project.
  rpc ListSwarmingBuilders (ListSwarmingBuildersRequest) returns (ListSwarmingBuildersResponse) {}
  // ReadTGZToURL tars and zips a directory which exists on the gomote instance and returns a URL where it can be
  // downloaded from.
  rpc ReadTGZToURL (ReadTGZToURLRequest) returns (ReadTGZToURLResponse) {}
  // RemoveFiles removes files or directories from the gomote instance.
  rpc RemoveFiles (RemoveFilesRequest) returns (RemoveFilesResponse) {}
  // SignSSHKey signs an SSH public key which can be used to SSH into instances owned by the caller.
  rpc SignSSHKey (SignSSHKeyRequest) returns (SignSSHKeyResponse) {}
  // UploadFile generates a signed URL and associated fields to be used when uploading the object to GCS. Once uploaded
  // the corresponding Write endpoint can be used to send the file to the gomote instance.
  rpc UploadFile (UploadFileRequest) returns (UploadFileResponse) {}
  // WriteFileFromURL
  rpc WriteFileFromURL (WriteFileFromURLRequest) returns (WriteFileFromURLResponse) {}
  // WriteTGZFromURL retrieves a tar and zipped file from a URL and expands it onto the file system of a gomote instance.
  rpc WriteTGZFromURL (WriteTGZFromURLRequest) returns (WriteTGZFromURLResponse) {}
}

// AuthenticateRequest specifies the data needed for an authentication request.
message AuthenticateRequest {}

// AuthenticateResponse contains authenticated user data.
message AuthenticateResponse {}

// AddBootstrapRequest specifies the data needed for a request to add the bootstrap version of Go
// to the instance.
message AddBootstrapRequest {
  // The unique identifier for a gomote instance.
  string gomote_id = 1;
}

// AddBootstrapResponse contains the information about the add bootstrap request.
message AddBootstrapResponse {
  // The URL for the Go version added to the work directory.
  // If empty, the bootstrap version is undefined and has probably been included in
  // the instance image.
  string bootstrap_go_url = 1;
}

// CreateInstanceRequest specifies the data needed to create a gomote instance.
message CreateInstanceRequest {
  string builder_type = 1;
}

// CreateInstanceResponse contains data about a created gomote instance.
message CreateInstanceResponse {
  // Instance information for the requested instance.
  Instance instance = 1;
  enum Status {
    UNKNOWN = 0;
    WAITING = 1;
    COMPLETE = 2;
  }
  // The status for the requested create.
  Status status = 2;
  // Waiters ahead is the count of how many instances are being scheduled for
  // creation before the current instance creation request.
  int64 waiters_ahead = 3;
}

// DestroyInstanceRequest specifies the data needed to destroy a gomote instance.
message DestroyInstanceRequest {
  // The unique identifier for a gomote instance.
  string gomote_id = 1;
}

// DestroyInstanceResponse contains data about a destroyed gomote instance.
message DestroyInstanceResponse {}

// ExecuteCommandRequest specifies the data needed to execute a command on a gomote instance.
message ExecuteCommandRequest {
  // The unique identifier for a gomote instance.
  string gomote_id = 1;
  // The command to be executed on the buildlet.
  string command = 2;
  // Controls whether the command is run outside of the buildlet's environment.
  bool system_level = 3;
  // Debug will instruct the buildlet to include extra debugging information in the output.
  bool debug = 4;
  // These are additional environmental variables to include in the buildlet's process's
  // environment.
  repeated string append_environment = 5;
  // Path specifies the PATH variable of the executed procesess's environment.
  // A non-nil entry will clear the existing PATH value.
  // The string "$PATH" expands to any existing PATH element(s).
  // The substring "$WORKDIR" expands to buildlet's temp workdir.
  repeated string path = 6;
  // The directory from which to execute the command.
  // If not specified, it defaults to the directory of the command or the
  // work directory if system level is set.
  string directory = 7;
  // The arguments to pass to the command.
  repeated string args = 8;
  // Optional alternate builder to act like. It must be a compatible builder.
  string imitate_host_type = 9;
}

// ExecuteCommandResponse contains data about the executed command.
message ExecuteCommandResponse {
  // The output from the executed command.
  bytes output = 1;
}

// Instance contains descriptive information about a gomote instance.
message Instance {
  // The unique identifier for a gomote instance.
  string gomote_id = 1;
  // Builder type for the gomote instance.
  string builder_type = 2;
  // Host type for the gomote instance.
  string host_type = 3;
  // The timestamp for when the builder instance will expire. It is
  // represented in Unix epoch time format.
  int64 expires = 4;
  // The working directory of the instance.
  string working_dir = 5;
}

// InstanceAliveRequest specifies the data needed to check the liveness of a gomote instance.
message InstanceAliveRequest {
  // The unique identifier for a gomote instance.
  string gomote_id = 1;
}

// InstanceAliveResponse contains instance liveness state.
message InstanceAliveResponse {}

// ListDirectoryRequest specifies the data needed to list contents of a directory from a gomote instance.
message ListDirectoryRequest {
  // The unique identifier for a gomote instance.
  string gomote_id = 1;
  // The directory to list the contents of. The directory dir itself is not included.
  string directory = 2;
  // Controls whether the directory is listed recursively.
  bool recursive = 3;
  // The directories to skip, relative to the main directory.
  // Each item should contain only forward slashes and not start or end in slashes.
  repeated string skip_files = 4;
  // Controls whether the SHA-1 of regular files are returned.
  bool digest = 5;
}

// ListDirectoryResponse contains the directory listing of a gomote instance.
message ListDirectoryResponse {
  // The directory entries.
  repeated string entries = 1;
}

// ListInstancesRequest specifies the data needed to list the live gomote instances owned by the caller.
message ListInstancesRequest {}

// ListInstancesResponse contains the list of live gomote instances owned by the caller.
message ListInstancesResponse {
  repeated Instance instances = 1;
}

// ListSwarmingBuildersRequest specifies the data needed to list all swarming builders.
message ListSwarmingBuildersRequest {}

// ListSwarmingBuildersResponse contains a list of swarming builders.
message ListSwarmingBuildersResponse {
  repeated string builders = 1;
}

// ReadTGZToURLRequest specifies the data needed to retrieve a tar and zipped directory from a gomote instance.
message ReadTGZToURLRequest {
  // The unique identifier for a gomote instance.
  string gomote_id = 1;
  // The relative directory from the gomote's work directory to tar up.
  string directory = 2;
}

// ReadTGZToURLResponse contains a URL where the tar and zipped directory from a gomote instance can be downloaded from.
message ReadTGZToURLResponse {
  // URL to retrieve the tarball from.
  string url = 1;
}

// RemoveFilesRequest specifies the data needed to remove files or directories from a gomote instance.
message RemoveFilesRequest {
  // The unique identifier for a gomote instance.
  string gomote_id = 1;
  // The list of paths for files or directories to remove from the file system.
  // When everything should be deleted, "." should be used.
  // The paths are relative to the work directory.
  repeated string paths = 2;
}

// RemoveFilesResponse contains the results from removing files or directories from a gomote instance.
message RemoveFilesResponse {}

// SignSSHKeyRequest specifies the data needed to sign a public SSH key which attaches a certificate to the key.
message SignSSHKeyRequest {
  // The unique identifier for a gomote instance.
  string gomote_id = 1;
  // A user provided public SSH key which the user intends to initiate an SSH session with.
  bytes public_ssh_key = 2;
}

// SignSSHKeyResponse contains the results from a request to sign a public SSH key.
message SignSSHKeyResponse {
  // A signed SSH key can be used in conjunction with the associated private key to initiate an SSH session to a gomote instance.
  // The certificate attached to the key will contain principles which restrict the instance that can be logged into.
  bytes signed_public_ssh_key = 1;
}

// UploadFileRequest specifies the data needed to create a request to upload an object to GCS.
message UploadFileRequest {}

// UploadFileResponse contains the results from a request to upload an object to GCS.
message UploadFileResponse {
  // URL to post file to.
  string url = 1;
  // Form fields used when http posting files to GCS.
  map<string, string> fields = 2;
  // Name used to reference the object.
  string object_name = 3;
}

// WriteFileFromURLRequest specifies the data needed to request that a gomote download the contents of a URL and place
// the contents in a file.
message WriteFileFromURLRequest {
  // The unique identifier for a gomote instance.
  string gomote_id = 1;
  // URL to post get file from.
  string url = 2;
  // The filename as it should appear at the destination.
  string filename = 3;
  // The file mode.
  fixed32 mode = 4;
}

// WriteFileFromURLResponse contains the results from requesting that a file be downloaded onto a gomote instance.
message WriteFileFromURLResponse {}

// WriteTGZFromURLRequest specifies the data needed to retrieve a file and expand it onto the file system of a gomote instance.
// It instructs the buildlet to download the tar.gz file from the url and write it to a directory, a relative directory from the workdir.
// If the directory is empty, they're placed at the root of the buildlet's work directory.
// The directory is created if necessary.
// The url must be of a tar.gz file.
message WriteTGZFromURLRequest {
  string gomote_id = 1;
  string url = 2;
  string directory = 3;
}

// WriteTGZFromURLResponse contains the results from retrieving a file and expanding it onto the file system of a gomote instance.
message WriteTGZFromURLResponse {}
