syntax = "proto3";
package task_scheduler.rpc;
option go_package = "go.skia.org/infra/task_scheduler/go/rpc";

import "google/protobuf/timestamp.proto";

// TaskSchedulerService provides interactions with the Task Scheduler frontend.
service TaskSchedulerService {
	// TriggerJobs triggers the given jobs.
	rpc TriggerJobs(TriggerJobsRequest) returns (TriggerJobsResponse);
	// GetJob returns the given job.
	rpc GetJob(GetJobRequest) returns (GetJobResponse);
	// CancelJob cancels the given job.
	rpc CancelJob(CancelJobRequest) returns (CancelJobResponse);
	// SearchJobs searches the DB and returns jobs matching the given criteria.
	rpc SearchJobs(SearchJobsRequest) returns (SearchJobsResponse);

	// GetTask returns the given task.
	rpc GetTask(GetTaskRequest) returns (GetTaskResponse);
	// SearchTasks searches the DB and returns tasks matching the given
	// criteria.
	rpc SearchTasks(SearchTasksRequest) returns (SearchTasksResponse);

	// GetSkipTaskRules returns all active rules for skipping tasks.
	rpc GetSkipTaskRules(GetSkipTaskRulesRequest) returns (GetSkipTaskRulesResponse);
	// AddSkipTaskRule adds a rule for skipping tasks.
	rpc AddSkipTaskRule(AddSkipTaskRuleRequest) returns (AddSkipTaskRuleResponse);
	// DeleteSkipTaskRule deletes the given rule for skipping tasks.
	rpc DeleteSkipTaskRule(DeleteSkipTaskRuleRequest) returns (DeleteSkipTaskRuleResponse);
}

// TriggerJob represents a single job to trigger.
message TriggerJob {
	// job_name is the name of the job to trigger.
	string job_name = 1;
	// commit_hash is the hash of the commit at which the job should run.
	string commit_hash = 2;
}

// TriggerJobsRequest is a request to TriggerJobs.
message TriggerJobsRequest {
	// jobs specifies which jobs to trigger.
	repeated TriggerJob jobs = 1;
}

// TriggerJobsResponse is a response returned by TriggerJobs.
message TriggerJobsResponse {
	// job_ids are the IDs of the jobs which were triggered, in the same order
	// as they were requested.
	repeated string job_ids = 1;
}

// GetJobRequest is a request to GetJob.
message GetJobRequest {
	// ID of the job to retrieve.
	string id = 1;
}

// GetJobResponse is a response returned from GetJob.
message GetJobResponse {
	// job contains the core information about the job.
	Job job = 1;
}

// CancelJobRequest is a request to CancelJob.
message CancelJobRequest {
	// ID of the job to cancel.
	string id = 1;
}

// CancelJobResponse is a response returned by CancelJob.
message CancelJobResponse {
	// job is the updated job after cancellation.
	Job job = 1;
}

// SearchJobsRequest is a request to SearchJobs.
message SearchJobsRequest {
	string buildbucket_build_id = 1;
	bool has_buildbucket_build_id = 2;
	bool is_force = 3;
	bool has_is_force = 4;
	string issue = 5;
	bool has_issue = 6;
	string name = 7;
	bool has_name = 8;
	string patchset = 9;
	bool has_patchset = 10;
	string repo = 11;
	bool has_repo = 12;
	string revision = 13;
	bool has_revision = 14;
	JobStatus status = 15;
	bool has_status = 16;
	google.protobuf.Timestamp time_start = 17;
	bool has_time_start = 18;
	google.protobuf.Timestamp time_end = 19;
	bool has_time_end = 20;
}

// SearchJobsRequest is a response returned by SearchJobs.
message SearchJobsResponse {
	repeated Job jobs = 1;
}

// GetTaskRequest is a request to GetTask.
message GetTaskRequest {
	// ID of the task to retrieve.
	string id = 1;
	// Whether or not to include statistics. This is expensive and should only
	// be set when needed.
	bool include_stats = 2;
}

// GetTaskResponse is a response returned from GetTask.
message GetTaskResponse {
	// task is the requested task.
	Task task = 1;
}

// SearchTasksRequest is a request to SearchTasks.
message SearchTasksRequest {
	int32 attempt = 1;
	bool has_attempt = 2;
	string issue = 3;
	bool has_issue = 4;
	string name = 5;
	bool has_name = 6;
	string patchset = 7;
	bool has_patchset = 8;
	string repo = 9;
	bool has_repo = 10;
	string revision = 11;
	bool has_revision = 12;
	TaskStatus status = 13;
	bool has_status = 14;
	google.protobuf.Timestamp time_start = 15;
	bool has_time_start = 16;
	google.protobuf.Timestamp time_end = 17;
	bool has_time_end = 18;
}

// SearchTasksResponse is a response returned from SearchTasks.
message SearchTasksResponse {
	repeated Task tasks = 1;
}

// GetSkipTaskRulesRequest is a request to GetSkipTaskRules.
message GetSkipTaskRulesRequest {}

