| # Copyright 2015 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 recipe_engine import recipe_api |
| |
| |
| class DiskApi(recipe_api.RecipeApi): |
| """DiskApi contains helper functions for reading disk info.""" |
| |
| def space_usage( |
| self, path=None, warning_level=None, previous_result=None, |
| can_fail_build=False, name=None, **kwargs): |
| """Displays disk space usage. |
| |
| Does not support Windows yet, does not emit steps. |
| |
| Prints disk space usage in step log and step text. |
| |
| Args: |
| path (str): path mapped to the disk. Defaults to [START_DIR]. |
| warning_level (float): a value from 0 to 1.0. If usage reaches this level, |
| mark the step as WARNING. Defaults to 0.9. |
| previous_result (dict): previous result of space_usage call. If passed, |
| delta is displayed in step text. |
| name (str): step name. Defaults to "disk space usage". |
| |
| Returns: |
| A dict with disk usage info or None if step fails. Dict keys: |
| * capacity (float): disk capacity, in MiB. |
| * used (float): disk usage, in MiB. |
| """ |
| path = path or self.m.path['start_dir'] |
| name = name or 'disk space usage' |
| warning_level = warning_level or 0.9 |
| kwargs.setdefault( |
| 'step_test_data', |
| lambda: self.m.json.test_api.output_stream( |
| self.test_api.space_usage_result())) |
| |
| if self.m.platform.is_win: |
| # Not supported. Feel free to implement. |
| return |
| |
| step = None |
| try: |
| step = self.m.python( |
| name, |
| self.resource('statvfs.py'), |
| stdout=self.m.json.output(), |
| args=[path], |
| **kwargs) |
| capacity_mb = step.stdout['capacity'] / 1024.0 / 1024.0 |
| used_mb = step.stdout['used'] / 1024.0 / 1024.0 |
| percent = used_mb / capacity_mb |
| step.presentation.step_text = '%.2f/%.2f GiB (%d%%) used' % ( |
| used_mb / 1024.0, capacity_mb / 1024.0, percent * 100) |
| if percent >= warning_level: |
| step.presentation.status = self.m.step.WARNING |
| if previous_result: |
| step.presentation.step_text += '. Delta: %+.2f MiB' % ( |
| used_mb - previous_result['used']) |
| return { |
| 'capacity': capacity_mb, |
| 'used': used_mb, |
| } |
| except Exception as ex: |
| # Do not fail entire build because of a disk space step failure. |
| if step: |
| step.presentation.logs['exception'] = [ |
| str(ex), '\n', self.m.traceback.format_exc()] |
| step.presentation.status = self.m.step.WARNING |
| if can_fail_build: |
| raise recipe_api.StepFailure('Could not get disk info: %s' % ex) |
| return |