diff options
Diffstat (limited to 'host_setup/fabfile.py')
-rw-r--r-- | host_setup/fabfile.py | 386 |
1 files changed, 0 insertions, 386 deletions
diff --git a/host_setup/fabfile.py b/host_setup/fabfile.py deleted file mode 100644 index d37bb58..0000000 --- a/host_setup/fabfile.py +++ /dev/null @@ -1,386 +0,0 @@ -# -# 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. -# - -import imp -import os -import sys -import time - -from fabric.api import env -from fabric.api import local -from fabric.api import run -from fabric.api import settings -from fabric.api import sudo -from fabric.contrib.files import contains -from fabric.contrib.files import exists -from fabric.context_managers import cd - -_PIP_REQUIREMENTS_PATHS = [ - "test/vts/script/pip_requirements.txt", - "test/framework/harnesses/host_controller/script/pip_requirements.txt" -] - -# Path to the file that contains the abs path to the deployed vtslab pakcage. -_VTSLAB_PACKAGE_PATH_FILENAME = ".vtslab_package_path" - -# Zone filter list for GCE instances. -_DEFAULT_GCE_ZONE_LIST = [ - "us-east1-b", - "asia-northeast1-a", -] - - -def SetPassword(password): - """Sets password for hosts to access through ssh and to run sudo commands - - usage: $ fab SetPassword:<password for hosts> - - Args: - password: string, password for hosts. - """ - env.password = password - - -def GetHosts(hosts_file_path, gce_instance_name=None, account=None): - """Configures env.hosts to a given list of hosts. - - usage: $ fab GetHosts:<path to a source file contains hosts info> - - Args: - hosts_file_path: string, path to a python file passed from command file - input. - gce_instance_name: string, GCE instance name. - account: string, account name used for the ssh connection. - """ - if hosts_file_path.endswith(".py"): - hosts_module = imp.load_source('hosts_module', hosts_file_path) - env.hosts = hosts_module.EmitHostList() - else: - if not gce_instance_name or not account: - print( - "Please specify gce_instance_name and account using -H option. " - "Example: -H <Google_Cloud_project>,<GCE_instance>,<account>") - sys.exit(0) - env.key_filename = "~/.ssh/google_compute_engine" - gce_list_out = local( - "gcloud compute instances list --project=%s --filter=\"zone:(%s)\"" - % (hosts_file_path, " ".join(_DEFAULT_GCE_ZONE_LIST)), - capture=True) - for line in gce_list_out.split("\n")[1:]: - if line.startswith(gce_instance_name): - env.hosts.append("%s@%s" % (account, line.strip().split()[-2])) - - -def SetupIptables(ip_address_file_path): - """Configures iptables setting for all hosts listed. - - usage: $ fab SetupIptables:<path to a source file contains ip addresses of - certified machines> - - Args: - ip_address_file_path: string, path to a python file passed from command - file input. - """ - ip_addresses_module = imp.load_source('ip_addresses_module', - ip_address_file_path) - ip_address_list = ip_addresses_module.EmitIPAddressList() - - sudo("apt-get install -y iptables-persistent") - sudo("iptables -P INPUT ACCEPT") - sudo("iptables -P FORWARD ACCEPT") - sudo("iptables -F") - - for ip_address in ip_address_list: - sudo( - "iptables -A INPUT -p tcp -s %s --dport 22 -j ACCEPT" % ip_address) - - sudo("iptables -P INPUT DROP") - sudo("iptables -P FORWARD DROP") - sudo("iptables -A INPUT -p icmp -j ACCEPT") - sudo("netfilter-persistent save") - sudo("netfilter-persistent reload") - - -def SetupSudoers(): - """Append sudo rules for vtslab user. - - usage: $ fab SetupSudoers - """ - if not contains("/etc/sudoers", "vtslab", use_sudo=True): - sudo("echo '' | sudo tee -a /etc/sudoers") - sudo("echo '# Let vtslab account have all authorization' | " - "sudo tee -a /etc/sudoers") - sudo("echo 'vtslab ALL=(ALL:ALL) ALL' | sudo tee -a /etc/sudoers") - - -def SetupUSBPermission(): - """Sets up the USB permission for adb and fastboot. - - usage: $ fab SetupUSBPermission - """ - sudo("curl --create-dirs -L -o /etc/udev/rules.d/51-android.rules -O -L " - "https://raw.githubusercontent.com/snowdream/51-android/master/" - "51-android.rules") - sudo("chmod a+r /etc/udev/rules.d/51-android.rules") - sudo("service udev restart") - - -def SetupADBVendorKeysEnvVar(): - """Appends scripts for ADB_VENDOR_KEYS path setup. - - In setup step, this function looks into .bashrc file for this script, and - if there is not then appends the below scripts to .bashrc. - Later when shell env created (through ssh or screen instance creation time), - .bashrc file will look for _VTSLAB_PACKAGE_PATH_FILENAME and use the - contents of the file to set ADB_VENDOR_KEYS. - - usage: $ fab SetupADBVendorKeysEnvVar - """ - if not contains("~/.bashrc", _VTSLAB_PACKAGE_PATH_FILENAME): - run("echo '' >> ~/.bashrc", ) - run("echo '# Set $ADB_VENDOR_KEYS as paths to adb private key files " - "within the vtslab-package' >> ~/.bashrc") - run("echo 'if [ -f ~/%s ]; then' >> ~/.bashrc" % - _VTSLAB_PACKAGE_PATH_FILENAME) - run("echo ' export ADB_VENDOR_KEYS=$(find $(cat ~/%s)/android-vtslab/" - "testcases/DATA/ak -name \".*.ak\" | tr \"\\n\" \":\")' " - ">> ~/.bashrc" % _VTSLAB_PACKAGE_PATH_FILENAME) - run("echo 'fi' >> ~/.bashrc") - - -def _CheckADBVendorKeysEnvVar(vtslab_package_file_name=""): - """Checks if there is a change in ADB_VENDOR_KEYS env variable. - - if there is, then the adbd needs to be restarted in the screen context - before running the HC. - - Args: - vtslab_package_file_name: string, the HC package file name that is about - to be deployed. - - Returns: - True if the list of the adb vendor key files have changed, - False otherwise. - """ - former_key_set = set() - current_key_set = set() - set_keyfile_set = lambda set, path_list: map(set.add, map(os.path.basename, - path_list)) - vtslab_package_path_filepath = "~/%s" % _VTSLAB_PACKAGE_PATH_FILENAME - - if exists(vtslab_package_path_filepath): - former_HC_package_path = run("cat %s" % vtslab_package_path_filepath) - former_HC_package_adbkey_path = os.path.join( - former_HC_package_path, "android-vtslab/testcases/DATA/ak") - if exists(former_HC_package_adbkey_path): - adb_vendor_keys_list = run("find %s -name \".*.ak\"" % - former_HC_package_adbkey_path).split() - set_keyfile_set(former_key_set, adb_vendor_keys_list) - - if exists("~/run/%s.dir/android-vtslab/testcases/DATA/ak" % - vtslab_package_file_name): - adb_vendor_keys_list = run( - "find ~/run/%s.dir/android-vtslab/testcases/DATA/ak -name \".*.ak\"" - % vtslab_package_file_name).split() - set_keyfile_set(current_key_set, adb_vendor_keys_list) - - return former_key_set != current_key_set - - -def SetupPackages(ip_address_file_path=None): - """Sets up the execution environment for vts `run` command. - - Need to temporarily open the ports for apt-get and pip commands. - - usage: $ fab SetupPackages - - Args: - ip_address_file_path: string, path to a python file passed from command - file input. Will be passed to SetupIptables(). - """ - sudo("iptables -P INPUT ACCEPT") - - # todo : replace "kr.ubuntu." to "ubuntu" in /etc/apt/sources.list - sudo("apt-get upgrade -y") - sudo("apt-get update -y") - sudo("apt-get install -y git-core gnupg flex bison gperf build-essential " - "zip curl zlib1g-dev gcc-multilib g++-multilib x11proto-core-dev " - "libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc " - "unzip liblz4-tool udev screen") - - sudo("apt-get install -y android-tools-adb") - sudo("usermod -aG plugdev $LOGNAME") - - SetupUSBPermission() - - sudo("apt-get update") - sudo("apt-get install -y python2.7") - sudo("apt-get install -y python-pip") - run("pip install --upgrade pip") - sudo("apt-get install -y python-virtualenv") - - sudo("apt-get install -y python-dev python-protobuf protobuf-compiler " - "python-setuptools") - - for req_path in _PIP_REQUIREMENTS_PATHS: - full_path = os.path.join(os.environ["ANDROID_BUILD_TOP"], req_path) - pip_requirement_list = [] - try: - requirements_fd = open(full_path, "r") - lines = requirements_fd.readlines() - for line in lines: - req = line.rstrip() - if req != "" and not req.startswith("#"): - pip_requirement_list.append(req) - except IOError as e: - print("%s: %s" % (e.strerror, full_path)) - return - sudo("pip install %s" % " ".join(pip_requirement_list)) - - sudo("pip install --upgrade protobuf") - - lsb_result = run("lsb_release -c -s") - sudo("echo \"deb http://packages.cloud.google.com/apt cloud-sdk-%s " - "main\" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list" % - lsb_result) - sudo("curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | " - "sudo apt-key add -") - sudo("apt-get update && sudo apt-get install -y google-cloud-sdk") - sudo("apt-get install -y google-cloud-sdk-app-engine-java " - "google-cloud-sdk-app-engine-python kubectl") - - sudo("apt-get install -y m4 bison") - - if ip_address_file_path is not None: - SetupIptables(ip_address_file_path) - - SetupADBVendorKeysEnvVar() - - -def DeployVtslab(vtslab_package_gcs_url=None): - """Deploys vtslab package. - - Fetches and deploy vtslab by going through the processes described below - 1. Send the "exit --wait_for_jobs=True" command to all detached screen. - And let the screen to terminate itself. - 2. Create a new screen instance that downloads and runs the new HC, - give password and device command to the HC without actually attaching it - - usage: $ fab DeployVtslab -p <password> -H hosts.py -f <gs://vtslab-release/...> - - Args: - vtslab_package_gcs_url: string, URL to a certain vtslab package file. - """ - if not vtslab_package_gcs_url: - print("Please specify vtslab package file URL using -f option.") - return - elif not vtslab_package_gcs_url.startswith("gs://vtslab-release/"): - print("Please spcify a valid URL for the vtslab package.") - return - else: - vti = "vtslab-schedule-" + vtslab_package_gcs_url[len( - "gs://vtslab-release/"):].split("/")[0] + ".appspot.com" - with settings(warn_only=True): - screen_list_result = run("screen -list") - lines = screen_list_result.split("\n") - for line in lines: - if "(Detached)" in line: - screen_name = line.split("\t")[1] - print(screen_name) - with settings(warn_only=True): - run("screen -S %s -X stuff \"exit --wait_for_jobs=True\"" % - screen_name) - run("screen -S %s -X stuff \"^M\"" % screen_name) - run("screen -S %s -X stuff \"exit\"" % screen_name) - run("screen -S %s -X stuff \"^M\"" % screen_name) - - vtslab_package_file_name = os.path.basename(vtslab_package_gcs_url) - run("mkdir -p ~/run/%s.dir/" % vtslab_package_file_name) - with cd("~/run/%s.dir" % vtslab_package_file_name): - run("gsutil cp %s ./" % vtslab_package_gcs_url) - run("unzip -o %s" % vtslab_package_file_name) - adb_vendor_keys_changed = _CheckADBVendorKeysEnvVar( - vtslab_package_file_name) - run("pwd > ~/%s" % _VTSLAB_PACKAGE_PATH_FILENAME) - - with cd("~/run/%s.dir/android-vtslab/tools" % vtslab_package_file_name): - new_screen_name = run("cat ../testcases/version.txt") - - with cd("~/run/%s.dir/android-vtslab/tools" % vtslab_package_file_name): - run("./make_screen %s ; sleep 1" % new_screen_name) - - if adb_vendor_keys_changed: - reset_adbd = "" - while reset_adbd.lower() not in ["y", "n"]: - if reset_adbd: - print("Please type 'y' or 'n'") - reset_adbd = raw_input( - "Reset adb server daemon on host %s (y/n)? " % env.host) - if reset_adbd.lower() == "y": - run("screen -S %s -X stuff \"adb kill-server^M\"" % - new_screen_name) - run("screen -S %s -X stuff \"adb start-server^M\"" % - new_screen_name) - run("screen -S %s -X stuff \"./run --vti=%s\"" % (new_screen_name, vti)) - run("screen -S %s -X stuff \"^M\"" % new_screen_name) - time.sleep(5) - run("screen -S %s -X stuff \"password\"" % new_screen_name) - run("screen -S %s -X stuff \"^M\"" % new_screen_name) - run("screen -S %s -X stuff \"%s\"" % (new_screen_name, env.password)) - run("screen -S %s -X stuff \"^M\"" % new_screen_name) - run("screen -S %s -X stuff \"device --lease=True\"" % new_screen_name) - run("screen -S %s -X stuff \"^M\"" % new_screen_name) - - with cd("~/run/%s.dir" % vtslab_package_file_name): - run("rm %s" % vtslab_package_file_name) - - -def DeployGCE(vtslab_package_gcs_url=None): - """Deploys a vtslab package to GCE nodes. - - Fetches and deploy vtslab on monitor-hc by doing; - 1. Download android-vtslab-<>.zip from GCS using the given URL and upzip it. - 2. Send the Ctrl-c key input to all detached screen, then cursor-up - key input and enter key input, making the screen to execute - the last run command. - - usage: $ fab DeployVtslab -p <password> -H <Google Cloud Platform project name> -f <gs://vtslab-release/...> - - Args: - vtslab_package_gcs_url: string, URL to a certain vtslab package file. - """ - if not vtslab_package_gcs_url: - print("Please specify vtslab package file URL using -f option.") - return - elif not vtslab_package_gcs_url.startswith("gs://"): - print("Please spcify a valid URL for the vtslab package.") - return - - vtslab_package_file_name = os.path.basename(vtslab_package_gcs_url) - with cd("~/run"): - run("gsutil cp %s ./" % vtslab_package_gcs_url) - run("unzip -o %s" % vtslab_package_file_name) - run("rm %s" % vtslab_package_file_name) - - with settings(warn_only=True): - screen_list_result = run("screen -list") - lines = screen_list_result.split("\n") - for line in lines: - if "(Detached)" in line: - screen_name = line.split("\t")[1] - run("screen -S %s -X stuff \"^C\"" % screen_name) - run("screen -S %s -X stuff \"\033[A\"" % screen_name) - run("screen -S %s -X stuff \"^M\"" % screen_name) |