Merge pull request #52314 from twangboy/fix_beacon_tests

Add the ability to pass a timeout to beacons
This commit is contained in:
Daniel Wozniak 2019-03-27 12:11:12 -07:00 committed by GitHub
commit d3f4c9d4bf
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 118 additions and 63 deletions

View file

@ -30,18 +30,19 @@ __func_alias__ = {
def list_(return_yaml=True,
include_pillar=True,
include_opts=True):
include_opts=True,
**kwargs):
'''
List the beacons currently configured on the minion
:param return_yaml: Whether to return YAML formatted output,
default True
default ``True``
:param include_pillar: Whether to include beacons that are
configured in pillar, default is True.
configured in pillar, default is ``True``.
:param include_opts: Whether to include beacons that are
configured in opts, default is True.
configured in opts, default is ``True``.
:return: List of currently configured Beacons.
@ -61,7 +62,9 @@ def list_(return_yaml=True,
'include_opts': include_opts},
'manage_beacons')
if res:
event_ret = eventer.get_event(tag='/salt/minion/minion_beacons_list_complete', wait=30)
event_ret = eventer.get_event(
tag='/salt/minion/minion_beacons_list_complete',
wait=kwargs.get('timeout', 30))
log.debug('event_ret %s', event_ret)
if event_ret and event_ret['complete']:
beacons = event_ret['beacons']
@ -82,11 +85,12 @@ def list_(return_yaml=True,
return {'beacons': {}}
def list_available(return_yaml=True):
def list_available(return_yaml=True, **kwargs):
'''
List the beacons currently available on the minion
:param return_yaml: Whether to return YAML formatted output, default True
:param return_yaml: Whether to return YAML formatted output, default
``True``
:return: List of currently configured Beacons.
CLI Example:
@ -102,7 +106,9 @@ def list_available(return_yaml=True):
eventer = salt.utils.event.get_event('minion', opts=__opts__)
res = __salt__['event.fire']({'func': 'list_available'}, 'manage_beacons')
if res:
event_ret = eventer.get_event(tag='/salt/minion/minion_beacons_list_available_complete', wait=30)
event_ret = eventer.get_event(
tag='/salt/minion/minion_beacons_list_available_complete',
wait=kwargs.get('timeout', 30))
if event_ret and event_ret['complete']:
beacons = event_ret['beacons']
except KeyError:
@ -134,17 +140,17 @@ def add(name, beacon_data, **kwargs):
.. code-block:: bash
salt '*' beacons.add ps "[{'salt-master': 'stopped'}, {'apache2': 'stopped'}]"
salt '*' beacons.add ps "[{'processes': {'salt-master': 'stopped', 'apache2': 'stopped'}}]"
'''
ret = {'comment': 'Failed to add beacon {0}.'.format(name),
'result': False}
if name in list_(return_yaml=False):
if name in list_(return_yaml=False, **kwargs):
ret['comment'] = 'Beacon {0} is already configured.'.format(name)
return ret
if name not in list_available(return_yaml=False):
if name not in list_available(return_yaml=False, **kwargs):
ret['comment'] = 'Beacon "{0}" is not available.'.format(name)
return ret
@ -160,7 +166,9 @@ def add(name, beacon_data, **kwargs):
'func': 'validate_beacon'},
'manage_beacons')
if res:
event_ret = eventer.get_event(tag='/salt/minion/minion_beacon_validation_complete', wait=30)
event_ret = eventer.get_event(
tag='/salt/minion/minion_beacon_validation_complete',
wait=kwargs.get('timeout', 30))
valid = event_ret['valid']
vcomment = event_ret['vcomment']
@ -179,7 +187,9 @@ def add(name, beacon_data, **kwargs):
'beacon_data': beacon_data,
'func': 'add'}, 'manage_beacons')
if res:
event_ret = eventer.get_event(tag='/salt/minion/minion_beacon_add_complete', wait=30)
event_ret = eventer.get_event(
tag='/salt/minion/minion_beacon_add_complete',
wait=kwargs.get('timeout', 30))
if event_ret and event_ret['complete']:
beacons = event_ret['beacons']
if name in beacons and beacons[name] == beacon_data:
@ -213,7 +223,7 @@ def modify(name, beacon_data, **kwargs):
ret = {'comment': '',
'result': True}
current_beacons = list_(return_yaml=False)
current_beacons = list_(return_yaml=False, **kwargs)
if name not in current_beacons:
ret['comment'] = 'Beacon {0} is not configured.'.format(name)
return ret
@ -230,7 +240,9 @@ def modify(name, beacon_data, **kwargs):
'func': 'validate_beacon'},
'manage_beacons')
if res:
event_ret = eventer.get_event(tag='/salt/minion/minion_beacon_validation_complete', wait=30)
event_ret = eventer.get_event(
tag='/salt/minion/minion_beacon_validation_complete',
wait=kwargs.get('timeout', 30))
valid = event_ret['valid']
vcomment = event_ret['vcomment']
@ -274,7 +286,9 @@ def modify(name, beacon_data, **kwargs):
eventer = salt.utils.event.get_event('minion', opts=__opts__)
res = __salt__['event.fire']({'name': name, 'beacon_data': beacon_data, 'func': 'modify'}, 'manage_beacons')
if res:
event_ret = eventer.get_event(tag='/salt/minion/minion_beacon_modify_complete', wait=30)
event_ret = eventer.get_event(
tag='/salt/minion/minion_beacon_modify_complete',
wait=kwargs.get('timeout', 30))
if event_ret and event_ret['complete']:
beacons = event_ret['beacons']
if name in beacons and beacons[name] == beacon_data:
@ -318,7 +332,9 @@ def delete(name, **kwargs):
eventer = salt.utils.event.get_event('minion', opts=__opts__)
res = __salt__['event.fire']({'name': name, 'func': 'delete'}, 'manage_beacons')
if res:
event_ret = eventer.get_event(tag='/salt/minion/minion_beacon_delete_complete', wait=30)
event_ret = eventer.get_event(
tag='/salt/minion/minion_beacon_delete_complete',
wait=kwargs.get('timeout', 30))
if event_ret and event_ret['complete']:
beacons = event_ret['beacons']
if name not in beacons:
@ -334,7 +350,7 @@ def delete(name, **kwargs):
return ret
def save():
def save(**kwargs):
'''
Save all beacons on the minion
@ -350,7 +366,7 @@ def save():
ret = {'comment': [],
'result': True}
beacons = list_(return_yaml=False, include_pillar=False)
beacons = list_(return_yaml=False, include_pillar=False, **kwargs)
# move this file into an configurable opt
sfn = os.path.join(__opts__['config_dir'],
@ -367,7 +383,8 @@ def save():
fp_.write(yaml_out)
ret['comment'] = 'Beacons saved to {0}.'.format(sfn)
except (IOError, OSError):
ret['comment'] = 'Unable to write to beacons file at {0}. Check permissions.'.format(sfn)
ret['comment'] = 'Unable to write to beacons file at {0}. Check ' \
'permissions.'.format(sfn)
ret['result'] = False
return ret
@ -376,7 +393,8 @@ def enable(**kwargs):
'''
Enable all beacons on the minion
:return: Boolean and status message on success or failure of enable.
Returns:
bool: Boolean and status message on success or failure of enable.
CLI Example:
@ -395,7 +413,9 @@ def enable(**kwargs):
eventer = salt.utils.event.get_event('minion', opts=__opts__)
res = __salt__['event.fire']({'func': 'enable'}, 'manage_beacons')
if res:
event_ret = eventer.get_event(tag='/salt/minion/minion_beacons_enabled_complete', wait=30)
event_ret = eventer.get_event(
tag='/salt/minion/minion_beacons_enabled_complete',
wait=kwargs.get('timeout', 30))
if event_ret and event_ret['complete']:
beacons = event_ret['beacons']
if 'enabled' in beacons and beacons['enabled']:
@ -413,7 +433,7 @@ def enable(**kwargs):
def disable(**kwargs):
'''
Disable all beaconsd jobs on the minion
Disable all beacons jobs on the minion
:return: Boolean and status message on success or failure of disable.
@ -434,7 +454,9 @@ def disable(**kwargs):
eventer = salt.utils.event.get_event('minion', opts=__opts__)
res = __salt__['event.fire']({'func': 'disable'}, 'manage_beacons')
if res:
event_ret = eventer.get_event(tag='/salt/minion/minion_beacons_disabled_complete', wait=30)
event_ret = eventer.get_event(
tag='/salt/minion/minion_beacons_disabled_complete',
wait=kwargs.get('timeout', 30))
log.debug('event_ret %s', event_ret)
if event_ret and event_ret['complete']:
beacons = event_ret['beacons']
@ -486,7 +508,7 @@ def enable_beacon(name, **kwargs):
if 'test' in kwargs and kwargs['test']:
ret['comment'] = 'Beacon {0} would be enabled.'.format(name)
else:
_beacons = list_(return_yaml=False)
_beacons = list_(return_yaml=False, **kwargs)
if name not in _beacons:
ret['comment'] = 'Beacon {0} is not currently configured.'.format(name)
ret['result'] = False
@ -496,7 +518,9 @@ def enable_beacon(name, **kwargs):
eventer = salt.utils.event.get_event('minion', opts=__opts__)
res = __salt__['event.fire']({'func': 'enable_beacon', 'name': name}, 'manage_beacons')
if res:
event_ret = eventer.get_event(tag='/salt/minion/minion_beacon_enabled_complete', wait=30)
event_ret = eventer.get_event(
tag='/salt/minion/minion_beacon_enabled_complete',
wait=kwargs.get('timeout', 30))
if event_ret and event_ret['complete']:
beacons = event_ret['beacons']
beacon_config_dict = _get_beacon_config_dict(beacons[name])
@ -542,7 +566,7 @@ def disable_beacon(name, **kwargs):
if 'test' in kwargs and kwargs['test']:
ret['comment'] = 'Beacons would be enabled.'
else:
_beacons = list_(return_yaml=False)
_beacons = list_(return_yaml=False, **kwargs)
if name not in _beacons:
ret['comment'] = 'Beacon {0} is not currently configured.'.format(name)
ret['result'] = False
@ -552,7 +576,9 @@ def disable_beacon(name, **kwargs):
eventer = salt.utils.event.get_event('minion', opts=__opts__)
res = __salt__['event.fire']({'func': 'disable_beacon', 'name': name}, 'manage_beacons')
if res:
event_ret = eventer.get_event(tag='/salt/minion/minion_beacon_disabled_complete', wait=30)
event_ret = eventer.get_event(
tag='/salt/minion/minion_beacon_disabled_complete',
wait=kwargs.get('timeout', 30))
if event_ret and event_ret['complete']:
beacons = event_ret['beacons']
beacon_config_dict = _get_beacon_config_dict(beacons[name])
@ -594,7 +620,9 @@ def reset(**kwargs):
eventer = salt.utils.event.get_event('minion', opts=__opts__)
res = __salt__['event.fire']({'func': 'reset'}, 'manage_beacons')
if res:
event_ret = eventer.get_event(tag='/salt/minion/minion_beacon_reset_complete', wait=30)
event_ret = eventer.get_event(
tag='/salt/minion/minion_beacon_reset_complete',
wait=kwargs.get('timeout', 30))
if event_ret and event_ret['complete']:
ret['result'] = True
ret['comment'] = 'Beacon configuration reset.'

View file

@ -59,7 +59,7 @@ def present(name,
'changes': {},
'comment': []}
current_beacons = __salt__['beacons.list'](return_yaml=False)
current_beacons = __salt__['beacons.list'](return_yaml=False, **kwargs)
beacon_data = [{k: v} for k, v in six.iteritems(kwargs)]
if name in current_beacons:
@ -69,11 +69,11 @@ def present(name,
else:
if 'test' in __opts__ and __opts__['test']:
kwargs['test'] = True
result = __salt__['beacons.modify'](name, beacon_data)
result = __salt__['beacons.modify'](name, beacon_data, **kwargs)
ret['comment'].append(result['comment'])
ret['changes'] = result['changes']
else:
result = __salt__['beacons.modify'](name, beacon_data)
result = __salt__['beacons.modify'](name, beacon_data, **kwargs)
if not result['result']:
ret['result'] = result['result']
ret['comment'] = result['comment']
@ -91,7 +91,7 @@ def present(name,
result = __salt__['beacons.add'](name, beacon_data, **kwargs)
ret['comment'].append(result['comment'])
else:
result = __salt__['beacons.add'](name, beacon_data)
result = __salt__['beacons.add'](name, beacon_data, **kwargs)
if not result['result']:
ret['result'] = result['result']
ret['comment'] = result['comment']
@ -128,7 +128,7 @@ def absent(name,
'changes': {},
'comment': []}
current_beacons = __salt__['beacons.list'](return_yaml=False)
current_beacons = __salt__['beacons.list'](return_yaml=False, **kwargs)
if name in current_beacons:
if 'test' in __opts__ and __opts__['test']:
kwargs['test'] = True
@ -170,7 +170,7 @@ def enabled(name, **kwargs):
'changes': {},
'comment': []}
current_beacons = __salt__['beacons.list'](return_yaml=False)
current_beacons = __salt__['beacons.list'](return_yaml=False, **kwargs)
if name in current_beacons:
if 'test' in __opts__ and __opts__['test']:
kwargs['test'] = True
@ -208,7 +208,7 @@ def disabled(name, **kwargs):
'changes': {},
'comment': []}
current_beacons = __salt__['beacons.list'](return_yaml=False)
current_beacons = __salt__['beacons.list'](return_yaml=False, **kwargs)
if name in current_beacons:
if 'test' in __opts__ and __opts__['test']:
kwargs['test'] = True

View file

@ -32,25 +32,29 @@ class BeaconsAddDeleteTest(ModuleCase):
os.unlink(self.beacons_config_file_path)
# Reset beacons
self.run_function('beacons.reset')
self.run_function('beacons.reset', f_timeout=300)
def test_add_and_delete(self):
'''
Test adding and deleting a beacon
'''
_add = self.run_function('beacons.add', ['ps', [{'processes': {'apache2': 'stopped'}}]])
_add = self.run_function(
'beacons.add',
['ps', [{'processes': {'apache2': 'stopped'}}]],
f_timeout=300
)
self.assertTrue(_add['result'])
# save added beacon
_save = self.run_function('beacons.save')
_save = self.run_function('beacons.save', f_timeout=300)
self.assertTrue(_save['result'])
# delete the beacon
_delete = self.run_function('beacons.delete', ['ps'])
_delete = self.run_function('beacons.delete', ['ps'], f_timeout=300)
self.assertTrue(_delete['result'])
# save the results
self.run_function('beacons.save')
self.run_function('beacons.save', f_timeout=300)
class BeaconsTest(ModuleCase):
@ -74,40 +78,48 @@ class BeaconsTest(ModuleCase):
self.__class__.beacons_config_file_path = os.path.join(self.minion_conf_d_dir, 'beacons.conf')
try:
# Add beacon to disable
self.run_function('beacons.add', ['ps', [{'processes': {'apache2': 'stopped'}}]])
self.run_function('beacons.save')
self.run_function('beacons.add',
['ps', [{'processes': {'apache2': 'stopped'}}]],
f_timeout=300)
self.run_function('beacons.save', f_timeout=300)
except CommandExecutionError:
self.skipTest('Unable to add beacon')
def tearDown(self):
# delete added beacon
self.run_function('beacons.delete', ['ps'])
self.run_function('beacons.save')
self.run_function('beacons.delete', ['ps'], f_timeout=300)
self.run_function('beacons.save', f_timeout=300)
# Reset beacons
self.run_function('beacons.reset')
self.run_function('beacons.reset', f_timeout=300)
def test_disable(self):
'''
Test disabling beacons
'''
# assert beacon exists
_list = self.run_function('beacons.list', return_yaml=False)
_list = self.run_function('beacons.list',
return_yaml=False,
f_timeout=300)
self.assertIn('ps', _list)
ret = self.run_function('beacons.disable')
ret = self.run_function('beacons.disable', f_timeout=300)
self.assertTrue(ret['result'])
# assert beacons are disabled
_list = self.run_function('beacons.list', return_yaml=False)
_list = self.run_function('beacons.list',
return_yaml=False,
f_timeout=300)
self.assertFalse(_list['enabled'])
# disable added beacon
ret = self.run_function('beacons.disable_beacon', ['ps'])
ret = self.run_function('beacons.disable_beacon', ['ps'], f_timeout=300)
self.assertTrue(ret['result'])
# assert beacon ps is disabled
_list = self.run_function('beacons.list', return_yaml=False)
_list = self.run_function('beacons.list',
return_yaml=False,
f_timeout=300)
for bdict in _list['ps']:
if 'enabled' in bdict:
self.assertFalse(bdict['enabled'])
@ -118,36 +130,45 @@ class BeaconsTest(ModuleCase):
Test enabling beacons
'''
# assert beacon exists
_list = self.run_function('beacons.list', return_yaml=False)
_list = self.run_function('beacons.list',
return_yaml=False,
f_timeout=300)
self.assertIn('ps', _list)
# enable beacons on minion
ret = self.run_function('beacons.enable')
ret = self.run_function('beacons.enable', f_timeout=300)
self.assertTrue(ret['result'])
# assert beacons are enabled
_list = self.run_function('beacons.list', return_yaml=False)
_list = self.run_function('beacons.list',
return_yaml=False,
f_timeout=300)
self.assertTrue(_list['enabled'])
@skipIf(True, 'Skip until https://github.com/saltstack/salt/issues/31516 problems are resolved.')
@skipIf(True, 'Skip until https://github.com/saltstack/salt/issues/31516 '
'problems are resolved.')
def test_enabled_beacons(self):
'''
Test enabled specific beacon
'''
# enable added beacon
ret = self.run_function('beacons.enable_beacon', ['ps'])
ret = self.run_function('beacons.enable_beacon', ['ps'], f_timeout=300)
self.assertTrue(ret['result'])
# assert beacon ps is enabled
_list = self.run_function('beacons.list', return_yaml=False)
_list = self.run_function('beacons.list',
return_yaml=False,
f_timeout=300)
self.assertTrue(_list['ps']['enabled'])
def test_list(self):
'''
Test lising the beacons
Test listing the beacons
'''
# list beacons
ret = self.run_function('beacons.list', return_yaml=False)
ret = self.run_function('beacons.list',
return_yaml=False,
f_timeout=300)
if 'enabled' in ret:
self.assertEqual(ret, {'ps': [{'processes': {'apache2': 'stopped'}}], 'enabled': True})
else:

View file

@ -23,21 +23,24 @@ class BeaconStateTestCase(ModuleCase, SaltReturnAssertsMixin):
def setUp(self):
'''
'''
self.run_function('beacons.reset')
self.run_function('beacons.reset', f_timeout=300)
def tearDown(self):
self.run_function('beacons.reset')
self.run_function('beacons.reset', f_timeout=300)
def test_present_absent(self):
kwargs = {'/': '38%', 'interval': 5}
ret = self.run_state(
'beacon.present',
name='diskusage',
f_timeout=300,
**kwargs
)
self.assertSaltTrueReturn(ret)
ret = self.run_function('beacons.list', return_yaml=False)
ret = self.run_function('beacons.list',
return_yaml=False,
f_timeout=300)
self.assertTrue('diskusage' in ret)
self.assertTrue({'interval': 5} in ret['diskusage'])
self.assertTrue({'/': '38%'} in ret['diskusage'])
@ -45,8 +48,11 @@ class BeaconStateTestCase(ModuleCase, SaltReturnAssertsMixin):
ret = self.run_state(
'beacon.absent',
name='diskusage',
f_timeout=300
)
self.assertSaltTrueReturn(ret)
ret = self.run_function('beacons.list', return_yaml=False)
ret = self.run_function('beacons.list',
return_yaml=False,
f_timeout=300)
self.assertEqual(ret, {'beacons': {}})