| #!/usr/bin/python |
| |
| # Copyright (c) 2014 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import ast |
| import os |
| |
| from utils import command_executer |
| |
| class ImageDownloader(object): |
| |
| def __init__(self, logger_to_use=None, log_level="verbose", |
| cmd_exec=None): |
| self._logger = logger_to_use |
| self.log_level = log_level |
| self._ce = cmd_exec or command_executer.GetCommandExecuter(self._logger, |
| log_level = self.log_level) |
| |
| def _GetBuildID (self, chromeos_root, xbuddy_label): |
| # Get the translation of the xbuddy_label into the real Google Storage |
| # image name. |
| command = ("cd ~/trunk/src/third_party/toolchain-utils/crosperf; " |
| "python translate_xbuddy.py '%s'" % xbuddy_label) |
| retval, build_id_tuple_str, _ = self._ce.ChrootRunCommand(chromeos_root, |
| command, True) |
| build_id_tuple = ast.literal_eval(build_id_tuple_str) |
| build_id = build_id_tuple[0] |
| |
| return build_id |
| |
| def _DownloadImage(self, chromeos_root, build_id): |
| if self.log_level == "average": |
| self._logger.LogOutput ("Preparing to download %s image to local directory." % build_id) |
| |
| # Make sure the directory for downloading the image exists. |
| download_path = os.path.join(chromeos_root, "chroot/tmp", |
| build_id) |
| image_path = os.path.join(download_path, "chromiumos_test_image.bin") |
| if not os.path.exists(download_path): |
| os.makedirs(download_path) |
| |
| # Check to see if the image has already been downloaded. If not, |
| # download the image. |
| status = 0 |
| if not os.path.exists(image_path): |
| command = ("gsutil cp gs://chromeos-image-archive/%s" |
| "/chromiumos_test_image.tar.xz /tmp/%s" % (build_id, |
| build_id)) |
| |
| if self.log_level != "verbose": |
| self._logger.LogOutput ("CMD: %s" % command) |
| status = self._ce.ChrootRunCommand(chromeos_root, command) |
| |
| if status == 0: |
| return image_path |
| else: |
| return None |
| |
| def _UncompressImage(self, chromeos_root, build_id): |
| # Check to see if the file has already been uncompresssed, etc. |
| if os.path.exists(os.path.join(chromeos_root, "chroot/tmp", build_id, |
| "chromiumos_test_image.bin")): |
| return 0 |
| |
| # Uncompress and untar the downloaded image. |
| command = ("cd /tmp/%s ;unxz chromiumos_test_image.tar.xz; " |
| "tar -xvf chromiumos_test_image.tar" % build_id) |
| if self.log_level != "verbose": |
| self._logger.LogOutput("CMD: %s" % command) |
| print("(Uncompressing and un-tarring may take a couple of minutes..." |
| "please be patient.)") |
| retval = self._ce.ChrootRunCommand(chromeos_root, command) |
| return retval |
| |
| |
| def Run(self, chromeos_root, xbuddy_label): |
| build_id = self._GetBuildID(chromeos_root, xbuddy_label) |
| |
| |
| retval = 0 |
| image_path = self._DownloadImage(chromeos_root, build_id) |
| if image_path: |
| retval = self._UncompressImage(chromeos_root, build_id) |
| else: |
| retval = 1 |
| |
| if retval == 0 and self.log_level != "quiet": |
| self._logger.LogOutput("Using image from %s." % image_path) |
| |
| return retval, image_path |