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