Index: appengine/cr-buildbucket/api.py |
diff --git a/appengine/cr-buildbucket/api.py b/appengine/cr-buildbucket/api.py |
index d85b79b59388e617c16e92b724d292ae04938237..173d02d07e89bbaed3f9401f314fab0fecff80d2 100644 |
--- a/appengine/cr-buildbucket/api.py |
+++ b/appengine/cr-buildbucket/api.py |
@@ -43,6 +43,22 @@ class ErrorMessage(messages.Message): |
message = messages.StringField(2, required=True) |
+def exception_to_error_message(ex): |
+ assert isinstance(ex, errors.Error) |
+ return ErrorMessage( |
+ reason=ERROR_REASON_MAP[type(ex)], |
+ message=ex.message, |
+ ) |
+ |
+ |
+class PutRequestMessage(messages.Message): |
+ client_operation_id = messages.StringField(1) |
+ bucket = messages.StringField(2, required=True) |
+ tags = messages.StringField(3, repeated=True) |
+ parameters_json = messages.StringField(4) |
+ lease_expiration_ts = messages.IntegerField(5) |
+ |
+ |
class BuildMessage(messages.Message): |
"""Describes model.Build, see its docstring.""" |
id = messages.IntegerField(1, required=True) |
@@ -156,10 +172,7 @@ def buildbucket_api_method( |
return fn(*args, **kwargs) |
except errors.Error as ex: |
assert hasattr(response_message_class, 'error') |
- return response_message_class(error=ErrorMessage( |
- reason=ERROR_REASON_MAP[type(ex)], |
- message=ex.message, |
- )) |
+ return response_message_class(error=exception_to_error_message(ex)) |
return endpoints_decorator(decorated) |
return decorator |
@@ -218,28 +231,64 @@ class BuildBucketApi(remote.Service): |
################################### PUT #################################### |
- class PutRequestMessage(messages.Message): |
- bucket = messages.StringField(1, required=True) |
- tags = messages.StringField(2, repeated=True) |
- parameters_json = messages.StringField(3) |
- lease_expiration_ts = messages.IntegerField(4) |
- |
@buildbucket_api_method( |
PutRequestMessage, BuildResponseMessage, |
path='builds', http_method='PUT') |
def put(self, request): |
"""Creates a new build.""" |
- if not request.bucket: |
- raise errors.InvalidInputError('Bucket not specified') |
- |
build = self.service.add( |
bucket=request.bucket, |
tags=request.tags, |
parameters=parse_json(request.parameters_json, 'parameters_json'), |
lease_expiration_date=parse_datetime(request.lease_expiration_ts), |
+ client_operation_id=request.client_operation_id, |
) |
return build_to_response_message(build, include_lease_key=True) |
+ ################################ PUT_BATCH ################################# |
+ |
+ class PutBatchRequestMessage(messages.Message): |
+ builds = messages.MessageField(PutRequestMessage, 1, repeated=True) |
+ |
+ class PutBatchResponseMessage(messages.Message): |
+ class OneResult(messages.Message): |
+ client_operation_id = messages.StringField(1) |
+ build = messages.MessageField(BuildMessage, 2) |
+ error = messages.MessageField(ErrorMessage, 3) |
+ results = messages.MessageField(OneResult, 1, repeated=True) |
+ |
+ @buildbucket_api_method( |
+ PutBatchRequestMessage, PutBatchResponseMessage, |
+ path='builds/batch', http_method='PUT') |
+ def put_batch(self, request): |
+ """Creates builds.""" |
+ build_futures = [ |
+ self.service.add_async( |
+ bucket=put_req.bucket, |
+ tags=put_req.tags, |
+ parameters=parse_json(put_req.parameters_json, 'parameters_json'), |
+ lease_expiration_date=parse_datetime(put_req.lease_expiration_ts), |
+ client_operation_id=put_req.client_operation_id, |
+ ) |
+ for put_req in request.builds |
+ ] |
+ |
+ res = self.PutBatchResponseMessage() |
+ |
+ def to_msg(req, build_future): |
+ one_res = res.OneResult(client_operation_id=req.client_operation_id) |
+ try: |
+ build = build_future.get_result() |
+ one_res.build = build_to_message(build, include_lease_key=True) |
+ except errors.Error as ex: |
+ one_res.error = exception_to_error_message(ex) |
+ return one_res |
+ |
+ res.results = [ |
+ to_msg(req, build) |
+ for req, build in zip(request.builds, build_futures)] |
+ return res |
+ |
################################## SEARCH ################################# |
SEARCH_REQUEST_RESOURCE_CONTAINER = endpoints.ResourceContainer( |