grains state: list_present, list_absent support nested grain

... and custom delimiter
This commit is contained in:
Christophe Drevet-Droguet 2015-09-04 15:43:31 +02:00 committed by rallytime
parent 62a1f37d86
commit 576252da05
3 changed files with 52 additions and 7 deletions

View file

@ -329,24 +329,38 @@ def append(key, val, convert=False, delimiter=DEFAULT_TARGET_DELIM):
return setval(key, grains)
def remove(key, val):
def remove(key, val, delimiter=DEFAULT_TARGET_DELIM):
'''
.. versionadded:: 0.17.0
Remove a value from a list in the grains config file
:param delimiter: The key can be a nested dict key. Use this parameter to
specify the delimiter you use.
You can now append values to a list in nested dictionnary grains. If the
list doesn't exist at this level, it will be created.
.. versionadded:: FIXME
CLI Example:
.. code-block:: bash
salt '*' grains.remove key val
'''
grains = get(key, [])
grains = get(key, [], delimiter)
if not isinstance(grains, list):
return 'The key {0} is not a valid list'.format(key)
if val not in grains:
return 'The val {0} was not in the list {1}'.format(val, key)
grains.remove(val)
while delimiter in key:
key, rest = key.rsplit(delimiter, 1)
_grain = get(key, None, delimiter)
if isinstance(_grain, dict):
_grain.update({rest: grains})
grains = _grain
return setval(key, grains)

View file

@ -205,7 +205,7 @@ def list_absent(name, value, delimiter=DEFAULT_TARGET_DELIM):
'changes': {},
'result': True,
'comment': ''}
grain = __grains__.get(name)
grain = __salt__['grains.get'](name, None)
if grain:
if isinstance(grain, list):
if value not in grain:

View file

@ -801,7 +801,7 @@ class GrainsTestCase(TestCase):
grains.__grains__,
{'a': 'aval'})
# 'list_present' function tests: 6
# 'list_present' function tests: 7
def test_list_present(self):
self.setGrains({'a': 'aval', 'foo': ['bar']})
@ -820,10 +820,12 @@ class GrainsTestCase(TestCase):
+ "- baz\n"
)
def test_list_present_nested(self):
self.setGrains({'a': 'aval', 'foo': {'is': {'nested': ['bar']}}})
ret = grains.list_present(
name='foo:is:nested',
value='baz')
name='foo,is,nested',
value='baz',
delimiter=',')
self.assertEqual(ret['result'], True)
self.assertEqual(ret['comment'], 'Append value baz to grain foo:is:nested')
self.assertEqual(ret['changes'], {'new': {'foo': {'is': {'nested': ['bar', 'baz']}}}})
@ -921,7 +923,7 @@ class GrainsTestCase(TestCase):
+ "- bar\n"
)
# 'list_absent' function tests: 4
# 'list_absent' function tests: 6
def test_list_absent(self):
self.setGrains({'a': 'aval', 'foo': ['bar']})
@ -938,6 +940,22 @@ class GrainsTestCase(TestCase):
+ "foo: []\n"
)
def test_list_absent_nested(self):
self.setGrains({'a': 'aval', 'foo': {'list': ['bar']}})
ret = grains.list_absent(
name='foo:list',
value='bar')
self.assertEqual(ret['result'], True)
self.assertEqual(ret['comment'], 'Value bar was deleted from grain foo:list')
self.assertEqual(ret['changes'], {'deleted': 'bar'})
self.assertEqual(
grains.__grains__,
{'a': 'aval', 'foo': {'list': []}})
self.assertGrainFileContent("a: aval\n"
+ "foo:\n"
+ " list: []\n"
)
def test_list_absent_inexistent(self):
self.setGrains({'a': 'aval'})
ret = grains.list_absent(
@ -951,6 +969,19 @@ class GrainsTestCase(TestCase):
{'a': 'aval'})
self.assertGrainFileContent("a: aval\n")
def test_list_absent_inexistent_nested(self):
self.setGrains({'a': 'aval'})
ret = grains.list_absent(
name='foo:list',
value='baz')
self.assertEqual(ret['result'], True)
self.assertEqual(ret['comment'], 'Grain foo:list does not exist')
self.assertEqual(ret['changes'], {})
self.assertEqual(
grains.__grains__,
{'a': 'aval'})
self.assertGrainFileContent("a: aval\n")
def test_list_absent_not_a_list(self):
self.setGrains({'a': 'aval', 'foo': 'bar'})
ret = grains.list_absent(