# # Copyright (C) 2015 SUSE LINUX GmbH # Copyright (C) 2015 # # Author: Owen Synge # Author: Loic Dachary # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see ``. # import logging import mock import testtools import ceph_detect_init from ceph_detect_init import alpine from ceph_detect_init import arch from ceph_detect_init import centos from ceph_detect_init import debian from ceph_detect_init import exc from ceph_detect_init import fedora from ceph_detect_init import main from ceph_detect_init import rhel from ceph_detect_init import suse from ceph_detect_init import gentoo from ceph_detect_init import freebsd from ceph_detect_init import docker from ceph_detect_init import oraclevms logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', level=logging.DEBUG) class TestCephDetectInit(testtools.TestCase): def test_alpine(self): self.assertEqual('openrc', alpine.choose_init()) def test_arch(self): self.assertEqual('systemd', arch.choose_init()) def test_freebsd(self): self.assertEqual('bsdrc', freebsd.choose_init()) def test_docker(self): self.assertEqual('none', docker.choose_init()) def test_oraclevms(self): self.assertEqual('sysvinit', oraclevms.choose_init()) def test_centos(self): with mock.patch('ceph_detect_init.centos.release', '7.0'): self.assertEqual('systemd', centos.choose_init()) self.assertEqual('sysvinit', centos.choose_init()) def test_debian(self): with mock.patch.multiple('os.path', isdir=lambda x: x == '/run/systemd/system'): self.assertEqual('systemd', debian.choose_init()) def mock_call_with_upstart(*args, **kwargs): if args[0] == '. /lib/lsb/init-functions ; init_is_upstart' and \ kwargs['shell']: return 0 else: return 1 with mock.patch.multiple('os.path', isdir=lambda x: False, isfile=lambda x: False): with mock.patch.multiple('subprocess', call=mock_call_with_upstart): self.assertEqual('upstart', debian.choose_init()) with mock.patch.multiple('os.path', isdir=lambda x: False, isfile=lambda x: x == '/sbin/init', islink=lambda x: x != '/sbin/init'): with mock.patch.multiple('subprocess', call=lambda *args, **kwargs: 1): self.assertEqual('sysvinit', debian.choose_init()) with mock.patch.multiple('os.path', isdir=lambda x: False, isfile=lambda x: False): with mock.patch.multiple('subprocess', call=lambda *args, **kwargs: 1): self.assertIs(None, debian.choose_init()) def test_fedora(self): with mock.patch('ceph_detect_init.fedora.release', '22'): self.assertEqual('systemd', fedora.choose_init()) self.assertEqual('sysvinit', fedora.choose_init()) def test_rhel(self): with mock.patch('ceph_detect_init.rhel.release', '7.0'): self.assertEqual('systemd', rhel.choose_init()) self.assertEqual('sysvinit', rhel.choose_init()) def test_suse(self): with mock.patch('ceph_detect_init.suse.release', '11'): self.assertEqual('sysvinit', suse.choose_init()) with mock.patch('ceph_detect_init.suse.release', '12'): self.assertEqual('systemd', suse.choose_init()) with mock.patch('ceph_detect_init.suse.release', '13.1'): self.assertEqual('systemd', suse.choose_init()) with mock.patch('ceph_detect_init.suse.release', '13.2'): self.assertEqual('systemd', suse.choose_init()) def test_gentoo_is_openrc(self): with mock.patch('os.path.isdir', return_value=True): self.assertEqual(gentoo.is_openrc(), True) with mock.patch('os.path.isdir', return_value=False): self.assertEqual(gentoo.is_openrc(), False) def test_gentoo_is_systemd(self): import sys if sys.version_info >= (3, 0): mocked_fn = 'builtins.open' else: mocked_fn = '__builtin__.open' f = mock.mock_open(read_data='systemd') with mock.patch(mocked_fn, f, create=True) as m: self.assertEqual(gentoo.is_systemd(), True) m.assert_called_once_with('/proc/1/comm') f = mock.mock_open(read_data='init') with mock.patch(mocked_fn, f, create=True) as m: self.assertEqual(gentoo.is_systemd(), False) m.assert_called_once_with('/proc/1/comm') f = mock.mock_open(read_data='upstart') with mock.patch(mocked_fn, f, create=True) as m: self.assertEqual(gentoo.is_systemd(), False) m.assert_called_once_with('/proc/1/comm') def test_gentoo(self): with mock.patch.multiple('ceph_detect_init.gentoo', is_systemd=(lambda: True), is_openrc=(lambda: True)): self.assertEqual('openrc', gentoo.choose_init()) with mock.patch.multiple('ceph_detect_init.gentoo', is_systemd=(lambda: True), is_openrc=(lambda: False)): self.assertEqual('systemd', gentoo.choose_init()) with mock.patch.multiple('ceph_detect_init.gentoo', is_systemd=(lambda: False), is_openrc=(lambda: True)): self.assertEqual('openrc', gentoo.choose_init()) with mock.patch.multiple('ceph_detect_init.gentoo', is_systemd=(lambda: False), is_openrc=(lambda: False)): self.assertEqual('unknown', gentoo.choose_init()) def test_get(self): with mock.patch.multiple( 'platform', system=lambda: 'Linux', linux_distribution=lambda **kwargs: (('unknown', '', ''))): g = ceph_detect_init.get self.assertRaises(exc.UnsupportedPlatform, g) try: g() except exc.UnsupportedPlatform as e: self.assertIn('Platform is not supported', str(e)) with mock.patch.multiple( 'platform', system=lambda: 'Linux', linux_distribution=lambda **kwargs: (('debian', '6.0', ''))): distro = ceph_detect_init.get() self.assertEqual(debian, distro) self.assertEqual('debian', distro.name) self.assertEqual('debian', distro.normalized_name) self.assertEqual('debian', distro.distro) self.assertEqual(False, distro.is_el) self.assertEqual('6.0', distro.release) with mock.patch.multiple('platform', system=lambda: 'FreeBSD', release=lambda: '12.0-CURRENT', version=lambda: 'FreeBSD 12.0 #1 r306554M:'): distro = ceph_detect_init.get() self.assertEqual(freebsd, distro) self.assertEqual('freebsd', distro.name) self.assertEqual('freebsd', distro.normalized_name) self.assertEqual('freebsd', distro.distro) self.assertFalse(distro.is_el) self.assertEqual('12.0-CURRENT', distro.release) self.assertEqual('r306554M', distro.codename) self.assertEqual('bsdrc', distro.init) with mock.patch('platform.system', lambda: 'cephix'): self.assertRaises(exc.UnsupportedPlatform, ceph_detect_init.get) def test_get_distro(self): g = ceph_detect_init._get_distro self.assertEqual(None, g(None)) self.assertEqual(debian, g('debian')) self.assertEqual(debian, g('ubuntu')) self.assertEqual(centos, g('centos')) self.assertEqual(centos, g('scientific')) self.assertEqual(centos, g('Oracle Linux Server')) self.assertEqual(oraclevms, g('Oracle VM server')) self.assertEqual(fedora, g('fedora')) self.assertEqual(suse, g('suse')) self.assertEqual(rhel, g('redhat', use_rhceph=True)) self.assertEqual(gentoo, g('gentoo')) self.assertEqual(centos, g('virtuozzo')) def test_normalized_distro_name(self): n = ceph_detect_init._normalized_distro_name self.assertEqual('redhat', n('RedHat')) self.assertEqual('redhat', n('redhat')) self.assertEqual('redhat', n('Red Hat')) self.assertEqual('redhat', n('red hat')) self.assertEqual('scientific', n('scientific')) self.assertEqual('scientific', n('Scientific')) self.assertEqual('scientific', n('Scientific Linux')) self.assertEqual('scientific', n('scientific linux')) self.assertEqual('oraclel', n('Oracle Linux Server')) self.assertEqual('oraclevms', n('Oracle VM server')) self.assertEqual('suse', n('SUSE')) self.assertEqual('suse', n('suse')) self.assertEqual('suse', n('openSUSE')) self.assertEqual('suse', n('opensuse')) self.assertEqual('centos', n('CentOS')) self.assertEqual('centos', n('centos')) self.assertEqual('debian', n('Debian')) self.assertEqual('debian', n('debian')) self.assertEqual('ubuntu', n('Ubuntu')) self.assertEqual('ubuntu', n('ubuntu')) self.assertEqual('gentoo', n('Gentoo')) self.assertEqual('gentoo', n('gentoo')) self.assertEqual('gentoo', n('Funtoo')) self.assertEqual('gentoo', n('funtoo')) self.assertEqual('gentoo', n('Exherbo')) self.assertEqual('gentoo', n('exherbo')) self.assertEqual('virtuozzo', n('Virtuozzo Linux')) @mock.patch('platform.system', lambda: 'Linux') def test_platform_information_linux(self): with mock.patch('platform.linux_distribution', lambda **kwargs: (('debian', '8.0', ''))): self.assertEqual(('debian', '8.0'), ceph_detect_init.platform_information()[:-1]) with mock.patch('platform.linux_distribution', lambda **kwargs: (('Oracle Linux Server', '7.3', ''))): self.assertEqual(('Oracle Linux Server', '7.3', 'OL7.3'), ceph_detect_init.platform_information()) with mock.patch('platform.linux_distribution', lambda **kwargs: (('Oracle VM server', '3.4.2', ''))): self.assertEqual(('Oracle VM server', '3.4.2', 'OVS3.4.2'), ceph_detect_init.platform_information()) with mock.patch('platform.linux_distribution', lambda **kwargs: (('Virtuozzo Linux', '7.3', ''))): self.assertEqual(('Virtuozzo Linux', '7.3', 'virtuozzo'), ceph_detect_init.platform_information()) @mock.patch('platform.linux_distribution') def test_platform_information_container(self, mock_linux_dist): import sys if sys.version_info >= (3, 0): mocked_fn = 'builtins.open' else: mocked_fn = '__builtin__.open' with mock.patch(mocked_fn, mock.mock_open(read_data="""1:name=systemd:/system.slice \ /docker-39cc1fb.scope"""), create=True) as m: self.assertEqual(('docker', 'docker', 'docker'), ceph_detect_init.platform_information(),) m.assert_called_once_with('/proc/self/cgroup', 'r') with mock.patch(mocked_fn, mock.mock_open(), create=True) as m: m.side_effect = IOError() mock_linux_dist.return_value = ('Red Hat Enterprise Linux Server', '7.3', 'Maipo') # Just run the code to validate the code won't raise IOError ceph_detect_init.platform_information() with mock.patch('os.path.isfile', mock.MagicMock()) as m: m.return_value = True self.assertEqual(('docker', 'docker', 'docker'), ceph_detect_init.platform_information(),) m.assert_called_once_with('/.dockerenv') @mock.patch('platform.system', lambda: 'FreeBSD') def test_platform_information_freebsd(self): with mock.patch.multiple('platform', release=lambda: '12.0-CURRENT', version=lambda: 'FreeBSD 12.0 #1 r306554M:'): self.assertEqual(('freebsd', '12.0-CURRENT', 'r306554M'), ceph_detect_init.platform_information()) def test_run(self): argv = ['--use-rhceph', '--verbose'] self.assertEqual(0, main.run(argv)) with mock.patch.multiple( 'platform', system=lambda: 'Linux', linux_distribution=lambda **kwargs: (('unknown', '', ''))): self.assertRaises(exc.UnsupportedPlatform, main.run, argv) self.assertEqual(0, main.run(argv + ['--default=sysvinit'])) # Local Variables: # compile-command: "cd .. ; .tox/py27/bin/py.test tests/test_all.py" # End: