From c88621f5fbcd801059c1891d11e86ca853df8ca5 Mon Sep 17 00:00:00 2001 From: AlanCoding Date: Thu, 5 Apr 2018 08:42:09 -0400 Subject: [PATCH 1/2] more accurate handling of serializer cred versioning --- awx/api/serializers.py | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/awx/api/serializers.py b/awx/api/serializers.py index 4c1dd83b3a..0ac84bea4a 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -3097,7 +3097,6 @@ class JobTemplateSerializer(JobTemplateMixin, UnifiedJobTemplateSerializer, JobO def get_summary_fields(self, obj): summary_fields = super(JobTemplateSerializer, self).get_summary_fields(obj) all_creds = [] - extra_creds = [] if obj.pk: for cred in obj.credentials.all(): summarized_cred = { @@ -3108,20 +3107,31 @@ class JobTemplateSerializer(JobTemplateMixin, UnifiedJobTemplateSerializer, JobO 'credential_type_id': cred.credential_type_id } all_creds.append(summarized_cred) - if self.is_detail_view: - for summarized_cred in all_creds: - if summarized_cred['kind'] in ('cloud', 'net'): - extra_creds.append(summarized_cred) - elif summarized_cred['kind'] == 'ssh': - summary_fields['credential'] = summarized_cred - elif summarized_cred['kind'] == 'vault': - summary_fields['vault_credential'] = summarized_cred + # Organize credential data into multitude of deprecated fields + extra_creds = [] + vault_credential = None + credential = None + for summarized_cred in all_creds: + if summarized_cred['kind'] in ('cloud', 'net'): + extra_creds.append(summarized_cred) + elif summarized_cred['kind'] == 'ssh': + credential = summarized_cred + elif summarized_cred['kind'] == 'vault': + vault_credential = summarized_cred + # Selectively apply those fields, depending on view deetails + if (self.is_detail_view or self.version == 1) and credential: + summary_fields['credential'] = credential + else: + # Credential could be an empty dictionary in this case + summary_fields.pop('credential', None) + if (self.is_detail_view or self.version == 1) and vault_credential: + summary_fields['vault_credential'] = vault_credential + else: + # vault credential could be empty dictionary + summary_fields.pop('vault_credential', None) if self.version > 1: if self.is_detail_view: summary_fields['extra_credentials'] = extra_creds - else: - # Credential would be an empty dictionary in this case - summary_fields.pop('credential', None) summary_fields['credentials'] = all_creds return summary_fields From c1f192199558f22a3434552044e240d971d08b4d Mon Sep 17 00:00:00 2001 From: AlanCoding Date: Mon, 9 Apr 2018 09:56:43 -0400 Subject: [PATCH 2/2] add test for JT credential summary_fields --- .../tests/functional/api/test_job_template.py | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/awx/main/tests/functional/api/test_job_template.py b/awx/main/tests/functional/api/test_job_template.py index fe729b8c84..3bd337f10f 100644 --- a/awx/main/tests/functional/api/test_job_template.py +++ b/awx/main/tests/functional/api/test_job_template.py @@ -116,6 +116,51 @@ def test_create_v1_rbac_check(get, post, project, credential, net_credential, ra post(reverse('api:job_template_list', kwargs={'version': 'v1'}), base_kwargs, rando, expect=403) +# TODO: remove as each field tested has support removed +@pytest.mark.django_db +def test_jt_deprecated_summary_fields( + project, inventory, + machine_credential, net_credential, vault_credential, + mocker): + jt = JobTemplate.objects.create( + project=project, + inventory=inventory, + playbook='helloworld.yml' + ) + + class MockView: + kwargs = {} + request = None + + class MockRequest: + version = 'v1' + user = None + + view = MockView() + request = MockRequest() + view.request = request + serializer = JobTemplateSerializer(instance=jt, context={'view': view, 'request': request}) + + for kwargs in [{}, {'pk': 1}]: # detail vs. list view + for version in ['v1', 'v2']: + view.kwargs = kwargs + request.version = version + sf = serializer.get_summary_fields(jt) + assert 'credential' not in sf + assert 'vault_credential' not in sf + + jt.credentials.add(machine_credential, net_credential, vault_credential) + + view.kwargs = {'pk': 1} + for version in ['v1', 'v2']: + request.version = version + sf = serializer.get_summary_fields(jt) + assert 'credential' in sf + assert sf['credential'] # not empty dict + assert 'vault_credential' in sf + assert sf['vault_credential'] + + @pytest.mark.django_db def test_extra_credential_creation(get, post, organization_factory, job_template_factory, credentialtype_aws): objs = organization_factory("org", superusers=['admin'])