2016-02-22 22:35:53 +00:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
'''
|
|
|
|
:codeauthor: :email:`Erik Johnson <erik@saltstack.com>`
|
|
|
|
'''
|
|
|
|
|
|
|
|
# Import Python libs
|
|
|
|
from __future__ import absolute_import
|
|
|
|
import os
|
|
|
|
import platform
|
|
|
|
|
|
|
|
# Import Salt Testing Libs
|
|
|
|
from salttesting import TestCase, skipIf
|
|
|
|
from salttesting.helpers import ensure_in_syspath
|
|
|
|
from salttesting.mock import (
|
|
|
|
MagicMock,
|
|
|
|
patch,
|
|
|
|
NO_MOCK,
|
|
|
|
NO_MOCK_REASON
|
|
|
|
)
|
|
|
|
|
|
|
|
ensure_in_syspath('../../')
|
|
|
|
|
|
|
|
# Import Salt Libs
|
|
|
|
import salt.utils
|
|
|
|
from salt.grains import core
|
|
|
|
|
|
|
|
# Globals
|
|
|
|
core.__salt__ = {}
|
|
|
|
|
|
|
|
|
|
|
|
@skipIf(NO_MOCK, NO_MOCK_REASON)
|
|
|
|
class CoreGrainsTestCase(TestCase):
|
|
|
|
'''
|
|
|
|
Test cases for core grains
|
|
|
|
'''
|
|
|
|
@skipIf(not salt.utils.is_linux(), 'System is not Linux')
|
|
|
|
def test_gnu_slash_linux_in_os_name(self):
|
|
|
|
'''
|
|
|
|
Test to return a list of all enabled services
|
|
|
|
'''
|
|
|
|
_path_exists_map = {
|
|
|
|
'/proc/1/cmdline': False
|
|
|
|
}
|
|
|
|
_path_isfile_map = {}
|
|
|
|
_cmd_run_map = {
|
|
|
|
'dpkg --print-architecture': 'amd64'
|
|
|
|
}
|
|
|
|
|
|
|
|
path_exists_mock = MagicMock(side_effect=lambda x: _path_exists_map[x])
|
|
|
|
path_isfile_mock = MagicMock(
|
|
|
|
side_effect=lambda x: _path_isfile_map.get(x, False)
|
|
|
|
)
|
|
|
|
cmd_run_mock = MagicMock(
|
|
|
|
side_effect=lambda x: _cmd_run_map[x]
|
|
|
|
)
|
|
|
|
empty_mock = MagicMock(return_value={})
|
|
|
|
|
|
|
|
orig_import = __import__
|
|
|
|
|
|
|
|
def _import_mock(name, *args):
|
|
|
|
if name == 'lsb_release':
|
|
|
|
raise ImportError('No module named lsb_release')
|
|
|
|
return orig_import(name, *args)
|
|
|
|
|
|
|
|
# Skip the first if statement
|
|
|
|
with patch.object(salt.utils, 'is_proxy',
|
|
|
|
MagicMock(return_value=False)):
|
|
|
|
# Skip the selinux/systemd stuff (not pertinent)
|
|
|
|
with patch.object(core, '_linux_bin_exists',
|
|
|
|
MagicMock(return_value=False)):
|
|
|
|
# Skip the init grain compilation (not pertinent)
|
|
|
|
with patch.object(os.path, 'exists', path_exists_mock):
|
|
|
|
# Ensure that lsb_release fails to import
|
|
|
|
with patch('__builtin__.__import__',
|
|
|
|
side_effect=_import_mock):
|
|
|
|
# Skip all the /etc/*-release stuff (not pertinent)
|
|
|
|
with patch.object(os.path, 'isfile', path_isfile_mock):
|
|
|
|
# Mock platform.linux_distribution to give us the
|
|
|
|
# OS name that we want.
|
|
|
|
distro_mock = MagicMock(
|
|
|
|
return_value=('Debian GNU/Linux', '8.3', '')
|
|
|
|
)
|
|
|
|
with patch.object(
|
|
|
|
platform,
|
|
|
|
'linux_distribution',
|
|
|
|
distro_mock):
|
|
|
|
# Make a bunch of functions return empty dicts,
|
|
|
|
# we don't care about these grains for the
|
|
|
|
# purposes of this test.
|
|
|
|
with patch.object(
|
|
|
|
core,
|
|
|
|
'_linux_cpudata',
|
|
|
|
empty_mock):
|
|
|
|
with patch.object(
|
|
|
|
core,
|
|
|
|
'_linux_gpu_data',
|
|
|
|
empty_mock):
|
|
|
|
with patch.object(
|
|
|
|
core,
|
|
|
|
'_memdata',
|
|
|
|
empty_mock):
|
|
|
|
with patch.object(
|
|
|
|
core,
|
|
|
|
'_hw_data',
|
|
|
|
empty_mock):
|
|
|
|
with patch.object(
|
|
|
|
core,
|
|
|
|
'_virtual',
|
|
|
|
empty_mock):
|
|
|
|
with patch.object(
|
|
|
|
core,
|
|
|
|
'_ps',
|
|
|
|
empty_mock):
|
|
|
|
# Mock the osarch
|
|
|
|
with patch.dict(
|
|
|
|
core.__salt__,
|
|
|
|
{'cmd.run': cmd_run_mock}):
|
|
|
|
os_grains = core.os_data()
|
|
|
|
|
|
|
|
self.assertEqual(os_grains.get('os_family'), 'Debian')
|
|
|
|
|
2016-06-09 14:09:00 +00:00
|
|
|
@skipIf(not salt.utils.is_linux(), 'System is not Linux')
|
|
|
|
def test_suse_os_from_cpe_data(self):
|
|
|
|
'''
|
|
|
|
Test if 'os' grain is parsed from CPE_NAME of /etc/os-release
|
|
|
|
'''
|
|
|
|
_path_exists_map = {
|
|
|
|
'/proc/1/cmdline': False
|
|
|
|
}
|
|
|
|
_path_isfile_map = {
|
|
|
|
'/etc/os-release': True,
|
|
|
|
}
|
|
|
|
|
|
|
|
path_exists_mock = MagicMock(side_effect=lambda x: _path_exists_map[x])
|
|
|
|
path_isfile_mock = MagicMock(
|
|
|
|
side_effect=lambda x: _path_isfile_map.get(x, False)
|
|
|
|
)
|
|
|
|
empty_mock = MagicMock(return_value={})
|
|
|
|
|
|
|
|
orig_import = __import__
|
|
|
|
|
|
|
|
def _import_mock(name, *args):
|
|
|
|
if name == 'lsb_release':
|
|
|
|
raise ImportError('No module named lsb_release')
|
|
|
|
return orig_import(name, *args)
|
|
|
|
|
|
|
|
# Skip the first if statement
|
|
|
|
with patch.object(salt.utils, 'is_proxy',
|
|
|
|
MagicMock(return_value=False)):
|
|
|
|
# Skip the selinux/systemd stuff (not pertinent)
|
|
|
|
with patch.object(core, '_linux_bin_exists',
|
|
|
|
MagicMock(return_value=False)):
|
|
|
|
# Skip the init grain compilation (not pertinent)
|
|
|
|
with patch.object(os.path, 'exists', path_exists_mock):
|
|
|
|
# Ensure that lsb_release fails to import
|
|
|
|
with patch('__builtin__.__import__',
|
|
|
|
side_effect=_import_mock):
|
|
|
|
# Skip all the /etc/*-release stuff (not pertinent)
|
|
|
|
with patch.object(os.path, 'isfile', path_isfile_mock):
|
|
|
|
# Mock platform.linux_distribution to give us the
|
|
|
|
# OS name that we want.
|
|
|
|
distro_mock = MagicMock(
|
|
|
|
return_value=('SUSE Linux Enterprise Server ', '12', 'x86_64')
|
|
|
|
)
|
|
|
|
with patch.object(platform, 'linux_distribution', distro_mock):
|
|
|
|
with patch.object(core, '_linux_gpu_data', empty_mock):
|
|
|
|
with patch.object(core, '_virtual', empty_mock):
|
2016-06-10 07:51:14 +00:00
|
|
|
# Mock the osarch
|
|
|
|
with patch.dict(core.__salt__, {'cmd.run': "amd64"}):
|
|
|
|
os_grains = core.os_data()
|
2016-06-09 14:09:00 +00:00
|
|
|
|
|
|
|
self.assertEqual(os_grains.get('os_family'), 'SUSE')
|
|
|
|
self.assertEqual(os_grains.get('os'), 'SUSE')
|
|
|
|
|
|
|
|
|
2016-02-22 22:35:53 +00:00
|
|
|
if __name__ == '__main__':
|
|
|
|
from integration import run_tests
|
|
|
|
run_tests(CoreGrainsTestCase, needs_daemon=False)
|