// SkipTaskRule is a rule which dictates when to skip scheduling a task.
message SkipTaskRule {
	// added_by is the email address of the user who added this rule.
	string added_by = 1;
	// task_spec_patterns determines which tasks the rule applies to.
	repeated string task_spec_patterns = 2;
	// commits determines which commits the rule applies to.
	repeated string commits = 3;
	// description provides a human-readable description of the rule, eg. to
	// provide a reason for skipping the task(s) and to indicate when the rule
	// may be removed.
	string description = 4;
	// name is a brief descriptive name for the rule.
	string name = 5;
}

// GetSkipTaskRulesResponse is a response returned from GetSkipTaskRules.
message GetSkipTaskRulesResponse {
	repeated SkipTaskRule rules = 1;
}

// AddSkipTaskRuleRequest is a request to AddSkipTaskRule.
message AddSkipTaskRuleRequest {
	// task_spec_patterns determines which tasks the rule applies to.
	repeated string task_spec_patterns = 2;
	// commits determines which commits the rule applies to.
	repeated string commits = 3;
	// description provides a human-readable description of the rule, eg. to
	// provide a reason for skipping the task(s) and to indicate when the rule
	// may be removed.
	string description = 4;
	// name is a brief descriptive name for the rule.
	string name = 5;
}

// AddSkipTaskRuleResponse is a response returned from AddSkipTaskRule.
message AddSkipTaskRuleResponse {
	repeated SkipTaskRule rules = 1;
}

// DeleteSkipTaskRuleRequest is a request to DeleteSkipTaskRule.
message DeleteSkipTaskRuleRequest {
	// ID of the rule to delete.
	string id = 1; // TODO(borenet): Where does this come from?
}

// DeleteSkipTaskRuleResponse is a response returned from
// DeleteSkipTaskRule.
message DeleteSkipTaskRuleResponse {
	repeated SkipTaskRule rules = 1;
}

//  encapsulates all of the parameters which define the state of a
// repo.
message RepoState {
  // Patch describes a patch which may be applied to a code checkout.
  message Patch {
    // Issue ID of the Patch.
    string issue = 1;
    // URL of the repository where this patch may be applied.
    string patch_repo = 2;
    // Patch set ID.
    string patchset = 3;
    // URL of the code review server.
    string server = 4;
  }

  // Patch information, optional.
  Patch patch = 1;
  // Repository URL.
  string repo = 2;
  // Revision ID, ie. commit hash.
  string revision = 3;
}

// TaskKey is a struct used for identifying a Task instance. Note that more
// than one Task may have the same TaskKey, eg. in the case of retries.
message TaskKey {
  // State of the repository for this task.
  RepoState repo_state = 1;
  // Name of the task.
  string name = 2;
  // If this task is part of a force-triggered job, ID of the job.
  string forced_job_id = 3;
}

// TaskStatus indicates the status of a given task. Must be kept in sync with
// types.TaskStatus.
enum TaskStatus {
	// TASK_STATUS_PENDING indicates the task has not started. It is the empty
	// string so that it is the zero value of TaskStatus.
	TASK_STATUS_PENDING = 0;
	// TASK_STATUS_RUNNING indicates the task is in progress.
	TASK_STATUS_RUNNING = 1;
	// TASK_STATUS_SUCCESS indicates the task completed successfully.
	TASK_STATUS_SUCCESS = 2;
	// TASK_STATUS_FAILURE indicates the task completed with failures.
	TASK_STATUS_FAILURE = 3;
	// TASK_STATUS_MISHAP indicates the task exited early with an error, died
	// while in progress, was manually canceled, expired while waiting on the
	// queue, or timed out before completing.
	TASK_STATUS_MISHAP = 4;
}

// Task describes a single task. This must be kept in sync with types.Task.
message Task {
	// attempt is the attempt number of this task, starting with zero.
	int32 attempt = 1;

	// commits are the commits which were tested in this Task. The list may
	// change due to backfilling/bisecting.
	repeated string commits = 2;

	// created is the creation timestamp.
	google.protobuf.Timestamp created_at = 3;

	// db_modified is the time of the last successful call to TaskDB.PutTask/s
	// for this Task, or zero if the task is new. It is not related to the
	// ModifiedTs time of the associated Swarming task.
	google.protobuf.Timestamp db_modified_at = 4;

	// finished is the time the task stopped running or expired from the queue, or
	// zero if the task is pending or running.
	google.protobuf.Timestamp finished_at = 5;

	// id is a generated unique identifier for this Task instance. Must be
	// URL-safe.
	string id = 6;

	// isolated_output is the isolated hash of any outputs produced by this Task.
	// Filled in when the task is completed. This field will not be set if the
	// Task does not correspond to a Swarming task.
	string isolated_output = 7;

	// jobs are the IDs of all Jobs which utilized this Task.
	repeated string jobs = 8;

	// max_attempts is the maximum number of attempts for this TaskSpec.
	int32 max_attempts = 9;

	// parent_task_ids are IDs of tasks which satisfied this task's dependencies.
	repeated string parent_task_ids = 10;

	// properties contains key-value pairs from external sources. Both key and
	// value must be UTF-8 strings. Prefer a JavaScript identifier for key. Use
	// base64 encoding for binary data.
	map<string, string> properties = 11;

	// retry_of is the ID of the task which this task is a retry of, if any.
	string retry_of = 12;

	// started is the time the task started running, or zero if the task is
	// pending, or the same as Finished if the task never ran.
	google.protobuf.Timestamp started_at = 13;

	// status is the current task status, default TASK_STATUS_PENDING.
	TaskStatus status = 14;

	// swarming_bot_id is the ID of the Swarming bot that ran this task. This
	// field will not be set if the Task does not correspond to a Swarming task or
	// if the task is still pending.
	string swarming_bot_id = 15;

	// swarming_task_id is the Swarming task ID. This field will not be set if the
	// Task does not correspond to a Swarming task.
	string swarming_task_id = 16;

	// task_key is a struct which describes aspects of the Task related
	// to the current state of the repo when it ran, and about the Task
	// itself.
	TaskKey task_key = 17;

	// stats provides statistics about the task.
	TaskStats stats = 18;
}

