blob: 1d4358ab4c146a07ac3964bcf2fe8d0e2f5f3bfb [file] [log] [blame]
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;
}