TestAmbaryServer.py 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275
  1. '''
  2. Licensed to the Apache Software Foundation (ASF) under one
  3. or more contributor license agreements. See the NOTICE file
  4. distributed with this work for additional information
  5. regarding copyright ownership. The ASF licenses this file
  6. to you under the Apache License, Version 2.0 (the
  7. "License"); you may not use this file except in compliance
  8. with the License. You may obtain a copy of the License at
  9. http://www.apache.org/licenses/LICENSE-2.0
  10. Unless required by applicable law or agreed to in writing, software
  11. distributed under the License is distributed on an "AS IS" BASIS,
  12. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. See the License for the specific language governing permissions and
  14. limitations under the License.
  15. '''
  16. import StringIO
  17. from unittest import TestCase
  18. import sys
  19. from mock.mock import patch
  20. from mock.mock import MagicMock
  21. from mock.mock import create_autospec
  22. import os, errno, tempfile
  23. import signal
  24. import stat
  25. # We have to use this import HACK because the filename contains a dash
  26. ambari_server = __import__('ambari-server')
  27. class TestAmbariServer(TestCase):
  28. @patch.object(ambari_server, 'configure_database_username_password')
  29. @patch.object(ambari_server, 'run_os_command')
  30. @patch('optparse.Values')
  31. def test_configure_pg_hba_ambaridb_users(self, OptParseValuesMock,
  32. run_os_command_method,
  33. configure_database_username_password_method):
  34. # Prepare mocks
  35. run_os_command_method.return_value = (0, "", "")
  36. opvm = OptParseValuesMock.return_value
  37. opvm.database_username = "ffdf"
  38. tf1 = tempfile.NamedTemporaryFile()
  39. ambari_server.PG_HBA_CONF_FILE = tf1.name
  40. # Run test
  41. ambari_server.configure_pg_hba_ambaridb_users()
  42. # Check results
  43. self.assertTrue(run_os_command_method.called)
  44. self.assertTrue(configure_database_username_password_method.called)
  45. string_expected = self.get_file_string(self
  46. .get_samples_dir("configure_pg_hba_ambaridb_users1"))
  47. string_actual = self.get_file_string(ambari_server.PG_HBA_CONF_FILE)
  48. self.assertEquals(string_expected, string_actual)
  49. pass
  50. def test_configure_pg_hba_postgres_user(self):
  51. tf1 = tempfile.NamedTemporaryFile()
  52. ambari_server.PG_HBA_CONF_FILE = tf1.name
  53. with open(ambari_server.PG_HBA_CONF_FILE, 'w') as fout:
  54. fout.write("\n")
  55. fout.write("local all all md5\n")
  56. fout.write("host all all 0.0.0.0/0 md5\n")
  57. fout.write("host all all ::/0 md5\n")
  58. ambari_server.configure_pg_hba_postgres_user()
  59. expected = self.get_file_string(self.get_samples_dir(
  60. "configure_pg_hba_ambaridb_users2"))
  61. result = self.get_file_string(ambari_server.PG_HBA_CONF_FILE)
  62. self.assertEqual(expected, result, "pg_hba_conf not processed")
  63. mode = oct(os.stat(ambari_server.PG_HBA_CONF_FILE)[stat.ST_MODE])
  64. str_mode = str(mode)[-4:]
  65. self.assertEqual("0644", str_mode, "Wrong file permissions")
  66. @patch('__builtin__.raw_input')
  67. def test_get_choice_string_input(self, raw_input_method):
  68. out = StringIO.StringIO()
  69. sys.stdout = out
  70. prompt = "blablabla"
  71. default = "default blablabla"
  72. firstChoice = set(['yes','ye', 'y'])
  73. secondChoice = set(['no','n'])
  74. # test first input
  75. raw_input_method.return_value = "Y"
  76. result = ambari_server.get_choice_string_input(prompt, default,
  77. firstChoice, secondChoice)
  78. self.assertEquals(result, True)
  79. raw_input_method.reset_mock()
  80. # test second input
  81. raw_input_method.return_value = "N"
  82. result = ambari_server.get_choice_string_input(prompt, default,
  83. firstChoice, secondChoice)
  84. self.assertEquals(result, False)
  85. raw_input_method.reset_mock()
  86. # test enter pressed
  87. raw_input_method.return_value = ""
  88. result = ambari_server.get_choice_string_input(prompt, default,
  89. firstChoice, secondChoice)
  90. self.assertEquals(result, default)
  91. raw_input_method.reset_mock()
  92. # test wrong input
  93. list_of_return_values= ['yes', 'dsad', 'fdsfds']
  94. def side_effect(list):
  95. return list_of_return_values.pop()
  96. raw_input_method.side_effect = side_effect
  97. result = ambari_server.get_choice_string_input(prompt, default,
  98. firstChoice, secondChoice)
  99. self.assertEquals(result, True)
  100. self.assertEquals(raw_input_method.call_count, 3)
  101. sys.stdout = sys.__stdout__
  102. pass
  103. @patch('re.search')
  104. @patch('__builtin__.raw_input')
  105. @patch('getpass.getpass')
  106. def test_get_validated_string_input(self, get_pass_method,
  107. raw_input_method, re_search_method):
  108. out = StringIO.StringIO()
  109. sys.stdout = out
  110. prompt = "blabla"
  111. default = "default_pass"
  112. pattern = "pattern_pp"
  113. description = "blabla2"
  114. # check password input
  115. is_pass = True
  116. get_pass_method.return_value = "dfdsfdsfds"
  117. result = ambari_server.get_validated_string_input(prompt, default,
  118. pattern, description, is_pass)
  119. self.assertEquals(get_pass_method.return_value, result)
  120. get_pass_method.assure_called_once(prompt)
  121. self.assertFalse(raw_input_method.called)
  122. # check raw input
  123. get_pass_method.reset_mock()
  124. raw_input_method.reset_mock()
  125. is_pass = False
  126. raw_input_method.return_value = "dkf90ewuf0"
  127. result = ambari_server.get_validated_string_input(prompt, default,
  128. pattern, description, is_pass)
  129. self.assertEquals(raw_input_method.return_value, result)
  130. self.assertFalse(get_pass_method.called)
  131. raw_input_method.assure_called_once(prompt)
  132. sys.stdout = sys.__stdout__
  133. def test_get_pass_file_path(self):
  134. result = ambari_server.get_pass_file_path("/etc/ambari/conf_file")
  135. self.assertEquals("/etc/ambari/password.dat", result)
  136. pass
  137. @patch.object(ambari_server, 'setup')
  138. @patch.object(ambari_server, 'start')
  139. @patch.object(ambari_server, 'stop')
  140. @patch.object(ambari_server, 'reset')
  141. @patch('optparse.OptionParser')
  142. def test_main_test_setup(self, OptionParserMock, reset_method, stop_method,
  143. start_method, setup_method):
  144. opm = OptionParserMock.return_value
  145. options = MagicMock()
  146. args = ["setup"]
  147. opm.parse_args.return_value = (options, args)
  148. options.database=None
  149. ambari_server.main()
  150. self.assertTrue(setup_method.called)
  151. self.assertFalse(start_method.called)
  152. self.assertFalse(stop_method.called)
  153. self.assertFalse(reset_method.called)
  154. self.assertFalse(False, ambari_server.VERBOSE)
  155. self.assertFalse(False, ambari_server.SILENT)
  156. @patch.object(ambari_server, 'setup')
  157. @patch.object(ambari_server, 'start')
  158. @patch.object(ambari_server, 'stop')
  159. @patch.object(ambari_server, 'reset')
  160. @patch('optparse.OptionParser')
  161. def test_main_test_start(self, OptionParserMock, reset_method, stop_method,
  162. start_method, setup_method):
  163. opm = OptionParserMock.return_value
  164. options = MagicMock()
  165. args = ["setup"]
  166. opm.parse_args.return_value = (options, args)
  167. options.database=None
  168. ambari_server.main()
  169. self.assertTrue(setup_method.called)
  170. self.assertFalse(start_method.called)
  171. self.assertFalse(stop_method.called)
  172. self.assertFalse(reset_method.called)
  173. self.assertFalse(False, ambari_server.VERBOSE)
  174. self.assertFalse(False, ambari_server.SILENT)
  175. @patch.object(ambari_server, 'setup')
  176. @patch.object(ambari_server, 'start')
  177. @patch.object(ambari_server, 'stop')
  178. @patch.object(ambari_server, 'reset')
  179. @patch('optparse.OptionParser')
  180. def test_main_test_start_debug_short(self, OptionParserMock, reset_method, stop_method,
  181. start_method, setup_method):
  182. opm = OptionParserMock.return_value
  183. options = MagicMock()
  184. args = ["start", "-g"]
  185. opm.parse_args.return_value = (options, args)
  186. options.database=None
  187. ambari_server.main()
  188. self.assertFalse(setup_method.called)
  189. self.assertTrue(start_method.called)
  190. self.assertFalse(stop_method.called)
  191. self.assertFalse(reset_method.called)
  192. self.assertTrue(ambari_server.SERVER_DEBUG_MODE)
  193. @patch.object(ambari_server, 'setup')
  194. @patch.object(ambari_server, 'start')
  195. @patch.object(ambari_server, 'stop')
  196. @patch.object(ambari_server, 'reset')
  197. @patch('optparse.OptionParser')
  198. def test_main_test_start_debug_long(self, OptionParserMock, reset_method, stop_method,
  199. start_method, setup_method):
  200. opm = OptionParserMock.return_value
  201. options = MagicMock()
  202. args = ["start", "--debug"]
  203. opm.parse_args.return_value = (options, args)
  204. options.database=None
  205. ambari_server.main()
  206. self.assertFalse(setup_method.called)
  207. self.assertTrue(start_method.called)
  208. self.assertFalse(stop_method.called)
  209. self.assertFalse(reset_method.called)
  210. self.assertTrue(ambari_server.SERVER_DEBUG_MODE)
  211. @patch.object(ambari_server, 'setup')
  212. @patch.object(ambari_server, 'start')
  213. @patch.object(ambari_server, 'stop')
  214. @patch.object(ambari_server, 'reset')
  215. @patch('optparse.OptionParser')
  216. def test_main_test_stop(self, OptionParserMock, reset_method, stop_method,
  217. start_method, setup_method):
  218. opm = OptionParserMock.return_value
  219. options = MagicMock()
  220. args = ["stop"]
  221. opm.parse_args.return_value = (options, args)
  222. options.database = None
  223. ambari_server.main()
  224. self.assertFalse(setup_method.called)
  225. self.assertFalse(start_method.called)
  226. self.assertTrue(stop_method.called)
  227. self.assertFalse(reset_method.called)
  228. self.assertFalse(False, ambari_server.VERBOSE)
  229. self.assertFalse(False, ambari_server.SILENT)
  230. @patch.object(ambari_server, 'setup')
  231. @patch.object(ambari_server, 'start')
  232. @patch.object(ambari_server, 'stop')
  233. @patch.object(ambari_server, 'reset')
  234. @patch('optparse.OptionParser')
  235. def test_main_test_reset(self, OptionParserMock, reset_method, stop_method,
  236. start_method, setup_method):
  237. opm = OptionParserMock.return_value
  238. options = MagicMock()
  239. args = ["reset"]
  240. opm.parse_args.return_value = (options, args)
  241. options.database=None
  242. ambari_server.main()
  243. self.assertFalse(setup_method.called)
  244. self.assertFalse(start_method.called)
  245. self.assertFalse(stop_method.called)
  246. self.assertTrue(reset_method.called)
  247. self.assertFalse(False, ambari_server.VERBOSE)
  248. self.assertFalse(False, ambari_server.SILENT)
  249. def test_configure_postgresql_conf(self):
  250. tf1 = tempfile.NamedTemporaryFile()
  251. ambari_server.POSTGRESQL_CONF_FILE = tf1.name
  252. with open(ambari_server.POSTGRESQL_CONF_FILE, 'w') as f:
  253. f.write("#listen_addresses = '127.0.0.1' #\n")
  254. f.write("#listen_addresses = '127.0.0.1'")
  255. ambari_server.configure_postgresql_conf()
  256. expected = self.get_file_string(self.get_samples_dir(
  257. "configure_postgresql_conf1"))
  258. result = self.get_file_string(ambari_server.POSTGRESQL_CONF_FILE)
  259. self.assertEqual(expected, result, "postgresql.conf not updated")
  260. mode = oct(os.stat(ambari_server.POSTGRESQL_CONF_FILE)[stat.ST_MODE])
  261. str_mode = str(mode)[-4:]
  262. self.assertEqual("0644", str_mode, "Wrong file permissions")
  263. @patch.object(ambari_server, "restart_postgres")
  264. @patch.object(ambari_server, "get_postgre_status")
  265. @patch.object(ambari_server, "configure_postgresql_conf")
  266. @patch.object(ambari_server, "configure_pg_hba_ambaridb_users")
  267. @patch.object(ambari_server, "configure_pg_hba_postgres_user")
  268. def test_configure_postgres(self, configure_pg_hba_postgres_user_mock,
  269. configure_pg_hba_ambaridb_users_mock,
  270. configure_postgresql_conf_mock,
  271. get_postgre_status_mock,
  272. restart_postgres_mock):
  273. tf1 = tempfile.NamedTemporaryFile()
  274. tf2 = tempfile.NamedTemporaryFile()
  275. ambari_server.PG_HBA_CONF_FILE = tf1.name
  276. ambari_server.PG_HBA_CONF_FILE_BACKUP = tf2.name
  277. args = MagicMock()
  278. out = StringIO.StringIO()
  279. sys.stdout = out
  280. rcode = ambari_server.configure_postgres()
  281. sys.stdout = sys.__stdout__
  282. self.assertEqual(0, rcode)
  283. self.assertEqual("Backup for pg_hba found, reconfiguration not required\n",
  284. out.getvalue())
  285. ambari_server.PG_HBA_CONF_FILE_BACKUP = tempfile.mktemp()
  286. get_postgre_status_mock.return_value = ambari_server.PG_STATUS_RUNNING
  287. restart_postgres_mock.return_value = 0
  288. rcode = ambari_server.configure_postgres()
  289. self.assertTrue(os.path.isfile(ambari_server.PG_HBA_CONF_FILE_BACKUP),
  290. "postgresql.conf backup not created")
  291. self.assertTrue(configure_pg_hba_postgres_user_mock.called)
  292. self.assertTrue(configure_pg_hba_ambaridb_users_mock.called)
  293. mode = oct(os.stat(ambari_server.PG_HBA_CONF_FILE)[stat.ST_MODE])
  294. str_mode = str(mode)[-4:]
  295. self.assertEqual("0644", str_mode, "Wrong file permissions")
  296. self.assertTrue(configure_postgresql_conf_mock.called)
  297. self.assertEqual(0, rcode)
  298. os.unlink(ambari_server.PG_HBA_CONF_FILE_BACKUP)
  299. get_postgre_status_mock.return_value = "stopped"
  300. rcode = ambari_server.configure_postgres()
  301. self.assertEqual(0, rcode)
  302. os.unlink(ambari_server.PG_HBA_CONF_FILE_BACKUP)
  303. sys.stdout = sys.__stdout__
  304. @patch("time.sleep")
  305. @patch("subprocess.Popen")
  306. @patch.object(ambari_server, "run_os_command")
  307. @patch.object(ambari_server, "get_postgre_status")
  308. @patch.object(ambari_server, "print_info_msg")
  309. def test_restart_postgres(self, printInfoMsg_mock, get_postgre_status_mock,
  310. run_os_command_mock, popenMock, sleepMock):
  311. out = StringIO.StringIO()
  312. sys.stdout = out
  313. p = MagicMock()
  314. p.poll.return_value = 0
  315. popenMock.return_value = p
  316. rcode = ambari_server.restart_postgres()
  317. self.assertEqual(0, rcode)
  318. p.poll.return_value = None
  319. get_postgre_status_mock.return_value = "stopped"
  320. run_os_command_mock.return_value = (1, None, None)
  321. rcode = ambari_server.restart_postgres()
  322. self.assertEqual(1, rcode)
  323. sys.stdout = sys.__stdout__
  324. @patch("shlex.split")
  325. @patch("subprocess.Popen")
  326. @patch.object(ambari_server, "print_info_msg")
  327. def test_run_os_command(self, printInfoMsg_mock, popenMock, splitMock):
  328. p = MagicMock()
  329. p.communicate.return_value = (None, None)
  330. p.returncode = 3
  331. popenMock.return_value = p
  332. # with list arg
  333. cmd = ["exec", "arg"]
  334. ambari_server.run_os_command(cmd)
  335. self.assertFalse(splitMock.called)
  336. # with str arg
  337. resp = ambari_server.run_os_command("runme")
  338. self.assertEqual(3, resp[0])
  339. self.assertTrue(splitMock.called)
  340. @patch.object(ambari_server, "get_conf_dir")
  341. @patch.object(ambari_server, "search_file")
  342. def test_write_property(self, search_file_mock, get_conf_dir_mock):
  343. expected_content = "key1=val1\n"
  344. tf1 = tempfile.NamedTemporaryFile()
  345. search_file_mock.return_value = tf1.name
  346. ambari_server.write_property("key1", "val1")
  347. result = tf1.read()
  348. self.assertEqual(expected_content, result)
  349. @patch.object(ambari_server, "configure_database_username_password")
  350. @patch.object(ambari_server, "run_os_command")
  351. def test_setup_db(self, run_os_command_mock,
  352. configure_database_username_password_mock):
  353. run_os_command_mock.return_value = (0, None, None)
  354. result = ambari_server.setup_db(MagicMock())
  355. self.assertTrue(configure_database_username_password_mock.called)
  356. self.assertEqual(0, result)
  357. @patch.object(ambari_server, "get_YN_input")
  358. @patch.object(ambari_server, "run_os_command")
  359. def test_check_selinux(self, run_os_command_mock, getYNInput_mock):
  360. out = StringIO.StringIO()
  361. sys.stdout = out
  362. run_os_command_mock.return_value = (0, ambari_server.SE_STATUS_DISABLED,
  363. None)
  364. rcode = ambari_server.check_selinux()
  365. self.assertEqual(0, rcode)
  366. getYNInput_mock.return_value = True
  367. run_os_command_mock.return_value = (0,"enabled "
  368. + ambari_server.SE_MODE_ENFORCING,
  369. None)
  370. rcode = ambari_server.check_selinux()
  371. self.assertEqual(0, rcode)
  372. self.assertTrue(run_os_command_mock.called)
  373. self.assertTrue(getYNInput_mock.called)
  374. sys.stdout = sys.__stdout__
  375. @patch.object(ambari_server, "print_info_msg")
  376. def test_get_ambari_jars(self, printInfoMsg_mock):
  377. env = "/ambari/jars"
  378. os.environ[ambari_server.AMBARI_SERVER_LIB] = env
  379. result = ambari_server.get_ambari_jars()
  380. self.assertEqual(env, result)
  381. del os.environ[ambari_server.AMBARI_SERVER_LIB]
  382. result = ambari_server.get_ambari_jars()
  383. self.assertEqual("/usr/lib/ambari-server", result)
  384. self.assertTrue(printInfoMsg_mock.called)
  385. @patch("glob.glob")
  386. @patch.object(ambari_server, "print_info_msg")
  387. def test_get_share_jars(self, printInfoMsg_mock, globMock):
  388. globMock.return_value = ["one", "two"]
  389. expected = "one:two:one:two"
  390. result = ambari_server.get_share_jars()
  391. self.assertEqual(expected, result)
  392. globMock.return_value = []
  393. expected = ""
  394. result = ambari_server.get_share_jars()
  395. self.assertEqual(expected, result)
  396. @patch("glob.glob")
  397. @patch.object(ambari_server, "print_info_msg")
  398. def test_get_ambari_classpath(self, printInfoMsg_mock, globMock):
  399. globMock.return_value = ["one"]
  400. result = ambari_server.get_ambari_classpath()
  401. print result
  402. self.assertTrue(ambari_server.get_ambari_jars() in result)
  403. self.assertTrue(ambari_server.get_share_jars() in result)
  404. globMock.return_value = []
  405. result = ambari_server.get_ambari_classpath()
  406. print result
  407. self.assertTrue(ambari_server.get_ambari_jars() in result)
  408. self.assertFalse(":" in result)
  409. @patch.object(ambari_server, "print_info_msg")
  410. def test_get_conf_dir(self, printInfoMsg_mock):
  411. env = "/ambari/conf"
  412. os.environ[ambari_server.AMBARI_CONF_VAR] = env
  413. result = ambari_server.get_conf_dir()
  414. self.assertEqual(env, result)
  415. del os.environ[ambari_server.AMBARI_CONF_VAR]
  416. result = ambari_server.get_conf_dir()
  417. self.assertEqual("/etc/ambari-server/conf", result)
  418. self.assertTrue(printInfoMsg_mock.called)
  419. def test_search_file(self):
  420. path = os.path.dirname(__file__)
  421. result = ambari_server.search_file(__file__, path)
  422. expected = os.path.abspath(__file__)
  423. self.assertEqual(expected, result)
  424. result = ambari_server.search_file("non_existent_file", path)
  425. self.assertEqual(None, result)
  426. @patch.object(ambari_server, "run_os_command")
  427. def test_check_iptables(self, run_os_command_mock):
  428. out = StringIO.StringIO()
  429. sys.stdout = out
  430. run_os_command_mock.return_value = (1, "test", "")
  431. rcode, info = ambari_server.check_iptables()
  432. self.assertEqual(1, rcode)
  433. self.assertEqual("test", info)
  434. run_os_command_mock.return_value = (2, "",
  435. ambari_server.IP_TBLS_SRVC_NT_FND)
  436. rcode = ambari_server.check_iptables()
  437. self.assertEqual(0, rcode)
  438. sys.stdout = sys.__stdout__
  439. def test_dlprogress(self):
  440. out = StringIO.StringIO()
  441. sys.stdout = out
  442. ambari_server.dlprogress("filename", 10, 2, 100)
  443. sys.stdout = sys.__stdout__
  444. self.assertNotEqual("", out.getvalue())
  445. @patch("urllib2.urlopen")
  446. @patch("__builtin__.open")
  447. @patch.object(ambari_server, "dlprogress")
  448. def test_track_jdk(self, dlprogress_mock, openMock, urlopenMock):
  449. u = MagicMock()
  450. u.info.return_value = {"Content-Length":"24576"}
  451. chunks = [None, "second", "first"]
  452. def side_effect(*args, **kwargs):
  453. return chunks.pop()
  454. u.read.side_effect = side_effect
  455. urlopenMock.return_value = u
  456. f = MagicMock()
  457. openMock.return_value = f
  458. ambari_server.track_jdk("base", "url", "local")
  459. self.assertEqual(0, len(chunks))
  460. self.assertTrue(f.write.called)
  461. self.assertTrue(f.flush.called)
  462. self.assertTrue(f.close.called)
  463. self.assertEqual(2, len(dlprogress_mock.call_args_list))
  464. @patch("os.stat")
  465. @patch("os.path.isfile")
  466. @patch("os.path.exists")
  467. @patch("__builtin__.open")
  468. @patch.object(ambari_server, "track_jdk")
  469. @patch.object(ambari_server, "get_YN_input")
  470. @patch.object(ambari_server, "run_os_command")
  471. @patch.object(ambari_server, "Properties")
  472. @patch.object(ambari_server, "write_property")
  473. @patch.object(ambari_server, "print_info_msg")
  474. @patch.object(ambari_server, "get_JAVA_HOME")
  475. @patch.object(ambari_server, "get_conf_dir")
  476. @patch.object(ambari_server, "search_file")
  477. def test_download_jdk(self, search_file_mock, get_conf_dir_mock,
  478. get_JAVA_HOME_mock, print_info_msg_mock,
  479. write_property_mock, Properties_mock,
  480. run_os_command_mock, get_YN_input_mock, track_jdk_mock,
  481. openMock, path_existsMock,
  482. path_isfileMock, statMock):
  483. out = StringIO.StringIO()
  484. sys.stdout = out
  485. args = MagicMock()
  486. args.java_home = "somewhere"
  487. search_file_mock.return_value = None
  488. rcode = ambari_server.download_jdk(args)
  489. self.assertEqual(-1, rcode)
  490. self.assertTrue(search_file_mock.called)
  491. self.assertTrue(get_conf_dir_mock.called)
  492. search_file_mock.return_value = "something"
  493. get_JAVA_HOME_mock.return_value = True
  494. path_existsMock.return_value = True
  495. rcode = ambari_server.download_jdk(args)
  496. self.assertEqual(0, rcode)
  497. get_JAVA_HOME_mock.return_value = False
  498. rcode = ambari_server.download_jdk(args)
  499. self.assertEqual(0, rcode)
  500. self.assertTrue(write_property_mock.called)
  501. p = MagicMock()
  502. Properties_mock.return_value = p
  503. openMock.side_effect = Exception("test exception")
  504. path_existsMock.return_value = False
  505. rcode = ambari_server.download_jdk(args)
  506. self.assertEqual(-1, rcode)
  507. openMock.side_effect = None
  508. p.__getitem__.side_effect = KeyError("test exception")
  509. rcode = ambari_server.download_jdk(args)
  510. self.assertEqual(-1, rcode)
  511. p.__getitem__.return_value = "somewhere"
  512. p.__getitem__.side_effect = None
  513. path_existsMock.return_value = False
  514. run_os_command_mock.return_value = (0, "Wrong out", None)
  515. rcode = ambari_server.download_jdk(args)
  516. self.assertEqual(-1, rcode)
  517. ambari_server.JDK_INSTALL_DIR = os.getcwd()
  518. get_YN_input_mock.return_value = True
  519. run_os_command_mock.return_value = (0, "Creating jdk-1.2/jre"
  520. "Content-Length: 32000\r\n"
  521. , None)
  522. statResult = MagicMock()
  523. statResult.st_size = 32000
  524. statMock.return_value = statResult
  525. rcode = ambari_server.download_jdk(args)
  526. self.assertEqual(0, rcode)
  527. sys.stdout = sys.__stdout__
  528. @patch.object(ambari_server, "run_os_command")
  529. def test_get_postgre_status(self, run_os_command_mock):
  530. run_os_command_mock.return_value = (1, "running", None)
  531. result = ambari_server.get_postgre_status()
  532. self.assertEqual("running", result)
  533. run_os_command_mock.return_value = (1, "wrong", None)
  534. result = ambari_server.get_postgre_status()
  535. self.assertEqual(None, result)
  536. @patch.object(ambari_server, "run_os_command")
  537. @patch.object(ambari_server, "get_postgre_status")
  538. def test_check_postgre_up(self, get_postgre_status_mock, run_os_command_mock):
  539. out = StringIO.StringIO()
  540. sys.stdout = out
  541. get_postgre_status_mock.return_value = ambari_server.PG_STATUS_RUNNING
  542. rcode = ambari_server.check_postgre_up()
  543. self.assertEqual(0, rcode)
  544. run_os_command_mock.return_value = (4, None, None)
  545. get_postgre_status_mock.return_value = None
  546. rcode = ambari_server.check_postgre_up()
  547. self.assertEqual(4, rcode)
  548. sys.stdout = sys.__stdout__
  549. @patch("platform.linux_distribution")
  550. @patch("platform.system")
  551. @patch("__builtin__.open")
  552. @patch.object(ambari_server, "Properties")
  553. @patch.object(ambari_server, "print_info_msg")
  554. @patch.object(ambari_server, "print_error_msg")
  555. @patch.object(ambari_server, "search_file")
  556. @patch.object(ambari_server, "get_conf_dir")
  557. def test_configure_os_settings(self, get_conf_dir_mock, search_file_mock,
  558. print_error_msg_mock, print_info_msg_mock,
  559. Properties_mock, openMock, systemMock,
  560. distMock):
  561. search_file_mock.return_value = None
  562. rcode = ambari_server.configure_os_settings()
  563. self.assertEqual(-1, rcode)
  564. search_file_mock.return_value = "something"
  565. p = MagicMock()
  566. Properties_mock.return_value = p
  567. openMock.side_effect = Exception("exception")
  568. rcode = ambari_server.configure_os_settings()
  569. self.assertEqual(-1, rcode)
  570. p.__getitem__.return_value = "something"
  571. openMock.side_effect = None
  572. rcode = ambari_server.configure_os_settings()
  573. self.assertEqual(0, rcode)
  574. p.__getitem__.return_value = ""
  575. systemMock.return_value = "NonLinux"
  576. rcode = ambari_server.configure_os_settings()
  577. self.assertEqual(-1, rcode)
  578. systemMock.return_value = "Linux"
  579. distMock.return_value = ("CentOS", "6.3", None)
  580. f = MagicMock()
  581. openMock.return_value = f
  582. rcode = ambari_server.configure_os_settings()
  583. self.assertEqual(0, rcode)
  584. @patch("__builtin__.open")
  585. @patch.object(ambari_server, "Properties")
  586. @patch.object(ambari_server, "search_file")
  587. @patch.object(ambari_server, "get_conf_dir")
  588. def test_get_JAVA_HOME(self, get_conf_dir_mock, search_file_mock,
  589. Properties_mock, openMock):
  590. out = StringIO.StringIO()
  591. sys.stdout = out
  592. openMock.side_effect = Exception("exception")
  593. result = ambari_server.get_JAVA_HOME()
  594. self.assertEqual(None, result)
  595. expected = os.path.dirname(__file__)
  596. p = MagicMock()
  597. p.__getitem__.return_value = expected
  598. openMock.side_effect = None
  599. Properties_mock.return_value = p
  600. result = ambari_server.get_JAVA_HOME()
  601. self.assertEqual(expected, result)
  602. sys.stdout = sys.__stdout__
  603. @patch("glob.glob")
  604. @patch.object(ambari_server, "get_JAVA_HOME")
  605. def test_find_jdk(self, get_JAVA_HOME_mock, globMock):
  606. out = StringIO.StringIO()
  607. sys.stdout = out
  608. get_JAVA_HOME_mock.return_value = "somewhere"
  609. result = ambari_server.find_jdk()
  610. self.assertEqual("somewhere", result)
  611. get_JAVA_HOME_mock.return_value = None
  612. globMock.return_value = []
  613. result = ambari_server.find_jdk()
  614. self.assertEqual(None, result)
  615. globMock.return_value = ["one", "two"]
  616. result = ambari_server.find_jdk()
  617. self.assertNotEqual(None, result)
  618. sys.stdout = sys.__stdout__
  619. @patch.object(ambari_server, "configure_os_settings")
  620. @patch.object(ambari_server, "download_jdk")
  621. @patch.object(ambari_server, "configure_postgres")
  622. @patch.object(ambari_server, "setup_db")
  623. @patch.object(ambari_server, "check_postgre_up")
  624. @patch.object(ambari_server, "check_iptables")
  625. @patch.object(ambari_server, "check_selinux")
  626. @patch.object(ambari_server, "setup_remote_db")
  627. @patch.object(ambari_server, "store_remote_properties")
  628. def test_setup(self, store_remote_properties_mock, setup_remote_db_mock, check_selinux_mock, check_iptables_mock,
  629. check_postgre_up_mock, setup_db_mock, configure_postgres_mock,
  630. download_jdk_mock, configure_os_settings_mock, ):
  631. out = StringIO.StringIO()
  632. sys.stdout = out
  633. args = MagicMock()
  634. check_selinux_mock.return_value = 0
  635. check_iptables_mock.return_value = (0, "other")
  636. check_postgre_up_mock.return_value = 0
  637. setup_db_mock.return_value = 0
  638. setup_remote_db_mock.return_value = 0
  639. configure_postgres_mock.return_value = 0
  640. download_jdk_mock.return_value = 0
  641. configure_os_settings_mock.return_value = 0
  642. store_remote_properties_mock.return_value = 0
  643. result = ambari_server.setup(args)
  644. self.assertEqual(None, result)
  645. sys.stdout = sys.__stdout__
  646. @patch.object(ambari_server, "get_YN_input")
  647. @patch.object(ambari_server, "setup_db")
  648. @patch.object(ambari_server, "print_info_msg")
  649. @patch.object(ambari_server, "run_os_command")
  650. @patch.object(ambari_server, "configure_database_username_password")
  651. @patch.object(ambari_server, "parse_properties_file")
  652. def test_reset(self, parse_properties_file_mock, configure_database_username_password_mock,
  653. run_os_command_mock, print_info_msg_mock,
  654. setup_db_mock, get_YN_inputMock):
  655. out = StringIO.StringIO()
  656. sys.stdout = out
  657. parse_properties_file_mock.return_value = 0
  658. args = MagicMock()
  659. args.persistence_type = "local"
  660. get_YN_inputMock.return_value = False
  661. rcode = ambari_server.reset(args)
  662. self.assertEqual(-1, rcode)
  663. get_YN_inputMock.return_value = True
  664. run_os_command_mock.return_value = (1, None, None)
  665. rcode = ambari_server.reset(args)
  666. self.assertEqual(1, rcode)
  667. run_os_command_mock.return_value = (0, None, None)
  668. rcode = ambari_server.reset(args)
  669. self.assertEqual(None, rcode)
  670. self.assertTrue(setup_db_mock.called)
  671. sys.stdout = sys.__stdout__
  672. @patch.object(ambari_server, "setup_db")
  673. @patch.object(ambari_server, "print_info_msg")
  674. @patch.object(ambari_server, "run_os_command")
  675. @patch.object(ambari_server, "parse_properties_file")
  676. def test_silent_reset(self, parse_properties_file_mock,
  677. run_os_command_mock, print_info_msg_mock,
  678. setup_db_mock):
  679. out = StringIO.StringIO()
  680. sys.stdout = out
  681. args = MagicMock()
  682. ambari_server.SILENT = True
  683. self.assertTrue(ambari_server.SILENT)
  684. run_os_command_mock.return_value = (0, None, None)
  685. def signal_handler(signum, frame):
  686. self.fail("Timed out!")
  687. signal.signal(signal.SIGALRM, signal_handler)
  688. signal.alarm(5)
  689. rcode = ambari_server.reset(args)
  690. self.assertEqual(None, rcode)
  691. self.assertTrue(setup_db_mock.called)
  692. sys.stdout = sys.__stdout__
  693. @patch("os.kill")
  694. @patch("os.path.exists")
  695. @patch("__builtin__.open")
  696. @patch("subprocess.Popen")
  697. @patch.object(ambari_server, "print_info_msg")
  698. @patch.object(ambari_server, "get_conf_dir")
  699. @patch.object(ambari_server, "find_jdk")
  700. @patch.object(ambari_server, "print_error_msg")
  701. @patch.object(ambari_server, "check_postgre_up")
  702. @patch.object(ambari_server, "check_iptables")
  703. @patch.object(ambari_server, "parse_properties_file")
  704. def test_start(self, parse_properties_file_mock, check_iptables_mock, check_postgre_up_mock,
  705. print_error_msg_mock, find_jdk_mock, get_conf_dir_mock,
  706. print_info_msg_mock, popenMock, openMock, pexistsMock,
  707. killMock):
  708. out = StringIO.StringIO()
  709. sys.stdout = out
  710. args = MagicMock()
  711. f = MagicMock()
  712. f.readline.return_value = 42
  713. openMock.return_value = f
  714. pexistsMock.return_value = True
  715. rcode = ambari_server.start(args)
  716. self.assertTrue(killMock.called)
  717. self.assertEqual(None, rcode)
  718. pexistsMock.return_value = False
  719. find_jdk_mock.return_value = None
  720. rcode = ambari_server.start(args)
  721. self.assertEqual(-1, rcode)
  722. find_jdk_mock.return_value = "somewhere"
  723. args.persistence_type="remote"
  724. check_postgre_up_mock.return_value = 0
  725. check_iptables_mock.return_value = (0, None)
  726. p = MagicMock()
  727. popenMock.return_value = p
  728. rcode = ambari_server.start(args)
  729. self.assertEqual(None, rcode)
  730. self.assertFalse(check_postgre_up_mock.called)
  731. self.assertTrue(f.write.called)
  732. args.persistence_type="local"
  733. rcode = ambari_server.start(args)
  734. self.assertEqual(None, rcode)
  735. self.assertTrue(check_postgre_up_mock.called)
  736. sys.stdout = sys.__stdout__
  737. @patch("__builtin__.open")
  738. @patch("os.path.exists")
  739. @patch("os.remove")
  740. @patch("os.killpg")
  741. @patch("os.getpgid")
  742. @patch.object(ambari_server, "print_info_msg")
  743. def test_stop(self, print_info_msg_mock, gpidMock, removeMock,
  744. killMock, pexistsMock, openMock):
  745. pexistsMock.return_value = True
  746. f = MagicMock()
  747. f.readline.return_value = "42"
  748. openMock.return_value = f
  749. out = StringIO.StringIO()
  750. sys.stdout = out
  751. ambari_server.stop(None)
  752. self.assertTrue(f.readline.called)
  753. self.assertTrue(killMock.called)
  754. self.assertTrue(killMock.called)
  755. self.assertTrue(f.close.called)
  756. self.assertTrue(removeMock.called)
  757. sys.stdout = sys.__stdout__
  758. def test_print_info_msg(self):
  759. out = StringIO.StringIO()
  760. sys.stdout = out
  761. ambari_server.VERBOSE = True
  762. ambari_server.print_info_msg("msg")
  763. self.assertNotEqual("", out.getvalue())
  764. sys.stdout = sys.__stdout__
  765. def test_print_error_msg(self):
  766. out = StringIO.StringIO()
  767. sys.stdout = out
  768. ambari_server.VERBOSE = True
  769. ambari_server.print_error_msg("msg")
  770. self.assertNotEqual("", out.getvalue())
  771. sys.stdout = sys.__stdout__
  772. def test_print_warning_msg(self):
  773. out = StringIO.StringIO()
  774. sys.stdout = out
  775. ambari_server.VERBOSE = True
  776. ambari_server.print_warning_msg("msg")
  777. self.assertNotEqual("", out.getvalue())
  778. sys.stdout = sys.__stdout__
  779. @patch.object(ambari_server, "get_choice_string_input")
  780. def test_get_YN_input(self, get_choice_string_input_mock):
  781. ambari_server.get_YN_input("prompt", "default")
  782. self.assertTrue(get_choice_string_input_mock.called)
  783. self.assertEqual(4, len(get_choice_string_input_mock.call_args_list[0][0]))
  784. @patch.object(ambari_server, "get_conf_dir")
  785. def test_update_ambari_properties(self, get_conf_dir_mock):
  786. properties = ["server.jdbc.user.name=ambari-server\n",
  787. "server.jdbc.user.passwd=/etc/ambari-server/conf/password.dat\n",
  788. "java.home=/usr/jdk64/jdk1.6.0_31\n",
  789. "server.os_type=redhat6\n"]
  790. NEW_PROPERTY = 'some_new_property=some_value\n'
  791. CHANGED_VALUE_PROPERTY = 'server.os_type=should_not_overwrite_value\n'
  792. get_conf_dir_mock.return_value = ""
  793. tf1 = tempfile.NamedTemporaryFile()
  794. tf2 = tempfile.NamedTemporaryFile()
  795. ambari_server.AMBARI_PROPERTIES_RPMSAVE_FILE = tf1.name
  796. ambari_server.AMBARI_PROPERTIES_FILE = tf2.name
  797. with open(ambari_server.AMBARI_PROPERTIES_FILE, "w") as f:
  798. f.write(NEW_PROPERTY)
  799. f.write(CHANGED_VALUE_PROPERTY)
  800. with open(ambari_server.AMBARI_PROPERTIES_RPMSAVE_FILE, 'w') as f:
  801. for line in properties:
  802. f.write(line)
  803. #Call tested method
  804. ambari_server.update_ambari_properties()
  805. with open(ambari_server.AMBARI_PROPERTIES_FILE, 'r') as f:
  806. ambari_properties_content = f.readlines()
  807. for line in properties:
  808. if not line in ambari_properties_content:
  809. self.fail()
  810. if not NEW_PROPERTY in ambari_properties_content:
  811. self.fail()
  812. if CHANGED_VALUE_PROPERTY in ambari_properties_content:
  813. self.fail()
  814. pass
  815. @patch("sys.exit")
  816. @patch.object(ambari_server, "get_db_cli_tool")
  817. @patch.object(ambari_server, "store_remote_properties")
  818. @patch.object(ambari_server, "is_local_database")
  819. @patch.object(ambari_server, "check_iptables")
  820. @patch.object(ambari_server, "check_jdbc_drivers")
  821. def test_setup_remote_db_wo_client(self, check_jdbc_drivers_mock, check_iptables_mock, is_local_db_mock,
  822. store_remote_properties_mock, get_db_cli_tool_mock, exit_mock):
  823. out = StringIO.StringIO()
  824. sys.stdout = out
  825. args = MagicMock()
  826. is_local_db_mock.return_value = False
  827. check_iptables_mock.return_value = (0, "other")
  828. store_remote_properties_mock.return_value = 0
  829. get_db_cli_tool_mock.return_value = None
  830. check_jdbc_drivers_mock.return_value=0
  831. failed = False
  832. result = None
  833. try:
  834. result = ambari_server.setup(args)
  835. except Exception:
  836. failed = True
  837. self.assertEqual(False, failed)
  838. self.assertEqual(None, result)
  839. self.assertEqual(True, exit_mock.called)
  840. sys.stdout = sys.__stdout__
  841. @patch.object(ambari_server, "parse_properties_file")
  842. @patch.object(ambari_server, "get_db_cli_tool")
  843. @patch.object(ambari_server, "print_error_msg")
  844. @patch.object(ambari_server, "get_YN_input")
  845. @patch.object(ambari_server, "setup_db")
  846. @patch.object(ambari_server, "run_os_command")
  847. def test_reset_remote_db_wo_client(self, run_os_command_mock, setup_db_mock,
  848. get_YN_inputMock, print_error_msg_mock, get_db_cli_tool_mock, parse_properties_file_mock):
  849. out = StringIO.StringIO()
  850. sys.stdout = out
  851. args = MagicMock()
  852. get_YN_inputMock.return_value = True
  853. run_os_command_mock.return_value = (0, None, None)
  854. args.persistence_type="remote"
  855. get_db_cli_tool_mock.return_value = None
  856. rcode = ambari_server.reset(args)
  857. self.assertEqual(-1, rcode)
  858. sys.stdout = sys.__stdout__
  859. @patch.object(ambari_server, "get_ambari_properties")
  860. @patch.object(ambari_server, "find_jdbc_driver")
  861. @patch.object(ambari_server, "copy_files")
  862. @patch('__builtin__.raw_input')
  863. def test_check_jdbc_drivers(self, raw_input_mock, copy_files_mock, find_jdbc_driver_mock, get_ambari_properties_mock):
  864. out = StringIO.StringIO()
  865. sys.stdout = out
  866. args = MagicMock()
  867. # Check positive scenario
  868. drivers_list = ['driver_file']
  869. resources_dir = '/tmp'
  870. get_ambari_properties_mock.return_value = {ambari_server.RESOURCES_DIR_KEY : resources_dir}
  871. find_jdbc_driver_mock.return_value = drivers_list
  872. rcode = ambari_server.check_jdbc_drivers(args)
  873. self.assertEqual(0, rcode)
  874. copy_files_mock.assert_called_with(drivers_list, resources_dir)
  875. #Check negative scenario
  876. find_jdbc_driver_mock.return_value = -1
  877. args.database = "oracle"
  878. rcode = ambari_server.check_jdbc_drivers(args)
  879. self.assertEqual(0, rcode)
  880. #Ensure user was asked to provide drivers
  881. self.assertTrue(raw_input_mock.called)
  882. sys.stdout = sys.__stdout__
  883. @patch.object(ambari_server, "search_file")
  884. def test_get_ambari_properties(self, search_file_mock):
  885. search_file_mock.return_value = None
  886. rcode = ambari_server.get_ambari_properties()
  887. self.assertEqual(rcode, -1)
  888. tf1 = tempfile.NamedTemporaryFile()
  889. search_file_mock.return_value = tf1.name
  890. prop_name='name'
  891. prop_value='val'
  892. with open(tf1.name, 'w') as fout:
  893. fout.write(prop_name + '=' + prop_value)
  894. fout.close()
  895. properties = ambari_server.get_ambari_properties()
  896. self.assertEqual(properties[prop_name], prop_value)
  897. sys.stdout = sys.__stdout__
  898. @patch.object(ambari_server, "search_file")
  899. def test_parse_properties_file(self, search_file_mock):
  900. tf1 = tempfile.NamedTemporaryFile(mode='r')
  901. search_file_mock.return_value = tf1.name
  902. args = MagicMock()
  903. ambari_server.parse_properties_file(args)
  904. self.assertEquals(args.persistence_type, "local")
  905. with open(tf1.name, 'w') as fout:
  906. fout.write("\n")
  907. fout.write(ambari_server.PERSISTENCE_TYPE_PROPERTY+"=remote")
  908. args = MagicMock()
  909. ambari_server.parse_properties_file(args)
  910. self.assertEquals(args.persistence_type, "remote")
  911. sys.stdout = sys.__stdout__
  912. def get_sample(self, sample):
  913. """
  914. Returns sample file content as string with normalized line endings
  915. """
  916. path = self.get_samples_dir(sample)
  917. return self.get_file_string(path)
  918. def get_file_string(self, file):
  919. """
  920. Returns file content as string with normalized line endings
  921. """
  922. string = open(file, 'r').read()
  923. return self.normalize(string)
  924. def normalize(self, string):
  925. """
  926. Normalizes line ending in string according to platform-default encoding
  927. """
  928. return string.replace("\n", os.linesep)
  929. def get_samples_dir(self, sample):
  930. """
  931. Returns full file path by sample name
  932. """
  933. testdir = os.path.dirname(__file__)
  934. return os.path.dirname(testdir) + os.sep + "resources" + os.sep \
  935. + 'TestAmbaryServer.samples/' + sample