mirror of
https://github.com/saltstack/salt.git
synced 2025-04-17 10:10:20 +00:00
grains state: list_present, list_absent support nested grain
... and custom delimiter
This commit is contained in:
parent
62a1f37d86
commit
576252da05
3 changed files with 52 additions and 7 deletions
|
@ -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)
|
||||
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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(
|
||||
|
|
Loading…
Add table
Reference in a new issue