예제 #1
0
def test_launch_config_has_unprompted_vars(survey_spec_factory):
    jt = JobTemplate(survey_enabled=True,
                     survey_spec=survey_spec_factory(
                         ['question1', 'question2']))
    unprompted_config = JobLaunchConfig(extra_data={
        'question1': 'foobar',
        'question4': 'foobar'
    })
    assert unprompted_config.has_unprompted(jt)
    allowed_config = JobLaunchConfig(extra_data={
        'question1': 'foobar',
        'question2': 'foobar'
    })
    assert not allowed_config.has_unprompted(jt)
예제 #2
0
 def test_project_update_metavars(self):
     data = Job(
         name='fake-job',
         pk=40,
         id=40,
         launch_type='manual',
         project=Project(name='jobs-sync', scm_revision='12345444'),
         job_template=JobTemplate(name='jobs-jt', id=92, pk=92),
     ).awx_meta_vars()
     for name in JOB_VARIABLE_PREFIXES:
         assert data['{}_project_revision'.format(name)] == '12345444'
         assert '{}_job_template_id'.format(name) in data
         assert data['{}_job_template_id'.format(name)] == 92
         assert data['{}_job_template_name'.format(name)] == 'jobs-jt'
예제 #3
0
def mk_job_template(
    name,
    job_type='run',
    organization=None,
    inventory=None,
    credential=None,
    network_credential=None,
    cloud_credential=None,
    persisted=True,
    extra_vars='',
    project=None,
    spec=None,
    webhook_service='',
):
    if extra_vars:
        extra_vars = json.dumps(extra_vars)

    jt = JobTemplate(name=name,
                     job_type=job_type,
                     extra_vars=extra_vars,
                     webhook_service=webhook_service,
                     playbook='helloworld.yml')

    jt.inventory = inventory
    if jt.inventory is None:
        jt.ask_inventory_on_launch = True

    if persisted and credential:
        jt.save()
        jt.credentials.add(credential)
        if jt.machine_credential is None:
            jt.ask_credential_on_launch = True

    jt.project = project

    if spec is not None:
        jt.survey_spec = spec
        jt.survey_enabled = True

    if persisted:
        jt.save()
        if cloud_credential:
            cloud_credential.save()
            jt.credentials.add(cloud_credential)
        if network_credential:
            network_credential.save()
            jt.credentials.add(network_credential)
        jt.save()
    return jt
예제 #4
0
def test_cloud_credential_type_mutability(patch, organization, admin, credentialtype_ssh,
                                          credentialtype_aws):
    cred = Credential(
        credential_type=credentialtype_aws,
        name='Best credential ever',
        organization=organization,
        inputs={
            'username': u'jim',
            'password': u'pass'
        }
    )
    cred.save()

    jt = JobTemplate()
    jt.save()
    jt.credentials.add(cred)

    def _change_credential_type():
        return patch(
            reverse('api:credential_detail', kwargs={'pk': cred.pk}),
            {
                'credential_type': credentialtype_ssh.pk,
                'inputs': {
                    'username': u'jim',
                    'password': u'pass'
                }
            },
            admin
        )

    response = _change_credential_type()
    assert response.status_code == 400
    expected = ['You cannot change the credential type of the credential, '
                'as it may break the functionality of the resources using it.']
    assert response.data['credential_type'] == expected

    response = patch(
        reverse('api:credential_detail', kwargs={'pk': cred.pk}),
        {'name': 'Worst credential ever'},
        admin
    )
    assert response.status_code == 200
    assert Credential.objects.get(pk=cred.pk).name == 'Worst credential ever'

    jt.delete()
    response = _change_credential_type()
    assert response.status_code == 200
예제 #5
0
def test_survey_encryption_defaults(survey_spec_factory, question_type, default, maxlen, kwargs, expected):
    spec = survey_spec_factory([
        {
            "required": True,
            "variable": "x",
            "min": 0,
            "max": maxlen,
            "type": question_type
        },
    ])
    if default is not None:
        spec['spec'][0]['default'] = default
    else:
        spec['spec'][0].pop('default', None)
    jt = JobTemplate(name="test-jt", survey_spec=spec, survey_enabled=True)
    extra_vars = json.loads(jt._update_unified_job_kwargs({}, kwargs).get('extra_vars'))
    assert extra_vars == expected
예제 #6
0
 def test_project_update_metavars(self):
     data = Job(
         name='fake-job',
         pk=40, id=40,
         launch_type='manual',
         project=Project(
             name='jobs-sync',
             scm_revision='12345444'
         ),
         job_template=JobTemplate(
             name='jobs-jt',
             id=92, pk=92
         )
     ).awx_meta_vars()
     assert data['awx_project_revision'] == '12345444'
     assert 'tower_job_template_id' in data
     assert data['tower_job_template_id'] == 92
     assert data['tower_job_template_name'] == 'jobs-jt'
예제 #7
0
def test_optional_survey_question_defaults(
        survey_spec_factory, question_type, default, min, max, expect_use, expect_value):
    spec = survey_spec_factory([
        {
            "required": False,
            "default": default,
            "choices": "orange\nmilk\nchocolate\ncoffee",
            "variable": "c",
            "min": min,
            "max": max,
            "type": question_type
        },
    ])
    jt = JobTemplate(name="test-jt", survey_spec=spec, survey_enabled=True)
    defaulted_extra_vars = jt._update_unified_job_kwargs({}, {})
    element = spec['spec'][0]
    if expect_use:
        assert jt._survey_element_validation(element, {element['variable']: element['default']}) == []
    else:
        assert jt._survey_element_validation(element, {element['variable']: element['default']})
    if expect_use:
        assert json.loads(defaulted_extra_vars['extra_vars'])['c'] == expect_value
    else:
        assert 'c' not in defaulted_extra_vars['extra_vars']
예제 #8
0
def test_display_survey_spec_encrypts_default(survey_spec_factory):
    spec = survey_spec_factory('var2')
    spec['spec'][0]['type'] = 'password'
    spec['spec'][0]['default'] = 'some-default'
    jt = JobTemplate(name="test-jt", survey_spec=spec, survey_enabled=True)
    assert jt.display_survey_spec()['spec'][0]['default'] == '$encrypted$'
예제 #9
0
    response = put(reverse('api:credential_detail', kwargs={'pk': cred.pk}),
                   params, admin)
    assert response.status_code == 200

    cred = Credential.objects.all()[:1].get()
    assert cred.inputs['username'] == 'joe'
    assert 'password' not in cred.inputs


@pytest.mark.django_db
@pytest.mark.parametrize(
    'relation, related_obj',
    [
        ['ad_hoc_commands', AdHocCommand()],
        ['unifiedjobs', Job()],
        ['unifiedjobtemplates', JobTemplate()],
        ['unifiedjobtemplates',
         InventorySource(source='ec2')],
        ['projects', Project()],
        ['workflowjobnodes', WorkflowJobNode()],
    ],
)
def test_credential_type_mutability(patch, organization, admin,
                                    credentialtype_ssh, credentialtype_aws,
                                    relation, related_obj):
    cred = Credential(credential_type=credentialtype_ssh,
                      name='Best credential ever',
                      organization=organization,
                      inputs={
                          'username': u'jim',
                          'password': u'pass'
예제 #10
0
def job(container_group):
    return Job(pk=1, id=1, project=Project(), instance_group=container_group, inventory=Inventory(), job_template=JobTemplate(id=1, name='foo'))
예제 #11
0
def job_template(project):
    jt = JobTemplate(name='unit-test-jt', project=project)
    apply_fake_roles(jt)
    return jt