예제 #1
0
def test_job_launch_JT_with_credentials(machine_credential, credential,
                                        net_credential, kube_credential,
                                        deploy_jobtemplate):
    deploy_jobtemplate.ask_credential_on_launch = True
    deploy_jobtemplate.save()

    kv = dict(credentials=[
        credential.pk, net_credential.pk, machine_credential.pk,
        kube_credential.pk
    ])
    serializer = JobLaunchSerializer(data=kv,
                                     context={'template': deploy_jobtemplate})
    validated = serializer.is_valid()
    assert validated, serializer.errors

    kv['credentials'] = [
        credential, net_credential, machine_credential, kube_credential
    ]  # convert to internal value
    prompted_fields, ignored_fields, errors = deploy_jobtemplate._accept_or_ignore_job_kwargs(
        _exclude_errors=['required', 'prompts'], **kv)
    job_obj = deploy_jobtemplate.create_unified_job(**prompted_fields)

    creds = job_obj.credentials.all()
    assert len(creds) == 4
    assert credential in creds
    assert net_credential in creds
    assert machine_credential in creds
    assert kube_credential in creds
예제 #2
0
def test_job_launch_JT_enforces_unique_extra_credential_kinds(
        machine_credential, credentialtype_aws, deploy_jobtemplate):
    """
    JT launching should require that extra_credentials have distinct CredentialTypes
    """
    pks = []
    for i in range(2):
        aws = Credential.objects.create(name='cred-%d' % i,
                                        credential_type=credentialtype_aws,
                                        inputs={
                                            'username': '******',
                                            'password': '******'
                                        })
        aws.save()
        pks.append(aws.pk)

    kv = dict(extra_credentials=pks, credential=machine_credential.id)
    serializer = JobLaunchSerializer(instance=deploy_jobtemplate,
                                     data=kv,
                                     context={
                                         'obj': deploy_jobtemplate,
                                         'data': kv,
                                         'passwords': {}
                                     })
    validated = serializer.is_valid()
    assert validated is False
예제 #3
0
def test_job_launch_JT_with_extra_credentials(machine_credential, credential,
                                              net_credential,
                                              deploy_jobtemplate):
    deploy_jobtemplate.ask_credential_on_launch = True
    deploy_jobtemplate.save()

    kv = dict(extra_credentials=[credential.pk, net_credential.pk],
              credential=machine_credential.id)
    serializer = JobLaunchSerializer(instance=deploy_jobtemplate,
                                     data=kv,
                                     context={
                                         'obj': deploy_jobtemplate,
                                         'data': kv,
                                         'passwords': {}
                                     })
    validated = serializer.is_valid()
    assert validated

    prompted_fields, ignored_fields = deploy_jobtemplate._accept_or_ignore_job_kwargs(
        **kv)
    job_obj = deploy_jobtemplate.create_unified_job(**prompted_fields)

    extra_creds = job_obj.extra_credentials.all()
    assert len(extra_creds) == 2
    assert credential in extra_creds
    assert net_credential in extra_creds
def test_job_launch_with_default_creds(machine_credential, vault_credential,
                                       deploy_jobtemplate):
    deploy_jobtemplate.ask_credential_on_launch = True
    deploy_jobtemplate.credentials.add(machine_credential)
    deploy_jobtemplate.credentials.add(vault_credential)
    kv = dict()
    serializer = JobLaunchSerializer(data=kv,
                                     context={'template': deploy_jobtemplate})
    validated = serializer.is_valid()
    assert validated

    prompted_fields, ignored_fields, errors = deploy_jobtemplate._accept_or_ignore_job_kwargs(
        **kv)
    job_obj = deploy_jobtemplate.create_unified_job(**prompted_fields)
    assert job_obj.credential == machine_credential.pk
    assert job_obj.vault_credential == vault_credential.pk
예제 #5
0
def test_job_launch_JT_with_invalid_extra_credentials(machine_credential,
                                                      deploy_jobtemplate, pks,
                                                      error_msg):
    deploy_jobtemplate.ask_credential_on_launch = True
    deploy_jobtemplate.save()

    kv = dict(extra_credentials=pks, credential=machine_credential.id)
    serializer = JobLaunchSerializer(instance=deploy_jobtemplate,
                                     data=kv,
                                     context={
                                         'obj': deploy_jobtemplate,
                                         'data': kv,
                                         'passwords': {}
                                     })
    validated = serializer.is_valid()
    assert validated is False
예제 #6
0
def test_job_launch_with_no_credentials(deploy_jobtemplate,
                                        ask_credential_on_launch):
    deploy_jobtemplate.credential = None
    deploy_jobtemplate.vault_credential = None
    deploy_jobtemplate.ask_credential_on_launch = ask_credential_on_launch
    serializer = JobLaunchSerializer(instance=deploy_jobtemplate,
                                     data={},
                                     context={
                                         'obj': deploy_jobtemplate,
                                         'data': {},
                                         'passwords': {}
                                     })
    validated = serializer.is_valid()
    assert validated is False
    assert serializer.errors['credential'] == [
        "Job Template 'credential' is missing or undefined."
    ]
