Skip to content

Commit f69c2e6

Browse files
IvanBM18letitz
andauthored
[Swarming] Adds Response proto & discards tasks with missing dimensions (#5289)
## Overview It was request for me to add a log to easily debug when swarming scheduled a task, but i noticed we didnt had the protos for parsing the response, hence i added them. Also this PR handles an edge case in which swarming will not return a task_id if the tasks wasn't scheduled due to swarming related issues(not request, nor pc contract). #### Background This PR comes from a discussion & agreement to a required change from this [PR](#5277) ## Changes - Adds the missing swarming_task_response proto - Ran `protos/generate.sh` which updated a ton of files - The swarming service now marks tasks as not scheduled when no task_id is found, task_id cannot be found if swarming didn't queue the task, because of wrong dimensions or other swarming internal reasons - As the `count_tasks()` api method, now the `push_task()` will also only raise `SwarmingAPIErrors` --------- Co-authored-by: Titouan Rigoudy <titouan@chromium.org>
1 parent 3095c81 commit f69c2e6

7 files changed

Lines changed: 270 additions & 59 deletions

File tree

src/clusterfuzz/_internal/protos/swarming.proto

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,38 @@ message NewTaskRequest {
406406
string realm = 18;
407407
}
408408

409+
// Description of a task request as registered by the server.
410+
// This message is used when retrieving information about an existing task.
411+
// See NewTaskRequest for more details.
412+
message TaskRequestResponse {
413+
string task_id = 1;
414+
int32 expiration_secs = 2;
415+
string name = 3;
416+
string parent_task_id = 4;
417+
int32 priority = 5;
418+
// For some amount of time, the properties will be copied into the
419+
// task_slices and vice-versa, to give time to the clients to update.
420+
// Eventually, only task_slices will be supported.
421+
TaskProperties properties = 6;
422+
repeated string tags = 7;
423+
google.protobuf.Timestamp created_ts = 8;
424+
string user = 9;
425+
// User name of whoever posted this task, extracted from the credentials.
426+
string authenticated = 10;
427+
repeated TaskSlice task_slices = 11;
428+
// Indicates what OAuth2 credentials the task uses when calling other services.
429+
string service_account = 12;
430+
string realm = 13;
431+
432+
// Configuration of Swarming:ResultDB integration.
433+
ResultDBCfg resultdb = 14;
434+
435+
string pubsub_topic = 15;
436+
string pubsub_userdata = 16;
437+
int32 bot_ping_tolerance_secs = 17;
438+
string rbe_instance = 18;
439+
}
440+
409441
message TasksCountRequest {
410442
google.protobuf.Timestamp start = 1;
411443
google.protobuf.Timestamp end = 2;

src/clusterfuzz/_internal/protos/swarming_pb2.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,15 @@
2929
from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2
3030

3131

32-
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n+clusterfuzz/_internal/protos/swarming.proto\x12\x0bswarming.v2\x1a\x1fgoogle/protobuf/timestamp.proto\"(\n\nStringPair\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\",\n\x0eStringListPair\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x03(\t\"*\n\x06\x44igest\x12\x0c\n\x04hash\x18\x01 \x01(\t\x12\x12\n\nsize_bytes\x18\x02 \x01(\x03\"I\n\x0c\x43\x41SReference\x12\x14\n\x0c\x63\x61s_instance\x18\x01 \x01(\t\x12#\n\x06\x64igest\x18\x02 \x01(\x0b\x32\x13.swarming.v2.Digest\"B\n\x0b\x43ipdPackage\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\t\x12\x0c\n\x04path\x18\x03 \x01(\t\"y\n\tCipdInput\x12\x0e\n\x06server\x18\x01 \x01(\t\x12\x30\n\x0e\x63lient_package\x18\x02 \x01(\x0b\x32\x18.swarming.v2.CipdPackage\x12*\n\x08packages\x18\x03 \x03(\x0b\x32\x18.swarming.v2.CipdPackage\"(\n\nCacheEntry\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\"\xf2\x01\n\x0b\x43ontainment\x12\x16\n\x0elower_priority\x18\x01 \x01(\x08\x12\x42\n\x10\x63ontainment_type\x18\x02 \x01(\x0e\x32(.swarming.v2.Containment.ContainmentType\x12\x17\n\x0flimit_processes\x18\x03 \x01(\x03\x12$\n\x1climit_total_committed_memory\x18\x04 \x01(\x03\"H\n\x0f\x43ontainmentType\x12\x11\n\rNOT_SPECIFIED\x10\x00\x12\x08\n\x04NONE\x10\x01\x12\x08\n\x04\x41UTO\x10\x02\x12\x0e\n\nJOB_OBJECT\x10\x03\"\x83\x04\n\x0eTaskProperties\x12\'\n\x06\x63\x61\x63hes\x18\x01 \x03(\x0b\x32\x17.swarming.v2.CacheEntry\x12*\n\ncipd_input\x18\x02 \x01(\x0b\x32\x16.swarming.v2.CipdInput\x12\x0f\n\x07\x63ommand\x18\x03 \x03(\t\x12\x14\n\x0crelative_cwd\x18\x04 \x01(\t\x12+\n\ndimensions\x18\x05 \x03(\x0b\x32\x17.swarming.v2.StringPair\x12$\n\x03\x65nv\x18\x06 \x03(\x0b\x32\x17.swarming.v2.StringPair\x12\x31\n\x0c\x65nv_prefixes\x18\x07 \x03(\x0b\x32\x1b.swarming.v2.StringListPair\x12\x1e\n\x16\x65xecution_timeout_secs\x18\x08 \x01(\x05\x12\x19\n\x11grace_period_secs\x18\t \x01(\x05\x12\x12\n\nidempotent\x18\n \x01(\x08\x12\x31\n\x0e\x63\x61s_input_root\x18\x0b \x01(\x0b\x32\x19.swarming.v2.CASReference\x12\x17\n\x0fio_timeout_secs\x18\x0c \x01(\x05\x12\x0f\n\x07outputs\x18\r \x03(\t\x12\x14\n\x0csecret_bytes\x18\x0e \x01(\x0c\x12-\n\x0b\x63ontainment\x18\x0f \x01(\x0b\x32\x18.swarming.v2.Containment\"p\n\tTaskSlice\x12/\n\nproperties\x18\x01 \x01(\x0b\x32\x1b.swarming.v2.TaskProperties\x12\x17\n\x0f\x65xpiration_secs\x18\x02 \x01(\x05\x12\x19\n\x11wait_for_capacity\x18\x03 \x01(\x08\"\x1d\n\x0bResultDBCfg\x12\x0e\n\x06\x65nable\x18\x01 \x01(\x08\"\xe8\x04\n\x0eNewTaskRequest\x12\x17\n\x0f\x65xpiration_secs\x18\x01 \x01(\x05\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x16\n\x0eparent_task_id\x18\x03 \x01(\t\x12\x10\n\x08priority\x18\x04 \x01(\x05\x12/\n\nproperties\x18\x05 \x01(\x0b\x32\x1b.swarming.v2.TaskProperties\x12+\n\x0btask_slices\x18\x06 \x03(\x0b\x32\x16.swarming.v2.TaskSlice\x12\x0c\n\x04tags\x18\x07 \x03(\t\x12\x0c\n\x04user\x18\x08 \x01(\t\x12\x17\n\x0fservice_account\x18\t \x01(\t\x12\x14\n\x0cpubsub_topic\x18\n \x01(\t\x12\x19\n\x11pubsub_auth_token\x18\x0b \x01(\t\x12\x17\n\x0fpubsub_userdata\x18\x0c \x01(\t\x12\x15\n\revaluate_only\x18\r \x01(\x08\x12M\n\x12pool_task_template\x18\x0e \x01(\x0e\x32\x31.swarming.v2.NewTaskRequest.PoolTaskTemplateField\x12\x1f\n\x17\x62ot_ping_tolerance_secs\x18\x0f \x01(\x05\x12\x14\n\x0crequest_uuid\x18\x10 \x01(\t\x12*\n\x08resultdb\x18\x11 \x01(\x0b\x32\x18.swarming.v2.ResultDBCfg\x12\r\n\x05realm\x18\x12 \x01(\t\"P\n\x15PoolTaskTemplateField\x12\x08\n\x04\x41UTO\x10\x00\x12\x11\n\rCANARY_PREFER\x10\x01\x12\x10\n\x0c\x43\x41NARY_NEVER\x10\x02\x12\x08\n\x04SKIP\x10\x03\"\x9d\x01\n\x11TasksCountRequest\x12)\n\x05start\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\'\n\x03\x65nd\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12&\n\x05state\x18\x03 \x01(\x0e\x32\x17.swarming.v2.StateQuery\x12\x0c\n\x04tags\x18\x04 \x03(\t\"D\n\nTasksCount\x12\r\n\x05\x63ount\x18\x01 \x01(\x05\x12\'\n\x03now\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp*\xcf\x02\n\nStateQuery\x12\x11\n\rQUERY_PENDING\x10\x00\x12\x11\n\rQUERY_RUNNING\x10\x01\x12\x19\n\x15QUERY_PENDING_RUNNING\x10\x02\x12\x13\n\x0fQUERY_COMPLETED\x10\x03\x12\x1b\n\x17QUERY_COMPLETED_SUCCESS\x10\x04\x12\x1b\n\x17QUERY_COMPLETED_FAILURE\x10\x05\x12\x11\n\rQUERY_EXPIRED\x10\x06\x12\x13\n\x0fQUERY_TIMED_OUT\x10\x07\x12\x12\n\x0eQUERY_BOT_DIED\x10\x08\x12\x12\n\x0eQUERY_CANCELED\x10\t\x12\r\n\tQUERY_ALL\x10\n\x12\x11\n\rQUERY_DEDUPED\x10\x0b\x12\x10\n\x0cQUERY_KILLED\x10\x0c\x12\x15\n\x11QUERY_NO_RESOURCE\x10\r\x12\x16\n\x12QUERY_CLIENT_ERROR\x10\x0e\x62\x06proto3')
32+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n+clusterfuzz/_internal/protos/swarming.proto\x12\x0bswarming.v2\x1a\x1fgoogle/protobuf/timestamp.proto\"(\n\nStringPair\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\",\n\x0eStringListPair\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x03(\t\"*\n\x06\x44igest\x12\x0c\n\x04hash\x18\x01 \x01(\t\x12\x12\n\nsize_bytes\x18\x02 \x01(\x03\"I\n\x0c\x43\x41SReference\x12\x14\n\x0c\x63\x61s_instance\x18\x01 \x01(\t\x12#\n\x06\x64igest\x18\x02 \x01(\x0b\x32\x13.swarming.v2.Digest\"B\n\x0b\x43ipdPackage\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\t\x12\x0c\n\x04path\x18\x03 \x01(\t\"y\n\tCipdInput\x12\x0e\n\x06server\x18\x01 \x01(\t\x12\x30\n\x0e\x63lient_package\x18\x02 \x01(\x0b\x32\x18.swarming.v2.CipdPackage\x12*\n\x08packages\x18\x03 \x03(\x0b\x32\x18.swarming.v2.CipdPackage\"(\n\nCacheEntry\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\"\xf2\x01\n\x0b\x43ontainment\x12\x16\n\x0elower_priority\x18\x01 \x01(\x08\x12\x42\n\x10\x63ontainment_type\x18\x02 \x01(\x0e\x32(.swarming.v2.Containment.ContainmentType\x12\x17\n\x0flimit_processes\x18\x03 \x01(\x03\x12$\n\x1climit_total_committed_memory\x18\x04 \x01(\x03\"H\n\x0f\x43ontainmentType\x12\x11\n\rNOT_SPECIFIED\x10\x00\x12\x08\n\x04NONE\x10\x01\x12\x08\n\x04\x41UTO\x10\x02\x12\x0e\n\nJOB_OBJECT\x10\x03\"\x83\x04\n\x0eTaskProperties\x12\'\n\x06\x63\x61\x63hes\x18\x01 \x03(\x0b\x32\x17.swarming.v2.CacheEntry\x12*\n\ncipd_input\x18\x02 \x01(\x0b\x32\x16.swarming.v2.CipdInput\x12\x0f\n\x07\x63ommand\x18\x03 \x03(\t\x12\x14\n\x0crelative_cwd\x18\x04 \x01(\t\x12+\n\ndimensions\x18\x05 \x03(\x0b\x32\x17.swarming.v2.StringPair\x12$\n\x03\x65nv\x18\x06 \x03(\x0b\x32\x17.swarming.v2.StringPair\x12\x31\n\x0c\x65nv_prefixes\x18\x07 \x03(\x0b\x32\x1b.swarming.v2.StringListPair\x12\x1e\n\x16\x65xecution_timeout_secs\x18\x08 \x01(\x05\x12\x19\n\x11grace_period_secs\x18\t \x01(\x05\x12\x12\n\nidempotent\x18\n \x01(\x08\x12\x31\n\x0e\x63\x61s_input_root\x18\x0b \x01(\x0b\x32\x19.swarming.v2.CASReference\x12\x17\n\x0fio_timeout_secs\x18\x0c \x01(\x05\x12\x0f\n\x07outputs\x18\r \x03(\t\x12\x14\n\x0csecret_bytes\x18\x0e \x01(\x0c\x12-\n\x0b\x63ontainment\x18\x0f \x01(\x0b\x32\x18.swarming.v2.Containment\"p\n\tTaskSlice\x12/\n\nproperties\x18\x01 \x01(\x0b\x32\x1b.swarming.v2.TaskProperties\x12\x17\n\x0f\x65xpiration_secs\x18\x02 \x01(\x05\x12\x19\n\x11wait_for_capacity\x18\x03 \x01(\x08\"\x1d\n\x0bResultDBCfg\x12\x0e\n\x06\x65nable\x18\x01 \x01(\x08\"\xe8\x04\n\x0eNewTaskRequest\x12\x17\n\x0f\x65xpiration_secs\x18\x01 \x01(\x05\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x16\n\x0eparent_task_id\x18\x03 \x01(\t\x12\x10\n\x08priority\x18\x04 \x01(\x05\x12/\n\nproperties\x18\x05 \x01(\x0b\x32\x1b.swarming.v2.TaskProperties\x12+\n\x0btask_slices\x18\x06 \x03(\x0b\x32\x16.swarming.v2.TaskSlice\x12\x0c\n\x04tags\x18\x07 \x03(\t\x12\x0c\n\x04user\x18\x08 \x01(\t\x12\x17\n\x0fservice_account\x18\t \x01(\t\x12\x14\n\x0cpubsub_topic\x18\n \x01(\t\x12\x19\n\x11pubsub_auth_token\x18\x0b \x01(\t\x12\x17\n\x0fpubsub_userdata\x18\x0c \x01(\t\x12\x15\n\revaluate_only\x18\r \x01(\x08\x12M\n\x12pool_task_template\x18\x0e \x01(\x0e\x32\x31.swarming.v2.NewTaskRequest.PoolTaskTemplateField\x12\x1f\n\x17\x62ot_ping_tolerance_secs\x18\x0f \x01(\x05\x12\x14\n\x0crequest_uuid\x18\x10 \x01(\t\x12*\n\x08resultdb\x18\x11 \x01(\x0b\x32\x18.swarming.v2.ResultDBCfg\x12\r\n\x05realm\x18\x12 \x01(\t\"P\n\x15PoolTaskTemplateField\x12\x08\n\x04\x41UTO\x10\x00\x12\x11\n\rCANARY_PREFER\x10\x01\x12\x10\n\x0c\x43\x41NARY_NEVER\x10\x02\x12\x08\n\x04SKIP\x10\x03\"\xf2\x03\n\x13TaskRequestResponse\x12\x0f\n\x07task_id\x18\x01 \x01(\t\x12\x17\n\x0f\x65xpiration_secs\x18\x02 \x01(\x05\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x16\n\x0eparent_task_id\x18\x04 \x01(\t\x12\x10\n\x08priority\x18\x05 \x01(\x05\x12/\n\nproperties\x18\x06 \x01(\x0b\x32\x1b.swarming.v2.TaskProperties\x12\x0c\n\x04tags\x18\x07 \x03(\t\x12.\n\ncreated_ts\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0c\n\x04user\x18\t \x01(\t\x12\x15\n\rauthenticated\x18\n \x01(\t\x12+\n\x0btask_slices\x18\x0b \x03(\x0b\x32\x16.swarming.v2.TaskSlice\x12\x17\n\x0fservice_account\x18\x0c \x01(\t\x12\r\n\x05realm\x18\r \x01(\t\x12*\n\x08resultdb\x18\x0e \x01(\x0b\x32\x18.swarming.v2.ResultDBCfg\x12\x14\n\x0cpubsub_topic\x18\x0f \x01(\t\x12\x17\n\x0fpubsub_userdata\x18\x10 \x01(\t\x12\x1f\n\x17\x62ot_ping_tolerance_secs\x18\x11 \x01(\x05\x12\x14\n\x0crbe_instance\x18\x12 \x01(\t\"\x9d\x01\n\x11TasksCountRequest\x12)\n\x05start\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\'\n\x03\x65nd\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12&\n\x05state\x18\x03 \x01(\x0e\x32\x17.swarming.v2.StateQuery\x12\x0c\n\x04tags\x18\x04 \x03(\t\"D\n\nTasksCount\x12\r\n\x05\x63ount\x18\x01 \x01(\x05\x12\'\n\x03now\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp*\xcf\x02\n\nStateQuery\x12\x11\n\rQUERY_PENDING\x10\x00\x12\x11\n\rQUERY_RUNNING\x10\x01\x12\x19\n\x15QUERY_PENDING_RUNNING\x10\x02\x12\x13\n\x0fQUERY_COMPLETED\x10\x03\x12\x1b\n\x17QUERY_COMPLETED_SUCCESS\x10\x04\x12\x1b\n\x17QUERY_COMPLETED_FAILURE\x10\x05\x12\x11\n\rQUERY_EXPIRED\x10\x06\x12\x13\n\x0fQUERY_TIMED_OUT\x10\x07\x12\x12\n\x0eQUERY_BOT_DIED\x10\x08\x12\x12\n\x0eQUERY_CANCELED\x10\t\x12\r\n\tQUERY_ALL\x10\n\x12\x11\n\rQUERY_DEDUPED\x10\x0b\x12\x10\n\x0cQUERY_KILLED\x10\x0c\x12\x15\n\x11QUERY_NO_RESOURCE\x10\r\x12\x16\n\x12QUERY_CLIENT_ERROR\x10\x0e\x62\x06proto3')
3333

3434
_globals = globals()
3535
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
3636
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'clusterfuzz._internal.protos.swarming_pb2', _globals)
3737
if _descriptor._USE_C_DESCRIPTORS == False:
3838
DESCRIPTOR._options = None
39-
_globals['_STATEQUERY']._serialized_start=2291
40-
_globals['_STATEQUERY']._serialized_end=2626
39+
_globals['_STATEQUERY']._serialized_start=2792
40+
_globals['_STATEQUERY']._serialized_end=3127
4141
_globals['_STRINGPAIR']._serialized_start=93
4242
_globals['_STRINGPAIR']._serialized_end=133
4343
_globals['_STRINGLISTPAIR']._serialized_start=135
@@ -66,8 +66,10 @@
6666
_globals['_NEWTASKREQUEST']._serialized_end=2058
6767
_globals['_NEWTASKREQUEST_POOLTASKTEMPLATEFIELD']._serialized_start=1978
6868
_globals['_NEWTASKREQUEST_POOLTASKTEMPLATEFIELD']._serialized_end=2058
69-
_globals['_TASKSCOUNTREQUEST']._serialized_start=2061
70-
_globals['_TASKSCOUNTREQUEST']._serialized_end=2218
71-
_globals['_TASKSCOUNT']._serialized_start=2220
72-
_globals['_TASKSCOUNT']._serialized_end=2288
69+
_globals['_TASKREQUESTRESPONSE']._serialized_start=2061
70+
_globals['_TASKREQUESTRESPONSE']._serialized_end=2559
71+
_globals['_TASKSCOUNTREQUEST']._serialized_start=2562
72+
_globals['_TASKSCOUNTREQUEST']._serialized_end=2719
73+
_globals['_TASKSCOUNT']._serialized_start=2721
74+
_globals['_TASKSCOUNT']._serialized_end=2789
7375
# @@protoc_insertion_point(module_scope)

src/clusterfuzz/_internal/protos/swarming_pb2.pyi

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -797,6 +797,90 @@ class NewTaskRequest(google.protobuf.message.Message):
797797

798798
global___NewTaskRequest = NewTaskRequest
799799

800+
@typing_extensions.final
801+
class TaskRequestResponse(google.protobuf.message.Message):
802+
"""Description of a task request as registered by the server.
803+
This message is used when retrieving information about an existing task.
804+
See NewTaskRequest for more details.
805+
"""
806+
807+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
808+
809+
TASK_ID_FIELD_NUMBER: builtins.int
810+
EXPIRATION_SECS_FIELD_NUMBER: builtins.int
811+
NAME_FIELD_NUMBER: builtins.int
812+
PARENT_TASK_ID_FIELD_NUMBER: builtins.int
813+
PRIORITY_FIELD_NUMBER: builtins.int
814+
PROPERTIES_FIELD_NUMBER: builtins.int
815+
TAGS_FIELD_NUMBER: builtins.int
816+
CREATED_TS_FIELD_NUMBER: builtins.int
817+
USER_FIELD_NUMBER: builtins.int
818+
AUTHENTICATED_FIELD_NUMBER: builtins.int
819+
TASK_SLICES_FIELD_NUMBER: builtins.int
820+
SERVICE_ACCOUNT_FIELD_NUMBER: builtins.int
821+
REALM_FIELD_NUMBER: builtins.int
822+
RESULTDB_FIELD_NUMBER: builtins.int
823+
PUBSUB_TOPIC_FIELD_NUMBER: builtins.int
824+
PUBSUB_USERDATA_FIELD_NUMBER: builtins.int
825+
BOT_PING_TOLERANCE_SECS_FIELD_NUMBER: builtins.int
826+
RBE_INSTANCE_FIELD_NUMBER: builtins.int
827+
task_id: builtins.str
828+
expiration_secs: builtins.int
829+
name: builtins.str
830+
parent_task_id: builtins.str
831+
priority: builtins.int
832+
@property
833+
def properties(self) -> global___TaskProperties:
834+
"""For some amount of time, the properties will be copied into the
835+
task_slices and vice-versa, to give time to the clients to update.
836+
Eventually, only task_slices will be supported.
837+
"""
838+
@property
839+
def tags(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: ...
840+
@property
841+
def created_ts(self) -> google.protobuf.timestamp_pb2.Timestamp: ...
842+
user: builtins.str
843+
authenticated: builtins.str
844+
"""User name of whoever posted this task, extracted from the credentials."""
845+
@property
846+
def task_slices(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___TaskSlice]: ...
847+
service_account: builtins.str
848+
"""Indicates what OAuth2 credentials the task uses when calling other services."""
849+
realm: builtins.str
850+
@property
851+
def resultdb(self) -> global___ResultDBCfg:
852+
"""Configuration of Swarming:ResultDB integration."""
853+
pubsub_topic: builtins.str
854+
pubsub_userdata: builtins.str
855+
bot_ping_tolerance_secs: builtins.int
856+
rbe_instance: builtins.str
857+
def __init__(
858+
self,
859+
*,
860+
task_id: builtins.str = ...,
861+
expiration_secs: builtins.int = ...,
862+
name: builtins.str = ...,
863+
parent_task_id: builtins.str = ...,
864+
priority: builtins.int = ...,
865+
properties: global___TaskProperties | None = ...,
866+
tags: collections.abc.Iterable[builtins.str] | None = ...,
867+
created_ts: google.protobuf.timestamp_pb2.Timestamp | None = ...,
868+
user: builtins.str = ...,
869+
authenticated: builtins.str = ...,
870+
task_slices: collections.abc.Iterable[global___TaskSlice] | None = ...,
871+
service_account: builtins.str = ...,
872+
realm: builtins.str = ...,
873+
resultdb: global___ResultDBCfg | None = ...,
874+
pubsub_topic: builtins.str = ...,
875+
pubsub_userdata: builtins.str = ...,
876+
bot_ping_tolerance_secs: builtins.int = ...,
877+
rbe_instance: builtins.str = ...,
878+
) -> None: ...
879+
def HasField(self, field_name: typing_extensions.Literal["created_ts", b"created_ts", "properties", b"properties", "resultdb", b"resultdb"]) -> builtins.bool: ...
880+
def ClearField(self, field_name: typing_extensions.Literal["authenticated", b"authenticated", "bot_ping_tolerance_secs", b"bot_ping_tolerance_secs", "created_ts", b"created_ts", "expiration_secs", b"expiration_secs", "name", b"name", "parent_task_id", b"parent_task_id", "priority", b"priority", "properties", b"properties", "pubsub_topic", b"pubsub_topic", "pubsub_userdata", b"pubsub_userdata", "rbe_instance", b"rbe_instance", "realm", b"realm", "resultdb", b"resultdb", "service_account", b"service_account", "tags", b"tags", "task_id", b"task_id", "task_slices", b"task_slices", "user", b"user"]) -> None: ...
881+
882+
global___TaskRequestResponse = TaskRequestResponse
883+
800884
@typing_extensions.final
801885
class TasksCountRequest(google.protobuf.message.Message):
802886
DESCRIPTOR: google.protobuf.descriptor.Descriptor

src/clusterfuzz/_internal/swarming/api.py

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -134,24 +134,40 @@ def _make_request(self, endpoint: str, body: str) -> str | None:
134134

135135
return response
136136

137-
def push_task(self, task_request: swarming_pb2.NewTaskRequest) -> str | None: # pylint: disable=no-member
137+
def push_task(
138+
self,
139+
task_request: swarming_pb2.NewTaskRequest # pylint: disable=no-member
140+
) -> swarming_pb2.TaskRequestResponse: # pylint: disable=no-member
138141
"""Schedules a task on swarming.
139142
140143
Args:
141144
task_request: The NewTaskRequest proto message.
142145
143146
Returns:
144-
The raw JSON response string from the server, or None if the response is
145-
empty.
147+
The TaskRequestResponse parsed proto message from the server.
146148
147149
Raises:
148-
requests.exceptions.HTTPError: If the request fails with a 4xx or 5xx
149-
status code.
150+
SwarmingApiError: If the pRPC request fails or response parsing fails.
150151
"""
151152
message_body = json_format.MessageToJson(task_request)
152153

153-
response = self._make_request(_NEW_TASK_ENDPOINT, message_body)
154-
return response
154+
try:
155+
raw_response = self._make_request(_NEW_TASK_ENDPOINT, message_body)
156+
except HTTPError as e:
157+
raise SwarmingApiError(f'HTTP error calling push_task: {e}') from e
158+
159+
if not raw_response:
160+
raise SwarmingApiError(
161+
'RPC Contract failure, got an empty response from Swarming API.')
162+
163+
try:
164+
return json_format.Parse(
165+
raw_response,
166+
swarming_pb2.TaskRequestResponse() # pylint: disable=no-member
167+
)
168+
except (json_format.ParseError, AttributeError) as e:
169+
raise SwarmingApiError(
170+
f'RPC Contract failure, failed to parse response: {e}') from e
155171

156172
def count_tasks(
157173
self,

0 commit comments

Comments
 (0)