# -*- 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 paramiko import subprocess 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()