# -*- coding: utf-8 -*- """ Script for copying back xml junit files from tests """ from __future__ import absolute_import, print_function import argparse # pylint: disable=minimum-python-version import os import subprocess import paramiko import salt.utils.yaml class DownloadArtifacts(object): def __init__(self, instance, artifacts): self.instance = instance self.artifacts = artifacts self.transport = self.setup_transport() self.sftpclient = paramiko.SFTPClient.from_transport(self.transport) def setup_transport(self): # pylint: disable=minimum-python-version config = salt.utils.yaml.safe_load( subprocess.check_output( ["bundle", "exec", "kitchen", "diagnose", self.instance] ) ) # pylint: enable=minimum-python-version state = config["instances"][self.instance]["state_file"] tport = config["instances"][self.instance]["transport"] transport = paramiko.Transport( (state["hostname"], state.get("port", tport.get("port", 22))) ) pkey = paramiko.rsakey.RSAKey( filename=state.get("ssh_key", tport.get("ssh_key", "~/.ssh/id_rsa")) ) transport.connect( username=state.get("username", tport.get("username", "root")), pkey=pkey ) return transport def _set_permissions(self): """ Make sure all xml files are readable by the world so that anyone can grab them """ for remote, _ in self.artifacts: self.transport.open_session().exec_command( "sudo chmod -R +r {}".format(remote) ) def download(self): self._set_permissions() for remote, local in self.artifacts: if remote.endswith("/"): for fxml in self.sftpclient.listdir(remote): self._do_download( os.path.join(remote, fxml), os.path.join(local, os.path.basename(fxml)), ) else: self._do_download(remote, os.path.join(local, os.path.basename(remote))) def _do_download(self, remote, local): print("Copying from {0} to {1}".format(remote, local)) try: self.sftpclient.get(remote, local) except IOError: print("Failed to copy: {0}".format(remote)) if __name__ == "__main__": parser = argparse.ArgumentParser(description="Jenkins Artifact Download Helper") parser.add_argument( "--instance", required=True, action="store", help="Instance on Test Kitchen to pull from", ) parser.add_argument( "--download-artifacts", dest="artifacts", nargs=2, action="append", metavar=("REMOTE_PATH", "LOCAL_PATH"), help="Download remote artifacts", ) args = parser.parse_args() downloader = DownloadArtifacts(args.instance, args.artifacts) downloader.download()