def test_job_launch_with_empty_creds(machine_credential, vault_credential,
                                     deploy_jobtemplate, credential):
    deploy_jobtemplate.ask_credential_on_launch = True
    deploy_jobtemplate.credentials.add(machine_credential)
    deploy_jobtemplate.credentials.add(vault_credential)
    # `credentials` list is strictly those already present on deploy_jobtemplate
    kv = dict(credentials=[
        credential.pk, machine_credential.pk, vault_credential.pk
    ])
    serializer = JobLaunchSerializer(data=kv,
                                     context={'template': deploy_jobtemplate})
    validated = serializer.is_valid()
    assert validated, serializer.errors

    prompted_fields, ignored_fields, errors = deploy_jobtemplate._accept_or_ignore_job_kwargs(
        **serializer.validated_data)
    job_obj = deploy_jobtemplate.create_unified_job(**prompted_fields)
    assert job_obj.credential is deploy_jobtemplate.credential
    assert job_obj.vault_credential is deploy_jobtemplate.vault_credential
예제 #8
0
def test_job_launch_with_only_vault_credential(vault_credential,
                                               deploy_jobtemplate):
    deploy_jobtemplate.credential = None
    deploy_jobtemplate.vault_credential = vault_credential
    serializer = JobLaunchSerializer(instance=deploy_jobtemplate,
                                     data={},
                                     context={
                                         'obj': deploy_jobtemplate,
                                         'data': {},
                                         'passwords': {}
                                     })
    validated = serializer.is_valid()
    assert validated

    prompted_fields, ignored_fields = deploy_jobtemplate._accept_or_ignore_job_kwargs(
        **{})
    job_obj = deploy_jobtemplate.create_unified_job(**prompted_fields)

    assert job_obj.vault_credential.pk == vault_credential.pk
예제 #9
0
def test_job_launch_JT_enforces_unique_credentials_kinds(
        machine_credential, credentialtype_aws, deploy_jobtemplate):
    """
    JT launching should require that credentials have distinct CredentialTypes
    """
    creds = []
    for i in range(2):
        aws = Credential.objects.create(name='cred-%d' % i,
                                        credential_type=credentialtype_aws,
                                        inputs={
                                            'username': '******',
                                            'password': '******'
                                        })
        aws.save()
        creds.append(aws)

    kv = dict(credentials=creds, credential=machine_credential.id)
    serializer = JobLaunchSerializer(data=kv,
                                     context={'template': deploy_jobtemplate})
    validated = serializer.is_valid()
    assert not validated
예제 #10
0
def test_job_launch_with_vault_credential_and_prompted_machine_cred(
        machine_credential, vault_credential, deploy_jobtemplate):
    deploy_jobtemplate.credential = None
    deploy_jobtemplate.ask_credential_on_launch = True
    deploy_jobtemplate.vault_credential = vault_credential
    kv = dict(credential=machine_credential.id)
    serializer = JobLaunchSerializer(instance=deploy_jobtemplate,
                                     data=kv,
                                     context={
                                         'obj': deploy_jobtemplate,
                                         'data': kv,
                                         'passwords': {}
                                     })
    validated = serializer.is_valid()
    assert validated

    prompted_fields, ignored_fields = deploy_jobtemplate._accept_or_ignore_job_kwargs(
        **kv)
    job_obj = deploy_jobtemplate.create_unified_job(**prompted_fields)
    assert job_obj.credential.pk == machine_credential.pk
    assert job_obj.vault_credential.pk == vault_credential.pk
예제 #11
0
def test_job_launch_JT_with_validation(machine_credential, credential,
                                       deploy_jobtemplate):
    deploy_jobtemplate.extra_vars = '{"job_template_var": 3}'
    deploy_jobtemplate.ask_credential_on_launch = True
    deploy_jobtemplate.ask_variables_on_launch = True
    deploy_jobtemplate.save()

    kv = dict(extra_vars={"job_launch_var": 4},
              credentials=[machine_credential.pk, credential.pk])
    serializer = JobLaunchSerializer(data=kv,
                                     context={'template': deploy_jobtemplate})
    validated = serializer.is_valid()
    assert validated, serializer.errors

    kv['credentials'] = [machine_credential]  # conversion to internal value
    job_obj = deploy_jobtemplate.create_unified_job(**kv)

    final_job_extra_vars = yaml.load(job_obj.extra_vars)
    assert 'job_launch_var' in final_job_extra_vars
    assert 'job_template_var' in final_job_extra_vars
    assert set([cred.pk for cred in job_obj.credentials.all()
                ]) == set([machine_credential.id, credential.id])
예제 #12
0
def test_job_launch_JT_with_validation(machine_credential, deploy_jobtemplate):
    deploy_jobtemplate.extra_vars = '{"job_template_var": 3}'
    deploy_jobtemplate.ask_credential_on_launch = True
    deploy_jobtemplate.save()

    kv = dict(extra_vars={"job_launch_var": 4},
              credential=machine_credential.id)
    serializer = JobLaunchSerializer(instance=deploy_jobtemplate,
                                     data=kv,
                                     context={
                                         'obj': deploy_jobtemplate,
                                         'data': kv,
                                         'passwords': {}
                                     })
    validated = serializer.is_valid()
    assert validated

    job_obj = deploy_jobtemplate.create_unified_job(**kv)

    final_job_extra_vars = yaml.load(job_obj.extra_vars)
    assert 'job_template_var' in final_job_extra_vars
    assert 'job_launch_var' in final_job_extra_vars
    assert job_obj.credential.id == machine_credential.id
예제 #13
0
def test_primary_key_related_field():
    # We are testing if the PrimaryKeyRelatedField in this serializer can take dictionary.
    # PrimaryKeyRelatedField should not be able to take dictionary as input, and should raise a ValidationError.
    data = {'credentials': {'1': '2', '3': '4'}}
    with pytest.raises(ValidationError):
        JobLaunchSerializer(data=data)