Chromium Code Reviews| 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( |