示例#1
0
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
示例#2
0
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
示例#3
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'
示例#4
0
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
示例#5
0
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)
示例#6
0
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'
示例#7
0
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
示例#8
0
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)
示例#9
0
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