diff --git a/awx/api/serializers.py b/awx/api/serializers.py index 709ad1d769..3923e5c9ef 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -3176,7 +3176,7 @@ class WorkflowJobTemplateNodeSerializer(LaunchConfigurationBaseSerializer): success_nodes = serializers.PrimaryKeyRelatedField(many=True, read_only=True) failure_nodes = serializers.PrimaryKeyRelatedField(many=True, read_only=True) always_nodes = serializers.PrimaryKeyRelatedField(many=True, read_only=True) - exclude_errors = ('required') # required variables may be provided by WFJT or on launch + exclude_errors = ('required',) # required variables may be provided by WFJT or on launch class Meta: model = WorkflowJobTemplateNode @@ -3574,7 +3574,7 @@ class JobLaunchSerializer(BaseSerializer): template = self.context.get('template') accepted, rejected, errors = template._accept_or_ignore_job_kwargs( - _exclude_errors=['prompts', 'required'], # make several error types non-blocking + _exclude_errors=['prompts'], # make several error types non-blocking **attrs) self._ignored_fields = rejected diff --git a/awx/main/models/mixins.py b/awx/main/models/mixins.py index 9bf4d9292f..2f3b20f8f6 100644 --- a/awx/main/models/mixins.py +++ b/awx/main/models/mixins.py @@ -173,7 +173,7 @@ class SurveyJobTemplateMixin(models.Model): create_kwargs['extra_vars'] = json.dumps(extra_vars) return create_kwargs - def _survey_element_validation(self, survey_element, data): + def _survey_element_validation(self, survey_element, data, validate_required=True): # Don't apply validation to the `$encrypted$` placeholder; the decrypted # default (if any) will be validated against instead errors = [] @@ -185,11 +185,13 @@ class SurveyJobTemplateMixin(models.Model): password_value == '$encrypted$' ): if survey_element.get('default') is None and survey_element['required']: - errors.append("'%s' value missing" % survey_element['variable']) + if validate_required: + errors.append("'%s' value missing" % survey_element['variable']) return errors if survey_element['variable'] not in data and survey_element['required']: - errors.append("'%s' value missing" % survey_element['variable']) + if validate_required: + errors.append("'%s' value missing" % survey_element['variable']) elif survey_element['type'] in ["textarea", "text", "password"]: if survey_element['variable'] in data: if type(data[survey_element['variable']]) not in (str, unicode): @@ -267,12 +269,14 @@ class SurveyJobTemplateMixin(models.Model): for survey_element in self.survey_spec.get("spec", []): key = survey_element.get('variable', None) value = data.get(key, None) + validate_required = 'required' not in _exclude_errors if extra_passwords and key in extra_passwords and is_encrypted(value): element_errors = self._survey_element_validation(survey_element, { key: decrypt_value(get_encryption_key('value', pk=None), value) - }) + }, validate_required=validate_required) else: - element_errors = self._survey_element_validation(survey_element, data) + element_errors = self._survey_element_validation( + survey_element, data, validate_required=validate_required) if element_errors: survey_errors += element_errors