This repository has been archived on 2020-03-24. You can view files and clone it, but cannot push or open issues or pull requests.
quay/test/clients/clients_test.py

208 lines
6.7 KiB
Python

import os
import subprocess
import sys
import time
import unicodedata
from threading import Thread
from termcolor import colored
from test.clients.client import DockerClient, Command, FileCopy
def remove_control_characters(s):
return "".join(ch for ch in unicode(s) if unicodedata.category(ch)[0]!="C")
# These tuples are the box&version and the client to use.
BOXES = [
("kleesc/coreos --box-version=1911.4.0", DockerClient()), # docker 18.06.1
("kleesc/coreos --box-version=1800.7.0", DockerClient()), # docker 18.03.1
("kleesc/coreos --box-version=1688.5.3", DockerClient()), # docker 17.12.1
("kleesc/coreos --box-version=1632.3.0", DockerClient()), # docker 17.09.1
("kleesc/coreos --box-version=1576.5.0", DockerClient()), # docker 17.09.0
("kleesc/coreos --box-version=1520.9.0", DockerClient()), # docker 1.12.6
("kleesc/coreos --box-version=1235.6.0", DockerClient()), # docker 1.12.3
("kleesc/coreos --box-version=1185.5.0", DockerClient()), # docker 1.11.2
("kleesc/coreos --box-version=1122.3.0", DockerClient()), # docker 1.10.3
("kleesc/coreos --box-version=899.17.0", DockerClient()), # docker 1.9.1
("kleesc/coreos --box-version=835.13.0", DockerClient()), # docker 1.8.3
("kleesc/coreos --box-version=766.5.0", DockerClient()), # docker 1.7.1
("kleesc/coreos --box-version=717.3.0", DockerClient()), # docker 1.6.2
("kleesc/coreos --box-version=647.2.0", DockerClient()), # docker 1.5.0
("kleesc/coreos --box-version=557.2.0", DockerClient()), # docker 1.4.1
("kleesc/coreos --box-version=522.6.0", DockerClient()), # docker 1.3.3
("yungsang/coreos --box-version=1.3.7", DockerClient()), # docker 1.3.2
("yungsang/coreos --box-version=1.2.9", DockerClient()), # docker 1.2.0
("yungsang/coreos --box-version=1.1.5", DockerClient()), # docker 1.1.2
("yungsang/coreos --box-version=1.0.0", DockerClient()), # docker 1.0.1
("yungsang/coreos --box-version=0.9.10", DockerClient()), # docker 1.0.0
("yungsang/coreos --box-version=0.9.6", DockerClient()), # docker 0.11.1
("yungsang/coreos --box-version=0.9.1", DockerClient(True)), # docker 0.10.0
("yungsang/coreos --box-version=0.3.1", DockerClient(True)),
]
def _check_vagrant():
vagrant_command = 'vagrant'
vagrant = any(os.access(os.path.join(path, vagrant_command), os.X_OK)
for path in os.environ.get('PATH').split(':'))
vagrant_plugins = subprocess.check_output([vagrant_command, 'plugin', 'list'])
return (vagrant, 'vagrant-scp' in vagrant_plugins)
class CommandFailedException(Exception):
pass
class SpinOutputter(Thread):
def __init__(self, initial_message):
super(SpinOutputter, self).__init__()
self.previous_line = ''
self.next_line = initial_message
self.running = True
self.daemon = True
@staticmethod
def spinning_cursor():
while 1:
for cursor in '|/-\\':
yield cursor
def set_next(self, text):
first_line = text.split('\n')[0].strip()
first_line = remove_control_characters(first_line)
self.next_line = first_line[:80]
def _clear_line(self):
sys.stdout.write('\r')
sys.stdout.write(' ' * (len(self.previous_line) + 2))
sys.stdout.flush()
sys.stdout.write('\r')
sys.stdout.flush()
self.previous_line = ''
def stop(self):
self._clear_line()
self.running = False
def run(self):
spinner = SpinOutputter.spinning_cursor()
while self.running:
self._clear_line()
sys.stdout.write('\r')
sys.stdout.flush()
sys.stdout.write(next(spinner))
sys.stdout.write(" ")
sys.stdout.write(colored(self.next_line, attrs=['dark']))
sys.stdout.flush()
self.previous_line = self.next_line
time.sleep(0.25)
def _run_and_wait(command, error_allowed=False):
# Run the command itself.
outputter = SpinOutputter('Running command %s' % command)
outputter.start()
output = ''
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in iter(process.stdout.readline, ''):
output += line
outputter.set_next(line)
result = process.wait()
outputter.stop()
if result != 0 and not error_allowed:
print colored('>>> Command `%s` Failed:' % command, 'red')
print output
raise CommandFailedException()
return output
def _indent(text, amount):
return ''.join((' ' * amount) + line for line in text.splitlines(True))
def _run_commands(commands):
last_result = None
for command in commands:
if isinstance(command, Command):
last_result = _run_and_wait(['vagrant', 'ssh', '-c', command.command])
else:
last_result = _run_and_wait(['vagrant', 'scp', command.source, command.destination])
return last_result
def _run_box(box, client, registry):
vagrant, vagrant_scp = _check_vagrant()
if not vagrant:
print("vagrant command not found")
return
if not vagrant_scp:
print("vagrant-scp plugin not installed")
return
namespace = 'devtable'
repo_name = 'testrepo%s' % int(time.time())
username = 'devtable'
password = 'password'
print colored('>>> Box: %s' % box, attrs=['bold'])
print colored('>>> Starting box', 'yellow')
_run_and_wait(['vagrant', 'destroy', '-f'], error_allowed=True)
_run_and_wait(['rm', 'Vagrantfile'], error_allowed=True)
_run_and_wait(['vagrant', 'init'] + box.split(' '))
_run_and_wait(['vagrant', 'up', '--provider', 'virtualbox'])
print colored('>>> Setting up runtime', 'yellow')
_run_commands(client.setup_client(registry))
print colored('>>> Client version', 'cyan')
docker_version = _run_commands(client.print_version())
print _indent(docker_version, 4)
print colored('>>> Populating test image', 'yellow')
_run_commands(client.populate_test_image(registry, namespace, repo_name))
print colored('>>> Testing login', 'cyan')
_run_commands(client.login(registry, username, password))
print colored('>>> Testing push', 'cyan')
_run_commands(client.push(registry, namespace, repo_name))
print colored('>>> Removing all images', 'yellow')
_run_commands(client.pre_pull_cleanup(registry, namespace, repo_name))
print colored('>>> Testing pull', 'cyan')
_run_commands(client.pull(registry, namespace, repo_name))
print colored('>>> Verifying', 'cyan')
_run_commands(client.verify(registry, namespace, repo_name))
print colored('>>> Tearing down box', 'magenta')
_run_and_wait(['vagrant', 'destroy', '-f'], error_allowed=True)
print colored('>>> Successfully tested box %s' % box, 'green')
print ""
def test_clients(registry='10.0.2.2:5000'):
print colored('>>> Running against registry ', attrs=['bold']) + colored(registry, 'cyan')
for box, client in BOXES:
try:
_run_box(box, client, registry)
except CommandFailedException:
sys.exit(-1)
if __name__ == "__main__":
test_clients(sys.argv[1] if len(sys.argv) > 1 else '10.0.2.2:5000')