diff --git a/awx/api/serializers.py b/awx/api/serializers.py index 35d6c2348a..b373e492d7 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -40,6 +40,7 @@ from awx.main.models import * # noqa from awx.main.access import get_user_capabilities from awx.main.fields import ImplicitRoleField from awx.main.utils import get_type_for_model, get_model_for_type, build_url, timestamp_apiformat, camelcase_to_underscore, getattrd +from awx.main.validators import vars_validate_or_raise from awx.conf.license import feature_enabled from awx.api.fields import BooleanNullField, CharNullField, ChoiceNullField, EncryptedPasswordField, VerbatimField @@ -110,20 +111,6 @@ def reverse_gfk(content_object): camelcase_to_underscore(content_object.__class__.__name__): content_object.get_absolute_url() } -def vars_validate_or_raise(vars_str): - # vars must be blank, a valid JSON or YAML dict, or ... - try: - json.loads((vars_str or '').strip() or '{}') - return vars_str - except ValueError: - pass - try: - yaml.safe_load(vars_str) - return vars_str - except yaml.YAMLError: - pass - raise serializers.ValidationError('Must be valid JSON or YAML.') - class BaseSerializerMetaclass(serializers.SerializerMetaclass): ''' diff --git a/awx/main/validators.py b/awx/main/validators.py index ca7c851772..438fb98bcd 100644 --- a/awx/main/validators.py +++ b/awx/main/validators.py @@ -4,11 +4,16 @@ # Python import base64 import re +import yaml +import json # Django from django.utils.translation import ugettext_lazy as _ from django.core.exceptions import ValidationError +# REST framework +from rest_framework.serializers import ValidationError as RestValidationError + def validate_pem(data, min_keys=0, max_keys=None, min_certs=0, max_certs=None): """ @@ -166,3 +171,21 @@ def validate_ssh_private_key(data): credential. """ return validate_pem(data, min_keys=1) + +def vars_validate_or_raise(vars_str): + """ + Validate that fields like extra_vars or variables on resources like + job templates, inventories, or hosts are either an acceptable + blank string, or are valid JSON or YAML dict + """ + try: + json.loads((vars_str or '').strip() or '{}') + return vars_str + except ValueError: + pass + try: + yaml.safe_load(vars_str) + return vars_str + except yaml.YAMLError: + pass + raise RestValidationError('Must be valid JSON or YAML.')