mirror of
https://github.com/ansible/awx.git
synced 2026-03-21 02:47:35 -02:30
update tests to conform to new credential behavior and launch response
This commit is contained in:
@@ -49,7 +49,7 @@ def test_job_ignore_unprompted_vars(runtime_data, job_template_prompts, post, us
|
|||||||
response = post(reverse('api:job_template_launch', args=[job_template.pk]),
|
response = post(reverse('api:job_template_launch', args=[job_template.pk]),
|
||||||
runtime_data, user('admin', True))
|
runtime_data, user('admin', True))
|
||||||
|
|
||||||
assert response.status_code == 202
|
assert response.status_code == 201
|
||||||
job_id = response.data['job']
|
job_id = response.data['job']
|
||||||
job_obj = Job.objects.get(pk=job_id)
|
job_obj = Job.objects.get(pk=job_id)
|
||||||
|
|
||||||
@@ -80,7 +80,7 @@ def test_job_accept_prompted_vars(runtime_data, job_template_prompts, post, user
|
|||||||
response = post(reverse('api:job_template_launch', args=[job_template.pk]),
|
response = post(reverse('api:job_template_launch', args=[job_template.pk]),
|
||||||
runtime_data, user('admin', True))
|
runtime_data, user('admin', True))
|
||||||
|
|
||||||
assert response.status_code == 202
|
assert response.status_code == 201
|
||||||
job_id = response.data['job']
|
job_id = response.data['job']
|
||||||
job_obj = Job.objects.get(pk=job_id)
|
job_obj = Job.objects.get(pk=job_id)
|
||||||
|
|
||||||
@@ -150,7 +150,7 @@ def test_job_launch_fails_without_inventory_access(deploy_jobtemplate, machine_c
|
|||||||
response = post(reverse('api:job_template_launch',
|
response = post(reverse('api:job_template_launch',
|
||||||
args=[deploy_jobtemplate.pk]), {}, common_user)
|
args=[deploy_jobtemplate.pk]), {}, common_user)
|
||||||
|
|
||||||
assert response.status_code == 202
|
assert response.status_code == 201
|
||||||
|
|
||||||
# Assure that giving an inventory without access to the inventory blocks the launch
|
# Assure that giving an inventory without access to the inventory blocks the launch
|
||||||
new_inv = deploy_jobtemplate.project.organization.inventories.create(name="user-can-not-use")
|
new_inv = deploy_jobtemplate.project.organization.inventories.create(name="user-can-not-use")
|
||||||
@@ -170,7 +170,7 @@ def test_job_relaunch_prompted_vars(runtime_data, job_template_prompts, post, us
|
|||||||
first_response = post(reverse('api:job_template_launch', args=[job_template.pk]),
|
first_response = post(reverse('api:job_template_launch', args=[job_template.pk]),
|
||||||
runtime_data, admin_user)
|
runtime_data, admin_user)
|
||||||
|
|
||||||
assert first_response.status_code == 202
|
assert first_response.status_code == 201
|
||||||
original_job = Job.objects.get(pk=first_response.data['job'])
|
original_job = Job.objects.get(pk=first_response.data['job'])
|
||||||
|
|
||||||
# Launch a second job as a relaunch of the first
|
# Launch a second job as a relaunch of the first
|
||||||
@@ -179,7 +179,7 @@ def test_job_relaunch_prompted_vars(runtime_data, job_template_prompts, post, us
|
|||||||
relaunched_job = Job.objects.get(pk=second_response.data['job'])
|
relaunched_job = Job.objects.get(pk=second_response.data['job'])
|
||||||
|
|
||||||
# Check that job data matches the original runtime variables
|
# Check that job data matches the original runtime variables
|
||||||
assert first_response.status_code == 202
|
assert first_response.status_code == 201
|
||||||
assert 'job_launch_var' in yaml.load(relaunched_job.extra_vars)
|
assert 'job_launch_var' in yaml.load(relaunched_job.extra_vars)
|
||||||
assert relaunched_job.limit == runtime_data['limit']
|
assert relaunched_job.limit == runtime_data['limit']
|
||||||
assert relaunched_job.job_type == runtime_data['job_type']
|
assert relaunched_job.job_type == runtime_data['job_type']
|
||||||
@@ -189,6 +189,7 @@ def test_job_relaunch_prompted_vars(runtime_data, job_template_prompts, post, us
|
|||||||
@pytest.mark.django_db
|
@pytest.mark.django_db
|
||||||
def test_job_launch_JT_with_validation(machine_credential, deploy_jobtemplate):
|
def test_job_launch_JT_with_validation(machine_credential, deploy_jobtemplate):
|
||||||
deploy_jobtemplate.extra_vars = '{"job_template_var": 3}'
|
deploy_jobtemplate.extra_vars = '{"job_template_var": 3}'
|
||||||
|
deploy_jobtemplate.credential = None
|
||||||
deploy_jobtemplate.save()
|
deploy_jobtemplate.save()
|
||||||
|
|
||||||
kv = dict(extra_vars={"job_launch_var": 4}, credential=machine_credential.id)
|
kv = dict(extra_vars={"job_launch_var": 4}, credential=machine_credential.id)
|
||||||
@@ -205,6 +206,7 @@ def test_job_launch_JT_with_validation(machine_credential, deploy_jobtemplate):
|
|||||||
assert result
|
assert result
|
||||||
assert 'job_template_var' in final_job_extra_vars
|
assert 'job_template_var' in final_job_extra_vars
|
||||||
assert 'job_launch_var' in final_job_extra_vars
|
assert 'job_launch_var' in final_job_extra_vars
|
||||||
|
assert job_obj.credential.id == machine_credential.id
|
||||||
|
|
||||||
@pytest.mark.django_db
|
@pytest.mark.django_db
|
||||||
@pytest.mark.job_runtime_vars
|
@pytest.mark.job_runtime_vars
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ class JobTemplateLaunchTest(BaseJobTestMixin, django.test.TransactionTestCase):
|
|||||||
def test_credential_implicit(self):
|
def test_credential_implicit(self):
|
||||||
# Implicit, attached credentials
|
# Implicit, attached credentials
|
||||||
with self.current_user(self.user_sue):
|
with self.current_user(self.user_sue):
|
||||||
response = self.post(self.launch_url, {}, expect=202)
|
response = self.post(self.launch_url, {}, expect=201)
|
||||||
j = Job.objects.get(pk=response['job'])
|
j = Job.objects.get(pk=response['job'])
|
||||||
self.assertTrue(j.status == 'new')
|
self.assertTrue(j.status == 'new')
|
||||||
|
|
||||||
@@ -76,7 +76,7 @@ class JobTemplateLaunchTest(BaseJobTestMixin, django.test.TransactionTestCase):
|
|||||||
# Sending extra_vars as a JSON string, implicit credentials
|
# Sending extra_vars as a JSON string, implicit credentials
|
||||||
with self.current_user(self.user_sue):
|
with self.current_user(self.user_sue):
|
||||||
data = dict(extra_vars = '{\"a\":3}')
|
data = dict(extra_vars = '{\"a\":3}')
|
||||||
response = self.post(self.launch_url, data, expect=202)
|
response = self.post(self.launch_url, data, expect=201)
|
||||||
j = Job.objects.get(pk=response['job'])
|
j = Job.objects.get(pk=response['job'])
|
||||||
ev_dict = yaml.load(j.extra_vars)
|
ev_dict = yaml.load(j.extra_vars)
|
||||||
self.assertIn('a', ev_dict)
|
self.assertIn('a', ev_dict)
|
||||||
@@ -87,7 +87,7 @@ class JobTemplateLaunchTest(BaseJobTestMixin, django.test.TransactionTestCase):
|
|||||||
# Sending extra_vars as a JSON string, implicit credentials
|
# Sending extra_vars as a JSON string, implicit credentials
|
||||||
with self.current_user(self.user_sue):
|
with self.current_user(self.user_sue):
|
||||||
data = dict(extra_vars = 'a: 3')
|
data = dict(extra_vars = 'a: 3')
|
||||||
response = self.post(self.launch_url, data, expect=202)
|
response = self.post(self.launch_url, data, expect=201)
|
||||||
j = Job.objects.get(pk=response['job'])
|
j = Job.objects.get(pk=response['job'])
|
||||||
ev_dict = yaml.load(j.extra_vars)
|
ev_dict = yaml.load(j.extra_vars)
|
||||||
self.assertIn('a', ev_dict)
|
self.assertIn('a', ev_dict)
|
||||||
@@ -98,7 +98,7 @@ class JobTemplateLaunchTest(BaseJobTestMixin, django.test.TransactionTestCase):
|
|||||||
# Explicit, credential
|
# Explicit, credential
|
||||||
with self.current_user(self.user_sue):
|
with self.current_user(self.user_sue):
|
||||||
self.cred_sue.delete()
|
self.cred_sue.delete()
|
||||||
response = self.post(self.launch_url, {'credential': self.cred_doug.pk}, expect=202)
|
response = self.post(self.launch_url, {'credential': self.cred_doug.pk}, expect=201)
|
||||||
j = Job.objects.get(pk=response['job'])
|
j = Job.objects.get(pk=response['job'])
|
||||||
self.assertEqual(j.status, 'new')
|
self.assertEqual(j.status, 'new')
|
||||||
self.assertEqual(j.credential.pk, self.cred_doug.pk)
|
self.assertEqual(j.credential.pk, self.cred_doug.pk)
|
||||||
@@ -107,26 +107,26 @@ class JobTemplateLaunchTest(BaseJobTestMixin, django.test.TransactionTestCase):
|
|||||||
# Explicit, credential
|
# Explicit, credential
|
||||||
with self.current_user(self.user_sue):
|
with self.current_user(self.user_sue):
|
||||||
self.cred_sue.delete()
|
self.cred_sue.delete()
|
||||||
response = self.post(self.launch_url, {'credential_id': self.cred_doug.pk}, expect=202)
|
response = self.post(self.launch_url, {'credential_id': self.cred_doug.pk}, expect=201)
|
||||||
j = Job.objects.get(pk=response['job'])
|
j = Job.objects.get(pk=response['job'])
|
||||||
self.assertEqual(j.status, 'new')
|
self.assertEqual(j.status, 'new')
|
||||||
self.assertEqual(j.credential.pk, self.cred_doug.pk)
|
self.assertEqual(j.credential.pk, self.cred_doug.pk)
|
||||||
|
|
||||||
def test_credential_override(self):
|
def test_credential_override_reject(self):
|
||||||
# Explicit, credential
|
# Explicit, credential
|
||||||
with self.current_user(self.user_sue):
|
with self.current_user(self.user_sue):
|
||||||
response = self.post(self.launch_url, {'credential': self.cred_doug.pk}, expect=202)
|
response = self.post(self.launch_url, {'credential': self.cred_doug.pk}, expect=201)
|
||||||
j = Job.objects.get(pk=response['job'])
|
j = Job.objects.get(pk=response['job'])
|
||||||
self.assertEqual(j.status, 'new')
|
self.assertEqual(j.status, 'new')
|
||||||
self.assertEqual(j.credential.pk, self.cred_doug.pk)
|
self.assertEqual(j.credential.pk, self.cred_sue.pk)
|
||||||
|
|
||||||
def test_credential_override_via_credential_id(self):
|
def test_credential_override_via_credential_id_reject(self):
|
||||||
# Explicit, credential
|
# Explicit, credential
|
||||||
with self.current_user(self.user_sue):
|
with self.current_user(self.user_sue):
|
||||||
response = self.post(self.launch_url, {'credential_id': self.cred_doug.pk}, expect=202)
|
response = self.post(self.launch_url, {'credential_id': self.cred_doug.pk}, expect=201)
|
||||||
j = Job.objects.get(pk=response['job'])
|
j = Job.objects.get(pk=response['job'])
|
||||||
self.assertEqual(j.status, 'new')
|
self.assertEqual(j.status, 'new')
|
||||||
self.assertEqual(j.credential.pk, self.cred_doug.pk)
|
self.assertEqual(j.credential.pk, self.cred_sue.pk)
|
||||||
|
|
||||||
def test_bad_credential_launch_fail(self):
|
def test_bad_credential_launch_fail(self):
|
||||||
# Can't launch a job template without a credential defined (or if we
|
# Can't launch a job template without a credential defined (or if we
|
||||||
@@ -212,7 +212,7 @@ class JobTemplateLaunchPasswordsTest(BaseJobTestMixin, django.test.TransactionTe
|
|||||||
|
|
||||||
def test_explicit_cred_with_ask_password(self):
|
def test_explicit_cred_with_ask_password(self):
|
||||||
with self.current_user(self.user_sue):
|
with self.current_user(self.user_sue):
|
||||||
response = self.post(self.launch_url, {'ssh_password': 'whatever'}, expect=202)
|
response = self.post(self.launch_url, {'ssh_password': 'whatever'}, expect=201)
|
||||||
j = Job.objects.get(pk=response['job'])
|
j = Job.objects.get(pk=response['job'])
|
||||||
self.assertEqual(j.status, 'new')
|
self.assertEqual(j.status, 'new')
|
||||||
|
|
||||||
|
|||||||
@@ -1087,7 +1087,7 @@ class JobTransactionTest(BaseJobTestMixin, django.test.LiveServerTestCase):
|
|||||||
response = self.get(url)
|
response = self.get(url)
|
||||||
self.assertTrue(response['can_start'])
|
self.assertTrue(response['can_start'])
|
||||||
self.assertFalse(response['passwords_needed_to_start'])
|
self.assertFalse(response['passwords_needed_to_start'])
|
||||||
response = self.post(url, {}, expect=202)
|
response = self.post(url, {}, expect=201)
|
||||||
job = Job.objects.get(pk=job.pk)
|
job = Job.objects.get(pk=job.pk)
|
||||||
self.assertEqual(job.status, 'successful', job.result_stdout)
|
self.assertEqual(job.status, 'successful', job.result_stdout)
|
||||||
self.assertFalse(errors)
|
self.assertFalse(errors)
|
||||||
@@ -1146,14 +1146,14 @@ class JobTemplateSurveyTest(BaseJobTestMixin, django.test.TransactionTestCase):
|
|||||||
# should return, and should be able to launch template without error.
|
# should return, and should be able to launch template without error.
|
||||||
response = self.get(launch_url)
|
response = self.get(launch_url)
|
||||||
self.assertFalse(response['survey_enabled'])
|
self.assertFalse(response['survey_enabled'])
|
||||||
self.post(launch_url, {}, expect=202)
|
self.post(launch_url, {}, expect=201)
|
||||||
# Now post a survey spec and check that the answer is set in the
|
# Now post a survey spec and check that the answer is set in the
|
||||||
# job's extra vars.
|
# job's extra vars.
|
||||||
self.post(url, json.loads(TEST_SIMPLE_REQUIRED_SURVEY), expect=200)
|
self.post(url, json.loads(TEST_SIMPLE_REQUIRED_SURVEY), expect=200)
|
||||||
response = self.get(launch_url)
|
response = self.get(launch_url)
|
||||||
self.assertTrue(response['survey_enabled'])
|
self.assertTrue(response['survey_enabled'])
|
||||||
self.assertTrue('favorite_color' in response['variables_needed_to_start'])
|
self.assertTrue('favorite_color' in response['variables_needed_to_start'])
|
||||||
response = self.post(launch_url, dict(extra_vars=dict(favorite_color="green")), expect=202)
|
response = self.post(launch_url, dict(extra_vars=dict(favorite_color="green")), expect=201)
|
||||||
job = Job.objects.get(pk=response["job"])
|
job = Job.objects.get(pk=response["job"])
|
||||||
job_extra = json.loads(job.extra_vars)
|
job_extra = json.loads(job.extra_vars)
|
||||||
self.assertTrue("favorite_color" in job_extra)
|
self.assertTrue("favorite_color" in job_extra)
|
||||||
@@ -1187,7 +1187,7 @@ class JobTemplateSurveyTest(BaseJobTestMixin, django.test.TransactionTestCase):
|
|||||||
with self.current_user(self.user_sue):
|
with self.current_user(self.user_sue):
|
||||||
response = self.post(url, json.loads(TEST_SURVEY_REQUIREMENTS), expect=200)
|
response = self.post(url, json.loads(TEST_SURVEY_REQUIREMENTS), expect=200)
|
||||||
# Just the required answer should work
|
# Just the required answer should work
|
||||||
self.post(launch_url, dict(extra_vars=dict(reqd_answer="foo")), expect=202)
|
self.post(launch_url, dict(extra_vars=dict(reqd_answer="foo")), expect=201)
|
||||||
# Short answer but requires a long answer
|
# Short answer but requires a long answer
|
||||||
self.post(launch_url, dict(extra_vars=dict(long_answer='a', reqd_answer="foo")), expect=400)
|
self.post(launch_url, dict(extra_vars=dict(long_answer='a', reqd_answer="foo")), expect=400)
|
||||||
# Long answer but requires a short answer
|
# Long answer but requires a short answer
|
||||||
@@ -1199,9 +1199,9 @@ class JobTemplateSurveyTest(BaseJobTestMixin, django.test.TransactionTestCase):
|
|||||||
# Integer that's too big
|
# Integer that's too big
|
||||||
self.post(launch_url, dict(extra_vars=dict(int_answer=10, reqd_answer="foo")), expect=400)
|
self.post(launch_url, dict(extra_vars=dict(int_answer=10, reqd_answer="foo")), expect=400)
|
||||||
# Integer that's just riiiiight
|
# Integer that's just riiiiight
|
||||||
self.post(launch_url, dict(extra_vars=dict(int_answer=3, reqd_answer="foo")), expect=202)
|
self.post(launch_url, dict(extra_vars=dict(int_answer=3, reqd_answer="foo")), expect=201)
|
||||||
# Integer bigger than min with no max defined
|
# Integer bigger than min with no max defined
|
||||||
self.post(launch_url, dict(extra_vars=dict(int_answer_no_max=3, reqd_answer="foo")), expect=202)
|
self.post(launch_url, dict(extra_vars=dict(int_answer_no_max=3, reqd_answer="foo")), expect=201)
|
||||||
# Integer answer that's the wrong type
|
# Integer answer that's the wrong type
|
||||||
self.post(launch_url, dict(extra_vars=dict(int_answer="test", reqd_answer="foo")), expect=400)
|
self.post(launch_url, dict(extra_vars=dict(int_answer="test", reqd_answer="foo")), expect=400)
|
||||||
# Float that's too big
|
# Float that's too big
|
||||||
@@ -1209,7 +1209,7 @@ class JobTemplateSurveyTest(BaseJobTestMixin, django.test.TransactionTestCase):
|
|||||||
# Float that's too small
|
# Float that's too small
|
||||||
self.post(launch_url, dict(extra_vars=dict(float_answer=1.995, reqd_answer="foo")), expect=400)
|
self.post(launch_url, dict(extra_vars=dict(float_answer=1.995, reqd_answer="foo")), expect=400)
|
||||||
# float that's just riiiiight
|
# float that's just riiiiight
|
||||||
self.post(launch_url, dict(extra_vars=dict(float_answer=2.01, reqd_answer="foo")), expect=202)
|
self.post(launch_url, dict(extra_vars=dict(float_answer=2.01, reqd_answer="foo")), expect=201)
|
||||||
# float answer that's the wrong type
|
# float answer that's the wrong type
|
||||||
self.post(launch_url, dict(extra_vars=dict(float_answer="test", reqd_answer="foo")), expect=400)
|
self.post(launch_url, dict(extra_vars=dict(float_answer="test", reqd_answer="foo")), expect=400)
|
||||||
# Wrong choice in single choice
|
# Wrong choice in single choice
|
||||||
@@ -1219,11 +1219,11 @@ class JobTemplateSurveyTest(BaseJobTestMixin, django.test.TransactionTestCase):
|
|||||||
# Wrong type for multi choicen
|
# Wrong type for multi choicen
|
||||||
self.post(launch_url, dict(extra_vars=dict(reqd_answer="foo", multi_choice="two")), expect=400)
|
self.post(launch_url, dict(extra_vars=dict(reqd_answer="foo", multi_choice="two")), expect=400)
|
||||||
# Right choice in single choice
|
# Right choice in single choice
|
||||||
self.post(launch_url, dict(extra_vars=dict(reqd_answer="foo", single_choice="two")), expect=202)
|
self.post(launch_url, dict(extra_vars=dict(reqd_answer="foo", single_choice="two")), expect=201)
|
||||||
# Right choices in multi choice
|
# Right choices in multi choice
|
||||||
self.post(launch_url, dict(extra_vars=dict(reqd_answer="foo", multi_choice=["one", "two"])), expect=202)
|
self.post(launch_url, dict(extra_vars=dict(reqd_answer="foo", multi_choice=["one", "two"])), expect=201)
|
||||||
# Nested json
|
# Nested json
|
||||||
self.post(launch_url, dict(extra_vars=dict(json_answer=dict(test="val", num=1), reqd_answer="foo")), expect=202)
|
self.post(launch_url, dict(extra_vars=dict(json_answer=dict(test="val", num=1), reqd_answer="foo")), expect=201)
|
||||||
|
|
||||||
# Bob can access and update the survey because he's an org-admin
|
# Bob can access and update the survey because he's an org-admin
|
||||||
with self.current_user(self.user_bob):
|
with self.current_user(self.user_bob):
|
||||||
|
|||||||
Reference in New Issue
Block a user