From 28d9b994eb12c2b167a21f14ec5e02e581691cca Mon Sep 17 00:00:00 2001 From: Chris Meyers Date: Tue, 19 May 2015 10:11:51 -0400 Subject: [PATCH 1/6] restrict the running of jobs The following jobs require a credential to launch * InventoryUpdate without custom script * Job * AdHocJob --- awx/main/models/ad_hoc_commands.py | 11 +++++++++++ awx/main/models/inventory.py | 13 +++++++++++++ awx/main/models/jobs.py | 11 +++++++++++ 3 files changed, 35 insertions(+) diff --git a/awx/main/models/ad_hoc_commands.py b/awx/main/models/ad_hoc_commands.py index 1a48bbffcb..a1db3f6d73 100644 --- a/awx/main/models/ad_hoc_commands.py +++ b/awx/main/models/ad_hoc_commands.py @@ -201,6 +201,17 @@ class AdHocCommand(UnifiedJob): update_fields.append('name') super(AdHocCommand, self).save(*args, **kwargs) + # AdHocCommand Credential required + @property + def can_start(self): + if not super(AdHocCommand, self).can_start: + return False + + if not (self.credential and self.credential.active): + return False + + return True + class AdHocCommandEvent(CreatedModifiedModel): ''' diff --git a/awx/main/models/inventory.py b/awx/main/models/inventory.py index 6769efc28d..9bf848b1e0 100644 --- a/awx/main/models/inventory.py +++ b/awx/main/models/inventory.py @@ -1247,6 +1247,19 @@ class InventoryUpdate(UnifiedJob, InventorySourceOptions): def task_impact(self): return 50 + # InventoryUpdate credential required + # Custom InventoryUpdate credential not required + @property + def can_start(self): + if not super(InventoryUpdate, self).can_start: + return False + + if self.source != 'custom' \ + and not (self.credential and self.credential.active): + return False + return True + + class CustomInventoryScript(CommonModelNameNotUnique): class Meta: diff --git a/awx/main/models/jobs.py b/awx/main/models/jobs.py index 714ac794de..53dcdad818 100644 --- a/awx/main/models/jobs.py +++ b/awx/main/models/jobs.py @@ -491,6 +491,17 @@ class Job(UnifiedJob, JobOptions): presets[kw] = getattr(self, kw) return self.job_template.create_unified_job(**presets) + # Job Credential required + @property + def can_start(self): + if not super(Job, self).can_start: + return False + + if not (self.credential and self.credential.active): + return False + + return True + class JobHostSummary(CreatedModifiedModel): ''' Per-host statistics for each job. From a80602e40f98bece2cea4773cca275c9ba254bea Mon Sep 17 00:00:00 2001 From: Chris Meyers Date: Tue, 19 May 2015 14:57:05 -0400 Subject: [PATCH 2/6] remove adhoc command credential required check from can_start() and rely on API only to enforce --- awx/main/models/ad_hoc_commands.py | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/awx/main/models/ad_hoc_commands.py b/awx/main/models/ad_hoc_commands.py index a1db3f6d73..1a48bbffcb 100644 --- a/awx/main/models/ad_hoc_commands.py +++ b/awx/main/models/ad_hoc_commands.py @@ -201,17 +201,6 @@ class AdHocCommand(UnifiedJob): update_fields.append('name') super(AdHocCommand, self).save(*args, **kwargs) - # AdHocCommand Credential required - @property - def can_start(self): - if not super(AdHocCommand, self).can_start: - return False - - if not (self.credential and self.credential.active): - return False - - return True - class AdHocCommandEvent(CreatedModifiedModel): ''' From 50cbdf8535027e3f4292ec121e961ebc8223686f Mon Sep 17 00:00:00 2001 From: Chris Meyers Date: Tue, 19 May 2015 15:16:10 -0400 Subject: [PATCH 3/6] credential added to job launch test --- awx/main/tests/commands/commands_monolithic.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/awx/main/tests/commands/commands_monolithic.py b/awx/main/tests/commands/commands_monolithic.py index 972ca8ac9b..1ee6c33bb1 100644 --- a/awx/main/tests/commands/commands_monolithic.py +++ b/awx/main/tests/commands/commands_monolithic.py @@ -341,7 +341,7 @@ class CleanupJobsTest(BaseCommandMixin, BaseLiveServerTest): shutil.rmtree(self.test_project_path, True) def create_test_credential(self, **kwargs): - self.credential = self.make_credential(kwargs) + self.credential = self.make_credential(**kwargs) return self.credential def create_test_project(self, playbook_content): @@ -409,6 +409,7 @@ class CleanupJobsTest(BaseCommandMixin, BaseLiveServerTest): self.assertEqual(ad_hoc_commands_before, ad_hoc_commands_after) # Create and run job. + self.create_test_credential() self.create_test_project(TEST_PLAYBOOK) job_template = self.create_test_job_template() job = self.create_test_job(job_template=job_template) From 82a808abc72e1b510d3db20fd1cff099da33feef Mon Sep 17 00:00:00 2001 From: Chris Meyers Date: Tue, 19 May 2015 17:04:41 -0400 Subject: [PATCH 4/6] mock run_pexpect --- awx/main/tests/ad_hoc.py | 101 +++++++++++++++++++++------------------ 1 file changed, 54 insertions(+), 47 deletions(-) diff --git a/awx/main/tests/ad_hoc.py b/awx/main/tests/ad_hoc.py index b5155ed155..73d5643d4f 100644 --- a/awx/main/tests/ad_hoc.py +++ b/awx/main/tests/ad_hoc.py @@ -6,6 +6,7 @@ import glob import os import subprocess import tempfile +import mock # Django from django.conf import settings @@ -15,36 +16,37 @@ from django.core.urlresolvers import reverse from crum import impersonate # AWX +from awx.main.utils import * # noqa from awx.main.models import * # noqa from awx.main.tests.base import BaseJobExecutionTest from awx.main.tests.tasks import TEST_SSH_KEY_DATA, TEST_SSH_KEY_DATA_LOCKED, TEST_SSH_KEY_DATA_UNLOCK __all__ = ['RunAdHocCommandTest', 'AdHocCommandApiTest'] - class BaseAdHocCommandTest(BaseJobExecutionTest): ''' Common initialization for testing ad hoc commands. ''' def setUp(self): - super(BaseAdHocCommandTest, self).setUp() - self.setup_instances() - self.setup_users() - self.organization = self.make_organizations(self.super_django_user, 1)[0] - self.organization.admins.add(self.normal_django_user) - self.inventory = self.organization.inventories.create(name='test-inventory', description='description for test-inventory') - self.host = self.inventory.hosts.create(name='host.example.com') - self.host2 = self.inventory.hosts.create(name='host2.example.com') - self.group = self.inventory.groups.create(name='test-group') - self.group2 = self.inventory.groups.create(name='test-group2') - self.group.hosts.add(self.host) - self.group2.hosts.add(self.host, self.host2) - self.inventory2 = self.organization.inventories.create(name='test-inventory2') - self.host3 = self.inventory2.hosts.create(name='host3.example.com') - self.credential = None - settings.INTERNAL_API_URL = self.live_server_url - settings.CALLBACK_CONSUMER_PORT = '' + with ignore_inventory_computed_fields(): + super(BaseAdHocCommandTest, self).setUp() + self.setup_instances() + self.setup_users() + self.organization = self.make_organizations(self.super_django_user, 1)[0] + self.organization.admins.add(self.normal_django_user) + self.inventory = self.organization.inventories.create(name='test-inventory', description='description for test-inventory') + self.host = self.inventory.hosts.create(name='host.example.com') + self.host2 = self.inventory.hosts.create(name='host2.example.com') + self.group = self.inventory.groups.create(name='test-group') + self.group2 = self.inventory.groups.create(name='test-group2') + self.group.hosts.add(self.host) + self.group2.hosts.add(self.host, self.host2) + self.inventory2 = self.organization.inventories.create(name='test-inventory2') + self.host3 = self.inventory2.hosts.create(name='host3.example.com') + self.credential = None + settings.INTERNAL_API_URL = self.live_server_url + settings.CALLBACK_CONSUMER_PORT = '' def create_test_credential(self, **kwargs): self.credential = self.make_credential(**kwargs) @@ -124,7 +126,8 @@ class RunAdHocCommandTest(BaseAdHocCommandTest): self.check_job_result(ad_hoc_command, 'failed') self.check_ad_hoc_command_events(ad_hoc_command, 'unreachable') - def test_cancel_ad_hoc_command(self): + @mock.patch('awx.main.tasks.BaseTask.run_pexpect', return_value=('canceled', 0)) + def test_cancel_ad_hoc_command(self, ignore): ad_hoc_command = self.create_test_ad_hoc_command() self.assertEqual(ad_hoc_command.status, 'new') self.assertFalse(ad_hoc_command.cancel_flag) @@ -145,7 +148,8 @@ class RunAdHocCommandTest(BaseAdHocCommandTest): # Unable to start ad hoc command again. self.assertFalse(ad_hoc_command.signal_start()) - def test_ad_hoc_command_options(self): + @mock.patch('awx.main.tasks.BaseTask.run_pexpect', return_value=('successful', 0)) + def test_ad_hoc_command_options(self, ignore): ad_hoc_command = self.create_test_ad_hoc_command(forks=2, verbosity=2) self.assertEqual(ad_hoc_command.status, 'new') self.assertFalse(ad_hoc_command.passwords_needed_to_start) @@ -191,7 +195,8 @@ class RunAdHocCommandTest(BaseAdHocCommandTest): self.check_ad_hoc_command_events(ad_hoc_command3, 'ok', hosts=[]) self.assertEqual(ad_hoc_command3.ad_hoc_command_events.count(), 0) - def test_ssh_username_and_password(self): + @mock.patch('awx.main.tasks.BaseTask.run_pexpect', return_value=('successful', 0)) + def test_ssh_username_and_password(self, ignore): self.create_test_credential(username='sshuser', password='sshpass') ad_hoc_command = self.create_test_ad_hoc_command() self.assertEqual(ad_hoc_command.status, 'new') @@ -199,10 +204,11 @@ class RunAdHocCommandTest(BaseAdHocCommandTest): self.assertTrue(ad_hoc_command.signal_start()) ad_hoc_command = AdHocCommand.objects.get(pk=ad_hoc_command.pk) self.check_job_result(ad_hoc_command, 'successful') - self.assertTrue('"-u"' in ad_hoc_command.job_args) - self.assertTrue('"--ask-pass"' in ad_hoc_command.job_args) + self.assertIn('"-u"', ad_hoc_command.job_args) + self.assertIn('"--ask-pass"', ad_hoc_command.job_args) - def test_ssh_ask_password(self): + @mock.patch('awx.main.tasks.BaseTask.run_pexpect', return_value=('successful', 0)) + def test_ssh_ask_password(self, ignore): self.create_test_credential(password='ASK') ad_hoc_command = self.create_test_ad_hoc_command() self.assertEqual(ad_hoc_command.status, 'new') @@ -212,9 +218,10 @@ class RunAdHocCommandTest(BaseAdHocCommandTest): self.assertTrue(ad_hoc_command.signal_start(ssh_password='sshpass')) ad_hoc_command = AdHocCommand.objects.get(pk=ad_hoc_command.pk) self.check_job_result(ad_hoc_command, 'successful') - self.assertTrue('"--ask-pass"' in ad_hoc_command.job_args) + self.assertIn('"--ask-pass"', ad_hoc_command.job_args) - def test_sudo_username_and_password(self): + @mock.patch('awx.main.tasks.BaseTask.run_pexpect', return_value=('successful', 0)) + def test_sudo_username_and_password(self, ignore): self.create_test_credential(become_method="sudo", become_username='sudouser', become_password='sudopass') @@ -223,15 +230,14 @@ class RunAdHocCommandTest(BaseAdHocCommandTest): self.assertFalse(ad_hoc_command.passwords_needed_to_start) self.assertTrue(ad_hoc_command.signal_start()) ad_hoc_command = AdHocCommand.objects.get(pk=ad_hoc_command.pk) - # Job may fail if current user doesn't have password-less sudo - # privileges, but we're mainly checking the command line arguments. self.check_job_result(ad_hoc_command, ('successful', 'failed')) - self.assertTrue('"--become-method"' in ad_hoc_command.job_args) - self.assertTrue('"--become-user"' in ad_hoc_command.job_args) - self.assertTrue('"--ask-become-pass"' in ad_hoc_command.job_args) - self.assertFalse('"--become"' in ad_hoc_command.job_args) + self.assertIn('"--become-method"', ad_hoc_command.job_args) + self.assertIn('"--become-user"', ad_hoc_command.job_args) + self.assertIn('"--ask-become-pass"', ad_hoc_command.job_args) + self.assertNotIn('"--become"', ad_hoc_command.job_args) - def test_sudo_ask_password(self): + @mock.patch('awx.main.tasks.BaseTask.run_pexpect', return_value=('successful', 0)) + def test_sudo_ask_password(self, ignore): self.create_test_credential(become_password='ASK') ad_hoc_command = self.create_test_ad_hoc_command() self.assertEqual(ad_hoc_command.status, 'new') @@ -240,13 +246,13 @@ class RunAdHocCommandTest(BaseAdHocCommandTest): self.assertFalse(ad_hoc_command.signal_start()) self.assertTrue(ad_hoc_command.signal_start(become_password='sudopass')) ad_hoc_command = AdHocCommand.objects.get(pk=ad_hoc_command.pk) - # Job may fail, but we're mainly checking the command line arguments. self.check_job_result(ad_hoc_command, ('successful', 'failed')) - self.assertTrue('"--ask-become-pass"' in ad_hoc_command.job_args) - self.assertFalse('"--become-user"' in ad_hoc_command.job_args) - self.assertFalse('"--become"' in ad_hoc_command.job_args) + self.assertIn('"--ask-become-pass"', ad_hoc_command.job_args) + self.assertNotIn('"--become-user"', ad_hoc_command.job_args) + self.assertNotIn('"--become"', ad_hoc_command.job_args) - def test_unlocked_ssh_key(self): + @mock.patch('awx.main.tasks.BaseTask.run_pexpect', return_value=('successful', 0)) + def test_unlocked_ssh_key(self, ignore): self.create_test_credential(ssh_key_data=TEST_SSH_KEY_DATA) ad_hoc_command = self.create_test_ad_hoc_command() self.assertEqual(ad_hoc_command.status, 'new') @@ -254,8 +260,8 @@ class RunAdHocCommandTest(BaseAdHocCommandTest): self.assertTrue(ad_hoc_command.signal_start()) ad_hoc_command = AdHocCommand.objects.get(pk=ad_hoc_command.pk) self.check_job_result(ad_hoc_command, 'successful') - self.assertFalse('"--private-key=' in ad_hoc_command.job_args) - self.assertTrue('ssh-agent' in ad_hoc_command.job_args) + self.assertNotIn('"--private-key=', ad_hoc_command.job_args) + self.assertIn('ssh-agent', ad_hoc_command.job_args) def test_locked_ssh_key_with_password(self): self.create_test_credential(ssh_key_data=TEST_SSH_KEY_DATA_LOCKED, @@ -266,8 +272,8 @@ class RunAdHocCommandTest(BaseAdHocCommandTest): self.assertTrue(ad_hoc_command.signal_start()) ad_hoc_command = AdHocCommand.objects.get(pk=ad_hoc_command.pk) self.check_job_result(ad_hoc_command, 'successful') - self.assertTrue('ssh-agent' in ad_hoc_command.job_args) - self.assertTrue('Bad passphrase' not in ad_hoc_command.result_stdout) + self.assertIn('ssh-agent', ad_hoc_command.job_args) + self.assertNotIn('Bad passphrase', ad_hoc_command.result_stdout) def test_locked_ssh_key_with_bad_password(self): self.create_test_credential(ssh_key_data=TEST_SSH_KEY_DATA_LOCKED, @@ -278,8 +284,8 @@ class RunAdHocCommandTest(BaseAdHocCommandTest): self.assertTrue(ad_hoc_command.signal_start()) ad_hoc_command = AdHocCommand.objects.get(pk=ad_hoc_command.pk) self.check_job_result(ad_hoc_command, 'failed') - self.assertTrue('ssh-agent' in ad_hoc_command.job_args) - self.assertTrue('Bad passphrase' in ad_hoc_command.result_stdout) + self.assertIn('ssh-agent', ad_hoc_command.job_args) + self.assertIn('Bad passphrase', ad_hoc_command.result_stdout) def test_locked_ssh_key_ask_password(self): self.create_test_credential(ssh_key_data=TEST_SSH_KEY_DATA_LOCKED, @@ -303,8 +309,8 @@ class RunAdHocCommandTest(BaseAdHocCommandTest): self.assertTrue(ad_hoc_command.signal_start(ssh_key_unlock=TEST_SSH_KEY_DATA_UNLOCK)) ad_hoc_command = AdHocCommand.objects.get(pk=ad_hoc_command.pk) self.check_job_result(ad_hoc_command, 'successful') - self.assertTrue('ssh-agent' in ad_hoc_command.job_args) - self.assertTrue('Bad passphrase' not in ad_hoc_command.result_stdout) + self.assertIn('ssh-agent', ad_hoc_command.job_args) + self.assertNotIn('Bad passphrase', ad_hoc_command.result_stdout) def test_run_with_proot(self): # Only run test if proot is installed @@ -348,7 +354,8 @@ class RunAdHocCommandTest(BaseAdHocCommandTest): self.check_job_result(ad_hoc_command, 'successful') self.check_ad_hoc_command_events(ad_hoc_command, 'ok') - def test_run_with_proot_not_installed(self): + @mock.patch('awx.main.tasks.BaseTask.run_pexpect', return_value=('failed', 0)) + def test_run_with_proot_not_installed(self, ignore): # Enable proot for this test, specify invalid proot cmd. settings.AWX_PROOT_ENABLED = True settings.AWX_PROOT_CMD = 'PR00T' From e6b834c4940d922f975c1d4e73e8c6e5a9683f43 Mon Sep 17 00:00:00 2001 From: Chris Meyers Date: Tue, 19 May 2015 17:20:21 -0400 Subject: [PATCH 5/6] update task test to create credential before launching job --- awx/main/tests/tasks.py | 53 ++++++++++++++++++++++++++++------------- 1 file changed, 37 insertions(+), 16 deletions(-) diff --git a/awx/main/tests/tasks.py b/awx/main/tests/tasks.py index cfbb0bd401..db7a166ed2 100644 --- a/awx/main/tests/tasks.py +++ b/awx/main/tests/tasks.py @@ -18,6 +18,7 @@ from django.utils.timezone import now from crum import impersonate # AWX +from awx.main.utils import * # noqa from awx.main.models import * # noqa from awx.main.tests.base import BaseJobExecutionTest @@ -345,22 +346,23 @@ class RunJobTest(BaseJobExecutionTest): ''' def setUp(self): - super(RunJobTest, self).setUp() - self.test_project_path = None - self.setup_instances() - self.setup_users() - self.organization = self.make_organizations(self.super_django_user, 1)[0] - self.inventory = self.organization.inventories.create(name='test-inventory', - description='description for test-inventory') - self.host = self.inventory.hosts.create(name='host.example.com') - self.group = self.inventory.groups.create(name='test-group') - self.group2 = self.inventory.groups.create(name='test-group2') - self.group.hosts.add(self.host) - self.group2.hosts.add(self.host) - self.project = None - self.credential = None - self.cloud_credential = None - settings.INTERNAL_API_URL = self.live_server_url + with ignore_inventory_computed_fields(): + super(RunJobTest, self).setUp() + self.test_project_path = None + self.setup_instances() + self.setup_users() + self.organization = self.make_organizations(self.super_django_user, 1)[0] + self.inventory = self.organization.inventories.create(name='test-inventory', + description='description for test-inventory') + self.host = self.inventory.hosts.create(name='host.example.com') + self.group = self.inventory.groups.create(name='test-group') + self.group2 = self.inventory.groups.create(name='test-group2') + self.group.hosts.add(self.host) + self.group2.hosts.add(self.host) + self.project = None + self.credential = None + self.cloud_credential = None + settings.INTERNAL_API_URL = self.live_server_url def tearDown(self): super(RunJobTest, self).tearDown() @@ -562,6 +564,7 @@ class RunJobTest(BaseJobExecutionTest): self.assertEqual(qs.count(), 0) def test_run_job(self): + self.create_test_credential() self.create_test_project(TEST_PLAYBOOK) job_template = self.create_test_job_template() job = self.create_test_job(job_template=job_template) @@ -590,6 +593,7 @@ class RunJobTest(BaseJobExecutionTest): return job def test_check_job(self): + self.create_test_credential() self.create_test_project(TEST_PLAYBOOK) job_template = self.create_test_job_template() job = self.create_test_job(job_template=job_template, job_type='check') @@ -617,6 +621,7 @@ class RunJobTest(BaseJobExecutionTest): return job def test_run_job_that_fails(self): + self.create_test_credential() self.create_test_project(TEST_PLAYBOOK2) job_template = self.create_test_job_template() job = self.create_test_job(job_template=job_template) @@ -644,6 +649,7 @@ class RunJobTest(BaseJobExecutionTest): return job def test_run_job_with_ignore_errors(self): + self.create_test_credential() self.create_test_project(TEST_IGNORE_ERRORS_PLAYBOOK) job_template = self.create_test_job_template() job = self.create_test_job(job_template=job_template) @@ -766,6 +772,7 @@ class RunJobTest(BaseJobExecutionTest): self.assertEqual(self.host.last_job_host_summary, None) def test_check_job_where_task_would_fail(self): + self.create_test_credential() self.create_test_project(TEST_PLAYBOOK2) job_template = self.create_test_job_template() job = self.create_test_job(job_template=job_template, job_type='check') @@ -799,6 +806,7 @@ class RunJobTest(BaseJobExecutionTest): self.assertTrue(job.cancel()) # No change from calling again. def test_cancel_job(self): + self.create_test_credential() self.create_test_project(TEST_PLAYBOOK) job_template = self.create_test_job_template() # Pass save=False just for the sake of test coverage. @@ -824,6 +832,7 @@ class RunJobTest(BaseJobExecutionTest): self.assertFalse(job.signal_start()) def test_extra_job_options(self): + self.create_test_credential() self.create_test_project(TEST_EXTRA_VARS_PLAYBOOK) # Test with extra_vars containing misc whitespace. job_template = self.create_test_job_template(force_handlers=True, @@ -856,6 +865,7 @@ class RunJobTest(BaseJobExecutionTest): self.check_job_result(job3, 'successful') def test_lots_of_extra_vars(self): + self.create_test_credential() self.create_test_project(TEST_EXTRA_VARS_PLAYBOOK) extra_vars = json.dumps(dict(('var_%d' % x, x) for x in xrange(200))) job_template = self.create_test_job_template(extra_vars=extra_vars) @@ -869,6 +879,7 @@ class RunJobTest(BaseJobExecutionTest): self.assertTrue('"-e"' in job.job_args) def test_limit_option(self): + self.create_test_credential() self.create_test_project(TEST_PLAYBOOK) job_template = self.create_test_job_template(limit='bad.example.com') job = self.create_test_job(job_template=job_template) @@ -893,6 +904,7 @@ class RunJobTest(BaseJobExecutionTest): self.assertTrue('ssh-agent' in job.job_args) def test_tag_and_task_options(self): + self.create_test_credential() self.create_test_project(TEST_PLAYBOOK_WITH_TAGS) job_template = self.create_test_job_template(job_tags='runme', skip_tags='skipme', @@ -972,6 +984,7 @@ class RunJobTest(BaseJobExecutionTest): self.assertFalse('"--become-method"' in job.job_args) def test_job_template_become_enabled(self): + self.create_test_credential() self.create_test_project(TEST_PLAYBOOK) job_template = self.create_test_job_template(become_enabled=True) job = self.create_test_job(job_template=job_template) @@ -1127,6 +1140,7 @@ class RunJobTest(BaseJobExecutionTest): ssh_key_data=TEST_SSH_CERT_KEY) playbook = TEST_ENV_PLAYBOOK % {'env_var1': env_var1, 'env_var2': env_var2} + self.create_test_credential() self.create_test_project(playbook) job_template = self.create_test_job_template() job = self.create_test_job(job_template=job_template) @@ -1154,6 +1168,7 @@ class RunJobTest(BaseJobExecutionTest): self._test_cloud_credential_environment_variables('vmware') def test_run_async_job(self): + self.create_test_credential() self.create_test_project(TEST_ASYNC_OK_PLAYBOOK) job_template = self.create_test_job_template() job = self.create_test_job(job_template=job_template) @@ -1184,6 +1199,7 @@ class RunJobTest(BaseJobExecutionTest): # FIXME: We are not sure why proot needs to be disabled on this test # Maybe they are simply susceptable to timing and proot adds time settings.AWX_PROOT_ENABLED = False + self.create_test_credential() self.create_test_project(TEST_ASYNC_FAIL_PLAYBOOK) job_template = self.create_test_job_template() job = self.create_test_job(job_template=job_template) @@ -1214,6 +1230,7 @@ class RunJobTest(BaseJobExecutionTest): # FIXME: We are not sure why proot needs to be disabled on this test # Maybe they are simply susceptable to timing and proot adds time settings.AWX_PROOT_ENABLED = False + self.create_test_credential() self.create_test_project(TEST_ASYNC_TIMEOUT_PLAYBOOK) job_template = self.create_test_job_template() job = self.create_test_job(job_template=job_template) @@ -1242,6 +1259,7 @@ class RunJobTest(BaseJobExecutionTest): self.assertEqual(job.processed_hosts.count(), 1) def test_run_async_job_fire_and_forget(self): + self.create_test_credential() self.create_test_project(TEST_ASYNC_NOWAIT_PLAYBOOK) job_template = self.create_test_job_template() job = self.create_test_job(job_template=job_template) @@ -1269,6 +1287,7 @@ class RunJobTest(BaseJobExecutionTest): self.assertEqual(job.processed_hosts.count(), 1) def test_run_job_with_roles(self): + self.create_test_credential() self.create_test_project(TEST_PLAYBOOK_WITH_ROLES, TEST_ROLE_PLAYBOOKS) job_template = self.create_test_job_template() job = self.create_test_job(job_template=job_template) @@ -1299,6 +1318,7 @@ class RunJobTest(BaseJobExecutionTest): settings.AWX_PROOT_HIDE_PATHS = [os.path.join(settings.BASE_DIR, 'settings')] # Create another project alongside the one we're using to verify it # is hidden. + self.create_test_credential() self.create_test_project(TEST_PLAYBOOK) other_project_path = self.project.local_path # Create a temp directory that should not be visible to the playbook. @@ -1334,6 +1354,7 @@ class RunJobTest(BaseJobExecutionTest): # Enable proot for this test, specify invalid proot cmd. settings.AWX_PROOT_ENABLED = True settings.AWX_PROOT_CMD = 'PR00T' + self.create_test_credential() self.create_test_project(TEST_PLAYBOOK) job_template = self.create_test_job_template() job = self.create_test_job(job_template=job_template) From 51afab566be27d0ed74dfe135301326a55a41b56 Mon Sep 17 00:00:00 2001 From: Chris Meyers Date: Wed, 20 May 2015 08:23:11 -0400 Subject: [PATCH 6/6] flake8 --- awx/main/models/inventory.py | 4 ++-- awx/main/tests/tasks.py | 32 ++++++++++++++++---------------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/awx/main/models/inventory.py b/awx/main/models/inventory.py index 9bf848b1e0..fe58d67fc4 100644 --- a/awx/main/models/inventory.py +++ b/awx/main/models/inventory.py @@ -1254,8 +1254,8 @@ class InventoryUpdate(UnifiedJob, InventorySourceOptions): if not super(InventoryUpdate, self).can_start: return False - if self.source != 'custom' \ - and not (self.credential and self.credential.active): + if (self.source != 'custom' + and not (self.credential and self.credential.active)): return False return True diff --git a/awx/main/tests/tasks.py b/awx/main/tests/tasks.py index db7a166ed2..0ef05567b3 100644 --- a/awx/main/tests/tasks.py +++ b/awx/main/tests/tasks.py @@ -347,22 +347,22 @@ class RunJobTest(BaseJobExecutionTest): def setUp(self): with ignore_inventory_computed_fields(): - super(RunJobTest, self).setUp() - self.test_project_path = None - self.setup_instances() - self.setup_users() - self.organization = self.make_organizations(self.super_django_user, 1)[0] - self.inventory = self.organization.inventories.create(name='test-inventory', - description='description for test-inventory') - self.host = self.inventory.hosts.create(name='host.example.com') - self.group = self.inventory.groups.create(name='test-group') - self.group2 = self.inventory.groups.create(name='test-group2') - self.group.hosts.add(self.host) - self.group2.hosts.add(self.host) - self.project = None - self.credential = None - self.cloud_credential = None - settings.INTERNAL_API_URL = self.live_server_url + super(RunJobTest, self).setUp() + self.test_project_path = None + self.setup_instances() + self.setup_users() + self.organization = self.make_organizations(self.super_django_user, 1)[0] + self.inventory = self.organization.inventories.create(name='test-inventory', + description='description for test-inventory') + self.host = self.inventory.hosts.create(name='host.example.com') + self.group = self.inventory.groups.create(name='test-group') + self.group2 = self.inventory.groups.create(name='test-group2') + self.group.hosts.add(self.host) + self.group2.hosts.add(self.host) + self.project = None + self.credential = None + self.cloud_credential = None + settings.INTERNAL_API_URL = self.live_server_url def tearDown(self): super(RunJobTest, self).tearDown()