Merge pull request #33558 from twangboy/fix_win_servermanager

Fix win servermanager
This commit is contained in:
Mike Place 2016-05-27 15:05:43 -07:00
commit b47182e47c
3 changed files with 139 additions and 71 deletions

View file

@ -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']}

View file

@ -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

View file

@ -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__':