mirror of
https://github.com/ansible/awx.git
synced 2026-05-07 01:17:37 -02:30
Merge pull request #5892 from wwitzel3/release_3.1.2
Do not set the default if field was not passed in to kwargs_extra_vars.
This commit is contained in:
@@ -130,13 +130,18 @@ class SurveyJobTemplateMixin(models.Model):
|
|||||||
for survey_element in self.survey_spec.get("spec", []):
|
for survey_element in self.survey_spec.get("spec", []):
|
||||||
default = survey_element.get('default')
|
default = survey_element.get('default')
|
||||||
variable_key = survey_element.get('variable')
|
variable_key = survey_element.get('variable')
|
||||||
|
|
||||||
if survey_element.get('type') == 'password':
|
if survey_element.get('type') == 'password':
|
||||||
if variable_key in kwargs_extra_vars and default:
|
if variable_key in kwargs_extra_vars and default:
|
||||||
kw_value = kwargs_extra_vars[variable_key]
|
kw_value = kwargs_extra_vars[variable_key]
|
||||||
if kw_value.startswith('$encrypted$') and kw_value != default:
|
if kw_value.startswith('$encrypted$') and kw_value != default:
|
||||||
kwargs_extra_vars[variable_key] = default
|
kwargs_extra_vars[variable_key] = default
|
||||||
|
|
||||||
if default is not None:
|
if default is not None:
|
||||||
extra_vars[variable_key] = default
|
data = {variable_key: default}
|
||||||
|
errors = self._survey_element_validation(survey_element, data)
|
||||||
|
if not errors:
|
||||||
|
extra_vars[variable_key] = default
|
||||||
|
|
||||||
# Overwrite job template extra vars with explicit job extra vars
|
# Overwrite job template extra vars with explicit job extra vars
|
||||||
# and add on job extra vars
|
# and add on job extra vars
|
||||||
@@ -144,6 +149,65 @@ class SurveyJobTemplateMixin(models.Model):
|
|||||||
kwargs['extra_vars'] = json.dumps(extra_vars)
|
kwargs['extra_vars'] = json.dumps(extra_vars)
|
||||||
return kwargs
|
return kwargs
|
||||||
|
|
||||||
|
def _survey_element_validation(self, survey_element, data):
|
||||||
|
errors = []
|
||||||
|
if survey_element['variable'] not in data and survey_element['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):
|
||||||
|
errors.append("Value %s for '%s' expected to be a string." % (data[survey_element['variable']],
|
||||||
|
survey_element['variable']))
|
||||||
|
return errors
|
||||||
|
if 'min' in survey_element and survey_element['min'] not in ["", None] and len(data[survey_element['variable']]) < int(survey_element['min']):
|
||||||
|
errors.append("'%s' value %s is too small (length is %s must be at least %s)." %
|
||||||
|
(survey_element['variable'], data[survey_element['variable']], len(data[survey_element['variable']]), survey_element['min']))
|
||||||
|
if 'max' in survey_element and survey_element['max'] not in ["", None] and len(data[survey_element['variable']]) > int(survey_element['max']):
|
||||||
|
errors.append("'%s' value %s is too large (must be no more than %s)." %
|
||||||
|
(survey_element['variable'], data[survey_element['variable']], survey_element['max']))
|
||||||
|
elif survey_element['type'] == 'integer':
|
||||||
|
if survey_element['variable'] in data:
|
||||||
|
if type(data[survey_element['variable']]) != int:
|
||||||
|
errors.append("Value %s for '%s' expected to be an integer." % (data[survey_element['variable']],
|
||||||
|
survey_element['variable']))
|
||||||
|
return errors
|
||||||
|
if 'min' in survey_element and survey_element['min'] not in ["", None] and survey_element['variable'] in data and \
|
||||||
|
data[survey_element['variable']] < int(survey_element['min']):
|
||||||
|
errors.append("'%s' value %s is too small (must be at least %s)." %
|
||||||
|
(survey_element['variable'], data[survey_element['variable']], survey_element['min']))
|
||||||
|
if 'max' in survey_element and survey_element['max'] not in ["", None] and survey_element['variable'] in data and \
|
||||||
|
data[survey_element['variable']] > int(survey_element['max']):
|
||||||
|
errors.append("'%s' value %s is too large (must be no more than %s)." %
|
||||||
|
(survey_element['variable'], data[survey_element['variable']], survey_element['max']))
|
||||||
|
elif survey_element['type'] == 'float':
|
||||||
|
if survey_element['variable'] in data:
|
||||||
|
if type(data[survey_element['variable']]) not in (float, int):
|
||||||
|
errors.append("Value %s for '%s' expected to be a numeric type." % (data[survey_element['variable']],
|
||||||
|
survey_element['variable']))
|
||||||
|
return errors
|
||||||
|
if 'min' in survey_element and survey_element['min'] not in ["", None] and data[survey_element['variable']] < float(survey_element['min']):
|
||||||
|
errors.append("'%s' value %s is too small (must be at least %s)." %
|
||||||
|
(survey_element['variable'], data[survey_element['variable']], survey_element['min']))
|
||||||
|
if 'max' in survey_element and survey_element['max'] not in ["", None] and data[survey_element['variable']] > float(survey_element['max']):
|
||||||
|
errors.append("'%s' value %s is too large (must be no more than %s)." %
|
||||||
|
(survey_element['variable'], data[survey_element['variable']], survey_element['max']))
|
||||||
|
elif survey_element['type'] == 'multiselect':
|
||||||
|
if survey_element['variable'] in data:
|
||||||
|
if type(data[survey_element['variable']]) != list:
|
||||||
|
errors.append("'%s' value is expected to be a list." % survey_element['variable'])
|
||||||
|
else:
|
||||||
|
for val in data[survey_element['variable']]:
|
||||||
|
if val not in survey_element['choices']:
|
||||||
|
errors.append("Value %s for '%s' expected to be one of %s." % (val, survey_element['variable'],
|
||||||
|
survey_element['choices']))
|
||||||
|
elif survey_element['type'] == 'multiplechoice':
|
||||||
|
if survey_element['variable'] in data:
|
||||||
|
if data[survey_element['variable']] not in survey_element['choices']:
|
||||||
|
errors.append("Value %s for '%s' expected to be one of %s." % (data[survey_element['variable']],
|
||||||
|
survey_element['variable'],
|
||||||
|
survey_element['choices']))
|
||||||
|
return errors
|
||||||
|
|
||||||
def survey_variable_validation(self, data):
|
def survey_variable_validation(self, data):
|
||||||
errors = []
|
errors = []
|
||||||
if not self.survey_enabled:
|
if not self.survey_enabled:
|
||||||
@@ -153,62 +217,7 @@ class SurveyJobTemplateMixin(models.Model):
|
|||||||
if 'description' not in self.survey_spec:
|
if 'description' not in self.survey_spec:
|
||||||
errors.append("'description' missing from survey spec.")
|
errors.append("'description' missing from survey spec.")
|
||||||
for survey_element in self.survey_spec.get("spec", []):
|
for survey_element in self.survey_spec.get("spec", []):
|
||||||
if survey_element['variable'] not in data and \
|
errors += self._survey_element_validation(survey_element, data)
|
||||||
survey_element['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):
|
|
||||||
errors.append("Value %s for '%s' expected to be a string." % (data[survey_element['variable']],
|
|
||||||
survey_element['variable']))
|
|
||||||
continue
|
|
||||||
if 'min' in survey_element and survey_element['min'] not in ["", None] and len(data[survey_element['variable']]) < int(survey_element['min']):
|
|
||||||
errors.append("'%s' value %s is too small (length is %s must be at least %s)." %
|
|
||||||
(survey_element['variable'], data[survey_element['variable']], len(data[survey_element['variable']]), survey_element['min']))
|
|
||||||
if 'max' in survey_element and survey_element['max'] not in ["", None] and len(data[survey_element['variable']]) > int(survey_element['max']):
|
|
||||||
errors.append("'%s' value %s is too large (must be no more than %s)." %
|
|
||||||
(survey_element['variable'], data[survey_element['variable']], survey_element['max']))
|
|
||||||
elif survey_element['type'] == 'integer':
|
|
||||||
if survey_element['variable'] in data:
|
|
||||||
if type(data[survey_element['variable']]) != int:
|
|
||||||
errors.append("Value %s for '%s' expected to be an integer." % (data[survey_element['variable']],
|
|
||||||
survey_element['variable']))
|
|
||||||
continue
|
|
||||||
if 'min' in survey_element and survey_element['min'] not in ["", None] and survey_element['variable'] in data and \
|
|
||||||
data[survey_element['variable']] < int(survey_element['min']):
|
|
||||||
errors.append("'%s' value %s is too small (must be at least %s)." %
|
|
||||||
(survey_element['variable'], data[survey_element['variable']], survey_element['min']))
|
|
||||||
if 'max' in survey_element and survey_element['max'] not in ["", None] and survey_element['variable'] in data and \
|
|
||||||
data[survey_element['variable']] > int(survey_element['max']):
|
|
||||||
errors.append("'%s' value %s is too large (must be no more than %s)." %
|
|
||||||
(survey_element['variable'], data[survey_element['variable']], survey_element['max']))
|
|
||||||
elif survey_element['type'] == 'float':
|
|
||||||
if survey_element['variable'] in data:
|
|
||||||
if type(data[survey_element['variable']]) not in (float, int):
|
|
||||||
errors.append("Value %s for '%s' expected to be a numeric type." % (data[survey_element['variable']],
|
|
||||||
survey_element['variable']))
|
|
||||||
continue
|
|
||||||
if 'min' in survey_element and survey_element['min'] not in ["", None] and data[survey_element['variable']] < float(survey_element['min']):
|
|
||||||
errors.append("'%s' value %s is too small (must be at least %s)." %
|
|
||||||
(survey_element['variable'], data[survey_element['variable']], survey_element['min']))
|
|
||||||
if 'max' in survey_element and survey_element['max'] not in ["", None] and data[survey_element['variable']] > float(survey_element['max']):
|
|
||||||
errors.append("'%s' value %s is too large (must be no more than %s)." %
|
|
||||||
(survey_element['variable'], data[survey_element['variable']], survey_element['max']))
|
|
||||||
elif survey_element['type'] == 'multiselect':
|
|
||||||
if survey_element['variable'] in data:
|
|
||||||
if type(data[survey_element['variable']]) != list:
|
|
||||||
errors.append("'%s' value is expected to be a list." % survey_element['variable'])
|
|
||||||
else:
|
|
||||||
for val in data[survey_element['variable']]:
|
|
||||||
if val not in survey_element['choices']:
|
|
||||||
errors.append("Value %s for '%s' expected to be one of %s." % (val, survey_element['variable'],
|
|
||||||
survey_element['choices']))
|
|
||||||
elif survey_element['type'] == 'multiplechoice':
|
|
||||||
if survey_element['variable'] in data:
|
|
||||||
if data[survey_element['variable']] not in survey_element['choices']:
|
|
||||||
errors.append("Value %s for '%s' expected to be one of %s." % (data[survey_element['variable']],
|
|
||||||
survey_element['variable'],
|
|
||||||
survey_element['choices']))
|
|
||||||
return errors
|
return errors
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import json
|
|||||||
from awx.main.tasks import RunJob
|
from awx.main.tasks import RunJob
|
||||||
from awx.main.models import (
|
from awx.main.models import (
|
||||||
Job,
|
Job,
|
||||||
|
JobTemplate,
|
||||||
WorkflowJobTemplate
|
WorkflowJobTemplate
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -78,6 +79,18 @@ def test_job_args_unredacted_passwords(job):
|
|||||||
assert extra_vars['secret_key'] == 'my_password'
|
assert extra_vars['secret_key'] == 'my_password'
|
||||||
|
|
||||||
|
|
||||||
|
def test_update_kwargs_survey_invalid_default(survey_spec_factory):
|
||||||
|
spec = survey_spec_factory('var2')
|
||||||
|
spec['spec'][0]['required'] = False
|
||||||
|
spec['spec'][0]['min'] = 3
|
||||||
|
spec['spec'][0]['default'] = 1
|
||||||
|
jt = JobTemplate(name="test-jt", survey_spec=spec, survey_enabled=True, extra_vars="var2: 2")
|
||||||
|
defaulted_extra_vars = jt._update_unified_job_kwargs()
|
||||||
|
assert 'extra_vars' in defaulted_extra_vars
|
||||||
|
# Make sure we did not set the invalid default of 1
|
||||||
|
assert json.loads(defaulted_extra_vars['extra_vars'])['var2'] == 2
|
||||||
|
|
||||||
|
|
||||||
class TestWorkflowSurveys:
|
class TestWorkflowSurveys:
|
||||||
def test_update_kwargs_survey_defaults(self, survey_spec_factory):
|
def test_update_kwargs_survey_defaults(self, survey_spec_factory):
|
||||||
"Assure that the survey default over-rides a JT variable"
|
"Assure that the survey default over-rides a JT variable"
|
||||||
|
|||||||
Reference in New Issue
Block a user