github.com/pachyderm/pachyderm@v1.13.4/src/client/admin/v1_10/pps/pps.proto (about)

     1  syntax = "proto3";
     2  
     3  package pps_1_10;
     4  option go_package = "github.com/pachyderm/pachyderm/src/client/admin/v1_10/pps";
     5  
     6  import "google/protobuf/empty.proto";
     7  import "google/protobuf/timestamp.proto";
     8  import "google/protobuf/duration.proto";
     9  
    10  import "gogoproto/gogo.proto";
    11  
    12  import "client/admin/v1_10/pfs/pfs.proto";
    13  
    14  message SecretMount {
    15    // Name must be the name of the secret in kubernetes.
    16    string name = 1;
    17    // Key of the secret to load into env_var, this field only has meaning if EnvVar != "".
    18    string key = 4;
    19    string mount_path = 2;
    20    string env_var = 3;
    21  }
    22  
    23  message Transform {
    24    string image = 1;
    25    repeated string cmd = 2;
    26    repeated string err_cmd = 13;
    27    map<string, string> env = 3;
    28    repeated SecretMount secrets = 4;
    29    repeated string image_pull_secrets = 9;
    30    repeated string stdin = 5;
    31    repeated string err_stdin = 14;
    32    repeated int64 accept_return_code = 6;
    33    bool debug = 7;
    34    string user = 10;
    35    string working_dir = 11;
    36    string dockerfile = 12;
    37  }
    38  
    39  message TFJob {
    40    // tf_job  is a serialized Kubeflow TFJob spec. Pachyderm sends this directly
    41    // to a kubernetes cluster on which kubeflow has been installed, instead of
    42    // creating a pipeline ReplicationController as it normally would.
    43    string tf_job = 1 [(gogoproto.customname) = "TFJob"];
    44  }
    45  
    46  message Egress {
    47    string URL = 1;
    48  }
    49  
    50  message Job {
    51    string id = 1 [(gogoproto.customname) = "ID"];
    52  }
    53  
    54  enum JobState {
    55    JOB_STARTING = 0;
    56    JOB_RUNNING = 1;
    57    JOB_FAILURE = 2;
    58    JOB_SUCCESS = 3;
    59    JOB_KILLED = 4;
    60    JOB_MERGING = 5;
    61  }
    62  
    63  message Metadata {
    64    map<string, string> annotations = 1;
    65    map<string, string> labels = 2;
    66  }
    67  
    68  message Service {
    69    int32 internal_port = 1;
    70    int32 external_port = 2;
    71    string ip = 3 [(gogoproto.customname) = "IP"];
    72    string type = 4;
    73  }
    74  
    75  message Spout {
    76    bool overwrite = 1;
    77    Service service = 2;
    78    string marker = 3;
    79  }
    80  
    81  message PFSInput {
    82    string name = 1;
    83    string repo = 2;
    84    string branch = 3;
    85    string commit = 4;
    86    string glob = 5;
    87    string join_on = 8;
    88    bool lazy = 6;
    89    // EmptyFiles, if true, will cause files from this PFS input to be
    90    // presented as empty files. This is useful in shuffle pipelines where you
    91    // want to read the names of files and reorganize them using symlinks.
    92    bool empty_files = 7;
    93    // S3, if true, will cause the worker to NOT download or link files from this
    94    // input into the /pfs directory. Instead, an instance of our S3 gateway
    95    // service will run on each of the sidecars, and data can be retrieved from
    96    // this input by querying
    97    // http://<pipeline>-s3.<namespace>/<job id>.<input>/my/file
    98    bool s3 = 9;
    99  }
   100  
   101  message CronInput {
   102    string name = 1;
   103    string repo = 2;
   104    string commit = 3;
   105    string spec = 4;
   106    // Overwrite, if true, will expose a single datum that gets overwritten each
   107    // tick. If false, it will create a new datum for each tick.
   108    bool overwrite = 6;
   109    google.protobuf.Timestamp start = 5;
   110  }
   111  
   112  message GitInput {
   113    string name = 1;
   114    string url = 2 [(gogoproto.customname) = "URL"];
   115    string branch = 3;
   116    string commit = 4;
   117  }
   118  
   119  message Input {
   120    PFSInput pfs = 6;
   121    repeated Input join = 7;
   122    repeated Input cross = 2;
   123    repeated Input union = 3;
   124    CronInput cron = 4;
   125    GitInput git = 5;
   126  }
   127  
   128  message JobInput {
   129    string name = 4;
   130    pfs_1_10.Commit commit = 1;
   131    string glob = 2;
   132    bool lazy = 3;
   133  }
   134  
   135  message ParallelismSpec {
   136    reserved 1;
   137  
   138    // Starts the pipeline/job with a 'constant' workers, unless 'constant' is
   139    // zero. If 'constant' is zero (which is the zero value of ParallelismSpec),
   140    // then Pachyderm will choose the number of workers that is started,
   141    // (currently it chooses the number of workers in the cluster)
   142    uint64 constant = 2;
   143  
   144    // Starts the pipeline/job with number of workers equal to 'coefficient' * N,
   145    // where N is the number of nodes in the kubernetes cluster.
   146    //
   147    // For example, if each Kubernetes node has four CPUs, you might set
   148    // 'coefficient' to four, so that there are four Pachyderm workers per
   149    // Kubernetes node, and each Pachyderm worker gets one CPU. If you want to
   150    // reserve half the nodes in your cluster for other tasks, you might set
   151    // 'coefficient' to 0.5.
   152    double coefficient = 3;
   153  }
   154  
   155  // HashTreeSpec sets the number of shards into which pps splits a pipeline's
   156  // output commits (sharded commits are implemented in Pachyderm 1.8+ only)
   157  message HashtreeSpec {
   158    uint64 constant = 1;
   159  }
   160  
   161  message InputFile {
   162    // This file's absolute path within its pfs repo.
   163    string path = 4;
   164  
   165    // This file's hash
   166    bytes hash = 5;
   167  }
   168  
   169  message Datum {
   170    // ID is the hash computed from all the files
   171    string id = 1 [(gogoproto.customname) = "ID"];
   172    Job job = 2;
   173  }
   174  
   175  enum DatumState {
   176      FAILED = 0;
   177      SUCCESS = 1;
   178      SKIPPED = 2;
   179      STARTING = 3;
   180      RECOVERED = 4;
   181  }
   182  
   183  message DatumInfo {
   184    Datum datum = 1;
   185    DatumState state = 2;
   186    ProcessStats stats = 3;
   187    pfs_1_10.File pfs_state = 4;
   188    repeated pfs_1_10.FileInfo data = 5;
   189  }
   190  
   191  message Aggregate {
   192    int64 count = 1;
   193    double mean = 2;
   194    double stddev = 3;
   195    double fifth_percentile = 4;
   196    double ninety_fifth_percentile = 5;
   197  }
   198  
   199  message ProcessStats {
   200    google.protobuf.Duration download_time = 1;
   201    google.protobuf.Duration process_time = 2;
   202    google.protobuf.Duration upload_time = 3;
   203    uint64 download_bytes = 4;
   204    uint64 upload_bytes = 5;
   205  }
   206  
   207  message AggregateProcessStats {
   208    Aggregate download_time = 1;
   209    Aggregate process_time = 2;
   210    Aggregate upload_time = 3;
   211    Aggregate download_bytes = 4;
   212    Aggregate upload_bytes = 5;
   213  }
   214  
   215  message WorkerStatus {
   216    string worker_id = 1 [(gogoproto.customname) = "WorkerID"];
   217    string job_id = 2 [(gogoproto.customname) = "JobID"];
   218    repeated pps_1_10.InputFile data = 3;
   219    // Started is the time processing on the current datum began.
   220    google.protobuf.Timestamp started = 4;
   221    ProcessStats stats = 5;
   222    int64 queue_size = 6;
   223  }
   224  
   225  // ResourceSpec describes the amount of resources that pipeline pods should
   226  // request from kubernetes, for scheduling.
   227  message ResourceSpec {
   228    reserved 3;
   229  
   230    // The number of CPUs each worker needs (partial values are allowed, and
   231    // encouraged)
   232    float cpu = 1;
   233  
   234    // The amount of memory each worker needs (in bytes, with allowed
   235    // SI suffixes (M, K, G, Mi, Ki, Gi, etc).
   236    string memory = 2;
   237  
   238    // The spec for GPU resources.
   239    GPUSpec gpu = 5;
   240  
   241    // The amount of ephemeral storage each worker needs (in bytes, with allowed
   242    // SI suffixes (M, K, G, Mi, Ki, Gi, etc).
   243    string disk = 4;
   244  }
   245  
   246  message GPUSpec {
   247    // The type of GPU (nvidia.com/gpu or amd.com/gpu for example).
   248    string type = 1;
   249    // The number of GPUs to request.
   250    int64 number = 2;
   251  }
   252  
   253  // EtcdJobInfo is the portion of the JobInfo that gets stored in etcd during
   254  // job execution. It contains fields which change over the lifetime of the job
   255  // but aren't used in the execution of the job.
   256  message EtcdJobInfo {
   257    Job job = 1;
   258    Pipeline pipeline = 2;
   259    pfs_1_10.Commit output_commit = 3;
   260    // Job restart count (e.g. due to datum failure)
   261    uint64 restart = 4;
   262  
   263    // Counts of how many times we processed or skipped a datum
   264    int64 data_processed = 5;
   265    int64 data_skipped = 6;
   266    int64 data_total = 7;
   267    int64 data_failed = 8;
   268    int64 data_recovered = 15;
   269  
   270    // Download/process/upload time and download/upload bytes
   271    ProcessStats stats = 9;
   272  
   273    pfs_1_10.Commit stats_commit = 10;
   274    JobState state = 11;
   275    string reason = 12;
   276    google.protobuf.Timestamp started = 13;
   277    google.protobuf.Timestamp finished = 14;
   278  }
   279  
   280  message JobInfo {
   281    reserved 4, 5, 28, 34;
   282    Job job = 1;
   283    Transform transform = 2;                     // requires ListJobRequest.Full
   284    Pipeline pipeline = 3;
   285    uint64 pipeline_version = 13;                // requires ListJobRequest.Full
   286    pfs_1_10.Commit spec_commit = 47;
   287    ParallelismSpec parallelism_spec = 12;       // requires ListJobRequest.Full
   288    Egress egress = 15;                          // requires ListJobRequest.Full
   289    Job parent_job = 6;
   290    google.protobuf.Timestamp started = 7;
   291    google.protobuf.Timestamp finished = 8;
   292    pfs_1_10.Commit output_commit = 9;
   293    JobState state = 10;
   294    string reason = 35;  // reason explains why the job is in the current state
   295    Service service = 14;                        // requires ListJobRequest.Full
   296    Spout spout = 45;                            // requires ListJobRequest.Full
   297    pfs_1_10.Repo output_repo = 18;
   298    string output_branch = 17;                   // requires ListJobRequest.Full
   299    uint64 restart = 20;
   300    int64 data_processed = 22;
   301    int64 data_skipped = 30;
   302    int64 data_failed = 40;
   303    int64 data_recovered = 46;
   304    int64 data_total = 23;
   305    ProcessStats stats = 31;
   306    repeated WorkerStatus worker_status = 24;
   307    ResourceSpec resource_requests = 25;         // requires ListJobRequest.Full
   308    ResourceSpec resource_limits = 36;           // requires ListJobRequest.Full
   309    Input input = 26;                            // requires ListJobRequest.Full
   310    pfs_1_10.BranchInfo new_branch = 27;
   311    pfs_1_10.Commit stats_commit = 29;
   312    bool enable_stats = 32;                      // requires ListJobRequest.Full
   313    string salt = 33;                            // requires ListJobRequest.Full
   314    ChunkSpec chunk_spec = 37;                   // requires ListJobRequest.Full
   315    google.protobuf.Duration datum_timeout = 38; // requires ListJobRequest.Full
   316    google.protobuf.Duration job_timeout = 39;   // requires ListJobRequest.Full
   317    int64 datum_tries = 41;                      // requires ListJobRequest.Full
   318    SchedulingSpec scheduling_spec = 42;         // requires ListJobRequest.Full
   319    string pod_spec = 43;                        // requires ListJobRequest.Full
   320    string pod_patch = 44;                       // requires ListJobRequest.Full
   321  }
   322  
   323  enum WorkerState {
   324    POD_RUNNING = 0;
   325    POD_SUCCESS = 1;
   326    POD_FAILED = 2;
   327  }
   328  
   329  message Worker {
   330    string name = 1;
   331    WorkerState state = 2;
   332  }
   333  
   334  message JobInfos {
   335    repeated JobInfo job_info = 1;
   336  }
   337  
   338  message Pipeline {
   339    string name = 1;
   340  }
   341  
   342  enum PipelineState {
   343    // There is an EtcdPipelineInfo + spec commit, but no RC
   344    // This happens when a pipeline has been created but not yet picked up by a
   345    // PPS server.
   346    PIPELINE_STARTING = 0;
   347    // A pipeline has a spec commit and a service + RC
   348    // This is the normal state of a pipeline.
   349    PIPELINE_RUNNING = 1;
   350    // Equivalent to STARTING (there is an EtcdPipelineInfo + commit, but no RC)
   351    // After some error caused runPipeline to exit, but before the pipeline is
   352    // re-run. This is when the exponential backoff is in effect.
   353    PIPELINE_RESTARTING = 2;
   354    // We have retried too many times and we have given up on this pipeline (or
   355    // the pipeline image doesn't exist)
   356    PIPELINE_FAILURE = 3;
   357    // The pipeline has been explicitly paused by the user (the pipeline spec's
   358    // Stopped field should be true if the pipeline is in this state)
   359    PIPELINE_PAUSED = 4;
   360    // The pipeline is fully functional, but there are no commits to process.
   361    PIPELINE_STANDBY = 5;
   362  }
   363  
   364  // EtcdPipelineInfo is proto that Pachd stores in etcd for each pipeline. It
   365  // tracks the state of the pipeline, and points to its metadata in PFS (and,
   366  // by pointing to a PFS commit, de facto tracks the pipeline's version)
   367  message EtcdPipelineInfo {
   368    PipelineState state = 1;
   369    string reason = 4;
   370    pfs_1_10.Commit spec_commit = 2;
   371    map<int32, int32> job_counts = 3;
   372    string auth_token = 5;
   373    JobState last_job_state = 6;
   374  
   375    // parallelism tracks the literal number of workers that this pipeline should
   376    // run. Unlike PipelineInfo.ParallelismSpec, this accounts for the number of
   377    // nodes in the k8s cluster if Coefficient parallelism is used (i.e. if
   378    // Coefficient is 2 and the cluster has 5 nodes, this will be set to 10 by
   379    // pachd). This allows the worker master to shard work correctly without
   380    // k8s privileges and without knowing the number of cluster nodes in the
   381    // Coefficient case.
   382    uint64 parallelism = 7;
   383  }
   384  
   385  message PipelineInfo {
   386    reserved 3, 4, 22, 26, 27, 18;
   387    string id = 17 [(gogoproto.customname) = "ID"];
   388    Pipeline pipeline = 1;
   389    uint64 version = 11;
   390    Transform transform = 2;
   391    // tf_job encodes a Kubeflow TFJob spec. Pachyderm uses this to create TFJobs
   392    // when running in a kubernetes cluster on which kubeflow has been installed.
   393    // Exactly one of 'tf_job' and 'transform' should be set
   394    TFJob tf_job = 46 [(gogoproto.customname) = "TFJob"];
   395    ParallelismSpec parallelism_spec = 10;
   396    HashtreeSpec hashtree_spec = 42;
   397    Egress egress = 15;
   398    google.protobuf.Timestamp created_at = 6;
   399  
   400    // state indicates the current state of the pipeline. This is not stored in
   401    // PFS along with the rest of this data structure--PPS.InspectPipeline fills
   402    // it in
   403    PipelineState state = 7;
   404    // same for stopped field
   405    bool stopped = 38;
   406    string recent_error = 8;
   407  
   408    // job_counts and last_job_state indicates the number of jobs within this
   409    // pipeline in a given state and the state of the most recently created job,
   410    // respectively. This is not stored in PFS along with the rest of this data
   411    // structure--PPS.InspectPipeline fills it in from the EtcdPipelineInfo.
   412    map<int32, int32> job_counts = 9;
   413    JobState last_job_state = 43;
   414  
   415    string output_branch = 16;
   416    ResourceSpec resource_requests = 19;
   417    ResourceSpec resource_limits = 31;
   418    Input input = 20;
   419    string description = 21;
   420    string cache_size = 23;
   421    bool enable_stats = 24;
   422    string salt = 25;
   423  
   424    // reason includes any error messages associated with a failed pipeline
   425    string reason = 28;
   426    int64 max_queue_size = 29;
   427    Service service = 30;
   428    Spout spout = 45;
   429    ChunkSpec chunk_spec = 32;
   430    google.protobuf.Duration datum_timeout = 33;
   431    google.protobuf.Duration job_timeout = 34;
   432    string githook_url = 35 [(gogoproto.customname) = "GithookURL"];
   433    pfs_1_10.Commit spec_commit = 36;
   434    bool standby = 37;
   435    int64 datum_tries = 39;
   436    SchedulingSpec scheduling_spec = 40;
   437    string pod_spec = 41;
   438    string pod_patch = 44;
   439    bool s3_out = 47;
   440    Metadata metadata = 48;
   441  }
   442  
   443  message PipelineInfos {
   444    repeated PipelineInfo pipeline_info = 1;
   445  }
   446  
   447  message CreateJobRequest {
   448    reserved 3, 4, 1, 10, 7, 9, 8, 12, 11, 13, 14, 21, 15, 16, 17, 18, 19, 20, 22, 23, 24;
   449    Pipeline pipeline = 2;
   450    pfs_1_10.Commit output_commit = 25;
   451  
   452    // Fields below should only be set when restoring an extracted job.
   453    uint64 restart = 26;
   454  
   455    // Counts of how many times we processed or skipped a datum
   456    int64 data_processed = 27;
   457    int64 data_skipped = 28;
   458    int64 data_total = 29;
   459    int64 data_failed = 30;
   460    int64 data_recovered = 31;
   461  
   462    // Download/process/upload time and download/upload bytes
   463    ProcessStats stats = 32;
   464  
   465    pfs_1_10.Commit stats_commit = 33;
   466    JobState state = 34;
   467    string reason = 35;
   468    google.protobuf.Timestamp started = 36;
   469    google.protobuf.Timestamp finished = 37;
   470  }
   471  
   472  message InspectJobRequest {
   473    // Callers should set either Job or OutputCommit, not both.
   474    Job job = 1;
   475    pfs_1_10.Commit output_commit = 3;
   476    bool block_state = 2; // block until state is either JOB_STATE_FAILURE or JOB_STATE_SUCCESS
   477  }
   478  
   479  message ListJobRequest {
   480    Pipeline pipeline = 1;                // nil means all pipelines
   481    repeated pfs_1_10.Commit input_commit = 2; // nil means all inputs
   482    pfs_1_10.Commit output_commit = 3;         // nil means all outputs
   483  
   484    // History indicates return jobs from historical versions of pipelines
   485    // semantics are:
   486    // 0: Return jobs from the current version of the pipeline or pipelines.
   487    // 1: Return the above and jobs from the next most recent version
   488    // 2: etc.
   489    //-1: Return jobs from all historical versions.
   490    int64 history = 4;
   491  
   492    // Full indicates whether the result should include all pipeline details in
   493    // each JobInfo, or limited information including name and status, but
   494    // excluding information in the pipeline spec. Leaving this "false" can make
   495    // the call significantly faster in clusters with a large number of pipelines
   496    // and jobs.
   497    // Note that if 'input_commit' is set, this field is coerced to "true"
   498    bool full = 5;
   499  }
   500  
   501  message FlushJobRequest {
   502    repeated pfs_1_10.Commit commits = 1;
   503    repeated Pipeline to_pipelines = 2;
   504  }
   505  
   506  message DeleteJobRequest {
   507    Job job = 1;
   508  }
   509  
   510  message StopJobRequest {
   511    Job job = 1;
   512  }
   513  
   514  message UpdateJobStateRequest {
   515    Job job = 1;
   516    JobState state = 2;
   517    string reason = 3;
   518  }
   519  
   520  message GetLogsRequest {
   521    reserved 4;
   522    // The pipeline from which we want to get logs (required if the job in 'job'
   523    // was created as part of a pipeline. To get logs from a non-orphan job
   524    // without the pipeline that created it, you need to use ElasticSearch).
   525    Pipeline pipeline = 2;
   526  
   527    // The job from which we want to get logs.
   528    Job job = 1;
   529  
   530    // Names of input files from which we want processing logs. This may contain
   531    // multiple files, to query pipelines that contain multiple inputs. Each
   532    // filter may be an absolute path of a file within a pps repo, or it may be
   533    // a hash for that file (to search for files at specific versions)
   534    repeated string data_filters = 3;
   535  
   536    Datum datum = 6;
   537  
   538    // If true get logs from the master process
   539    bool master = 5;
   540  
   541    // Continue to follow new logs as they become available.
   542    bool follow = 7;
   543  
   544    // If nonzero, the number of lines from the end of the logs to return.  Note:
   545    // tail applies per container, so you will get tail * <number of pods> total
   546    // lines back.
   547    int64 tail = 8;
   548  }
   549  
   550  // LogMessage is a log line from a PPS worker, annotated with metadata
   551  // indicating when and why the line was logged.
   552  message LogMessage {
   553    // The job and pipeline for which a PFS file is being processed (if the job
   554    // is an orphan job, pipeline name and ID will be unset)
   555    string pipeline_name = 1;
   556    string job_id = 3 [(gogoproto.customname) = "JobID"];
   557    string worker_id = 7 [(gogoproto.customname) = "WorkerID"];
   558    string datum_id = 9 [(gogoproto.customname) = "DatumID"];
   559    bool master = 10;
   560  
   561    // The PFS files being processed (one per pipeline/job input)
   562    repeated InputFile data = 4;
   563  
   564    // User is true if log message comes from the users code.
   565    bool user = 8;
   566  
   567    // The message logged, and the time at which it was logged
   568    google.protobuf.Timestamp ts = 5;
   569    string message = 6;
   570  }
   571  
   572  message RestartDatumRequest {
   573    Job job = 1;
   574    repeated string data_filters = 2;
   575  }
   576  
   577  message InspectDatumRequest {
   578    Datum datum = 1;
   579  }
   580  
   581  message ListDatumRequest {
   582    Job job = 1;
   583    int64 page_size = 2;
   584    int64 page = 3;
   585  }
   586  
   587  message ListDatumResponse {
   588    repeated DatumInfo datum_infos = 1;
   589    int64 total_pages = 2;
   590    int64 page = 3;
   591  }
   592  
   593  // ListDatumStreamResponse is identical to ListDatumResponse, except that only
   594  // one DatumInfo is present (as these responses are streamed)
   595  message ListDatumStreamResponse {
   596    DatumInfo datum_info = 1;
   597    // total_pages is only set in the first response (and set to 0 in all other
   598    // responses)
   599    int64 total_pages = 2;
   600    // page is only set in the first response (and set to 0 in all other
   601    // responses)
   602    int64 page = 3;
   603  }
   604  
   605  // ChunkSpec specifies how a pipeline should chunk its datums.
   606  message ChunkSpec {
   607    // number, if nonzero, specifies that each chunk should contain `number`
   608    // datums. Chunks may contain fewer if the total number of datums don't
   609    // divide evenly.
   610    int64 number = 1;
   611    // size_bytes, if nonzero, specifies a target size for each chunk of datums.
   612    // Chunks may be larger or smaller than size_bytes, but will usually be
   613    // pretty close to size_bytes in size.
   614    int64 size_bytes = 2;
   615  }
   616  
   617  message SchedulingSpec {
   618    map<string, string> node_selector = 1;
   619    string priority_class_name = 2;
   620  }
   621  
   622  message CreatePipelineRequest {
   623    reserved 3, 4, 11, 15, 19;
   624    Pipeline pipeline = 1;
   625    // tf_job encodes a Kubeflow TFJob spec. Pachyderm uses this to create TFJobs
   626    // when running in a kubernetes cluster on which kubeflow has been installed.
   627    // Exactly one of 'tf_job' and 'transform' should be set
   628    TFJob tf_job = 35 [(gogoproto.customname) = "TFJob"];
   629    Transform transform = 2;
   630    ParallelismSpec parallelism_spec = 7;
   631    HashtreeSpec hashtree_spec = 31;
   632    Egress egress = 9;
   633    bool update = 5;
   634    string output_branch = 10;
   635    // s3_out, if set, requires a pipeline's user to write to its output repo
   636    // via Pachyderm's s3 gateway (if set, workers will serve Pachyderm's s3
   637    // gateway API at http://<pipeline>-s3.<namespace>/<job id>.out/my/file).
   638    // In this mode /pfs/out won't be walked or uploaded, and the s3 gateway
   639    // service in the workers will allow writes to the job's output commit
   640    bool s3_out = 36;
   641    ResourceSpec resource_requests = 12;
   642    ResourceSpec resource_limits = 22;
   643    Input input = 13;
   644    string description = 14;
   645    string cache_size = 16;
   646    bool enable_stats = 17;
   647    // Reprocess forces the pipeline to reprocess all datums.
   648    // It only has meaning if Update is true
   649    bool reprocess = 18;
   650    int64 max_queue_size = 20;
   651    Service service = 21;
   652    Spout spout = 33;
   653    ChunkSpec chunk_spec = 23;
   654    google.protobuf.Duration datum_timeout = 24;
   655    google.protobuf.Duration job_timeout = 25;
   656    string salt = 26;
   657    bool standby = 27;
   658    int64 datum_tries = 28;
   659    SchedulingSpec scheduling_spec = 29;
   660    string pod_spec = 30; // deprecated, use pod_patch below
   661    string pod_patch = 32; // a json patch will be applied to the pipeline's pod_spec before it's created;
   662    pfs_1_10.Commit spec_commit = 34;
   663    Metadata metadata = 46;
   664  }
   665  
   666  message InspectPipelineRequest {
   667    Pipeline pipeline = 1;
   668  }
   669  
   670  message ListPipelineRequest {
   671    // If non-nil, only return info about a single pipeline, this is redundant
   672    // with InspectPipeline unless history is non-zero.
   673    Pipeline pipeline = 1;
   674    // History indicates how many historical versions you want returned. Its
   675    // semantics are:
   676    // 0: Return the current version of the pipeline or pipelines.
   677    // 1: Return the above and the next most recent version
   678    // 2: etc.
   679    //-1: Return all historical versions.
   680    int64 history = 2;
   681  }
   682  
   683  message DeletePipelineRequest {
   684    reserved 2, 3;
   685    Pipeline pipeline = 1;
   686    bool all = 4;
   687    bool force = 5;
   688    bool keep_repo = 6;
   689  }
   690  
   691  message StartPipelineRequest {
   692    Pipeline pipeline = 1;
   693  }
   694  
   695  message StopPipelineRequest {
   696    Pipeline pipeline = 1;
   697  }
   698  
   699  message RunPipelineRequest {
   700    reserved 3;
   701    Pipeline pipeline = 1;
   702    repeated pfs_1_10.CommitProvenance provenance = 2;
   703    string job_id = 4 [(gogoproto.customname) = "JobID"];
   704  }
   705  
   706  message RunCronRequest {
   707    Pipeline pipeline = 1;
   708  }
   709  
   710  message CreateSecretRequest {
   711    bytes file = 1;
   712  }
   713  
   714  message DeleteSecretRequest {
   715    Secret secret  = 1;
   716  }
   717  
   718  message InspectSecretRequest {
   719    Secret secret = 1;
   720  }
   721  
   722  message Secret {
   723    string name = 1;
   724  }
   725  
   726  message SecretInfo {
   727    Secret secret = 1;
   728    string type = 2;
   729    google.protobuf.Timestamp creation_timestamp = 3;
   730  }
   731  
   732  message SecretInfos {
   733    repeated SecretInfo secret_info = 1;
   734  }
   735  
   736  message GarbageCollectRequest {
   737      // Memory is how much memory to use in computing which objects are alive. A
   738      // larger number will result in more precise garbage collection (at the
   739      // cost of more memory usage).
   740      int64 memory_bytes = 1;
   741  }
   742  message GarbageCollectResponse {}
   743  
   744  message ActivateAuthRequest {}
   745  message ActivateAuthResponse {}
   746  
   747  service API {
   748    rpc CreateJob(CreateJobRequest) returns (Job) {}
   749    rpc InspectJob(InspectJobRequest) returns (JobInfo) {}
   750    // ListJob returns information about current and past Pachyderm jobs. This is
   751    // deprecated in favor of ListJobStream
   752    rpc ListJob(ListJobRequest) returns (JobInfos) {}
   753    // ListJobStream returns information about current and past Pachyderm jobs.
   754    rpc ListJobStream(ListJobRequest) returns (stream JobInfo) {}
   755    rpc FlushJob(FlushJobRequest) returns (stream JobInfo) {}
   756    rpc DeleteJob(DeleteJobRequest) returns (google.protobuf.Empty) {}
   757    rpc StopJob(StopJobRequest) returns (google.protobuf.Empty) {}
   758    rpc InspectDatum(InspectDatumRequest) returns (DatumInfo) {}
   759    // ListDatum returns information about each datum fed to a Pachyderm job. This
   760    // is deprecated in favor of ListDatumStream
   761    rpc ListDatum(ListDatumRequest) returns (ListDatumResponse) {}
   762    // ListDatumStream returns information about each datum fed to a Pachyderm job
   763    rpc ListDatumStream(ListDatumRequest) returns (stream ListDatumStreamResponse) {}
   764    rpc RestartDatum(RestartDatumRequest) returns (google.protobuf.Empty) {}
   765  
   766    rpc CreatePipeline(CreatePipelineRequest) returns (google.protobuf.Empty) {}
   767    rpc InspectPipeline(InspectPipelineRequest) returns (PipelineInfo) {}
   768    rpc ListPipeline(ListPipelineRequest) returns (PipelineInfos) {}
   769    rpc DeletePipeline(DeletePipelineRequest) returns (google.protobuf.Empty) {}
   770    rpc StartPipeline(StartPipelineRequest) returns (google.protobuf.Empty) {}
   771    rpc StopPipeline(StopPipelineRequest) returns (google.protobuf.Empty) {}
   772    rpc RunPipeline(RunPipelineRequest) returns (google.protobuf.Empty) {}
   773    rpc RunCron(RunCronRequest) returns (google.protobuf.Empty) {}
   774  
   775    rpc CreateSecret(CreateSecretRequest) returns (google.protobuf.Empty) {}
   776    rpc DeleteSecret(DeleteSecretRequest) returns (google.protobuf.Empty) {}
   777    rpc ListSecret(google.protobuf.Empty) returns (SecretInfos) {}
   778    rpc InspectSecret(InspectSecretRequest) returns (SecretInfo) {}
   779  
   780    // DeleteAll deletes everything
   781    rpc DeleteAll(google.protobuf.Empty) returns (google.protobuf.Empty) {}
   782    rpc GetLogs(GetLogsRequest) returns (stream LogMessage) {}
   783  
   784    // Garbage collection
   785    rpc GarbageCollect(GarbageCollectRequest) returns (GarbageCollectResponse) {}
   786  
   787    // An internal call that causes PPS to put itself into an auth-enabled state
   788    // (all pipeline have tokens, correct permissions, etcd)
   789    rpc ActivateAuth(ActivateAuthRequest) returns (ActivateAuthResponse) {}
   790  
   791    // An internal call used to move a job from one state to another
   792    rpc UpdateJobState(UpdateJobStateRequest) returns(google.protobuf.Empty) {}
   793  }