OLD | NEW |
1 // Copyright 2016 The LUCI Authors. All rights reserved. | 1 // Copyright 2016 The LUCI Authors. All rights reserved. |
2 // Use of this source code is governed under the Apache License, Version 2.0 | 2 // Use of this source code is governed under the Apache License, Version 2.0 |
3 // that can be found in the LICENSE file. | 3 // that can be found in the LICENSE file. |
4 | 4 |
5 syntax = "proto3"; | 5 syntax = "proto3"; |
6 | 6 |
7 import "google/protobuf/timestamp.proto"; | 7 import "google/protobuf/timestamp.proto"; |
| 8 import "google/protobuf/duration.proto"; |
8 | 9 |
9 import "github.com/luci/luci-go/common/api/template/template.proto"; | 10 import "github.com/luci/luci-go/common/api/template/template.proto"; |
10 | 11 |
11 import "types.proto"; | 12 import "types.proto"; |
12 | 13 |
13 package dm; | 14 package dm; |
14 | 15 |
| 16 message AbnormalFinish { |
| 17 enum Status { |
| 18 // This entity has a failed result. |
| 19 // |
| 20 // Executions: the distributor reported that the task executed and failed, O
R |
| 21 // the distributor reports success while the Execution is in the RUNNING |
| 22 // state. |
| 23 // |
| 24 // Attempts: the last Execution had a FAILED Status. |
| 25 // |
| 26 // Retryable. |
| 27 FAILED = 0; |
| 28 |
| 29 // This entity failed in a bad way. |
| 30 // |
| 31 // Executions: The distributor told us that the job died violently while in |
| 32 // the SCHEDULING, RUNNING or STOPPING state. |
| 33 // |
| 34 // Attempts: the last Execution had a CRASHED Status. |
| 35 // |
| 36 // Retryable. |
| 37 CRASHED = 1; |
| 38 |
| 39 // Waited too long for the job to start. |
| 40 // |
| 41 // Executions: the distributor couldn't start the job in time, OR DM failed |
| 42 // to get a status update from the distributor in time (e.g. the state was |
| 43 // SCHEDULING for too long). |
| 44 // |
| 45 // Attempts: the last Execution had an EXPIRED Status. |
| 46 // |
| 47 // Retryable. |
| 48 EXPIRED = 2; |
| 49 |
| 50 // The job started, but took too long. |
| 51 // |
| 52 // Executions: the distributor started the job, but it couldn't complete in |
| 53 // time, OR DM failed to get a status update from the distributor in time |
| 54 // (e.g. the state was RUNNING for too long). |
| 55 // |
| 56 // Attempts: the last Execution had an TIMED_OUT Status. |
| 57 // |
| 58 // Retryable. |
| 59 TIMED_OUT = 3; |
| 60 |
| 61 // The job was cancelled by an external entity (human, automated system). |
| 62 // |
| 63 // Executions: the distributor informing DM that the job was preemptively |
| 64 // cancelled. |
| 65 // |
| 66 // Attempts: the last Execution had a CANCELLED Status, or this Attempt |
| 67 // was cancelled via DM. |
| 68 CANCELLED = 4; |
| 69 |
| 70 // The job was prevented from running by the distributor (quota, permissions
, |
| 71 // etc.) |
| 72 // |
| 73 // Executions: the distributor refused to run this job. |
| 74 // |
| 75 // Attempts: the last Execution had a REJECTED Status. |
| 76 REJECTED = 5; |
| 77 |
| 78 // The job is unrecognized. |
| 79 // |
| 80 // Executions: the distributor doesn't know about this job, or has forgotten |
| 81 // about it. |
| 82 // |
| 83 // Attempts: the last Execution had a MISSING Status. |
| 84 MISSING = 6; |
| 85 } |
| 86 |
| 87 Status status = 1; |
| 88 string reason = 2; |
| 89 } |
| 90 |
15 message Quest { | 91 message Quest { |
16 message ID { | 92 message ID { |
17 string id = 1; | 93 string id = 1; |
18 } | 94 } |
19 ID id = 1; | 95 ID id = 1; |
20 | 96 |
21 // DNE is set to true if this Quest does not exist. None of the following | 97 // DNE is set to true if this Quest does not exist. None of the following |
22 // fields are valid if this is set to true. | 98 // fields are valid if this is set to true. |
23 bool DNE = 2; | 99 bool DNE = 2; |
24 | 100 |
25 message Desc { | 101 message Desc { |
| 102 // TODO(iannucci): have a 'simple_idempotent' quest mode which: |
| 103 // * isn't allowed/expected to call any API methods (ActivateExecution, |
| 104 // EnsureGraphData, or WalkGraph) |
| 105 // * only provides data back through the distributor-specific 'state' |
| 106 // field. |
| 107 // |
| 108 // Examples of use for this would be: |
| 109 // * simple test binaries that run/output to an ISOLATED_OUTDIR |
| 110 // * testing / ad-hoc bash scripts |
| 111 |
26 string distributor_config_name = 1; | 112 string distributor_config_name = 1; |
27 string json_payload = 2; | 113 string json_payload = 2; |
| 114 |
| 115 message Meta { |
| 116 // This names the user/service account for all Attempts on this quest. You |
| 117 // must have permission to use this account when creating the Quest and/or |
| 118 // Attempts. |
| 119 string as_account = 1; |
| 120 |
| 121 message Retry { |
| 122 // The number of times in a row to retry Executions which have an |
| 123 // ABNORMAL_FINISHED status of FAILED. |
| 124 uint32 failed = 1; |
| 125 |
| 126 // The number of times in a row to retry Executions which have an |
| 127 // ABNORMAL_FINISHED status of EXPIRED. |
| 128 uint32 expired = 2; |
| 129 |
| 130 // The number of times in a row to retry Executions which have an |
| 131 // ABNORMAL_FINISHED status of TIMED_OUT. |
| 132 uint32 timed_out = 3; |
| 133 |
| 134 // The number of times in a row to retry Executions which have an |
| 135 // ABNORMAL_FINISHED status of CRASHED. |
| 136 uint32 crashed = 4; |
| 137 } |
| 138 |
| 139 // This affects how DM will retry the job payload in various exceptional |
| 140 // circumstances. |
| 141 Retry retry = 2; |
| 142 } |
| 143 |
| 144 // This is metadata which doesn't affect the functionality of the payload, |
| 145 // but does affect how DM and/or the distributor run/schedule that payload. |
| 146 Meta meta = 3; |
28 } | 147 } |
29 | 148 |
30 message TemplateSpec { | 149 message TemplateSpec { |
31 string project = 1; | 150 string project = 1; |
32 string ref = 2; | 151 string ref = 2; |
33 string version = 3; | 152 string version = 3; |
34 string name = 4; | 153 string name = 4; |
35 } | 154 } |
36 | 155 |
37 message Data { | 156 message Data { |
(...skipping 16 matching lines...) Expand all Loading... |
54 string quest = 1; | 173 string quest = 1; |
55 uint32 id = 2; | 174 uint32 id = 2; |
56 } | 175 } |
57 ID id = 1; | 176 ID id = 1; |
58 | 177 |
59 // DNE is set to true if this Attempt does not exist. None of the following | 178 // DNE is set to true if this Attempt does not exist. None of the following |
60 // fields are valid if this is set to true. | 179 // fields are valid if this is set to true. |
61 bool DNE = 2; | 180 bool DNE = 2; |
62 | 181 |
63 enum State { | 182 enum State { |
64 NEEDS_EXECUTION = 0; | 183 // The Attempt is waiting to be Executed. |
| 184 SCHEDULING = 0; |
| 185 |
| 186 // The Attempt is currently waiting for its current Execution to finish. |
65 EXECUTING = 1; | 187 EXECUTING = 1; |
66 ADDING_DEPS = 2; | 188 |
67 BLOCKED = 3; | 189 // The Attempt is waiting for dependent Attempts to be resolved. |
68 AWAITING_EXECUTION_STATE = 4; | 190 WAITING = 2; |
69 FINISHED = 5; | 191 |
| 192 // The Attempt is in its final state. |
| 193 FINISHED = 3; |
| 194 |
| 195 // The Attempt is in an abnormal final state. |
| 196 ABNORMAL_FINISHED = 4; |
70 } | 197 } |
71 | 198 |
72 message Data { | 199 message Data { |
73 google.protobuf.Timestamp created = 1; | 200 google.protobuf.Timestamp created = 1; |
74 google.protobuf.Timestamp modified = 2; | 201 google.protobuf.Timestamp modified = 2; |
75 uint32 num_executions = 3; | 202 uint32 num_executions = 3; |
76 | 203 |
77 message NeedsExecution { | 204 // This attempt is ready to be Executed, but hasn't been sent to the |
78 google.protobuf.Timestamp pending = 1; | 205 // distributor yet. |
79 } | 206 message Scheduling {} |
80 | 207 |
| 208 // This attempt has a live Execution (with the specified ID). Check the |
| 209 // Execution state for more information. |
81 message Executing { | 210 message Executing { |
82 uint32 cur_execution_id = 1; | 211 uint32 cur_execution_id = 1; |
83 } | 212 } |
84 | 213 |
85 message AddingDeps { | 214 // This attempt's last Execution stopped by adding dependencies. |
86 uint32 num_adding = 1; | 215 message Waiting { |
87 uint32 num_waiting = 2; | |
88 } | |
89 | |
90 message Blocked { | |
91 uint32 num_waiting = 1; | 216 uint32 num_waiting = 1; |
92 } | 217 } |
93 | 218 |
| 219 // This attempt is complete. |
94 message Finished { | 220 message Finished { |
95 google.protobuf.Timestamp expiration = 1; | 221 google.protobuf.Timestamp expiration = 1; |
96 uint32 json_result_size = 2; | 222 uint32 json_result_size = 2; |
97 string json_result = 3; | 223 string json_result = 3; |
| 224 |
| 225 // This is the distributor-specific state of the final Execution. |
| 226 bytes persistent_state_result = 4; |
98 } | 227 } |
99 | 228 |
100 oneof attempt_type { | 229 oneof attempt_type { |
101 NeedsExecution needs_execution = 4; | 230 Scheduling scheduling = 5; |
102 Executing executing = 5; | 231 Executing executing = 6; |
103 AddingDeps adding_deps = 6; | 232 Waiting waiting = 7; |
104 Blocked blocked = 7; | |
105 Finished finished = 8; | 233 Finished finished = 8; |
| 234 AbnormalFinish abnormal_finish = 9; |
106 } | 235 } |
107 } | 236 } |
108 Data data = 3; | 237 Data data = 3; |
109 | 238 |
110 // key is the `id` field of the Execution.ID | 239 // key is the `id` field of the Execution.ID |
111 map<uint32, Execution> executions = 4; | 240 map<uint32, Execution> executions = 4; |
112 | 241 |
113 dm.AttemptList fwd_deps = 5; | 242 dm.AttemptList fwd_deps = 5; |
114 dm.AttemptList back_deps = 6; | 243 dm.AttemptList back_deps = 6; |
115 | 244 |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
163 } | 292 } |
164 | 293 |
165 message ID { | 294 message ID { |
166 string quest = 1; | 295 string quest = 1; |
167 uint32 attempt = 2; | 296 uint32 attempt = 2; |
168 uint32 id = 3; | 297 uint32 id = 3; |
169 } | 298 } |
170 ID id = 1; | 299 ID id = 1; |
171 | 300 |
172 enum State { | 301 enum State { |
173 // The execution has been accepted by the distributor, but is not running ye
t | 302 // The execution has been accepted by the distributor, but is not running |
174 SCHEDULED = 0; | 303 // yet. |
| 304 SCHEDULING = 0; |
175 | 305 |
176 // The execution is running | 306 // The execution is running (has activated with DM). |
177 RUNNING = 1; | 307 RUNNING = 1; |
178 | 308 |
179 // The execution was unable to be accepted by the distributor | 309 // The execution has been told to stop by DM, but we haven't heard from |
180 REJECTED = 2; | 310 // the distributor yet. |
| 311 STOPPING = 2; |
181 | 312 |
182 // The execution was accepted by the distributor, but couldn't run in time. | 313 // The execution is in its final state. |
183 TIMED_OUT = 3; | 314 FINISHED = 3; |
184 | 315 |
185 // The execution ran and completed | 316 // The execution is in an abnormal final state |
186 FINISHED = 4; | 317 ABNORMAL_FINISHED = 4; |
187 | |
188 // The execution ran, but the distributor claims it did not complete | |
189 FAILED = 5; | |
190 | |
191 // The distributor claims to not know anything about this execution | |
192 MISSING = 6; | |
193 | |
194 // Some entity (DM, Human, Distributor) requested that this execution not ru
n. | |
195 CANCELLED = 7; | |
196 } | 318 } |
197 | 319 |
198 message Data { | 320 message Data { |
199 State state = 1; | 321 google.protobuf.Timestamp created = 1; |
200 string state_reason = 2; | 322 google.protobuf.Timestamp modified = 2; |
201 | 323 |
202 google.protobuf.Timestamp created = 3; | 324 message DistributorInfo { |
| 325 string config_name = 1; |
| 326 string config_version = 2; |
| 327 string token = 3; |
| 328 string url = 4; |
| 329 } |
| 330 DistributorInfo distributor_info = 3; |
203 | 331 |
204 string distributor_token = 4; | 332 message Scheduling {} |
205 string distributor_info_url = 5; | 333 |
| 334 message Running {} |
| 335 |
| 336 message Stopping {} |
| 337 |
| 338 message Finished { |
| 339 string persistent_state = 1; |
| 340 } |
| 341 |
| 342 oneof execution_type { |
| 343 Scheduling scheduling = 4; |
| 344 Running running = 5; |
| 345 Stopping stopping = 6; |
| 346 Finished finished = 7; |
| 347 AbnormalFinish abnormal_finish = 8; |
| 348 } |
206 } | 349 } |
207 Data data = 2; | 350 Data data = 2; |
208 | 351 |
209 // Partial is true iff the request asked for Executions, but wasn't able to | 352 // Partial is true iff the request asked for Executions, but wasn't able to |
210 // completely fill them. | 353 // completely fill them. |
211 bool partial = 16; | 354 bool partial = 16; |
212 } | 355 } |
213 | 356 |
214 // GraphData defines all of the DM graph data that may be returned from DM. | 357 // GraphData defines all of the DM graph data that may be returned from DM. |
215 // | 358 // |
(...skipping 22 matching lines...) Expand all Loading... |
238 // * max response size limit | 381 // * max response size limit |
239 // * max time limit (e.g. WalkGraphReq.MaxTime) being hit | 382 // * max time limit (e.g. WalkGraphReq.MaxTime) being hit |
240 // * non-terminal errors encountered during the request (HadErrors will also | 383 // * non-terminal errors encountered during the request (HadErrors will also |
241 // be true in this case). | 384 // be true in this case). |
242 // | 385 // |
243 // Note that this is different than the Partial booleans: This refers | 386 // Note that this is different than the Partial booleans: This refers |
244 // specifically to situations when Queries do not run to completion. | 387 // specifically to situations when Queries do not run to completion. |
245 bool had_more = 3; | 388 bool had_more = 3; |
246 } | 389 } |
247 | 390 |
OLD | NEW |