OLD | NEW |
1 # Copyright 2014 The Chromium Authors. All rights reserved. | 1 # Copyright 2014 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 module contains functionality for starting build try jobs via HTTP. | 5 """This module contains functionality for starting build try jobs via HTTP. |
6 | 6 |
7 This includes both sending a request to start a job, and also related code | 7 This includes both sending a request to start a job, and also related code |
8 for querying the status of the job. | 8 for querying the status of the job. |
9 | 9 |
10 This module can be either run as a stand-alone script to send a request to a | 10 This module can be either run as a stand-alone script to send a request to a |
11 builder, or imported and used by calling the public functions below. | 11 builder, or imported and used by calling the public functions below. |
12 """ | 12 """ |
13 | 13 |
14 import getpass | |
15 import json | 14 import json |
16 import optparse | |
17 import os | |
18 import sys | |
19 import urllib | |
20 import urllib2 | 15 import urllib2 |
21 | 16 |
22 import fetch_build | |
23 | |
24 # URL template for fetching JSON data about builds. | 17 # URL template for fetching JSON data about builds. |
25 BUILDER_JSON_URL = ('%(server_url)s/json/builders/%(bot_name)s/builds/' | 18 BUILDER_JSON_URL = ('%(server_url)s/json/builders/%(bot_name)s/builds/' |
26 '%(build_num)s?as_text=1&filter=0') | 19 '%(build_num)s?as_text=1&filter=0') |
27 | 20 |
28 # URL template for displaying build steps. | 21 # URL template for displaying build steps. |
29 BUILDER_HTML_URL = '%(server_url)s/builders/%(bot_name)s/builds/%(build_num)s' | 22 BUILDER_HTML_URL = '%(server_url)s/builders/%(bot_name)s/builds/%(build_num)s' |
30 | 23 |
31 # Status codes that can be returned by the GetBuildStatus method | 24 # Status codes that can be returned by the GetBuildStatus method |
32 # From buildbot.status.builder. | 25 # From buildbot.status.builder. |
33 # See: http://docs.buildbot.net/current/developer/results.html | 26 # See: http://docs.buildbot.net/current/developer/results.html |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
102 # See: http://docs.buildbot.net/current/developer/results.html | 95 # See: http://docs.buildbot.net/current/developer/results.html |
103 # results[1]: List of items, contains text if step fails, otherwise empty. | 96 # results[1]: List of items, contains text if step fails, otherwise empty. |
104 if (item.get('name') == 'package_build' and | 97 if (item.get('name') == 'package_build' and |
105 item.get('isFinished') and | 98 item.get('isFinished') and |
106 item.get('results')[0] in OK): | 99 item.get('results')[0] in OK): |
107 return True | 100 return True |
108 return False | 101 return False |
109 | 102 |
110 | 103 |
111 def _FetchBuilderData(builder_url): | 104 def _FetchBuilderData(builder_url): |
112 """Fetches JSON data for the all the builds from the tryserver. | 105 """Fetches JSON data for the all the builds from the try server. |
113 | 106 |
114 Args: | 107 Args: |
115 builder_url: A tryserver URL to fetch builds information. | 108 builder_url: A try server URL to fetch builds information. |
116 | 109 |
117 Returns: | 110 Returns: |
118 A dictionary with information of all build on the tryserver. | 111 A dictionary with information of all build on the try server. |
119 """ | 112 """ |
120 data = None | 113 data = None |
121 try: | 114 try: |
122 url = urllib2.urlopen(builder_url) | 115 url = urllib2.urlopen(builder_url) |
123 except urllib2.URLError as e: | 116 except urllib2.URLError as e: |
124 print ('urllib2.urlopen error %s, waterfall status page down.[%s]' % ( | 117 print ('urllib2.urlopen error %s, waterfall status page down.[%s]' % ( |
125 builder_url, str(e))) | 118 builder_url, str(e))) |
126 return None | 119 return None |
127 if url is not None: | 120 if url is not None: |
128 try: | 121 try: |
129 data = url.read() | 122 data = url.read() |
130 except IOError as e: | 123 except IOError as e: |
131 print 'urllib2 file object read error %s, [%s].' % (builder_url, str(e)) | 124 print 'urllib2 file object read error %s, [%s].' % (builder_url, str(e)) |
132 return data | 125 return data |
133 | 126 |
134 | 127 |
135 def _GetBuildData(buildbot_url): | 128 def _GetBuildData(buildbot_url): |
136 """Gets build information for the given build id from the tryserver. | 129 """Gets build information for the given build id from the try server. |
137 | 130 |
138 Args: | 131 Args: |
139 buildbot_url: A tryserver URL to fetch build information. | 132 buildbot_url: A try server URL to fetch build information. |
140 | 133 |
141 Returns: | 134 Returns: |
142 A dictionary with build information if build exists, otherwise None. | 135 A dictionary with build information if build exists, otherwise None. |
143 """ | 136 """ |
144 builds_json = _FetchBuilderData(buildbot_url) | 137 builds_json = _FetchBuilderData(buildbot_url) |
145 if builds_json: | 138 if builds_json: |
146 return json.loads(builds_json) | 139 return json.loads(builds_json) |
147 return None | 140 return None |
148 | 141 |
149 | 142 |
150 def GetBuildStatus(build_num, bot_name, server_url): | 143 def GetBuildStatus(build_num, bot_name, server_url): |
151 """Gets build status from the buildbot status page for a given build number. | 144 """Gets build status from the buildbot status page for a given build number. |
152 | 145 |
153 Args: | 146 Args: |
154 build_num: A build number on tryserver to determine its status. | 147 build_num: A build number on try server to determine its status. |
155 bot_name: Name of the bot where the build information is scanned. | 148 bot_name: Name of the bot where the build information is scanned. |
156 server_url: URL of the buildbot. | 149 server_url: URL of the buildbot. |
157 | 150 |
158 Returns: | 151 Returns: |
159 A pair which consists of build status (SUCCESS, FAILED or PENDING) and a | 152 A pair which consists of build status (SUCCESS, FAILED or PENDING) and a |
160 link to build status page on the waterfall. | 153 link to build status page on the waterfall. |
161 """ | 154 """ |
162 results_url = None | 155 results_url = None |
163 if build_num: | 156 if build_num: |
164 # Get the URL for requesting JSON data with status information. | 157 # Get the URL for requesting JSON data with status information. |
(...skipping 16 matching lines...) Expand all Loading... |
181 elif _IsBuildSuccessful(build_data): | 174 elif _IsBuildSuccessful(build_data): |
182 return (OK, results_url) | 175 return (OK, results_url) |
183 return (PENDING, results_url) | 176 return (PENDING, results_url) |
184 | 177 |
185 | 178 |
186 def GetBuildNumFromBuilder(build_reason, bot_name, server_url): | 179 def GetBuildNumFromBuilder(build_reason, bot_name, server_url): |
187 """Gets build number on build status page for a given 'build reason'. | 180 """Gets build number on build status page for a given 'build reason'. |
188 | 181 |
189 This function parses the JSON data from buildbot page and collects basic | 182 This function parses the JSON data from buildbot page and collects basic |
190 information about the all the builds, and then uniquely identifies the build | 183 information about the all the builds, and then uniquely identifies the build |
191 based on the 'reason' attribute in builds's JSON data. | 184 based on the 'reason' attribute in the JSON data about the build. |
192 | 185 |
193 The 'reason' attribute set is when a build request is posted, and it is used | 186 The 'reason' attribute set is when a build request is posted, and it is used |
194 to identify the build on status page. | 187 to identify the build on status page. |
195 | 188 |
196 Args: | 189 Args: |
197 build_reason: A unique build name set to build on tryserver. | 190 build_reason: A unique build name set to build on try server. |
198 bot_name: Name of the bot where the build information is scanned. | 191 bot_name: Name of the bot where the build information is scanned. |
199 server_url: URL of the buildbot. | 192 server_url: URL of the buildbot. |
200 | 193 |
201 Returns: | 194 Returns: |
202 A build number as a string if found, otherwise None. | 195 A build number as a string if found, otherwise None. |
203 """ | 196 """ |
204 buildbot_url = BUILDER_JSON_URL % { | 197 buildbot_url = BUILDER_JSON_URL % { |
205 'server_url': server_url, | 198 'server_url': server_url, |
206 'bot_name': bot_name, | 199 'bot_name': bot_name, |
207 'build_num': '_all', | 200 'build_num': '_all', |
208 } | 201 } |
209 builds_json = _FetchBuilderData(buildbot_url) | 202 builds_json = _FetchBuilderData(buildbot_url) |
210 if builds_json: | 203 if builds_json: |
211 builds_data = json.loads(builds_json) | 204 builds_data = json.loads(builds_json) |
212 for current_build in builds_data: | 205 for current_build in builds_data: |
213 if builds_data[current_build].get('reason') == build_reason: | 206 if builds_data[current_build].get('reason') == build_reason: |
214 return builds_data[current_build].get('number') | 207 return builds_data[current_build].get('number') |
215 return None | 208 return None |
OLD | NEW |