update unit and functional tests

This commit is contained in:
chris meyers
2018-05-31 13:48:47 -04:00
parent 9863fe71dc
commit 9d732cdbdf
4 changed files with 51 additions and 34 deletions

View File

@@ -88,7 +88,7 @@ class TestIsolatedRuns:
with mock.patch.object(job, '_get_task_class') as task_class: with mock.patch.object(job, '_get_task_class') as task_class:
task_class.return_value = MockTaskClass task_class.return_value = MockTaskClass
job.start_celery_task([], error_callback, success_callback, 'thepentagon') 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_error=error_callback,
link=success_callback, link=success_callback,
queue='thepentagon', queue='thepentagon',
@@ -100,7 +100,7 @@ class TestIsolatedRuns:
with mock.patch.object(job, '_get_task_class') as task_class: with mock.patch.object(job, '_get_task_class') as task_class:
task_class.return_value = MockTaskClass task_class.return_value = MockTaskClass
job.start_celery_task([], error_callback, success_callback, 'thepentagon') 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_error=error_callback,
link=success_callback, link=success_callback,
queue='thepentagon', queue='thepentagon',

View File

@@ -31,7 +31,7 @@ def test_multi_group_basic_job_launch(instance_factory, default_instance_group,
mock_task_impact.return_value = 500 mock_task_impact.return_value = 500
with mocker.patch("awx.main.scheduler.TaskManager.start_task"): with mocker.patch("awx.main.scheduler.TaskManager.start_task"):
TaskManager().schedule() 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"): with mocker.patch("awx.main.scheduler.TaskManager.start_task"):
TaskManager().schedule() TaskManager().schedule()
pu = p.project_updates.first() 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.finished = pu.created + timedelta(seconds=1)
pu.status = "successful" pu.status = "successful"
pu.save() pu.save()
with mock.patch("awx.main.scheduler.TaskManager.start_task"): with mock.patch("awx.main.scheduler.TaskManager.start_task"):
TaskManager().schedule() TaskManager().schedule()
TaskManager.start_task.assert_any_call(j1, ig1, []) TaskManager.start_task.assert_any_call(j1, ig1, [], i1)
TaskManager.start_task.assert_any_call(j2, ig2, []) TaskManager.start_task.assert_any_call(j2, ig2, [], i2)
assert TaskManager.start_task.call_count == 2 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() wfj.save()
with mocker.patch("awx.main.scheduler.TaskManager.start_task"): with mocker.patch("awx.main.scheduler.TaskManager.start_task"):
TaskManager().schedule() 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 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 mock_task_impact.return_value = 500
with mock.patch.object(TaskManager, "start_task", wraps=tm.start_task) as mock_job: with mock.patch.object(TaskManager, "start_task", wraps=tm.start_task) as mock_job:
tm.schedule() tm.schedule()
mock_job.assert_has_calls([mock.call(j1, ig1, []), mock.call(j1_1, ig1, []), mock_job.assert_has_calls([mock.call(j1, ig1, [], i1),
mock.call(j2, ig2, [])]) mock.call(j1_1, ig1, [], i1),
mock.call(j2, ig2, [], i2)])
assert mock_job.call_count == 3 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 mock_task_impact.return_value = 500
with mock.patch.object(TaskManager, "start_task", wraps=tm.start_task) as mock_job: with mock.patch.object(TaskManager, "start_task", wraps=tm.start_task) as mock_job:
tm.schedule() 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 assert mock_job.call_count == 2

View File

@@ -18,6 +18,7 @@ from awx.main.models.notifications import JobNotificationMixin
@pytest.mark.django_db @pytest.mark.django_db
def test_single_job_scheduler_launch(default_instance_group, job_template_factory, mocker): 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', objects = job_template_factory('jt', organization='org1', project='proj',
inventory='inv', credential='cred', inventory='inv', credential='cred',
jobs=["job_should_start"]) jobs=["job_should_start"])
@@ -26,11 +27,12 @@ def test_single_job_scheduler_launch(default_instance_group, job_template_factor
j.save() j.save()
with mocker.patch("awx.main.scheduler.TaskManager.start_task"): with mocker.patch("awx.main.scheduler.TaskManager.start_task"):
TaskManager().schedule() 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 @pytest.mark.django_db
def test_single_jt_multi_job_launch_blocks_last(default_instance_group, job_template_factory, mocker): 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', objects = job_template_factory('jt', organization='org1', project='proj',
inventory='inv', credential='cred', inventory='inv', credential='cred',
jobs=["job_should_start", "job_should_not_start"]) 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() j2.save()
with mock.patch("awx.main.scheduler.TaskManager.start_task"): with mock.patch("awx.main.scheduler.TaskManager.start_task"):
TaskManager().schedule() 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.status = "successful"
j1.save() j1.save()
with mocker.patch("awx.main.scheduler.TaskManager.start_task"): with mocker.patch("awx.main.scheduler.TaskManager.start_task"):
TaskManager().schedule() 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 @pytest.mark.django_db
def test_single_jt_multi_job_launch_allow_simul_allowed(default_instance_group, job_template_factory, mocker): 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', objects = job_template_factory('jt', organization='org1', project='proj',
inventory='inv', credential='cred', inventory='inv', credential='cred',
jobs=["job_should_start", "job_should_not_start"]) 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() j2.save()
with mock.patch("awx.main.scheduler.TaskManager.start_task"): with mock.patch("awx.main.scheduler.TaskManager.start_task"):
TaskManager().schedule() TaskManager().schedule()
TaskManager.start_task.assert_has_calls([mock.call(j1, default_instance_group, []), TaskManager.start_task.assert_has_calls([mock.call(j1, default_instance_group, [], instance),
mock.call(j2, default_instance_group, [])]) mock.call(j2, default_instance_group, [], instance)])
@pytest.mark.django_db @pytest.mark.django_db
def test_multi_jt_capacity_blocking(default_instance_group, job_template_factory, mocker): 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', objects1 = job_template_factory('jt1', organization='org1', project='proj1',
inventory='inv1', credential='cred1', inventory='inv1', credential='cred1',
jobs=["job_should_start"]) jobs=["job_should_start"])
@@ -91,13 +95,12 @@ def test_multi_jt_capacity_blocking(default_instance_group, job_template_factory
mock_task_impact.return_value = 500 mock_task_impact.return_value = 500
with mock.patch.object(TaskManager, "start_task", wraps=tm.start_task) as mock_job: with mock.patch.object(TaskManager, "start_task", wraps=tm.start_task) as mock_job:
tm.schedule() 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.status = "successful"
j1.save() j1.save()
with mock.patch.object(TaskManager, "start_task", wraps=tm.start_task) as mock_job: with mock.patch.object(TaskManager, "start_task", wraps=tm.start_task) as mock_job:
tm.schedule() 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 @pytest.mark.django_db
@@ -105,6 +108,7 @@ def test_single_job_dependencies_project_launch(default_instance_group, job_temp
objects = job_template_factory('jt', organization='org1', project='proj', objects = job_template_factory('jt', organization='org1', project='proj',
inventory='inv', credential='cred', inventory='inv', credential='cred',
jobs=["job_should_start"]) jobs=["job_should_start"])
instance = default_instance_group.instances.all()[0]
j = objects.jobs["job_should_start"] j = objects.jobs["job_should_start"]
j.status = 'pending' j.status = 'pending'
j.save() 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) mock_pu.assert_called_once_with(j)
pu = [x for x in p.project_updates.all()] pu = [x for x in p.project_updates.all()]
assert len(pu) == 1 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].status = "successful"
pu[0].save() pu[0].save()
with mock.patch("awx.main.scheduler.TaskManager.start_task"): with mock.patch("awx.main.scheduler.TaskManager.start_task"):
TaskManager().schedule() 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 @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', objects = job_template_factory('jt', organization='org1', project='proj',
inventory='inv', credential='cred', inventory='inv', credential='cred',
jobs=["job_should_start"]) jobs=["job_should_start"])
instance = default_instance_group.instances.all()[0]
j = objects.jobs["job_should_start"] j = objects.jobs["job_should_start"]
j.status = 'pending' j.status = 'pending'
j.save() 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) mock_iu.assert_called_once_with(j, ii)
iu = [x for x in ii.inventory_updates.all()] iu = [x for x in ii.inventory_updates.all()]
assert len(iu) == 1 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].status = "successful"
iu[0].save() iu[0].save()
with mock.patch("awx.main.scheduler.TaskManager.start_task"): with mock.patch("awx.main.scheduler.TaskManager.start_task"):
TaskManager().schedule() 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 @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', objects = job_template_factory('jt', organization='org1', project='proj',
inventory='inv', credential='cred', inventory='inv', credential='cred',
jobs=["job_should_start"]) jobs=["job_should_start"])
instance = default_instance_group.instances.all()[0]
j = objects.jobs["job_should_start"] j = objects.jobs["job_should_start"]
j.status = 'pending' j.status = 'pending'
j.save() j.save()
@@ -185,11 +191,12 @@ def test_job_dependency_with_already_updated(default_instance_group, job_templat
mock_iu.assert_not_called() mock_iu.assert_not_called()
with mock.patch("awx.main.scheduler.TaskManager.start_task"): with mock.patch("awx.main.scheduler.TaskManager.start_task"):
TaskManager().schedule() 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 @pytest.mark.django_db
def test_shared_dependencies_launch(default_instance_group, job_template_factory, mocker, inventory_source_factory): 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', objects = job_template_factory('jt', organization='org1', project='proj',
inventory='inv', credential='cred', inventory='inv', credential='cred',
jobs=["first_job", "second_job"]) jobs=["first_job", "second_job"])
@@ -218,8 +225,8 @@ def test_shared_dependencies_launch(default_instance_group, job_template_factory
TaskManager().schedule() TaskManager().schedule()
pu = p.project_updates.first() pu = p.project_updates.first()
iu = ii.inventory_updates.first() iu = ii.inventory_updates.first()
TaskManager.start_task.assert_has_calls([mock.call(pu, default_instance_group, [iu, j1]), TaskManager.start_task.assert_has_calls([mock.call(pu, default_instance_group, [iu, j1], instance),
mock.call(iu, default_instance_group, [pu, j1])]) mock.call(iu, default_instance_group, [pu, j1], instance)])
pu.status = "successful" pu.status = "successful"
pu.finished = pu.created + timedelta(seconds=1) pu.finished = pu.created + timedelta(seconds=1)
pu.save() pu.save()
@@ -228,12 +235,12 @@ def test_shared_dependencies_launch(default_instance_group, job_template_factory
iu.save() iu.save()
with mock.patch("awx.main.scheduler.TaskManager.start_task"): with mock.patch("awx.main.scheduler.TaskManager.start_task"):
TaskManager().schedule() 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.status = "successful"
j1.save() j1.save()
with mock.patch("awx.main.scheduler.TaskManager.start_task"): with mock.patch("awx.main.scheduler.TaskManager.start_task"):
TaskManager().schedule() 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()] pu = [x for x in p.project_updates.all()]
iu = [x for x in ii.inventory_updates.all()] iu = [x for x in ii.inventory_updates.all()]
assert len(pu) == 1 assert len(pu) == 1

View File

@@ -196,7 +196,7 @@ def parse_extra_vars(args):
return extra_vars return extra_vars
class TestJobExecution: class TestJobExecution(object):
""" """
For job runs, test that `ansible-playbook` is invoked with the proper For job runs, test that `ansible-playbook` is invoked with the proper
arguments, environment variables, and pexpect passwords for a variety of arguments, environment variables, and pexpect passwords for a variety of
@@ -440,7 +440,7 @@ class TestGenericRun(TestJobExecution):
with pytest.raises(Exception): with pytest.raises(Exception):
self.task.run(self.pk) self.task.run(self.pk)
for c in [ 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') mock.call(self.pk, status='canceled')
]: ]:
assert c in self.task.update_model.call_args_list assert c in self.task.update_model.call_args_list
@@ -626,7 +626,12 @@ class TestAdhocRun(TestJobExecution):
class TestIsolatedExecution(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): def test_with_ssh_credentials(self):
ssh = CredentialType.defaults['ssh']() ssh = CredentialType.defaults['ssh']()
@@ -659,12 +664,12 @@ class TestIsolatedExecution(TestJobExecution):
f.write(data) f.write(data)
return ('successful', 0) return ('successful', 0)
self.run_pexpect.side_effect = _mock_job_artifacts 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] playbook_run = self.run_pexpect.call_args_list[0][0]
assert ' '.join(playbook_run[0]).startswith(' '.join([ assert ' '.join(playbook_run[0]).startswith(' '.join([
'ansible-playbook', 'run_isolated.yml', '-u', settings.AWX_ISOLATED_USERNAME, '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', '-e',
])) ]))
extra_vars = playbook_run[0][playbook_run[0].index('-e') + 1] 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: with mock.patch('requests.get') as mock_get:
mock_get.return_value = mock.Mock(content=inventory) mock_get.return_value = mock.Mock(content=inventory)
with pytest.raises(Exception): with pytest.raises(Exception):
self.task.run(self.pk, self.REMOTE_HOST) self.task.run(self.pk, self.ISOLATED_HOST)
class TestJobCredentials(TestJobExecution): class TestJobCredentials(TestJobExecution):