#!/usr/bin/env python # # Copyright 2018 - 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. """Common code used by acloud create methods/classes.""" import logging import os from acloud import errors from acloud.internal import constants from acloud.internal.lib import android_build_client from acloud.internal.lib import auth from acloud.internal.lib import utils logger = logging.getLogger(__name__) def ParseHWPropertyArgs(dict_str, item_separator=",", key_value_separator=":"): """Helper function to initialize a dict object from string. e.g. cpu:2,dpi:240,resolution:1280x800 -> {"cpu":"2", "dpi":"240", "resolution":"1280x800"} Args: dict_str: A String to be converted to dict object. item_separator: String character to separate items. key_value_separator: String character to separate key and value. Returns: Dict created from key:val pairs in dict_str. Raises: error.MalformedDictStringError: If dict_str is malformed. """ hw_dict = {} if not dict_str: return hw_dict for item in dict_str.split(item_separator): if key_value_separator not in item: raise errors.MalformedDictStringError( "Expecting ':' in '%s' to make a key-val pair" % item) key, value = item.split(key_value_separator) if not value or not key: raise errors.MalformedDictStringError( "Missing key or value in %s, expecting form of 'a:b'" % item) hw_dict[key.strip()] = value.strip() return hw_dict def GetCvdHostPackage(): """Get cvd host package path. Look for the host package in $ANDROID_HOST_OUT and dist dir then verify existence and get cvd host package path. Return: A string, the path to the host package. Raises: errors.GetCvdLocalHostPackageError: Can't find cvd host package. """ dirs_to_check = list(filter(None, [os.environ.get(constants.ENV_ANDROID_HOST_OUT)])) dist_dir = utils.GetDistDir() if dist_dir: dirs_to_check.append(dist_dir) for path in dirs_to_check: cvd_host_package = os.path.join(path, constants.CVD_HOST_PACKAGE) if os.path.exists(cvd_host_package): logger.debug("cvd host package: %s", cvd_host_package) return cvd_host_package raise errors.GetCvdLocalHostPackageError( "Can't find the cvd host package (Try lunching a cuttlefish target" " like aosp_cf_x86_phone-userdebug and running 'm'): \n%s" % '\n'.join(dirs_to_check)) def DownloadRemoteArtifact(cfg, build_target, build_id, artifact, extract_path, decompress=False): """Download remote artifact. Args: cfg: An AcloudConfig instance. build_target: String, the build target, e.g. cf_x86_phone-userdebug. build_id: String, Build id, e.g. "2263051", "P2804227" artifact: String, zip image or cvd host package artifact. extract_path: String, a path include extracted files. decompress: Boolean, if true decompress the artifact. """ build_client = android_build_client.AndroidBuildClient( auth.CreateCredentials(cfg)) temp_file = os.path.join(extract_path, artifact) build_client.DownloadArtifact( build_target, build_id, artifact, temp_file) if decompress: utils.Decompress(temp_file, extract_path) try: os.remove(temp_file) logger.debug("Deleted temporary file %s", temp_file) except OSError as e: logger.error("Failed to delete temporary file: %s", str(e))