grains state: allow deleting grain with 'False' value

and destroy a grain previously set to None, with destructive=True:

The f46722aaeb commit, from Bruno Binet <bruno.binet@gmail.com> was
effectively reverted during my work on nested and complex values support.

This commit get it back, plus the ability to destroy a existing grain that
was previously set to None, plus tests for these.
This commit is contained in:
Christophe Drevet-Droguet 2015-09-09 10:37:23 +02:00 committed by rallytime
parent c92326f5ea
commit eee2318873
3 changed files with 51 additions and 3 deletions

View file

@ -628,7 +628,8 @@ def set(key,
elif isinstance(_existing_value, list):
_existing_value_type = 'complex'
if _existing_value_type is not None and _existing_value == val:
if _existing_value_type is not None and _existing_value == val \
and (val is not None or destructive is not True):
ret['comment'] = 'Grain is already set'
return ret

View file

@ -264,13 +264,33 @@ def absent(name,
grains.absent
'''
_non_existent_key = 'NonExistentValueMagicNumberSpK3hnufdHfeBUXCfqVK'
name = re.sub(delimiter, DEFAULT_TARGET_DELIM, name)
ret = {'name': name,
'changes': {},
'result': True,
'comment': ''}
grain = __salt__['grains.get'](name, None)
if grain:
grain = __salt__['grains.get'](name, _non_existent_key)
if grain is None:
if __opts__['test']:
ret['result'] = None
if destructive is True:
ret['comment'] = 'Grain {0} is set to be deleted'\
.format(name)
ret['changes'] = {'deleted': name}
return ret
ret = __salt__['grains.set'](name,
None,
destructive=destructive,
force=force)
if ret['result']:
if destructive is True:
ret['comment'] = 'Grain {0} was deleted'\
.format(name)
ret['changes'] = {'deleted': name}
ret['name'] = name
elif grain != _non_existent_key:
if __opts__['test']:
ret['result'] = None
if destructive is True:

View file

@ -549,6 +549,20 @@ class GrainsTestCase(TestCase):
+ "foo: null\n"
)
# Unset grain when its value is False
self.setGrains({'a': 'aval', 'foo': False})
ret = grains.absent(
name='foo')
self.assertEqual(ret['result'], True)
self.assertEqual(ret['comment'], 'Value for grain foo was set to None')
self.assertEqual(ret['changes'], {'grain': 'foo', 'value': None})
self.assertEqual(
grains.__grains__,
{'a': 'aval', 'foo': None})
self.assertGrainFileContent("a: aval\n"
+ "foo: null\n"
)
# Unset a nested grain
self.setGrains({'a': 'aval', 'foo': ['order', {'is': {'nested': 'bar'}}, 'correct']})
ret = grains.absent(
@ -651,6 +665,19 @@ class GrainsTestCase(TestCase):
{'a': 'aval'})
self.assertGrainFileContent("a: aval\n")
# Delete a previously unset grain
self.setGrains({'a': 'aval', 'foo': None})
ret = grains.absent(
name='foo',
destructive=True)
self.assertEqual(ret['result'], True)
self.assertEqual(ret['comment'], 'Grain foo was deleted')
self.assertEqual(ret['changes'], {'deleted': 'foo'})
self.assertEqual(
grains.__grains__,
{'a': 'aval'})
self.assertGrainFileContent("a: aval\n")
# Delete a nested grain
self.setGrains({'a': 'aval', 'foo': ['order', {'is': {'nested': 'bar', 'other': 'value'}}, 'correct']})
ret = grains.absent(