Merge pull request #37088 from meaksh/zypper-distupgrade-support-2015.8

Adding 'dist-upgrade' support to the zypper module
This commit is contained in:
Mike Place 2016-10-20 14:46:56 +09:00 committed by GitHub
commit 3a37a22366
2 changed files with 112 additions and 2 deletions

View file

@ -1047,7 +1047,12 @@ def install(name=None,
return salt.utils.compare_dicts(old, new)
def upgrade(refresh=True):
def upgrade(refresh=True,
dryrun=False,
dist_upgrade=False,
fromrepo=None,
novendorchange=False,
**kwargs): # pylint: disable=unused-argument
'''
.. versionchanged:: 2015.8.12,2016.3.3,Carbon
On minions running systemd>=205, `systemd-run(1)`_ is now used to
@ -1070,6 +1075,19 @@ def upgrade(refresh=True):
If set to False it depends on zypper if a refresh is
executed.
dryrun
If set to True, it creates a debug solver log file and then perform
a dry-run upgrade (no changes are made). Default: False
dist_upgrade
Perform a system dist-upgrade. Default: False
fromrepo
Specify a package repository to upgrade from. Default: None
novendorchange
If set to True, no allow vendor changes. Default: False
Return a dict containing the new package names and versions::
{'<package>': {'old': '<old-version>',
@ -1080,16 +1098,38 @@ def upgrade(refresh=True):
.. code-block:: bash
salt '*' pkg.upgrade
salt '*' pkg.upgrade dist-upgrade=True fromrepo="MyRepoName" novendorchange=True
salt '*' pkg.upgrade dist-upgrade=True dryrun=True
'''
ret = {'changes': {},
'result': True,
'comment': '',
}
cmd_update = (['dist-upgrade'] if dist_upgrade else ['update']) + ['--auto-agree-with-licenses']
if refresh:
refresh_db()
if dryrun:
cmd_update.append('--dry-run')
if dist_upgrade:
if dryrun:
# Creates a solver test case for debugging.
log.info('Executing debugsolver and performing a dry-run dist-upgrade')
__zypper__.noraise.call(*cmd_update + ['--debug-solver'])
if fromrepo:
cmd_update.extend(['--from', fromrepo])
log.info('Targeting repo {0!r}'.format(fromrepo))
if novendorchange:
cmd_update.append('--no-allow-vendor-change')
log.info('Disabling vendor changes')
old = list_pkgs()
__zypper__(systemd_scope=_systemd_scope()).noraise.call('update', '--auto-agree-with-licenses')
__zypper__(systemd_scope=_systemd_scope()).noraise.call(*cmd_update)
if __zypper__.exit_code not in __zypper__.SUCCESS_EXIT_CODES:
ret['result'] = False
ret['comment'] = (__zypper__.stdout() + os.linesep + __zypper__.stderr()).strip()

View file

@ -329,6 +329,76 @@ class ZypperTestCase(TestCase):
with patch('salt.modules.zypper.__zypper__', ZyppCallMock(return_value=get_test_data('zypper-available.txt'))):
self.assertEqual(zypper.latest_version('vim'), '7.4.326-2.62')
@patch('salt.modules.zypper.refresh_db', MagicMock(return_value=True))
@patch('salt.modules.zypper._systemd_scope', MagicMock(return_value=False))
def test_upgrade_success(self):
'''
Test system upgrade and dist-upgrade success.
:return:
'''
with patch('salt.modules.zypper.__zypper__.noraise.call', MagicMock()) as zypper_mock:
with patch('salt.modules.zypper.list_pkgs', MagicMock(side_effect=[{"vim": "1.1"}, {"vim": "1.2"}])):
ret = zypper.upgrade()
self.assertTrue(ret['result'])
self.assertDictEqual(ret['changes'], {"vim": {"old": "1.1", "new": "1.2"}})
zypper_mock.assert_any_call('update', '--auto-agree-with-licenses')
with patch('salt.modules.zypper.list_pkgs', MagicMock(side_effect=[{"vim": "1.1"}, {"vim": "1.2"}])):
ret = zypper.upgrade(dist_upgrade=True)
self.assertTrue(ret['result'])
self.assertDictEqual(ret['changes'], {"vim": {"old": "1.1", "new": "1.2"}})
zypper_mock.assert_any_call('dist-upgrade', '--auto-agree-with-licenses')
with patch('salt.modules.zypper.list_pkgs', MagicMock(side_effect=[{"vim": "1.1"}, {"vim": "1.1"}])):
ret = zypper.upgrade(dist_upgrade=True, dryrun=True)
self.assertTrue(ret['result'])
self.assertDictEqual(ret['changes'], {})
zypper_mock.assert_any_call('dist-upgrade', '--auto-agree-with-licenses', '--dry-run')
zypper_mock.assert_any_call('dist-upgrade', '--auto-agree-with-licenses', '--dry-run', '--debug-solver')
with patch('salt.modules.zypper.list_pkgs', MagicMock(side_effect=[{"vim": "1.1"}, {"vim": "1.2"}])):
ret = zypper.upgrade(dist_upgrade=True, fromrepo="Dummy", novendorchange=True)
self.assertTrue(ret['result'])
self.assertDictEqual(ret['changes'], {"vim": {"old": "1.1", "new": "1.2"}})
zypper_mock.assert_any_call('dist-upgrade', '--auto-agree-with-licenses', '--from', "Dummy", '--no-allow-vendor-change')
@patch('salt.modules.zypper.refresh_db', MagicMock(return_value=True))
@patch('salt.modules.zypper._systemd_scope', MagicMock(return_value=False))
def test_upgrade_failure(self):
'''
Test system upgrade failure.
:return:
'''
zypper_out = '''
Loading repository data...
Reading installed packages...
Computing distribution upgrade...
Use 'zypper repos' to get the list of defined repositories.
Repository 'DUMMY' not found by its alias, number, or URI.
'''
class FailingZypperDummy(object):
def __init__(self):
self.stdout = MagicMock(return_value=zypper_out)
self.stderr = MagicMock(return_value="")
self.exit_code = MagicMock(return_value=555)
self.noraise = MagicMock()
self.SUCCESS_EXIT_CODES = [0]
def __call__(self, *args, **kwargs):
return self
with patch('salt.modules.zypper.__zypper__', FailingZypperDummy()) as zypper_mock:
zypper_mock.noraise.call = MagicMock()
with patch('salt.modules.zypper.list_pkgs', MagicMock(side_effect=[{"vim": "1.1"}, {"vim": "1.1"}])):
ret = zypper.upgrade(dist_upgrade=True, fromrepo="DUMMY")
self.assertFalse(ret['result'])
self.assertEqual(ret['comment'], zypper_out.strip())
self.assertDictEqual(ret['changes'], {})
zypper_mock.noraise.call.assert_called_with('dist-upgrade', '--auto-agree-with-licenses', '--from', 'DUMMY')
@patch('salt.modules.zypper.refresh_db', MagicMock(return_value=True))
def test_upgrade_available(self):
'''