mirror of
https://github.com/saltstack/salt.git
synced 2025-04-17 10:10:20 +00:00
Merge pull request #33558 from twangboy/fix_win_servermanager
Fix win servermanager
This commit is contained in:
commit
b47182e47c
3 changed files with 139 additions and 71 deletions
|
@ -150,12 +150,16 @@ def install(feature, recurse=False):
|
|||
'-WarningAction SilentlyContinue'.format(_cmd_quote(feature), sub)
|
||||
out = _pshell_json(cmd)
|
||||
|
||||
ret = {'ExitCode': out['ExitCode'],
|
||||
'DisplayName': out['FeatureResult'][0]['DisplayName'],
|
||||
'RestartNeeded': out['FeatureResult'][0]['RestartNeeded'],
|
||||
'Success': out['Success']}
|
||||
|
||||
return ret
|
||||
if out['FeatureResult']:
|
||||
return {'ExitCode': out['ExitCode'],
|
||||
'DisplayName': out['FeatureResult'][0]['DisplayName'],
|
||||
'RestartNeeded': out['FeatureResult'][0]['RestartNeeded'],
|
||||
'Success': out['Success']}
|
||||
else:
|
||||
return {'ExitCode': out['ExitCode'],
|
||||
'DisplayName': '{0} (already installed)'.format(feature),
|
||||
'RestartNeeded': False,
|
||||
'Success': out['Success']}
|
||||
|
||||
|
||||
def remove(feature):
|
||||
|
@ -185,9 +189,13 @@ def remove(feature):
|
|||
'-WarningAction SilentlyContinue'.format(_cmd_quote(feature))
|
||||
out = _pshell_json(cmd)
|
||||
|
||||
ret = {'ExitCode': out['ExitCode'],
|
||||
'DisplayName': out['FeatureResult'][0]['DisplayName'],
|
||||
'RestartNeeded': out['FeatureResult'][0]['RestartNeeded'],
|
||||
'Success': out['Success']}
|
||||
|
||||
return ret
|
||||
if out['FeatureResult']:
|
||||
return {'ExitCode': out['ExitCode'],
|
||||
'DisplayName': out['FeatureResult'][0]['DisplayName'],
|
||||
'RestartNeeded': out['FeatureResult'][0]['RestartNeeded'],
|
||||
'Success': out['Success']}
|
||||
else:
|
||||
return {'ExitCode': out['ExitCode'],
|
||||
'DisplayName': '{0} (not installed)'.format(feature),
|
||||
'RestartNeeded': False,
|
||||
'Success': out['Success']}
|
||||
|
|
|
@ -3,6 +3,9 @@
|
|||
Manage Windows features via the ServerManager powershell module
|
||||
'''
|
||||
|
||||
# Import salt modules
|
||||
import salt.utils
|
||||
|
||||
|
||||
def __virtual__():
|
||||
'''
|
||||
|
@ -49,10 +52,13 @@ def installed(name, recurse=False, force=False):
|
|||
'comment': ''}
|
||||
|
||||
# Determine if the feature is installed
|
||||
if name not in __salt__['win_servermanager.list_installed']():
|
||||
ret['changes'] = {'feature': '{0} will be installed recurse={1}'.format(name, recurse)}
|
||||
old = __salt__['win_servermanager.list_installed']()
|
||||
if name not in old:
|
||||
ret['changes']['feature'] = \
|
||||
'{0} will be installed recurse={1}'.format(name, recurse)
|
||||
elif force and recurse:
|
||||
ret['changes'] = {'feature': '{0} already installed but might install sub-features'.format(name)}
|
||||
ret['changes']['feature'] = \
|
||||
'{0} already installed but might install sub-features'.format(name)
|
||||
else:
|
||||
ret['comment'] = 'The feature {0} is already installed'.format(name)
|
||||
return ret
|
||||
|
@ -61,19 +67,26 @@ def installed(name, recurse=False, force=False):
|
|||
ret['result'] = None
|
||||
return ret
|
||||
|
||||
# Install the features
|
||||
ret['changes'] = {'feature': __salt__['win_servermanager.install'](name, recurse)}
|
||||
if ret['changes']['feature']:
|
||||
ret['comment'] = ret['changes']['feature']
|
||||
|
||||
if 'Success' in ret['changes']['feature']:
|
||||
ret['result'] = ret['changes']['feature']['Success']
|
||||
if not ret['result']:
|
||||
ret['comment'] = 'Failed to install {0}: {1}'.format(name, ret['changes']['feature']['ExitCode'])
|
||||
else:
|
||||
ret['comment'] = 'Installed {0}'.format(name)
|
||||
else:
|
||||
ret['result'] = False
|
||||
ret['comment'] = 'Failed to install {0}.\nError Message:\n{1}'.format(name, ret['changes']['feature'])
|
||||
ret['changes'] = {}
|
||||
ret['changes'] = {}
|
||||
|
||||
# Install the features
|
||||
status = __salt__['win_servermanager.install'](name, recurse)
|
||||
|
||||
ret['result'] = status['Success']
|
||||
if not ret['result']:
|
||||
ret['comment'] = 'Failed to install {0}: {1}'\
|
||||
.format(name, status['ExitCode'])
|
||||
|
||||
new = __salt__['win_servermanager.list_installed']()
|
||||
changes = salt.utils.compare_dicts(old, new)
|
||||
|
||||
if changes:
|
||||
ret['comment'] = 'Installed {0}'.format(name)
|
||||
ret['changes'] = status
|
||||
ret['changes']['feature'] = changes
|
||||
|
||||
return ret
|
||||
|
||||
|
@ -107,8 +120,9 @@ def removed(name):
|
|||
'changes': {},
|
||||
'comment': ''}
|
||||
# Determine if the feature is installed
|
||||
if name in __salt__['win_servermanager.list_installed']():
|
||||
ret['changes'] = {'feature': '{0} will be removed'.format(name)}
|
||||
old = __salt__['win_servermanager.list_installed']()
|
||||
if name in old:
|
||||
ret['changes']['feature'] = '{0} will be removed'.format(name)
|
||||
else:
|
||||
ret['comment'] = 'The feature {0} is not installed'.format(name)
|
||||
return ret
|
||||
|
@ -117,10 +131,22 @@ def removed(name):
|
|||
ret['result'] = None
|
||||
return ret
|
||||
|
||||
ret['changes'] = {}
|
||||
|
||||
# Remove the features
|
||||
ret['changes'] = {'feature': __salt__['win_servermanager.remove'](name)}
|
||||
ret['result'] = ret['changes']['feature']['Success']
|
||||
status = __salt__['win_servermanager.remove'](name)
|
||||
|
||||
ret['result'] = status['Success']
|
||||
if not ret['result']:
|
||||
ret['comment'] = 'Failed to uninstall the feature {0}'.format(ret['changes']['feature']['ExitCode'])
|
||||
ret['comment'] = 'Failed to uninstall the feature {0}'\
|
||||
.format(status['ExitCode'])
|
||||
|
||||
new = __salt__['win_servermanager.list_installed']()
|
||||
changes = salt.utils.compare_dicts(old, new)
|
||||
|
||||
if changes:
|
||||
ret['comment'] = 'Removed {0}'.format(name)
|
||||
ret['changes'] = status
|
||||
ret['changes']['feature'] = changes
|
||||
|
||||
return ret
|
||||
|
|
|
@ -35,58 +35,92 @@ class WinServermanagerTestCase(TestCase):
|
|||
'''
|
||||
Test to install the windows feature
|
||||
'''
|
||||
ret = {'name': 'salt',
|
||||
'changes': {},
|
||||
'result': True,
|
||||
'comment': ''}
|
||||
mock = MagicMock(side_effect=['salt', 'stack', 'stack'])
|
||||
mock1 = MagicMock(return_value={'Success': True})
|
||||
mock_list = MagicMock(
|
||||
side_effect=[{'spongebob': 'squarepants'},
|
||||
{'squidward': 'patrick'},
|
||||
{'spongebob': 'squarepants'},
|
||||
{'spongebob': 'squarepants',
|
||||
'squidward': 'patrick'}])
|
||||
mock_install = MagicMock(
|
||||
return_value={'Success': True,
|
||||
'RestartNeeded': False,
|
||||
'ExitCode': 1234})
|
||||
with patch.dict(win_servermanager.__salt__,
|
||||
{"win_servermanager.list_installed": mock,
|
||||
"win_servermanager.install": mock1}):
|
||||
ret.update({'comment': 'The feature salt is already installed'})
|
||||
self.assertDictEqual(win_servermanager.installed('salt'), ret)
|
||||
{"win_servermanager.list_installed": mock_list,
|
||||
"win_servermanager.install": mock_install}):
|
||||
ret = {'name': 'spongebob',
|
||||
'changes': {},
|
||||
'result': True,
|
||||
'comment': 'The feature spongebob is already installed'}
|
||||
self.assertDictEqual(win_servermanager.installed('spongebob'), ret)
|
||||
|
||||
with patch.dict(win_servermanager.__opts__, {"test": True}):
|
||||
ret.update({'changes': {'feature':
|
||||
'salt will be installed'
|
||||
' recurse=False'}, 'result': None,
|
||||
'comment': ''})
|
||||
self.assertDictEqual(win_servermanager.installed('salt'), ret)
|
||||
ret = {'name': 'spongebob',
|
||||
'result': None,
|
||||
'comment': '',
|
||||
'changes': {
|
||||
'feature': 'spongebob will be installed '
|
||||
'recurse=False'}}
|
||||
self.assertDictEqual(
|
||||
win_servermanager.installed('spongebob'), ret)
|
||||
|
||||
with patch.dict(win_servermanager.__opts__, {"test": False}):
|
||||
ret.update({'changes': {'feature': {'Success': True}},
|
||||
'result': True, 'comment': 'Installed salt'})
|
||||
self.assertDictEqual(win_servermanager.installed('salt'),
|
||||
ret)
|
||||
with patch.dict(win_servermanager.__opts__, {"test": False}):
|
||||
ret = {'name': 'squidward',
|
||||
'result': True,
|
||||
'comment': 'Installed squidward',
|
||||
'changes': {
|
||||
'Success': True,
|
||||
'RestartNeeded': False,
|
||||
'ExitCode': 1234,
|
||||
'feature': {'squidward': {'new': 'patrick',
|
||||
'old': ''}}}}
|
||||
self.assertDictEqual(
|
||||
win_servermanager.installed('squidward'), ret)
|
||||
|
||||
def test_removed(self):
|
||||
'''
|
||||
Test to remove the windows feature
|
||||
'''
|
||||
ret = {'name': 'salt',
|
||||
'changes': {},
|
||||
'result': True,
|
||||
'comment': ''}
|
||||
mock = MagicMock(side_effect=['stack', 'salt', 'salt'])
|
||||
mock1 = MagicMock(return_value={'Success': True})
|
||||
mock_list = MagicMock(
|
||||
side_effect=[{'spongebob': 'squarepants'},
|
||||
{'squidward': 'patrick'},
|
||||
{'spongebob': 'squarepants',
|
||||
'squidward': 'patrick'},
|
||||
{'spongebob': 'squarepants'}])
|
||||
mock_remove = MagicMock(
|
||||
return_value={'Success': True,
|
||||
'RestartNeeded': False,
|
||||
'ExitCode': 1234})
|
||||
with patch.dict(win_servermanager.__salt__,
|
||||
{"win_servermanager.list_installed": mock,
|
||||
"win_servermanager.remove": mock1}):
|
||||
ret.update({'comment': 'The feature salt is not installed'})
|
||||
self.assertDictEqual(win_servermanager.removed('salt'), ret)
|
||||
{"win_servermanager.list_installed": mock_list,
|
||||
"win_servermanager.remove": mock_remove}):
|
||||
ret = {'name': 'squidward',
|
||||
'changes': {},
|
||||
'result': True,
|
||||
'comment': 'The feature squidward is not installed'}
|
||||
self.assertDictEqual(
|
||||
win_servermanager.removed('squidward'), ret)
|
||||
|
||||
with patch.dict(win_servermanager.__opts__, {"test": True}):
|
||||
ret.update({'changes': {'feature':
|
||||
'salt will be removed'},
|
||||
'result': None, 'comment': ''})
|
||||
self.assertDictEqual(win_servermanager.removed('salt'), ret)
|
||||
ret = {'name': 'squidward',
|
||||
'result': None,
|
||||
'comment': '',
|
||||
'changes': {'feature': 'squidward will be removed'}}
|
||||
self.assertDictEqual(
|
||||
win_servermanager.removed('squidward'), ret)
|
||||
|
||||
with patch.dict(win_servermanager.__opts__, {"test": False}):
|
||||
ret.update({'changes': {'feature': {'Success': True}},
|
||||
'result': True})
|
||||
self.assertDictEqual(win_servermanager.removed('salt'),
|
||||
ret)
|
||||
with patch.dict(win_servermanager.__opts__, {"test": False}):
|
||||
ret = {'name': 'squidward',
|
||||
'result': True,
|
||||
'comment': 'Removed squidward',
|
||||
'changes': {
|
||||
'Success': True,
|
||||
'RestartNeeded': False,
|
||||
'ExitCode': 1234,
|
||||
'feature': {'squidward': {'new': '',
|
||||
'old': 'patrick'}}}}
|
||||
self.assertDictEqual(
|
||||
win_servermanager.removed('squidward'), ret)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
|
Loading…
Add table
Reference in a new issue