def test_submit_job_failure(env, job, runs_remotely): from django_remote_submission.models import Job, Log from django_remote_submission.tasks import submit_job_to_server submit_job_to_server(job.pk, env.remote_password, remote=runs_remotely) job = Job.objects.get(pk=job.pk) assert job.status == Job.STATUS.failure
def test_submit_job_log_policy_log_none(env, job, runs_remotely): from django_remote_submission.models import Job, Log from django_remote_submission.tasks import submit_job_to_server, LogPolicy submit_job_to_server(job.pk, env.remote_password, remote=runs_remotely, log_policy=LogPolicy.LOG_NONE) assert Log.objects.count() == 0
def test_submit_job_log_policy_log_total(env, job, runs_remotely): from django_remote_submission.models import Job, Log from django_remote_submission.tasks import submit_job_to_server, LogPolicy submit_job_to_server(job.pk, env.remote_password, remote=runs_remotely, log_policy=LogPolicy.LOG_TOTAL) assert Log.objects.count() == 1 log = Log.objects.get() assert log.content == ''.join('line: {}\n'.format(i) for i in range(5)) assert log.stream == 'stdout'
def test_submit_job_timeout(env, job, runs_remotely): from django_remote_submission.models import Job, Log from django_remote_submission.tasks import submit_job_to_server, LogPolicy import datetime submit_job_to_server(job.pk, env.remote_password, remote=runs_remotely, timeout=datetime.timedelta(seconds=1)) assert Log.objects.count() == 3 job = Job.objects.get(pk=job.pk) assert job.status == Job.STATUS.failure
def test_submit_job_deploy_key(env, job_gen, interpreter_gen, runs_remotely): from django_remote_submission.models import Job, Log from django_remote_submission.tasks import submit_job_to_server, LogPolicy import os.path import time try: from shlex import quote as cmd_quote except ImportError: from pipes import quote as cmd_quote sh = interpreter_gen( name='sh', path='/usr/bin/env', arguments=['sh'], ) python = interpreter_gen( name='Python', path='/usr/bin/env', arguments=['python', '-u'], ) with open(os.path.expanduser('~/.ssh/id_rsa.pub'), 'rt') as f: key = f.read().strip() remove_existing_key_job = job_gen( program='''\ sed -i.bak -e /{key}/d ~/.ssh/authorized_keys '''.format(key=cmd_quote(key.replace('/', '\/'))), interpreter=sh, ) submit_job_to_server(remove_existing_key_job.pk, env.remote_password, remote=runs_remotely) add_key_job = job_gen( program='''\ true ''', interpreter=sh, ) submit_job_to_server(add_key_job.pk, env.remote_password, remote=runs_remotely)
def test_submit_job_multiple_streams(env, job, wrapper_cls): from django_remote_submission.models import Job, Log from django_remote_submission.tasks import submit_job_to_server import datetime submit_job_to_server(job.pk, env.remote_password, wrapper_cls=wrapper_cls) assert Log.objects.count() == 5 min_delta = datetime.timedelta(seconds=0.05) max_delta = datetime.timedelta(seconds=0.3) for log1, log2 in pairwise(Log.objects.all()): delta = log2.time - log1.time assert min_delta <= delta <= max_delta for i, log in enumerate(Log.objects.all()): assert log.content == 'line: {}\n'.format(i) if i % 2 == 0: assert log.stream == 'stdout' else: assert log.stream == 'stderr'
def test_submit_job_normal_usage(env, job, job_model_saved, runs_remotely): from django_remote_submission.models import Job, Log from django_remote_submission.tasks import submit_job_to_server import datetime submit_job_to_server(job.pk, env.remote_password, remote=runs_remotely) job = Job.objects.get(pk=job.pk) assert job.status == Job.STATUS.success assert Log.objects.count() == 5 min_delta = datetime.timedelta(microseconds=100) max_delta = datetime.timedelta(seconds=0.3) for log1, log2 in pairwise(Log.objects.all()): delta = log2.time - log1.time assert min_delta <= delta <= max_delta for i, log in enumerate(Log.objects.all()): assert log.content == 'line: {}\n'.format(i) assert job_model_saved.call_count == 2
def test_submit_job_modified_files_negative_pattern(env, job, runs_remotely): from django_remote_submission.models import Job, Log, Result from django_remote_submission.tasks import submit_job_to_server, LogPolicy import re results = submit_job_to_server(job.pk, env.remote_password, remote=runs_remotely, store_results=['*', '![34].txt']) assert len(results) == 3 assert sorted(results.keys()) == \ ['0.txt', '1.txt', '2.txt'] for (result_fname, result_pk) in results.items(): result = Result.objects.get(pk=result_pk) i = int(re.match(r'^([0-9])\.txt', result_fname).group(1)) assert result.local_file.read().decode('utf-8') == \ 'line: {}\n'.format(i)
def test_submit_job_modified_files(env, job, runs_remotely): from django_remote_submission.models import Job, Log, Result from django_remote_submission.tasks import submit_job_to_server, LogPolicy import re results = submit_job_to_server(job.pk, env.remote_password, remote=runs_remotely) assert len(results) == 5 assert sorted(results.keys()) == \ ['0.txt', '1.txt', '2.txt', '3.txt', '4.txt'] for (result_fname, result_pk) in results.items(): result = Result.objects.get(pk=result_pk) i = int(re.match(r'^([0-9])\.txt', result_fname).group(1)) assert result.local_file.read().decode('utf-8') == \ 'line: {}\n'.format(i) matcher = re.compile(r'results/{}/[0-4].txt'.format(job.uuid)) assert matcher.match(result.local_file.name) is not None