| OLD | NEW |
| 1 # Copyright 2015 The Chromium Authors. All rights reserved. | 1 # Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 """This file contains buildbucket service client.""" | 5 """This file contains buildbucket service client.""" |
| 6 | 6 |
| 7 import datetime | 7 import datetime |
| 8 import json | 8 import json |
| 9 import os | 9 import os |
| 10 import urlparse | 10 import urlparse |
| 11 | 11 |
| 12 from master import auth | 12 from master import auth |
| 13 from master import deferred_resource | 13 from master import deferred_resource |
| 14 from master.buildbucket import common | 14 from master.buildbucket import common |
| 15 import apiclient | 15 import apiclient |
| 16 import httplib2 | 16 import httplib2 |
| 17 | 17 |
| 18 BUILDBUCKET_HOSTNAME_PRODUCTION = 'cr-buildbucket.appspot.com' | 18 BUILDBUCKET_HOSTNAME_PRODUCTION = 'cr-buildbucket.appspot.com' |
| 19 BUILDBUCKET_HOSTNAME_TESTING = 'cr-buildbucket-test.appspot.com' | 19 BUILDBUCKET_HOSTNAME_TESTING = 'cr-buildbucket-test.appspot.com' |
| 20 | 20 |
| 21 THIS_DIR = os.path.dirname(os.path.abspath(os.path.realpath(__file__))) | 21 THIS_DIR = os.path.dirname(os.path.abspath(os.path.realpath(__file__))) |
| 22 DISCOVERY_DOC_PATH = os.path.join(THIS_DIR, 'discovery_doc.json') | 22 DISCOVERY_DOC_PATH = os.path.join(THIS_DIR, 'discovery_doc.json') |
| 23 | 23 |
| 24 | 24 |
| 25 # A list of buckets for which we bypass Cloud Endpoints proxy. | |
| 26 BYPASS_ENDPOINTS_WHITELIST = { | |
| 27 'master.tryserver.infra', | |
| 28 } | |
| 29 | |
| 30 | |
| 31 def get_default_buildbucket_hostname(master): | 25 def get_default_buildbucket_hostname(master): |
| 32 return ( | 26 return ( |
| 33 BUILDBUCKET_HOSTNAME_PRODUCTION if master.is_production_host | 27 BUILDBUCKET_HOSTNAME_PRODUCTION if master.is_production_host |
| 34 else BUILDBUCKET_HOSTNAME_TESTING) | 28 else BUILDBUCKET_HOSTNAME_TESTING) |
| 35 | 29 |
| 36 | 30 |
| 37 def create_buildbucket_service(master, hostname=None, verbose=None): | 31 def create_buildbucket_service(master, hostname=None, verbose=None): |
| 38 """Asynchronously creates buildbucket API resource. | 32 """Asynchronously creates buildbucket API resource. |
| 39 | 33 |
| 40 Returns: | 34 Returns: |
| 41 A DeferredResource as Deferred. | 35 A DeferredResource as Deferred. |
| 42 """ | 36 """ |
| 43 hostname = hostname or get_default_buildbucket_hostname(master) | 37 hostname = hostname or get_default_buildbucket_hostname(master) |
| 44 | 38 |
| 45 cred_factory = deferred_resource.CredentialFactory( | 39 cred_factory = deferred_resource.CredentialFactory( |
| 46 lambda: auth.create_credentials_for_master(master), | 40 lambda: auth.create_credentials_for_master(master), |
| 47 ttl=datetime.timedelta(minutes=5), | 41 ttl=datetime.timedelta(minutes=5), |
| 48 ) | 42 ) |
| 49 | 43 |
| 50 with open(DISCOVERY_DOC_PATH) as f: | 44 with open(DISCOVERY_DOC_PATH) as f: |
| 51 discovery_doc = json.load(f) | 45 discovery_doc = json.load(f) |
| 52 | 46 |
| 53 # This block of code is adapted from | 47 # This block of code is adapted from |
| 54 # https://chromium.googlesource.com/chromium/tools/build/+/08b404f/third_party
/google_api_python_client/googleapiclient/discovery.py#146 | 48 # https://chromium.googlesource.com/chromium/tools/build/+/08b404f/third_party
/google_api_python_client/googleapiclient/discovery.py#146 |
| 55 # https://chromium.googlesource.com/chromium/tools/build/+/08b404f/third_party
/google_api_python_client/googleapiclient/discovery.py#218 | 49 # https://chromium.googlesource.com/chromium/tools/build/+/08b404f/third_party
/google_api_python_client/googleapiclient/discovery.py#218 |
| 56 baseUrl = 'https://%s/%sapi/buildbucket/v1/' % ( | |
| 57 hostname, | |
| 58 '' if master.buildbucket_bucket in BYPASS_ENDPOINTS_WHITELIST else '_ah/', | |
| 59 ) | |
| 60 resource = apiclient.discovery.Resource( | 50 resource = apiclient.discovery.Resource( |
| 61 http=httplib2.Http(), | 51 http=httplib2.Http(), |
| 62 baseUrl=baseUrl, | 52 # Note that this does not include _ah/ in URL path, which means |
| 53 # we bypass Cloud Endpoints proxy server. See also: |
| 54 # https://bugs.chromium.org/p/chromium/issues/detail?id=626650 |
| 55 # https://codereview.chromium.org/2117833003/ |
| 56 # https://codereview.chromium.org/2116783003/ |
| 57 baseUrl='https://%s/api/buildbucket/v1/' % hostname, |
| 63 model=apiclient.model.JsonModel(False), | 58 model=apiclient.model.JsonModel(False), |
| 64 requestBuilder=apiclient.http.HttpRequest, | 59 requestBuilder=apiclient.http.HttpRequest, |
| 65 developerKey=None, | 60 developerKey=None, |
| 66 resourceDesc=discovery_doc, | 61 resourceDesc=discovery_doc, |
| 67 rootDesc=discovery_doc, | 62 rootDesc=discovery_doc, |
| 68 schema=apiclient.schema.Schemas(discovery_doc)) | 63 schema=apiclient.schema.Schemas(discovery_doc)) |
| 69 | 64 |
| 70 return deferred_resource.DeferredResource( | 65 return deferred_resource.DeferredResource( |
| 71 resource, | 66 resource, |
| 72 credentials=cred_factory, | 67 credentials=cred_factory, |
| 73 max_concurrent_requests=10, | 68 max_concurrent_requests=10, |
| 74 verbose=verbose or False, | 69 verbose=verbose or False, |
| 75 log_prefix=common.LOG_PREFIX, | 70 log_prefix=common.LOG_PREFIX, |
| 76 timeout=60, | 71 timeout=60, |
| 77 ) | 72 ) |
| OLD | NEW |