From 9d732cdbdf01cb94320873f8a01f309f9eb95767 Mon Sep 17 00:00:00 2001 From: chris meyers Date: Thu, 31 May 2018 13:48:47 -0400 Subject: [PATCH] update unit and functional tests --- .../functional/models/test_unified_job.py | 4 +- .../task_management/test_rampart_groups.py | 21 +++++---- .../task_management/test_scheduler.py | 43 +++++++++++-------- awx/main/tests/unit/test_tasks.py | 17 +++++--- 4 files changed, 51 insertions(+), 34 deletions(-) diff --git a/awx/main/tests/functional/models/test_unified_job.py b/awx/main/tests/functional/models/test_unified_job.py index 05d5aa318a..0ee56349fe 100644 --- a/awx/main/tests/functional/models/test_unified_job.py +++ b/awx/main/tests/functional/models/test_unified_job.py @@ -88,7 +88,7 @@ class TestIsolatedRuns: with mock.patch.object(job, '_get_task_class') as task_class: task_class.return_value = MockTaskClass job.start_celery_task([], error_callback, success_callback, 'thepentagon') - mock_async.assert_called_with([job.id, 'iso2'], [], + mock_async.assert_called_with([job.id], [], link_error=error_callback, link=success_callback, queue='thepentagon', @@ -100,7 +100,7 @@ class TestIsolatedRuns: with mock.patch.object(job, '_get_task_class') as task_class: task_class.return_value = MockTaskClass job.start_celery_task([], error_callback, success_callback, 'thepentagon') - mock_async.assert_called_with([job.id, 'iso1'], [], + mock_async.assert_called_with([job.id], [], link_error=error_callback, link=success_callback, queue='thepentagon', diff --git a/awx/main/tests/functional/task_management/test_rampart_groups.py b/awx/main/tests/functional/task_management/test_rampart_groups.py index ce79b78003..0eae5b2805 100644 --- a/awx/main/tests/functional/task_management/test_rampart_groups.py +++ b/awx/main/tests/functional/task_management/test_rampart_groups.py @@ -31,7 +31,7 @@ def test_multi_group_basic_job_launch(instance_factory, default_instance_group, mock_task_impact.return_value = 500 with mocker.patch("awx.main.scheduler.TaskManager.start_task"): TaskManager().schedule() - TaskManager.start_task.assert_has_calls([mock.call(j1, ig1, []), mock.call(j2, ig2, [])]) + TaskManager.start_task.assert_has_calls([mock.call(j1, ig1, [], i1), mock.call(j2, ig2, [], i2)]) @@ -65,15 +65,18 @@ def test_multi_group_with_shared_dependency(instance_factory, default_instance_g with mocker.patch("awx.main.scheduler.TaskManager.start_task"): TaskManager().schedule() pu = p.project_updates.first() - TaskManager.start_task.assert_called_once_with(pu, default_instance_group, [j1]) + TaskManager.start_task.assert_called_once_with(pu, + default_instance_group, + [j1], + default_instance_group.instances.all()[0]) pu.finished = pu.created + timedelta(seconds=1) pu.status = "successful" pu.save() with mock.patch("awx.main.scheduler.TaskManager.start_task"): TaskManager().schedule() - TaskManager.start_task.assert_any_call(j1, ig1, []) - TaskManager.start_task.assert_any_call(j2, ig2, []) + TaskManager.start_task.assert_any_call(j1, ig1, [], i1) + TaskManager.start_task.assert_any_call(j2, ig2, [], i2) assert TaskManager.start_task.call_count == 2 @@ -85,7 +88,7 @@ def test_workflow_job_no_instancegroup(workflow_job_template_factory, default_in wfj.save() with mocker.patch("awx.main.scheduler.TaskManager.start_task"): TaskManager().schedule() - TaskManager.start_task.assert_called_once_with(wfj, None, []) + TaskManager.start_task.assert_called_once_with(wfj, None, [], None) assert wfj.instance_group is None @@ -131,8 +134,9 @@ def test_overcapacity_blocking_other_groups_unaffected(instance_factory, default mock_task_impact.return_value = 500 with mock.patch.object(TaskManager, "start_task", wraps=tm.start_task) as mock_job: tm.schedule() - mock_job.assert_has_calls([mock.call(j1, ig1, []), mock.call(j1_1, ig1, []), - mock.call(j2, ig2, [])]) + mock_job.assert_has_calls([mock.call(j1, ig1, [], i1), + mock.call(j1_1, ig1, [], i1), + mock.call(j2, ig2, [], i2)]) assert mock_job.call_count == 3 @@ -163,7 +167,8 @@ def test_failover_group_run(instance_factory, default_instance_group, mocker, mock_task_impact.return_value = 500 with mock.patch.object(TaskManager, "start_task", wraps=tm.start_task) as mock_job: tm.schedule() - mock_job.assert_has_calls([mock.call(j1, ig1, []), mock.call(j1_1, ig2, [])]) + mock_job.assert_has_calls([mock.call(j1, ig1, [], i1), + mock.call(j1_1, ig2, [], i2)]) assert mock_job.call_count == 2 diff --git a/awx/main/tests/functional/task_management/test_scheduler.py b/awx/main/tests/functional/task_management/test_scheduler.py index 82625533c7..813adff7cf 100644 --- a/awx/main/tests/functional/task_management/test_scheduler.py +++ b/awx/main/tests/functional/task_management/test_scheduler.py @@ -18,6 +18,7 @@ from awx.main.models.notifications import JobNotificationMixin @pytest.mark.django_db def test_single_job_scheduler_launch(default_instance_group, job_template_factory, mocker): + instance = default_instance_group.instances.all()[0] objects = job_template_factory('jt', organization='org1', project='proj', inventory='inv', credential='cred', jobs=["job_should_start"]) @@ -26,11 +27,12 @@ def test_single_job_scheduler_launch(default_instance_group, job_template_factor j.save() with mocker.patch("awx.main.scheduler.TaskManager.start_task"): TaskManager().schedule() - TaskManager.start_task.assert_called_once_with(j, default_instance_group, []) + TaskManager.start_task.assert_called_once_with(j, default_instance_group, [], instance) @pytest.mark.django_db def test_single_jt_multi_job_launch_blocks_last(default_instance_group, job_template_factory, mocker): + instance = default_instance_group.instances.all()[0] objects = job_template_factory('jt', organization='org1', project='proj', inventory='inv', credential='cred', jobs=["job_should_start", "job_should_not_start"]) @@ -42,16 +44,17 @@ def test_single_jt_multi_job_launch_blocks_last(default_instance_group, job_temp j2.save() with mock.patch("awx.main.scheduler.TaskManager.start_task"): TaskManager().schedule() - TaskManager.start_task.assert_called_once_with(j1, default_instance_group, []) + TaskManager.start_task.assert_called_once_with(j1, default_instance_group, [], instance) j1.status = "successful" j1.save() with mocker.patch("awx.main.scheduler.TaskManager.start_task"): TaskManager().schedule() - TaskManager.start_task.assert_called_once_with(j2, default_instance_group, []) + TaskManager.start_task.assert_called_once_with(j2, default_instance_group, [], instance) @pytest.mark.django_db def test_single_jt_multi_job_launch_allow_simul_allowed(default_instance_group, job_template_factory, mocker): + instance = default_instance_group.instances.all()[0] objects = job_template_factory('jt', organization='org1', project='proj', inventory='inv', credential='cred', jobs=["job_should_start", "job_should_not_start"]) @@ -68,12 +71,13 @@ def test_single_jt_multi_job_launch_allow_simul_allowed(default_instance_group, j2.save() with mock.patch("awx.main.scheduler.TaskManager.start_task"): TaskManager().schedule() - TaskManager.start_task.assert_has_calls([mock.call(j1, default_instance_group, []), - mock.call(j2, default_instance_group, [])]) + TaskManager.start_task.assert_has_calls([mock.call(j1, default_instance_group, [], instance), + mock.call(j2, default_instance_group, [], instance)]) @pytest.mark.django_db def test_multi_jt_capacity_blocking(default_instance_group, job_template_factory, mocker): + instance = default_instance_group.instances.all()[0] objects1 = job_template_factory('jt1', organization='org1', project='proj1', inventory='inv1', credential='cred1', jobs=["job_should_start"]) @@ -91,20 +95,20 @@ def test_multi_jt_capacity_blocking(default_instance_group, job_template_factory mock_task_impact.return_value = 500 with mock.patch.object(TaskManager, "start_task", wraps=tm.start_task) as mock_job: tm.schedule() - mock_job.assert_called_once_with(j1, default_instance_group, []) + mock_job.assert_called_once_with(j1, default_instance_group, [], instance) j1.status = "successful" j1.save() with mock.patch.object(TaskManager, "start_task", wraps=tm.start_task) as mock_job: tm.schedule() - mock_job.assert_called_once_with(j2, default_instance_group, []) - - + mock_job.assert_called_once_with(j2, default_instance_group, [], instance) + @pytest.mark.django_db def test_single_job_dependencies_project_launch(default_instance_group, job_template_factory, mocker): objects = job_template_factory('jt', organization='org1', project='proj', inventory='inv', credential='cred', jobs=["job_should_start"]) + instance = default_instance_group.instances.all()[0] j = objects.jobs["job_should_start"] j.status = 'pending' j.save() @@ -121,12 +125,12 @@ def test_single_job_dependencies_project_launch(default_instance_group, job_temp mock_pu.assert_called_once_with(j) pu = [x for x in p.project_updates.all()] assert len(pu) == 1 - TaskManager.start_task.assert_called_once_with(pu[0], default_instance_group, [j]) + TaskManager.start_task.assert_called_once_with(pu[0], default_instance_group, [j], instance) pu[0].status = "successful" pu[0].save() with mock.patch("awx.main.scheduler.TaskManager.start_task"): TaskManager().schedule() - TaskManager.start_task.assert_called_once_with(j, default_instance_group, []) + TaskManager.start_task.assert_called_once_with(j, default_instance_group, [], instance) @pytest.mark.django_db @@ -134,6 +138,7 @@ def test_single_job_dependencies_inventory_update_launch(default_instance_group, objects = job_template_factory('jt', organization='org1', project='proj', inventory='inv', credential='cred', jobs=["job_should_start"]) + instance = default_instance_group.instances.all()[0] j = objects.jobs["job_should_start"] j.status = 'pending' j.save() @@ -151,12 +156,12 @@ def test_single_job_dependencies_inventory_update_launch(default_instance_group, mock_iu.assert_called_once_with(j, ii) iu = [x for x in ii.inventory_updates.all()] assert len(iu) == 1 - TaskManager.start_task.assert_called_once_with(iu[0], default_instance_group, [j]) + TaskManager.start_task.assert_called_once_with(iu[0], default_instance_group, [j], instance) iu[0].status = "successful" iu[0].save() with mock.patch("awx.main.scheduler.TaskManager.start_task"): TaskManager().schedule() - TaskManager.start_task.assert_called_once_with(j, default_instance_group, []) + TaskManager.start_task.assert_called_once_with(j, default_instance_group, [], instance) @pytest.mark.django_db @@ -164,6 +169,7 @@ def test_job_dependency_with_already_updated(default_instance_group, job_templat objects = job_template_factory('jt', organization='org1', project='proj', inventory='inv', credential='cred', jobs=["job_should_start"]) + instance = default_instance_group.instances.all()[0] j = objects.jobs["job_should_start"] j.status = 'pending' j.save() @@ -185,11 +191,12 @@ def test_job_dependency_with_already_updated(default_instance_group, job_templat mock_iu.assert_not_called() with mock.patch("awx.main.scheduler.TaskManager.start_task"): TaskManager().schedule() - TaskManager.start_task.assert_called_once_with(j, default_instance_group, []) + TaskManager.start_task.assert_called_once_with(j, default_instance_group, [], instance) @pytest.mark.django_db def test_shared_dependencies_launch(default_instance_group, job_template_factory, mocker, inventory_source_factory): + instance = default_instance_group.instances.all()[0] objects = job_template_factory('jt', organization='org1', project='proj', inventory='inv', credential='cred', jobs=["first_job", "second_job"]) @@ -218,8 +225,8 @@ def test_shared_dependencies_launch(default_instance_group, job_template_factory TaskManager().schedule() pu = p.project_updates.first() iu = ii.inventory_updates.first() - TaskManager.start_task.assert_has_calls([mock.call(pu, default_instance_group, [iu, j1]), - mock.call(iu, default_instance_group, [pu, j1])]) + TaskManager.start_task.assert_has_calls([mock.call(pu, default_instance_group, [iu, j1], instance), + mock.call(iu, default_instance_group, [pu, j1], instance)]) pu.status = "successful" pu.finished = pu.created + timedelta(seconds=1) pu.save() @@ -228,12 +235,12 @@ def test_shared_dependencies_launch(default_instance_group, job_template_factory iu.save() with mock.patch("awx.main.scheduler.TaskManager.start_task"): TaskManager().schedule() - TaskManager.start_task.assert_called_once_with(j1, default_instance_group, []) + TaskManager.start_task.assert_called_once_with(j1, default_instance_group, [], instance) j1.status = "successful" j1.save() with mock.patch("awx.main.scheduler.TaskManager.start_task"): TaskManager().schedule() - TaskManager.start_task.assert_called_once_with(j2, default_instance_group, []) + TaskManager.start_task.assert_called_once_with(j2, default_instance_group, [], instance) pu = [x for x in p.project_updates.all()] iu = [x for x in ii.inventory_updates.all()] assert len(pu) == 1 diff --git a/awx/main/tests/unit/test_tasks.py b/awx/main/tests/unit/test_tasks.py index 07a111654b..0920767c57 100644 --- a/awx/main/tests/unit/test_tasks.py +++ b/awx/main/tests/unit/test_tasks.py @@ -196,7 +196,7 @@ def parse_extra_vars(args): return extra_vars -class TestJobExecution: +class TestJobExecution(object): """ For job runs, test that `ansible-playbook` is invoked with the proper arguments, environment variables, and pexpect passwords for a variety of @@ -440,7 +440,7 @@ class TestGenericRun(TestJobExecution): with pytest.raises(Exception): self.task.run(self.pk) for c in [ - mock.call(self.pk, execution_node=settings.CLUSTER_HOST_ID, status='running', start_args=''), + mock.call(self.pk, status='running', start_args=''), mock.call(self.pk, status='canceled') ]: assert c in self.task.update_model.call_args_list @@ -626,7 +626,12 @@ class TestAdhocRun(TestJobExecution): class TestIsolatedExecution(TestJobExecution): - REMOTE_HOST = 'some-isolated-host' + ISOLATED_HOST = 'some-isolated-host' + + def get_instance(self): + instance = super(TestIsolatedExecution, self).get_instance() + instance.get_isolated_execution_node_name = mock.Mock(return_value=self.ISOLATED_HOST) + return instance def test_with_ssh_credentials(self): ssh = CredentialType.defaults['ssh']() @@ -659,12 +664,12 @@ class TestIsolatedExecution(TestJobExecution): f.write(data) return ('successful', 0) self.run_pexpect.side_effect = _mock_job_artifacts - self.task.run(self.pk, self.REMOTE_HOST) + self.task.run(self.pk) playbook_run = self.run_pexpect.call_args_list[0][0] assert ' '.join(playbook_run[0]).startswith(' '.join([ 'ansible-playbook', 'run_isolated.yml', '-u', settings.AWX_ISOLATED_USERNAME, - '-T', str(settings.AWX_ISOLATED_CONNECTION_TIMEOUT), '-i', self.REMOTE_HOST + ',', + '-T', str(settings.AWX_ISOLATED_CONNECTION_TIMEOUT), '-i', self.ISOLATED_HOST + ',', '-e', ])) extra_vars = playbook_run[0][playbook_run[0].index('-e') + 1] @@ -705,7 +710,7 @@ class TestIsolatedExecution(TestJobExecution): with mock.patch('requests.get') as mock_get: mock_get.return_value = mock.Mock(content=inventory) with pytest.raises(Exception): - self.task.run(self.pk, self.REMOTE_HOST) + self.task.run(self.pk, self.ISOLATED_HOST) class TestJobCredentials(TestJobExecution):