mirror of
https://github.com/ansible/awx.git
synced 2026-04-06 18:49:21 -02:30
Fix regression in tower_settings module
This commit is contained in:
@@ -31,6 +31,8 @@ options:
|
|||||||
value:
|
value:
|
||||||
description:
|
description:
|
||||||
- Value to be modified for given setting.
|
- Value to be modified for given setting.
|
||||||
|
- If given a non-string type, will make best effort to cast it to type API expects.
|
||||||
|
- For better control over types, use the C(settings) param instead.
|
||||||
required: False
|
required: False
|
||||||
type: str
|
type: str
|
||||||
settings:
|
settings:
|
||||||
@@ -45,6 +47,8 @@ options:
|
|||||||
required: False
|
required: False
|
||||||
type: str
|
type: str
|
||||||
version_added: "3.7"
|
version_added: "3.7"
|
||||||
|
requirements:
|
||||||
|
- pyyaml
|
||||||
extends_documentation_fragment: awx.awx.auth
|
extends_documentation_fragment: awx.awx.auth
|
||||||
'''
|
'''
|
||||||
|
|
||||||
@@ -78,8 +82,31 @@ EXAMPLES = '''
|
|||||||
'''
|
'''
|
||||||
|
|
||||||
from ..module_utils.tower_api import TowerModule
|
from ..module_utils.tower_api import TowerModule
|
||||||
from json import loads
|
|
||||||
import re
|
try:
|
||||||
|
import yaml
|
||||||
|
HAS_YAML = True
|
||||||
|
except ImportError:
|
||||||
|
HAS_YAML = False
|
||||||
|
|
||||||
|
|
||||||
|
def coerce_type(module, value):
|
||||||
|
yaml_ish = bool((
|
||||||
|
value.startswith('{') and value.endswith('}')
|
||||||
|
) or (
|
||||||
|
value.startswith('[') and value.endswith(']'))
|
||||||
|
)
|
||||||
|
if yaml_ish:
|
||||||
|
if not HAS_YAML:
|
||||||
|
module.fail_json(msg="yaml is not installed, try 'pip install pyyaml'")
|
||||||
|
return yaml.safe_load(value)
|
||||||
|
elif value.lower in ('true', 'false', 't', 'f'):
|
||||||
|
return {'t': True, 'f': False}[value[0].lower()]
|
||||||
|
try:
|
||||||
|
return int(value)
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
return value
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
@@ -106,14 +133,7 @@ def main():
|
|||||||
|
|
||||||
# If we were given a name/value pair we will just make settings out of that and proceed normally
|
# If we were given a name/value pair we will just make settings out of that and proceed normally
|
||||||
if new_settings is None:
|
if new_settings is None:
|
||||||
new_value = value
|
new_value = coerce_type(module, value)
|
||||||
try:
|
|
||||||
new_value = loads(value)
|
|
||||||
except ValueError:
|
|
||||||
# JSONDecodeError only available on Python 3.5+
|
|
||||||
# Attempt to deal with old tower_cli array types
|
|
||||||
if ',' in value:
|
|
||||||
new_value = re.split(r",\s+", new_value)
|
|
||||||
|
|
||||||
new_settings = {name: new_value}
|
new_settings = {name: new_value}
|
||||||
|
|
||||||
|
|||||||
67
awx_collection/test/awx/test_settings.py
Normal file
67
awx_collection/test/awx/test_settings.py
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
from __future__ import (absolute_import, division, print_function)
|
||||||
|
__metaclass__ = type
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
from awx.conf.models import Setting
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.django_db
|
||||||
|
def test_setting_flat_value(run_module, admin_user):
|
||||||
|
the_value = 'CN=service_account,OU=ServiceAccounts,DC=domain,DC=company,DC=org'
|
||||||
|
result = run_module('tower_settings', dict(
|
||||||
|
name='AUTH_LDAP_BIND_DN',
|
||||||
|
value=the_value
|
||||||
|
), admin_user)
|
||||||
|
assert not result.get('failed', False), result.get('msg', result)
|
||||||
|
assert result.get('changed'), result
|
||||||
|
|
||||||
|
assert Setting.objects.get(key='AUTH_LDAP_BIND_DN').value == the_value
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.django_db
|
||||||
|
def test_setting_dict_value(run_module, admin_user):
|
||||||
|
the_value = {
|
||||||
|
'email': 'mail',
|
||||||
|
'first_name': 'givenName',
|
||||||
|
'last_name': 'surname'
|
||||||
|
}
|
||||||
|
result = run_module('tower_settings', dict(
|
||||||
|
name='AUTH_LDAP_USER_ATTR_MAP',
|
||||||
|
value=the_value
|
||||||
|
), admin_user)
|
||||||
|
assert not result.get('failed', False), result.get('msg', result)
|
||||||
|
assert result.get('changed'), result
|
||||||
|
|
||||||
|
assert Setting.objects.get(key='AUTH_LDAP_USER_ATTR_MAP').value == the_value
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.django_db
|
||||||
|
def test_setting_nested_type(run_module, admin_user):
|
||||||
|
the_value = {
|
||||||
|
'email': 'mail',
|
||||||
|
'first_name': 'givenName',
|
||||||
|
'last_name': 'surname'
|
||||||
|
}
|
||||||
|
result = run_module('tower_settings', dict(
|
||||||
|
settings={
|
||||||
|
'AUTH_LDAP_USER_ATTR_MAP': the_value
|
||||||
|
}
|
||||||
|
), admin_user)
|
||||||
|
assert not result.get('failed', False), result.get('msg', result)
|
||||||
|
assert result.get('changed'), result
|
||||||
|
|
||||||
|
assert Setting.objects.get(key='AUTH_LDAP_USER_ATTR_MAP').value == the_value
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.django_db
|
||||||
|
def test_setting_bool_value(run_module, admin_user):
|
||||||
|
for the_value in (True, False):
|
||||||
|
result = run_module('tower_settings', dict(
|
||||||
|
name='ACTIVITY_STREAM_ENABLED_FOR_INVENTORY_SYNC',
|
||||||
|
value=the_value
|
||||||
|
), admin_user)
|
||||||
|
assert not result.get('failed', False), result.get('msg', result)
|
||||||
|
assert result.get('changed'), result
|
||||||
|
|
||||||
|
assert Setting.objects.get(key='ACTIVITY_STREAM_ENABLED_FOR_INVENTORY_SYNC').value is the_value
|
||||||
Reference in New Issue
Block a user