TestAmbaryServer.py 85 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373
  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. import datetime
  26. # We have to use this import HACK because the filename contains a dash
  27. ambari_server = __import__('ambari-server')
  28. FatalException = ambari_server.FatalException
  29. class TestAmbariServer(TestCase):
  30. def setUp(self):
  31. out = StringIO.StringIO()
  32. sys.stdout = out
  33. def tearDown(self):
  34. sys.stdout = sys.__stdout__
  35. @patch.object(ambari_server, 'configure_database_username_password')
  36. @patch.object(ambari_server, 'run_os_command')
  37. @patch('optparse.Values')
  38. def test_configure_pg_hba_ambaridb_users(self, OptParseValuesMock,
  39. run_os_command_method,
  40. configure_database_username_password_method):
  41. # Prepare mocks
  42. run_os_command_method.return_value = (0, "", "")
  43. opvm = OptParseValuesMock.return_value
  44. opvm.database_username = "ffdf"
  45. tf1 = tempfile.NamedTemporaryFile()
  46. ambari_server.PG_HBA_CONF_FILE = tf1.name
  47. # Run test
  48. ambari_server.configure_pg_hba_ambaridb_users()
  49. # Check results
  50. self.assertTrue(run_os_command_method.called)
  51. self.assertTrue(configure_database_username_password_method.called)
  52. string_expected = self.get_file_string(self
  53. .get_samples_dir("configure_pg_hba_ambaridb_users1"))
  54. string_actual = self.get_file_string(ambari_server.PG_HBA_CONF_FILE)
  55. self.assertEquals(string_expected, string_actual)
  56. pass
  57. def test_configure_pg_hba_postgres_user(self):
  58. tf1 = tempfile.NamedTemporaryFile()
  59. ambari_server.PG_HBA_CONF_FILE = tf1.name
  60. with open(ambari_server.PG_HBA_CONF_FILE, 'w') as fout:
  61. fout.write("\n")
  62. fout.write("local all all md5\n")
  63. fout.write("host all all 0.0.0.0/0 md5\n")
  64. fout.write("host all all ::/0 md5\n")
  65. ambari_server.configure_pg_hba_postgres_user()
  66. expected = self.get_file_string(self.get_samples_dir(
  67. "configure_pg_hba_ambaridb_users2"))
  68. result = self.get_file_string(ambari_server.PG_HBA_CONF_FILE)
  69. self.assertEqual(expected, result, "pg_hba_conf not processed")
  70. mode = oct(os.stat(ambari_server.PG_HBA_CONF_FILE)[stat.ST_MODE])
  71. str_mode = str(mode)[-4:]
  72. self.assertEqual("0644", str_mode, "Wrong file permissions")
  73. @patch('__builtin__.raw_input')
  74. def get_choice_string_input(self, raw_input_method):
  75. prompt = "blablabla"
  76. default = "default blablabla"
  77. firstChoice = set(['yes','ye', 'y'])
  78. secondChoice = set(['no','n'])
  79. # test first input
  80. raw_input_method.return_value = "Y"
  81. result = ambari_server.get_choice_string_input(prompt, default,
  82. firstChoice, secondChoice)
  83. self.assertEquals(result, True)
  84. raw_input_method.reset_mock()
  85. # test second input
  86. raw_input_method.return_value = "N"
  87. result = ambari_server.get_choice_string_input(prompt, default,
  88. firstChoice, secondChoice)
  89. self.assertEquals(result, False)
  90. raw_input_method.reset_mock()
  91. # test enter pressed
  92. raw_input_method.return_value = ""
  93. result = ambari_server.get_choice_string_input(prompt, default,
  94. firstChoice, secondChoice)
  95. self.assertEquals(result, default)
  96. raw_input_method.reset_mock()
  97. # test wrong input
  98. list_of_return_values= ['yes', 'dsad', 'fdsfds']
  99. def side_effect(list):
  100. return list_of_return_values.pop()
  101. raw_input_method.side_effect = side_effect
  102. result = ambari_server.get_choice_string_input(prompt, default,
  103. firstChoice, secondChoice)
  104. self.assertEquals(result, True)
  105. self.assertEquals(raw_input_method.call_count, 3)
  106. pass
  107. @patch('re.search')
  108. @patch('__builtin__.raw_input')
  109. @patch('getpass.getpass')
  110. def get_validated_string_input(self, get_pass_method,
  111. raw_input_method, re_search_method):
  112. prompt = "blabla"
  113. default = "default_pass"
  114. pattern = "pattern_pp"
  115. description = "blabla2"
  116. # check password input
  117. self.assertFalse(False, ambari_server.SILENT)
  118. is_pass = True
  119. get_pass_method.return_value = "dfdsfdsfds"
  120. result = ambari_server.get_validated_string_input(prompt, default,
  121. pattern, description, is_pass)
  122. self.assertEquals(get_pass_method.return_value, result)
  123. get_pass_method.assure_called_once(prompt)
  124. self.assertFalse(raw_input_method.called)
  125. # check raw input
  126. get_pass_method.reset_mock()
  127. raw_input_method.reset_mock()
  128. is_pass = False
  129. raw_input_method.return_value = "dkf90ewuf0"
  130. result = ambari_server.get_validated_string_input(prompt, default,
  131. pattern, description, is_pass)
  132. self.assertEquals(raw_input_method.return_value, result)
  133. self.assertFalse(get_pass_method.called)
  134. raw_input_method.assure_called_once(prompt)
  135. def test_get_pass_file_path(self):
  136. result = ambari_server.get_pass_file_path("/etc/ambari/conf_file")
  137. self.assertEquals("/etc/ambari/password.dat", result)
  138. pass
  139. @patch.object(ambari_server, 'setup')
  140. @patch.object(ambari_server, 'start')
  141. @patch.object(ambari_server, 'stop')
  142. @patch.object(ambari_server, 'reset')
  143. @patch('optparse.OptionParser')
  144. def test_main_test_setup(self, OptionParserMock, reset_method, stop_method,
  145. start_method, setup_method):
  146. opm = OptionParserMock.return_value
  147. options = MagicMock()
  148. args = ["setup"]
  149. opm.parse_args.return_value = (options, args)
  150. options.database=None
  151. ambari_server.main()
  152. self.assertTrue(setup_method.called)
  153. self.assertFalse(start_method.called)
  154. self.assertFalse(stop_method.called)
  155. self.assertFalse(reset_method.called)
  156. self.assertFalse(False, ambari_server.VERBOSE)
  157. self.assertFalse(False, ambari_server.SILENT)
  158. @patch.object(ambari_server, 'setup')
  159. @patch.object(ambari_server, 'start')
  160. @patch.object(ambari_server, 'stop')
  161. @patch.object(ambari_server, 'reset')
  162. @patch('optparse.OptionParser')
  163. def test_main_test_start(self, OptionParserMock, reset_method, stop_method,
  164. start_method, setup_method):
  165. opm = OptionParserMock.return_value
  166. options = MagicMock()
  167. args = ["setup"]
  168. opm.parse_args.return_value = (options, args)
  169. options.database=None
  170. ambari_server.main()
  171. self.assertTrue(setup_method.called)
  172. self.assertFalse(start_method.called)
  173. self.assertFalse(stop_method.called)
  174. self.assertFalse(reset_method.called)
  175. self.assertFalse(False, ambari_server.VERBOSE)
  176. self.assertFalse(False, ambari_server.SILENT)
  177. @patch.object(ambari_server, 'setup')
  178. @patch.object(ambari_server, 'start')
  179. @patch.object(ambari_server, 'stop')
  180. @patch.object(ambari_server, 'reset')
  181. @patch('optparse.OptionParser')
  182. def test_main_test_start_debug_short(self, OptionParserMock, reset_method, stop_method,
  183. start_method, setup_method):
  184. opm = OptionParserMock.return_value
  185. options = MagicMock()
  186. args = ["start", "-g"]
  187. opm.parse_args.return_value = (options, args)
  188. options.database=None
  189. ambari_server.main()
  190. self.assertFalse(setup_method.called)
  191. self.assertTrue(start_method.called)
  192. self.assertFalse(stop_method.called)
  193. self.assertFalse(reset_method.called)
  194. self.assertTrue(ambari_server.SERVER_DEBUG_MODE)
  195. @patch.object(ambari_server, 'setup')
  196. @patch.object(ambari_server, 'start')
  197. @patch.object(ambari_server, 'stop')
  198. @patch.object(ambari_server, 'reset')
  199. @patch('optparse.OptionParser')
  200. def test_main_test_start_debug_long(self, OptionParserMock, reset_method, stop_method,
  201. start_method, setup_method):
  202. opm = OptionParserMock.return_value
  203. options = MagicMock()
  204. args = ["start", "--debug"]
  205. opm.parse_args.return_value = (options, args)
  206. options.database=None
  207. ambari_server.main()
  208. self.assertFalse(setup_method.called)
  209. self.assertTrue(start_method.called)
  210. self.assertFalse(stop_method.called)
  211. self.assertFalse(reset_method.called)
  212. self.assertTrue(ambari_server.SERVER_DEBUG_MODE)
  213. @patch.object(ambari_server, 'setup')
  214. @patch.object(ambari_server, 'start')
  215. @patch.object(ambari_server, 'stop')
  216. @patch.object(ambari_server, 'reset')
  217. @patch('optparse.OptionParser')
  218. def test_main_test_stop(self, OptionParserMock, reset_method, stop_method,
  219. start_method, setup_method):
  220. opm = OptionParserMock.return_value
  221. options = MagicMock()
  222. args = ["stop"]
  223. opm.parse_args.return_value = (options, args)
  224. options.database = None
  225. ambari_server.main()
  226. self.assertFalse(setup_method.called)
  227. self.assertFalse(start_method.called)
  228. self.assertTrue(stop_method.called)
  229. self.assertFalse(reset_method.called)
  230. self.assertFalse(False, ambari_server.VERBOSE)
  231. self.assertFalse(False, ambari_server.SILENT)
  232. @patch.object(ambari_server, 'setup')
  233. @patch.object(ambari_server, 'start')
  234. @patch.object(ambari_server, 'stop')
  235. @patch.object(ambari_server, 'reset')
  236. @patch('optparse.OptionParser')
  237. def test_main_test_reset(self, OptionParserMock, reset_method, stop_method,
  238. start_method, setup_method):
  239. opm = OptionParserMock.return_value
  240. options = MagicMock()
  241. args = ["reset"]
  242. opm.parse_args.return_value = (options, args)
  243. options.database=None
  244. ambari_server.main()
  245. self.assertFalse(setup_method.called)
  246. self.assertFalse(start_method.called)
  247. self.assertFalse(stop_method.called)
  248. self.assertTrue(reset_method.called)
  249. self.assertFalse(False, ambari_server.VERBOSE)
  250. self.assertFalse(False, ambari_server.SILENT)
  251. def test_configure_postgresql_conf(self):
  252. tf1 = tempfile.NamedTemporaryFile()
  253. ambari_server.POSTGRESQL_CONF_FILE = tf1.name
  254. with open(ambari_server.POSTGRESQL_CONF_FILE, 'w') as f:
  255. f.write("#listen_addresses = '127.0.0.1' #\n")
  256. f.write("#listen_addresses = '127.0.0.1'")
  257. ambari_server.configure_postgresql_conf()
  258. expected = self.get_file_string(self.get_samples_dir(
  259. "configure_postgresql_conf1"))
  260. result = self.get_file_string(ambari_server.POSTGRESQL_CONF_FILE)
  261. self.assertEqual(expected, result, "postgresql.conf not updated")
  262. mode = oct(os.stat(ambari_server.POSTGRESQL_CONF_FILE)[stat.ST_MODE])
  263. str_mode = str(mode)[-4:]
  264. self.assertEqual("0644", str_mode, "Wrong file permissions")
  265. @patch.object(ambari_server, "restart_postgres")
  266. @patch.object(ambari_server, "get_postgre_status")
  267. @patch.object(ambari_server, "configure_postgresql_conf")
  268. @patch.object(ambari_server, "configure_pg_hba_ambaridb_users")
  269. @patch.object(ambari_server, "configure_pg_hba_postgres_user")
  270. def test_configure_postgres(self, configure_pg_hba_postgres_user_mock,
  271. configure_pg_hba_ambaridb_users_mock,
  272. configure_postgresql_conf_mock,
  273. get_postgre_status_mock,
  274. restart_postgres_mock):
  275. tf1 = tempfile.NamedTemporaryFile()
  276. tf2 = tempfile.NamedTemporaryFile()
  277. ambari_server.PG_HBA_CONF_FILE = tf1.name
  278. ambari_server.PG_HBA_CONF_FILE_BACKUP = tf2.name
  279. args = MagicMock()
  280. out = StringIO.StringIO()
  281. sys.stdout = out
  282. rcode = ambari_server.configure_postgres()
  283. sys.stdout = sys.__stdout__
  284. self.assertEqual(0, rcode)
  285. self.assertEqual("Backup for pg_hba found, reconfiguration not required\n",
  286. out.getvalue())
  287. ambari_server.PG_HBA_CONF_FILE_BACKUP = tempfile.mktemp()
  288. get_postgre_status_mock.return_value = ambari_server.PG_STATUS_RUNNING
  289. restart_postgres_mock.return_value = 0
  290. rcode = ambari_server.configure_postgres()
  291. self.assertTrue(os.path.isfile(ambari_server.PG_HBA_CONF_FILE_BACKUP),
  292. "postgresql.conf backup not created")
  293. self.assertTrue(configure_pg_hba_postgres_user_mock.called)
  294. self.assertTrue(configure_pg_hba_ambaridb_users_mock.called)
  295. mode = oct(os.stat(ambari_server.PG_HBA_CONF_FILE)[stat.ST_MODE])
  296. str_mode = str(mode)[-4:]
  297. self.assertEqual("0644", str_mode, "Wrong file permissions")
  298. self.assertTrue(configure_postgresql_conf_mock.called)
  299. self.assertEqual(0, rcode)
  300. os.unlink(ambari_server.PG_HBA_CONF_FILE_BACKUP)
  301. get_postgre_status_mock.return_value = "stopped"
  302. rcode = ambari_server.configure_postgres()
  303. self.assertEqual(0, rcode)
  304. os.unlink(ambari_server.PG_HBA_CONF_FILE_BACKUP)
  305. sys.stdout = sys.__stdout__
  306. @patch("time.sleep")
  307. @patch("subprocess.Popen")
  308. @patch.object(ambari_server, "run_os_command")
  309. @patch.object(ambari_server, "get_postgre_status")
  310. @patch.object(ambari_server, "print_info_msg")
  311. def test_restart_postgres(self, printInfoMsg_mock, get_postgre_status_mock,
  312. run_os_command_mock, popenMock, sleepMock):
  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. @patch("shlex.split")
  324. @patch("subprocess.Popen")
  325. @patch.object(ambari_server, "print_info_msg")
  326. def test_run_os_command(self, printInfoMsg_mock, popenMock, splitMock):
  327. p = MagicMock()
  328. p.communicate.return_value = (None, None)
  329. p.returncode = 3
  330. popenMock.return_value = p
  331. # with list arg
  332. cmd = ["exec", "arg"]
  333. ambari_server.run_os_command(cmd)
  334. self.assertFalse(splitMock.called)
  335. # with str arg
  336. resp = ambari_server.run_os_command("runme")
  337. self.assertEqual(3, resp[0])
  338. self.assertTrue(splitMock.called)
  339. @patch.object(ambari_server, "get_conf_dir")
  340. @patch.object(ambari_server, "search_file")
  341. def test_write_property(self, search_file_mock, get_conf_dir_mock):
  342. expected_content = "key1=val1\n"
  343. tf1 = tempfile.NamedTemporaryFile()
  344. search_file_mock.return_value = tf1.name
  345. ambari_server.write_property("key1", "val1")
  346. result = tf1.read()
  347. self.assertTrue(expected_content in result)
  348. @patch.object(ambari_server, "configure_database_username_password")
  349. @patch.object(ambari_server, "run_os_command")
  350. def test_setup_db(self, run_os_command_mock,
  351. configure_database_username_password_mock):
  352. run_os_command_mock.return_value = (0, None, None)
  353. result = ambari_server.setup_db(MagicMock())
  354. self.assertTrue(configure_database_username_password_mock.called)
  355. self.assertEqual(0, result)
  356. @patch.object(ambari_server, "get_YN_input")
  357. @patch.object(ambari_server, "run_os_command")
  358. def test_check_selinux(self, run_os_command_mock, getYNInput_mock):
  359. run_os_command_mock.return_value = (0, ambari_server.SE_STATUS_DISABLED,
  360. None)
  361. rcode = ambari_server.check_selinux()
  362. self.assertEqual(0, rcode)
  363. getYNInput_mock.return_value = True
  364. run_os_command_mock.return_value = (0,"enabled "
  365. + ambari_server.SE_MODE_ENFORCING,
  366. None)
  367. rcode = ambari_server.check_selinux()
  368. self.assertEqual(0, rcode)
  369. self.assertTrue(run_os_command_mock.called)
  370. self.assertTrue(getYNInput_mock.called)
  371. @patch.object(ambari_server, "print_info_msg")
  372. def test_get_ambari_jars(self, printInfoMsg_mock):
  373. env = "/ambari/jars"
  374. os.environ[ambari_server.AMBARI_SERVER_LIB] = env
  375. result = ambari_server.get_ambari_jars()
  376. self.assertEqual(env, result)
  377. del os.environ[ambari_server.AMBARI_SERVER_LIB]
  378. result = ambari_server.get_ambari_jars()
  379. self.assertEqual("/usr/lib/ambari-server", result)
  380. self.assertTrue(printInfoMsg_mock.called)
  381. @patch("glob.glob")
  382. @patch.object(ambari_server, "print_info_msg")
  383. def test_get_share_jars(self, printInfoMsg_mock, globMock):
  384. globMock.return_value = ["one", "two"]
  385. expected = "one:two:one:two"
  386. result = ambari_server.get_share_jars()
  387. self.assertEqual(expected, result)
  388. globMock.return_value = []
  389. expected = ""
  390. result = ambari_server.get_share_jars()
  391. self.assertEqual(expected, result)
  392. @patch("glob.glob")
  393. @patch.object(ambari_server, "print_info_msg")
  394. def test_get_ambari_classpath(self, printInfoMsg_mock, globMock):
  395. globMock.return_value = ["one"]
  396. result = ambari_server.get_ambari_classpath()
  397. self.assertTrue(ambari_server.get_ambari_jars() in result)
  398. self.assertTrue(ambari_server.get_share_jars() in result)
  399. globMock.return_value = []
  400. result = ambari_server.get_ambari_classpath()
  401. self.assertTrue(ambari_server.get_ambari_jars() in result)
  402. self.assertFalse(":" in result)
  403. @patch.object(ambari_server, "print_info_msg")
  404. def test_get_conf_dir(self, printInfoMsg_mock):
  405. env = "/dummy/ambari/conf"
  406. os.environ[ambari_server.AMBARI_CONF_VAR] = env
  407. result = ambari_server.get_conf_dir()
  408. self.assertEqual(env, result)
  409. del os.environ[ambari_server.AMBARI_CONF_VAR]
  410. result = ambari_server.get_conf_dir()
  411. self.assertEqual("/etc/ambari-server/conf", result)
  412. def test_search_file(self):
  413. path = os.path.dirname(__file__)
  414. result = ambari_server.search_file(__file__, path)
  415. expected = os.path.abspath(__file__)
  416. self.assertEqual(expected, result)
  417. result = ambari_server.search_file("non_existent_file", path)
  418. self.assertEqual(None, result)
  419. @patch.object(ambari_server, "search_file")
  420. def test_find_properties_file(self, search_file_mock):
  421. # Testing case when file is not found
  422. search_file_mock.return_value = None
  423. try:
  424. ambari_server.find_properties_file()
  425. self.fail("File not found'")
  426. except FatalException:
  427. # Expected
  428. pass
  429. self.assertTrue(search_file_mock.called)
  430. # Testing case when file is found
  431. value = MagicMock()
  432. search_file_mock.return_value = value
  433. result = ambari_server.find_properties_file()
  434. self.assertTrue(result is value)
  435. @patch.object(ambari_server, "find_properties_file")
  436. @patch("__builtin__.open")
  437. @patch("ambari-server.Properties")
  438. def test_read_ambari_user(self, properties_mock, open_mock, find_properties_file_mock):
  439. open_mock.return_value = "dummy"
  440. find_properties_file_mock.return_value = "dummy"
  441. # Testing with defined user
  442. properties_mock.return_value.__getitem__.return_value = "dummy_user"
  443. user = ambari_server.read_ambari_user()
  444. self.assertEquals(user, "dummy_user")
  445. # Testing with undefined user
  446. properties_mock.return_value.__getitem__.return_value = None
  447. user = ambari_server.read_ambari_user()
  448. self.assertEquals(user, None)
  449. @patch.object(ambari_server, "set_file_permissions")
  450. @patch.object(ambari_server, "run_os_command")
  451. @patch.object(ambari_server, "get_ambari_properties")
  452. @patch.object(ambari_server, "get_value_from_properties")
  453. @patch.object(ambari_server, "os.mkdir")
  454. def test_adjust_directory_permissions(self, mkdir_mock, get_value_from_properties_mock, get_ambari_properties_mock,
  455. run_os_command_mock, set_file_permissions_mock):
  456. # Testing boostrap dir wipe
  457. properties_mock = MagicMock()
  458. get_value_from_properties_mock.return_value = "dummy_bootstrap_dir"
  459. ambari_server.adjust_directory_permissions("user")
  460. self.assertEquals(run_os_command_mock.call_args_list[0][0][0], "rm -rf dummy_bootstrap_dir/*")
  461. self.assertTrue(mkdir_mock.called)
  462. set_file_permissions_mock.reset_mock()
  463. # Test recursive calls
  464. old_list = ambari_server.NR_ADJUST_OWNERSHIP_LIST
  465. ambari_server.NR_ADJUST_OWNERSHIP_LIST = [
  466. ( "/etc/ambari-server/conf", "755", "{0}", "{0}", True ),
  467. ( "/etc/ambari-server/conf/ambari.properties", "644", "{0}", "{0}", False )
  468. ]
  469. ambari_server.adjust_directory_permissions("user")
  470. self.assertTrue(len(set_file_permissions_mock.call_args_list) ==
  471. len(ambari_server.NR_ADJUST_OWNERSHIP_LIST))
  472. self.assertEquals(set_file_permissions_mock.call_args_list[0][0][4], True)
  473. self.assertEquals(set_file_permissions_mock.call_args_list[1][0][4], False)
  474. ambari_server.NR_ADJUST_OWNERSHIP_LIST = old_list
  475. @patch("os.path.exists")
  476. @patch.object(ambari_server, "run_os_command")
  477. @patch.object(ambari_server, "print_warning_msg")
  478. @patch.object(ambari_server, "print_info_msg")
  479. def test_set_file_permissions(self, print_info_msg_mock, print_warning_msg_mock,
  480. run_os_command_mock, exists_mock):
  481. # Testing not existent file scenario
  482. exists_mock.return_value = False
  483. ambari_server.set_file_permissions("dummy-file", "dummy-mod",
  484. "dummy-user", "dummy-group", False)
  485. self.assertFalse(run_os_command_mock.called)
  486. self.assertTrue(print_info_msg_mock.called)
  487. run_os_command_mock.reset_mock()
  488. print_warning_msg_mock.reset_mock()
  489. # Testing OK scenario
  490. exists_mock.return_value = True
  491. run_os_command_mock.side_effect = [(0, "", ""), (0, "", "")]
  492. ambari_server.set_file_permissions("dummy-file", "dummy-mod",
  493. "dummy-user", "dummy-group", False)
  494. self.assertTrue(len(run_os_command_mock.call_args_list) == 2)
  495. self.assertFalse(print_warning_msg_mock.called)
  496. run_os_command_mock.reset_mock()
  497. print_warning_msg_mock.reset_mock()
  498. # Testing first command fail
  499. run_os_command_mock.side_effect = [(1, "", ""), (0, "", "")]
  500. ambari_server.set_file_permissions("dummy-file", "dummy-mod",
  501. "dummy-user", "dummy-group", False)
  502. self.assertTrue(len(run_os_command_mock.call_args_list) == 2)
  503. self.assertTrue(print_warning_msg_mock.called)
  504. run_os_command_mock.reset_mock()
  505. print_warning_msg_mock.reset_mock()
  506. # Testing second command fail
  507. run_os_command_mock.side_effect = [(0, "", ""), (1, "", "")]
  508. ambari_server.set_file_permissions("dummy-file", "dummy-mod",
  509. "dummy-user", "dummy-group", False)
  510. self.assertTrue(len(run_os_command_mock.call_args_list) == 2)
  511. self.assertTrue(print_warning_msg_mock.called)
  512. run_os_command_mock.reset_mock()
  513. print_warning_msg_mock.reset_mock()
  514. # Testing recursive operation
  515. exists_mock.return_value = True
  516. run_os_command_mock.side_effect = [(0, "", ""), (0, "", "")]
  517. ambari_server.set_file_permissions("dummy-file", "dummy-mod",
  518. "dummy-user", "dummy-group", True)
  519. self.assertTrue(len(run_os_command_mock.call_args_list) == 2)
  520. self.assertTrue("-R" in run_os_command_mock.call_args_list[0][0][0])
  521. self.assertTrue("-R" in run_os_command_mock.call_args_list[1][0][0])
  522. self.assertFalse(print_warning_msg_mock.called)
  523. run_os_command_mock.reset_mock()
  524. print_warning_msg_mock.reset_mock()
  525. # Testing non-recursive operation
  526. exists_mock.return_value = True
  527. run_os_command_mock.side_effect = [(0, "", ""), (0, "", "")]
  528. ambari_server.set_file_permissions("dummy-file", "dummy-mod",
  529. "dummy-user", "dummy-group", False)
  530. self.assertTrue(len(run_os_command_mock.call_args_list) == 2)
  531. self.assertFalse("-R" in run_os_command_mock.call_args_list[0][0][0])
  532. self.assertFalse("-R" in run_os_command_mock.call_args_list[1][0][0])
  533. self.assertFalse(print_warning_msg_mock.called)
  534. run_os_command_mock.reset_mock()
  535. print_warning_msg_mock.reset_mock()
  536. @patch.object(ambari_server, "get_validated_string_input")
  537. @patch.object(ambari_server, "print_info_msg")
  538. @patch.object(ambari_server, "print_warning_msg")
  539. @patch.object(ambari_server, "run_os_command")
  540. def test_create_custom_user(self, run_os_command_mock, print_warning_msg_mock,
  541. print_info_msg_mock, get_validated_string_input_mock):
  542. user = "dummy-user"
  543. get_validated_string_input_mock.return_value = user
  544. # Testing scenario: existing group, existing user
  545. run_os_command_mock.side_effect = [(9, "", ""), (9, "", ""), (0, "", "")]
  546. result = ambari_server.create_custom_user()
  547. self.assertTrue(len(run_os_command_mock.call_args_list) == 3)
  548. self.assertEquals(result, (0, user))
  549. run_os_command_mock.reset_mock()
  550. # Testing scenario: absent group, absent user
  551. run_os_command_mock.side_effect = [(0, "", ""), (0, "", "")]
  552. result = ambari_server.create_custom_user()
  553. self.assertTrue(len(run_os_command_mock.call_args_list) == 2)
  554. self.assertEquals(result, (0, user))
  555. run_os_command_mock.reset_mock()
  556. # Testing scenario: os command fail
  557. run_os_command_mock.side_effect = [(1, "", "")]
  558. result = ambari_server.create_custom_user()
  559. self.assertTrue(len(run_os_command_mock.call_args_list) == 1)
  560. self.assertEquals(result, (1, None))
  561. run_os_command_mock.reset_mock()
  562. @patch.object(ambari_server, "read_ambari_user")
  563. @patch.object(ambari_server, "get_YN_input")
  564. @patch.object(ambari_server, "create_custom_user")
  565. @patch.object(ambari_server, "write_property")
  566. @patch.object(ambari_server, "adjust_directory_permissions")
  567. @patch.object(ambari_server, "print_error_msg")
  568. def test_check_ambari_user(self, print_error_msg_mock,
  569. adjust_directory_permissions_mock, write_property_mock,
  570. create_custom_user_mock, get_YN_input_mock, read_ambari_user_mock):
  571. # Scenario: user is already defined
  572. read_ambari_user_mock.return_value = "dummy-user"
  573. result = ambari_server.check_ambari_user()
  574. self.assertFalse(get_YN_input_mock.called)
  575. self.assertFalse(write_property_mock.called)
  576. self.assertTrue(adjust_directory_permissions_mock.called)
  577. self.assertEqual(result, 0)
  578. get_YN_input_mock.reset_mock()
  579. write_property_mock.reset_mock()
  580. adjust_directory_permissions_mock.reset_mock()
  581. # Scenario: user is not defined (setup process)
  582. read_ambari_user_mock.return_value = None
  583. get_YN_input_mock.return_value = True
  584. create_custom_user_mock.return_value = (0, "dummy-user")
  585. result = ambari_server.check_ambari_user()
  586. self.assertTrue(get_YN_input_mock.called)
  587. self.assertTrue(create_custom_user_mock.called)
  588. self.assertTrue(write_property_mock.called)
  589. self.assertTrue(write_property_mock.call_args[0][1] == "dummy-user")
  590. self.assertTrue(adjust_directory_permissions_mock.called)
  591. self.assertEqual(result, 0)
  592. get_YN_input_mock.reset_mock()
  593. create_custom_user_mock.reset_mock()
  594. write_property_mock.reset_mock()
  595. adjust_directory_permissions_mock.reset_mock()
  596. # Scenario: user is not defined (setup process), user creation failed
  597. read_ambari_user_mock.return_value = None
  598. get_YN_input_mock.return_value = True
  599. create_custom_user_mock.return_value = (1, None)
  600. result = ambari_server.check_ambari_user()
  601. self.assertTrue(get_YN_input_mock.called)
  602. self.assertTrue(create_custom_user_mock.called)
  603. self.assertFalse(write_property_mock.called)
  604. self.assertFalse(adjust_directory_permissions_mock.called)
  605. self.assertEqual(result, 1)
  606. get_YN_input_mock.reset_mock()
  607. create_custom_user_mock.reset_mock()
  608. write_property_mock.reset_mock()
  609. adjust_directory_permissions_mock.reset_mock()
  610. # Scenario: user is not defined and left to be root
  611. read_ambari_user_mock.return_value = None
  612. get_YN_input_mock.return_value = False
  613. result = ambari_server.check_ambari_user()
  614. self.assertTrue(get_YN_input_mock.called)
  615. self.assertFalse(create_custom_user_mock.called)
  616. self.assertTrue(write_property_mock.called)
  617. self.assertTrue(write_property_mock.call_args[0][1] == "root")
  618. self.assertTrue(adjust_directory_permissions_mock.called)
  619. self.assertEqual(result, 0)
  620. @patch.object(ambari_server, "search_file")
  621. @patch("__builtin__.open")
  622. @patch.object(ambari_server, "read_ambari_user")
  623. @patch.object(ambari_server, "set_file_permissions")
  624. def test_store_password_file(self, set_file_permissions_mock,
  625. read_ambari_user_mock, open_mock, search_file_mock):
  626. search_file_mock.return_value = "/etc/ambari-server/conf/ambari.properties"
  627. open_mock.return_value = MagicMock()
  628. ambari_server.store_password_file("password", "passfile")
  629. self.assertTrue(set_file_permissions_mock.called)
  630. @patch.object(ambari_server, "run_os_command")
  631. def test_check_iptables(self, run_os_command_mock):
  632. run_os_command_mock.return_value = (1, "test", "")
  633. rcode, info = ambari_server.check_iptables()
  634. self.assertEqual(1, rcode)
  635. self.assertEqual("test", info)
  636. run_os_command_mock.return_value = (2, "",
  637. ambari_server.IP_TBLS_SRVC_NT_FND)
  638. rcode = ambari_server.check_iptables()
  639. self.assertEqual(0, rcode)
  640. def test_dlprogress(self):
  641. out = StringIO.StringIO()
  642. sys.stdout = out
  643. ambari_server.dlprogress("filename", 10, 2, 100)
  644. sys.stdout = sys.__stdout__
  645. self.assertNotEqual("", out.getvalue())
  646. @patch("urllib2.urlopen")
  647. @patch("__builtin__.open")
  648. @patch.object(ambari_server, "dlprogress")
  649. def test_track_jdk(self, dlprogress_mock, openMock, urlopenMock):
  650. u = MagicMock()
  651. u.info.return_value = {"Content-Length":"24576"}
  652. chunks = [None, "second", "first"]
  653. def side_effect(*args, **kwargs):
  654. return chunks.pop()
  655. u.read.side_effect = side_effect
  656. urlopenMock.return_value = u
  657. f = MagicMock()
  658. openMock.return_value = f
  659. ambari_server.track_jdk("base", "url", "local")
  660. self.assertEqual(0, len(chunks))
  661. self.assertTrue(f.write.called)
  662. self.assertTrue(f.flush.called)
  663. self.assertTrue(f.close.called)
  664. self.assertEqual(2, len(dlprogress_mock.call_args_list))
  665. @patch("shutil.copy")
  666. @patch("os.path.join")
  667. @patch("os.path.exists")
  668. @patch.object(ambari_server, "get_ambari_properties")
  669. def test_install_jce_manualy(self, get_ambari_properties_mock,\
  670. os_path_exists_mock, os_path_join_mock,\
  671. shutil_copy_mock):
  672. args = MagicMock()
  673. args.jce_policy = "somewhere"
  674. p = MagicMock()
  675. get_ambari_properties_mock.return_value = p
  676. p.__getitem__.side_effect = None
  677. p.__getitem__.return_value = "somewhere"
  678. os_path_exists_mock.return_value = True
  679. os_path_join_mock.return_value = \
  680. "/var/lib/ambari-server/resources/jce_policy-6.zip"
  681. ambari_server.install_jce_manualy(args)
  682. self.assertTrue(shutil_copy_mock.called)
  683. shutil_copy_mock.side_effect = Exception("exception")
  684. try:
  685. ambari_server.install_jce_manualy(args)
  686. self.fail("Should throw exception because of not found jce_policy-6.zip")
  687. except Exception:
  688. # Expected
  689. self.assertTrue(shutil_copy_mock.called)
  690. pass
  691. shutil_copy_mock.side_effect = None
  692. args.jce_policy = None
  693. ambari_server.install_jce_manualy(args)
  694. @patch.object(ambari_server, "get_validated_string_input")
  695. @patch.object(ambari_server, "find_properties_file")
  696. @patch.object(ambari_server, "get_ambari_properties")
  697. @patch.object(ambari_server, "is_server_runing")
  698. @patch.object(ambari_server, "import_cert_and_key_action")
  699. @patch.object(ambari_server, "get_YN_input")
  700. @patch("__builtin__.open")
  701. @patch("ambari-server.Properties")
  702. def test_setup_https(self, Properties_mock, open_Mock, get_YN_input_mock,\
  703. import_cert_and_key_action_mock,
  704. is_server_runing_mock, get_ambari_properties_mock,\
  705. find_properties_file_mock,\
  706. get_validated_string_input_mock):
  707. args = MagicMock()
  708. open_Mock.return_value = file
  709. p = get_ambari_properties_mock.return_value
  710. #Case #1: if client ssl is on and user didnt choose
  711. #disable ssl option and choose import certs and keys
  712. p.get_property.side_effect = ["key_dir","5555","6666", "true"]
  713. get_YN_input_mock.side_effect = [False,True]
  714. get_validated_string_input_mock.side_effect = ["4444"]
  715. get_property_expected = "[call('security.server.keys_dir'),\n"+\
  716. " call('client.api.ssl.port'),\n"+\
  717. " call('client.api.ssl.port'),\n call('api.ssl')]"
  718. process_pair_expected = "[call('client.api.ssl.port', '4444')]"
  719. ambari_server.SILENT = False
  720. ambari_server.setup_https(args)
  721. self.assertTrue(p.process_pair.called)
  722. self.assertTrue(p.get_property.call_count == 4)
  723. self.assertEqual(str(p.get_property.call_args_list), get_property_expected)
  724. self.assertEqual(str(p.process_pair.call_args_list), process_pair_expected)
  725. self.assertTrue(p.store.called)
  726. self.assertTrue(import_cert_and_key_action_mock.called)
  727. p.process_pair.reset_mock()
  728. p.get_property.reset_mock()
  729. p.store.reset_mock()
  730. import_cert_and_key_action_mock.reset_mock()
  731. #Case #2: if client ssl is on and user choose to disable ssl option
  732. p.get_property.side_effect = ["key_dir","", "true"]
  733. get_YN_input_mock.side_effect = [True]
  734. get_validated_string_input_mock.side_effect = ["4444"]
  735. get_property_expected = "[call('security.server.keys_dir'),\n"+\
  736. " call('client.api.ssl.port'),\n call('api.ssl')]"
  737. process_pair_expected = "[call('api.ssl', 'false')]"
  738. ambari_server.setup_https(args)
  739. self.assertTrue(p.process_pair.called)
  740. self.assertTrue(p.get_property.call_count == 3)
  741. self.assertEqual(str(p.get_property.call_args_list), get_property_expected)
  742. self.assertEqual(str(p.process_pair.call_args_list), process_pair_expected)
  743. self.assertTrue(p.store.called)
  744. self.assertFalse(import_cert_and_key_action_mock.called)
  745. p.process_pair.reset_mock()
  746. p.get_property.reset_mock()
  747. p.store.reset_mock()
  748. import_cert_and_key_action_mock.reset_mock()
  749. #Case #3: if client ssl is off and user choose option
  750. #to import cert and keys
  751. p.get_property.side_effect = ["key_dir","", None]
  752. get_YN_input_mock.side_effect = [True, True]
  753. get_validated_string_input_mock.side_effect = ["4444"]
  754. get_property_expected = "[call('security.server.keys_dir'),\n"+\
  755. " call('client.api.ssl.port'),\n call('api.ssl')]"
  756. process_pair_expected = "[call('client.api.ssl.port', '4444')]"
  757. ambari_server.setup_https(args)
  758. self.assertTrue(p.process_pair.called)
  759. self.assertTrue(p.get_property.call_count == 3)
  760. self.assertEqual(str(p.get_property.call_args_list), get_property_expected)
  761. self.assertEqual(str(p.process_pair.call_args_list), process_pair_expected)
  762. self.assertTrue(p.store.called)
  763. self.assertTrue(import_cert_and_key_action_mock.called)
  764. p.process_pair.reset_mock()
  765. p.get_property.reset_mock()
  766. p.store.reset_mock()
  767. import_cert_and_key_action_mock.reset_mock()
  768. #Case #4: if client ssl is off and
  769. #user did not choose option to import cert and keys
  770. p.get_property.side_effect = ["key_dir","", None]
  771. get_YN_input_mock.side_effect = [False]
  772. get_validated_string_input_mock.side_effect = ["4444"]
  773. get_property_expected = "[call('security.server.keys_dir'),\n"+\
  774. " call('client.api.ssl.port'),\n call('api.ssl')]"
  775. process_pair_expected = "[]"
  776. ambari_server.setup_https(args)
  777. self.assertFalse(p.process_pair.called)
  778. self.assertTrue(p.get_property.call_count == 3)
  779. self.assertEqual(str(p.get_property.call_args_list), get_property_expected)
  780. self.assertEqual(str(p.process_pair.call_args_list), process_pair_expected)
  781. self.assertFalse(p.store.called)
  782. self.assertFalse(import_cert_and_key_action_mock.called)
  783. p.process_pair.reset_mock()
  784. p.get_property.reset_mock()
  785. p.store.reset_mock()
  786. import_cert_and_key_action_mock.reset_mock()
  787. ambari_server.SILENT = True
  788. @patch.object(ambari_server, "import_cert_and_key")
  789. def test_import_cert_and_key_action(self, import_cert_and_key_mock):
  790. import_cert_and_key_mock.return_value = True
  791. properties = MagicMock()
  792. properties.get_property.side_effect = ["key_dir","5555","6666", "true"]
  793. properties.process_pair = MagicMock()
  794. expect_process_pair = "[call('security.server.cert_name', 'ca.crt'),\n"+\
  795. " call('security.server.key_name', 'ca.key'),\n"+\
  796. " call('api.ssl', 'true')]"
  797. ambari_server.import_cert_and_key_action("key_dir", properties)
  798. self.assertEqual(str(properties.process_pair.call_args_list),\
  799. expect_process_pair)
  800. @patch.object(ambari_server, "read_ambari_user")
  801. @patch.object(ambari_server, "set_file_permissions")
  802. @patch.object(ambari_server, "import_file_to_keystore")
  803. @patch("__builtin__.open")
  804. @patch.object(ambari_server, "run_os_command")
  805. @patch("os.path.join")
  806. @patch.object(ambari_server, "get_validated_filepath_input")
  807. @patch.object(ambari_server, "get_validated_string_input")
  808. def test_import_cert_and_key(self, get_validated_string_input_mock,\
  809. get_validated_filepath_input_mock,\
  810. os_path_join_mock, run_os_command_mock,\
  811. open_mock, import_file_to_keystore_mock,\
  812. set_file_permissions_mock, read_ambari_user_mock):
  813. get_validated_string_input_mock.return_value = "password"
  814. get_validated_filepath_input_mock.side_effect = \
  815. ["cert_file_path","key_file_path"]
  816. os_path_join_mock.side_effect = ["cert_file_path","key_file_path",\
  817. "keystore_cert_file_path",\
  818. "keystore_cert_key_file_path",]
  819. run_os_command_mock.return_value = (0, "", "")
  820. om = open_mock.return_value
  821. expect_import_file_to_keystore = "[call('cert_file_path',"+\
  822. " 'keystore_cert_file_path'),\n"+\
  823. " call('key_file_path',"+\
  824. " 'keystore_cert_key_file_path')]"
  825. ambari_server.import_cert_and_key("key_dir")
  826. self.assertTrue(get_validated_filepath_input_mock.call_count == 2)
  827. self.assertTrue(get_validated_string_input_mock.called)
  828. self.assertTrue(os_path_join_mock.call_count == 4)
  829. self.assertTrue(set_file_permissions_mock.call_count == 2)
  830. self.assertEqual(str(import_file_to_keystore_mock.call_args_list),\
  831. expect_import_file_to_keystore)
  832. @patch.object(ambari_server, "run_os_command")
  833. @patch("__builtin__.open")
  834. @patch("os.path.exists")
  835. def test_is_server_runing(self, os_path_exists_mock, open_mock,\
  836. run_os_command_mock):
  837. os_path_exists_mock.return_value = True
  838. f = open_mock.return_value
  839. f.readline.return_value = "111"
  840. run_os_command_mock.return_value = 0, "", ""
  841. status, pid = ambari_server.is_server_runing()
  842. self.assertTrue(status)
  843. self.assertEqual(111, pid)
  844. os_path_exists_mock.return_value = False
  845. status, pid = ambari_server.is_server_runing()
  846. self.assertFalse(status)
  847. @patch.object(ambari_server, "install_jce_manualy")
  848. @patch("os.stat")
  849. @patch("os.path.isfile")
  850. @patch("os.path.exists")
  851. @patch.object(ambari_server, "track_jdk")
  852. @patch.object(ambari_server, "get_YN_input")
  853. @patch.object(ambari_server, "run_os_command")
  854. @patch.object(ambari_server, "write_property")
  855. @patch.object(ambari_server, "print_info_msg")
  856. @patch.object(ambari_server, "get_JAVA_HOME")
  857. @patch.object(ambari_server, "get_ambari_properties")
  858. def test_download_jdk(self, get_ambari_properties_mock, get_JAVA_HOME_mock,\
  859. print_info_msg_mock, write_property_mock,\
  860. run_os_command_mock, get_YN_input_mock, track_jdk_mock,
  861. path_existsMock, path_isfileMock, statMock,\
  862. install_jce_manualy_mock):
  863. args = MagicMock()
  864. args.java_home = "somewhere"
  865. path_existsMock.return_value = False
  866. get_JAVA_HOME_mock.return_value = False
  867. get_ambari_properties_mock.return_value = -1
  868. try:
  869. ambari_server.download_jdk(args)
  870. self.fail("Should throw exception because of not found ambari.properties")
  871. except FatalException:
  872. # Expected
  873. self.assertTrue(get_ambari_properties_mock.called)
  874. pass
  875. get_JAVA_HOME_mock.return_value = True
  876. path_existsMock.return_value = True
  877. rcode = ambari_server.download_jdk(args)
  878. self.assertEqual(0, rcode)
  879. get_JAVA_HOME_mock.return_value = False
  880. rcode = ambari_server.download_jdk(args)
  881. self.assertEqual(0, rcode)
  882. self.assertTrue(write_property_mock.called)
  883. path_existsMock.return_value = False
  884. p = MagicMock()
  885. get_ambari_properties_mock.return_value = p
  886. p.__getitem__.side_effect = KeyError("test exception")
  887. try:
  888. ambari_server.download_jdk(args)
  889. self.fail("Should throw exception")
  890. except FatalException:
  891. # Expected
  892. pass
  893. p.__getitem__.return_value = "somewhere"
  894. p.__getitem__.side_effect = None
  895. path_existsMock.return_value = False
  896. run_os_command_mock.return_value = (0, "Wrong out", None)
  897. try:
  898. ambari_server.download_jdk(args)
  899. self.fail("Should throw exception")
  900. except FatalException:
  901. # Expected
  902. pass
  903. ambari_server.JDK_INSTALL_DIR = os.getcwd()
  904. get_YN_input_mock.return_value = True
  905. run_os_command_mock.return_value = (0, "Creating jdk-1.2/jre"
  906. "Content-Length: 32000\r\n"
  907. , None)
  908. statResult = MagicMock()
  909. statResult.st_size = 32000
  910. statMock.return_value = statResult
  911. rcode = ambari_server.download_jdk(args)
  912. self.assertEqual(0, rcode)
  913. @patch.object(ambari_server, "run_os_command")
  914. def test_get_postgre_status(self, run_os_command_mock):
  915. run_os_command_mock.return_value = (1, "running", None)
  916. result = ambari_server.get_postgre_status()
  917. self.assertEqual("running", result)
  918. run_os_command_mock.return_value = (1, "wrong", None)
  919. result = ambari_server.get_postgre_status()
  920. self.assertEqual(None, result)
  921. @patch("time.sleep")
  922. @patch("subprocess.Popen")
  923. @patch.object(ambari_server, "run_os_command")
  924. @patch.object(ambari_server, "get_postgre_status")
  925. def test_check_postgre_up(self, get_postgre_status_mock, run_os_command_mock,
  926. popen_mock, sleep_mock):
  927. p = MagicMock()
  928. p.poll.return_value = 0
  929. popen_mock.return_value = p
  930. run_os_command_mock.return_value = (0, None, None)
  931. rcode = ambari_server.check_postgre_up()
  932. self.assertEqual(0, rcode)
  933. p.poll.return_value = 4
  934. get_postgre_status_mock.return_value = None
  935. rcode = ambari_server.check_postgre_up()
  936. self.assertEqual(4, rcode)
  937. @patch("platform.linux_distribution")
  938. @patch("platform.system")
  939. @patch.object(ambari_server, "print_info_msg")
  940. @patch.object(ambari_server, "print_error_msg")
  941. @patch.object(ambari_server, "get_ambari_properties")
  942. @patch.object(ambari_server, "write_property")
  943. @patch.object(ambari_server, "get_conf_dir")
  944. def test_configure_os_settings(self, get_conf_dir_mock, write_property_mock, get_ambari_properties_mock,
  945. print_error_msg_mock, print_info_msg_mock,
  946. systemMock, distMock):
  947. get_ambari_properties_mock.return_value = -1
  948. rcode = ambari_server.configure_os_settings()
  949. self.assertEqual(-1, rcode)
  950. p = MagicMock()
  951. p[ambari_server.OS_TYPE_PROPERTY] = 'somevalue'
  952. get_ambari_properties_mock.return_value = p
  953. rcode = ambari_server.configure_os_settings()
  954. self.assertEqual(0, rcode)
  955. p.__getitem__.return_value = ""
  956. systemMock.return_value = "NonLinux"
  957. rcode = ambari_server.configure_os_settings()
  958. self.assertEqual(-1, rcode)
  959. systemMock.return_value = "Linux"
  960. distMock.return_value = ("CentOS", "6.3", None)
  961. rcode = ambari_server.configure_os_settings()
  962. self.assertEqual(0, rcode)
  963. self.assertTrue(write_property_mock.called)
  964. @patch("__builtin__.open")
  965. @patch.object(ambari_server, "Properties")
  966. @patch.object(ambari_server, "search_file")
  967. @patch.object(ambari_server, "get_conf_dir")
  968. def test_get_JAVA_HOME(self, get_conf_dir_mock, search_file_mock,
  969. Properties_mock, openMock):
  970. openMock.side_effect = Exception("exception")
  971. result = ambari_server.get_JAVA_HOME()
  972. self.assertEqual(None, result)
  973. expected = os.path.dirname(__file__)
  974. p = MagicMock()
  975. p.__getitem__.return_value = expected
  976. openMock.side_effect = None
  977. Properties_mock.return_value = p
  978. result = ambari_server.get_JAVA_HOME()
  979. self.assertEqual(expected, result)
  980. @patch("glob.glob")
  981. @patch.object(ambari_server, "get_JAVA_HOME")
  982. def test_find_jdk(self, get_JAVA_HOME_mock, globMock):
  983. get_JAVA_HOME_mock.return_value = "somewhere"
  984. result = ambari_server.find_jdk()
  985. self.assertEqual("somewhere", result)
  986. get_JAVA_HOME_mock.return_value = None
  987. globMock.return_value = []
  988. result = ambari_server.find_jdk()
  989. self.assertEqual(None, result)
  990. globMock.return_value = ["one", "two"]
  991. result = ambari_server.find_jdk()
  992. self.assertNotEqual(None, result)
  993. @patch.object(ambari_server, "configure_os_settings")
  994. @patch.object(ambari_server, "download_jdk")
  995. @patch.object(ambari_server, "configure_postgres")
  996. @patch.object(ambari_server, "setup_db")
  997. @patch.object(ambari_server, "check_postgre_up")
  998. @patch.object(ambari_server, "check_iptables")
  999. @patch.object(ambari_server, "check_ambari_user")
  1000. @patch.object(ambari_server, "check_jdbc_drivers")
  1001. @patch.object(ambari_server, "check_selinux")
  1002. @patch.object(ambari_server, "setup_remote_db")
  1003. @patch.object(ambari_server, "store_remote_properties")
  1004. @patch.object(ambari_server, "is_root")
  1005. def test_setup(self, is_root_mock, store_remote_properties_mock, setup_remote_db_mock, check_selinux_mock,
  1006. check_jdbc_drivers_mock, check_ambari_user_mock, check_iptables_mock,
  1007. check_postgre_up_mock, setup_db_mock, configure_postgres_mock,
  1008. download_jdk_mock, configure_os_settings_mock, ):
  1009. args = MagicMock()
  1010. # Testing call under non-root
  1011. is_root_mock.return_value = False
  1012. try:
  1013. ambari_server.setup(args)
  1014. self.fail("Should throw exception")
  1015. except FatalException as fe:
  1016. # Expected
  1017. self.assertTrue("root-level" in fe.reason)
  1018. pass
  1019. # Testing calls under root
  1020. is_root_mock.return_value = True
  1021. check_selinux_mock.return_value = 0
  1022. check_ambari_user_mock.return_value = 0
  1023. check_jdbc_drivers_mock.return_value = 0
  1024. check_iptables_mock.return_value = (0, "other")
  1025. check_postgre_up_mock.return_value = 0
  1026. setup_db_mock.return_value = 0
  1027. setup_remote_db_mock.return_value = 0
  1028. configure_postgres_mock.return_value = 0
  1029. download_jdk_mock.return_value = 0
  1030. configure_os_settings_mock.return_value = 0
  1031. store_remote_properties_mock.return_value = 0
  1032. result = ambari_server.setup(args)
  1033. self.assertEqual(None, result)
  1034. self.assertTrue(check_ambari_user_mock.called)
  1035. @patch.object(ambari_server, "get_YN_input")
  1036. @patch.object(ambari_server, "setup_db")
  1037. @patch.object(ambari_server, "print_info_msg")
  1038. @patch.object(ambari_server, "run_os_command")
  1039. @patch.object(ambari_server, "configure_database_username_password")
  1040. @patch.object(ambari_server, "parse_properties_file")
  1041. @patch.object(ambari_server, "is_root")
  1042. def test_reset(self, is_root_mock, parse_properties_file_mock, configure_database_username_password_mock,
  1043. run_os_command_mock, print_info_msg_mock,
  1044. setup_db_mock, get_YN_inputMock):
  1045. parse_properties_file_mock.return_value = 0
  1046. args = MagicMock()
  1047. args.persistence_type = "local"
  1048. get_YN_inputMock.return_value = False
  1049. # Testing call under non-root
  1050. is_root_mock.return_value = False
  1051. try:
  1052. ambari_server.reset(args)
  1053. self.fail("Should throw exception")
  1054. except FatalException as fe:
  1055. # Expected
  1056. self.assertTrue("root-level" in fe.reason)
  1057. pass
  1058. # Testing calls under root
  1059. is_root_mock.return_value = True
  1060. try:
  1061. ambari_server.reset(args)
  1062. self.fail("Should throw exception")
  1063. except FatalException as fe:
  1064. # Expected
  1065. self.assertFalse("root-level" in fe.reason)
  1066. pass
  1067. get_YN_inputMock.return_value = True
  1068. run_os_command_mock.return_value = (1, None, None)
  1069. try:
  1070. ambari_server.reset(args)
  1071. self.fail("Should throw exception")
  1072. except FatalException:
  1073. # Expected
  1074. pass
  1075. run_os_command_mock.return_value = (0, None, None)
  1076. ambari_server.reset(args)
  1077. self.assertTrue(setup_db_mock.called)
  1078. @patch.object(ambari_server, "setup_db")
  1079. @patch.object(ambari_server, "print_info_msg")
  1080. @patch.object(ambari_server, "run_os_command")
  1081. @patch.object(ambari_server, "parse_properties_file")
  1082. @patch.object(ambari_server, "is_root")
  1083. def test_silent_reset(self, is_root_mock, parse_properties_file_mock,
  1084. run_os_command_mock, print_info_msg_mock,
  1085. setup_db_mock):
  1086. is_root_mock.return_value = True
  1087. args = MagicMock()
  1088. ambari_server.SILENT = True
  1089. self.assertTrue(ambari_server.SILENT)
  1090. run_os_command_mock.return_value = (0, None, None)
  1091. def signal_handler(signum, frame):
  1092. self.fail("Timed out!")
  1093. signal.signal(signal.SIGALRM, signal_handler)
  1094. signal.alarm(5)
  1095. rcode = ambari_server.reset(args)
  1096. self.assertEqual(None, rcode)
  1097. self.assertTrue(setup_db_mock.called)
  1098. @patch.object(ambari_server, 'save_master_key')
  1099. @patch('os.chmod', autospec=True)
  1100. @patch.object(ambari_server, 'get_validated_string_input')
  1101. @patch("os.environ")
  1102. @patch.object(ambari_server, "get_ambari_properties")
  1103. @patch("os.kill")
  1104. @patch("os.path.exists")
  1105. @patch("__builtin__.open")
  1106. @patch("subprocess.Popen")
  1107. @patch.object(ambari_server, "print_info_msg")
  1108. @patch.object(ambari_server, "search_file")
  1109. @patch.object(ambari_server, "find_jdk")
  1110. @patch.object(ambari_server, "print_error_msg")
  1111. @patch.object(ambari_server, "check_postgre_up")
  1112. @patch.object(ambari_server, "check_iptables")
  1113. @patch.object(ambari_server, "parse_properties_file")
  1114. @patch.object(ambari_server, "read_ambari_user")
  1115. @patch.object(ambari_server, "is_root")
  1116. @patch("getpass.getuser")
  1117. @patch("os.chdir")
  1118. def test_start(self, chdir_mock, getuser_mock, is_root_mock, read_ambari_user_mock,
  1119. parse_properties_file_mock, check_iptables_mock, check_postgre_up_mock,
  1120. print_error_msg_mock, find_jdk_mock, search_file_mock,
  1121. print_info_msg_mock, popenMock, openMock, pexistsMock,
  1122. killMock, get_ambari_properties_mock, os_environ_mock,
  1123. get_validated_string_input_method, os_chmod_method,
  1124. save_master_key_method):
  1125. args = MagicMock()
  1126. f = MagicMock()
  1127. f.readline.return_value = 42
  1128. openMock.return_value = f
  1129. get_ambari_properties_mock.return_value = \
  1130. {ambari_server.SECURITY_KEY_IS_PERSISTED : "True"}
  1131. # Checking "server is running"
  1132. pexistsMock.return_value = True
  1133. try:
  1134. ambari_server.start(args)
  1135. self.fail("Should fail with 'Server is running'")
  1136. except FatalException:
  1137. # Expected
  1138. pass
  1139. self.assertTrue(killMock.called)
  1140. pexistsMock.return_value = False
  1141. # Checking situation when ambari user is not set up
  1142. read_ambari_user_mock.return_value = None
  1143. try:
  1144. ambari_server.start(args)
  1145. self.fail("Should fail with 'Can not detect a system user for Ambari'")
  1146. except FatalException as e:
  1147. # Expected
  1148. self.assertTrue('Can not detect a system user' in e.reason)
  1149. # Checking start from non-root when current user is not the same as a
  1150. # custom user
  1151. read_ambari_user_mock.return_value = "dummy-user"
  1152. getuser_mock.return_value = "non_custom_user"
  1153. is_root_mock.return_value = False
  1154. try:
  1155. ambari_server.start(args)
  1156. self.fail("Should fail with 'Can not start ambari-server as user...'")
  1157. except FatalException as e:
  1158. # Expected
  1159. self.assertTrue('Can not start ambari-server as user' in e.reason)
  1160. # Checking "jdk not found"
  1161. is_root_mock.return_value = True
  1162. find_jdk_mock.return_value = None
  1163. try:
  1164. ambari_server.start(args)
  1165. self.fail("Should fail with 'No JDK found'")
  1166. except FatalException as e:
  1167. # Expected
  1168. self.assertTrue('No JDK found' in e.reason)
  1169. find_jdk_mock.return_value = "somewhere"
  1170. ## Testing workflow under root
  1171. is_root_mock.return_value = True
  1172. # Remote DB
  1173. args.persistence_type="remote"
  1174. check_iptables_mock.return_value = (0, None)
  1175. try:
  1176. ambari_server.start(args)
  1177. except FatalException as e:
  1178. # Ignored
  1179. pass
  1180. self.assertFalse('Unable to start PostgreSQL server' in e.reason)
  1181. self.assertFalse(check_postgre_up_mock.called)
  1182. check_postgre_up_mock.reset_mock()
  1183. # Local DB
  1184. args.persistence_type="local"
  1185. # case: postgres failed to start
  1186. check_postgre_up_mock.return_value = 1
  1187. try:
  1188. ambari_server.start(args)
  1189. self.fail("Should fail with 'Unable to start PostgreSQL server'")
  1190. except FatalException as e:
  1191. # Expected
  1192. self.assertTrue('Unable to start PostgreSQL server' in e.reason)
  1193. self.assertTrue(check_postgre_up_mock.called)
  1194. # case: iptables failed to stop
  1195. check_postgre_up_mock.return_value = 0
  1196. check_iptables_mock.return_value = (1, ambari_server.IP_TBLS_ENABLED)
  1197. try:
  1198. ambari_server.start(args)
  1199. self.fail("Should fail with 'Failed to stop iptables'")
  1200. except FatalException as e:
  1201. # Expected
  1202. self.assertTrue('Failed to stop iptables' in e.reason)
  1203. check_iptables_mock.return_value = (0, None)
  1204. # Case: custom user is "root"
  1205. read_ambari_user_mock.return_value = "root"
  1206. ambari_server.start(args)
  1207. self.assertTrue(popenMock.called)
  1208. popen_arg = popenMock.call_args[0][0]
  1209. self.assertTrue(popen_arg[0] == "/bin/sh")
  1210. popenMock.reset_mock()
  1211. # Case: custom user is not "root"
  1212. read_ambari_user_mock.return_value = "not-root-user"
  1213. ambari_server.start(args)
  1214. self.assertTrue(chdir_mock.called)
  1215. self.assertTrue(popenMock.called)
  1216. popen_arg = popenMock.call_args[0][0]
  1217. self.assertTrue(popen_arg[0] == "/bin/su")
  1218. check_postgre_up_mock.reset_mock()
  1219. popenMock.reset_mock()
  1220. ## Testing workflow under non-root
  1221. is_root_mock.return_value = False
  1222. read_ambari_user_mock.return_value = "not-root-user"
  1223. getuser_mock.return_value = read_ambari_user_mock.return_value
  1224. # Local DB
  1225. args.persistence_type="local"
  1226. ambari_server.start(args)
  1227. self.assertFalse(check_postgre_up_mock.called)
  1228. # Remote DB
  1229. args.persistence_type="remote"
  1230. ambari_server.start(args)
  1231. self.assertFalse(check_postgre_up_mock.called)
  1232. # Checking call
  1233. check_iptables_mock.reset_mock()
  1234. check_iptables_mock.return_value = (0, None)
  1235. ambari_server.start(args)
  1236. self.assertTrue(popenMock.called)
  1237. popen_arg = popenMock.call_args[0][0]
  1238. self.assertTrue(popen_arg[0] == "/bin/sh")
  1239. self.assertFalse(check_iptables_mock.called)
  1240. # Test start under wrong user
  1241. read_ambari_user_mock.return_value = "not-root-user"
  1242. getuser_mock.return_value = "non_custom_user"
  1243. try:
  1244. ambari_server.start(args)
  1245. self.fail("Can not start ambari-server as user non_custom_user.")
  1246. except FatalException as e:
  1247. # Expected
  1248. self.assertTrue('Can not start ambari-server as user' in e.reason)
  1249. # Check environ master key is set
  1250. popenMock.reset_mock()
  1251. get_ambari_properties_mock.return_value = \
  1252. {ambari_server.SECURITY_KEY_IS_PERSISTED : "False"}
  1253. os_environ_mock.copy.return_value = {"a" : "b",
  1254. ambari_server.SECURITY_KEY_ENV_VAR_NAME : "masterkey"}
  1255. args.persistence_type="local"
  1256. read_ambari_user_mock.return_value = "root"
  1257. is_root_mock.return_value = True
  1258. ambari_server.start(args)
  1259. self.assertFalse(get_validated_string_input_method.called)
  1260. self.assertFalse(save_master_key_method.called)
  1261. popen_arg = popenMock.call_args[1]['env']
  1262. self.assertEquals(os_environ_mock.copy.return_value, popen_arg)
  1263. # Check environ master key is not set
  1264. popenMock.reset_mock()
  1265. os_environ_mock.reset_mock()
  1266. get_ambari_properties_mock.return_value = \
  1267. {ambari_server.SECURITY_KEY_IS_PERSISTED : "False"}
  1268. os_environ_mock.copy.return_value = {"a" : "b"}
  1269. args.persistence_type="local"
  1270. read_ambari_user_mock.return_value = "root"
  1271. is_root_mock.return_value = True
  1272. get_validated_string_input_method.return_value = "masterkey"
  1273. os_chmod_method.return_value = None
  1274. ambari_server.start(args)
  1275. self.assertTrue(get_validated_string_input_method.called)
  1276. self.assertTrue(save_master_key_method.called)
  1277. popen_arg = popenMock.call_args[1]['env']
  1278. self.assertEquals(os_environ_mock.copy.return_value, popen_arg)
  1279. @patch("__builtin__.open")
  1280. @patch("os.path.exists")
  1281. @patch("os.remove")
  1282. @patch("os.killpg")
  1283. @patch("os.getpgid")
  1284. @patch.object(ambari_server, "print_info_msg")
  1285. def test_stop(self, print_info_msg_mock, gpidMock, removeMock,
  1286. killMock, pexistsMock, openMock):
  1287. pexistsMock.return_value = True
  1288. f = MagicMock()
  1289. f.readline.return_value = "42"
  1290. openMock.return_value = f
  1291. ambari_server.stop(None)
  1292. self.assertTrue(f.readline.called)
  1293. self.assertTrue(killMock.called)
  1294. self.assertTrue(killMock.called)
  1295. self.assertTrue(f.close.called)
  1296. self.assertTrue(removeMock.called)
  1297. @patch.object(ambari_server, "configure_database_username_password")
  1298. @patch.object(ambari_server, "run_os_command")
  1299. @patch.object(ambari_server, "is_root")
  1300. def test_upgrade_stack(self, is_root_mock, run_os_command_mock,
  1301. configure_postgres_username_password_mock):
  1302. args = MagicMock()
  1303. # Testing call under non-root
  1304. is_root_mock.return_value = False
  1305. try:
  1306. ambari_server.upgrade_stack(args, 'HDP-2.0')
  1307. self.fail("Should throw exception")
  1308. except FatalException as fe:
  1309. # Expected
  1310. self.assertTrue("root-level" in fe.reason)
  1311. pass
  1312. # Testing calls under root
  1313. is_root_mock.return_value = True
  1314. run_os_command_mock.return_value = (0, '', '')
  1315. ambari_server.upgrade_stack(args, 'HDP-2.0')
  1316. self.assertTrue(configure_postgres_username_password_mock.called)
  1317. self.assertTrue(run_os_command_mock.called)
  1318. @patch.object(ambari_server, "adjust_directory_permissions")
  1319. @patch.object(ambari_server, "print_warning_msg")
  1320. @patch.object(ambari_server, "read_ambari_user")
  1321. @patch.object(ambari_server, "check_db_consistency")
  1322. @patch.object(ambari_server, "execute_db_script")
  1323. @patch.object(ambari_server, "check_postgre_up")
  1324. @patch.object(ambari_server, "update_ambari_properties")
  1325. @patch.object(ambari_server, "parse_properties_file")
  1326. @patch.object(ambari_server, "is_root")
  1327. def test_upgrade(self, is_root_mock, parse_properties_file_mock, update_ambari_properties_mock,
  1328. check_postgre_up_mock, execute_db_script_mock,
  1329. check_db_consistency_mock, read_ambari_user_mock,
  1330. print_warning_msg_mock, adjust_directory_permissions_mock):
  1331. args = MagicMock()
  1332. args.upgrade_script_file = "/var/lib/"\
  1333. "ambari-server/resources/upgrade/ddl/"\
  1334. "Ambari-DDL-Postgres-UPGRADE-1.3.0.sql"
  1335. update_ambari_properties_mock.return_value = 0
  1336. check_postgre_up_mock.return_value = 0
  1337. execute_db_script_mock.return_value = 0
  1338. check_db_consistency_mock.return_value = 0
  1339. # Testing call under non-root
  1340. is_root_mock.return_value = False
  1341. try:
  1342. ambari_server.upgrade(args)
  1343. self.fail("Should throw exception")
  1344. except FatalException as fe:
  1345. # Expected
  1346. self.assertTrue("root-level" in fe.reason)
  1347. pass
  1348. # Testing calls under root
  1349. is_root_mock.return_value = True
  1350. # Testing with undefined custom user
  1351. read_ambari_user_mock.return_value = None
  1352. ambari_server.upgrade(args)
  1353. self.assertTrue(print_warning_msg_mock.called)
  1354. warning_args = print_warning_msg_mock.call_args[0][0]
  1355. self.assertTrue("custom ambari user" in warning_args)
  1356. # Testing with defined custom user
  1357. read_ambari_user_mock.return_value = "ambari-custom-user"
  1358. ambari_server.upgrade(args)
  1359. self.assertTrue(adjust_directory_permissions_mock.called)
  1360. def test_print_info_msg(self):
  1361. out = StringIO.StringIO()
  1362. sys.stdout = out
  1363. ambari_server.VERBOSE = True
  1364. ambari_server.print_info_msg("msg")
  1365. self.assertNotEqual("", out.getvalue())
  1366. sys.stdout = sys.__stdout__
  1367. def test_print_error_msg(self):
  1368. out = StringIO.StringIO()
  1369. sys.stdout = out
  1370. ambari_server.VERBOSE = True
  1371. ambari_server.print_error_msg("msg")
  1372. self.assertNotEqual("", out.getvalue())
  1373. sys.stdout = sys.__stdout__
  1374. def test_print_warning_msg(self):
  1375. out = StringIO.StringIO()
  1376. sys.stdout = out
  1377. ambari_server.VERBOSE = True
  1378. ambari_server.print_warning_msg("msg")
  1379. self.assertNotEqual("", out.getvalue())
  1380. sys.stdout = sys.__stdout__
  1381. @patch.object(ambari_server, "get_choice_string_input")
  1382. def test_get_YN_input(self, get_choice_string_input_mock):
  1383. ambari_server.get_YN_input("prompt", "default")
  1384. self.assertTrue(get_choice_string_input_mock.called)
  1385. self.assertEqual(4, len(get_choice_string_input_mock.call_args_list[0][0]))
  1386. @patch.object(ambari_server, "get_conf_dir")
  1387. def test_update_ambari_properties(self, get_conf_dir_mock):
  1388. properties = ["server.jdbc.user.name=ambari-server\n",
  1389. "server.jdbc.user.passwd=/etc/ambari-server/conf/password.dat\n",
  1390. "java.home=/usr/jdk64/jdk1.6.0_31\n",
  1391. "server.os_type=redhat6\n",
  1392. "ambari.user=ambari\n"]
  1393. NEW_PROPERTY = 'some_new_property=some_value\n'
  1394. CHANGED_VALUE_PROPERTY = 'server.os_type=should_not_overwrite_value\n'
  1395. get_conf_dir_mock.return_value = '/etc/ambari-server/conf'
  1396. (tf1, fn1) = tempfile.mkstemp()
  1397. (tf2, fn2) = tempfile.mkstemp()
  1398. ambari_server.AMBARI_PROPERTIES_RPMSAVE_FILE = fn1
  1399. ambari_server.AMBARI_PROPERTIES_FILE = fn2
  1400. with open(ambari_server.AMBARI_PROPERTIES_FILE, "w") as f:
  1401. f.write(NEW_PROPERTY)
  1402. f.write(CHANGED_VALUE_PROPERTY)
  1403. with open(ambari_server.AMBARI_PROPERTIES_RPMSAVE_FILE, 'w') as f:
  1404. for line in properties:
  1405. f.write(line)
  1406. #Call tested method
  1407. ambari_server.update_ambari_properties()
  1408. timestamp = datetime.datetime.now()
  1409. #RPMSAVE_FILE wasn't found
  1410. self.assertFalse(os.path.exists(ambari_server.AMBARI_PROPERTIES_RPMSAVE_FILE))
  1411. #Renamed RPMSAVE_FILE exists
  1412. self.assertTrue(os.path.exists(ambari_server.AMBARI_PROPERTIES_RPMSAVE_FILE
  1413. + '.' + timestamp.strftime('%Y%m%d%H%M%S')))
  1414. with open(ambari_server.AMBARI_PROPERTIES_FILE, 'r') as f:
  1415. ambari_properties_content = f.readlines()
  1416. for line in properties:
  1417. if not line in ambari_properties_content:
  1418. self.fail()
  1419. if not NEW_PROPERTY in ambari_properties_content:
  1420. self.fail()
  1421. if CHANGED_VALUE_PROPERTY in ambari_properties_content:
  1422. self.fail()
  1423. # Command should not fail if *.rpmsave file is missing
  1424. result = ambari_server.update_ambari_properties()
  1425. self.assertEquals(result, 0)
  1426. os.unlink(fn2)
  1427. #if ambari.properties file is absent then "ambari-server upgrade" should
  1428. # fail
  1429. (tf, fn) = tempfile.mkstemp()
  1430. ambari_server.AMBARI_PROPERTIES_RPMSAVE_FILE = fn
  1431. result = ambari_server.update_ambari_properties()
  1432. self.assertNotEquals(result, 0)
  1433. @patch("sys.exit")
  1434. @patch.object(ambari_server, "get_db_cli_tool")
  1435. @patch.object(ambari_server, "store_remote_properties")
  1436. @patch.object(ambari_server, "is_local_database")
  1437. @patch.object(ambari_server, "check_iptables")
  1438. @patch.object(ambari_server, "check_jdbc_drivers")
  1439. @patch.object(ambari_server, "is_root")
  1440. @patch.object(ambari_server, "check_ambari_user")
  1441. @patch.object(ambari_server, "download_jdk")
  1442. @patch.object(ambari_server, "configure_os_settings")
  1443. def test_setup_remote_db_wo_client(self, configure_os_settings_mock, download_jdk_mock, check_ambari_user_mock, is_root_mock, check_jdbc_drivers_mock, check_iptables_mock, is_local_db_mock,
  1444. store_remote_properties_mock, get_db_cli_tool_mock, exit_mock):
  1445. args = MagicMock()
  1446. is_root_mock.return_value = True
  1447. is_local_db_mock.return_value = False
  1448. check_iptables_mock.return_value = (0, "other")
  1449. store_remote_properties_mock.return_value = 0
  1450. get_db_cli_tool_mock.return_value = None
  1451. check_jdbc_drivers_mock.return_value=0
  1452. check_ambari_user_mock.return_value = 0
  1453. download_jdk_mock.return_value = 0
  1454. configure_os_settings_mock.return_value = 0
  1455. try:
  1456. ambari_server.setup(args)
  1457. self.fail("Should throw exception")
  1458. except FatalException as fe:
  1459. # Expected
  1460. self.assertTrue("The cli was not found" in fe.reason)
  1461. @patch.object(ambari_server, "parse_properties_file")
  1462. @patch.object(ambari_server, "get_db_cli_tool")
  1463. @patch.object(ambari_server, "print_error_msg")
  1464. @patch.object(ambari_server, "get_YN_input")
  1465. @patch.object(ambari_server, "setup_db")
  1466. @patch.object(ambari_server, "run_os_command")
  1467. @patch.object(ambari_server, "is_root")
  1468. def test_reset_remote_db_wo_client(self, is_root_mock, run_os_command_mock, setup_db_mock,
  1469. get_YN_inputMock, print_error_msg_mock, get_db_cli_tool_mock, parse_properties_file_mock):
  1470. args = MagicMock()
  1471. get_YN_inputMock.return_value = True
  1472. run_os_command_mock.return_value = (0, None, None)
  1473. args.persistence_type="remote"
  1474. get_db_cli_tool_mock.return_value = None
  1475. is_root_mock.return_value = True
  1476. try:
  1477. ambari_server.reset(args)
  1478. self.fail("Should throw exception")
  1479. except FatalException as fe:
  1480. # Expected
  1481. self.assertTrue("Client wasn't found" in fe.reason)
  1482. pass
  1483. @patch.object(ambari_server, "get_ambari_properties")
  1484. @patch.object(ambari_server, "find_jdbc_driver")
  1485. @patch.object(ambari_server, "copy_files")
  1486. @patch('__builtin__.raw_input')
  1487. def test_check_jdbc_drivers(self, raw_input_mock, copy_files_mock, find_jdbc_driver_mock, get_ambari_properties_mock):
  1488. args = MagicMock()
  1489. # Check positive scenario
  1490. drivers_list = ['driver_file']
  1491. resources_dir = '/tmp'
  1492. get_ambari_properties_mock.return_value = {ambari_server.RESOURCES_DIR_PROPERTY : resources_dir}
  1493. find_jdbc_driver_mock.return_value = drivers_list
  1494. rcode = ambari_server.check_jdbc_drivers(args)
  1495. self.assertEqual(0, rcode)
  1496. copy_files_mock.assert_called_with(drivers_list, resources_dir)
  1497. #Check negative scenario
  1498. find_jdbc_driver_mock.return_value = -1
  1499. args.database = "oracle"
  1500. rcode = ambari_server.check_jdbc_drivers(args)
  1501. self.assertEqual(0, rcode)
  1502. #Ensure user was asked to provide drivers
  1503. self.assertTrue(raw_input_mock.called)
  1504. @patch.object(ambari_server, "find_properties_file")
  1505. def test_get_ambari_properties(self, find_properties_file_mock):
  1506. find_properties_file_mock.return_value = None
  1507. rcode = ambari_server.get_ambari_properties()
  1508. self.assertEqual(rcode, -1)
  1509. tf1 = tempfile.NamedTemporaryFile()
  1510. find_properties_file_mock.return_value = tf1.name
  1511. prop_name='name'
  1512. prop_value='val'
  1513. with open(tf1.name, 'w') as fout:
  1514. fout.write(prop_name + '=' + prop_value)
  1515. fout.close()
  1516. properties = ambari_server.get_ambari_properties()
  1517. self.assertEqual(properties[prop_name], prop_value)
  1518. @patch.object(ambari_server, "get_ambari_properties")
  1519. @patch.object(ambari_server, "find_jdbc_driver")
  1520. @patch.object(ambari_server, "copy_files")
  1521. @patch.object(ambari_server, "print_error_msg")
  1522. @patch.object(ambari_server, "print_warning_msg")
  1523. @patch('__builtin__.raw_input')
  1524. @patch("sys.exit")
  1525. def check_jdbc_drivers(self, exit_mock, raw_input_mock, print_warning_msg, print_error_msg_mock, copy_files_mock,
  1526. find_jdbc_driver_mock, get_ambari_properties_mock):
  1527. out = StringIO.StringIO()
  1528. sys.stdout = out
  1529. args = MagicMock()
  1530. # Check positive scenario
  1531. drivers_list = ['driver_file']
  1532. resources_dir = '/tmp'
  1533. get_ambari_properties_mock.return_value = {ambari_server.RESOURCES_DIR_PROPERTY : resources_dir}
  1534. find_jdbc_driver_mock.return_value = drivers_list
  1535. args.database = "oracle"
  1536. rcode = ambari_server.check_jdbc_drivers(args)
  1537. self.assertEqual(0, rcode)
  1538. copy_files_mock.assert_called_with(drivers_list, resources_dir)
  1539. # Check negative scenarios
  1540. # Silent option, no drivers
  1541. ambari_server.SILENT = True
  1542. find_jdbc_driver_mock.return_value = -1
  1543. rcode = ambari_server.check_jdbc_drivers(args)
  1544. self.assertTrue(print_error_msg_mock.called)
  1545. self.assertTrue(exit_mock.called)
  1546. # Non-Silent option, no drivers
  1547. ambari_server.SILENT = False
  1548. find_jdbc_driver_mock.return_value = -1
  1549. rcode = ambari_server.check_jdbc_drivers(args)
  1550. self.assertTrue(exit_mock.called)
  1551. self.assertTrue(print_error_msg_mock.called)
  1552. # Non-Silent option, no drivers at first ask, present drivers after that
  1553. find_jdbc_driver_mock.side_effect = [-1, drivers_list]
  1554. rcode = ambari_server.check_jdbc_drivers(args)
  1555. self.assertEqual(0, rcode)
  1556. copy_files_mock.assert_called_with(drivers_list, resources_dir)
  1557. # Non-Silent option, no drivers at first ask, present drivers after that
  1558. find_jdbc_driver_mock.reset()
  1559. find_jdbc_driver_mock.side_effect = [-1, -1]
  1560. rcode = ambari_server.check_jdbc_drivers(args)
  1561. self.assertTrue(exit_mock.called)
  1562. self.assertTrue(print_error_msg_mock.called)
  1563. sys.stdout = sys.__stdout__
  1564. @patch.object(ambari_server, "find_properties_file")
  1565. def test_get_ambari_properties(self, find_properties_file):
  1566. find_properties_file.return_value = None
  1567. rcode = ambari_server.get_ambari_properties()
  1568. self.assertEqual(rcode, -1)
  1569. tf1 = tempfile.NamedTemporaryFile()
  1570. find_properties_file.return_value = tf1.name
  1571. prop_name='name'
  1572. prop_value='val'
  1573. with open(tf1.name, 'w') as fout:
  1574. fout.write(prop_name + '=' + prop_value)
  1575. fout.close()
  1576. properties = ambari_server.get_ambari_properties()
  1577. self.assertEqual(properties[prop_name], prop_value)
  1578. self.assertEqual(properties.fileName, os.path.abspath(tf1.name))
  1579. sys.stdout = sys.__stdout__
  1580. @patch.object(ambari_server, "search_file")
  1581. def test_parse_properties_file(self, search_file_mock):
  1582. tf1 = tempfile.NamedTemporaryFile(mode='r')
  1583. search_file_mock.return_value = tf1.name
  1584. args = MagicMock()
  1585. ambari_server.parse_properties_file(args)
  1586. self.assertEquals(args.persistence_type, "local")
  1587. with open(tf1.name, 'w') as fout:
  1588. fout.write("\n")
  1589. fout.write(ambari_server.PERSISTENCE_TYPE_PROPERTY+"=remote")
  1590. args = MagicMock()
  1591. ambari_server.parse_properties_file(args)
  1592. self.assertEquals(args.persistence_type, "remote")
  1593. @patch.object(ambari_server, 'setup_master_key')
  1594. @patch.object(ambari_server, 'read_passwd_for_alias')
  1595. @patch.object(ambari_server, 'is_alias_string')
  1596. @patch.object(ambari_server, 'get_ambari_properties')
  1597. def test_configure_database_username_password_masterkey_persisted(self,
  1598. get_ambari_properties_method, is_alias_string_method,
  1599. read_passwd_for_alias_method, setup_master_key_method):
  1600. out = StringIO.StringIO()
  1601. sys.stdout = out
  1602. configs = {ambari_server.JDBC_USER_NAME_PROPERTY: "fakeuser",
  1603. ambari_server.JDBC_PASSWORD_PROPERTY: "${alias=somealias}",
  1604. ambari_server.SECURITY_KEY_IS_PERSISTED: "True" }
  1605. get_ambari_properties_method.return_value = configs
  1606. is_alias_string_method.return_value = True
  1607. read_passwd_for_alias_method.return_value = "falepasswd"
  1608. args = MagicMock()
  1609. ambari_server.configure_database_username_password(args)
  1610. self.assertTrue(read_passwd_for_alias_method.called)
  1611. self.assertTrue(is_alias_string_method.called)
  1612. self.assertEquals("fakeuser", args.database_username)
  1613. self.assertEquals("falepasswd", args.database_password)
  1614. configs[ambari_server.SECURITY_KEY_IS_PERSISTED] = "False"
  1615. get_ambari_properties_method.return_value = configs
  1616. args.reset_mock()
  1617. setup_master_key_method.return_value = (None, True, True)
  1618. ambari_server.configure_database_username_password(args)
  1619. self.assertTrue(setup_master_key_method.called)
  1620. read_passwd_for_alias_method.assert_called_with(
  1621. ambari_server.JDBC_RCA_PASSWORD_ALIAS, None)
  1622. sys.stdout = sys.__stdout__
  1623. @patch.object(ambari_server, 'save_passwd_for_alias')
  1624. @patch.object(ambari_server, 'read_password')
  1625. def test_configure_database_password(self, read_password_method,
  1626. save_passwd_for_alias_method):
  1627. out = StringIO.StringIO()
  1628. sys.stdout = out
  1629. read_password_method.return_value = "fakepasswd"
  1630. save_passwd_for_alias_method.return_value = 0
  1631. result = ambari_server.configure_database_password(True, None, True)
  1632. self.assertTrue(save_passwd_for_alias_method.called)
  1633. self.assertTrue(read_password_method.called)
  1634. save_passwd_for_alias_method.assert_called_with(ambari_server
  1635. .JDBC_RCA_PASSWORD_ALIAS, "fakepasswd", None)
  1636. self.assertEquals(("fakepasswd", ambari_server.get_alias_string(
  1637. ambari_server.JDBC_RCA_PASSWORD_ALIAS)), result)
  1638. save_passwd_for_alias_method.reset_mock()
  1639. result = ambari_server.configure_database_password(False, None, True)
  1640. self.assertFalse(save_passwd_for_alias_method.called)
  1641. self.assertEquals(("fakepasswd", None), result)
  1642. save_passwd_for_alias_method.reset_mock()
  1643. save_passwd_for_alias_method.return_value = -1
  1644. result = ambari_server.configure_database_password(True, None, True)
  1645. self.assertEquals(("fakepasswd", None), result)
  1646. sys.stdout = sys.__stdout__
  1647. @patch.object(ambari_server, 'update_properties')
  1648. @patch.object(ambari_server, 'save_master_key')
  1649. @patch.object(ambari_server, 'get_validated_string_input')
  1650. @patch.object(ambari_server, 'get_YN_input')
  1651. @patch.object(ambari_server, 'get_ambari_properties')
  1652. def test_setup_master_key_persist(self, get_ambari_properties_method,
  1653. get_YN_input_method, get_validated_string_input_method,
  1654. save_master_key_method, update_properties_method):
  1655. out = StringIO.StringIO()
  1656. sys.stdout = out
  1657. configs = { ambari_server.SECURITY_MASTER_KEY_LOCATION : "filepath",
  1658. ambari_server.SECURITY_KEYS_DIR : tempfile.gettempdir(),
  1659. ambari_server.SECURITY_KEY_IS_PERSISTED : None }
  1660. get_ambari_properties_method.return_value = configs
  1661. get_YN_input_method.return_value = True
  1662. get_validated_string_input_method.return_value = "aaa"
  1663. save_master_key_method.return_value = None
  1664. update_properties_method.return_value = None
  1665. ambari_server.setup_master_key(False)
  1666. self.assertTrue(get_YN_input_method.called)
  1667. self.assertTrue(get_validated_string_input_method.called)
  1668. self.assertTrue(save_master_key_method.called)
  1669. self.assertTrue(update_properties_method.called)
  1670. sys.stdout = sys.__stdout__
  1671. @patch.object(ambari_server, 'update_properties')
  1672. @patch.object(ambari_server, 'save_master_key')
  1673. @patch.object(ambari_server, 'get_validated_string_input')
  1674. @patch.object(ambari_server, 'get_YN_input')
  1675. @patch.object(ambari_server, 'get_ambari_properties')
  1676. def test_setup_master_key_not_persist(self, get_ambari_properties_method,
  1677. get_YN_input_method, get_validated_string_input_method,
  1678. save_master_key_method, update_properties_method):
  1679. out = StringIO.StringIO()
  1680. sys.stdout = out
  1681. configs = { ambari_server.SECURITY_MASTER_KEY_LOCATION : "filepath",
  1682. ambari_server.SECURITY_KEYS_DIR : tempfile.gettempdir(),
  1683. ambari_server.SECURITY_KEY_IS_PERSISTED : None }
  1684. get_ambari_properties_method.return_value = configs
  1685. get_YN_input_method.side_effect = [True, False]
  1686. get_validated_string_input_method.return_value = "aaa"
  1687. save_master_key_method.return_value = None
  1688. update_properties_method.return_value = None
  1689. ambari_server.setup_master_key(False)
  1690. self.assertTrue(get_YN_input_method.called)
  1691. self.assertTrue(get_validated_string_input_method.called)
  1692. self.assertTrue(update_properties_method.called)
  1693. self.assertFalse(save_master_key_method.called)
  1694. sys.stdout = sys.__stdout__
  1695. @patch.object(ambari_server, 'get_master_key_ispersisted')
  1696. @patch.object(ambari_server, 'update_properties')
  1697. @patch.object(ambari_server, 'save_master_key')
  1698. @patch.object(ambari_server, 'get_validated_string_input')
  1699. @patch.object(ambari_server, 'get_YN_input')
  1700. @patch.object(ambari_server, 'get_ambari_properties')
  1701. @patch.object(ambari_server, 'search_file')
  1702. def test_setup_master_key_already_persisted(self, search_file_message,
  1703. get_ambari_properties_method,
  1704. get_YN_input_method, get_validated_string_input_method,
  1705. save_master_key_method, update_properties_method,
  1706. get_master_key_ispersisted_method):
  1707. out = StringIO.StringIO()
  1708. sys.stdout = out
  1709. configs = { ambari_server.SECURITY_MASTER_KEY_LOCATION : "filepath",
  1710. ambari_server.SECURITY_KEYS_DIR : tempfile.gettempdir(),
  1711. ambari_server.SECURITY_KEY_IS_PERSISTED : "true" }
  1712. get_ambari_properties_method.return_value = configs
  1713. get_master_key_ispersisted_method.return_value = True
  1714. search_file_message.return_value = "filepath"
  1715. ambari_server.setup_master_key(False)
  1716. self.assertFalse(save_master_key_method.called)
  1717. self.assertFalse(get_YN_input_method.called)
  1718. self.assertFalse(get_validated_string_input_method.called)
  1719. self.assertFalse(update_properties_method.called)
  1720. sys.stdout = sys.__stdout__
  1721. @patch.object(ambari_server, 'configure_ldap_password')
  1722. @patch.object(ambari_server, 'configure_database_password')
  1723. @patch.object(ambari_server, 'is_alias_string')
  1724. @patch.object(ambari_server, 'get_master_key_ispersisted')
  1725. @patch.object(ambari_server, 'update_properties')
  1726. @patch.object(ambari_server, 'save_master_key')
  1727. @patch.object(ambari_server, 'get_validated_string_input')
  1728. @patch.object(ambari_server, 'get_YN_input')
  1729. @patch.object(ambari_server, 'search_file')
  1730. @patch.object(ambari_server, 'get_ambari_properties')
  1731. def test_reset_master_key_persisted(self, get_ambari_properties_method,
  1732. search_file_message, get_YN_input_method,
  1733. get_validated_string_input_method, save_master_key_method,
  1734. update_properties_method, get_master_key_ispersisted_method,
  1735. is_alias_string_method, configure_database_password_method,
  1736. configure_ldap_password_method):
  1737. out = StringIO.StringIO()
  1738. sys.stdout = out
  1739. search_file_message.return_value = "filepath"
  1740. configs = { ambari_server.SECURITY_MASTER_KEY_LOCATION : "filepath",
  1741. ambari_server.SECURITY_KEYS_DIR : tempfile.gettempdir(),
  1742. ambari_server.SECURITY_KEY_IS_PERSISTED : "true",
  1743. ambari_server.JDBC_PASSWORD_PROPERTY : "${alias=fakealias}",
  1744. ambari_server.LDAP_MGR_PASSWORD_PROPERTY : "${alias=fakealias}"}
  1745. get_ambari_properties_method.return_value = configs
  1746. get_master_key_ispersisted_method.return_value = True
  1747. get_validated_string_input_method.return_value = "aaa"
  1748. get_YN_input_method.return_value = True
  1749. is_alias_string_method.return_value = True
  1750. ambari_server.reset_master_key()
  1751. self.assertTrue(save_master_key_method.called)
  1752. self.assertTrue(get_YN_input_method.called)
  1753. self.assertTrue(get_validated_string_input_method.called)
  1754. self.assertTrue(update_properties_method.called)
  1755. self.assertTrue(configure_database_password_method.called)
  1756. self.assertTrue(configure_ldap_password_method.called)
  1757. sys.stdout = sys.__stdout__
  1758. @patch.object(ambari_server, 'configure_ldap_password')
  1759. @patch.object(ambari_server, 'configure_database_password')
  1760. @patch.object(ambari_server, 'is_alias_string')
  1761. @patch.object(ambari_server, 'get_master_key_ispersisted')
  1762. @patch.object(ambari_server, 'update_properties')
  1763. @patch.object(ambari_server, 'save_master_key')
  1764. @patch.object(ambari_server, 'get_validated_string_input')
  1765. @patch.object(ambari_server, 'get_YN_input')
  1766. @patch.object(ambari_server, 'search_file')
  1767. @patch.object(ambari_server, 'get_ambari_properties')
  1768. def test_reset_master_key_not_persisted(self, get_ambari_properties_method,
  1769. search_file_message, get_YN_input_method,
  1770. get_validated_string_input_method, save_master_key_method,
  1771. update_properties_method, get_master_key_ispersisted_method,
  1772. is_alias_string_method, configure_database_password_method,
  1773. configure_ldap_password_method):
  1774. out = StringIO.StringIO()
  1775. sys.stdout = out
  1776. search_file_message.return_value = "filepath"
  1777. configs = { ambari_server.SECURITY_MASTER_KEY_LOCATION : "filepath",
  1778. ambari_server.SECURITY_KEYS_DIR : tempfile.gettempdir(),
  1779. ambari_server.SECURITY_KEY_IS_PERSISTED : "false",
  1780. ambari_server.JDBC_PASSWORD_PROPERTY : "${alias=fakealias}",
  1781. ambari_server.LDAP_MGR_PASSWORD_PROPERTY : "${alias=fakealias}"}
  1782. get_ambari_properties_method.return_value = configs
  1783. get_master_key_ispersisted_method.return_value = False
  1784. get_validated_string_input_method.return_value = "aaa"
  1785. get_YN_input_method.return_value = False
  1786. is_alias_string_method.return_value = True
  1787. ambari_server.reset_master_key()
  1788. self.assertFalse(save_master_key_method.called)
  1789. self.assertTrue(get_YN_input_method.called)
  1790. self.assertTrue(get_validated_string_input_method.called)
  1791. self.assertTrue(update_properties_method.called)
  1792. self.assertTrue(configure_database_password_method.called)
  1793. self.assertTrue(configure_ldap_password_method.called)
  1794. sys.stdout = sys.__stdout__
  1795. @patch.object(ambari_server, 'update_properties')
  1796. @patch.object(ambari_server, 'configure_ldap_password')
  1797. @patch.object(ambari_server, 'get_validated_string_input')
  1798. @patch.object(ambari_server, 'setup_master_key')
  1799. @patch.object(ambari_server, 'search_file')
  1800. @patch.object(ambari_server, 'get_ambari_properties')
  1801. def test_setup_ldap(self, get_ambari_properties_method,
  1802. search_file_message, setup_master_key_method,
  1803. get_validated_string_input_method,
  1804. configure_ldap_password_method, update_properties_method):
  1805. out = StringIO.StringIO()
  1806. sys.stdout = out
  1807. search_file_message.return_value = "filepath"
  1808. configs = { ambari_server.SECURITY_MASTER_KEY_LOCATION : "filepath",
  1809. ambari_server.SECURITY_KEYS_DIR : tempfile.gettempdir(),
  1810. ambari_server.SECURITY_KEY_IS_PERSISTED : "true" }
  1811. get_ambari_properties_method.return_value = configs
  1812. get_validated_string_input_method.return_value = "test"
  1813. configure_ldap_password_method.return_value = "${alias=fake}"
  1814. setup_master_key_method.return_value = (None, True, True)
  1815. ambari_server.setup_ldap()
  1816. ldap_properties_map =\
  1817. {
  1818. "authentication.ldap.primaryUrl" : "test",
  1819. "authentication.ldap.secondaryUrl" : "test",
  1820. "authentication.ldap.baseDn" : "test",
  1821. "authentication.ldap.bindAnonymously" : "test",
  1822. "authentication.ldap.usernameAttribute" : "test",
  1823. "authorization.ldap.groupBase" : "test",
  1824. "authorization.ldap.groupObjectClass" : "test",
  1825. "authorization.ldap.groupNamingAttr" : "test",
  1826. "authorization.ldap.groupMembershipAttr" : "test",
  1827. "authorization.ldap.adminGroupMappingRules" : "test",
  1828. "authorization.ldap.groupSearchFilter" : "test",
  1829. "authorization.userRoleName" : "test",
  1830. "authorization.adminRoleName" : "test",
  1831. "authentication.ldap.managerDn" : "test",
  1832. "authentication.ldap.managerPassword" : \
  1833. configure_ldap_password_method.return_value
  1834. }
  1835. self.assertEquals(update_properties_method.call_args[0][0],
  1836. ldap_properties_map)
  1837. self.assertTrue(update_properties_method.called)
  1838. self.assertTrue(configure_ldap_password_method.called)
  1839. self.assertTrue(get_validated_string_input_method.called)
  1840. sys.stdout = sys.__stdout__
  1841. @patch.object(ambari_server, 'get_alias_string')
  1842. @patch.object(ambari_server, 'save_passwd_for_alias')
  1843. @patch.object(ambari_server, 'read_password')
  1844. def test_configure_ldap_password(self, read_password_method,
  1845. save_passwd_for_alias_method, get_alias_string_method):
  1846. out = StringIO.StringIO()
  1847. sys.stdout = out
  1848. read_password_method.return_value = "blah"
  1849. save_passwd_for_alias_method.return_value = 0
  1850. get_alias_string_method.return_value = "${alias=somefake}"
  1851. ambari_server.configure_ldap_password(True, "aaa")
  1852. self.assertTrue(save_passwd_for_alias_method.called)
  1853. self.assertTrue(read_password_method.called)
  1854. self.assertTrue(get_alias_string_method.called)
  1855. save_passwd_for_alias_method.assert_called_once_with(
  1856. ambari_server.LDAP_MGR_PASSWORD_ALIAS, "blah", "aaa")
  1857. sys.stdout = sys.__stdout__
  1858. def get_sample(self, sample):
  1859. """
  1860. Returns sample file content as string with normalized line endings
  1861. """
  1862. path = self.get_samples_dir(sample)
  1863. return self.get_file_string(path)
  1864. def get_file_string(self, file):
  1865. """
  1866. Returns file content as string with normalized line endings
  1867. """
  1868. string = open(file, 'r').read()
  1869. return self.normalize(string)
  1870. def normalize(self, string):
  1871. """
  1872. Normalizes line ending in string according to platform-default encoding
  1873. """
  1874. return string.replace("\n", os.linesep)
  1875. def get_samples_dir(self, sample):
  1876. """
  1877. Returns full file path by sample name
  1878. """
  1879. testdir = os.path.dirname(__file__)
  1880. return os.path.dirname(testdir) + os.sep + "resources" + os.sep \
  1881. + 'TestAmbaryServer.samples/' + sample