mirror of
https://github.com/ansible/awx.git
synced 2026-05-20 07:17:40 -02:30
Merge pull request #1247 from AlanCoding/more_v1_yay
More accurate handling of serializer cred versioning
This commit is contained in:
@@ -3097,7 +3097,6 @@ class JobTemplateSerializer(JobTemplateMixin, UnifiedJobTemplateSerializer, JobO
|
|||||||
def get_summary_fields(self, obj):
|
def get_summary_fields(self, obj):
|
||||||
summary_fields = super(JobTemplateSerializer, self).get_summary_fields(obj)
|
summary_fields = super(JobTemplateSerializer, self).get_summary_fields(obj)
|
||||||
all_creds = []
|
all_creds = []
|
||||||
extra_creds = []
|
|
||||||
if obj.pk:
|
if obj.pk:
|
||||||
for cred in obj.credentials.all():
|
for cred in obj.credentials.all():
|
||||||
summarized_cred = {
|
summarized_cred = {
|
||||||
@@ -3108,20 +3107,31 @@ class JobTemplateSerializer(JobTemplateMixin, UnifiedJobTemplateSerializer, JobO
|
|||||||
'credential_type_id': cred.credential_type_id
|
'credential_type_id': cred.credential_type_id
|
||||||
}
|
}
|
||||||
all_creds.append(summarized_cred)
|
all_creds.append(summarized_cred)
|
||||||
if self.is_detail_view:
|
# Organize credential data into multitude of deprecated fields
|
||||||
for summarized_cred in all_creds:
|
extra_creds = []
|
||||||
if summarized_cred['kind'] in ('cloud', 'net'):
|
vault_credential = None
|
||||||
extra_creds.append(summarized_cred)
|
credential = None
|
||||||
elif summarized_cred['kind'] == 'ssh':
|
for summarized_cred in all_creds:
|
||||||
summary_fields['credential'] = summarized_cred
|
if summarized_cred['kind'] in ('cloud', 'net'):
|
||||||
elif summarized_cred['kind'] == 'vault':
|
extra_creds.append(summarized_cred)
|
||||||
summary_fields['vault_credential'] = 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.version > 1:
|
||||||
if self.is_detail_view:
|
if self.is_detail_view:
|
||||||
summary_fields['extra_credentials'] = extra_creds
|
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
|
summary_fields['credentials'] = all_creds
|
||||||
return summary_fields
|
return summary_fields
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
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
|
@pytest.mark.django_db
|
||||||
def test_extra_credential_creation(get, post, organization_factory, job_template_factory, credentialtype_aws):
|
def test_extra_credential_creation(get, post, organization_factory, job_template_factory, credentialtype_aws):
|
||||||
objs = organization_factory("org", superusers=['admin'])
|
objs = organization_factory("org", superusers=['admin'])
|
||||||
|
|||||||
Reference in New Issue
Block a user