enum JobStatus {
	JOB_STATUS_IN_PROGRESS = 0;
	JOB_STATUS_SUCCESS = 1;
	JOB_STATUS_FAILURE = 2;
	JOB_STATUS_MISHAP = 3;
	JOB_STATUS_CANCELED = 4;
}

// TaskDependencies represents dependencies of a task.
message TaskDependencies {
	// Name of the task.
	string task = 1;
	// Names of the tasks which this task depends on.
	repeated string dependencies = 2;
}

// TaskSummary provides a subset of the information of a Task.
message TaskSummary {
	string id = 1;
	int32 attempt = 2;
	int32 max_attempts = 3;
	TaskStatus status = 4;
	string swarming_task_id = 5;
}
 // TODO: Make optional.
 // TODO: Make optional.
// TaskSummaries groups TaskSummaries which have the same TaskSpec name.
message TaskSummaries {
	string name = 1;
	repeated TaskSummary tasks = 2;
}

// TaskDimensions contains the dimensions required for a given task.
message TaskDimensions {
	// task_name is the name of the task.
	string task_name = 1;
	// dimensions are the Swarming bot dimensions requested by the task.
	repeated string dimensions = 2;
}

// TaskStats provides statistics about a task.
message TaskStats {
	// total_overhead_s is the total amount of overhead for the task.
	float total_overhead_s = 1;
	// download_overhead_s is the number of seconds spent downloading assets
	// before running the task.
	float download_overhead_s = 2;
	// upload_overhead_s is the number of seconds spent uploading assets
	// before running the task.
	float upload_overhead_s = 3;
}

// Job represents a set of Tasks which are executed as part of a larger effort.
// This must be kept in sync with types.Job.
message Job {
	// buildbucket_build_id is the ID of the Buildbucket build with which this
	// Job is associated, if one exists.
	string buildbucket_build_id = 1;

	// buildbucket_lease_key is the lease key for running a Buildbucket build.
	// TODO(borenet): Maybe this doesn't belong in the DB.
	string buildbucket_lease_key = 2;

	// created_at is the creation timestamp. This property should never change
	// for a given Job instance.
	google.protobuf.Timestamp created_at = 3;

	// db_modified_at is the time of the last successful call to JobDB.PutJob/s
	// for this Job, or zero if the job is new.
	google.protobuf.Timestamp db_modified_at = 4;

	// dependencies maps out the DAG of TaskSpec names upon which this Job
	// depends. Keys are TaskSpec names and values are slices of TaskSpec
	// names indicating which TaskSpecs that TaskSpec depends on. This
	// property should never change for a given Job instance.
	repeated TaskDependencies dependencies = 5;

	// finished_at is the time at which all of the Job's dependencies finished,
	// successfully or not.
	google.protobuf.Timestamp finished_at = 6;

	// id is a unique identifier for the Job. This property should never
	// change for a given Job instance, after its initial insertion into the
	// DB.
	string id = 7;

	// is_force indicates whether this is a manually-triggered Job, as
	// opposed to a normally scheduled one, or a try job.
	bool is_force = 8;

	// name is a human-friendly descriptive name for the Job. All Jobs
	// generated from the same JobSpec have the same name. This property
	// should never change for a given Job instance.
	string name = 9;

	// priority is an indicator of the relative priority of this Job.
	float priority = 10;

	//  is the current state of the repository for this Job.
	RepoState repo_state = 11;

	// requested is the time at which this Job was requested. This is a
	// commit timestamp, tryjob request creation timestamp, time at which
	// the server received a force trigger job request, etc.
	google.protobuf.Timestamp requested_at = 12;

	// status is the current Job status, default JOB_STATUS_IN_PROGRESS.
	JobStatus status = 13;

	// tasks are the Task instances which satisfied the dependencies of
	// the Job. Keys are TaskSpec names and values are slices of TaskSummary
	// instances describing the Tasks.
	repeated TaskSummaries tasks = 14;

	// taskDimensions are the dimensions of the tasks needed by this job.
	repeated TaskDimensions task_dimensions = 15;
}
