TestAmbaryServer.py 105 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984
  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. options.sid_or_sname = "sid"
  152. ambari_server.main()
  153. self.assertTrue(setup_method.called)
  154. self.assertFalse(start_method.called)
  155. self.assertFalse(stop_method.called)
  156. self.assertFalse(reset_method.called)
  157. self.assertFalse(False, ambari_server.VERBOSE)
  158. self.assertFalse(False, ambari_server.SILENT)
  159. @patch.object(ambari_server, 'setup')
  160. @patch.object(ambari_server, 'start')
  161. @patch.object(ambari_server, 'stop')
  162. @patch.object(ambari_server, 'reset')
  163. @patch('optparse.OptionParser')
  164. def test_main_test_start(self, OptionParserMock, reset_method, stop_method,
  165. start_method, setup_method):
  166. opm = OptionParserMock.return_value
  167. options = MagicMock()
  168. args = ["setup"]
  169. opm.parse_args.return_value = (options, args)
  170. options.database=None
  171. options.sid_or_sname = "sname"
  172. ambari_server.main()
  173. self.assertTrue(setup_method.called)
  174. self.assertFalse(start_method.called)
  175. self.assertFalse(stop_method.called)
  176. self.assertFalse(reset_method.called)
  177. self.assertFalse(False, ambari_server.VERBOSE)
  178. self.assertFalse(False, ambari_server.SILENT)
  179. @patch.object(ambari_server, 'setup')
  180. @patch.object(ambari_server, 'start')
  181. @patch.object(ambari_server, 'stop')
  182. @patch.object(ambari_server, 'reset')
  183. @patch('optparse.OptionParser')
  184. def test_main_test_start_debug_short(self, OptionParserMock, reset_method, stop_method,
  185. start_method, setup_method):
  186. opm = OptionParserMock.return_value
  187. options = MagicMock()
  188. args = ["start", "-g"]
  189. opm.parse_args.return_value = (options, args)
  190. options.database=None
  191. options.sid_or_sname = "sid"
  192. ambari_server.main()
  193. self.assertFalse(setup_method.called)
  194. self.assertTrue(start_method.called)
  195. self.assertFalse(stop_method.called)
  196. self.assertFalse(reset_method.called)
  197. self.assertTrue(ambari_server.SERVER_DEBUG_MODE)
  198. @patch.object(ambari_server, 'setup')
  199. @patch.object(ambari_server, 'start')
  200. @patch.object(ambari_server, 'stop')
  201. @patch.object(ambari_server, 'reset')
  202. @patch('optparse.OptionParser')
  203. def test_main_test_start_debug_long(self, OptionParserMock, reset_method, stop_method,
  204. start_method, setup_method):
  205. opm = OptionParserMock.return_value
  206. options = MagicMock()
  207. args = ["start", "--debug"]
  208. opm.parse_args.return_value = (options, args)
  209. options.database=None
  210. options.sid_or_sname = "sid"
  211. ambari_server.main()
  212. self.assertFalse(setup_method.called)
  213. self.assertTrue(start_method.called)
  214. self.assertFalse(stop_method.called)
  215. self.assertFalse(reset_method.called)
  216. self.assertTrue(ambari_server.SERVER_DEBUG_MODE)
  217. @patch.object(ambari_server, 'setup')
  218. @patch.object(ambari_server, 'start')
  219. @patch.object(ambari_server, 'stop')
  220. @patch.object(ambari_server, 'reset')
  221. @patch('optparse.OptionParser')
  222. def test_main_test_stop(self, OptionParserMock, reset_method, stop_method,
  223. start_method, setup_method):
  224. opm = OptionParserMock.return_value
  225. options = MagicMock()
  226. args = ["stop"]
  227. opm.parse_args.return_value = (options, args)
  228. options.database = None
  229. options.sid_or_sname = "sid"
  230. ambari_server.main()
  231. self.assertFalse(setup_method.called)
  232. self.assertFalse(start_method.called)
  233. self.assertTrue(stop_method.called)
  234. self.assertFalse(reset_method.called)
  235. self.assertFalse(False, ambari_server.VERBOSE)
  236. self.assertFalse(False, ambari_server.SILENT)
  237. @patch.object(ambari_server, 'setup')
  238. @patch.object(ambari_server, 'start')
  239. @patch.object(ambari_server, 'stop')
  240. @patch.object(ambari_server, 'reset')
  241. @patch('optparse.OptionParser')
  242. def test_main_test_reset(self, OptionParserMock, reset_method, stop_method,
  243. start_method, setup_method):
  244. opm = OptionParserMock.return_value
  245. options = MagicMock()
  246. args = ["reset"]
  247. opm.parse_args.return_value = (options, args)
  248. options.database=None
  249. options.sid_or_sname = "sid"
  250. ambari_server.main()
  251. self.assertFalse(setup_method.called)
  252. self.assertFalse(start_method.called)
  253. self.assertFalse(stop_method.called)
  254. self.assertTrue(reset_method.called)
  255. self.assertFalse(False, ambari_server.VERBOSE)
  256. self.assertFalse(False, ambari_server.SILENT)
  257. def test_configure_postgresql_conf(self):
  258. tf1 = tempfile.NamedTemporaryFile()
  259. ambari_server.POSTGRESQL_CONF_FILE = tf1.name
  260. with open(ambari_server.POSTGRESQL_CONF_FILE, 'w') as f:
  261. f.write("#listen_addresses = '127.0.0.1' #\n")
  262. f.write("#listen_addresses = '127.0.0.1'")
  263. ambari_server.configure_postgresql_conf()
  264. expected = self.get_file_string(self.get_samples_dir(
  265. "configure_postgresql_conf1"))
  266. result = self.get_file_string(ambari_server.POSTGRESQL_CONF_FILE)
  267. self.assertEqual(expected, result, "postgresql.conf not updated")
  268. mode = oct(os.stat(ambari_server.POSTGRESQL_CONF_FILE)[stat.ST_MODE])
  269. str_mode = str(mode)[-4:]
  270. self.assertEqual("0644", str_mode, "Wrong file permissions")
  271. @patch.object(ambari_server, "restart_postgres")
  272. @patch.object(ambari_server, "get_postgre_status")
  273. @patch.object(ambari_server, "configure_postgresql_conf")
  274. @patch.object(ambari_server, "configure_pg_hba_ambaridb_users")
  275. @patch.object(ambari_server, "configure_pg_hba_postgres_user")
  276. def test_configure_postgres(self, configure_pg_hba_postgres_user_mock,
  277. configure_pg_hba_ambaridb_users_mock,
  278. configure_postgresql_conf_mock,
  279. get_postgre_status_mock,
  280. restart_postgres_mock):
  281. tf1 = tempfile.NamedTemporaryFile()
  282. tf2 = tempfile.NamedTemporaryFile()
  283. ambari_server.PG_HBA_CONF_FILE = tf1.name
  284. ambari_server.PG_HBA_CONF_FILE_BACKUP = tf2.name
  285. args = MagicMock()
  286. out = StringIO.StringIO()
  287. sys.stdout = out
  288. rcode = ambari_server.configure_postgres()
  289. sys.stdout = sys.__stdout__
  290. self.assertEqual(0, rcode)
  291. self.assertEqual("Backup for pg_hba found, reconfiguration not required\n",
  292. out.getvalue())
  293. ambari_server.PG_HBA_CONF_FILE_BACKUP = tempfile.mktemp()
  294. get_postgre_status_mock.return_value = ambari_server.PG_STATUS_RUNNING
  295. restart_postgres_mock.return_value = 0
  296. rcode = ambari_server.configure_postgres()
  297. self.assertTrue(os.path.isfile(ambari_server.PG_HBA_CONF_FILE_BACKUP),
  298. "postgresql.conf backup not created")
  299. self.assertTrue(configure_pg_hba_postgres_user_mock.called)
  300. self.assertTrue(configure_pg_hba_ambaridb_users_mock.called)
  301. mode = oct(os.stat(ambari_server.PG_HBA_CONF_FILE)[stat.ST_MODE])
  302. str_mode = str(mode)[-4:]
  303. self.assertEqual("0644", str_mode, "Wrong file permissions")
  304. self.assertTrue(configure_postgresql_conf_mock.called)
  305. self.assertEqual(0, rcode)
  306. os.unlink(ambari_server.PG_HBA_CONF_FILE_BACKUP)
  307. get_postgre_status_mock.return_value = "stopped"
  308. rcode = ambari_server.configure_postgres()
  309. self.assertEqual(0, rcode)
  310. os.unlink(ambari_server.PG_HBA_CONF_FILE_BACKUP)
  311. sys.stdout = sys.__stdout__
  312. @patch("time.sleep")
  313. @patch("subprocess.Popen")
  314. @patch.object(ambari_server, "run_os_command")
  315. @patch.object(ambari_server, "get_postgre_status")
  316. @patch.object(ambari_server, "print_info_msg")
  317. def test_restart_postgres(self, printInfoMsg_mock, get_postgre_status_mock,
  318. run_os_command_mock, popenMock, sleepMock):
  319. p = MagicMock()
  320. p.poll.return_value = 0
  321. popenMock.return_value = p
  322. rcode = ambari_server.restart_postgres()
  323. self.assertEqual(0, rcode)
  324. p.poll.return_value = None
  325. get_postgre_status_mock.return_value = "stopped"
  326. run_os_command_mock.return_value = (1, None, None)
  327. rcode = ambari_server.restart_postgres()
  328. self.assertEqual(1, rcode)
  329. @patch("shlex.split")
  330. @patch("subprocess.Popen")
  331. @patch.object(ambari_server, "print_info_msg")
  332. def test_run_os_command(self, printInfoMsg_mock, popenMock, splitMock):
  333. p = MagicMock()
  334. p.communicate.return_value = (None, None)
  335. p.returncode = 3
  336. popenMock.return_value = p
  337. # with list arg
  338. cmd = ["exec", "arg"]
  339. ambari_server.run_os_command(cmd)
  340. self.assertFalse(splitMock.called)
  341. # with str arg
  342. resp = ambari_server.run_os_command("runme")
  343. self.assertEqual(3, resp[0])
  344. self.assertTrue(splitMock.called)
  345. @patch.object(ambari_server, "get_conf_dir")
  346. @patch.object(ambari_server, "search_file")
  347. def test_write_property(self, search_file_mock, get_conf_dir_mock):
  348. expected_content = "key1=val1\n"
  349. tf1 = tempfile.NamedTemporaryFile()
  350. search_file_mock.return_value = tf1.name
  351. ambari_server.write_property("key1", "val1")
  352. result = tf1.read()
  353. self.assertTrue(expected_content in result)
  354. @patch.object(ambari_server, "configure_database_username_password")
  355. @patch.object(ambari_server, "run_os_command")
  356. def test_setup_db(self, run_os_command_mock,
  357. configure_database_username_password_mock):
  358. run_os_command_mock.return_value = (0, None, None)
  359. result = ambari_server.setup_db(MagicMock())
  360. self.assertTrue(configure_database_username_password_mock.called)
  361. self.assertEqual(0, result)
  362. @patch.object(ambari_server, "get_YN_input")
  363. @patch.object(ambari_server, "run_os_command")
  364. def test_check_selinux(self, run_os_command_mock, getYNInput_mock):
  365. run_os_command_mock.return_value = (0, ambari_server.SE_STATUS_DISABLED,
  366. None)
  367. rcode = ambari_server.check_selinux()
  368. self.assertEqual(0, rcode)
  369. getYNInput_mock.return_value = True
  370. run_os_command_mock.return_value = (0,"enabled "
  371. + ambari_server.SE_MODE_ENFORCING,
  372. None)
  373. rcode = ambari_server.check_selinux()
  374. self.assertEqual(0, rcode)
  375. self.assertTrue(run_os_command_mock.called)
  376. self.assertTrue(getYNInput_mock.called)
  377. @patch.object(ambari_server, "print_info_msg")
  378. def test_get_ambari_jars(self, printInfoMsg_mock):
  379. env = "/ambari/jars"
  380. os.environ[ambari_server.AMBARI_SERVER_LIB] = env
  381. result = ambari_server.get_ambari_jars()
  382. self.assertEqual(env, result)
  383. del os.environ[ambari_server.AMBARI_SERVER_LIB]
  384. result = ambari_server.get_ambari_jars()
  385. self.assertEqual("/usr/lib/ambari-server", result)
  386. self.assertTrue(printInfoMsg_mock.called)
  387. @patch("glob.glob")
  388. @patch.object(ambari_server, "print_info_msg")
  389. def test_get_share_jars(self, printInfoMsg_mock, globMock):
  390. globMock.return_value = ["one", "two"]
  391. expected = "one:two:one:two"
  392. result = ambari_server.get_share_jars()
  393. self.assertEqual(expected, result)
  394. globMock.return_value = []
  395. expected = ""
  396. result = ambari_server.get_share_jars()
  397. self.assertEqual(expected, result)
  398. @patch("glob.glob")
  399. @patch.object(ambari_server, "print_info_msg")
  400. def test_get_ambari_classpath(self, printInfoMsg_mock, globMock):
  401. globMock.return_value = ["one"]
  402. result = ambari_server.get_ambari_classpath()
  403. self.assertTrue(ambari_server.get_ambari_jars() in result)
  404. self.assertTrue(ambari_server.get_share_jars() in result)
  405. globMock.return_value = []
  406. result = ambari_server.get_ambari_classpath()
  407. self.assertTrue(ambari_server.get_ambari_jars() in result)
  408. self.assertFalse(":" in result)
  409. @patch.object(ambari_server, "print_info_msg")
  410. def test_get_conf_dir(self, printInfoMsg_mock):
  411. env = "/dummy/ambari/conf"
  412. os.environ[ambari_server.AMBARI_CONF_VAR] = env
  413. result = ambari_server.get_conf_dir()
  414. self.assertEqual(env, result)
  415. del os.environ[ambari_server.AMBARI_CONF_VAR]
  416. result = ambari_server.get_conf_dir()
  417. self.assertEqual("/etc/ambari-server/conf", result)
  418. def test_search_file(self):
  419. path = os.path.dirname(__file__)
  420. result = ambari_server.search_file(__file__, path)
  421. expected = os.path.abspath(__file__)
  422. self.assertEqual(expected, result)
  423. result = ambari_server.search_file("non_existent_file", path)
  424. self.assertEqual(None, result)
  425. @patch.object(ambari_server, "search_file")
  426. def test_find_properties_file(self, search_file_mock):
  427. # Testing case when file is not found
  428. search_file_mock.return_value = None
  429. try:
  430. ambari_server.find_properties_file()
  431. self.fail("File not found'")
  432. except FatalException:
  433. # Expected
  434. pass
  435. self.assertTrue(search_file_mock.called)
  436. # Testing case when file is found
  437. value = MagicMock()
  438. search_file_mock.return_value = value
  439. result = ambari_server.find_properties_file()
  440. self.assertTrue(result is value)
  441. @patch.object(ambari_server, "find_properties_file")
  442. @patch("__builtin__.open")
  443. @patch("ambari-server.Properties")
  444. def test_read_ambari_user(self, properties_mock, open_mock, find_properties_file_mock):
  445. open_mock.return_value = "dummy"
  446. find_properties_file_mock.return_value = "dummy"
  447. # Testing with defined user
  448. properties_mock.return_value.__getitem__.return_value = "dummy_user"
  449. user = ambari_server.read_ambari_user()
  450. self.assertEquals(user, "dummy_user")
  451. # Testing with undefined user
  452. properties_mock.return_value.__getitem__.return_value = None
  453. user = ambari_server.read_ambari_user()
  454. self.assertEquals(user, None)
  455. @patch.object(ambari_server, "set_file_permissions")
  456. @patch.object(ambari_server, "run_os_command")
  457. @patch.object(ambari_server, "get_ambari_properties")
  458. @patch.object(ambari_server, "get_value_from_properties")
  459. @patch("os.mkdir")
  460. def test_adjust_directory_permissions(self, mkdir_mock, get_value_from_properties_mock, get_ambari_properties_mock,
  461. run_os_command_mock, set_file_permissions_mock):
  462. # Testing boostrap dir wipe
  463. properties_mock = MagicMock()
  464. get_value_from_properties_mock.return_value = "dummy_bootstrap_dir"
  465. ambari_server.adjust_directory_permissions("user")
  466. self.assertEquals(run_os_command_mock.call_args_list[0][0][0], "rm -rf dummy_bootstrap_dir")
  467. self.assertTrue(mkdir_mock.called)
  468. set_file_permissions_mock.reset_mock()
  469. # Test recursive calls
  470. old_list = ambari_server.NR_ADJUST_OWNERSHIP_LIST
  471. ambari_server.NR_ADJUST_OWNERSHIP_LIST = [
  472. ( "/etc/ambari-server/conf", "755", "{0}", "{0}", True ),
  473. ( "/etc/ambari-server/conf/ambari.properties", "644", "{0}", "{0}", False )
  474. ]
  475. ambari_server.adjust_directory_permissions("user")
  476. self.assertTrue(len(set_file_permissions_mock.call_args_list) ==
  477. len(ambari_server.NR_ADJUST_OWNERSHIP_LIST))
  478. self.assertEquals(set_file_permissions_mock.call_args_list[0][0][4], True)
  479. self.assertEquals(set_file_permissions_mock.call_args_list[1][0][4], False)
  480. ambari_server.NR_ADJUST_OWNERSHIP_LIST = old_list
  481. @patch("os.path.exists")
  482. @patch.object(ambari_server, "run_os_command")
  483. @patch.object(ambari_server, "print_warning_msg")
  484. @patch.object(ambari_server, "print_info_msg")
  485. def test_set_file_permissions(self, print_info_msg_mock, print_warning_msg_mock,
  486. run_os_command_mock, exists_mock):
  487. # Testing not existent file scenario
  488. exists_mock.return_value = False
  489. ambari_server.set_file_permissions("dummy-file", "dummy-mod",
  490. "dummy-user", "dummy-group", False)
  491. self.assertFalse(run_os_command_mock.called)
  492. self.assertTrue(print_info_msg_mock.called)
  493. run_os_command_mock.reset_mock()
  494. print_warning_msg_mock.reset_mock()
  495. # Testing OK scenario
  496. exists_mock.return_value = True
  497. run_os_command_mock.side_effect = [(0, "", ""), (0, "", "")]
  498. ambari_server.set_file_permissions("dummy-file", "dummy-mod",
  499. "dummy-user", "dummy-group", False)
  500. self.assertTrue(len(run_os_command_mock.call_args_list) == 2)
  501. self.assertFalse(print_warning_msg_mock.called)
  502. run_os_command_mock.reset_mock()
  503. print_warning_msg_mock.reset_mock()
  504. # Testing first command fail
  505. run_os_command_mock.side_effect = [(1, "", ""), (0, "", "")]
  506. ambari_server.set_file_permissions("dummy-file", "dummy-mod",
  507. "dummy-user", "dummy-group", False)
  508. self.assertTrue(len(run_os_command_mock.call_args_list) == 2)
  509. self.assertTrue(print_warning_msg_mock.called)
  510. run_os_command_mock.reset_mock()
  511. print_warning_msg_mock.reset_mock()
  512. # Testing second command fail
  513. run_os_command_mock.side_effect = [(0, "", ""), (1, "", "")]
  514. ambari_server.set_file_permissions("dummy-file", "dummy-mod",
  515. "dummy-user", "dummy-group", False)
  516. self.assertTrue(len(run_os_command_mock.call_args_list) == 2)
  517. self.assertTrue(print_warning_msg_mock.called)
  518. run_os_command_mock.reset_mock()
  519. print_warning_msg_mock.reset_mock()
  520. # Testing recursive operation
  521. exists_mock.return_value = True
  522. run_os_command_mock.side_effect = [(0, "", ""), (0, "", "")]
  523. ambari_server.set_file_permissions("dummy-file", "dummy-mod",
  524. "dummy-user", "dummy-group", True)
  525. self.assertTrue(len(run_os_command_mock.call_args_list) == 2)
  526. self.assertTrue("-R" in run_os_command_mock.call_args_list[0][0][0])
  527. self.assertTrue("-R" in run_os_command_mock.call_args_list[1][0][0])
  528. self.assertFalse(print_warning_msg_mock.called)
  529. run_os_command_mock.reset_mock()
  530. print_warning_msg_mock.reset_mock()
  531. # Testing non-recursive operation
  532. exists_mock.return_value = True
  533. run_os_command_mock.side_effect = [(0, "", ""), (0, "", "")]
  534. ambari_server.set_file_permissions("dummy-file", "dummy-mod",
  535. "dummy-user", "dummy-group", False)
  536. self.assertTrue(len(run_os_command_mock.call_args_list) == 2)
  537. self.assertFalse("-R" in run_os_command_mock.call_args_list[0][0][0])
  538. self.assertFalse("-R" in run_os_command_mock.call_args_list[1][0][0])
  539. self.assertFalse(print_warning_msg_mock.called)
  540. run_os_command_mock.reset_mock()
  541. print_warning_msg_mock.reset_mock()
  542. @patch.object(ambari_server, "get_validated_string_input")
  543. @patch.object(ambari_server, "print_info_msg")
  544. @patch.object(ambari_server, "print_warning_msg")
  545. @patch.object(ambari_server, "run_os_command")
  546. def test_create_custom_user(self, run_os_command_mock, print_warning_msg_mock,
  547. print_info_msg_mock, get_validated_string_input_mock):
  548. user = "dummy-user"
  549. get_validated_string_input_mock.return_value = user
  550. # Testing scenario: existing group, existing user
  551. run_os_command_mock.side_effect = [(9, "", ""), (9, "", ""), (0, "", "")]
  552. result = ambari_server.create_custom_user()
  553. self.assertTrue(len(run_os_command_mock.call_args_list) == 3)
  554. self.assertEquals(result, (0, user))
  555. run_os_command_mock.reset_mock()
  556. # Testing scenario: absent group, absent user
  557. run_os_command_mock.side_effect = [(0, "", ""), (0, "", "")]
  558. result = ambari_server.create_custom_user()
  559. self.assertTrue(len(run_os_command_mock.call_args_list) == 2)
  560. self.assertEquals(result, (0, user))
  561. run_os_command_mock.reset_mock()
  562. # Testing scenario: os command fail
  563. run_os_command_mock.side_effect = [(1, "", "")]
  564. result = ambari_server.create_custom_user()
  565. self.assertTrue(len(run_os_command_mock.call_args_list) == 1)
  566. self.assertEquals(result, (1, None))
  567. run_os_command_mock.reset_mock()
  568. @patch.object(ambari_server, "read_ambari_user")
  569. @patch.object(ambari_server, "get_YN_input")
  570. @patch.object(ambari_server, "create_custom_user")
  571. @patch.object(ambari_server, "write_property")
  572. @patch.object(ambari_server, "adjust_directory_permissions")
  573. @patch.object(ambari_server, "print_error_msg")
  574. def test_check_ambari_user(self, print_error_msg_mock,
  575. adjust_directory_permissions_mock, write_property_mock,
  576. create_custom_user_mock, get_YN_input_mock, read_ambari_user_mock):
  577. # Scenario: user is already defined, user does not want to reconfigure it
  578. read_ambari_user_mock.return_value = "dummy-user"
  579. get_YN_input_mock.return_value = False
  580. result = ambari_server.check_ambari_user()
  581. self.assertTrue(get_YN_input_mock.called)
  582. self.assertFalse(write_property_mock.called)
  583. self.assertFalse(create_custom_user_mock.called)
  584. self.assertTrue(adjust_directory_permissions_mock.called)
  585. self.assertEqual(result, 0)
  586. get_YN_input_mock.reset_mock()
  587. write_property_mock.reset_mock()
  588. adjust_directory_permissions_mock.reset_mock()
  589. create_custom_user_mock.reset_mock()
  590. # Scenario: user is already defined, but user wants to reconfigure it
  591. read_ambari_user_mock.return_value = "dummy-user"
  592. create_custom_user_mock.return_value = (0, "new-dummy-user")
  593. get_YN_input_mock.return_value = True
  594. result = ambari_server.check_ambari_user()
  595. self.assertTrue(get_YN_input_mock.called)
  596. self.assertTrue(write_property_mock.called)
  597. self.assertTrue(write_property_mock.call_args[0][1] == "new-dummy-user")
  598. self.assertTrue(create_custom_user_mock.called)
  599. self.assertTrue(adjust_directory_permissions_mock.called)
  600. self.assertEqual(result, 0)
  601. get_YN_input_mock.reset_mock()
  602. write_property_mock.reset_mock()
  603. adjust_directory_permissions_mock.reset_mock()
  604. create_custom_user_mock.reset_mock()
  605. # Negative scenario: user is already defined, but user wants
  606. # to reconfigure it, user creation failed
  607. read_ambari_user_mock.return_value = "dummy-user"
  608. create_custom_user_mock.return_value = (1, None)
  609. get_YN_input_mock.return_value = True
  610. result = ambari_server.check_ambari_user()
  611. self.assertTrue(get_YN_input_mock.called)
  612. self.assertTrue(create_custom_user_mock.called)
  613. self.assertFalse(write_property_mock.called)
  614. self.assertFalse(adjust_directory_permissions_mock.called)
  615. self.assertEqual(result, 1)
  616. get_YN_input_mock.reset_mock()
  617. create_custom_user_mock.reset_mock()
  618. write_property_mock.reset_mock()
  619. adjust_directory_permissions_mock.reset_mock()
  620. # Scenario: user is not defined (setup process)
  621. read_ambari_user_mock.return_value = None
  622. get_YN_input_mock.return_value = True
  623. create_custom_user_mock.return_value = (0, "dummy-user")
  624. result = ambari_server.check_ambari_user()
  625. self.assertTrue(get_YN_input_mock.called)
  626. self.assertTrue(create_custom_user_mock.called)
  627. self.assertTrue(write_property_mock.called)
  628. self.assertTrue(write_property_mock.call_args[0][1] == "dummy-user")
  629. self.assertTrue(adjust_directory_permissions_mock.called)
  630. self.assertEqual(result, 0)
  631. get_YN_input_mock.reset_mock()
  632. create_custom_user_mock.reset_mock()
  633. write_property_mock.reset_mock()
  634. adjust_directory_permissions_mock.reset_mock()
  635. # Scenario: user is not defined (setup process), user creation failed
  636. read_ambari_user_mock.return_value = None
  637. get_YN_input_mock.return_value = True
  638. create_custom_user_mock.return_value = (1, None)
  639. result = ambari_server.check_ambari_user()
  640. self.assertTrue(get_YN_input_mock.called)
  641. self.assertTrue(create_custom_user_mock.called)
  642. self.assertFalse(write_property_mock.called)
  643. self.assertFalse(adjust_directory_permissions_mock.called)
  644. self.assertEqual(result, 1)
  645. get_YN_input_mock.reset_mock()
  646. create_custom_user_mock.reset_mock()
  647. write_property_mock.reset_mock()
  648. adjust_directory_permissions_mock.reset_mock()
  649. # negative scenario: user is not defined (setup process), user creation failed
  650. read_ambari_user_mock.return_value = None
  651. get_YN_input_mock.return_value = True
  652. create_custom_user_mock.return_value = (1, None)
  653. result = ambari_server.check_ambari_user()
  654. self.assertTrue(get_YN_input_mock.called)
  655. self.assertTrue(create_custom_user_mock.called)
  656. self.assertFalse(write_property_mock.called)
  657. self.assertFalse(adjust_directory_permissions_mock.called)
  658. self.assertEqual(result, 1)
  659. get_YN_input_mock.reset_mock()
  660. create_custom_user_mock.reset_mock()
  661. write_property_mock.reset_mock()
  662. adjust_directory_permissions_mock.reset_mock()
  663. # Scenario: user is not defined and left to be root
  664. read_ambari_user_mock.return_value = None
  665. get_YN_input_mock.return_value = False
  666. result = ambari_server.check_ambari_user()
  667. self.assertTrue(get_YN_input_mock.called)
  668. self.assertFalse(create_custom_user_mock.called)
  669. self.assertTrue(write_property_mock.called)
  670. self.assertTrue(write_property_mock.call_args[0][1] == "root")
  671. self.assertTrue(adjust_directory_permissions_mock.called)
  672. self.assertEqual(result, 0)
  673. @patch.object(ambari_server, "search_file")
  674. @patch("__builtin__.open")
  675. @patch.object(ambari_server, "read_ambari_user")
  676. @patch.object(ambari_server, "set_file_permissions")
  677. def test_store_password_file(self, set_file_permissions_mock,
  678. read_ambari_user_mock, open_mock, search_file_mock):
  679. search_file_mock.return_value = "/etc/ambari-server/conf/ambari.properties"
  680. open_mock.return_value = MagicMock()
  681. ambari_server.store_password_file("password", "passfile")
  682. self.assertTrue(set_file_permissions_mock.called)
  683. @patch.object(ambari_server, "run_os_command")
  684. def test_check_iptables(self, run_os_command_mock):
  685. run_os_command_mock.return_value = (1, "test", "")
  686. rcode, info = ambari_server.check_iptables()
  687. self.assertEqual(1, rcode)
  688. self.assertEqual("test", info)
  689. run_os_command_mock.return_value = (2, "",
  690. ambari_server.IP_TBLS_SRVC_NT_FND)
  691. rcode = ambari_server.check_iptables()
  692. self.assertEqual(0, rcode)
  693. def test_dlprogress(self):
  694. out = StringIO.StringIO()
  695. sys.stdout = out
  696. ambari_server.dlprogress("filename", 10, 2, 100)
  697. sys.stdout = sys.__stdout__
  698. self.assertNotEqual("", out.getvalue())
  699. @patch("urllib2.urlopen")
  700. @patch("__builtin__.open")
  701. @patch.object(ambari_server, "dlprogress")
  702. def test_track_jdk(self, dlprogress_mock, openMock, urlopenMock):
  703. u = MagicMock()
  704. u.info.return_value = {"Content-Length":"24576"}
  705. chunks = [None, "second", "first"]
  706. def side_effect(*args, **kwargs):
  707. return chunks.pop()
  708. u.read.side_effect = side_effect
  709. urlopenMock.return_value = u
  710. f = MagicMock()
  711. openMock.return_value = f
  712. ambari_server.track_jdk("base", "url", "local")
  713. self.assertEqual(0, len(chunks))
  714. self.assertTrue(f.write.called)
  715. self.assertTrue(f.flush.called)
  716. self.assertTrue(f.close.called)
  717. self.assertEqual(2, len(dlprogress_mock.call_args_list))
  718. @patch("shutil.copy")
  719. @patch("os.path.join")
  720. @patch("os.path.exists")
  721. @patch.object(ambari_server, "get_ambari_properties")
  722. def test_install_jce_manualy(self, get_ambari_properties_mock,\
  723. os_path_exists_mock, os_path_join_mock,\
  724. shutil_copy_mock):
  725. args = MagicMock()
  726. args.jce_policy = "somewhere"
  727. p = MagicMock()
  728. get_ambari_properties_mock.return_value = p
  729. p.__getitem__.side_effect = None
  730. p.__getitem__.return_value = "somewhere"
  731. os_path_exists_mock.return_value = True
  732. os_path_join_mock.return_value = \
  733. "/var/lib/ambari-server/resources/jce_policy-6.zip"
  734. ambari_server.install_jce_manualy(args)
  735. self.assertTrue(shutil_copy_mock.called)
  736. shutil_copy_mock.side_effect = Exception("exception")
  737. try:
  738. ambari_server.install_jce_manualy(args)
  739. self.fail("Should throw exception because of not found jce_policy-6.zip")
  740. except Exception:
  741. # Expected
  742. self.assertTrue(shutil_copy_mock.called)
  743. pass
  744. shutil_copy_mock.side_effect = None
  745. args.jce_policy = None
  746. ambari_server.install_jce_manualy(args)
  747. @patch.object(ambari_server, "get_validated_string_input")
  748. @patch.object(ambari_server, "find_properties_file")
  749. @patch.object(ambari_server, "get_ambari_properties")
  750. @patch.object(ambari_server, "is_server_runing")
  751. @patch.object(ambari_server, "import_cert_and_key_action")
  752. @patch.object(ambari_server, "get_YN_input")
  753. @patch("__builtin__.open")
  754. @patch("ambari-server.Properties")
  755. def test_setup_https(self, Properties_mock, open_Mock, get_YN_input_mock,\
  756. import_cert_and_key_action_mock,
  757. is_server_runing_mock, get_ambari_properties_mock,\
  758. find_properties_file_mock,\
  759. get_validated_string_input_mock):
  760. args = MagicMock()
  761. open_Mock.return_value = file
  762. p = get_ambari_properties_mock.return_value
  763. #Case #1: if client ssl is on and user didnt choose
  764. #disable ssl option and choose import certs and keys
  765. p.get_property.side_effect = ["key_dir","5555","6666", "true"]
  766. get_YN_input_mock.side_effect = [False,True]
  767. get_validated_string_input_mock.side_effect = ["4444"]
  768. get_property_expected = "[call('security.server.keys_dir'),\n"+\
  769. " call('client.api.ssl.port'),\n"+\
  770. " call('client.api.ssl.port'),\n call('api.ssl')]"
  771. process_pair_expected = "[call('client.api.ssl.port', '4444')]"
  772. ambari_server.SILENT = False
  773. ambari_server.setup_https(args)
  774. self.assertTrue(p.process_pair.called)
  775. self.assertTrue(p.get_property.call_count == 4)
  776. self.assertEqual(str(p.get_property.call_args_list), get_property_expected)
  777. self.assertEqual(str(p.process_pair.call_args_list), process_pair_expected)
  778. self.assertTrue(p.store.called)
  779. self.assertTrue(import_cert_and_key_action_mock.called)
  780. p.process_pair.reset_mock()
  781. p.get_property.reset_mock()
  782. p.store.reset_mock()
  783. import_cert_and_key_action_mock.reset_mock()
  784. #Case #2: if client ssl is on and user choose to disable ssl option
  785. p.get_property.side_effect = ["key_dir","", "true"]
  786. get_YN_input_mock.side_effect = [True]
  787. get_validated_string_input_mock.side_effect = ["4444"]
  788. get_property_expected = "[call('security.server.keys_dir'),\n"+\
  789. " call('client.api.ssl.port'),\n call('api.ssl')]"
  790. process_pair_expected = "[call('api.ssl', 'false')]"
  791. ambari_server.setup_https(args)
  792. self.assertTrue(p.process_pair.called)
  793. self.assertTrue(p.get_property.call_count == 3)
  794. self.assertEqual(str(p.get_property.call_args_list), get_property_expected)
  795. self.assertEqual(str(p.process_pair.call_args_list), process_pair_expected)
  796. self.assertTrue(p.store.called)
  797. self.assertFalse(import_cert_and_key_action_mock.called)
  798. p.process_pair.reset_mock()
  799. p.get_property.reset_mock()
  800. p.store.reset_mock()
  801. import_cert_and_key_action_mock.reset_mock()
  802. #Case #3: if client ssl is off and user choose option
  803. #to import cert and keys
  804. p.get_property.side_effect = ["key_dir","", None]
  805. get_YN_input_mock.side_effect = [True, True]
  806. get_validated_string_input_mock.side_effect = ["4444"]
  807. get_property_expected = "[call('security.server.keys_dir'),\n"+\
  808. " call('client.api.ssl.port'),\n call('api.ssl')]"
  809. process_pair_expected = "[call('client.api.ssl.port', '4444')]"
  810. ambari_server.setup_https(args)
  811. self.assertTrue(p.process_pair.called)
  812. self.assertTrue(p.get_property.call_count == 3)
  813. self.assertEqual(str(p.get_property.call_args_list), get_property_expected)
  814. self.assertEqual(str(p.process_pair.call_args_list), process_pair_expected)
  815. self.assertTrue(p.store.called)
  816. self.assertTrue(import_cert_and_key_action_mock.called)
  817. p.process_pair.reset_mock()
  818. p.get_property.reset_mock()
  819. p.store.reset_mock()
  820. import_cert_and_key_action_mock.reset_mock()
  821. #Case #4: if client ssl is off and
  822. #user did not choose option to import cert and keys
  823. p.get_property.side_effect = ["key_dir","", None]
  824. get_YN_input_mock.side_effect = [False]
  825. get_validated_string_input_mock.side_effect = ["4444"]
  826. get_property_expected = "[call('security.server.keys_dir'),\n"+\
  827. " call('client.api.ssl.port'),\n call('api.ssl')]"
  828. process_pair_expected = "[]"
  829. ambari_server.setup_https(args)
  830. self.assertFalse(p.process_pair.called)
  831. self.assertTrue(p.get_property.call_count == 3)
  832. self.assertEqual(str(p.get_property.call_args_list), get_property_expected)
  833. self.assertEqual(str(p.process_pair.call_args_list), process_pair_expected)
  834. self.assertFalse(p.store.called)
  835. self.assertFalse(import_cert_and_key_action_mock.called)
  836. p.process_pair.reset_mock()
  837. p.get_property.reset_mock()
  838. p.store.reset_mock()
  839. import_cert_and_key_action_mock.reset_mock()
  840. ambari_server.SILENT = True
  841. @patch.object(ambari_server, "import_cert_and_key")
  842. def test_import_cert_and_key_action(self, import_cert_and_key_mock):
  843. import_cert_and_key_mock.return_value = True
  844. properties = MagicMock()
  845. properties.get_property.side_effect = ["key_dir","5555","6666", "true"]
  846. properties.process_pair = MagicMock()
  847. expect_process_pair = "[call('security.server.cert_name', 'ca.crt'),\n"+\
  848. " call('security.server.key_name', 'ca.key'),\n"+\
  849. " call('api.ssl', 'true')]"
  850. ambari_server.import_cert_and_key_action("key_dir", properties)
  851. self.assertEqual(str(properties.process_pair.call_args_list),\
  852. expect_process_pair)
  853. @patch.object(ambari_server, "read_ambari_user")
  854. @patch.object(ambari_server, "set_file_permissions")
  855. @patch.object(ambari_server, "import_file_to_keystore")
  856. @patch("__builtin__.open")
  857. @patch.object(ambari_server, "run_os_command")
  858. @patch("os.path.join")
  859. @patch.object(ambari_server, "get_validated_filepath_input")
  860. @patch.object(ambari_server, "get_validated_string_input")
  861. def test_import_cert_and_key(self, get_validated_string_input_mock,\
  862. get_validated_filepath_input_mock,\
  863. os_path_join_mock, run_os_command_mock,\
  864. open_mock, import_file_to_keystore_mock,\
  865. set_file_permissions_mock, read_ambari_user_mock):
  866. get_validated_string_input_mock.return_value = "password"
  867. get_validated_filepath_input_mock.side_effect = \
  868. ["cert_file_path","key_file_path"]
  869. os_path_join_mock.side_effect = ["cert_file_path","key_file_path",\
  870. "keystore_cert_file_path",\
  871. "keystore_cert_key_file_path",]
  872. run_os_command_mock.return_value = (0, "", "")
  873. om = open_mock.return_value
  874. expect_import_file_to_keystore = "[call('cert_file_path',"+\
  875. " 'keystore_cert_file_path'),\n"+\
  876. " call('key_file_path',"+\
  877. " 'keystore_cert_key_file_path')]"
  878. ambari_server.import_cert_and_key("key_dir")
  879. self.assertTrue(get_validated_filepath_input_mock.call_count == 2)
  880. self.assertTrue(get_validated_string_input_mock.called)
  881. self.assertTrue(os_path_join_mock.call_count == 4)
  882. self.assertTrue(set_file_permissions_mock.call_count == 2)
  883. self.assertEqual(str(import_file_to_keystore_mock.call_args_list),\
  884. expect_import_file_to_keystore)
  885. @patch.object(ambari_server, "run_os_command")
  886. @patch("__builtin__.open")
  887. @patch("os.path.exists")
  888. def test_is_server_runing(self, os_path_exists_mock, open_mock,\
  889. run_os_command_mock):
  890. os_path_exists_mock.return_value = True
  891. f = open_mock.return_value
  892. f.readline.return_value = "111"
  893. run_os_command_mock.return_value = 0, "", ""
  894. status, pid = ambari_server.is_server_runing()
  895. self.assertTrue(status)
  896. self.assertEqual(111, pid)
  897. os_path_exists_mock.return_value = False
  898. status, pid = ambari_server.is_server_runing()
  899. self.assertFalse(status)
  900. @patch.object(ambari_server, "install_jce_manualy")
  901. @patch("os.stat")
  902. @patch("os.path.isfile")
  903. @patch("os.path.exists")
  904. @patch.object(ambari_server, "track_jdk")
  905. @patch.object(ambari_server, "get_YN_input")
  906. @patch.object(ambari_server, "run_os_command")
  907. @patch.object(ambari_server, "write_property")
  908. @patch.object(ambari_server, "print_info_msg")
  909. @patch.object(ambari_server, "get_JAVA_HOME")
  910. @patch.object(ambari_server, "get_ambari_properties")
  911. def test_download_jdk(self, get_ambari_properties_mock, get_JAVA_HOME_mock,\
  912. print_info_msg_mock, write_property_mock,\
  913. run_os_command_mock, get_YN_input_mock, track_jdk_mock,
  914. path_existsMock, path_isfileMock, statMock,\
  915. install_jce_manualy_mock):
  916. args = MagicMock()
  917. args.java_home = "somewhere"
  918. path_existsMock.return_value = False
  919. get_JAVA_HOME_mock.return_value = False
  920. get_ambari_properties_mock.return_value = -1
  921. try:
  922. ambari_server.download_jdk(args)
  923. self.fail("Should throw exception because of not found ambari.properties")
  924. except FatalException:
  925. # Expected
  926. self.assertTrue(get_ambari_properties_mock.called)
  927. pass
  928. get_JAVA_HOME_mock.return_value = True
  929. path_existsMock.return_value = True
  930. rcode = ambari_server.download_jdk(args)
  931. self.assertEqual(0, rcode)
  932. get_JAVA_HOME_mock.return_value = False
  933. rcode = ambari_server.download_jdk(args)
  934. self.assertEqual(0, rcode)
  935. self.assertTrue(write_property_mock.called)
  936. path_existsMock.return_value = False
  937. p = MagicMock()
  938. get_ambari_properties_mock.return_value = p
  939. p.__getitem__.side_effect = KeyError("test exception")
  940. try:
  941. ambari_server.download_jdk(args)
  942. self.fail("Should throw exception")
  943. except FatalException:
  944. # Expected
  945. pass
  946. p.__getitem__.return_value = "somewhere"
  947. p.__getitem__.side_effect = None
  948. path_existsMock.return_value = False
  949. run_os_command_mock.return_value = (0, "Wrong out", None)
  950. try:
  951. ambari_server.download_jdk(args)
  952. self.fail("Should throw exception")
  953. except FatalException:
  954. # Expected
  955. pass
  956. ambari_server.JDK_INSTALL_DIR = os.getcwd()
  957. get_YN_input_mock.return_value = True
  958. run_os_command_mock.return_value = (0, "Creating jdk-1.2/jre"
  959. "Content-Length: 32000\r\n"
  960. , None)
  961. statResult = MagicMock()
  962. statResult.st_size = 32000
  963. statMock.return_value = statResult
  964. rcode = ambari_server.download_jdk(args)
  965. self.assertEqual(0, rcode)
  966. @patch.object(ambari_server, "run_os_command")
  967. def test_get_postgre_status(self, run_os_command_mock):
  968. run_os_command_mock.return_value = (1, "running", None)
  969. result = ambari_server.get_postgre_status()
  970. self.assertEqual("running", result)
  971. run_os_command_mock.return_value = (1, "wrong", None)
  972. result = ambari_server.get_postgre_status()
  973. self.assertEqual(None, result)
  974. @patch("time.sleep")
  975. @patch("subprocess.Popen")
  976. @patch.object(ambari_server, "run_os_command")
  977. @patch.object(ambari_server, "get_postgre_status")
  978. def test_check_postgre_up(self, get_postgre_status_mock, run_os_command_mock,
  979. popen_mock, sleep_mock):
  980. p = MagicMock()
  981. p.poll.return_value = 0
  982. popen_mock.return_value = p
  983. run_os_command_mock.return_value = (0, None, None)
  984. rcode = ambari_server.check_postgre_up()
  985. self.assertEqual(0, rcode)
  986. p.poll.return_value = 4
  987. get_postgre_status_mock.return_value = None
  988. rcode = ambari_server.check_postgre_up()
  989. self.assertEqual(4, rcode)
  990. @patch("platform.linux_distribution")
  991. @patch("platform.system")
  992. @patch.object(ambari_server, "print_info_msg")
  993. @patch.object(ambari_server, "print_error_msg")
  994. @patch.object(ambari_server, "get_ambari_properties")
  995. @patch.object(ambari_server, "write_property")
  996. @patch.object(ambari_server, "get_conf_dir")
  997. def test_configure_os_settings(self, get_conf_dir_mock, write_property_mock, get_ambari_properties_mock,
  998. print_error_msg_mock, print_info_msg_mock,
  999. systemMock, distMock):
  1000. get_ambari_properties_mock.return_value = -1
  1001. rcode = ambari_server.configure_os_settings()
  1002. self.assertEqual(-1, rcode)
  1003. p = MagicMock()
  1004. p[ambari_server.OS_TYPE_PROPERTY] = 'somevalue'
  1005. get_ambari_properties_mock.return_value = p
  1006. rcode = ambari_server.configure_os_settings()
  1007. self.assertEqual(0, rcode)
  1008. p.__getitem__.return_value = ""
  1009. systemMock.return_value = "NonLinux"
  1010. rcode = ambari_server.configure_os_settings()
  1011. self.assertEqual(-1, rcode)
  1012. systemMock.return_value = "Linux"
  1013. distMock.return_value = ("CentOS", "6.3", None)
  1014. rcode = ambari_server.configure_os_settings()
  1015. self.assertEqual(0, rcode)
  1016. self.assertTrue(write_property_mock.called)
  1017. @patch("__builtin__.open")
  1018. @patch.object(ambari_server, "Properties")
  1019. @patch.object(ambari_server, "search_file")
  1020. @patch.object(ambari_server, "get_conf_dir")
  1021. def test_get_JAVA_HOME(self, get_conf_dir_mock, search_file_mock,
  1022. Properties_mock, openMock):
  1023. openMock.side_effect = Exception("exception")
  1024. result = ambari_server.get_JAVA_HOME()
  1025. self.assertEqual(None, result)
  1026. expected = os.path.dirname(__file__)
  1027. p = MagicMock()
  1028. p.__getitem__.return_value = expected
  1029. openMock.side_effect = None
  1030. Properties_mock.return_value = p
  1031. result = ambari_server.get_JAVA_HOME()
  1032. self.assertEqual(expected, result)
  1033. def test_prompt_db_properties_default(self):
  1034. args = MagicMock()
  1035. ambari_server.load_default_db_properties(args)
  1036. ambari_server.prompt_db_properties(args)
  1037. self.assertEqual(args.database, "postgres")
  1038. self.assertEqual(args.database_host, "localhost")
  1039. self.assertEqual(args.database_name, "ambari")
  1040. self.assertEqual(args.database_port, "5432")
  1041. @patch.object(ambari_server, "setup_master_key")
  1042. @patch.object(ambari_server, "read_password")
  1043. @patch.object(ambari_server, "get_validated_string_input")
  1044. @patch.object(ambari_server, "get_YN_input")
  1045. def test_prompt_db_properties_oracle_sname(self, gyni_mock, gvsi_mock, rp_mock, smk_mock):
  1046. ambari_server.PROMPT_DATABASE_OPTIONS = True
  1047. gyni_mock.return_value = True
  1048. list_of_return_values= ["ambari-server", "ambari", "1", "1521", "localhost", "2"]
  1049. def side_effect(*args, **kwargs):
  1050. return list_of_return_values.pop()
  1051. gvsi_mock.side_effect = side_effect
  1052. rp_mock.return_value = "password"
  1053. smk_mock.return_value = (None, False, True)
  1054. args = MagicMock()
  1055. ambari_server.load_default_db_properties(args)
  1056. ambari_server.prompt_db_properties(args)
  1057. self.assertEqual(args.database, "oracle")
  1058. self.assertEqual(args.database_port, "1521")
  1059. self.assertEqual(args.database_host, "localhost")
  1060. self.assertEqual(args.database_name, "ambari")
  1061. self.assertEqual(args.database_username, "ambari-server")
  1062. self.assertEqual(args.sid_or_sname, "sname")
  1063. @patch.object(ambari_server, "setup_master_key")
  1064. @patch.object(ambari_server, "read_password")
  1065. @patch.object(ambari_server, "get_validated_string_input")
  1066. @patch.object(ambari_server, "get_YN_input")
  1067. def test_prompt_db_properties_oracle_sid(self, gyni_mock, gvsi_mock, rp_mock, smk_mock):
  1068. ambari_server.PROMPT_DATABASE_OPTIONS = True
  1069. gyni_mock.return_value = True
  1070. list_of_return_values= ["ambari-server", "ambari", "2", "1521", "localhost", "2"]
  1071. def side_effect(*args, **kwargs):
  1072. return list_of_return_values.pop()
  1073. gvsi_mock.side_effect = side_effect
  1074. rp_mock.return_value = "password"
  1075. smk_mock.return_value = (None, False, True)
  1076. args = MagicMock()
  1077. ambari_server.load_default_db_properties(args)
  1078. ambari_server.prompt_db_properties(args)
  1079. self.assertEqual(args.database, "oracle")
  1080. self.assertEqual(args.database_port, "1521")
  1081. self.assertEqual(args.database_host, "localhost")
  1082. self.assertEqual(args.database_name, "ambari")
  1083. self.assertEqual(args.database_username, "ambari-server")
  1084. self.assertEqual(args.sid_or_sname, "sid")
  1085. @patch.object(ambari_server, "setup_master_key")
  1086. @patch.object(ambari_server, "read_password")
  1087. @patch.object(ambari_server, "get_validated_string_input")
  1088. @patch.object(ambari_server, "get_YN_input")
  1089. def test_prompt_db_properties_postgre_adv(self, gyni_mock, gvsi_mock, rp_mock, smk_mock):
  1090. ambari_server.PROMPT_DATABASE_OPTIONS = True
  1091. gyni_mock.return_value = True
  1092. list_of_return_values= ["ambari-server", "ambari", "1"]
  1093. def side_effect(*args, **kwargs):
  1094. return list_of_return_values.pop()
  1095. gvsi_mock.side_effect = side_effect
  1096. rp_mock.return_value = "password"
  1097. smk_mock.return_value = (None, False, True)
  1098. args = MagicMock()
  1099. ambari_server.load_default_db_properties(args)
  1100. ambari_server.prompt_db_properties(args)
  1101. self.assertEqual(args.database, "postgres")
  1102. self.assertEqual(args.database_port, "5432")
  1103. self.assertEqual(args.database_host, "localhost")
  1104. self.assertEqual(args.database_name, "ambari")
  1105. self.assertEqual(args.database_username, "ambari-server")
  1106. self.assertEqual(args.sid_or_sname, "sname")
  1107. @patch("glob.glob")
  1108. @patch.object(ambari_server, "get_JAVA_HOME")
  1109. def test_find_jdk(self, get_JAVA_HOME_mock, globMock):
  1110. get_JAVA_HOME_mock.return_value = "somewhere"
  1111. result = ambari_server.find_jdk()
  1112. self.assertEqual("somewhere", result)
  1113. get_JAVA_HOME_mock.return_value = None
  1114. globMock.return_value = []
  1115. result = ambari_server.find_jdk()
  1116. self.assertEqual(None, result)
  1117. globMock.return_value = ["one", "two"]
  1118. result = ambari_server.find_jdk()
  1119. self.assertNotEqual(None, result)
  1120. @patch.object(ambari_server, "configure_os_settings")
  1121. @patch.object(ambari_server, "download_jdk")
  1122. @patch.object(ambari_server, "configure_postgres")
  1123. @patch.object(ambari_server, "setup_db")
  1124. @patch.object(ambari_server, "check_postgre_up")
  1125. @patch.object(ambari_server, "check_iptables")
  1126. @patch.object(ambari_server, "check_ambari_user")
  1127. @patch.object(ambari_server, "check_jdbc_drivers")
  1128. @patch.object(ambari_server, "check_selinux")
  1129. @patch.object(ambari_server, "setup_remote_db")
  1130. @patch.object(ambari_server, "store_remote_properties")
  1131. @patch.object(ambari_server, "is_local_database")
  1132. @patch.object(ambari_server, "store_local_properties")
  1133. @patch.object(ambari_server, "is_root")
  1134. def test_setup(self, is_root_mock, store_local_properties_mock, is_local_database_mock, store_remote_properties_mock,
  1135. setup_remote_db_mock, check_selinux_mock, check_jdbc_drivers_mock, check_ambari_user_mock,
  1136. check_iptables_mock, check_postgre_up_mock, setup_db_mock, configure_postgres_mock,
  1137. download_jdk_mock, configure_os_settings_mock, ):
  1138. args = MagicMock()
  1139. failed = False
  1140. def reset_mocks():
  1141. is_root_mock.reset_mock()
  1142. store_local_properties_mock.reset_mock()
  1143. store_remote_properties_mock.reset_mock()
  1144. is_local_database_mock.reset_mock()
  1145. setup_remote_db_mock.reset_mock()
  1146. check_selinux_mock.reset_mock()
  1147. check_jdbc_drivers_mock.reset_mock()
  1148. check_ambari_user_mock.reset_mock()
  1149. check_iptables_mock.reset_mock()
  1150. check_postgre_up_mock.reset_mock()
  1151. setup_db_mock.reset_mock()
  1152. configure_postgres_mock.reset_mock()
  1153. download_jdk_mock.reset_mock()
  1154. configure_os_settings_mock.reset_mock()
  1155. pass
  1156. # Testing call under non-root
  1157. is_root_mock.return_value = False
  1158. try:
  1159. ambari_server.setup(args)
  1160. self.fail("Should throw exception")
  1161. except FatalException as fe:
  1162. # Expected
  1163. self.assertTrue("root-level" in fe.reason)
  1164. pass
  1165. # Testing calls under root
  1166. # remote case
  1167. is_root_mock.return_value = True
  1168. check_selinux_mock.return_value = 0
  1169. check_ambari_user_mock.return_value = 0
  1170. check_jdbc_drivers_mock.return_value = 0
  1171. check_iptables_mock.return_value = (0, "other")
  1172. check_postgre_up_mock.return_value = 0
  1173. setup_db_mock.return_value = 0
  1174. setup_remote_db_mock.return_value = 0
  1175. is_local_database_mock.return_value = False
  1176. configure_postgres_mock.return_value = 0
  1177. download_jdk_mock.return_value = 0
  1178. configure_os_settings_mock.return_value = 0
  1179. store_remote_properties_mock.return_value = 0
  1180. store_local_properties_mock.return_value = 0
  1181. result = ambari_server.setup(args)
  1182. self.assertEqual(None, result)
  1183. self.assertTrue(check_ambari_user_mock.called)
  1184. self.assertEquals(True, store_remote_properties_mock.called)
  1185. self.assertEquals(False, store_local_properties_mock.called)
  1186. #Local case
  1187. reset_mocks()
  1188. is_local_database_mock.return_value = True
  1189. try:
  1190. result = ambari_server.setup(args)
  1191. except FatalException:
  1192. self.fail("Setup should be successful")
  1193. self.assertEqual(None, result)
  1194. self.assertEquals(True, store_local_properties_mock.called)
  1195. self.assertEquals(False, store_remote_properties_mock.called)
  1196. #negative case
  1197. reset_mocks()
  1198. is_local_database_mock.return_value = False
  1199. setup_remote_db_mock.return_value = -1
  1200. try:
  1201. result = ambari_server.setup(args)
  1202. self.fail("Should throw exception")
  1203. except FatalException as fe:
  1204. self.assertEquals(-1, fe.code)
  1205. @patch.object(ambari_server, "get_YN_input")
  1206. @patch.object(ambari_server, "setup_db")
  1207. @patch.object(ambari_server, "print_info_msg")
  1208. @patch.object(ambari_server, "run_os_command")
  1209. @patch.object(ambari_server, "configure_database_username_password")
  1210. @patch.object(ambari_server, "parse_properties_file")
  1211. @patch.object(ambari_server, "execute_remote_script")
  1212. @patch.object(ambari_server, "is_root")
  1213. def test_reset(self, is_root_mock, execute_remote_script_mock, parse_properties_file_mock, configure_database_username_password_mock,
  1214. run_os_command_mock, print_info_msg_mock,
  1215. setup_db_mock, get_YN_inputMock):
  1216. parse_properties_file_mock.return_value = 0
  1217. args = MagicMock()
  1218. args.persistence_type = "local"
  1219. get_YN_inputMock.return_value = False
  1220. # Testing call under non-root
  1221. is_root_mock.return_value = False
  1222. try:
  1223. ambari_server.reset(args)
  1224. self.fail("Should throw exception")
  1225. except FatalException as fe:
  1226. # Expected
  1227. self.assertTrue("root-level" in fe.reason)
  1228. pass
  1229. # Testing calls under root
  1230. is_root_mock.return_value = True
  1231. try:
  1232. ambari_server.reset(args)
  1233. self.fail("Should throw exception")
  1234. except FatalException as fe:
  1235. # Expected
  1236. self.assertFalse("root-level" in fe.reason)
  1237. pass
  1238. get_YN_inputMock.return_value = True
  1239. run_os_command_mock.return_value = (1, None, None)
  1240. try:
  1241. ambari_server.reset(args)
  1242. self.fail("Should throw exception")
  1243. except FatalException:
  1244. # Expected
  1245. pass
  1246. run_os_command_mock.return_value = (0, None, None)
  1247. ambari_server.reset(args)
  1248. self.assertTrue(setup_db_mock.called)
  1249. #remote db case
  1250. args.persistence_type = "remote"
  1251. execute_remote_script_mock.return_value=(0, None, None)
  1252. rcode = ambari_server.reset(args)
  1253. self.assertEqual(None, rcode)
  1254. self.assertTrue(execute_remote_script_mock.called)
  1255. @patch.object(ambari_server, "setup_db")
  1256. @patch.object(ambari_server, "print_info_msg")
  1257. @patch.object(ambari_server, "run_os_command")
  1258. @patch.object(ambari_server, "parse_properties_file")
  1259. @patch.object(ambari_server, "is_root")
  1260. def test_silent_reset(self, is_root_mock, parse_properties_file_mock,
  1261. run_os_command_mock, print_info_msg_mock,
  1262. setup_db_mock):
  1263. is_root_mock.return_value = True
  1264. args = MagicMock()
  1265. ambari_server.SILENT = True
  1266. self.assertTrue(ambari_server.SILENT)
  1267. run_os_command_mock.return_value = (0, None, None)
  1268. def signal_handler(signum, frame):
  1269. self.fail("Timed out!")
  1270. signal.signal(signal.SIGALRM, signal_handler)
  1271. signal.alarm(5)
  1272. rcode = ambari_server.reset(args)
  1273. self.assertEqual(None, rcode)
  1274. self.assertTrue(setup_db_mock.called)
  1275. @patch.object(ambari_server, 'save_master_key')
  1276. @patch('os.chmod', autospec=True)
  1277. @patch.object(ambari_server, 'get_validated_string_input')
  1278. @patch("os.environ")
  1279. @patch.object(ambari_server, "get_ambari_properties")
  1280. @patch("os.kill")
  1281. @patch("os.path.exists")
  1282. @patch("__builtin__.open")
  1283. @patch("subprocess.Popen")
  1284. @patch.object(ambari_server, "print_info_msg")
  1285. @patch.object(ambari_server, "search_file")
  1286. @patch.object(ambari_server, "find_jdk")
  1287. @patch.object(ambari_server, "print_error_msg")
  1288. @patch.object(ambari_server, "check_postgre_up")
  1289. @patch.object(ambari_server, "check_iptables")
  1290. @patch.object(ambari_server, "parse_properties_file")
  1291. @patch.object(ambari_server, "read_ambari_user")
  1292. @patch.object(ambari_server, "is_root")
  1293. @patch("getpass.getuser")
  1294. @patch("os.chdir")
  1295. def test_start(self, chdir_mock, getuser_mock, is_root_mock, read_ambari_user_mock,
  1296. parse_properties_file_mock, check_iptables_mock, check_postgre_up_mock,
  1297. print_error_msg_mock, find_jdk_mock, search_file_mock,
  1298. print_info_msg_mock, popenMock, openMock, pexistsMock,
  1299. killMock, get_ambari_properties_mock, os_environ_mock,
  1300. get_validated_string_input_method, os_chmod_method,
  1301. save_master_key_method):
  1302. args = MagicMock()
  1303. f = MagicMock()
  1304. f.readline.return_value = 42
  1305. openMock.return_value = f
  1306. get_ambari_properties_mock.return_value = \
  1307. {ambari_server.SECURITY_KEY_IS_PERSISTED : "True"}
  1308. # Checking "server is running"
  1309. pexistsMock.return_value = True
  1310. try:
  1311. ambari_server.start(args)
  1312. self.fail("Should fail with 'Server is running'")
  1313. except FatalException:
  1314. # Expected
  1315. pass
  1316. self.assertTrue(killMock.called)
  1317. killMock.reset_mock()
  1318. parse_properties_file_mock.reset_mock()
  1319. pexistsMock.return_value = False
  1320. # Checking situation when ambari user is not set up
  1321. read_ambari_user_mock.return_value = None
  1322. try:
  1323. ambari_server.start(args)
  1324. self.fail("Should fail with 'Can not detect a system user for Ambari'")
  1325. except FatalException as e:
  1326. # Expected
  1327. self.assertTrue('Can not detect a system user' in e.reason)
  1328. parse_properties_file_mock.reset_mock()
  1329. # Checking start from non-root when current user is not the same as a
  1330. # custom user
  1331. read_ambari_user_mock.return_value = "dummy-user"
  1332. getuser_mock.return_value = "non_custom_user"
  1333. is_root_mock.return_value = False
  1334. try:
  1335. ambari_server.start(args)
  1336. self.fail("Should fail with 'Can not start ambari-server as user...'")
  1337. except FatalException as e:
  1338. # Expected
  1339. self.assertTrue('Can not start ambari-server as user' in e.reason)
  1340. self.assertFalse(parse_properties_file_mock.called)
  1341. parse_properties_file_mock.reset_mock()
  1342. # Checking "jdk not found"
  1343. is_root_mock.return_value = True
  1344. find_jdk_mock.return_value = None
  1345. try:
  1346. ambari_server.start(args)
  1347. self.fail("Should fail with 'No JDK found'")
  1348. except FatalException as e:
  1349. # Expected
  1350. self.assertTrue('No JDK found' in e.reason)
  1351. find_jdk_mock.return_value = "somewhere"
  1352. parse_properties_file_mock.reset_mock()
  1353. ## Testing workflow under root
  1354. is_root_mock.return_value = True
  1355. # Remote DB
  1356. args.persistence_type="remote"
  1357. check_iptables_mock.return_value = (0, None)
  1358. try:
  1359. ambari_server.start(args)
  1360. except FatalException as e:
  1361. # Ignored
  1362. pass
  1363. self.assertFalse('Unable to start PostgreSQL server' in e.reason)
  1364. self.assertFalse(check_postgre_up_mock.called)
  1365. check_postgre_up_mock.reset_mock()
  1366. parse_properties_file_mock.reset_mock()
  1367. # Local DB
  1368. args.persistence_type="local"
  1369. # case: postgres failed to start
  1370. check_postgre_up_mock.return_value = 1
  1371. try:
  1372. ambari_server.start(args)
  1373. self.fail("Should fail with 'Unable to start PostgreSQL server'")
  1374. except FatalException as e:
  1375. # Expected
  1376. self.assertTrue('Unable to start PostgreSQL server' in e.reason)
  1377. self.assertTrue(check_postgre_up_mock.called)
  1378. parse_properties_file_mock.reset_mock()
  1379. # case: iptables failed to stop
  1380. check_postgre_up_mock.return_value = 0
  1381. check_iptables_mock.return_value = (1, ambari_server.IP_TBLS_ENABLED)
  1382. try:
  1383. ambari_server.start(args)
  1384. self.fail("Should fail with 'Failed to stop iptables'")
  1385. except FatalException as e:
  1386. # Expected
  1387. self.assertTrue('Failed to stop iptables' in e.reason)
  1388. parse_properties_file_mock.reset_mock()
  1389. check_iptables_mock.return_value = (0, None)
  1390. # Case: custom user is "root"
  1391. read_ambari_user_mock.return_value = "root"
  1392. ambari_server.start(args)
  1393. self.assertTrue(popenMock.called)
  1394. popen_arg = popenMock.call_args[0][0]
  1395. self.assertTrue(popen_arg[0] == "/bin/sh")
  1396. popenMock.reset_mock()
  1397. parse_properties_file_mock.reset_mock()
  1398. # Case: custom user is not "root"
  1399. read_ambari_user_mock.return_value = "not-root-user"
  1400. ambari_server.start(args)
  1401. self.assertTrue(chdir_mock.called)
  1402. self.assertTrue(popenMock.called)
  1403. popen_arg = popenMock.call_args[0][0]
  1404. self.assertTrue(popen_arg[0] == "/bin/su")
  1405. check_postgre_up_mock.reset_mock()
  1406. popenMock.reset_mock()
  1407. parse_properties_file_mock.reset_mock()
  1408. ## Testing workflow under non-root
  1409. is_root_mock.return_value = False
  1410. read_ambari_user_mock.return_value = "not-root-user"
  1411. getuser_mock.return_value = read_ambari_user_mock.return_value
  1412. parse_properties_file_mock.reset_mock()
  1413. # Local DB
  1414. args.persistence_type="local"
  1415. ambari_server.start(args)
  1416. self.assertFalse(check_postgre_up_mock.called)
  1417. parse_properties_file_mock.reset_mock()
  1418. # Remote DB
  1419. args.persistence_type="remote"
  1420. ambari_server.start(args)
  1421. self.assertFalse(check_postgre_up_mock.called)
  1422. parse_properties_file_mock.reset_mock()
  1423. # Checking call
  1424. check_iptables_mock.reset_mock()
  1425. check_iptables_mock.return_value = (0, None)
  1426. ambari_server.start(args)
  1427. self.assertTrue(popenMock.called)
  1428. popen_arg = popenMock.call_args[0][0]
  1429. self.assertTrue(popen_arg[0] == "/bin/sh")
  1430. self.assertFalse(check_iptables_mock.called)
  1431. parse_properties_file_mock.reset_mock()
  1432. # Test start under wrong user
  1433. read_ambari_user_mock.return_value = "not-root-user"
  1434. getuser_mock.return_value = "non_custom_user"
  1435. try:
  1436. ambari_server.start(args)
  1437. self.fail("Can not start ambari-server as user non_custom_user.")
  1438. except FatalException as e:
  1439. # Expected
  1440. self.assertTrue('Can not start ambari-server as user' in e.reason)
  1441. parse_properties_file_mock.reset_mock()
  1442. # Check environ master key is set
  1443. popenMock.reset_mock()
  1444. get_ambari_properties_mock.return_value = \
  1445. {ambari_server.SECURITY_KEY_IS_PERSISTED : "False"}
  1446. os_environ_mock.copy.return_value = {"a" : "b",
  1447. ambari_server.SECURITY_KEY_ENV_VAR_NAME : "masterkey"}
  1448. args.persistence_type="local"
  1449. read_ambari_user_mock.return_value = "root"
  1450. is_root_mock.return_value = True
  1451. ambari_server.start(args)
  1452. self.assertFalse(get_validated_string_input_method.called)
  1453. self.assertFalse(save_master_key_method.called)
  1454. popen_arg = popenMock.call_args[1]['env']
  1455. self.assertEquals(os_environ_mock.copy.return_value, popen_arg)
  1456. parse_properties_file_mock.reset_mock()
  1457. # Check environ master key is not set
  1458. popenMock.reset_mock()
  1459. os_environ_mock.reset_mock()
  1460. get_ambari_properties_mock.return_value = \
  1461. {ambari_server.SECURITY_KEY_IS_PERSISTED : "False"}
  1462. os_environ_mock.copy.return_value = {"a" : "b"}
  1463. args.persistence_type="local"
  1464. read_ambari_user_mock.return_value = "root"
  1465. is_root_mock.return_value = True
  1466. get_validated_string_input_method.return_value = "masterkey"
  1467. os_chmod_method.return_value = None
  1468. ambari_server.start(args)
  1469. self.assertTrue(get_validated_string_input_method.called)
  1470. self.assertTrue(save_master_key_method.called)
  1471. popen_arg = popenMock.call_args[1]['env']
  1472. self.assertEquals(os_environ_mock.copy.return_value, popen_arg)
  1473. @patch("__builtin__.open")
  1474. @patch("os.path.exists")
  1475. @patch("os.remove")
  1476. @patch("os.killpg")
  1477. @patch("os.getpgid")
  1478. @patch.object(ambari_server, "print_info_msg")
  1479. def test_stop(self, print_info_msg_mock, gpidMock, removeMock,
  1480. killMock, pexistsMock, openMock):
  1481. pexistsMock.return_value = True
  1482. f = MagicMock()
  1483. f.readline.return_value = "42"
  1484. openMock.return_value = f
  1485. ambari_server.stop(None)
  1486. self.assertTrue(f.readline.called)
  1487. self.assertTrue(killMock.called)
  1488. self.assertTrue(killMock.called)
  1489. self.assertTrue(f.close.called)
  1490. self.assertTrue(removeMock.called)
  1491. @patch.object(ambari_server, "configure_database_username_password")
  1492. @patch.object(ambari_server, "run_os_command")
  1493. @patch.object(ambari_server, "is_root")
  1494. def test_upgrade_stack(self, is_root_mock, run_os_command_mock,
  1495. configure_postgres_username_password_mock):
  1496. args = MagicMock()
  1497. # Testing call under non-root
  1498. is_root_mock.return_value = False
  1499. try:
  1500. ambari_server.upgrade_stack(args, 'HDP-2.0')
  1501. self.fail("Should throw exception")
  1502. except FatalException as fe:
  1503. # Expected
  1504. self.assertTrue("root-level" in fe.reason)
  1505. pass
  1506. # Testing calls under root
  1507. is_root_mock.return_value = True
  1508. run_os_command_mock.return_value = (0, '', '')
  1509. ambari_server.upgrade_stack(args, 'HDP-2.0')
  1510. self.assertTrue(configure_postgres_username_password_mock.called)
  1511. self.assertTrue(run_os_command_mock.called)
  1512. @patch.object(ambari_server, "adjust_directory_permissions")
  1513. @patch.object(ambari_server, "print_warning_msg")
  1514. @patch.object(ambari_server, "read_ambari_user")
  1515. @patch.object(ambari_server, "check_db_consistency")
  1516. @patch.object(ambari_server, "execute_db_script")
  1517. @patch.object(ambari_server, "check_postgre_up")
  1518. @patch.object(ambari_server, "update_ambari_properties")
  1519. @patch.object(ambari_server, "parse_properties_file")
  1520. @patch.object(ambari_server, "is_root")
  1521. def test_upgrade(self, is_root_mock, parse_properties_file_mock, update_ambari_properties_mock,
  1522. check_postgre_up_mock, execute_db_script_mock,
  1523. check_db_consistency_mock, read_ambari_user_mock,
  1524. print_warning_msg_mock, adjust_directory_permissions_mock):
  1525. args = MagicMock()
  1526. args.upgrade_script_file = "/var/lib/"\
  1527. "ambari-server/resources/upgrade/ddl/"\
  1528. "Ambari-DDL-Postgres-UPGRADE-1.3.0.sql"
  1529. update_ambari_properties_mock.return_value = 0
  1530. check_postgre_up_mock.return_value = 0
  1531. execute_db_script_mock.return_value = 0
  1532. check_db_consistency_mock.return_value = 0
  1533. # Testing call under non-root
  1534. is_root_mock.return_value = False
  1535. try:
  1536. ambari_server.upgrade(args)
  1537. self.fail("Should throw exception")
  1538. except FatalException as fe:
  1539. # Expected
  1540. self.assertTrue("root-level" in fe.reason)
  1541. pass
  1542. # Testing calls under root
  1543. is_root_mock.return_value = True
  1544. # Testing with undefined custom user
  1545. read_ambari_user_mock.return_value = None
  1546. ambari_server.upgrade(args)
  1547. self.assertTrue(print_warning_msg_mock.called)
  1548. warning_args = print_warning_msg_mock.call_args[0][0]
  1549. self.assertTrue("custom ambari user" in warning_args)
  1550. # Testing with defined custom user
  1551. read_ambari_user_mock.return_value = "ambari-custom-user"
  1552. ambari_server.upgrade(args)
  1553. self.assertTrue(adjust_directory_permissions_mock.called)
  1554. def test_print_info_msg(self):
  1555. out = StringIO.StringIO()
  1556. sys.stdout = out
  1557. ambari_server.VERBOSE = True
  1558. ambari_server.print_info_msg("msg")
  1559. self.assertNotEqual("", out.getvalue())
  1560. sys.stdout = sys.__stdout__
  1561. def test_print_error_msg(self):
  1562. out = StringIO.StringIO()
  1563. sys.stdout = out
  1564. ambari_server.VERBOSE = True
  1565. ambari_server.print_error_msg("msg")
  1566. self.assertNotEqual("", out.getvalue())
  1567. sys.stdout = sys.__stdout__
  1568. def test_print_warning_msg(self):
  1569. out = StringIO.StringIO()
  1570. sys.stdout = out
  1571. ambari_server.VERBOSE = True
  1572. ambari_server.print_warning_msg("msg")
  1573. self.assertNotEqual("", out.getvalue())
  1574. sys.stdout = sys.__stdout__
  1575. @patch.object(ambari_server, "get_choice_string_input")
  1576. def test_get_YN_input(self, get_choice_string_input_mock):
  1577. ambari_server.get_YN_input("prompt", "default")
  1578. self.assertTrue(get_choice_string_input_mock.called)
  1579. self.assertEqual(4, len(get_choice_string_input_mock.call_args_list[0][0]))
  1580. def test_load_default_db_properties(self):
  1581. args = MagicMock()
  1582. ambari_server.load_default_db_properties(args)
  1583. self.assertEquals(args.database, "postgres")
  1584. self.assertEquals(args.database_host, "localhost")
  1585. self.assertEquals(args.database_port, "5432")
  1586. self.assertEquals(args.database_name, "ambari")
  1587. self.assertEquals(args.database_username, "ambari")
  1588. self.assertEquals(args.database_password, "bigdata")
  1589. args = MagicMock()
  1590. ambari_server.DATABASE_INDEX=1
  1591. ambari_server.load_default_db_properties(args)
  1592. self.assertEquals(args.database, "oracle")
  1593. self.assertEquals(args.database_port, "1521")
  1594. failed = False
  1595. args = MagicMock()
  1596. ambari_server.DATABASE_INDEX=2
  1597. try:
  1598. ambari_server.load_default_db_properties(args)
  1599. except:
  1600. failed = True
  1601. self.assertTrue(failed)
  1602. pass
  1603. @patch.object(ambari_server, 'setup')
  1604. def test_main_db_options(self, setup_mock):
  1605. base_args = ["ambari-server.py", "setup"]
  1606. db_args = ["--database", "postgres", "--databasehost", "somehost.net", "--databaseport", "12345",
  1607. "--databasename", "ambari", "--databaseusername", "ambari", "--databasepassword", "bigdata"]
  1608. #test no args
  1609. failed = False
  1610. sys.argv = list(base_args)
  1611. try:
  1612. ambari_server.main()
  1613. except SystemExit:
  1614. failed = True
  1615. pass
  1616. self.assertFalse(failed)
  1617. self.assertTrue(setup_mock.called)
  1618. setup_mock.reset_mock()
  1619. #test full args
  1620. sys.argv = list(base_args)
  1621. sys.argv.extend(db_args)
  1622. try:
  1623. ambari_server.main()
  1624. except SystemExit:
  1625. failed = True
  1626. pass
  1627. self.assertTrue(ambari_server.PROMPT_DATABASE_OPTIONS)
  1628. self.assertFalse(failed)
  1629. self.assertTrue(setup_mock.called)
  1630. setup_mock.reset_mock()
  1631. #test not full args
  1632. sys.argv = list(base_args)
  1633. sys.argv.extend(["--database", "postgres"])
  1634. try:
  1635. ambari_server.main()
  1636. except SystemExit:
  1637. failed = True
  1638. pass
  1639. self.assertFalse(setup_mock.called)
  1640. self.assertTrue(failed)
  1641. setup_mock.reset_mock()
  1642. #test wrong database
  1643. failed = False
  1644. sys.argv = list(base_args)
  1645. sys.argv.extend(["--database", "unknown"])
  1646. sys.argv.extend(db_args[2:])
  1647. try:
  1648. ambari_server.main()
  1649. except SystemExit:
  1650. failed = True
  1651. pass
  1652. self.assertTrue(failed)
  1653. self.assertFalse(setup_mock.called)
  1654. setup_mock.reset_mock()
  1655. #test wrong port check
  1656. failed = False
  1657. sys.argv = list(base_args)
  1658. sys.argv.extend(["--databaseport", "unknown"])
  1659. sys.argv.extend(db_args[:4])
  1660. sys.argv.extend(db_args[6:])
  1661. try:
  1662. ambari_server.main()
  1663. except SystemExit:
  1664. failed = True
  1665. pass
  1666. self.assertTrue(failed)
  1667. self.assertFalse(setup_mock.called)
  1668. setup_mock.reset_mock()
  1669. pass
  1670. @patch.object(ambari_server, "load_default_db_properties")
  1671. @patch.object(ambari_server, "get_YN_input")
  1672. @patch.object(ambari_server, "get_validated_string_input")
  1673. @patch.object(ambari_server, "setup_master_key")
  1674. @patch.object(ambari_server, "configure_database_password")
  1675. def test_prompt_db_properties(self, configure_database_password_mock, setup_master_key_mock,
  1676. get_validated_string_input_mock, get_YN_input_mock, load_default_db_properties_mock):
  1677. args = MagicMock()
  1678. #test not prompt
  1679. ambari_server.PROMPT_DATABASE_OPTIONS = False
  1680. ambari_server.prompt_db_properties(args)
  1681. self.assertFalse(load_default_db_properties_mock.called)
  1682. self.assertFalse(get_validated_string_input_mock.called)
  1683. self.assertFalse(get_YN_input_mock.called)
  1684. load_default_db_properties_mock.reset_mock()
  1685. get_validated_string_input_mock.reset_mock()
  1686. get_YN_input_mock.reset_mock()
  1687. #test prompt
  1688. get_YN_input_mock.return_value = False
  1689. ambari_server.PROMPT_DATABASE_OPTIONS = True
  1690. ambari_server.prompt_db_properties(args)
  1691. self.assertTrue(get_YN_input_mock.called)
  1692. self.assertFalse(get_validated_string_input_mock.called)
  1693. self.assertTrue(load_default_db_properties_mock.called)
  1694. load_default_db_properties_mock.reset_mock()
  1695. get_validated_string_input_mock.reset_mock()
  1696. get_YN_input_mock.reset_mock()
  1697. #test prompt advanced
  1698. get_YN_input_mock.return_value = True
  1699. ambari_server.PROMPT_DATABASE_OPTIONS = True
  1700. setup_master_key_mock.return_value = (None, False, True)
  1701. configure_database_password_mock.return_value = ("test", None)
  1702. ambari_server.prompt_db_properties(args)
  1703. self.assertTrue(get_YN_input_mock.called)
  1704. self.assertTrue(get_validated_string_input_mock.called)
  1705. self.assertTrue(load_default_db_properties_mock.called)
  1706. self.assertEquals(args.database, "postgres")
  1707. load_default_db_properties_mock.reset_mock()
  1708. get_validated_string_input_mock.reset_mock()
  1709. get_YN_input_mock.reset_mock()
  1710. pass
  1711. @patch.object(ambari_server, "get_db_cli_tool")
  1712. @patch.object(ambari_server, "run_in_shell")
  1713. def test_execute_remote_script(self, run_in_shell_mock, get_db_cli_tool_mock):
  1714. args = MagicMock()
  1715. script = "script"
  1716. #success
  1717. run_in_shell_mock.return_value=(0, None, None)
  1718. get_db_cli_tool_mock.return_value="tool"
  1719. args.database = "postgres"
  1720. args.database_password = "some_password"
  1721. retcode, out, err = ambari_server.execute_remote_script(args, script)
  1722. self.assertEquals(retcode, 0)
  1723. self.assertTrue(get_db_cli_tool_mock.called)
  1724. self.assertTrue(run_in_shell_mock.called)
  1725. #fail no cli tool
  1726. get_db_cli_tool_mock.return_value = None
  1727. get_db_cli_tool_mock.called = False
  1728. run_in_shell_mock.called = False
  1729. retcode, out, err = ambari_server.execute_remote_script(args, script)
  1730. self.assertEquals(retcode, -1)
  1731. self.assertTrue(get_db_cli_tool_mock.called)
  1732. self.assertFalse(run_in_shell_mock.called)
  1733. #fail execute
  1734. errcode = 1
  1735. get_db_cli_tool_mock.return_value = "tool"
  1736. run_in_shell_mock.return_value=(errcode, None, None)
  1737. get_db_cli_tool_mock.called = False
  1738. run_in_shell_mock.called = False
  1739. retcode, out, err = ambari_server.execute_remote_script(args, script)
  1740. self.assertEquals(retcode, errcode)
  1741. self.assertTrue(get_db_cli_tool_mock.called)
  1742. self.assertTrue(run_in_shell_mock.called)
  1743. #fail wrong database - case should be completely impossible
  1744. get_db_cli_tool_mock.return_value = "tool"
  1745. run_in_shell_mock.return_value=(0, None, None)
  1746. get_db_cli_tool_mock.called = False
  1747. run_in_shell_mock.called = False
  1748. args.database = "unknown"
  1749. retcode, out, err = ambari_server.execute_remote_script(args, script)
  1750. self.assertEquals(retcode, -2)
  1751. self.assertTrue(get_db_cli_tool_mock.called)
  1752. self.assertFalse(run_in_shell_mock.called)
  1753. pass
  1754. @patch.object(ambari_server, "get_conf_dir")
  1755. def test_update_ambari_properties(self, get_conf_dir_mock):
  1756. properties = ["server.jdbc.user.name=ambari-server\n",
  1757. "server.jdbc.user.passwd=/etc/ambari-server/conf/password.dat\n",
  1758. "java.home=/usr/jdk64/jdk1.6.0_31\n",
  1759. "server.os_type=redhat6\n",
  1760. "ambari-server.user=ambari\n"]
  1761. NEW_PROPERTY = 'some_new_property=some_value\n'
  1762. CHANGED_VALUE_PROPERTY = 'server.os_type=should_not_overwrite_value\n'
  1763. get_conf_dir_mock.return_value = '/etc/ambari-server/conf'
  1764. (tf1, fn1) = tempfile.mkstemp()
  1765. (tf2, fn2) = tempfile.mkstemp()
  1766. ambari_server.AMBARI_PROPERTIES_RPMSAVE_FILE = fn1
  1767. ambari_server.AMBARI_PROPERTIES_FILE = fn2
  1768. with open(ambari_server.AMBARI_PROPERTIES_FILE, "w") as f:
  1769. f.write(NEW_PROPERTY)
  1770. f.write(CHANGED_VALUE_PROPERTY)
  1771. with open(ambari_server.AMBARI_PROPERTIES_RPMSAVE_FILE, 'w') as f:
  1772. for line in properties:
  1773. f.write(line)
  1774. #Call tested method
  1775. ambari_server.update_ambari_properties()
  1776. timestamp = datetime.datetime.now()
  1777. #RPMSAVE_FILE wasn't found
  1778. self.assertFalse(os.path.exists(ambari_server.AMBARI_PROPERTIES_RPMSAVE_FILE))
  1779. #Renamed RPMSAVE_FILE exists
  1780. self.assertTrue(os.path.exists(ambari_server.AMBARI_PROPERTIES_RPMSAVE_FILE
  1781. + '.' + timestamp.strftime('%Y%m%d%H%M%S')))
  1782. with open(ambari_server.AMBARI_PROPERTIES_FILE, 'r') as f:
  1783. ambari_properties_content = f.readlines()
  1784. for line in properties:
  1785. if not line in ambari_properties_content:
  1786. self.fail()
  1787. if not NEW_PROPERTY in ambari_properties_content:
  1788. self.fail()
  1789. if CHANGED_VALUE_PROPERTY in ambari_properties_content:
  1790. self.fail()
  1791. # Command should not fail if *.rpmsave file is missing
  1792. result = ambari_server.update_ambari_properties()
  1793. self.assertEquals(result, 0)
  1794. os.unlink(fn2)
  1795. #if ambari.properties file is absent then "ambari-server upgrade" should
  1796. # fail
  1797. (tf, fn) = tempfile.mkstemp()
  1798. ambari_server.AMBARI_PROPERTIES_RPMSAVE_FILE = fn
  1799. result = ambari_server.update_ambari_properties()
  1800. self.assertNotEquals(result, 0)
  1801. @patch.object(ambari_server.Properties, '__init__')
  1802. @patch.object(ambari_server, 'search_file')
  1803. def test_update_ambari_properties_negative_case(self, search_file_mock, properties_mock):
  1804. search_file_mock.return_value = None
  1805. #Call tested method
  1806. self.assertEquals(0, ambari_server.update_ambari_properties())
  1807. self.assertFalse(properties_mock.called)
  1808. search_file_mock.return_value = False
  1809. #Call tested method
  1810. self.assertEquals(0, ambari_server.update_ambari_properties())
  1811. self.assertFalse(properties_mock.called)
  1812. search_file_mock.return_value = ''
  1813. #Call tested method
  1814. self.assertEquals(0, ambari_server.update_ambari_properties())
  1815. self.assertFalse(properties_mock.called)
  1816. @patch("sys.exit")
  1817. @patch.object(ambari_server, "get_db_cli_tool")
  1818. @patch.object(ambari_server, "store_remote_properties")
  1819. @patch.object(ambari_server, "is_local_database")
  1820. @patch.object(ambari_server, "check_iptables")
  1821. @patch.object(ambari_server, "check_jdbc_drivers")
  1822. @patch.object(ambari_server, "is_root")
  1823. @patch.object(ambari_server, "check_ambari_user")
  1824. @patch.object(ambari_server, "download_jdk")
  1825. @patch.object(ambari_server, "configure_os_settings")
  1826. 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,
  1827. store_remote_properties_mock, get_db_cli_tool_mock, exit_mock):
  1828. args = MagicMock()
  1829. is_root_mock.return_value = True
  1830. is_local_db_mock.return_value = False
  1831. check_iptables_mock.return_value = (0, "other")
  1832. store_remote_properties_mock.return_value = 0
  1833. get_db_cli_tool_mock.return_value = None
  1834. check_jdbc_drivers_mock.return_value=0
  1835. check_ambari_user_mock.return_value = 0
  1836. download_jdk_mock.return_value = 0
  1837. configure_os_settings_mock.return_value = 0
  1838. try:
  1839. ambari_server.setup(args)
  1840. self.fail("Should throw exception")
  1841. except FatalException as fe:
  1842. # Expected
  1843. self.assertTrue("The cli was not found" in fe.reason)
  1844. @patch.object(ambari_server, "parse_properties_file")
  1845. @patch.object(ambari_server, "get_db_cli_tool")
  1846. @patch.object(ambari_server, "print_error_msg")
  1847. @patch.object(ambari_server, "get_YN_input")
  1848. @patch.object(ambari_server, "setup_db")
  1849. @patch.object(ambari_server, "run_os_command")
  1850. @patch.object(ambari_server, "is_root")
  1851. def test_reset_remote_db_wo_client(self, is_root_mock, run_os_command_mock, setup_db_mock,
  1852. get_YN_inputMock, print_error_msg_mock, get_db_cli_tool_mock, parse_properties_file_mock):
  1853. args = MagicMock()
  1854. get_YN_inputMock.return_value = True
  1855. run_os_command_mock.return_value = (0, None, None)
  1856. args.persistence_type="remote"
  1857. get_db_cli_tool_mock.return_value = None
  1858. is_root_mock.return_value = True
  1859. try:
  1860. ambari_server.reset(args)
  1861. self.fail("Should throw exception")
  1862. except FatalException as fe:
  1863. # Expected
  1864. self.assertTrue("Client wasn't found" in fe.reason)
  1865. pass
  1866. @patch.object(ambari_server, "find_properties_file")
  1867. def test_get_ambari_properties(self, find_properties_file_mock):
  1868. find_properties_file_mock.return_value = None
  1869. rcode = ambari_server.get_ambari_properties()
  1870. self.assertEqual(rcode, -1)
  1871. tf1 = tempfile.NamedTemporaryFile()
  1872. find_properties_file_mock.return_value = tf1.name
  1873. prop_name='name'
  1874. prop_value='val'
  1875. with open(tf1.name, 'w') as fout:
  1876. fout.write(prop_name + '=' + prop_value)
  1877. fout.close()
  1878. properties = ambari_server.get_ambari_properties()
  1879. self.assertEqual(properties[prop_name], prop_value)
  1880. @patch.object(ambari_server, "get_ambari_properties")
  1881. @patch.object(ambari_server, "find_jdbc_driver")
  1882. @patch.object(ambari_server, "copy_files")
  1883. @patch.object(ambari_server, "print_error_msg")
  1884. @patch.object(ambari_server, "print_warning_msg")
  1885. @patch('__builtin__.raw_input')
  1886. @patch("sys.exit")
  1887. def check_jdbc_drivers(self, exit_mock, raw_input_mock, print_warning_msg, print_error_msg_mock, copy_files_mock,
  1888. find_jdbc_driver_mock, get_ambari_properties_mock):
  1889. out = StringIO.StringIO()
  1890. sys.stdout = out
  1891. args = MagicMock()
  1892. # Check positive scenario
  1893. drivers_list = ['driver_file']
  1894. resources_dir = '/tmp'
  1895. get_ambari_properties_mock.return_value = {ambari_server.RESOURCES_DIR_PROPERTY : resources_dir}
  1896. find_jdbc_driver_mock.return_value = drivers_list
  1897. args.database = "oracle"
  1898. rcode = ambari_server.check_jdbc_drivers(args)
  1899. self.assertEqual(0, rcode)
  1900. copy_files_mock.assert_called_with(drivers_list, resources_dir)
  1901. # Check negative scenarios
  1902. # Silent option, no drivers
  1903. ambari_server.SILENT = True
  1904. find_jdbc_driver_mock.return_value = -1
  1905. rcode = ambari_server.check_jdbc_drivers(args)
  1906. self.assertTrue(print_error_msg_mock.called)
  1907. self.assertTrue(exit_mock.called)
  1908. # Non-Silent option, no drivers
  1909. ambari_server.SILENT = False
  1910. find_jdbc_driver_mock.return_value = -1
  1911. rcode = ambari_server.check_jdbc_drivers(args)
  1912. self.assertTrue(exit_mock.called)
  1913. self.assertTrue(print_error_msg_mock.called)
  1914. # Non-Silent option, no drivers at first ask, present drivers after that
  1915. find_jdbc_driver_mock.side_effect = [-1, drivers_list]
  1916. rcode = ambari_server.check_jdbc_drivers(args)
  1917. self.assertEqual(0, rcode)
  1918. copy_files_mock.assert_called_with(drivers_list, resources_dir)
  1919. # Non-Silent option, no drivers at first ask, present drivers after that
  1920. find_jdbc_driver_mock.reset()
  1921. find_jdbc_driver_mock.side_effect = [-1, -1]
  1922. rcode = ambari_server.check_jdbc_drivers(args)
  1923. self.assertTrue(exit_mock.called)
  1924. self.assertTrue(print_error_msg_mock.called)
  1925. sys.stdout = sys.__stdout__
  1926. @patch.object(ambari_server, "find_properties_file")
  1927. def test_get_ambari_properties(self, find_properties_file):
  1928. find_properties_file.return_value = None
  1929. rcode = ambari_server.get_ambari_properties()
  1930. self.assertEqual(rcode, -1)
  1931. tf1 = tempfile.NamedTemporaryFile()
  1932. find_properties_file.return_value = tf1.name
  1933. prop_name='name'
  1934. prop_value='val'
  1935. with open(tf1.name, 'w') as fout:
  1936. fout.write(prop_name + '=' + prop_value)
  1937. fout.close()
  1938. properties = ambari_server.get_ambari_properties()
  1939. self.assertEqual(properties[prop_name], prop_value)
  1940. self.assertEqual(properties.fileName, os.path.abspath(tf1.name))
  1941. sys.stdout = sys.__stdout__
  1942. @patch.object(ambari_server, "get_ambari_properties")
  1943. @patch.object(ambari_server, "find_jdbc_driver")
  1944. @patch.object(ambari_server, "copy_files")
  1945. @patch.object(ambari_server, "print_error_msg")
  1946. @patch.object(ambari_server, "print_warning_msg")
  1947. @patch('__builtin__.raw_input')
  1948. def test_check_jdbc_drivers(self, raw_input_mock, print_warning_msg, print_error_msg_mock, copy_files_mock,
  1949. find_jdbc_driver_mock, get_ambari_properties_mock):
  1950. out = StringIO.StringIO()
  1951. sys.stdout = out
  1952. args = MagicMock()
  1953. # Check positive scenario
  1954. drivers_list = ['driver_file']
  1955. resources_dir = '/tmp'
  1956. get_ambari_properties_mock.return_value = {ambari_server.RESOURCES_DIR_PROPERTY : resources_dir}
  1957. find_jdbc_driver_mock.return_value = drivers_list
  1958. copy_files_mock.return_value = 0
  1959. args.database = "oracle"
  1960. rcode = ambari_server.check_jdbc_drivers(args)
  1961. self.assertEqual(0, rcode)
  1962. copy_files_mock.assert_called_with(drivers_list, resources_dir)
  1963. get_ambari_properties_mock.reset_mock()
  1964. find_jdbc_driver_mock.reset_mock()
  1965. copy_files_mock.reset_mock()
  1966. print_error_msg_mock.reset_mock()
  1967. print_warning_msg.reset_mock()
  1968. raw_input_mock.reset_mock()
  1969. # Check negative scenarios
  1970. # Silent option, no drivers
  1971. ambari_server.SILENT = True
  1972. find_jdbc_driver_mock.return_value = -1
  1973. failed = False
  1974. try:
  1975. rcode = ambari_server.check_jdbc_drivers(args)
  1976. except FatalException:
  1977. failed = True
  1978. self.assertTrue(print_error_msg_mock.called)
  1979. self.assertTrue(failed)
  1980. get_ambari_properties_mock.reset_mock()
  1981. find_jdbc_driver_mock.reset_mock()
  1982. copy_files_mock.reset_mock()
  1983. print_error_msg_mock.reset_mock()
  1984. print_warning_msg.reset_mock()
  1985. raw_input_mock.reset_mock()
  1986. # Non-Silent option, no drivers
  1987. ambari_server.SILENT = False
  1988. find_jdbc_driver_mock.return_value = -1
  1989. failed = False
  1990. try:
  1991. rcode = ambari_server.check_jdbc_drivers(args)
  1992. except FatalException:
  1993. failed = True
  1994. self.assertTrue(failed)
  1995. self.assertTrue(print_error_msg_mock.called)
  1996. get_ambari_properties_mock.reset_mock()
  1997. find_jdbc_driver_mock.reset_mock()
  1998. copy_files_mock.reset_mock()
  1999. print_error_msg_mock.reset_mock()
  2000. print_warning_msg.reset_mock()
  2001. raw_input_mock.reset_mock()
  2002. # Non-Silent option, no drivers at first ask, present drivers after that
  2003. find_jdbc_driver_mock.side_effect = [-1, drivers_list]
  2004. rcode = ambari_server.check_jdbc_drivers(args)
  2005. self.assertEqual(0, rcode)
  2006. copy_files_mock.assert_called_with(drivers_list, resources_dir)
  2007. get_ambari_properties_mock.reset_mock()
  2008. find_jdbc_driver_mock.reset_mock()
  2009. copy_files_mock.reset_mock()
  2010. print_error_msg_mock.reset_mock()
  2011. print_warning_msg.reset_mock()
  2012. raw_input_mock.reset_mock()
  2013. # Non-Silent option, no drivers at first ask, no drivers after that
  2014. find_jdbc_driver_mock.side_effect = [-1, -1]
  2015. failed = False
  2016. try:
  2017. rcode = ambari_server.check_jdbc_drivers(args)
  2018. except FatalException:
  2019. failed = True
  2020. self.assertTrue(failed)
  2021. self.assertTrue(print_error_msg_mock.called)
  2022. get_ambari_properties_mock.reset_mock()
  2023. find_jdbc_driver_mock.reset_mock()
  2024. copy_files_mock.reset_mock()
  2025. print_error_msg_mock.reset_mock()
  2026. print_warning_msg.reset_mock()
  2027. raw_input_mock.reset_mock()
  2028. # Failed to copy_files
  2029. find_jdbc_driver_mock.side_effect = [drivers_list]
  2030. try:
  2031. rcode = ambari_server.check_jdbc_drivers(args)
  2032. except FatalException:
  2033. failed = True
  2034. self.assertTrue(failed)
  2035. sys.stdout = sys.__stdout__
  2036. @patch.object(ambari_server, "find_properties_file")
  2037. def test_get_ambari_properties(self, find_properties_file_mock):
  2038. find_properties_file_mock.return_value = None
  2039. rcode = ambari_server.get_ambari_properties()
  2040. self.assertEqual(rcode, -1)
  2041. tf1 = tempfile.NamedTemporaryFile()
  2042. find_properties_file_mock.return_value = tf1.name
  2043. prop_name='name'
  2044. prop_value='val'
  2045. with open(tf1.name, 'w') as fout:
  2046. fout.write(prop_name + '=' + prop_value)
  2047. fout.close()
  2048. properties = ambari_server.get_ambari_properties()
  2049. self.assertEqual(properties[prop_name], prop_value)
  2050. self.assertEqual(properties.fileName, os.path.abspath(tf1.name))
  2051. sys.stdout = sys.__stdout__
  2052. @patch.object(ambari_server, "find_properties_file")
  2053. def test_parse_properties_file(self, find_properties_file_mock):
  2054. tf1 = tempfile.NamedTemporaryFile(mode='r')
  2055. find_properties_file_mock.return_value = tf1.name
  2056. args = MagicMock()
  2057. ambari_server.parse_properties_file(args)
  2058. self.assertEquals(args.persistence_type, "local")
  2059. with open(tf1.name, 'w') as fout:
  2060. fout.write("\n")
  2061. fout.write(ambari_server.PERSISTENCE_TYPE_PROPERTY+"=remote")
  2062. args = MagicMock()
  2063. ambari_server.parse_properties_file(args)
  2064. self.assertEquals(args.persistence_type, "remote")
  2065. @patch.object(ambari_server, 'setup_master_key')
  2066. @patch.object(ambari_server, 'read_passwd_for_alias')
  2067. @patch.object(ambari_server, 'is_alias_string')
  2068. @patch.object(ambari_server, 'get_ambari_properties')
  2069. def test_configure_database_username_password_masterkey_persisted(self,
  2070. get_ambari_properties_method, is_alias_string_method,
  2071. read_passwd_for_alias_method, setup_master_key_method):
  2072. out = StringIO.StringIO()
  2073. sys.stdout = out
  2074. configs = {ambari_server.JDBC_USER_NAME_PROPERTY: "fakeuser",
  2075. ambari_server.JDBC_PASSWORD_PROPERTY: "${alias=somealias}",
  2076. ambari_server.SECURITY_KEY_IS_PERSISTED: "True" }
  2077. get_ambari_properties_method.return_value = configs
  2078. is_alias_string_method.return_value = True
  2079. read_passwd_for_alias_method.return_value = "falepasswd"
  2080. args = MagicMock()
  2081. ambari_server.configure_database_username_password(args)
  2082. self.assertTrue(read_passwd_for_alias_method.called)
  2083. self.assertTrue(is_alias_string_method.called)
  2084. self.assertEquals("fakeuser", args.database_username)
  2085. self.assertEquals("falepasswd", args.database_password)
  2086. configs[ambari_server.SECURITY_KEY_IS_PERSISTED] = "False"
  2087. get_ambari_properties_method.return_value = configs
  2088. args.reset_mock()
  2089. setup_master_key_method.return_value = (None, True, True)
  2090. ambari_server.configure_database_username_password(args)
  2091. self.assertTrue(setup_master_key_method.called)
  2092. read_passwd_for_alias_method.assert_called_with(
  2093. ambari_server.JDBC_RCA_PASSWORD_ALIAS, None)
  2094. sys.stdout = sys.__stdout__
  2095. @patch.object(ambari_server, 'save_passwd_for_alias')
  2096. @patch.object(ambari_server, 'read_password')
  2097. def test_configure_database_password(self, read_password_method,
  2098. save_passwd_for_alias_method):
  2099. out = StringIO.StringIO()
  2100. sys.stdout = out
  2101. read_password_method.return_value = "fakepasswd"
  2102. save_passwd_for_alias_method.return_value = 0
  2103. result = ambari_server.configure_database_password(True, None, True)
  2104. self.assertTrue(save_passwd_for_alias_method.called)
  2105. self.assertTrue(read_password_method.called)
  2106. save_passwd_for_alias_method.assert_called_with(ambari_server
  2107. .JDBC_RCA_PASSWORD_ALIAS, "fakepasswd", None)
  2108. self.assertEquals(("fakepasswd", ambari_server.get_alias_string(
  2109. ambari_server.JDBC_RCA_PASSWORD_ALIAS)), result)
  2110. save_passwd_for_alias_method.reset_mock()
  2111. result = ambari_server.configure_database_password(False, None, True)
  2112. self.assertFalse(save_passwd_for_alias_method.called)
  2113. self.assertEquals(("fakepasswd", None), result)
  2114. save_passwd_for_alias_method.reset_mock()
  2115. save_passwd_for_alias_method.return_value = -1
  2116. result = ambari_server.configure_database_password(True, None, True)
  2117. self.assertEquals(("fakepasswd", None), result)
  2118. sys.stdout = sys.__stdout__
  2119. @patch.object(ambari_server, 'update_properties')
  2120. @patch.object(ambari_server, 'save_master_key')
  2121. @patch.object(ambari_server, 'get_validated_string_input')
  2122. @patch.object(ambari_server, 'get_YN_input')
  2123. @patch.object(ambari_server, 'get_ambari_properties')
  2124. def test_setup_master_key_persist(self, get_ambari_properties_method,
  2125. get_YN_input_method, get_validated_string_input_method,
  2126. save_master_key_method, update_properties_method):
  2127. out = StringIO.StringIO()
  2128. sys.stdout = out
  2129. configs = { ambari_server.SECURITY_MASTER_KEY_LOCATION : "filepath",
  2130. ambari_server.SECURITY_KEYS_DIR : tempfile.gettempdir(),
  2131. ambari_server.SECURITY_KEY_IS_PERSISTED : None }
  2132. get_ambari_properties_method.return_value = configs
  2133. get_YN_input_method.return_value = True
  2134. get_validated_string_input_method.return_value = "aaa"
  2135. save_master_key_method.return_value = None
  2136. update_properties_method.return_value = None
  2137. ambari_server.setup_master_key(False)
  2138. self.assertTrue(get_YN_input_method.called)
  2139. self.assertTrue(get_validated_string_input_method.called)
  2140. self.assertTrue(save_master_key_method.called)
  2141. self.assertTrue(update_properties_method.called)
  2142. sys.stdout = sys.__stdout__
  2143. @patch.object(ambari_server, 'update_properties')
  2144. @patch.object(ambari_server, 'save_master_key')
  2145. @patch.object(ambari_server, 'get_validated_string_input')
  2146. @patch.object(ambari_server, 'get_YN_input')
  2147. @patch.object(ambari_server, 'get_ambari_properties')
  2148. def test_setup_master_key_not_persist(self, get_ambari_properties_method,
  2149. get_YN_input_method, get_validated_string_input_method,
  2150. save_master_key_method, update_properties_method):
  2151. out = StringIO.StringIO()
  2152. sys.stdout = out
  2153. configs = { ambari_server.SECURITY_MASTER_KEY_LOCATION : "filepath",
  2154. ambari_server.SECURITY_KEYS_DIR : tempfile.gettempdir(),
  2155. ambari_server.SECURITY_KEY_IS_PERSISTED : None }
  2156. get_ambari_properties_method.return_value = configs
  2157. get_YN_input_method.side_effect = [True, False]
  2158. get_validated_string_input_method.return_value = "aaa"
  2159. save_master_key_method.return_value = None
  2160. update_properties_method.return_value = None
  2161. ambari_server.setup_master_key(False)
  2162. self.assertTrue(get_YN_input_method.called)
  2163. self.assertTrue(get_validated_string_input_method.called)
  2164. self.assertTrue(update_properties_method.called)
  2165. self.assertFalse(save_master_key_method.called)
  2166. sys.stdout = sys.__stdout__
  2167. @patch.object(ambari_server, 'get_master_key_ispersisted')
  2168. @patch.object(ambari_server, 'update_properties')
  2169. @patch.object(ambari_server, 'save_master_key')
  2170. @patch.object(ambari_server, 'get_validated_string_input')
  2171. @patch.object(ambari_server, 'get_YN_input')
  2172. @patch.object(ambari_server, 'get_ambari_properties')
  2173. @patch.object(ambari_server, 'search_file')
  2174. def test_setup_master_key_already_persisted(self, search_file_message,
  2175. get_ambari_properties_method,
  2176. get_YN_input_method, get_validated_string_input_method,
  2177. save_master_key_method, update_properties_method,
  2178. get_master_key_ispersisted_method):
  2179. out = StringIO.StringIO()
  2180. sys.stdout = out
  2181. configs = { ambari_server.SECURITY_MASTER_KEY_LOCATION : "filepath",
  2182. ambari_server.SECURITY_KEYS_DIR : tempfile.gettempdir(),
  2183. ambari_server.SECURITY_KEY_IS_PERSISTED : "true" }
  2184. get_ambari_properties_method.return_value = configs
  2185. get_master_key_ispersisted_method.return_value = True
  2186. search_file_message.return_value = "filepath"
  2187. ambari_server.setup_master_key(False)
  2188. self.assertFalse(save_master_key_method.called)
  2189. self.assertFalse(get_YN_input_method.called)
  2190. self.assertFalse(get_validated_string_input_method.called)
  2191. self.assertFalse(update_properties_method.called)
  2192. sys.stdout = sys.__stdout__
  2193. @patch.object(ambari_server, 'configure_ldap_password')
  2194. @patch.object(ambari_server, 'configure_database_password')
  2195. @patch.object(ambari_server, 'is_alias_string')
  2196. @patch.object(ambari_server, 'get_master_key_ispersisted')
  2197. @patch.object(ambari_server, 'update_properties')
  2198. @patch.object(ambari_server, 'save_master_key')
  2199. @patch.object(ambari_server, 'get_validated_string_input')
  2200. @patch.object(ambari_server, 'get_YN_input')
  2201. @patch.object(ambari_server, 'search_file')
  2202. @patch.object(ambari_server, 'get_ambari_properties')
  2203. def test_reset_master_key_persisted(self, get_ambari_properties_method,
  2204. search_file_message, get_YN_input_method,
  2205. get_validated_string_input_method, save_master_key_method,
  2206. update_properties_method, get_master_key_ispersisted_method,
  2207. is_alias_string_method, configure_database_password_method,
  2208. configure_ldap_password_method):
  2209. out = StringIO.StringIO()
  2210. sys.stdout = out
  2211. search_file_message.return_value = "filepath"
  2212. configs = { ambari_server.SECURITY_MASTER_KEY_LOCATION : "filepath",
  2213. ambari_server.SECURITY_KEYS_DIR : tempfile.gettempdir(),
  2214. ambari_server.SECURITY_KEY_IS_PERSISTED : "true",
  2215. ambari_server.JDBC_PASSWORD_PROPERTY : "${alias=fakealias}",
  2216. ambari_server.LDAP_MGR_PASSWORD_PROPERTY : "${alias=fakealias}"}
  2217. get_ambari_properties_method.return_value = configs
  2218. get_master_key_ispersisted_method.return_value = True
  2219. get_validated_string_input_method.return_value = "aaa"
  2220. get_YN_input_method.return_value = True
  2221. is_alias_string_method.return_value = True
  2222. ambari_server.reset_master_key()
  2223. self.assertTrue(save_master_key_method.called)
  2224. self.assertTrue(get_YN_input_method.called)
  2225. self.assertTrue(get_validated_string_input_method.called)
  2226. self.assertTrue(update_properties_method.called)
  2227. self.assertTrue(configure_database_password_method.called)
  2228. self.assertTrue(configure_ldap_password_method.called)
  2229. sys.stdout = sys.__stdout__
  2230. @patch.object(ambari_server, 'configure_ldap_password')
  2231. @patch.object(ambari_server, 'configure_database_password')
  2232. @patch.object(ambari_server, 'is_alias_string')
  2233. @patch.object(ambari_server, 'get_master_key_ispersisted')
  2234. @patch.object(ambari_server, 'update_properties')
  2235. @patch.object(ambari_server, 'save_master_key')
  2236. @patch.object(ambari_server, 'get_validated_string_input')
  2237. @patch.object(ambari_server, 'get_YN_input')
  2238. @patch.object(ambari_server, 'search_file')
  2239. @patch.object(ambari_server, 'get_ambari_properties')
  2240. def test_reset_master_key_not_persisted(self, get_ambari_properties_method,
  2241. search_file_message, get_YN_input_method,
  2242. get_validated_string_input_method, save_master_key_method,
  2243. update_properties_method, get_master_key_ispersisted_method,
  2244. is_alias_string_method, configure_database_password_method,
  2245. configure_ldap_password_method):
  2246. out = StringIO.StringIO()
  2247. sys.stdout = out
  2248. search_file_message.return_value = "filepath"
  2249. configs = { ambari_server.SECURITY_MASTER_KEY_LOCATION : "filepath",
  2250. ambari_server.SECURITY_KEYS_DIR : tempfile.gettempdir(),
  2251. ambari_server.SECURITY_KEY_IS_PERSISTED : "false",
  2252. ambari_server.JDBC_PASSWORD_PROPERTY : "${alias=fakealias}",
  2253. ambari_server.LDAP_MGR_PASSWORD_PROPERTY : "${alias=fakealias}"}
  2254. get_ambari_properties_method.return_value = configs
  2255. get_master_key_ispersisted_method.return_value = False
  2256. get_validated_string_input_method.return_value = "aaa"
  2257. get_YN_input_method.return_value = False
  2258. is_alias_string_method.return_value = True
  2259. ambari_server.reset_master_key()
  2260. self.assertFalse(save_master_key_method.called)
  2261. self.assertTrue(get_YN_input_method.called)
  2262. self.assertTrue(get_validated_string_input_method.called)
  2263. self.assertTrue(update_properties_method.called)
  2264. self.assertTrue(configure_database_password_method.called)
  2265. self.assertTrue(configure_ldap_password_method.called)
  2266. sys.stdout = sys.__stdout__
  2267. @patch.object(ambari_server, 'save_passwd_for_alias')
  2268. @patch.object(ambari_server, 'get_YN_input')
  2269. @patch.object(ambari_server, 'update_properties')
  2270. @patch.object(ambari_server, 'configure_ldap_password')
  2271. @patch.object(ambari_server, 'get_validated_string_input')
  2272. @patch.object(ambari_server, 'setup_master_key')
  2273. @patch.object(ambari_server, 'search_file')
  2274. @patch.object(ambari_server, 'get_ambari_properties')
  2275. def test_setup_ldap(self, get_ambari_properties_method,
  2276. search_file_message, setup_master_key_method,
  2277. get_validated_string_input_method,
  2278. configure_ldap_password_method, update_properties_method,
  2279. get_YN_input_method, save_passwd_for_alias_method):
  2280. out = StringIO.StringIO()
  2281. sys.stdout = out
  2282. search_file_message.return_value = "filepath"
  2283. configs = { ambari_server.SECURITY_MASTER_KEY_LOCATION : "filepath",
  2284. ambari_server.SECURITY_KEYS_DIR : tempfile.gettempdir(),
  2285. ambari_server.SECURITY_KEY_IS_PERSISTED : "true"
  2286. }
  2287. get_ambari_properties_method.return_value = configs
  2288. configure_ldap_password_method.return_value = "password"
  2289. setup_master_key_method.return_value = (None, True, True)
  2290. get_YN_input_method.return_value = True
  2291. save_passwd_for_alias_method.return_value = 0
  2292. def side_effect(*args, **kwargs):
  2293. if 'Bind anonymously' in args[0]:
  2294. return 'true'
  2295. if args[1] == "true" or args[1] == "false":
  2296. return args[1]
  2297. else:
  2298. return "test"
  2299. get_validated_string_input_method.side_effect = side_effect
  2300. ambari_server.setup_ldap()
  2301. ldap_properties_map =\
  2302. {
  2303. "authentication.ldap.primaryUrl" : "test",
  2304. "authentication.ldap.secondaryUrl" : "test",
  2305. "authentication.ldap.useSSL" : "true",
  2306. "authentication.ldap.usernameAttribute" : "test",
  2307. "authentication.ldap.baseDn" : "test",
  2308. "authorization.userRoleName" : "test",
  2309. "authorization.adminRoleName" : "test",
  2310. "authentication.ldap.bindAnonymously" : "true",
  2311. "authentication.ldap.managerDn" : "test",
  2312. "authentication.ldap.managerPassword" : \
  2313. '${alias=ambari.ldap.manager.password}'
  2314. }
  2315. self.assertEquals(sorted(update_properties_method.call_args[0][0]),
  2316. sorted(ldap_properties_map))
  2317. self.assertTrue(update_properties_method.called)
  2318. self.assertTrue(configure_ldap_password_method.called)
  2319. self.assertTrue(get_validated_string_input_method.called)
  2320. self.assertTrue(get_YN_input_method.called)
  2321. sys.stdout = sys.__stdout__
  2322. @patch.object(ambari_server, 'read_password')
  2323. def test_configure_ldap_password(self, read_password_method):
  2324. out = StringIO.StringIO()
  2325. sys.stdout = out
  2326. read_password_method.return_value = "blah"
  2327. ambari_server.configure_ldap_password()
  2328. self.assertTrue(read_password_method.called)
  2329. sys.stdout = sys.__stdout__
  2330. def get_sample(self, sample):
  2331. """
  2332. Returns sample file content as string with normalized line endings
  2333. """
  2334. path = self.get_samples_dir(sample)
  2335. return self.get_file_string(path)
  2336. def get_file_string(self, file):
  2337. """
  2338. Returns file content as string with normalized line endings
  2339. """
  2340. string = open(file, 'r').read()
  2341. return self.normalize(string)
  2342. def normalize(self, string):
  2343. """
  2344. Normalizes line ending in string according to platform-default encoding
  2345. """
  2346. return string.replace("\n", os.linesep)
  2347. def get_samples_dir(self, sample):
  2348. """
  2349. Returns full file path by sample name
  2350. """
  2351. testdir = os.path.dirname(__file__)
  2352. return os.path.dirname(testdir) + os.sep + "resources" + os.sep \
  2353. + 'TestAmbaryServer.samples/' + sample