1syntax = "proto2";
2option go_package = "taskqueue";
3
4import "google.golang.org/appengine/internal/datastore/datastore_v3.proto";
5
6package appengine;
7
8message TaskQueueServiceError {
9  enum ErrorCode {
10    OK = 0;
11    UNKNOWN_QUEUE = 1;
12    TRANSIENT_ERROR = 2;
13    INTERNAL_ERROR = 3;
14    TASK_TOO_LARGE = 4;
15    INVALID_TASK_NAME = 5;
16    INVALID_QUEUE_NAME = 6;
17    INVALID_URL = 7;
18    INVALID_QUEUE_RATE = 8;
19    PERMISSION_DENIED = 9;
20    TASK_ALREADY_EXISTS = 10;
21    TOMBSTONED_TASK = 11;
22    INVALID_ETA = 12;
23    INVALID_REQUEST = 13;
24    UNKNOWN_TASK = 14;
25    TOMBSTONED_QUEUE = 15;
26    DUPLICATE_TASK_NAME = 16;
27    SKIPPED = 17;
28    TOO_MANY_TASKS = 18;
29    INVALID_PAYLOAD = 19;
30    INVALID_RETRY_PARAMETERS = 20;
31    INVALID_QUEUE_MODE = 21;
32    ACL_LOOKUP_ERROR = 22;
33    TRANSACTIONAL_REQUEST_TOO_LARGE = 23;
34    INCORRECT_CREATOR_NAME = 24;
35    TASK_LEASE_EXPIRED = 25;
36    QUEUE_PAUSED = 26;
37    INVALID_TAG = 27;
38
39    // Reserved range for the Datastore error codes.
40    // Original Datastore error code is shifted by DATASTORE_ERROR offset.
41    DATASTORE_ERROR = 10000;
42  }
43}
44
45message TaskPayload {
46  extensions 10 to max;
47  option message_set_wire_format = true;
48}
49
50message TaskQueueRetryParameters {
51  optional int32 retry_limit = 1;
52  optional int64 age_limit_sec = 2;
53
54  optional double min_backoff_sec = 3 [default = 0.1];
55  optional double max_backoff_sec = 4 [default = 3600];
56  optional int32 max_doublings = 5 [default = 16];
57}
58
59message TaskQueueAcl {
60  repeated bytes user_email = 1;
61  repeated bytes writer_email = 2;
62}
63
64message TaskQueueHttpHeader {
65  required bytes key = 1;
66  required bytes value = 2;
67}
68
69message TaskQueueMode {
70  enum Mode {
71    PUSH = 0;
72    PULL = 1;
73  }
74}
75
76message TaskQueueAddRequest {
77  required bytes queue_name = 1;
78  required bytes task_name = 2;
79  required int64 eta_usec = 3;
80
81  enum RequestMethod {
82    GET = 1;
83    POST = 2;
84    HEAD = 3;
85    PUT = 4;
86    DELETE = 5;
87  }
88  optional RequestMethod method = 5 [default=POST];
89
90  optional bytes url = 4;
91
92  repeated group Header = 6 {
93    required bytes key = 7;
94    required bytes value = 8;
95  }
96
97  optional bytes body = 9 [ctype=CORD];
98  optional Transaction transaction = 10;
99  optional bytes app_id = 11;
100
101  optional group CronTimetable = 12 {
102    required bytes schedule = 13;
103    required bytes timezone = 14;
104  }
105
106  optional bytes description = 15;
107  optional TaskPayload payload = 16;
108  optional TaskQueueRetryParameters retry_parameters = 17;
109  optional TaskQueueMode.Mode mode = 18 [default=PUSH];
110  optional bytes tag = 19;
111}
112
113message TaskQueueAddResponse {
114  optional bytes chosen_task_name = 1;
115}
116
117message TaskQueueBulkAddRequest {
118  repeated TaskQueueAddRequest add_request = 1;
119}
120
121message TaskQueueBulkAddResponse {
122  repeated group TaskResult = 1 {
123    required TaskQueueServiceError.ErrorCode result = 2;
124    optional bytes chosen_task_name = 3;
125  }
126}
127
128message TaskQueueDeleteRequest {
129  required bytes queue_name = 1;
130  repeated bytes task_name = 2;
131  optional bytes app_id = 3;
132}
133
134message TaskQueueDeleteResponse {
135  repeated TaskQueueServiceError.ErrorCode result = 3;
136}
137
138message TaskQueueForceRunRequest {
139  optional bytes app_id = 1;
140  required bytes queue_name = 2;
141  required bytes task_name = 3;
142}
143
144message TaskQueueForceRunResponse {
145  required TaskQueueServiceError.ErrorCode result = 3;
146}
147
148message TaskQueueUpdateQueueRequest {
149  optional bytes app_id = 1;
150  required bytes queue_name = 2;
151  required double bucket_refill_per_second = 3;
152  required int32 bucket_capacity = 4;
153  optional string user_specified_rate = 5;
154  optional TaskQueueRetryParameters retry_parameters = 6;
155  optional int32 max_concurrent_requests = 7;
156  optional TaskQueueMode.Mode mode = 8 [default = PUSH];
157  optional TaskQueueAcl acl = 9;
158  repeated TaskQueueHttpHeader header_override = 10;
159}
160
161message TaskQueueUpdateQueueResponse {
162}
163
164message TaskQueueFetchQueuesRequest {
165  optional bytes app_id = 1;
166  required int32 max_rows = 2;
167}
168
169message TaskQueueFetchQueuesResponse {
170  repeated group Queue = 1 {
171    required bytes queue_name = 2;
172    required double bucket_refill_per_second = 3;
173    required double bucket_capacity = 4;
174    optional string user_specified_rate = 5;
175    required bool paused = 6 [default=false];
176    optional TaskQueueRetryParameters retry_parameters = 7;
177    optional int32 max_concurrent_requests = 8;
178    optional TaskQueueMode.Mode mode = 9 [default = PUSH];
179    optional TaskQueueAcl acl = 10;
180    repeated TaskQueueHttpHeader header_override = 11;
181    optional string creator_name = 12 [ctype=CORD, default="apphosting"];
182  }
183}
184
185message TaskQueueFetchQueueStatsRequest {
186  optional bytes app_id = 1;
187  repeated bytes queue_name = 2;
188  optional int32 max_num_tasks = 3 [default = 0];
189}
190
191message TaskQueueScannerQueueInfo {
192  required int64 executed_last_minute = 1;
193  required int64 executed_last_hour = 2;
194  required double sampling_duration_seconds = 3;
195  optional int32 requests_in_flight = 4;
196  optional double enforced_rate = 5;
197}
198
199message TaskQueueFetchQueueStatsResponse {
200  repeated group QueueStats = 1 {
201    required int32 num_tasks = 2;
202    required int64 oldest_eta_usec = 3;
203    optional TaskQueueScannerQueueInfo scanner_info = 4;
204  }
205}
206message TaskQueuePauseQueueRequest {
207  required bytes app_id = 1;
208  required bytes queue_name = 2;
209  required bool pause = 3;
210}
211
212message TaskQueuePauseQueueResponse {
213}
214
215message TaskQueuePurgeQueueRequest {
216  optional bytes app_id = 1;
217  required bytes queue_name = 2;
218}
219
220message TaskQueuePurgeQueueResponse {
221}
222
223message TaskQueueDeleteQueueRequest {
224  required bytes app_id = 1;
225  required bytes queue_name = 2;
226}
227
228message TaskQueueDeleteQueueResponse {
229}
230
231message TaskQueueDeleteGroupRequest {
232  required bytes app_id = 1;
233}
234
235message TaskQueueDeleteGroupResponse {
236}
237
238message TaskQueueQueryTasksRequest {
239  optional bytes app_id = 1;
240  required bytes queue_name = 2;
241
242  optional bytes start_task_name = 3;
243  optional int64 start_eta_usec = 4;
244  optional bytes start_tag = 6;
245  optional int32 max_rows = 5 [default = 1];
246}
247
248message TaskQueueQueryTasksResponse {
249  repeated group Task = 1 {
250    required bytes task_name = 2;
251    required int64 eta_usec = 3;
252    optional bytes url = 4;
253
254    enum RequestMethod {
255      GET = 1;
256      POST = 2;
257      HEAD = 3;
258      PUT = 4;
259      DELETE = 5;
260    }
261    optional RequestMethod method = 5;
262
263    optional int32 retry_count = 6 [default=0];
264
265    repeated group Header = 7 {
266      required bytes key = 8;
267      required bytes value = 9;
268    }
269
270    optional int32 body_size = 10;
271    optional bytes body = 11 [ctype=CORD];
272    required int64 creation_time_usec = 12;
273
274    optional group CronTimetable = 13 {
275      required bytes schedule = 14;
276      required bytes timezone = 15;
277    }
278
279    optional group RunLog = 16 {
280      required int64 dispatched_usec = 17;
281      required int64 lag_usec = 18;
282      required int64 elapsed_usec = 19;
283      optional int64 response_code = 20;
284      optional string retry_reason = 27;
285    }
286
287    optional bytes description = 21;
288    optional TaskPayload payload = 22;
289    optional TaskQueueRetryParameters retry_parameters = 23;
290    optional int64 first_try_usec = 24;
291    optional bytes tag = 25;
292    optional int32 execution_count = 26 [default=0];
293  }
294}
295
296message TaskQueueFetchTaskRequest {
297  optional bytes app_id = 1;
298  required bytes queue_name = 2;
299  required bytes task_name = 3;
300}
301
302message TaskQueueFetchTaskResponse {
303  required TaskQueueQueryTasksResponse task = 1;
304}
305
306message TaskQueueUpdateStorageLimitRequest {
307  required bytes app_id = 1;
308  required int64 limit = 2;
309}
310
311message TaskQueueUpdateStorageLimitResponse {
312  required int64 new_limit = 1;
313}
314
315message TaskQueueQueryAndOwnTasksRequest {
316  required bytes queue_name = 1;
317  required double lease_seconds = 2;
318  required int64 max_tasks = 3;
319  optional bool group_by_tag = 4 [default=false];
320  optional bytes tag = 5;
321}
322
323message TaskQueueQueryAndOwnTasksResponse {
324  repeated group Task = 1 {
325    required bytes task_name = 2;
326    required int64 eta_usec = 3;
327    optional int32 retry_count = 4 [default=0];
328    optional bytes body = 5 [ctype=CORD];
329    optional bytes tag = 6;
330  }
331}
332
333message TaskQueueModifyTaskLeaseRequest {
334  required bytes queue_name = 1;
335  required bytes task_name = 2;
336  required int64 eta_usec = 3;
337  required double lease_seconds = 4;
338}
339
340message TaskQueueModifyTaskLeaseResponse {
341  required int64 updated_eta_usec = 1;
342}
343