diff --git a/awx/api/serializers.py b/awx/api/serializers.py index bd1f486dd8..c3c151e1d1 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -3750,7 +3750,11 @@ class LaunchConfigurationBaseSerializer(BaseSerializer): # Build unsaved version of this config, use it to detect prompts errors mock_obj = self._build_mock_obj(attrs) - accepted, rejected, errors = ujt._accept_or_ignore_job_kwargs(_exclude_errors=self.exclude_errors, **mock_obj.prompts_dict()) + if set(list(ujt.get_ask_mapping().keys()) + ['extra_data']) & set(attrs.keys()): + accepted, rejected, errors = ujt._accept_or_ignore_job_kwargs(_exclude_errors=self.exclude_errors, **mock_obj.prompts_dict()) + else: + # Only perform validation of prompts if prompts fields are provided + errors = {} # Remove all unprocessed $encrypted$ strings, indicating default usage if 'extra_data' in attrs and password_dict: diff --git a/awx/main/tests/functional/api/test_schedules.py b/awx/main/tests/functional/api/test_schedules.py index 9bd85b3c0e..abd17ead7d 100644 --- a/awx/main/tests/functional/api/test_schedules.py +++ b/awx/main/tests/functional/api/test_schedules.py @@ -105,6 +105,30 @@ def test_encrypted_survey_answer(post, patch, admin_user, project, inventory, su assert decrypt_value(get_encryption_key('value', pk=None), schedule.extra_data['var1']) == 'bar' +@pytest.mark.django_db +def test_survey_password_default(post, patch, admin_user, project, inventory, survey_spec_factory): + job_template = JobTemplate.objects.create( + name='test-jt', + project=project, + playbook='helloworld.yml', + inventory=inventory, + ask_variables_on_launch=False, + survey_enabled=True, + survey_spec=survey_spec_factory([{'variable': 'var1', 'question_name': 'Q1', 'type': 'password', 'required': True, 'default': 'foobar'}]), + ) + + # test removal of $encrypted$ + url = reverse('api:job_template_schedules_list', kwargs={'pk': job_template.id}) + r = post(url, {'name': 'test sch', 'rrule': RRULE_EXAMPLE, 'extra_data': '{"var1": "$encrypted$"}'}, admin_user, expect=201) + schedule = Schedule.objects.get(pk=r.data['id']) + assert schedule.extra_data == {} + assert schedule.enabled is True + + # test an unrelated change + patch(schedule.get_absolute_url(), data={'enabled': False}, user=admin_user, expect=200) + patch(schedule.get_absolute_url(), data={'enabled': True}, user=admin_user, expect=200) + + @pytest.mark.django_db @pytest.mark.parametrize( 'rrule, error',