From 3c241052716bc61c3dbc6e7ca0e30de226996a6d Mon Sep 17 00:00:00 2001 From: AlanCoding Date: Mon, 24 Oct 2016 16:31:33 -0400 Subject: [PATCH 1/3] update JT playbook validation for HA --- awx/api/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/awx/api/serializers.py b/awx/api/serializers.py index d6aa39f706..9d44a6cee1 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -1847,7 +1847,7 @@ class JobOptionsSerializer(LabelsListMixin, BaseSerializer): job_type = attrs.get('job_type', self.instance and self.instance.job_type or None) if not project and job_type != PERM_INVENTORY_SCAN: raise serializers.ValidationError({'project': 'This field is required.'}) - if project and playbook and force_text(playbook) not in project.playbooks: + if project and playbook and force_text(playbook) not in project.playbook_files: raise serializers.ValidationError({'playbook': 'Playbook not found for project.'}) if project and not playbook: raise serializers.ValidationError({'playbook': 'Must select playbook for project.'}) From 3b4b1412fce1c1f0db95f80677114d40d5e36157 Mon Sep 17 00:00:00 2001 From: AlanCoding Date: Mon, 24 Oct 2016 21:04:01 -0400 Subject: [PATCH 2/3] fix tests for project playbook mocking --- awx/main/tests/factories/fixtures.py | 5 +++-- .../tests/functional/api/test_job_template.py | 21 ++++--------------- awx/main/tests/functional/conftest.py | 3 ++- 3 files changed, 9 insertions(+), 20 deletions(-) diff --git a/awx/main/tests/factories/fixtures.py b/awx/main/tests/factories/fixtures.py index ac6c93348d..8f6e5df414 100644 --- a/awx/main/tests/factories/fixtures.py +++ b/awx/main/tests/factories/fixtures.py @@ -74,7 +74,8 @@ def mk_user(name, is_superuser=False, organization=None, team=None, persisted=Tr def mk_project(name, organization=None, description=None, persisted=True): description = description or '{}-description'.format(name) - project = Project(name=name, description=description) + project = Project(name=name, description=description, + playbook_files=['helloworld.yml', 'alt-helloworld.yml']) if organization is not None: project.organization = organization if persisted: @@ -134,7 +135,7 @@ def mk_job_template(name, job_type='run', extra_vars = json.dumps(extra_vars) jt = JobTemplate(name=name, job_type=job_type, extra_vars=extra_vars, - playbook='mocked') + playbook='helloworld.yml') jt.inventory = inventory if jt.inventory is None: diff --git a/awx/main/tests/functional/api/test_job_template.py b/awx/main/tests/functional/api/test_job_template.py index 68a7e7aecd..df577e84dc 100644 --- a/awx/main/tests/functional/api/test_job_template.py +++ b/awx/main/tests/functional/api/test_job_template.py @@ -11,12 +11,7 @@ from awx.main.migrations import _save_password_keys as save_password_keys from django.core.urlresolvers import reverse from django.apps import apps -@property -def project_playbooks(self): - return ['mocked', 'mocked.yml', 'alt-mocked.yml'] - @pytest.mark.django_db -@mock.patch.object(ProjectOptions, "playbooks", project_playbooks) @pytest.mark.parametrize( "grant_project, grant_credential, grant_inventory, expect", [ (True, True, True, 201), @@ -38,11 +33,10 @@ def test_create(post, project, machine_credential, inventory, alice, grant_proje 'project': project.id, 'credential': machine_credential.id, 'inventory': inventory.id, - 'playbook': 'mocked.yml', + 'playbook': 'helloworld.yml', }, alice, expect=expect) @pytest.mark.django_db -@mock.patch.object(ProjectOptions, "playbooks", project_playbooks) @pytest.mark.parametrize( "grant_project, grant_credential, grant_inventory, expect", [ (True, True, True, 200), @@ -67,11 +61,10 @@ def test_edit_sensitive_fields(patch, job_template_factory, alice, grant_project 'project': objs.project.id, 'credential': objs.credential.id, 'inventory': objs.inventory.id, - 'playbook': 'alt-mocked.yml', + 'playbook': 'alt-helloworld.yml', }, alice, expect=expect) @pytest.mark.django_db -@mock.patch.object(ProjectOptions, "playbooks", project_playbooks) def test_edit_playbook(patch, job_template_factory, alice): objs = job_template_factory('jt', organization='org1', project='prj', inventory='inv', credential='cred') objs.job_template.admin_role.members.add(alice) @@ -80,16 +73,15 @@ def test_edit_playbook(patch, job_template_factory, alice): objs.inventory.use_role.members.add(alice) patch(reverse('api:job_template_detail', args=(objs.job_template.id,)), { - 'playbook': 'alt-mocked.yml', + 'playbook': 'alt-helloworld.yml', }, alice, expect=200) objs.inventory.use_role.members.remove(alice) patch(reverse('api:job_template_detail', args=(objs.job_template.id,)), { - 'playbook': 'mocked.yml', + 'playbook': 'helloworld.yml', }, alice, expect=403) @pytest.mark.django_db -@mock.patch.object(ProjectOptions, "playbooks", project_playbooks) def test_edit_nonsenstive(patch, job_template_factory, alice): objs = job_template_factory('jt', organization='org1', project='prj', inventory='inv', credential='cred') jt = objs.job_template @@ -121,10 +113,6 @@ def jt_copy_edit(job_template_factory, project): project=project) return objects.job_template -@property -def project_playbooks(self): - return ['mocked', 'mocked.yml', 'alt-mocked.yml'] - @pytest.mark.django_db def test_job_template_role_user(post, organization_factory, job_template_factory): objects = organization_factory("org", @@ -143,7 +131,6 @@ def test_job_template_role_user(post, organization_factory, job_template_factory @pytest.mark.django_db -@mock.patch.object(ProjectOptions, "playbooks", project_playbooks) def test_jt_admin_copy_edit_functional(jt_copy_edit, rando, get, post): # Grant random user JT admin access only diff --git a/awx/main/tests/functional/conftest.py b/awx/main/tests/functional/conftest.py index 0c620feb7e..0fb6084edb 100644 --- a/awx/main/tests/functional/conftest.py +++ b/awx/main/tests/functional/conftest.py @@ -110,7 +110,8 @@ def team_member(user, team): def project(instance, organization): prj = Project.objects.create(name="test-proj", description="test-proj-desc", - organization=organization + organization=organization, + playbook_files=['helloworld.yml', 'alt-helloworld.yml'] ) return prj From 7da6d2978a75e08210f94ef0f7d84ef95e71eeaa Mon Sep 17 00:00:00 2001 From: AlanCoding Date: Mon, 24 Oct 2016 21:30:03 -0400 Subject: [PATCH 3/3] remove test imports --- awx/main/tests/functional/api/test_job_template.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/awx/main/tests/functional/api/test_job_template.py b/awx/main/tests/functional/api/test_job_template.py index df577e84dc..ca6bdf3d31 100644 --- a/awx/main/tests/functional/api/test_job_template.py +++ b/awx/main/tests/functional/api/test_job_template.py @@ -1,10 +1,8 @@ import pytest -import mock # AWX from awx.api.serializers import JobTemplateSerializer, JobLaunchSerializer from awx.main.models.jobs import Job -from awx.main.models.projects import ProjectOptions from awx.main.migrations import _save_password_keys as save_password_keys # Django