buildbot_globals.py revision 95ead5b0e800e64ba6b6cf6642d8e77bc711c803
1#!/usr/bin/python 2 3# Copyright (c) 2013 The Chromium Authors. All rights reserved. 4# Use of this source code is governed by a BSD-style license that can be 5# found in the LICENSE file. 6 7""" 8Provides read access to buildbot's global_variables.json . 9""" 10 11 12from contextlib import closing 13 14import HTMLParser 15import json 16import re 17import svn 18import sys 19import urllib2 20 21 22_global_vars = None 23 24 25GLOBAL_VARS_JSON_URL = ('http://skia-tree-status.appspot.com/repo-serving/' 26 'buildbot/site_config/global_variables.json') 27 28 29class GlobalVarsRetrievalError(Exception): 30 """Exception which is raised when the global_variables.json file cannot be 31 retrieved from the Skia buildbot repository.""" 32 pass 33 34 35class JsonDecodeError(Exception): 36 """Exception which is raised when the global_variables.json file cannot be 37 interpreted as JSON. This may be due to the file itself being incorrectly 38 formatted or due to an incomplete or corrupted downloaded version of the file. 39 """ 40 pass 41 42 43class NoSuchGlobalVariable(KeyError): 44 """Exception which is raised when a given variable is not found in the 45 global_variables.json file.""" 46 pass 47 48 49def retrieve_from_mirror(url): 50 """Retrieve the given file from the Skia Buildbot repo mirror. 51 52 Args: 53 url: string; the URL of the file to retrieve. 54 Returns: 55 The contents of the file in the repository. 56 """ 57 with closing(urllib2.urlopen(url)) as f: 58 return f.read() 59 60 61def Get(var_name): 62 """Return the value associated with this name in global_variables.json. 63 64 Args: 65 var_name: string; the variable to look up. 66 Returns: 67 The value of the variable. 68 Raises: 69 NoSuchGlobalVariable if there is no variable with that name. 70 """ 71 global _global_vars 72 if not _global_vars: 73 try: 74 global_vars_text = retrieve_from_mirror(GLOBAL_VARS_JSON_URL) 75 except Exception as e: 76 raise GlobalVarsRetrievalError('Failed to retrieve %s:\n%s' % 77 (GLOBAL_VARS_JSON_URL, str(e))) 78 try: 79 _global_vars = json.loads(global_vars_text) 80 except ValueError as e: 81 raise JsonDecodeError(e.message + '\n' + global_vars_text) 82 try: 83 return _global_vars[var_name]['value'] 84 except KeyError: 85 raise NoSuchGlobalVariable(var_name) 86 87 88if __name__ == '__main__': 89 print Get(sys.argv[1]) 90