12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- # -*- 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()
|