SHA256
1
0
forked from pool/salt
salt/option-to-en-disable-force-refresh-in-zypper-215.patch

125 lines
4.1 KiB
Diff
Raw Normal View History

From bb870d08a0268cb2be5309ee1a1b8facd2c885df Mon Sep 17 00:00:00 2001
From: darix <darix@users.noreply.github.com>
Date: Tue, 12 May 2020 13:58:15 +0200
Subject: [PATCH] Option to en-/disable force refresh in zypper (#215)
The default will still be force refresh to keep existing setups working.
1. Pillar option to turn off force refresh
```
zypper:
refreshdb_force: false
```
2. Cmdline option to force refresh.
```
salt '*' pkg.refresh_db [force=true|false]
```
The cmdline option will override the pillar as well.
Co-authored-by: Alexander Graul <agraul@suse.com>
---
salt/modules/zypperpkg.py | 32 ++++++++++++++++++++--------
tests/unit/modules/test_zypperpkg.py | 24 +++++++++++++++++++--
2 files changed, 45 insertions(+), 11 deletions(-)
diff --git a/salt/modules/zypperpkg.py b/salt/modules/zypperpkg.py
index e3f802a911..ed8420f398 100644
--- a/salt/modules/zypperpkg.py
+++ b/salt/modules/zypperpkg.py
@@ -1279,25 +1279,39 @@ def mod_repo(repo, **kwargs):
return repo
-def refresh_db(root=None):
- '''
- Force a repository refresh by calling ``zypper refresh --force``, return a dict::
+def refresh_db(root=None, force=None):
+ """
+ Trigger a repository refresh by calling ``zypper refresh``. Refresh will run
+ with ``--force`` if the "force=True" flag is passed on the CLI or
+ ``refreshdb_force`` is set to ``true`` in the pillar. The CLI option
+ overrides the pillar setting.
- {'<database name>': Bool}
+ It will return a dict::
- root
- operate on a different root directory.
+ {'<database name>': Bool}
CLI Example:
.. code-block:: bash
- salt '*' pkg.refresh_db
- '''
+ salt '*' pkg.refresh_db [force=true|false]
+
+ Pillar Example:
+
+ .. code-block:: yaml
+
+ zypper:
+ refreshdb_force: false
+ """
# Remove rtag file to keep multiple refreshes from happening in pkg states
salt.utils.pkg.clear_rtag(__opts__)
ret = {}
- out = __zypper__(root=root).refreshable.call('refresh', '--force')
+ refresh_opts = ['refresh']
+ if force is None:
+ force = __pillar__.get('zypper', {}).get('refreshdb_force', True)
+ if force:
+ refresh_opts.append('--force')
+ out = __zypper__(root=root).refreshable.call(*refresh_opts)
for line in out.splitlines():
if not line:
diff --git a/tests/unit/modules/test_zypperpkg.py b/tests/unit/modules/test_zypperpkg.py
index 2a8e753b9d..9a5c59a857 100644
--- a/tests/unit/modules/test_zypperpkg.py
+++ b/tests/unit/modules/test_zypperpkg.py
@@ -278,12 +278,32 @@ class ZypperTestCase(TestCase, LoaderModuleMockMixin):
'stderr': '', 'stdout': '\n'.join(ref_out), 'retcode': 0
}
- with patch.dict(zypper.__salt__, {'cmd.run_all': MagicMock(return_value=run_out)}):
- with patch.object(salt.utils.pkg, 'clear_rtag', Mock()):
+ zypper_mock = MagicMock(return_value=run_out)
+ call_kwargs = {
+ "output_loglevel": "trace",
+ "python_shell": False,
+ "env": {}
+ }
+ with patch.dict(zypper.__salt__, {"cmd.run_all": zypper_mock}):
+ with patch.object(salt.utils.pkg, "clear_rtag", Mock()):
result = zypper.refresh_db()
self.assertEqual(result.get("openSUSE-Leap-42.1-LATEST"), False)
self.assertEqual(result.get("openSUSE-Leap-42.1-Update"), False)
self.assertEqual(result.get("openSUSE-Leap-42.1-Update-Non-Oss"), True)
+ zypper_mock.assert_called_with(
+ ["zypper", "--non-interactive", "refresh", "--force"],
+ **call_kwargs
+ )
+ zypper.refresh_db(force=False)
+ zypper_mock.assert_called_with(
+ ["zypper", "--non-interactive", "refresh"],
+ **call_kwargs
+ )
+ zypper.refresh_db(force=True)
+ zypper_mock.assert_called_with(
+ ["zypper", "--non-interactive", "refresh", "--force"],
+ **call_kwargs
+ )
def test_info_installed(self):
'''
--
2.26.2