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

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