Chromium Code Reviews| Index: appengine/cr-buildbucket/swarming/swarmbucket_api.py |
| diff --git a/appengine/cr-buildbucket/swarming/swarmbucket_api.py b/appengine/cr-buildbucket/swarming/swarmbucket_api.py |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..55e3849d49788351620e679868fc196d123a63c7 |
| --- /dev/null |
| +++ b/appengine/cr-buildbucket/swarming/swarmbucket_api.py |
| @@ -0,0 +1,87 @@ |
| +# Copyright 2016 The Chromium Authors. All rights reserved. |
| +# Use of this source code is governed by a BSD-style license that can be |
| +# found in the LICENSE file. |
| + |
| +from google.appengine.ext import ndb |
| +from protorpc import messages |
| +from protorpc import message_types |
| +from protorpc import remote |
| + |
| +from components import auth |
| +from components import utils |
| +import gae_ts_mon |
| + |
| +import acl |
| +import config |
| + |
| + |
| +def swarmbucket_api_method( |
| + request_message_class, response_message_class, **kwargs): |
| + """Defines a swarmbucket API method.""" |
| + |
| + endpoints_decorator = auth.endpoints_method( |
| + request_message_class, response_message_class, **kwargs) |
| + |
| + def decorator(fn): |
| + fn = auth.public(fn) |
| + fn = endpoints_decorator(fn) |
| + fn = ndb.toplevel(fn) |
| + def ts_mon_time(): |
| + return utils.datetime_to_timestamp(utils.utcnow()) / 1000000.0 |
| + fn = gae_ts_mon.instrument_endpoint(time_fn=ts_mon_time)(fn) |
| + return fn |
| + |
| + return decorator |
| + |
| + |
| +class BuilderMessage(messages.Message): |
| + name = messages.StringField(1) |
| + category = messages.StringField(2) |
| + |
| + |
| +class BucketMessage(messages.Message): |
| + # Bucket name. Unique per buildbucket instance. |
| + name = messages.StringField(1) |
| + builders = messages.MessageField(BuilderMessage, 2, repeated=True) |
| + |
| + |
| +class GetBuildersResponseMessage(messages.Message): |
| + buckets = messages.MessageField(BucketMessage, 1, repeated=True) |
| + |
| + |
| +@auth.endpoints_api( |
| + name='swarmbucket', version='v1', |
| + title='Buildbucket-Swarming integration') |
| +class SwarmbucketApi(remote.Service): |
| + """API specific to swarmbucket.""" |
| + |
| + @swarmbucket_api_method( |
| + message_types.VoidMessage, |
| + GetBuildersResponseMessage, |
| + path='builders', http_method='GET') |
| + def get_builders(self, _request): |
|
Vadim Sh.
2016/05/24 19:22:59
no arguments? How would we support different proje
nodir
2016/05/24 19:36:54
I added "bucket" parameter initially, and then del
|
| + """Returns defined swarmbucket builders. |
| + |
| + Can be used by code review tool to discover builders. |
| + """ |
| + buckets = config.get_buckets_async().get_result() |
| + available = acl.get_available_buckets() |
| + if available is not None: |
| + available = set(available) |
| + buckets = [b for b in buckets if b.name in available] |
| + |
| + res = GetBuildersResponseMessage() |
| + for bucket in buckets: |
| + if not bucket.swarming or not bucket.swarming.builders: |
| + continue |
| + res.buckets.append(BucketMessage( |
| + name=bucket.name, |
| + builders=[ |
| + BuilderMessage( |
| + name=builder.name, |
| + category=builder.category, |
| + ) |
| + for builder in bucket.swarming.builders |
| + ], |
| + )) |
| + return res |