ae1540a455
- Bugfix: clean up `change` attribute from interface dict (upstream) Issue: https://github.com/saltstack/salt/issues/41461 PR: 1. https://github.com/saltstack/salt/pull/41487 2. https://github.com/saltstack/salt/pull/41533 Added: * clean-up-change-attribute-from-interface-dict.patch - Bugfix: orchestrate and batches returns false failed information https://github.com/saltstack/salt/issues/40635 - speed-up cherrypy by removing sleep call - wrong os_family grains on SUSE - fix unittests (bsc#1038855) - fix setting the language on SUSE systems (bsc#1038855) - Bugfix: unable to use hostname for minion ID as '127' (upstream) - Bugfix: remove sleep call in CheppryPy API handler (upstream) - Fix core grains constants for timezone (bsc#1032931) - Added: * bugfix-unable-to-use-127-as-hostname.patch * fix-grain-for-os_family-on-suse-series.patch * fix-os_family-case-in-unittest.patch * fix-setting-language-on-suse-systems.patch * fixed-issue-with-parsing-of-master-minion-returns-wh.patch * rest_cherrypy-remove-sleep-call.patch * use-correct-grain-constants-for-timezone.patch - Update to 2016.11.4 See https://docs.saltstack.com/en/develop/topics/releases/2016.11.4.html for full changelog - Changed: * add-options-for-dockerng.patch * fix-regression-in-file.get_managed-add-unit-tests.patch OBS-URL: https://build.opensuse.org/request/show/514025 OBS-URL: https://build.opensuse.org/package/show/systemsmanagement:saltstack/salt?expand=0&rev=89
186 lines
8.3 KiB
Diff
186 lines
8.3 KiB
Diff
From c9eb78888326d6ca6173a8d6059e1de26884030e Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Pablo=20Su=C3=A1rez=20Hern=C3=A1ndez?=
|
|
<psuarezhernandez@suse.com>
|
|
Date: Tue, 18 Apr 2017 16:04:14 +0100
|
|
Subject: [PATCH] Search the entire CACHE_DIR because storage paths
|
|
change across versions
|
|
|
|
Prevents zero length error on Python 2.6
|
|
|
|
Fixes Zypper unit test
|
|
|
|
Enhances pkg.list_downloaded information of a package
|
|
|
|
Listing all patches instead of security ones only
|
|
|
|
Adapting Zypper test to new list_downloaded output
|
|
|
|
Fixes zypper test error after backporting
|
|
|
|
Pylint fixes
|
|
---
|
|
salt/modules/yumpkg.py | 18 +++++++++++++-----
|
|
salt/modules/zypper.py | 17 ++++++++++++-----
|
|
salt/states/pkg.py | 3 ++-
|
|
tests/unit/modules/zypper_test.py | 20 ++++++++++++++------
|
|
4 files changed, 41 insertions(+), 17 deletions(-)
|
|
|
|
diff --git a/salt/modules/yumpkg.py b/salt/modules/yumpkg.py
|
|
index f6777d770f..690d0c4e3a 100644
|
|
--- a/salt/modules/yumpkg.py
|
|
+++ b/salt/modules/yumpkg.py
|
|
@@ -18,8 +18,8 @@ Support for YUM/DNF
|
|
from __future__ import absolute_import
|
|
import contextlib
|
|
import copy
|
|
+import datetime
|
|
import fnmatch
|
|
-import glob
|
|
import itertools
|
|
import logging
|
|
import os
|
|
@@ -816,9 +816,17 @@ def list_downloaded():
|
|
CACHE_DIR = os.path.join('/var/cache/', _yum())
|
|
|
|
ret = {}
|
|
- for package_path in glob.glob(os.path.join(CACHE_DIR, '*/*/*/packages/*.rpm')):
|
|
- pkg_info = __salt__['lowpkg.bin_pkg_info'](package_path)
|
|
- ret.setdefault(pkg_info['name'], {})[pkg_info['version']] = package_path
|
|
+ for root, dirnames, filenames in os.walk(CACHE_DIR):
|
|
+ for filename in fnmatch.filter(filenames, '*.rpm'):
|
|
+ package_path = os.path.join(root, filename)
|
|
+ pkg_info = __salt__['lowpkg.bin_pkg_info'](package_path)
|
|
+ pkg_timestamp = int(os.path.getctime(package_path))
|
|
+ ret.setdefault(pkg_info['name'], {})[pkg_info['version']] = {
|
|
+ 'path': package_path,
|
|
+ 'size': os.path.getsize(package_path),
|
|
+ 'creation_date_time_t': pkg_timestamp,
|
|
+ 'creation_date_time': datetime.datetime.fromtimestamp(pkg_timestamp).isoformat(),
|
|
+ }
|
|
return ret
|
|
|
|
|
|
@@ -2804,7 +2812,7 @@ def _get_patches(installed_only=False):
|
|
'''
|
|
patches = {}
|
|
|
|
- cmd = [_yum(), '--quiet', 'updateinfo', 'list', 'security', 'all']
|
|
+ cmd = [_yum(), '--quiet', 'updateinfo', 'list', 'all']
|
|
ret = __salt__['cmd.run_stdout'](
|
|
cmd,
|
|
python_shell=False
|
|
diff --git a/salt/modules/zypper.py b/salt/modules/zypper.py
|
|
index 28087f5dbd..6055966904 100644
|
|
--- a/salt/modules/zypper.py
|
|
+++ b/salt/modules/zypper.py
|
|
@@ -15,7 +15,7 @@ Package support for openSUSE via the zypper package manager
|
|
# Import python libs
|
|
from __future__ import absolute_import
|
|
import copy
|
|
-import glob
|
|
+import fnmatch
|
|
import logging
|
|
import re
|
|
import os
|
|
@@ -1797,10 +1797,17 @@ def list_downloaded():
|
|
CACHE_DIR = '/var/cache/zypp/packages/'
|
|
|
|
ret = {}
|
|
- # Zypper storage is repository_tag/arch/package-version.rpm
|
|
- for package_path in glob.glob(os.path.join(CACHE_DIR, '*/*/*.rpm')):
|
|
- pkg_info = __salt__['lowpkg.bin_pkg_info'](package_path)
|
|
- ret.setdefault(pkg_info['name'], {})[pkg_info['version']] = package_path
|
|
+ for root, dirnames, filenames in os.walk(CACHE_DIR):
|
|
+ for filename in fnmatch.filter(filenames, '*.rpm'):
|
|
+ package_path = os.path.join(root, filename)
|
|
+ pkg_info = __salt__['lowpkg.bin_pkg_info'](package_path)
|
|
+ pkg_timestamp = int(os.path.getctime(package_path))
|
|
+ ret.setdefault(pkg_info['name'], {})[pkg_info['version']] = {
|
|
+ 'path': package_path,
|
|
+ 'size': os.path.getsize(package_path),
|
|
+ 'creation_date_time_t': pkg_timestamp,
|
|
+ 'creation_date_time': datetime.datetime.fromtimestamp(pkg_timestamp).isoformat(),
|
|
+ }
|
|
return ret
|
|
|
|
|
|
diff --git a/salt/states/pkg.py b/salt/states/pkg.py
|
|
index d185002d41..0983712b4c 100644
|
|
--- a/salt/states/pkg.py
|
|
+++ b/salt/states/pkg.py
|
|
@@ -2081,7 +2081,8 @@ def patch_installed(name, advisory_ids=None, downloadonly=None, **kwargs):
|
|
if not ret['changes'] and not ret['comment']:
|
|
status = 'downloaded' if downloadonly else 'installed'
|
|
ret['result'] = True
|
|
- ret['comment'] = 'Related packages are already {}'.format(status)
|
|
+ ret['comment'] = ('Advisory patch is not needed or related packages '
|
|
+ 'are already {0}'.format(status))
|
|
|
|
return ret
|
|
|
|
diff --git a/tests/unit/modules/zypper_test.py b/tests/unit/modules/zypper_test.py
|
|
index 39bd2e73e8..c9d44d102c 100644
|
|
--- a/tests/unit/modules/zypper_test.py
|
|
+++ b/tests/unit/modules/zypper_test.py
|
|
@@ -486,7 +486,10 @@ Repository 'DUMMY' not found by its alias, number, or URI.
|
|
self.assertEqual(len(list_patches), 3)
|
|
self.assertDictEqual(list_patches, PATCHES_RET)
|
|
|
|
- @patch('glob.glob', MagicMock(return_value=['/var/cache/zypper/packages/foo/bar/test_package.rpm']))
|
|
+ @patch('os.walk', MagicMock(return_value=[('test', 'test', 'test')]))
|
|
+ @patch('os.path.getsize', MagicMock(return_value=123456))
|
|
+ @patch('os.path.getctime', MagicMock(return_value=1234567890.123456))
|
|
+ @patch('fnmatch.filter', MagicMock(return_value=['/var/cache/zypper/packages/foo/bar/test_package.rpm']))
|
|
def test_list_downloaded(self):
|
|
'''
|
|
Test downloaded packages listing.
|
|
@@ -495,7 +498,12 @@ Repository 'DUMMY' not found by its alias, number, or URI.
|
|
'''
|
|
DOWNLOADED_RET = {
|
|
'test-package': {
|
|
- '1.0': '/var/cache/zypper/packages/foo/bar/test_package.rpm'
|
|
+ '1.0': {
|
|
+ 'path': '/var/cache/zypper/packages/foo/bar/test_package.rpm',
|
|
+ 'size': 123456,
|
|
+ 'creation_date_time_t': 1234567890,
|
|
+ 'creation_date_time': '2009-02-13T23:31:30',
|
|
+ }
|
|
}
|
|
}
|
|
|
|
@@ -530,7 +538,7 @@ Repository 'DUMMY' not found by its alias, number, or URI.
|
|
self.assertEqual(zypper.download("nmap", "foo"), test_out)
|
|
|
|
@patch('salt.modules.zypper._systemd_scope', MagicMock(return_value=False))
|
|
- @patch('salt.modules.zypper.list_downloaded', MagicMock(side_effect=[{}, {'vim': {'1.1': '/foo/bar/test.rpm'}}]))
|
|
+ @patch('salt.modules.zypper.list_downloaded', MagicMock(side_effect=[{}, {'vim': {'1.1': {'path': '/foo/bar/test.rpm', 'size': 1234, 'creation_date_time_t': 1234567890, 'creation_date_time': '2009-02-13T23:31:30'}}}]))
|
|
def test_install_with_downloadonly(self):
|
|
'''
|
|
Test a package installation with downloadonly=True.
|
|
@@ -548,10 +556,10 @@ Repository 'DUMMY' not found by its alias, number, or URI.
|
|
'--download-only',
|
|
'vim'
|
|
)
|
|
- self.assertDictEqual(ret, {'vim': {'new': {'1.1': '/foo/bar/test.rpm'}, 'old': ''}})
|
|
+ self.assertDictEqual(ret, {'vim': {'new': {'1.1': {'path': '/foo/bar/test.rpm', 'size': 1234, 'creation_date_time_t': 1234567890, 'creation_date_time': '2009-02-13T23:31:30'}}, 'old': ''}})
|
|
|
|
@patch('salt.modules.zypper._systemd_scope', MagicMock(return_value=False))
|
|
- @patch('salt.modules.zypper.list_downloaded', MagicMock(return_value={'vim': {'1.1': '/foo/bar/test.rpm'}}))
|
|
+ @patch('salt.modules.zypper.list_downloaded', MagicMock(return_value={'vim': {'1.1': {'path': '/foo/bar/test.rpm', 'size': 1234, 'creation_date_time_t': 1234567890, 'creation_date_time': '2017-01-01T11:00:00'}}}))
|
|
def test_install_with_downloadonly_already_downloaded(self):
|
|
'''
|
|
Test a package installation with downloadonly=True when package is already downloaded.
|
|
@@ -603,7 +611,7 @@ Repository 'DUMMY' not found by its alias, number, or URI.
|
|
'''
|
|
with patch.dict(zypper.__salt__, {'pkg_resource.parse_targets': MagicMock(return_value=({'SUSE-PATCH-XXX': None}, 'advisory'))}):
|
|
with patch('salt.modules.zypper.__zypper__.noraise.call', MagicMock()) as zypper_mock:
|
|
- with self.assertRaisesRegex(CommandExecutionError, '^Advisory id "SUSE-PATCH-XXX" not found$'):
|
|
+ with self.assertRaisesRegexp(CommandExecutionError, '^Advisory id "SUSE-PATCH-XXX" not found$'):
|
|
zypper.install(advisory_ids=['SUSE-PATCH-XXX'])
|
|
|
|
def test_remove_purge(self):
|
|
--
|
|
2.12.2
|
|
|
|
|