blob: 823b82e9cc89f7898413c014b5d8434fa6345dba [file] [log] [blame]
#!/usr/bin/env python
'''
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
'''
from unittest import TestCase
import logging
import unittest
import socket
import platform
from mock.mock import patch
from mock.mock import MagicMock
from mock.mock import create_autospec
import ambari_commons
from ambari_commons import OSCheck
import os
from only_for_platform import not_for_platform, os_distro_value, PLATFORM_WINDOWS
from ambari_commons.firewall import Firewall
from ambari_commons.os_check import OSCheck, OSConst
from ambari_agent.HostCheckReportFileHandler import HostCheckReportFileHandler
from ambari_agent.HostInfo import HostInfo, HostInfoLinux
from ambari_agent.Hardware import Hardware
from ambari_agent.AmbariConfig import AmbariConfig
from resource_management.core import shell
from resource_management.core.system import System
@not_for_platform(PLATFORM_WINDOWS)
@patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value))
class TestHostInfo:#(TestCase):
@patch('os.path.exists')
def test_checkFolders(self, path_mock):
path_mock.return_value = True
hostInfo = HostInfo()
results = []
existingUsers = [{'name':'a1', 'homeDir':os.path.join('home', 'a1')}, {'name':'b1', 'homeDir':os.path.join('home', 'b1')}]
hostInfo.checkFolders([os.path.join("etc", "conf"), os.path.join("var", "lib"), "home"], ["a1", "b1"], ["c","d"], existingUsers, results)
print results
self.assertEqual(6, len(results))
names = [i['name'] for i in results]
for item in [os.path.join('etc','conf','a1'), os.path.join('var','lib','a1'), os.path.join('etc','conf','b1'), os.path.join('var','lib','b1')]:
self.assertTrue(item in names)
def test_checkUsers(self):
hostInfo = HostInfoLinux()
results = []
hostInfo.checkUsers(["root", "zxlmnap12341234"], results)
self.assertEqual(1, len(results))
newlist = sorted(results, key=lambda k: k['name'])
self.assertTrue(newlist[0]['name'], "root")
self.assertTrue(newlist[0]['homeDir'], "/root")
self.assertTrue(newlist[0]['status'], "Available")
@patch.object(OSCheck, "get_os_type")
@patch('os.umask')
@patch.object(HostCheckReportFileHandler, 'writeHostCheckFile')
@patch("resource_management.core.providers.get_provider")
@patch.object(HostInfoLinux, 'checkUsers')
@patch.object(HostInfoLinux, 'checkLiveServices')
@patch.object(HostInfoLinux, 'javaProcs')
@patch.object(HostInfoLinux, 'checkFolders')
@patch.object(HostInfoLinux, 'etcAlternativesConf')
@patch.object(HostInfoLinux, 'hadoopVarRunCount')
@patch.object(HostInfoLinux, 'hadoopVarLogCount')
@patch.object(HostInfoLinux, 'checkFirewall')
@patch.object(HostInfoLinux, 'checkUnlimitedJce')
def test_hostinfo_register_suse(self, jce_mock, cit_mock, hvlc_mock, hvrc_mock, eac_mock, cf_mock, jp_mock,
cls_mock, cu_mock, get_packages_mock, whcf_mock, os_umask_mock, get_os_type_mock):
m = MagicMock()
m.get_package_details.return_value = ["pkg1", "pkg2"]
m.get_installed_pkgs_by_names.return_value = ["pkg2"]
m.get_installed_pkgs_by_repo.return_value = ["pkg1"]
get_packages_mock.return_value = m
cit_mock.return_value = True
hvlc_mock.return_value = 1
hvrc_mock.return_value = 1
get_os_type_mock.return_value = "suse"
hostInfo = HostInfoLinux()
dict = {}
hostInfo.register(dict, False, False)
self.assertTrue(cit_mock.called)
self.assertTrue(os_umask_mock.called)
self.assertTrue(whcf_mock.called)
self.assertTrue(jce_mock.called)
self.assertTrue('agentTimeStampAtReporting' in dict['hostHealth'])
@patch.object(OSCheck, "get_os_type")
@patch('os.umask')
@patch.object(HostCheckReportFileHandler, 'writeHostCheckFile')
@patch("resource_management.core.providers.get_provider")
@patch.object(HostInfoLinux, 'checkUsers')
@patch.object(HostInfoLinux, 'checkLiveServices')
@patch.object(HostInfoLinux, 'javaProcs')
@patch.object(HostInfoLinux, 'checkFolders')
@patch.object(HostInfoLinux, 'etcAlternativesConf')
@patch.object(HostInfoLinux, 'hadoopVarRunCount')
@patch.object(HostInfoLinux, 'hadoopVarLogCount')
@patch.object(HostInfoLinux, 'checkFirewall')
@patch.object(HostInfoLinux, 'getTransparentHugePage')
def test_hostinfo_register(self, get_transparentHuge_page_mock, cit_mock, hvlc_mock, hvrc_mock, eac_mock, cf_mock, jp_mock,
cls_mock, cu_mock, get_packages_mock, whcf_mock, os_umask_mock, get_os_type_mock):
m = MagicMock()
m.get_package_details.return_value = ["pkg1", "pkg2"]
m.get_installed_pkgs_by_names.return_value = ["pkg2"]
m.get_installed_pkgs_by_repo.return_value = ["pkg1"]
get_packages_mock.return_value = m
cit_mock.return_value = True
hvlc_mock.return_value = 1
hvrc_mock.return_value = 1
get_os_type_mock.return_value = "redhat"
hostInfo = HostInfoLinux()
dict = {}
hostInfo.register(dict, True, True)
self.verifyReturnedValues(dict)
hostInfo.register(dict, True, False)
self.verifyReturnedValues(dict)
hostInfo.register(dict, False, True)
self.verifyReturnedValues(dict)
self.assertTrue(os_umask_mock.call_count == 2)
cit_mock.reset_mock()
hostInfo = HostInfoLinux()
dict = {}
hostInfo.register(dict, False, False)
self.assertTrue(cit_mock.called)
self.assertEqual(1, cit_mock.call_count)
def verifyReturnedValues(self, dict):
hostInfo = HostInfoLinux()
self.assertEqual(dict['alternatives'], [])
self.assertEqual(dict['stackFoldersAndFiles'], [])
self.assertEqual(dict['existingUsers'], [])
self.assertTrue(dict['firewallRunning'])
self.assertEqual(dict['firewallName'], "iptables")
@patch("os.path.exists")
@patch("os.path.islink")
@patch("os.path.isdir")
@patch("os.path.isfile")
def test_dirType(self, os_path_isfile_mock, os_path_isdir_mock, os_path_islink_mock, os_path_exists_mock):
host = HostInfoLinux()
os_path_exists_mock.return_value = False
result = host.dirType("/home")
self.assertEquals(result, 'not_exist')
os_path_exists_mock.return_value = True
os_path_islink_mock.return_value = True
result = host.dirType("/home")
self.assertEquals(result, 'sym_link')
os_path_exists_mock.return_value = True
os_path_islink_mock.return_value = False
os_path_isdir_mock.return_value = True
result = host.dirType("/home")
self.assertEquals(result, 'directory')
os_path_exists_mock.return_value = True
os_path_islink_mock.return_value = False
os_path_isdir_mock.return_value = False
os_path_isfile_mock.return_value = True
result = host.dirType("/home")
self.assertEquals(result, 'file')
os_path_exists_mock.return_value = True
os_path_islink_mock.return_value = False
os_path_isdir_mock.return_value = False
os_path_isfile_mock.return_value = False
result = host.dirType("/home")
self.assertEquals(result, 'unknown')
@patch("os.path.exists")
@patch("glob.glob")
def test_hadoopVarRunCount(self, glob_glob_mock, os_path_exists_mock):
hostInfo = HostInfoLinux()
os_path_exists_mock.return_value = True
glob_glob_mock.return_value = ['pid1','pid2','pid3']
result = hostInfo.hadoopVarRunCount()
self.assertEquals(result, 3)
os_path_exists_mock.return_value = False
result = hostInfo.hadoopVarRunCount()
self.assertEquals(result, 0)
@patch("os.path.exists")
@patch("glob.glob")
def test_hadoopVarLogCount(self, glob_glob_mock, os_path_exists_mock):
hostInfo = HostInfoLinux()
os_path_exists_mock.return_value = True
glob_glob_mock.return_value = ['log1','log2']
result = hostInfo.hadoopVarLogCount()
self.assertEquals(result, 2)
os_path_exists_mock.return_value = False
result = hostInfo.hadoopVarLogCount()
self.assertEquals(result, 0)
@patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = ('redhat','11','Final')))
@patch("os.listdir", create=True, autospec=True)
@patch("__builtin__.open", create=True, autospec=True)
@patch("pwd.getpwuid", create=True, autospec=True)
def test_javaProcs(self, pwd_getpwuid_mock, buitin_open_mock, os_listdir_mock):
hostInfo = HostInfoLinux()
openRead = MagicMock()
openRead.read.return_value = '/java/;/hadoop/'
buitin_open_mock.side_effect = [openRead, ['Uid: 22']]
pwuid = MagicMock()
pwd_getpwuid_mock.return_value = pwuid
pwuid.pw_name = 'user'
os_listdir_mock.return_value = ['1']
list = []
hostInfo.javaProcs(list)
self.assertEquals(list[0]['command'], '/java/;/hadoop/')
self.assertEquals(list[0]['pid'], 1)
self.assertTrue(list[0]['hadoop'])
self.assertEquals(list[0]['user'], 'user')
@patch.object(OSCheck, "get_os_type")
@patch("resource_management.core.shell.call")
def test_checkLiveServices(self, shell_call, get_os_type_method):
get_os_type_method.return_value = 'redhat'
hostInfo = HostInfoLinux()
shell_call.return_value = (0, '', 'err')
result = []
hostInfo.checkLiveServices([('service1',)], result)
self.assertEquals(result[0]['desc'], '')
self.assertEquals(result[0]['status'], 'Healthy')
self.assertEquals(result[0]['name'], 'service1')
shell_call.return_value = (1, 'out', 'err')
result = []
hostInfo.checkLiveServices([('service1',)], result)
self.assertEquals(result[0]['status'], 'Unhealthy')
self.assertEquals(result[0]['name'], 'service1')
self.assertEquals(result[0]['desc'], 'out')
shell_call.return_value = (1, '', 'err')
result = []
hostInfo.checkLiveServices([('service1',)], result)
self.assertEquals(result[0]['status'], 'Unhealthy')
self.assertEquals(result[0]['name'], 'service1')
self.assertEquals(result[0]['desc'], 'err')
shell_call.return_value = (1, '', 'err')
result = []
hostInfo.checkLiveServices([('service1',)], result)
self.assertEquals(result[0]['status'], 'Unhealthy')
self.assertEquals(result[0]['name'], 'service1')
self.assertTrue(len(result[0]['desc']) > 0)
shell_call.return_value = (0, '', 'err')
result = []
hostInfo.checkLiveServices([('service1', 'service2',)], result)
self.assertEquals(result[0]['status'], 'Healthy')
self.assertEquals(result[0]['name'], 'service1 or service2')
self.assertEquals(result[0]['desc'], '')
shell_call.return_value = (1, 'out', 'err')
result = []
hostInfo.checkLiveServices([('service1', 'service2',)], result)
self.assertEquals(result[0]['status'], 'Unhealthy')
self.assertEquals(result[0]['name'], 'service1 or service2')
self.assertEquals(result[0]['desc'], 'out{0}out'.format(os.linesep))
msg = 'thrown by shell call'
shell_call.side_effect = Exception(msg)
result = []
hostInfo.checkLiveServices([('service1',)], result)
self.assertEquals(result[0]['status'], 'Unhealthy')
self.assertEquals(result[0]['name'], 'service1')
self.assertEquals(result[0]['desc'], msg)
@patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = ('redhat','11','Final')))
@patch("os.path.exists")
@patch("os.listdir", create=True, autospec=True)
@patch("os.path.islink")
@patch("os.path.realpath")
def test_etcAlternativesConf(self, os_path_realpath_mock, os_path_islink_mock, os_listdir_mock, os_path_exists_mock):
hostInfo = HostInfoLinux()
os_path_exists_mock.return_value = False
result = hostInfo.etcAlternativesConf('',[])
self.assertEquals(result, [])
os_path_exists_mock.return_value = True
os_listdir_mock.return_value = ['config1']
os_path_islink_mock.return_value = True
os_path_realpath_mock.return_value = 'real_path_to_conf'
result = []
hostInfo.etcAlternativesConf('project', result)
self.assertEquals(result[0]['name'], 'config1')
self.assertEquals(result[0]['target'], 'real_path_to_conf')
@patch.object(OSCheck, "get_os_family")
@patch.object(OSCheck, "get_os_type")
@patch.object(OSCheck, "get_os_major_version")
@patch("resource_management.core.shell.call")
def test_FirewallRunning(self, run_os_command_mock, get_os_major_version_mock, get_os_type_mock, get_os_family_mock):
get_os_type_mock.return_value = ""
get_os_family_mock.return_value = OSConst.REDHAT_FAMILY
run_os_command_mock.return_value = 0, "Table: filter", ""
self.assertTrue(Firewall().getFirewallObject().check_firewall())
@patch.object(socket, "getfqdn")
@patch.object(socket, "gethostbyname")
@patch.object(socket, "gethostname")
def test_checkReverseLookup(self, gethostname_mock, gethostbyname_mock, getfqdn_mock):
gethostname_mock.return_value = "test"
gethostbyname_mock.side_effect = ["123.123.123.123", "123.123.123.123"]
getfqdn_mock.return_value = "test.example.com"
hostInfo = HostInfoLinux()
self.assertTrue(hostInfo.checkReverseLookup())
gethostbyname_mock.assert_any_call("test.example.com")
gethostbyname_mock.assert_any_call("test")
self.assertEqual(2, gethostbyname_mock.call_count)
gethostbyname_mock.side_effect = ["123.123.123.123", "231.231.231.231"]
self.assertFalse(hostInfo.checkReverseLookup())
gethostbyname_mock.side_effect = ["123.123.123.123", "123.123.123.123"]
getfqdn_mock.side_effect = socket.error()
self.assertFalse(hostInfo.checkReverseLookup())
@patch.object(OSCheck, "get_os_family")
@patch.object(OSCheck, "get_os_type")
@patch.object(OSCheck, "get_os_major_version")
@patch("resource_management.core.shell.call")
def test_FirewallStopped(self, run_os_command_mock, get_os_major_version_mock, get_os_type_mock, get_os_family_mock):
get_os_type_mock.return_value = ""
get_os_family_mock.return_value = OSConst.REDHAT_FAMILY
run_os_command_mock.return_value = 3, "", ""
self.assertFalse(Firewall().getFirewallObject().check_firewall())
@patch.object(OSCheck, "get_os_family")
@patch("os.path.isfile")
@patch('__builtin__.open')
def test_transparent_huge_page(self, open_mock, os_path_isfile_mock, get_os_family_mock):
context_manager_mock = MagicMock()
open_mock.return_value = context_manager_mock
get_os_family_mock.return_value = OSConst.REDHAT_FAMILY
file_mock = MagicMock()
file_mock.read.return_value = "[never] always"
enter_mock = MagicMock()
enter_mock.return_value = file_mock
exit_mock = MagicMock()
setattr( context_manager_mock, '__enter__', enter_mock )
setattr( context_manager_mock, '__exit__', exit_mock )
hostInfo = HostInfoLinux()
os_path_isfile_mock.return_value = True
self.assertEqual("never", hostInfo.getTransparentHugePage())
os_path_isfile_mock.return_value = False
self.assertEqual("", hostInfo.getTransparentHugePage())
@patch.object(OSCheck, "get_os_family")
@patch("os.path.isfile")
@patch('__builtin__.open')
def test_transparent_huge_page_debian(self, open_mock, os_path_isfile_mock, get_os_family_mock):
context_manager_mock = MagicMock()
open_mock.return_value = context_manager_mock
get_os_family_mock.return_value = OSConst.UBUNTU_FAMILY
file_mock = MagicMock()
file_mock.read.return_value = "[never] always"
enter_mock = MagicMock()
enter_mock.return_value = file_mock
exit_mock = MagicMock()
setattr( context_manager_mock, '__enter__', enter_mock )
setattr( context_manager_mock, '__exit__', exit_mock )
hostInfo = HostInfoLinux()
os_path_isfile_mock.return_value = True
self.assertEqual("never", hostInfo.getTransparentHugePage())
os_path_isfile_mock.return_value = False
self.assertEqual("", hostInfo.getTransparentHugePage())
if __name__ == "__main__":
unittest.main()