mirror of
https://github.com/ansible/awx.git
synced 2026-03-28 06:15:04 -02:30
prevent instance group delete if running jobs
* related to https://github.com/ansible/ansible-tower/issues/7936
This commit is contained in:
73
awx/main/tests/functional/api/test_instance_group.py
Normal file
73
awx/main/tests/functional/api/test_instance_group.py
Normal file
@@ -0,0 +1,73 @@
|
||||
import pytest
|
||||
|
||||
from awx.api.versioning import reverse
|
||||
from awx.main.models import (
|
||||
InstanceGroup,
|
||||
ProjectUpdate,
|
||||
)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def instance_group(job_factory):
|
||||
ig = InstanceGroup(name="east")
|
||||
ig.save()
|
||||
return ig
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def create_job_factory(job_factory, instance_group):
|
||||
def fn(status='running'):
|
||||
j = job_factory()
|
||||
j.status = status
|
||||
j.instance_group = instance_group
|
||||
j.save()
|
||||
return j
|
||||
return fn
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def create_project_update_factory(instance_group, project):
|
||||
def fn(status='running'):
|
||||
pu = ProjectUpdate(project=project)
|
||||
pu.status = status
|
||||
pu.instance_group = instance_group
|
||||
pu.save()
|
||||
return pu
|
||||
return fn
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def instance_group_jobs_running(instance_group, create_job_factory, create_project_update_factory):
|
||||
jobs_running = [create_job_factory(status='running') for i in xrange(0, 2)]
|
||||
project_updates_running = [create_project_update_factory(status='running') for i in xrange(0, 2)]
|
||||
return jobs_running + project_updates_running
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def instance_group_jobs_successful(instance_group, create_job_factory, create_project_update_factory):
|
||||
jobs_successful = [create_job_factory(status='successful') for i in xrange(0, 2)]
|
||||
project_updates_successful = [create_project_update_factory(status='successful') for i in xrange(0, 2)]
|
||||
return jobs_successful + project_updates_successful
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_delete_instance_group_jobs(delete, instance_group_jobs_successful, instance_group, admin):
|
||||
url = reverse("api:instance_group_detail", kwargs={'pk': instance_group.pk})
|
||||
delete(url, None, admin, expect=204)
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_delete_instance_group_jobs_running(delete, instance_group_jobs_running, instance_group_jobs_successful, instance_group, admin):
|
||||
def sort_keys(x):
|
||||
return (x['type'], x['id'])
|
||||
|
||||
url = reverse("api:instance_group_detail", kwargs={'pk': instance_group.pk})
|
||||
response = delete(url, None, admin, expect=409)
|
||||
|
||||
expect_transformed = [dict(id=str(j.id), type=j.model_to_str()) for j in instance_group_jobs_running]
|
||||
response_sorted = sorted(response.data['active_jobs'], key=sort_keys)
|
||||
expect_sorted = sorted(expect_transformed, key=sort_keys)
|
||||
|
||||
assert response.data['error'] == u"Resource is being used by running jobs."
|
||||
assert response_sorted == expect_sorted
|
||||
|
||||
@@ -14,6 +14,40 @@ from awx.main.models import * # noqa
|
||||
from awx.api.versioning import reverse
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def create_job_factory(job_factory, project):
|
||||
def fn(status='running'):
|
||||
j = job_factory()
|
||||
j.status = status
|
||||
j.project = project
|
||||
j.save()
|
||||
return j
|
||||
return fn
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def create_project_update_factory(organization, project):
|
||||
def fn(status='running'):
|
||||
pu = ProjectUpdate(project=project)
|
||||
pu.status = status
|
||||
pu.organization = organization
|
||||
pu.save()
|
||||
return pu
|
||||
return fn
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def organization_jobs_successful(create_job_factory, create_project_update_factory):
|
||||
return [create_job_factory(status='successful') for i in xrange(0, 2)] + \
|
||||
[create_project_update_factory(status='successful') for i in xrange(0, 2)]
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def organization_jobs_running(create_job_factory, create_project_update_factory):
|
||||
return [create_job_factory(status='running') for i in xrange(0, 2)] + \
|
||||
[create_project_update_factory(status='running') for i in xrange(0, 2)]
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_organization_list_access_tests(options, head, get, admin, alice):
|
||||
options(reverse('api:organization_list'), user=admin, expect=200)
|
||||
@@ -215,3 +249,27 @@ def test_organization_unset_custom_virtualenv(get, patch, organization, admin, v
|
||||
url = reverse('api:organization_detail', kwargs={'pk': organization.id})
|
||||
resp = patch(url, {'custom_virtualenv': value}, user=admin, expect=200)
|
||||
assert resp.data['custom_virtualenv'] is None
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_organization_delete(delete, admin, organization, organization_jobs_successful):
|
||||
url = reverse('api:organization_detail', kwargs={'pk': organization.id})
|
||||
delete(url, None, user=admin, expect=204)
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_organization_delete_with_active_jobs(delete, admin, organization, organization_jobs_running):
|
||||
def sort_keys(x):
|
||||
return (x['type'], x['id'])
|
||||
|
||||
url = reverse('api:organization_detail', kwargs={'pk': organization.id})
|
||||
resp = delete(url, None, user=admin, expect=409)
|
||||
|
||||
expect_transformed = [dict(id=str(j.id), type=j.model_to_str()) for j in organization_jobs_running]
|
||||
resp_sorted = sorted(resp.data['active_jobs'], key=sort_keys)
|
||||
expect_sorted = sorted(expect_transformed, key=sort_keys)
|
||||
|
||||
assert resp.data['error'] == u"Resource is being used by running jobs."
|
||||
assert resp_sorted == expect_sorted
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user