diff options
Diffstat (limited to 'harnesses/host_controller/build/build_provider.py')
-rw-r--r-- | harnesses/host_controller/build/build_provider.py | 323 |
1 files changed, 0 insertions, 323 deletions
diff --git a/harnesses/host_controller/build/build_provider.py b/harnesses/host_controller/build/build_provider.py deleted file mode 100644 index 17ba0bd..0000000 --- a/harnesses/host_controller/build/build_provider.py +++ /dev/null @@ -1,323 +0,0 @@ -# -# Copyright (C) 2017 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -import logging -import os -import re -import shutil -import tempfile -import zipfile - -from host_controller import common -from vts.runners.host import utils - - -class BuildProvider(object): - """The base class for build provider. - - Attributes: - _IMAGE_FILE_EXTENSIONS: a list of strings which are common image file - extensions. - _BASIC_IMAGE_FILE_NAMES: a list of strings which are the image names in - an artifact zip. - _CONFIG_FILE_EXTENSION: string, the config file extension. - _additional_files: a dict containing additionally fetched files that - custom features may need. The key is the path - relative to temporary directory and the value is the - full path. - _configs: dict where the key is config type and value is the config file - path. - _device_images: dict where the key is image file name and value is the - path. - _test_suites: dict where the key is test suite type and value is the - test suite package file path. - _host_controller_package: dict where the key is a host controller - package and the value is the path - to a package file. - _tmp_dirpath: string, the temp dir path created to keep artifacts. - _last_fetched_artifact_type: string, stores the type of the last - artifact fetched. - """ - _CONFIG_FILE_EXTENSION = ".zip" - _IMAGE_FILE_EXTENSIONS = [".img", ".bin"] - _BASIC_IMAGE_FILE_NAMES = ["boot.img", "system.img", "vendor.img"] - - def __init__(self): - self._additional_files = {} - self._device_images = {} - self._test_suites = {} - self._host_controller_package = {} - self._configs = {} - self._last_fetched_artifact_type = None - tempdir_base = os.path.join(os.getcwd(), "tmp") - if not os.path.exists(tempdir_base): - os.mkdir(tempdir_base) - self._tmp_dirpath = tempfile.mkdtemp(dir=tempdir_base) - - def __del__(self): - """Deletes the temp dir if still set.""" - if self._tmp_dirpath: - shutil.rmtree(self._tmp_dirpath) - self._tmp_dirpath = None - - @property - def tmp_dirpath(self): - return self._tmp_dirpath - - def CreateNewTmpDir(self): - return tempfile.mkdtemp(dir=self._tmp_dirpath) - - def SetDeviceImage(self, name, path): - """Sets device image `path` for the specified `name`.""" - self._device_images[name] = path - self._last_fetched_artifact_type = common._ARTIFACT_TYPE_DEVICE - - def _IsFullDeviceImage(self, namelist): - """Returns true if given namelist list has all common device images.""" - for image_file in self._BASIC_IMAGE_FILE_NAMES: - if image_file not in namelist: - return False - return True - - def _IsImageFile(self, file_path): - """Returns whether a file is an image. - - Args: - file_path: string, the file path. - - Returns: - boolean, whether the file is an image. - """ - return any(file_path.endswith(ext) - for ext in self._IMAGE_FILE_EXTENSIONS) - - def SetDeviceImageZip(self, path, full_device_images=False): - """Sets device image(s) using files in a given zip file. - - It extracts image files inside the given zip file and selects - known Android image files. - - Args: - path: string, the path to a zip file. - """ - dest_path = path + ".dir" - fetch_type = None - with zipfile.ZipFile(path, 'r') as zip_ref: - if full_device_images or self._IsFullDeviceImage(zip_ref.namelist()): - self.SetDeviceImage(common.FULL_ZIPFILE, path) - dir_key = common.FULL_ZIPFILE_DIR - fetch_type = common._ARTIFACT_TYPE_DEVICE - else: - self.SetDeviceImage("gsi-zipfile", path) - dir_key = common.GSI_ZIPFILE_DIR # "gsi-zipfile-dir" - fetch_type = common._ARTIFACT_TYPE_GSI - if os.path.exists(dest_path): - shutil.rmtree(dest_path) - logging.info("%s %s deleted", dir_key, dest_path) - zip_ref.extractall(dest_path) - self.SetFetchedDirectory(dest_path) - self.SetDeviceImage(dir_key, dest_path) - - self._last_fetched_artifact_type = fetch_type - - def GetDeviceImage(self, name=None): - """Returns device image info.""" - if name is None: - return self._device_images - return self._device_images[name] - - def RemoveDeviceImage(self, name): - """Removes certain device image info. - - Args: - name: string, the name of the device image file - that needs to be removed. - """ - if name in self._device_images: - self._device_images.pop(name) - - def SetTestSuitePackage(self, test_suite, path): - """Sets test suite package `path` for the specified `type`. - - Args: - test_suite: string, test suite type such as 'vts' or 'cts', etc. - path: string, the path of a file. if a file is a zip file, - it's unziped and its main binary is set. - """ - if re.match("[vcgs]ts", test_suite): - suite_name = "android-%s" % test_suite - tradefed_name = "%s-tradefed" % test_suite - dest_path = os.path.join(self.tmp_dirpath, suite_name) - if os.path.exists(dest_path): - shutil.rmtree(dest_path) - logging.info("test suite %s deleted", dest_path) - with zipfile.ZipFile(path, 'r') as zip_ref: - zip_ref.extractall(dest_path) - bin_path = os.path.join(dest_path, suite_name, - "tools", tradefed_name) - os.chmod(bin_path, 0766) - path = bin_path - else: - logging.info("unsupported zip file %s", path) - self._test_suites[test_suite] = path - self._last_fetched_artifact_type = common._ARTIFACT_TYPE_TEST_SUITE - - def GetTestSuitePackage(self, type=None): - """Returns test suite package info.""" - if type is None: - return self._test_suites - return self._test_suites[type] - - def SetHostControllerPackage(self, package_type, path): - """Sets host controller package `path` for the specified `type`. - - Args: - package_type: string, host controller type such as 'vtslab'. - path: string, the path of a package file. - """ - self._host_controller_package[package_type] = path - self._last_fetched_artifact_type = common._ARTIFACT_TYPE_INFRA - - def GetHostControllerPackage(self, package_type=None): - """Returns host controller package info. - - Args: - package_type: string, key value to self._host_controller_package - dict. - - Returns: - the whole dict if package_type is None, otherwise a string which is - the path to the fetched host controller package. - """ - if package_type is None: - return self._host_controller_package - return self._host_controller_package[package_type] - - def SetConfigPackage(self, config_type, path): - """Sets test suite package `path` for the specified `type`. - - All valid config files have .zip extension. - - Args: - config_type: string, config type such as 'prod' or 'test'. - path: string, the path of a config file. - """ - if path.endswith(self._CONFIG_FILE_EXTENSION): - dest_path = os.path.join( - self.tmp_dirpath, os.path.basename(path) + ".dir") - with zipfile.ZipFile(path, 'r') as zip_ref: - zip_ref.extractall(dest_path) - path = dest_path - else: - logging.info("unsupported config package file %s", path) - self._configs[config_type] = path - self._last_fetched_artifact_type = common._ARTIFACT_TYPE_INFRA - - def GetConfigPackage(self, config_type=None): - """Returns config package info.""" - if config_type is None: - return self._configs - return self._configs[config_type] - - def SetAdditionalFile(self, rel_path, full_path): - """Sets the key and value of additionally fetched files. - - Args: - rel_path: the file path relative to temporary directory. - abs_path: the file path that this process can access. - """ - self._additional_files[rel_path] = full_path - self._last_fetched_artifact_type = common._ARTIFACT_TYPE_INFRA - - def GetAdditionalFile(self, rel_path=None): - """Returns the paths to fetched files.""" - if rel_path is None: - return self._additional_files - return self._additional_files[rel_path] - - def SetFetchedDirectory(self, - dir_path, - root_path=None, - full_device_images=False): - """Adds every file in a directory to one of the dictionaries. - - This method follows symlink to file, but skips symlink to directory. - - Args: - dir_path: string, the directory to find files in. - root_path: string, the temporary directory that dir_path is in. - The default value is dir_path. - """ - for dir_name, file_name in utils.iterate_files(dir_path): - full_path = os.path.join(dir_name, file_name) - self.SetFetchedFile(full_path, (root_path - if root_path else dir_path), - full_device_images) - - def SetFetchedFile(self, - file_path, - root_dir=None, - full_device_images=False, - set_suite_as=None): - """Adds a file to one of the dictionaries. - - Args: - file_path: string, the path to the file. - root_dir: string, the temporary directory that file_path is in. - The default value is file_path if file_path is a - directory. Otherwise, the default value is file_path's - parent directory. - set_suite_as: string, the test suite name to use for the given - artifact. Used when the file name does not follow - the standard "android-*ts.zip" file name pattern. - """ - file_name = os.path.basename(file_path) - if os.path.isdir(file_path): - self.SetFetchedDirectory(file_path, root_dir, full_device_images) - elif self._IsImageFile(file_path): - self.SetDeviceImage(file_name, file_path) - elif re.match("android-[vcgs]ts.zip", file_name): - test_suite = (file_name.split("-")[-1]).split(".")[0] - self.SetTestSuitePackage(test_suite, file_path) - elif file_name == "android-vtslab.zip": - self.SetHostControllerPackage("vtslab", file_path) - elif file_name.startswith("vti-global-config"): - self.SetConfigPackage( - "prod" if "prod" in file_name else "test", file_path) - elif set_suite_as: - self.SetTestSuitePackage(set_suite_as, file_path) - elif file_path.endswith(".zip"): - self.SetDeviceImageZip(file_path, full_device_images) - else: - rel_path = (os.path.relpath(file_path, root_dir) if root_dir else - os.path.basename(file_path)) - self.SetAdditionalFile(rel_path, file_path) - - def PrintDeviceImageInfo(self): - """Prints device image info.""" - logging.info(self.GetDeviceImage()) - - def PrintGetTestSuitePackageInfo(self): - """Prints test suite package info.""" - logging.info(self.GetTestSuitePackage()) - - def GetFetchedArtifactType(self): - """Gets the most recently fetched artifact type. - - Returns: - string, type of the artifact. - """ - return self._last_fetched_artifact_type |