salt/tests/support/copyartifacts.py

81 lines
2.8 KiB
Python
Raw Normal View History

2017-10-24 16:07:03 +00:00
# -*- coding: utf-8 -*-
'''
Script for copying back xml junit files from tests
'''
from __future__ import absolute_import, print_function
2017-10-24 18:04:40 +00:00
import argparse # pylint: disable=minimum-python-version
2017-10-16 16:09:15 +00:00
import os
import paramiko
import subprocess
import 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)
2017-10-16 16:09:15 +00:00
def setup_transport(self):
2017-10-24 18:04:40 +00:00
# pylint: disable=minimum-python-version
2017-10-16 16:09:15 +00:00
config = yaml.load(subprocess.check_output(['bundle', 'exec', 'kitchen', 'diagnose', self.instance]))
2017-10-24 18:04:40 +00:00
# pylint: enable=minimum-python-version
2017-10-17 02:33:33 +00:00
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))
2017-10-16 16:09:15 +00:00
def download(self):
self._set_permissions()
2017-10-16 16:09:15 +00:00
for remote, local in self.artifacts:
if remote.endswith('/'):
for fxml in self.sftpclient.listdir(remote):
2017-10-17 14:43:47 +00:00
self._do_download(os.path.join(remote, fxml), os.path.join(local, os.path.basename(fxml)))
2017-10-16 16:09:15 +00:00
else:
2017-10-17 14:43:47 +00:00
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))
2017-10-16 16:09:15 +00:00
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()