Index: appengine/cr-buildbucket/api.py |
diff --git a/appengine/cr-buildbucket/api.py b/appengine/cr-buildbucket/api.py |
index d85b79b59388e617c16e92b724d292ae04938237..ad913997f2ea62c8c1f4366ce4874fc3886cde03 100644 |
--- a/appengine/cr-buildbucket/api.py |
+++ b/appengine/cr-buildbucket/api.py |
@@ -43,6 +43,21 @@ 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): |
+ bucket = messages.StringField(1, required=True) |
+ tags = messages.StringField(2, repeated=True) |
+ parameters_json = messages.StringField(3) |
+ lease_expiration_ts = messages.IntegerField(4) |
+ |
+ |
class BuildMessage(messages.Message): |
"""Describes model.Build, see its docstring.""" |
id = messages.IntegerField(1, required=True) |
@@ -156,10 +171,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,20 +230,11 @@ 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, |
@@ -240,6 +243,36 @@ class BuildBucketApi(remote.Service): |
) |
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): |
+ builds = messages.MessageField(BuildMessage, 1, repeated=True) |
+ error = messages.MessageField(ErrorMessage, 2) |
+ |
+ @buildbucket_api_method( |
+ PutBatchRequestMessage, PutBatchResponseMessage, |
+ path='builds/batch', http_method='PUT') |
+ def put_batch(self, request): |
Vadim Sh.
2015/04/14 18:56:40
btw, apiary APIs exposed by Google support batchin
nodir
2015/04/14 22:13:05
It cannot
|
+ """Creates up to 25 new builds transactionally.""" |
+ builds = self.service.add_batch([ |
+ { |
+ 'bucket': build_req.bucket, |
+ 'tags': build_req.tags, |
+ 'parameters': parse_json( |
+ build_req.parameters_json, 'parameters_json'), |
+ 'lease_expiration_date': parse_datetime( |
+ build_req.lease_expiration_ts), |
+ } |
+ for build_req in request.builds |
+ ]) |
+ return self.PutBatchResponseMessage( |
+ builds=[build_to_message(b, include_lease_key=True) for b in builds], |
+ ) |
+ |
+ |
################################## SEARCH ################################# |
SEARCH_REQUEST_RESOURCE_CONTAINER = endpoints.ResourceContainer( |