#!/usr/bin/python import paramiko import os import sys WORK_DIR = os.getenv('WORKDIR') sys.path.append(os.path.join(WORK_DIR, 'libraries', 'common')) from users import * # noqa REG = os.getenv('REG') REG_PORT = os.getenv('REG_PORT') REG_PATH = os.getenv('REG_PATH') IP = os.getenv('SUT_IP') CONTAINERS_DIR = os.path.join(WORK_DIR, 'resources', 'test_containers') CHARTS_DIR = os.path.join(WORK_DIR, 'resources', 'test_charts') def open_connection(host, user, password): print"Open paramiko connection to {} with user: {} pass: {}".format(host, user, password) client = paramiko.SSHClient() client.load_system_host_keys() client.set_missing_host_key_policy(paramiko.AutoAddPolicy) client.connect(host, username=user, password=password) return client def create_remote_dir(client, remote_dir): execute_command(client, "rm -rf {}".format(remote_dir)) execute_command(client, "mkdir -p {}".format(remote_dir)) def delete_remote_dir(client, remote_dir): execute_command(client, "rm -rf {}".format(remote_dir)) def execute_command(client, command): _, stdout, stderr = client.exec_command(command) print"The following command executed on remote: {}".format(command) stdout = stdout.read() print('stdout:', stdout) err = stderr.read() if err: raise Exception("The following error occured: {}".format(err)) else: return stdout def get_all_files_in_local_dir(local_dir, extension=""): all_files = list() if os.path.exists(local_dir): files = os.listdir(local_dir) for f in files: _, ext = os.path.splitext(f) if extension in ext: filepath = os.path.join(local_dir, f) print "filename:" + filepath if os.path.isdir(filepath): all_files.extend(get_all_files_in_local_dir(filepath)) else: all_files.append(filepath) else: print '{} folder does not exist'.format(local_dir) return all_files def upload_resources(client, local, remote): sftp = client.open_sftp() for f in local: remote_path = os.path.join("{}{}".format(remote, f.split(remote.split('/')[-1])[1])) remote_dir = remote_path.rsplit('/', 1)[0] execute_command(client, "mkdir -p {}".format(remote_dir)) sftp.put(f, remote_path) print"Upload {} from robot container to the SUT {}".format(local, remote) def load_docker_images_from_directory(client, remote_dir): command = "ls {}".format(remote_dir) docker_images = execute_command(client, command).splitlines() for image in docker_images: command = "docker load -i {}/{}".format(remote_dir, image) execute_command(client, command) image_name = image.rsplit('.tar')[0] print image_name command = "docker push {}:{}/{}/{}".format(REG, REG_PORT, REG_PATH, image_name) execute_command(client, command) def create_helm_packages(client, remote_dir): command = "helm repo list" stdout = execute_command(client, command) chart_repo = stdout.splitlines()[1].split()[1] command = "ls {}".format(remote_dir) helm_charts = execute_command(client, command).splitlines() for chart in helm_charts: command = "helm package {}/{}".format(remote_dir, chart) helm_package_path = execute_command(client, command) helm_package = helm_package_path.split(cloudadmin['username'] + '/')[1].rstrip() print helm_package command = "curl -sS -XPOST -H 'Content-Type: application/gzip' --data-binary @{} {}/charts/{}".format( helm_package, chart_repo, helm_package) execute_command(client, command) command = "rm -f {}".format(helm_package_path) execute_command(client, command) command = "helm repo update" execute_command(client, command) def main(): paramiko_client = open_connection(IP, cloudadmin['username'], cloudadmin['password']) remote_containers_dir = os.path.join("/home/{}/resources/test_containers".format(cloudadmin['username'])) container_images = get_all_files_in_local_dir(CONTAINERS_DIR, "tar") remote_test_charts_dir = os.path.join("/home/{}/resources/test_charts".format(cloudadmin['username'])) test_charts = get_all_files_in_local_dir(CHARTS_DIR) try: create_remote_dir(paramiko_client, remote_containers_dir) create_remote_dir(paramiko_client, remote_test_charts_dir) upload_resources(paramiko_client, container_images, remote_containers_dir) upload_resources(paramiko_client, test_charts, remote_test_charts_dir) load_docker_images_from_directory(paramiko_client, remote_containers_dir) create_helm_packages(paramiko_client, remote_test_charts_dir) delete_remote_dir(paramiko_client, remote_test_charts_dir) delete_remote_dir(paramiko_client, remote_containers_dir) finally: paramiko_client.close() if __name__ == "__main__": main()