1
0
Fork 0
mirror of https://github.com/ansible-collections/community.general.git synced 2024-09-14 20:13:21 +02:00

gconftool2: fix change output (#6270)

* gconftool2: fix change output

* add changelog frag

* gconftool2: improve visibility on the output

* fix obtaining updated value after `set`

* use issue URL in the changelog fragment

* fix further issues

* fix return value docs + changelog frag

* Update plugins/modules/gconftool2.py

Co-authored-by: Felix Fontein <felix@fontein.de>

* fix return value doc

---------

Co-authored-by: Felix Fontein <felix@fontein.de>
This commit is contained in:
Alexei Znamensky 2023-05-04 08:45:35 +12:00 committed by GitHub
parent d254372d37
commit 3c20261264
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 134 additions and 15 deletions

View file

@ -0,0 +1,5 @@
bugfixes:
- gconftool2 - fix ``changed`` result always being ``true`` (https://github.com/ansible-collections/community.general/issues/6028).
- gconftool2 - remove requirement of parameter ``value`` when ``state=absent`` (https://github.com/ansible-collections/community.general/issues/6028).
breaking_changes:
- gconftool2 - fix processing of ``gconftool-2`` when ``key`` does not exist, returning ``null`` instead of empty string for both ``value`` and ``previous_value`` return values (https://github.com/ansible-collections/community.general/issues/6028).

View file

@ -35,12 +35,13 @@ options:
type: str type: str
description: description:
- Preference keys typically have simple values such as strings, - Preference keys typically have simple values such as strings,
integers, or lists of strings and integers. This is ignored if the state integers, or lists of strings and integers.
is "get". See man gconftool-2(1). This is ignored unless I(state=present). See man gconftool-2(1).
value_type: value_type:
type: str type: str
description: description:
- The type of value being set. This is ignored if the state is "get". - The type of value being set.
This is ignored unless I(state=present). See man gconftool-2(1).
choices: [ bool, float, int, string ] choices: [ bool, float, int, string ]
state: state:
type: str type: str
@ -56,8 +57,8 @@ options:
See man gconftool-2(1). See man gconftool-2(1).
direct: direct:
description: description:
- Access the config database directly, bypassing server. If direct is - Access the config database directly, bypassing server. If I(direct) is
specified then the config_source must be specified as well. specified then the I(config_source) must be specified as well.
See man gconftool-2(1). See man gconftool-2(1).
type: bool type: bool
default: false default: false
@ -73,17 +74,26 @@ EXAMPLES = """
RETURN = ''' RETURN = '''
key: key:
description: The key specified in the module parameters description: The key specified in the module parameters.
returned: success returned: success
type: str type: str
sample: /desktop/gnome/interface/font_name sample: /desktop/gnome/interface/font_name
value_type: value_type:
description: The type of the value that was changed description: The type of the value that was changed.
returned: success returned: success
type: str type: str
sample: string sample: string
value: value:
description: The value of the preference key after executing the module description:
- The value of the preference key after executing the module or C(null) if key is removed.
- From community.general 7.0.0 onwards it returns C(null) for a non-existent I(key), and returns C("") before that.
returned: success
type: str
sample: "Serif 12"
previous_value:
description:
- The value of the preference key before executing the module.
- From community.general 7.0.0 onwards it returns C(null) for a non-existent I(key), and returns C("") before that.
returned: success returned: success
type: str type: str
sample: "Serif 12" sample: "Serif 12"
@ -95,7 +105,6 @@ from ansible_collections.community.general.plugins.module_utils.gconftool2 impor
class GConftool(StateModuleHelper): class GConftool(StateModuleHelper):
change_params = ('value', )
diff_params = ('value', ) diff_params = ('value', )
output_params = ('key', 'value_type') output_params = ('key', 'value_type')
facts_params = ('key', 'value_type') facts_params = ('key', 'value_type')
@ -111,7 +120,6 @@ class GConftool(StateModuleHelper):
), ),
required_if=[ required_if=[
('state', 'present', ['value', 'value_type']), ('state', 'present', ['value', 'value_type']),
('state', 'absent', ['value']),
('direct', True, ['config_source']), ('direct', True, ['config_source']),
], ],
supports_check_mode=True, supports_check_mode=True,
@ -125,6 +133,7 @@ class GConftool(StateModuleHelper):
self.vars.set('previous_value', self._get(), fact=True) self.vars.set('previous_value', self._get(), fact=True)
self.vars.set('value_type', self.vars.value_type) self.vars.set('value_type', self.vars.value_type)
self.vars.set('_value', self.vars.previous_value, output=False, change=True)
self.vars.set_meta('value', initial_value=self.vars.previous_value) self.vars.set_meta('value', initial_value=self.vars.previous_value)
self.vars.set('playbook_value', self.vars.value, fact=True) self.vars.set('playbook_value', self.vars.value, fact=True)
@ -132,7 +141,8 @@ class GConftool(StateModuleHelper):
def process(rc, out, err): def process(rc, out, err):
if err and fail_on_err: if err and fail_on_err:
self.ansible.fail_json(msg='gconftool-2 failed with error: %s' % (str(err))) self.ansible.fail_json(msg='gconftool-2 failed with error: %s' % (str(err)))
self.vars.value = out.rstrip() out = out.rstrip()
self.vars.value = None if out == "" else out
return self.vars.value return self.vars.value
return process return process
@ -148,11 +158,18 @@ class GConftool(StateModuleHelper):
def state_absent(self): def state_absent(self):
with self.runner("state key", output_process=self._make_process(False)) as ctx: with self.runner("state key", output_process=self._make_process(False)) as ctx:
ctx.run() ctx.run()
if self.verbosity >= 4:
self.vars.run_info = ctx.run_info
self.vars.set('new_value', None, fact=True) self.vars.set('new_value', None, fact=True)
self.vars._value = None
def state_present(self): def state_present(self):
with self.runner("direct config_source value_type state key value", output_process=self._make_process(True)) as ctx: with self.runner("direct config_source value_type state key value", output_process=self._make_process(True)) as ctx:
self.vars.set('new_value', ctx.run(), fact=True) ctx.run()
if self.verbosity >= 4:
self.vars.run_info = ctx.run_info
self.vars.set('new_value', self._get(), fact=True)
self.vars._value = self.vars.new_value
def main(): def main():

View file

@ -36,7 +36,6 @@ TEST_CASES = [
(0, '100\n', '',), (0, '100\n', '',),
), ),
], ],
'new_value': '100',
} }
], ],
[ [
@ -50,11 +49,10 @@ TEST_CASES = [
(0, '', "No value set for `/desktop/gnome/background/picture_filename'\n",), (0, '', "No value set for `/desktop/gnome/background/picture_filename'\n",),
), ),
], ],
'new_value': None,
} }
], ],
[ [
{'state': 'present', 'key': '/desktop/gnome/background/picture_filename', 'value': '200', 'value_type': 'int'}, {'state': 'present', 'key': '/desktop/gnome/background/picture_filename', 'value': 200, 'value_type': 'int'},
{ {
'id': 'test_simple_element_set', 'id': 'test_simple_element_set',
'run_command.calls': [ 'run_command.calls': [
@ -66,10 +64,104 @@ TEST_CASES = [
( (
['/testbin/gconftool-2', '--type', 'int', '--set', '/desktop/gnome/background/picture_filename', '200'], ['/testbin/gconftool-2', '--type', 'int', '--set', '/desktop/gnome/background/picture_filename', '200'],
{'environ_update': {'LANGUAGE': 'C', 'LC_ALL': 'C'}, 'check_rc': True}, {'environ_update': {'LANGUAGE': 'C', 'LC_ALL': 'C'}, 'check_rc': True},
(0, '', '',),
),
(
['/testbin/gconftool-2', '--get', '/desktop/gnome/background/picture_filename'],
{'environ_update': {'LANGUAGE': 'C', 'LC_ALL': 'C'}, 'check_rc': True},
(0, '200\n', '',), (0, '200\n', '',),
), ),
], ],
'new_value': '200', 'new_value': '200',
'changed': True,
}
],
[
{'state': 'present', 'key': '/desktop/gnome/background/picture_filename', 'value': 200, 'value_type': 'int'},
{
'id': 'test_simple_element_set_idempotency_int',
'run_command.calls': [
(
['/testbin/gconftool-2', '--get', '/desktop/gnome/background/picture_filename'],
{'environ_update': {'LANGUAGE': 'C', 'LC_ALL': 'C'}, 'check_rc': True},
(0, '200\n', '',),
),
(
['/testbin/gconftool-2', '--type', 'int', '--set', '/desktop/gnome/background/picture_filename', '200'],
{'environ_update': {'LANGUAGE': 'C', 'LC_ALL': 'C'}, 'check_rc': True},
(0, '', '',),
),
(
['/testbin/gconftool-2', '--get', '/desktop/gnome/background/picture_filename'],
{'environ_update': {'LANGUAGE': 'C', 'LC_ALL': 'C'}, 'check_rc': True},
(0, '200\n', '',),
),
],
'new_value': '200',
'changed': False,
}
],
[
{'state': 'present', 'key': '/apps/gnome_settings_daemon/screensaver/start_screensaver', 'value': 'false', 'value_type': 'bool'},
{
'id': 'test_simple_element_set_idempotency_bool',
'run_command.calls': [
(
['/testbin/gconftool-2', '--get', '/apps/gnome_settings_daemon/screensaver/start_screensaver'],
{'environ_update': {'LANGUAGE': 'C', 'LC_ALL': 'C'}, 'check_rc': True},
(0, 'false\n', '',),
),
(
['/testbin/gconftool-2', '--type', 'bool', '--set', '/apps/gnome_settings_daemon/screensaver/start_screensaver', 'false'],
{'environ_update': {'LANGUAGE': 'C', 'LC_ALL': 'C'}, 'check_rc': True},
(0, '', '',),
),
(
['/testbin/gconftool-2', '--get', '/apps/gnome_settings_daemon/screensaver/start_screensaver'],
{'environ_update': {'LANGUAGE': 'C', 'LC_ALL': 'C'}, 'check_rc': True},
(0, 'false\n', '',),
),
],
'new_value': 'false',
'changed': False,
}
],
[
{'state': 'absent', 'key': '/desktop/gnome/background/picture_filename'},
{
'id': 'test_simple_element_unset',
'run_command.calls': [
(
['/testbin/gconftool-2', '--get', '/desktop/gnome/background/picture_filename'],
{'environ_update': {'LANGUAGE': 'C', 'LC_ALL': 'C'}, 'check_rc': True},
(0, '200\n', '',),
),
(
['/testbin/gconftool-2', '--unset', '/desktop/gnome/background/picture_filename'],
{'environ_update': {'LANGUAGE': 'C', 'LC_ALL': 'C'}, 'check_rc': True},
(0, '', '',),
),
],
'changed': True,
}
],
[
{'state': 'absent', 'key': '/apps/gnome_settings_daemon/screensaver/start_screensaver'},
{
'id': 'test_simple_element_unset_idempotency',
'run_command.calls': [
(
['/testbin/gconftool-2', '--get', '/apps/gnome_settings_daemon/screensaver/start_screensaver'],
{'environ_update': {'LANGUAGE': 'C', 'LC_ALL': 'C'}, 'check_rc': True},
(0, '', '',),
),
(
['/testbin/gconftool-2', '--unset', '/apps/gnome_settings_daemon/screensaver/start_screensaver'],
{'environ_update': {'LANGUAGE': 'C', 'LC_ALL': 'C'}, 'check_rc': True},
(0, '', '',),
),
],
'changed': False,
} }
], ],
] ]
@ -101,6 +193,11 @@ def test_gconftool2(mocker, capfd, patch_gconftool2, testcase):
print("testcase =\n%s" % testcase) print("testcase =\n%s" % testcase)
print("results =\n%s" % results) print("results =\n%s" % results)
if 'changed' in testcase:
assert results.get('changed', False) == testcase['changed']
if 'new_value' in testcase:
assert results.get('new_value', None) == testcase['new_value']
for conditional_test_result in ('value',): for conditional_test_result in ('value',):
if conditional_test_result in testcase: if conditional_test_result in testcase:
assert conditional_test_result in results, "'{0}' not found in {1}".format(conditional_test_result, results) assert conditional_test_result in results, "'{0}' not found in {1}".format(conditional_test_result, results)