Beispiel #1
0
def test_multi_jt_capacity_blocking(hybrid_instance, job_template_factory,
                                    mocker):
    instance = hybrid_instance
    controlplane_instance_group = instance.rampart_groups.first()
    objects1 = job_template_factory('jt1',
                                    organization='org1',
                                    project='proj1',
                                    inventory='inv1',
                                    credential='cred1')
    objects2 = job_template_factory('jt2',
                                    organization='org2',
                                    project='proj2',
                                    inventory='inv2',
                                    credential='cred2')
    j1 = create_job(objects1.job_template)
    j2 = create_job(objects2.job_template)
    tm = TaskManager()
    with mock.patch('awx.main.models.Job.task_impact',
                    new_callable=mock.PropertyMock) as mock_task_impact:
        mock_task_impact.return_value = 505
        with mock.patch.object(TaskManager, "start_task",
                               wraps=tm.start_task) as mock_job:
            tm.schedule()
            mock_job.assert_called_once_with(j1, controlplane_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, controlplane_instance_group, [],
                                         instance)
def test_single_job_dependencies_inventory_update_launch(default_instance_group, job_template_factory, mocker, inventory_source_factory):
    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()
    i = objects.inventory
    ii = inventory_source_factory("ec2")
    ii.source = "ec2"
    ii.update_on_launch = True
    ii.update_cache_timeout = 0
    ii.save()
    i.inventory_sources.add(ii)
    with mock.patch("awx.main.scheduler.TaskManager.start_task"):
        tm = TaskManager()
        with mock.patch.object(TaskManager, "create_inventory_update", wraps=tm.create_inventory_update) as mock_iu:
            tm.schedule()
            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], 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, [], instance)
def test_job_dependency_with_already_updated(default_instance_group, job_template_factory, mocker, inventory_source_factory):
    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()
    i = objects.inventory
    ii = inventory_source_factory("ec2")
    ii.source = "ec2"
    ii.update_on_launch = True
    ii.update_cache_timeout = 0
    ii.save()
    i.inventory_sources.add(ii)
    j.start_args = json.dumps(dict(inventory_sources_already_updated=[ii.id]))
    j.save()
    j.start_args = encrypt_field(j, field_name="start_args")
    j.save()
    with mock.patch("awx.main.scheduler.TaskManager.start_task"):
        tm = TaskManager()
        with mock.patch.object(TaskManager, "create_inventory_update", wraps=tm.create_inventory_update) as mock_iu:
            tm.schedule()
            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, [], instance)
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()
    p = objects.project
    p.scm_update_on_launch = True
    p.scm_update_cache_timeout = 0
    p.scm_type = "git"
    p.scm_url = "http://github.com/ansible/ansible.git"
    p.save(skip_update=True)
    with mock.patch("awx.main.scheduler.TaskManager.start_task"):
        tm = TaskManager()
        with mock.patch.object(TaskManager, "create_project_update", wraps=tm.create_project_update) as mock_pu:
            tm.schedule()
            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], 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, [], instance)
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"])
    objects2 = job_template_factory('jt2', organization='org2', project='proj2',
                                    inventory='inv2', credential='cred2',
                                    jobs=["job_should_not_start"])
    j1 = objects1.jobs["job_should_start"]
    j1.status = 'pending'
    j1.save()
    j2 = objects2.jobs["job_should_not_start"]
    j2.status = 'pending'
    j2.save()
    tm = TaskManager()
    with mock.patch('awx.main.models.Job.task_impact', new_callable=mock.PropertyMock) as mock_task_impact:
        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, [], 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, [], instance)
Beispiel #6
0
def test_failover_group_run(instance_factory, controlplane_instance_group,
                            mocker, instance_group_factory,
                            job_template_factory):
    i1 = instance_factory("i1")
    i2 = instance_factory("i2")
    ig1 = instance_group_factory("ig1", instances=[i1])
    ig2 = instance_group_factory("ig2", instances=[i2])
    objects1 = job_template_factory('jt1',
                                    organization='org1',
                                    project='proj1',
                                    inventory='inv1',
                                    credential='cred1')
    objects1.job_template.instance_groups.add(ig1)
    j1 = create_job(objects1.job_template)
    objects2 = job_template_factory('jt2',
                                    organization=objects1.organization,
                                    project='proj2',
                                    inventory='inv2',
                                    credential='cred2')
    objects2.job_template.instance_groups.add(ig1)
    objects2.job_template.instance_groups.add(ig2)
    j1_1 = create_job(objects2.job_template)
    tm = TaskManager()
    with mock.patch('awx.main.models.Job.task_impact',
                    new_callable=mock.PropertyMock) as mock_task_impact:
        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, [], i1),
                 mock.call(j1_1, ig2, [], i2)])
            assert mock_job.call_count == 2
Beispiel #7
0
def test_inventory_update_launches_project_update(controlplane_instance_group,
                                                  scm_inventory_source):
    ii = scm_inventory_source
    project = scm_inventory_source.source_project
    project.scm_update_on_launch = True
    project.save()
    iu = ii.create_inventory_update()
    iu.status = "pending"
    iu.save()
    with mock.patch("awx.main.scheduler.TaskManager.start_task"):
        tm = TaskManager()
        with mock.patch.object(TaskManager,
                               "create_project_update",
                               wraps=tm.create_project_update) as mock_pu:
            tm.schedule()
            mock_pu.assert_called_with(iu, project_id=project.id)
Beispiel #8
0
def test_overcapacity_blocking_other_groups_unaffected(
        instance_factory, controlplane_instance_group, mocker,
        instance_group_factory, job_template_factory):
    i1 = instance_factory("i1")
    # need to account a little extra for controller node capacity impact
    i1.capacity = 1020
    i1.save()
    i2 = instance_factory("i2")
    ig1 = instance_group_factory("ig1", instances=[i1])
    ig2 = instance_group_factory("ig2", instances=[i2])
    objects1 = job_template_factory('jt1',
                                    organization='org1',
                                    project='proj1',
                                    inventory='inv1',
                                    credential='cred1',
                                    jobs=["job_should_start"])
    objects1.job_template.instance_groups.add(ig1)
    j1 = objects1.jobs['job_should_start']
    j1.status = 'pending'
    j1.save()
    objects2 = job_template_factory(
        'jt2',
        organization=objects1.organization,
        project='proj2',
        inventory='inv2',
        credential='cred2',
        jobs=["job_should_start", "job_should_also_start"])
    objects2.job_template.instance_groups.add(ig1)
    j1_1 = objects2.jobs['job_should_also_start']
    j1_1.status = 'pending'
    j1_1.save()
    objects3 = job_template_factory('jt3',
                                    organization='org2',
                                    project='proj3',
                                    inventory='inv3',
                                    credential='cred3',
                                    jobs=["job_should_still_start"])
    objects3.job_template.instance_groups.add(ig2)
    j2 = objects3.jobs['job_should_still_start']
    j2.status = 'pending'
    j2.save()
    objects4 = job_template_factory('jt4',
                                    organization=objects3.organization,
                                    project='proj4',
                                    inventory='inv4',
                                    credential='cred4',
                                    jobs=["job_should_not_start"])
    objects4.job_template.instance_groups.add(ig2)
    j2_1 = objects4.jobs['job_should_not_start']
    j2_1.status = 'pending'
    j2_1.save()
    tm = TaskManager()
    with mock.patch('awx.main.models.Job.task_impact',
                    new_callable=mock.PropertyMock) as mock_task_impact:
        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, [], i1),
                mock.call(j1_1, ig1, [], i1),
                mock.call(j2, ig2, [], i2)
            ])
            assert mock_job.call_count == 3