SHA256
1
0
forked from pool/salt
salt/use-correct-grain-constants-for-timezone.patch
Klaus Kämpf ae1540a455 Accepting request 514025 from systemsmanagement:saltstack:testing
- 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
2017-08-04 10:29:26 +00:00

531 lines
19 KiB
Diff

From 48cc3497eb19059a7acf14268a722e46b12e59be Mon Sep 17 00:00:00 2001
From: Bo Maryniuk <bo@suse.de>
Date: Fri, 21 Apr 2017 15:53:51 +0200
Subject: [PATCH] Use correct grain constants for timezone
Adjust the test so it is using the right grain for SUSE systems
Bugfix: use correct grain constant for platform
Refactor with setup/teardown
Add UT for RedHat's set_zone
Fix doc for RH UT
Remove unnecessary mock patch
Doc fix
Add UT for set_zone on SUSE series
Adjust UT to use correct grain for SUSE series
Bugfix: use correct os_family grain value for SUSE series
Add UT for gentoo on set_zone
Add UT for Debian on set_zone
Remove duplicate code
Add UT for get_hwclock on UTC/localtime
Remove dead code
Add UT for get_hwclock on SUSE platform
Bugfix: use correct grain for SUSE and RedHat platform
Add UT for RedHat/SUSE platforms on get_hwclock
Add UT for Debian on get_hwclock
Add UT on Solaris
Add UT for AIX on get_hwclock
Add UT for set_hwclock on AIX
Fix docstrings
Add UT for set_hwclock on solaris
Add UT for set_hwclock on Arch
Add UT for set_hwclock on RedHat
Fix UT names
Add UT set_hwclock on SUSE
Bugfix: use correct grain name for SUSE platform
Add UT for set_hwclock on Debian
Add UT on set_hw_clock on Gentoo
Fix lint issues
Rewrite test case for using no patch decorators
Disable the test for a while
Do not use multiple variables in "with" statement as of lint issues
---
salt/modules/timezone.py | 13 +-
tests/unit/modules/timezone_test.py | 390 ++++++++++++++++++++++++++++++++++++
2 files changed, 395 insertions(+), 8 deletions(-)
create mode 100644 tests/unit/modules/timezone_test.py
diff --git a/salt/modules/timezone.py b/salt/modules/timezone.py
index 69fb4fb663..e0d079f50a 100644
--- a/salt/modules/timezone.py
+++ b/salt/modules/timezone.py
@@ -160,7 +160,7 @@ def get_zone():
if __grains__['os'].lower() == 'centos':
return _get_zone_etc_localtime()
os_family = __grains__['os_family']
- for family in ('RedHat', 'SUSE'):
+ for family in ('RedHat', 'Suse'):
if family in os_family:
return _get_zone_sysconfig()
for family in ('Debian', 'Gentoo'):
@@ -273,16 +273,13 @@ def set_zone(timezone):
if 'RedHat' in __grains__['os_family']:
__salt__['file.sed'](
'/etc/sysconfig/clock', '^ZONE=.*', 'ZONE="{0}"'.format(timezone))
- elif 'SUSE' in __grains__['os_family']:
+ elif 'Suse' in __grains__['os_family']:
__salt__['file.sed'](
'/etc/sysconfig/clock', '^TIMEZONE=.*', 'TIMEZONE="{0}"'.format(timezone))
- elif 'Debian' in __grains__['os_family']:
+ elif 'Debian' in __grains__['os_family'] or 'Gentoo' in __grains__['os_family']:
with salt.utils.fopen('/etc/timezone', 'w') as ofh:
ofh.write(timezone.strip())
ofh.write('\n')
- elif 'Gentoo' in __grains__['os_family']:
- with salt.utils.fopen('/etc/timezone', 'w') as ofh:
- ofh.write(timezone)
return True
@@ -373,7 +370,7 @@ def get_hwclock():
else:
os_family = __grains__['os_family']
- for family in ('RedHat', 'SUSE'):
+ for family in ('RedHat', 'Suse'):
if family in os_family:
cmd = ['tail', '-n', '1', '/etc/adjtime']
return __salt__['cmd.run'](cmd, python_shell=False)
@@ -505,7 +502,7 @@ def set_hwclock(clock):
elif 'RedHat' in __grains__['os_family']:
__salt__['file.sed'](
'/etc/sysconfig/clock', '^ZONE=.*', 'ZONE="{0}"'.format(timezone))
- elif 'SUSE' in __grains__['os_family']:
+ elif 'Suse' in __grains__['os_family']:
__salt__['file.sed'](
'/etc/sysconfig/clock', '^TIMEZONE=.*', 'TIMEZONE="{0}"'.format(timezone))
elif 'Debian' in __grains__['os_family']:
diff --git a/tests/unit/modules/timezone_test.py b/tests/unit/modules/timezone_test.py
new file mode 100644
index 0000000000..ebf28e28ee
--- /dev/null
+++ b/tests/unit/modules/timezone_test.py
@@ -0,0 +1,390 @@
+# -*- coding: utf-8 -*-
+'''
+ :codeauthor: :email:`Bo Maryniuk <bo@suse.de>`
+'''
+
+# Import Python Libs
+from __future__ import absolute_import
+
+# Import Salt Testing Libs
+from salttesting import TestCase, skipIf
+from salttesting.mock import (
+ MagicMock,
+ patch,
+ NO_MOCK,
+ NO_MOCK_REASON
+)
+
+from salttesting.helpers import ensure_in_syspath
+from salt.exceptions import SaltInvocationError
+
+ensure_in_syspath('../../')
+
+# Import Salt Libs
+from salt.modules import timezone
+
+
+@skipIf(NO_MOCK, NO_MOCK_REASON)
+class TimezoneTestCase(TestCase):
+ '''
+ Timezone test case
+ '''
+ TEST_TZ = 'UTC'
+
+ def setUp(self):
+ '''
+ Setup test
+ :return:
+ '''
+ timezone.__salt__ = {'file.sed': MagicMock(),
+ 'cmd.run': MagicMock(),
+ 'cmd.retcode': MagicMock(return_value=0)}
+ timezone.__grains__ = {'os': 'unknown'}
+
+ def tearDown(self):
+ '''
+ Teardown test
+ :return:
+ '''
+ timezone.__salt__ = timezone.__grains__ = None
+
+ @patch('salt.utils.which', MagicMock(return_value=False))
+ def test_get_zone_centos(self):
+ '''
+ Test CentOS is recognized
+ :return:
+ '''
+ timezone.__grains__['os'] = 'centos'
+ with patch('salt.modules.timezone._get_zone_etc_localtime', MagicMock(return_value=self.TEST_TZ)):
+ assert timezone.get_zone() == self.TEST_TZ
+
+ @patch('salt.utils.which', MagicMock(return_value=False))
+ def test_get_zone_os_family_rh_suse(self):
+ '''
+ Test RedHat and Suse are recognized
+ :return:
+ '''
+ for osfamily in ['RedHat', 'Suse']:
+ timezone.__grains__['os_family'] = [osfamily]
+ with patch('salt.modules.timezone._get_zone_sysconfig', MagicMock(return_value=self.TEST_TZ)):
+ assert timezone.get_zone() == self.TEST_TZ
+
+ @patch('salt.utils.which', MagicMock(return_value=False))
+ def test_get_zone_os_family_debian_gentoo(self):
+ '''
+ Test Debian and Gentoo are recognized
+ :return:
+ '''
+ for osfamily in ['Debian', 'Gentoo']:
+ timezone.__grains__['os_family'] = [osfamily]
+ with patch('salt.modules.timezone._get_zone_etc_timezone', MagicMock(return_value=self.TEST_TZ)):
+ assert timezone.get_zone() == self.TEST_TZ
+
+ @patch('salt.utils.which', MagicMock(return_value=False))
+ def test_get_zone_os_family_allbsd_nilinuxrt(self):
+ '''
+ Test *BSD and NILinuxRT are recognized
+ :return:
+ '''
+ for osfamily in ['FreeBSD', 'OpenBSD', 'NetBSD', 'NILinuxRT']:
+ timezone.__grains__['os_family'] = osfamily
+ with patch('salt.modules.timezone._get_zone_etc_localtime', MagicMock(return_value=self.TEST_TZ)):
+ assert timezone.get_zone() == self.TEST_TZ
+
+ @patch('salt.utils.which', MagicMock(return_value=False))
+ def test_get_zone_os_family_slowlaris(self):
+ '''
+ Test Slowlaris is recognized
+ :return:
+ '''
+ timezone.__grains__['os_family'] = ['Solaris']
+ with patch('salt.modules.timezone._get_zone_solaris', MagicMock(return_value=self.TEST_TZ)):
+ assert timezone.get_zone() == self.TEST_TZ
+
+ @patch('salt.utils.which', MagicMock(return_value=False))
+ def test_get_zone_os_family_aix(self):
+ '''
+ Test IBM AIX is recognized
+ :return:
+ '''
+ timezone.__grains__['os_family'] = ['AIX']
+ with patch('salt.modules.timezone._get_zone_aix', MagicMock(return_value=self.TEST_TZ)):
+ assert timezone.get_zone() == self.TEST_TZ
+
+ @patch('salt.utils.which', MagicMock(return_value=False))
+ @patch('os.path.exists', MagicMock(return_value=True))
+ @patch('os.unlink', MagicMock())
+ @patch('os.symlink', MagicMock())
+ def test_set_zone_redhat(self):
+ '''
+ Test zone set on RH series
+ :return:
+ '''
+ timezone.__grains__['os_family'] = ['RedHat']
+ assert timezone.set_zone(self.TEST_TZ)
+ name, args, kwargs = timezone.__salt__['file.sed'].mock_calls[0]
+ assert args == ('/etc/sysconfig/clock', '^ZONE=.*', 'ZONE="UTC"')
+
+ @patch('salt.utils.which', MagicMock(return_value=False))
+ @patch('os.path.exists', MagicMock(return_value=True))
+ @patch('os.unlink', MagicMock())
+ @patch('os.symlink', MagicMock())
+ def test_set_zone_suse(self):
+ '''
+ Test zone set on SUSE series
+ :return:
+ '''
+ timezone.__grains__['os_family'] = ['Suse']
+ assert timezone.set_zone(self.TEST_TZ)
+ name, args, kwargs = timezone.__salt__['file.sed'].mock_calls[0]
+ assert args == ('/etc/sysconfig/clock', '^TIMEZONE=.*', 'TIMEZONE="UTC"')
+
+ @patch('salt.utils.which', MagicMock(return_value=False))
+ @patch('os.path.exists', MagicMock(return_value=True))
+ @patch('os.unlink', MagicMock())
+ @patch('os.symlink', MagicMock())
+ def test_set_zone_gentoo(self):
+ '''
+ Test zone set on Gentoo series
+ :return:
+ '''
+ timezone.__grains__['os_family'] = ['Gentoo']
+ _fopen = MagicMock(return_value=MagicMock(spec=file))
+ with patch('salt.utils.fopen', _fopen):
+ assert timezone.set_zone(self.TEST_TZ)
+ name, args, kwargs = _fopen.mock_calls[0]
+ assert args == ('/etc/timezone', 'w')
+ name, args, kwargs = _fopen.return_value.__enter__.return_value.write.mock_calls[0]
+ assert args == ('UTC',)
+
+ @patch('salt.utils.which', MagicMock(return_value=False))
+ @patch('os.path.exists', MagicMock(return_value=True))
+ @patch('os.unlink', MagicMock())
+ @patch('os.symlink', MagicMock())
+ def test_set_zone_debian(self):
+ '''
+ Test zone set on Debian series
+ :return:
+ '''
+ timezone.__grains__['os_family'] = ['Debian']
+ _fopen = MagicMock(return_value=MagicMock(spec=file))
+ with patch('salt.utils.fopen', _fopen):
+ assert timezone.set_zone(self.TEST_TZ)
+ name, args, kwargs = _fopen.mock_calls[0]
+ assert args == ('/etc/timezone', 'w')
+ name, args, kwargs = _fopen.return_value.__enter__.return_value.write.mock_calls[0]
+ assert args == ('UTC',)
+
+ @patch('salt.utils.which', MagicMock(return_value=True))
+ @patch('os.path.exists', MagicMock(return_value=True))
+ @patch('os.unlink', MagicMock())
+ @patch('os.symlink', MagicMock())
+ def test_get_hwclock_timedate_utc(self):
+ '''
+ Test get hwclock UTC/localtime
+ :return:
+ '''
+ with patch('salt.modules.timezone._timedatectl', MagicMock(return_value={'stdout': 'rtc in local tz'})):
+ assert timezone.get_hwclock() == 'UTC'
+ with patch('salt.modules.timezone._timedatectl', MagicMock(return_value={'stdout': 'rtc in local tz:yes'})):
+ assert timezone.get_hwclock() == 'localtime'
+
+ @patch('salt.utils.which', MagicMock(return_value=False))
+ @patch('os.path.exists', MagicMock(return_value=True))
+ @patch('os.unlink', MagicMock())
+ @patch('os.symlink', MagicMock())
+ def test_get_hwclock_suse(self):
+ '''
+ Test get hwclock on SUSE
+ :return:
+ '''
+ timezone.__grains__['os_family'] = ['Suse']
+ timezone.get_hwclock()
+ name, args, kwarg = timezone.__salt__['cmd.run'].mock_calls[0]
+ assert args == (['tail', '-n', '1', '/etc/adjtime'],)
+ assert kwarg == {'python_shell': False}
+
+ @patch('salt.utils.which', MagicMock(return_value=False))
+ @patch('os.path.exists', MagicMock(return_value=True))
+ @patch('os.unlink', MagicMock())
+ @patch('os.symlink', MagicMock())
+ def test_get_hwclock_redhat(self):
+ '''
+ Test get hwclock on RedHat
+ :return:
+ '''
+ timezone.__grains__['os_family'] = ['RedHat']
+ timezone.get_hwclock()
+ name, args, kwarg = timezone.__salt__['cmd.run'].mock_calls[0]
+ assert args == (['tail', '-n', '1', '/etc/adjtime'],)
+ assert kwarg == {'python_shell': False}
+
+ def _test_get_hwclock_debian(self): # TODO: Enable this when testing environment is working properly
+ '''
+ Test get hwclock on Debian
+ :return:
+ '''
+ with patch('salt.utils.which', MagicMock(return_value=False)):
+ with patch('os.path.exists', MagicMock(return_value=True)):
+ with patch('os.unlink', MagicMock()):
+ with patch('os.symlink', MagicMock()):
+ timezone.__grains__['os_family'] = ['Debian']
+ timezone.get_hwclock()
+ name, args, kwarg = timezone.__salt__['cmd.run'].mock_calls[0]
+ assert args == (['tail', '-n', '1', '/etc/adjtime'],)
+ assert kwarg == {'python_shell': False}
+
+ @patch('salt.utils.which', MagicMock(return_value=False))
+ @patch('os.path.exists', MagicMock(return_value=True))
+ @patch('os.unlink', MagicMock())
+ @patch('os.symlink', MagicMock())
+ def test_get_hwclock_solaris(self):
+ '''
+ Test get hwclock on Solaris
+ :return:
+ '''
+ # Incomplete
+ timezone.__grains__['os_family'] = ['Solaris']
+ assert timezone.get_hwclock() == 'UTC'
+ _fopen = MagicMock(return_value=MagicMock(spec=file))
+ with patch('salt.utils.fopen', _fopen):
+ assert timezone.get_hwclock() == 'localtime'
+
+ @patch('salt.utils.which', MagicMock(return_value=False))
+ @patch('os.path.exists', MagicMock(return_value=True))
+ @patch('os.unlink', MagicMock())
+ @patch('os.symlink', MagicMock())
+ def test_get_hwclock_aix(self):
+ '''
+ Test get hwclock on AIX
+ :return:
+ '''
+ # Incomplete
+ timezone.__grains__['os_family'] = ['AIX']
+ assert timezone.get_hwclock() == 'localtime'
+
+ @patch('salt.utils.which', MagicMock(return_value=False))
+ @patch('os.path.exists', MagicMock(return_value=True))
+ @patch('os.unlink', MagicMock())
+ @patch('os.symlink', MagicMock())
+ def test_set_hwclock_aix(self):
+ '''
+ Test set hwclock on AIX
+ :return:
+ '''
+ timezone.__grains__['os_family'] = ['AIX']
+ with self.assertRaises(SaltInvocationError):
+ assert timezone.set_hwclock('forty two')
+ assert timezone.set_hwclock('UTC')
+
+ @patch('salt.utils.which', MagicMock(return_value=False))
+ @patch('os.path.exists', MagicMock(return_value=True))
+ @patch('os.unlink', MagicMock())
+ @patch('os.symlink', MagicMock())
+ @patch('salt.modules.timezone.get_zone', MagicMock(return_value='TEST_TIMEZONE'))
+ def test_set_hwclock_solaris(self):
+ '''
+ Test set hwclock on Solaris
+ :return:
+ '''
+ timezone.__grains__['os_family'] = ['Solaris']
+ timezone.__grains__['cpuarch'] = 'x86'
+
+ with self.assertRaises(SaltInvocationError):
+ assert timezone.set_hwclock('forty two')
+ assert timezone.set_hwclock('UTC')
+ name, args, kwargs = timezone.__salt__['cmd.retcode'].mock_calls[0]
+ assert args == (['rtc', '-z', 'GMT'],)
+ assert kwargs == {'python_shell': False}
+
+ @patch('salt.utils.which', MagicMock(return_value=False))
+ @patch('os.path.exists', MagicMock(return_value=True))
+ @patch('os.unlink', MagicMock())
+ @patch('os.symlink', MagicMock())
+ @patch('salt.modules.timezone.get_zone', MagicMock(return_value='TEST_TIMEZONE'))
+ def test_set_hwclock_arch(self):
+ '''
+ Test set hwclock on arch
+ :return:
+ '''
+ timezone.__grains__['os_family'] = ['Arch']
+
+ assert timezone.set_hwclock('UTC')
+ name, args, kwargs = timezone.__salt__['cmd.retcode'].mock_calls[0]
+ assert args == (['timezonectl', 'set-local-rtc', 'false'],)
+ assert kwargs == {'python_shell': False}
+
+ @patch('salt.utils.which', MagicMock(return_value=False))
+ @patch('os.path.exists', MagicMock(return_value=True))
+ @patch('os.unlink', MagicMock())
+ @patch('os.symlink', MagicMock())
+ @patch('salt.modules.timezone.get_zone', MagicMock(return_value='TEST_TIMEZONE'))
+ def test_set_hwclock_redhat(self):
+ '''
+ Test set hwclock on RedHat
+ :return:
+ '''
+ timezone.__grains__['os_family'] = ['RedHat']
+
+ assert timezone.set_hwclock('UTC')
+ name, args, kwargs = timezone.__salt__['file.sed'].mock_calls[0]
+ assert args == ('/etc/sysconfig/clock', '^ZONE=.*', 'ZONE="TEST_TIMEZONE"')
+
+ @patch('salt.utils.which', MagicMock(return_value=False))
+ @patch('os.path.exists', MagicMock(return_value=True))
+ @patch('os.unlink', MagicMock())
+ @patch('os.symlink', MagicMock())
+ @patch('salt.modules.timezone.get_zone', MagicMock(return_value='TEST_TIMEZONE'))
+ def test_set_hwclock_suse(self):
+ '''
+ Test set hwclock on SUSE
+ :return:
+ '''
+ timezone.__grains__['os_family'] = ['Suse']
+
+ assert timezone.set_hwclock('UTC')
+ name, args, kwargs = timezone.__salt__['file.sed'].mock_calls[0]
+ assert args == ('/etc/sysconfig/clock', '^TIMEZONE=.*', 'TIMEZONE="TEST_TIMEZONE"')
+
+ @patch('salt.utils.which', MagicMock(return_value=False))
+ @patch('os.path.exists', MagicMock(return_value=True))
+ @patch('os.unlink', MagicMock())
+ @patch('os.symlink', MagicMock())
+ @patch('salt.modules.timezone.get_zone', MagicMock(return_value='TEST_TIMEZONE'))
+ def test_set_hwclock_debian(self):
+ '''
+ Test set hwclock on Debian
+ :return:
+ '''
+ timezone.__grains__['os_family'] = ['Debian']
+
+ assert timezone.set_hwclock('UTC')
+ name, args, kwargs = timezone.__salt__['file.sed'].mock_calls[0]
+ assert args == ('/etc/default/rcS', '^UTC=.*', 'UTC=yes')
+
+ assert timezone.set_hwclock('localtime')
+ name, args, kwargs = timezone.__salt__['file.sed'].mock_calls[1]
+ assert args == ('/etc/default/rcS', '^UTC=.*', 'UTC=no')
+
+ @patch('salt.utils.which', MagicMock(return_value=False))
+ @patch('os.path.exists', MagicMock(return_value=True))
+ @patch('os.unlink', MagicMock())
+ @patch('os.symlink', MagicMock())
+ @patch('salt.modules.timezone.get_zone', MagicMock(return_value='TEST_TIMEZONE'))
+ def test_set_hwclock_gentoo(self):
+ '''
+ Test set hwclock on Gentoo
+ :return:
+ '''
+ timezone.__grains__['os_family'] = ['Gentoo']
+
+ with self.assertRaises(SaltInvocationError):
+ timezone.set_hwclock('forty two')
+
+ timezone.set_hwclock('UTC')
+ name, args, kwargs = timezone.__salt__['file.sed'].mock_calls[0]
+ assert args == ('/etc/conf.d/hwclock', '^clock=.*', 'clock="UTC"')
+
+ timezone.set_hwclock('localtime')
+ name, args, kwargs = timezone.__salt__['file.sed'].mock_calls[1]
+ assert args == ('/etc/conf.d/hwclock', '^clock=.*', 'clock="local"')
--
2.13.0