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 from contextlib import contextmanager | 5 from contextlib import contextmanager |
6 | 6 |
7 from recipe_engine import recipe_api | 7 from recipe_engine import recipe_api |
8 | 8 |
9 class GomaApi(recipe_api.RecipeApi): | 9 class GomaApi(recipe_api.RecipeApi): |
10 """GomaApi contains helper functions for using goma.""" | 10 """GomaApi contains helper functions for using goma.""" |
11 | 11 |
12 def __init__(self, **kwargs): | 12 def __init__(self, **kwargs): |
13 super(GomaApi, self).__init__(**kwargs) | 13 super(GomaApi, self).__init__(**kwargs) |
14 self._goma_dir = None | 14 self._goma_dir = None |
15 self._goma_started = False | 15 self._goma_started = False |
16 | 16 |
17 self._goma_ctl_env = {} | 17 self._goma_ctl_env = {} |
18 self._cloudtail_pid = None | |
19 self._goma_jobs = None | 18 self._goma_jobs = None |
20 | 19 |
21 @property | 20 @property |
22 def service_account_json_path(self): | 21 def service_account_json_path(self): |
23 if self.m.platform.is_win: | 22 if self.m.platform.is_win: |
24 return 'C:\\creds\\service_accounts\\service-account-goma-client.json' | 23 return 'C:\\creds\\service_accounts\\service-account-goma-client.json' |
25 return '/creds/service_accounts/service-account-goma-client.json' | 24 return '/creds/service_accounts/service-account-goma-client.json' |
26 | 25 |
27 @property | 26 @property |
28 def cloudtail_path(self): | 27 def cloudtail_path(self): |
29 assert self._goma_dir | 28 assert self._goma_dir |
30 return self.m.path.join(self._goma_dir, 'cloudtail') | 29 return self.m.path.join(self._goma_dir, 'cloudtail') |
31 | 30 |
32 @property | 31 @property |
| 32 def cloudtail_pid_file(self): |
| 33 return self.m.path['tmp_base'].join('cloudtail.pid') |
| 34 |
| 35 @property |
33 def json_path(self): | 36 def json_path(self): |
34 assert self._goma_dir | 37 assert self._goma_dir |
35 return self.m.path.join(self._goma_dir, 'jsonstatus') | 38 return self.m.path.join(self._goma_dir, 'jsonstatus') |
36 | 39 |
37 @property | 40 @property |
38 def recommended_goma_jobs(self): | 41 def recommended_goma_jobs(self): |
39 """ | 42 """ |
40 Return the recommended number of jobs for parallel build using Goma. | 43 Return the recommended number of jobs for parallel build using Goma. |
41 | 44 |
42 This function caches the _goma_jobs. | 45 This function caches the _goma_jobs. |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
126 def build_data_dir(self): | 129 def build_data_dir(self): |
127 return self.m.properties.get('build_data_dir') | 130 return self.m.properties.get('build_data_dir') |
128 | 131 |
129 def _start_cloudtail(self): | 132 def _start_cloudtail(self): |
130 """Start cloudtail to upload compiler_proxy.INFO | 133 """Start cloudtail to upload compiler_proxy.INFO |
131 | 134 |
132 Raises: | 135 Raises: |
133 InfraFailure if it fails to start cloudtail | 136 InfraFailure if it fails to start cloudtail |
134 """ | 137 """ |
135 | 138 |
136 assert self._cloudtail_pid is None | 139 self.m.python( |
137 | |
138 step_result = self.m.python( | |
139 name='start cloudtail', | 140 name='start cloudtail', |
140 script=self.resource('cloudtail_utils.py'), | 141 script=self.resource('cloudtail_utils.py'), |
141 args=['start', | 142 args=['start', |
142 '--cloudtail-path', self.cloudtail_path], | 143 '--cloudtail-path', self.cloudtail_path, |
| 144 '--pid-file', self.m.raw_io.output( |
| 145 leak_to=self.cloudtail_pid_file)], |
143 env=self._goma_ctl_env, | 146 env=self._goma_ctl_env, |
144 stdout=self.m.raw_io.output(), | |
145 step_test_data=( | 147 step_test_data=( |
146 lambda: self.m.raw_io.test_api.stream_output('12345')), | 148 lambda: self.m.raw_io.test_api.output('12345')), |
147 infra_step=True) | 149 infra_step=True) |
148 | 150 |
149 self._cloudtail_pid = step_result.stdout | |
150 | |
151 def _stop_cloudtail(self): | 151 def _stop_cloudtail(self): |
152 """Stop cloudtail started by _start_cloudtail | 152 """Stop cloudtail started by _start_cloudtail |
153 | 153 |
154 Raises: | 154 Raises: |
155 InfraFailure if it fails to stop cloudtail | 155 InfraFailure if it fails to stop cloudtail |
156 """ | 156 """ |
157 | 157 |
158 assert self._cloudtail_pid is not None | |
159 | |
160 self.m.python( | 158 self.m.python( |
161 name='stop cloudtail', | 159 name='stop cloudtail', |
162 script=self.resource('cloudtail_utils.py'), | 160 script=self.resource('cloudtail_utils.py'), |
163 args=['stop', | 161 args=['stop', |
164 '--killed-pid', self._cloudtail_pid], | 162 '--killed-pid-file', self.cloudtail_pid_file], |
165 infra_step=True) | 163 infra_step=True) |
166 | 164 |
167 self._cloudtail_pid = None | |
168 | |
169 def start(self, env=None, **kwargs): | 165 def start(self, env=None, **kwargs): |
170 """Start goma compiler_proxy. | 166 """Start goma compiler_proxy. |
171 | 167 |
172 A user MUST execute ensure_goma beforehand. | 168 A user MUST execute ensure_goma beforehand. |
173 It is user's responsibility to handle failure of starting compiler_proxy. | 169 It is user's responsibility to handle failure of starting compiler_proxy. |
174 """ | 170 """ |
175 assert self._goma_dir | 171 assert self._goma_dir |
176 assert not self._goma_started | 172 assert not self._goma_started |
177 | 173 |
178 if self.build_data_dir: | 174 if self.build_data_dir: |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
325 ninja_log_exit_status = e.retcode | 321 ninja_log_exit_status = e.retcode |
326 raise e | 322 raise e |
327 except self.m.step.InfraFailure as e: # pragma: no cover | 323 except self.m.step.InfraFailure as e: # pragma: no cover |
328 ninja_log_exit_status = -1 | 324 ninja_log_exit_status = -1 |
329 raise e | 325 raise e |
330 finally: | 326 finally: |
331 self.stop(ninja_log_outdir=ninja_log_outdir, | 327 self.stop(ninja_log_outdir=ninja_log_outdir, |
332 ninja_log_compiler=ninja_log_compiler, | 328 ninja_log_compiler=ninja_log_compiler, |
333 ninja_log_command=ninja_log_command, | 329 ninja_log_command=ninja_log_command, |
334 ninja_log_exit_status=ninja_log_exit_status) | 330 ninja_log_exit_status=ninja_log_exit_status) |
OLD | NEW |