TestAmbaryServer.py 124 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468
  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. import re
  18. from unittest import TestCase
  19. import sys
  20. from mock.mock import patch
  21. from mock.mock import MagicMock
  22. from mock.mock import create_autospec
  23. import os, errno, tempfile
  24. import signal
  25. import stat
  26. import datetime
  27. import operator
  28. from pwd import getpwnam
  29. # We have to use this import HACK because the filename contains a dash
  30. ambari_server = __import__('ambari-server')
  31. FatalException = ambari_server.FatalException
  32. NonFatalException = ambari_server.NonFatalException
  33. class TestAmbariServer(TestCase):
  34. def setUp(self):
  35. out = StringIO.StringIO()
  36. sys.stdout = out
  37. def tearDown(self):
  38. sys.stdout = sys.__stdout__
  39. @patch.object(ambari_server, 'configure_database_username_password')
  40. @patch.object(ambari_server, 'run_os_command')
  41. @patch('optparse.Values')
  42. def test_configure_pg_hba_ambaridb_users(self, OptParseValuesMock,
  43. run_os_command_method,
  44. configure_database_username_password_method):
  45. # Prepare mocks
  46. run_os_command_method.return_value = (0, "", "")
  47. opvm = OptParseValuesMock.return_value
  48. opvm.database_username = "ffdf"
  49. tf1 = tempfile.NamedTemporaryFile()
  50. ambari_server.PG_HBA_CONF_FILE = tf1.name
  51. # Run test
  52. ambari_server.configure_pg_hba_ambaridb_users()
  53. # Check results
  54. self.assertTrue(run_os_command_method.called)
  55. self.assertTrue(configure_database_username_password_method.called)
  56. string_expected = self.get_file_string(self
  57. .get_samples_dir("configure_pg_hba_ambaridb_users1"))
  58. string_actual = self.get_file_string(ambari_server.PG_HBA_CONF_FILE)
  59. self.assertEquals(string_expected, string_actual)
  60. pass
  61. @patch('__builtin__.raw_input')
  62. def test_servicename_regex(self, raw_input_method):
  63. ''' Test to make sure the service name can contain digits '''
  64. ambari_server.SILENT = False
  65. raw_input_method.return_value = "OT100"
  66. result = ambari_server.get_validated_service_name("ambari", 1)
  67. self.assertEqual("OT100", result, "Not accepting digits")
  68. pass
  69. @patch('__builtin__.raw_input')
  70. def test_dbname_regex(self, raw_input_method):
  71. ''' Test to make sure the service name can contain digits '''
  72. ambari_server.SILENT = False
  73. raw_input_method.return_value = "OT100"
  74. result = ambari_server.get_validated_db_name("ambari")
  75. self.assertEqual("OT100", result, "Not accepting digits")
  76. def test_configure_pg_hba_postgres_user(self):
  77. tf1 = tempfile.NamedTemporaryFile()
  78. ambari_server.PG_HBA_CONF_FILE = tf1.name
  79. with open(ambari_server.PG_HBA_CONF_FILE, 'w') as fout:
  80. fout.write("\n")
  81. fout.write("local all all md5\n")
  82. fout.write("host all all 0.0.0.0/0 md5\n")
  83. fout.write("host all all ::/0 md5\n")
  84. ambari_server.configure_pg_hba_postgres_user()
  85. expected = self.get_file_string(self.get_samples_dir(
  86. "configure_pg_hba_ambaridb_users2"))
  87. result = self.get_file_string(ambari_server.PG_HBA_CONF_FILE)
  88. self.assertEqual(expected, result, "pg_hba_conf not processed")
  89. mode = oct(os.stat(ambari_server.PG_HBA_CONF_FILE)[stat.ST_MODE])
  90. str_mode = str(mode)[-4:]
  91. self.assertEqual("0644", str_mode, "Wrong file permissions")
  92. @patch('__builtin__.raw_input')
  93. def get_choice_string_input(self, raw_input_method):
  94. prompt = "blablabla"
  95. default = "default blablabla"
  96. firstChoice = set(['yes','ye', 'y'])
  97. secondChoice = set(['no','n'])
  98. # test first input
  99. raw_input_method.return_value = "Y"
  100. result = ambari_server.get_choice_string_input(prompt, default,
  101. firstChoice, secondChoice)
  102. self.assertEquals(result, True)
  103. raw_input_method.reset_mock()
  104. # test second input
  105. raw_input_method.return_value = "N"
  106. result = ambari_server.get_choice_string_input(prompt, default,
  107. firstChoice, secondChoice)
  108. self.assertEquals(result, False)
  109. raw_input_method.reset_mock()
  110. # test enter pressed
  111. raw_input_method.return_value = ""
  112. result = ambari_server.get_choice_string_input(prompt, default,
  113. firstChoice, secondChoice)
  114. self.assertEquals(result, default)
  115. raw_input_method.reset_mock()
  116. # test wrong input
  117. list_of_return_values= ['yes', 'dsad', 'fdsfds']
  118. def side_effect(list):
  119. return list_of_return_values.pop()
  120. raw_input_method.side_effect = side_effect
  121. result = ambari_server.get_choice_string_input(prompt, default,
  122. firstChoice, secondChoice)
  123. self.assertEquals(result, True)
  124. self.assertEquals(raw_input_method.call_count, 3)
  125. pass
  126. @patch('re.search')
  127. @patch('__builtin__.raw_input')
  128. @patch('getpass.getpass')
  129. def get_validated_string_input(self, get_pass_method,
  130. raw_input_method, re_search_method):
  131. prompt = "blabla"
  132. default = "default_pass"
  133. pattern = "pattern_pp"
  134. description = "blabla2"
  135. # check password input
  136. self.assertFalse(False, ambari_server.SILENT)
  137. is_pass = True
  138. get_pass_method.return_value = "dfdsfdsfds"
  139. result = ambari_server.get_validated_string_input(prompt, default,
  140. pattern, description, is_pass)
  141. self.assertEquals(get_pass_method.return_value, result)
  142. get_pass_method.assure_called_once(prompt)
  143. self.assertFalse(raw_input_method.called)
  144. # check raw input
  145. get_pass_method.reset_mock()
  146. raw_input_method.reset_mock()
  147. is_pass = False
  148. raw_input_method.return_value = "dkf90ewuf0"
  149. result = ambari_server.get_validated_string_input(prompt, default,
  150. pattern, description, is_pass)
  151. self.assertEquals(raw_input_method.return_value, result)
  152. self.assertFalse(get_pass_method.called)
  153. raw_input_method.assure_called_once(prompt)
  154. def test_get_pass_file_path(self):
  155. result = ambari_server.get_pass_file_path("/etc/ambari/conf_file")
  156. self.assertEquals("/etc/ambari/password.dat", result)
  157. pass
  158. @patch.object(ambari_server, 'setup')
  159. @patch.object(ambari_server, 'start')
  160. @patch.object(ambari_server, 'stop')
  161. @patch.object(ambari_server, 'reset')
  162. @patch('optparse.OptionParser')
  163. def test_main_test_setup(self, OptionParserMock, reset_method, stop_method,
  164. start_method, setup_method):
  165. opm = OptionParserMock.return_value
  166. options = MagicMock()
  167. args = ["setup"]
  168. opm.parse_args.return_value = (options, args)
  169. options.database=None
  170. options.sid_or_sname = "sid"
  171. ambari_server.main()
  172. self.assertTrue(setup_method.called)
  173. self.assertFalse(start_method.called)
  174. self.assertFalse(stop_method.called)
  175. self.assertFalse(reset_method.called)
  176. self.assertFalse(False, ambari_server.VERBOSE)
  177. self.assertFalse(False, ambari_server.SILENT)
  178. @patch.object(ambari_server, 'setup')
  179. @patch.object(ambari_server, 'start')
  180. @patch.object(ambari_server, 'stop')
  181. @patch.object(ambari_server, 'reset')
  182. @patch('optparse.OptionParser')
  183. def test_main_test_start(self, OptionParserMock, reset_method, stop_method,
  184. start_method, setup_method):
  185. opm = OptionParserMock.return_value
  186. options = MagicMock()
  187. args = ["setup"]
  188. opm.parse_args.return_value = (options, args)
  189. options.database=None
  190. options.sid_or_sname = "sname"
  191. ambari_server.main()
  192. self.assertTrue(setup_method.called)
  193. self.assertFalse(start_method.called)
  194. self.assertFalse(stop_method.called)
  195. self.assertFalse(reset_method.called)
  196. self.assertFalse(False, ambari_server.VERBOSE)
  197. self.assertFalse(False, ambari_server.SILENT)
  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_short(self, OptionParserMock, reset_method, stop_method,
  204. start_method, setup_method):
  205. opm = OptionParserMock.return_value
  206. options = MagicMock()
  207. args = ["start", "-g"]
  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_start_debug_long(self, OptionParserMock, reset_method, stop_method,
  223. start_method, setup_method):
  224. opm = OptionParserMock.return_value
  225. options = MagicMock()
  226. args = ["start", "--debug"]
  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.assertTrue(start_method.called)
  233. self.assertFalse(stop_method.called)
  234. self.assertFalse(reset_method.called)
  235. self.assertTrue(ambari_server.SERVER_DEBUG_MODE)
  236. @patch.object(ambari_server, 'setup')
  237. @patch.object(ambari_server, 'start')
  238. @patch.object(ambari_server, 'stop')
  239. @patch.object(ambari_server, 'reset')
  240. @patch('optparse.OptionParser')
  241. def test_main_test_stop(self, OptionParserMock, reset_method, stop_method,
  242. start_method, setup_method):
  243. opm = OptionParserMock.return_value
  244. options = MagicMock()
  245. args = ["stop"]
  246. opm.parse_args.return_value = (options, args)
  247. options.database = None
  248. options.sid_or_sname = "sid"
  249. ambari_server.main()
  250. self.assertFalse(setup_method.called)
  251. self.assertFalse(start_method.called)
  252. self.assertTrue(stop_method.called)
  253. self.assertFalse(reset_method.called)
  254. self.assertFalse(False, ambari_server.VERBOSE)
  255. self.assertFalse(False, ambari_server.SILENT)
  256. @patch.object(ambari_server, 'setup')
  257. @patch.object(ambari_server, 'start')
  258. @patch.object(ambari_server, 'stop')
  259. @patch.object(ambari_server, 'reset')
  260. @patch('optparse.OptionParser')
  261. def test_main_test_reset(self, OptionParserMock, reset_method, stop_method,
  262. start_method, setup_method):
  263. opm = OptionParserMock.return_value
  264. options = MagicMock()
  265. args = ["reset"]
  266. opm.parse_args.return_value = (options, args)
  267. options.database=None
  268. options.sid_or_sname = "sid"
  269. ambari_server.main()
  270. self.assertFalse(setup_method.called)
  271. self.assertFalse(start_method.called)
  272. self.assertFalse(stop_method.called)
  273. self.assertTrue(reset_method.called)
  274. self.assertFalse(False, ambari_server.VERBOSE)
  275. self.assertFalse(False, ambari_server.SILENT)
  276. def test_configure_postgresql_conf(self):
  277. tf1 = tempfile.NamedTemporaryFile()
  278. ambari_server.POSTGRESQL_CONF_FILE = tf1.name
  279. with open(ambari_server.POSTGRESQL_CONF_FILE, 'w') as f:
  280. f.write("#listen_addresses = '127.0.0.1' #\n")
  281. f.write("#listen_addresses = '127.0.0.1'")
  282. ambari_server.configure_postgresql_conf()
  283. expected = self.get_file_string(self.get_samples_dir(
  284. "configure_postgresql_conf1"))
  285. result = self.get_file_string(ambari_server.POSTGRESQL_CONF_FILE)
  286. self.assertEqual(expected, result, "postgresql.conf not updated")
  287. mode = oct(os.stat(ambari_server.POSTGRESQL_CONF_FILE)[stat.ST_MODE])
  288. str_mode = str(mode)[-4:]
  289. self.assertEqual("0644", str_mode, "Wrong file permissions")
  290. @patch.object(ambari_server, "restart_postgres")
  291. @patch.object(ambari_server, "get_postgre_status")
  292. @patch.object(ambari_server, "configure_postgresql_conf")
  293. @patch.object(ambari_server, "configure_pg_hba_ambaridb_users")
  294. @patch.object(ambari_server, "configure_pg_hba_postgres_user")
  295. def test_configure_postgres(self, configure_pg_hba_postgres_user_mock,
  296. configure_pg_hba_ambaridb_users_mock,
  297. configure_postgresql_conf_mock,
  298. get_postgre_status_mock,
  299. restart_postgres_mock):
  300. tf1 = tempfile.NamedTemporaryFile()
  301. tf2 = tempfile.NamedTemporaryFile()
  302. ambari_server.PG_HBA_CONF_FILE = tf1.name
  303. ambari_server.PG_HBA_CONF_FILE_BACKUP = tf2.name
  304. args = MagicMock()
  305. out = StringIO.StringIO()
  306. sys.stdout = out
  307. rcode = ambari_server.configure_postgres()
  308. sys.stdout = sys.__stdout__
  309. self.assertEqual(0, rcode)
  310. self.assertEqual("Backup for pg_hba found, reconfiguration not required\n",
  311. out.getvalue())
  312. ambari_server.PG_HBA_CONF_FILE_BACKUP = tempfile.mktemp()
  313. get_postgre_status_mock.return_value = ambari_server.PG_STATUS_RUNNING
  314. restart_postgres_mock.return_value = 0
  315. rcode = ambari_server.configure_postgres()
  316. self.assertTrue(os.path.isfile(ambari_server.PG_HBA_CONF_FILE_BACKUP),
  317. "postgresql.conf backup not created")
  318. self.assertTrue(configure_pg_hba_postgres_user_mock.called)
  319. self.assertTrue(configure_pg_hba_ambaridb_users_mock.called)
  320. mode = oct(os.stat(ambari_server.PG_HBA_CONF_FILE)[stat.ST_MODE])
  321. str_mode = str(mode)[-4:]
  322. self.assertEqual("0644", str_mode, "Wrong file permissions")
  323. self.assertTrue(configure_postgresql_conf_mock.called)
  324. self.assertEqual(0, rcode)
  325. os.unlink(ambari_server.PG_HBA_CONF_FILE_BACKUP)
  326. get_postgre_status_mock.return_value = "stopped"
  327. rcode = ambari_server.configure_postgres()
  328. self.assertEqual(0, rcode)
  329. os.unlink(ambari_server.PG_HBA_CONF_FILE_BACKUP)
  330. sys.stdout = sys.__stdout__
  331. @patch("time.sleep")
  332. @patch("subprocess.Popen")
  333. @patch.object(ambari_server, "run_os_command")
  334. @patch.object(ambari_server, "get_postgre_status")
  335. @patch.object(ambari_server, "print_info_msg")
  336. def test_restart_postgres(self, printInfoMsg_mock, get_postgre_status_mock,
  337. run_os_command_mock, popenMock, sleepMock):
  338. p = MagicMock()
  339. p.poll.return_value = 0
  340. popenMock.return_value = p
  341. rcode = ambari_server.restart_postgres()
  342. self.assertEqual(0, rcode)
  343. p.poll.return_value = None
  344. get_postgre_status_mock.return_value = "stopped"
  345. run_os_command_mock.return_value = (1, None, None)
  346. rcode = ambari_server.restart_postgres()
  347. self.assertEqual(1, rcode)
  348. @patch("shlex.split")
  349. @patch("subprocess.Popen")
  350. @patch.object(ambari_server, "print_info_msg")
  351. def test_run_os_command(self, printInfoMsg_mock, popenMock, splitMock):
  352. p = MagicMock()
  353. p.communicate.return_value = (None, None)
  354. p.returncode = 3
  355. popenMock.return_value = p
  356. # with list arg
  357. cmd = ["exec", "arg"]
  358. ambari_server.run_os_command(cmd)
  359. self.assertFalse(splitMock.called)
  360. # with str arg
  361. resp = ambari_server.run_os_command("runme")
  362. self.assertEqual(3, resp[0])
  363. self.assertTrue(splitMock.called)
  364. @patch.object(ambari_server, "get_conf_dir")
  365. @patch.object(ambari_server, "search_file")
  366. def test_write_property(self, search_file_mock, get_conf_dir_mock):
  367. expected_content = "key1=val1\n"
  368. tf1 = tempfile.NamedTemporaryFile()
  369. search_file_mock.return_value = tf1.name
  370. ambari_server.write_property("key1", "val1")
  371. result = tf1.read()
  372. self.assertTrue(expected_content in result)
  373. @patch.object(ambari_server, "configure_database_username_password")
  374. @patch.object(ambari_server, "run_os_command")
  375. def test_setup_db(self, run_os_command_mock,
  376. configure_database_username_password_mock):
  377. run_os_command_mock.return_value = (0, None, None)
  378. result = ambari_server.setup_db(MagicMock())
  379. self.assertTrue(configure_database_username_password_mock.called)
  380. self.assertEqual(0, result)
  381. @patch.object(ambari_server, "get_YN_input")
  382. @patch.object(ambari_server, "run_os_command")
  383. def test_check_selinux(self, run_os_command_mock, getYNInput_mock):
  384. run_os_command_mock.return_value = (0, ambari_server.SE_STATUS_DISABLED,
  385. None)
  386. rcode = ambari_server.check_selinux()
  387. self.assertEqual(0, rcode)
  388. getYNInput_mock.return_value = True
  389. run_os_command_mock.return_value = (0,"enabled "
  390. + ambari_server.SE_MODE_ENFORCING,
  391. None)
  392. rcode = ambari_server.check_selinux()
  393. self.assertEqual(0, rcode)
  394. self.assertTrue(run_os_command_mock.called)
  395. self.assertTrue(getYNInput_mock.called)
  396. @patch.object(ambari_server, "print_info_msg")
  397. def test_get_ambari_jars(self, printInfoMsg_mock):
  398. env = "/ambari/jars"
  399. os.environ[ambari_server.AMBARI_SERVER_LIB] = env
  400. result = ambari_server.get_ambari_jars()
  401. self.assertEqual(env, result)
  402. del os.environ[ambari_server.AMBARI_SERVER_LIB]
  403. result = ambari_server.get_ambari_jars()
  404. self.assertEqual("/usr/lib/ambari-server", result)
  405. self.assertTrue(printInfoMsg_mock.called)
  406. @patch("glob.glob")
  407. @patch.object(ambari_server, "print_info_msg")
  408. def test_get_share_jars(self, printInfoMsg_mock, globMock):
  409. globMock.return_value = ["one", "two"]
  410. expected = "one:two:one:two"
  411. result = ambari_server.get_share_jars()
  412. self.assertEqual(expected, result)
  413. globMock.return_value = []
  414. expected = ""
  415. result = ambari_server.get_share_jars()
  416. self.assertEqual(expected, result)
  417. @patch("glob.glob")
  418. @patch.object(ambari_server, "print_info_msg")
  419. def test_get_ambari_classpath(self, printInfoMsg_mock, globMock):
  420. globMock.return_value = ["one"]
  421. result = ambari_server.get_ambari_classpath()
  422. self.assertTrue(ambari_server.get_ambari_jars() in result)
  423. self.assertTrue(ambari_server.get_share_jars() in result)
  424. globMock.return_value = []
  425. result = ambari_server.get_ambari_classpath()
  426. self.assertTrue(ambari_server.get_ambari_jars() in result)
  427. self.assertFalse(":" in result)
  428. @patch.object(ambari_server, "print_info_msg")
  429. def test_get_conf_dir(self, printInfoMsg_mock):
  430. env = "/dummy/ambari/conf"
  431. os.environ[ambari_server.AMBARI_CONF_VAR] = env
  432. result = ambari_server.get_conf_dir()
  433. self.assertEqual(env, result)
  434. del os.environ[ambari_server.AMBARI_CONF_VAR]
  435. result = ambari_server.get_conf_dir()
  436. self.assertEqual("/etc/ambari-server/conf", result)
  437. def test_search_file(self):
  438. path = os.path.dirname(__file__)
  439. result = ambari_server.search_file(__file__, path)
  440. expected = os.path.abspath(__file__)
  441. self.assertEqual(expected, result)
  442. result = ambari_server.search_file("non_existent_file", path)
  443. self.assertEqual(None, result)
  444. @patch.object(ambari_server, "search_file")
  445. def test_find_properties_file(self, search_file_mock):
  446. # Testing case when file is not found
  447. search_file_mock.return_value = None
  448. try:
  449. ambari_server.find_properties_file()
  450. self.fail("File not found'")
  451. except FatalException:
  452. # Expected
  453. pass
  454. self.assertTrue(search_file_mock.called)
  455. # Testing case when file is found
  456. value = MagicMock()
  457. search_file_mock.return_value = value
  458. result = ambari_server.find_properties_file()
  459. self.assertTrue(result is value)
  460. @patch.object(ambari_server, "find_properties_file")
  461. @patch("__builtin__.open")
  462. @patch("ambari-server.Properties")
  463. def test_read_ambari_user(self, properties_mock, open_mock, find_properties_file_mock):
  464. open_mock.return_value = "dummy"
  465. find_properties_file_mock.return_value = "dummy"
  466. # Testing with defined user
  467. properties_mock.return_value.__getitem__.return_value = "dummy_user"
  468. user = ambari_server.read_ambari_user()
  469. self.assertEquals(user, "dummy_user")
  470. # Testing with undefined user
  471. properties_mock.return_value.__getitem__.return_value = None
  472. user = ambari_server.read_ambari_user()
  473. self.assertEquals(user, None)
  474. @patch("os.path.exists")
  475. @patch.object(ambari_server, "set_file_permissions")
  476. @patch.object(ambari_server, "run_os_command")
  477. @patch.object(ambari_server, "get_ambari_properties")
  478. @patch.object(ambari_server, "get_value_from_properties")
  479. @patch("os.mkdir")
  480. def test_adjust_directory_permissions(self, mkdir_mock,
  481. get_value_from_properties_mock, get_ambari_properties_mock,
  482. run_os_command_mock, set_file_permissions_mock, exists_mock):
  483. # Testing boostrap dir wipe
  484. properties_mock = MagicMock()
  485. get_value_from_properties_mock.return_value = "dummy_bootstrap_dir"
  486. ambari_server.adjust_directory_permissions("user")
  487. exists_mock.return_value = False
  488. self.assertEquals(run_os_command_mock.call_args_list[0][0][0], "rm -rf dummy_bootstrap_dir")
  489. self.assertTrue(mkdir_mock.called)
  490. set_file_permissions_mock.reset_mock()
  491. # Test recursive calls
  492. old_list = ambari_server.NR_ADJUST_OWNERSHIP_LIST
  493. ambari_server.NR_ADJUST_OWNERSHIP_LIST = [
  494. ( "/etc/ambari-server/conf", "755", "{0}", True ),
  495. ( "/etc/ambari-server/conf/ambari.properties", "644", "{0}", False )
  496. ]
  497. ambari_server.adjust_directory_permissions("user")
  498. self.assertTrue(len(set_file_permissions_mock.call_args_list) ==
  499. len(ambari_server.NR_ADJUST_OWNERSHIP_LIST))
  500. self.assertEquals(set_file_permissions_mock.call_args_list[0][0][3], True)
  501. self.assertEquals(set_file_permissions_mock.call_args_list[1][0][3], False)
  502. ambari_server.NR_ADJUST_OWNERSHIP_LIST = old_list
  503. @patch("os.path.exists")
  504. @patch.object(ambari_server, "run_os_command")
  505. @patch.object(ambari_server, "print_warning_msg")
  506. @patch.object(ambari_server, "print_info_msg")
  507. def test_set_file_permissions(self, print_info_msg_mock, print_warning_msg_mock,
  508. run_os_command_mock, exists_mock):
  509. # Testing not existent file scenario
  510. exists_mock.return_value = False
  511. ambari_server.set_file_permissions("dummy-file", "dummy-mod",
  512. "dummy-user", False)
  513. self.assertFalse(run_os_command_mock.called)
  514. self.assertTrue(print_info_msg_mock.called)
  515. run_os_command_mock.reset_mock()
  516. print_warning_msg_mock.reset_mock()
  517. # Testing OK scenario
  518. exists_mock.return_value = True
  519. run_os_command_mock.side_effect = [(0, "", ""), (0, "", "")]
  520. ambari_server.set_file_permissions("dummy-file", "dummy-mod",
  521. "dummy-user", False)
  522. self.assertTrue(len(run_os_command_mock.call_args_list) == 2)
  523. self.assertFalse(print_warning_msg_mock.called)
  524. run_os_command_mock.reset_mock()
  525. print_warning_msg_mock.reset_mock()
  526. # Testing first command fail
  527. run_os_command_mock.side_effect = [(1, "", ""), (0, "", "")]
  528. ambari_server.set_file_permissions("dummy-file", "dummy-mod",
  529. "dummy-user", False)
  530. self.assertTrue(len(run_os_command_mock.call_args_list) == 2)
  531. self.assertTrue(print_warning_msg_mock.called)
  532. run_os_command_mock.reset_mock()
  533. print_warning_msg_mock.reset_mock()
  534. # Testing second command fail
  535. run_os_command_mock.side_effect = [(0, "", ""), (1, "", "")]
  536. ambari_server.set_file_permissions("dummy-file", "dummy-mod",
  537. "dummy-user", False)
  538. self.assertTrue(len(run_os_command_mock.call_args_list) == 2)
  539. self.assertTrue(print_warning_msg_mock.called)
  540. run_os_command_mock.reset_mock()
  541. print_warning_msg_mock.reset_mock()
  542. # Testing recursive operation
  543. exists_mock.return_value = True
  544. run_os_command_mock.side_effect = [(0, "", ""), (0, "", "")]
  545. ambari_server.set_file_permissions("dummy-file", "dummy-mod",
  546. "dummy-user", True)
  547. self.assertTrue(len(run_os_command_mock.call_args_list) == 2)
  548. self.assertTrue("-R" in run_os_command_mock.call_args_list[0][0][0])
  549. self.assertTrue("-R" in run_os_command_mock.call_args_list[1][0][0])
  550. self.assertFalse(print_warning_msg_mock.called)
  551. run_os_command_mock.reset_mock()
  552. print_warning_msg_mock.reset_mock()
  553. # Testing non-recursive operation
  554. exists_mock.return_value = True
  555. run_os_command_mock.side_effect = [(0, "", ""), (0, "", "")]
  556. ambari_server.set_file_permissions("dummy-file", "dummy-mod",
  557. "dummy-user", False)
  558. self.assertTrue(len(run_os_command_mock.call_args_list) == 2)
  559. self.assertFalse("-R" in run_os_command_mock.call_args_list[0][0][0])
  560. self.assertFalse("-R" in run_os_command_mock.call_args_list[1][0][0])
  561. self.assertFalse(print_warning_msg_mock.called)
  562. run_os_command_mock.reset_mock()
  563. print_warning_msg_mock.reset_mock()
  564. @patch.object(ambari_server, "get_validated_string_input")
  565. @patch.object(ambari_server, "print_info_msg")
  566. @patch.object(ambari_server, "print_warning_msg")
  567. @patch.object(ambari_server, "run_os_command")
  568. def test_create_custom_user(self, run_os_command_mock, print_warning_msg_mock,
  569. print_info_msg_mock, get_validated_string_input_mock):
  570. user = "dummy-user"
  571. get_validated_string_input_mock.return_value = user
  572. # Testing scenario: absent user
  573. run_os_command_mock.side_effect = [(0, "", "")]
  574. result = ambari_server.create_custom_user()
  575. self.assertFalse(print_warning_msg_mock.called)
  576. self.assertEquals(result, (0, user))
  577. print_info_msg_mock.reset_mock()
  578. print_warning_msg_mock.reset_mock()
  579. run_os_command_mock.reset_mock()
  580. # Testing scenario: existing user
  581. run_os_command_mock.side_effect = [(9, "", "")]
  582. result = ambari_server.create_custom_user()
  583. self.assertTrue("User dummy-user already exists" in str(print_info_msg_mock.call_args_list[1][0]))
  584. self.assertEquals(result, (0, user))
  585. print_info_msg_mock.reset_mock()
  586. print_warning_msg_mock.reset_mock()
  587. run_os_command_mock.reset_mock()
  588. # Testing scenario: os command fail
  589. run_os_command_mock.side_effect = [(1, "", "")]
  590. result = ambari_server.create_custom_user()
  591. self.assertTrue(print_warning_msg_mock.called)
  592. self.assertEquals(result, (1, None))
  593. @patch.object(ambari_server, "read_ambari_user")
  594. @patch.object(ambari_server, "get_YN_input")
  595. @patch.object(ambari_server, "create_custom_user")
  596. @patch.object(ambari_server, "write_property")
  597. @patch.object(ambari_server, "adjust_directory_permissions")
  598. @patch.object(ambari_server, "print_error_msg")
  599. def test_check_ambari_user(self, print_error_msg_mock,
  600. adjust_directory_permissions_mock, write_property_mock,
  601. create_custom_user_mock, get_YN_input_mock, read_ambari_user_mock):
  602. # Scenario: user is already defined, user does not want to reconfigure it
  603. read_ambari_user_mock.return_value = "dummy-user"
  604. get_YN_input_mock.return_value = False
  605. result = ambari_server.check_ambari_user()
  606. self.assertTrue(get_YN_input_mock.called)
  607. self.assertFalse(write_property_mock.called)
  608. self.assertFalse(create_custom_user_mock.called)
  609. self.assertTrue(adjust_directory_permissions_mock.called)
  610. self.assertEqual(result, 0)
  611. get_YN_input_mock.reset_mock()
  612. write_property_mock.reset_mock()
  613. adjust_directory_permissions_mock.reset_mock()
  614. create_custom_user_mock.reset_mock()
  615. # Scenario: user is already defined, but user wants to reconfigure it
  616. read_ambari_user_mock.return_value = "dummy-user"
  617. create_custom_user_mock.return_value = (0, "new-dummy-user")
  618. get_YN_input_mock.return_value = True
  619. result = ambari_server.check_ambari_user()
  620. self.assertTrue(get_YN_input_mock.called)
  621. self.assertTrue(write_property_mock.called)
  622. self.assertTrue(write_property_mock.call_args[0][1] == "new-dummy-user")
  623. self.assertTrue(create_custom_user_mock.called)
  624. self.assertTrue(adjust_directory_permissions_mock.called)
  625. self.assertEqual(result, 0)
  626. get_YN_input_mock.reset_mock()
  627. write_property_mock.reset_mock()
  628. adjust_directory_permissions_mock.reset_mock()
  629. create_custom_user_mock.reset_mock()
  630. # Negative scenario: user is already defined, but user wants
  631. # to reconfigure it, user creation failed
  632. read_ambari_user_mock.return_value = "dummy-user"
  633. create_custom_user_mock.return_value = (1, None)
  634. get_YN_input_mock.return_value = True
  635. result = ambari_server.check_ambari_user()
  636. self.assertTrue(get_YN_input_mock.called)
  637. self.assertTrue(create_custom_user_mock.called)
  638. self.assertFalse(write_property_mock.called)
  639. self.assertFalse(adjust_directory_permissions_mock.called)
  640. self.assertEqual(result, 1)
  641. get_YN_input_mock.reset_mock()
  642. create_custom_user_mock.reset_mock()
  643. write_property_mock.reset_mock()
  644. adjust_directory_permissions_mock.reset_mock()
  645. # Scenario: user is not defined (setup process)
  646. read_ambari_user_mock.return_value = None
  647. get_YN_input_mock.return_value = True
  648. create_custom_user_mock.return_value = (0, "dummy-user")
  649. result = ambari_server.check_ambari_user()
  650. self.assertTrue(get_YN_input_mock.called)
  651. self.assertTrue(create_custom_user_mock.called)
  652. self.assertTrue(write_property_mock.called)
  653. self.assertTrue(write_property_mock.call_args[0][1] == "dummy-user")
  654. self.assertTrue(adjust_directory_permissions_mock.called)
  655. self.assertEqual(result, 0)
  656. get_YN_input_mock.reset_mock()
  657. create_custom_user_mock.reset_mock()
  658. write_property_mock.reset_mock()
  659. adjust_directory_permissions_mock.reset_mock()
  660. # Scenario: user is not defined (setup process), user creation failed
  661. read_ambari_user_mock.return_value = None
  662. get_YN_input_mock.return_value = True
  663. create_custom_user_mock.return_value = (1, None)
  664. result = ambari_server.check_ambari_user()
  665. self.assertTrue(get_YN_input_mock.called)
  666. self.assertTrue(create_custom_user_mock.called)
  667. self.assertFalse(write_property_mock.called)
  668. self.assertFalse(adjust_directory_permissions_mock.called)
  669. self.assertEqual(result, 1)
  670. get_YN_input_mock.reset_mock()
  671. create_custom_user_mock.reset_mock()
  672. write_property_mock.reset_mock()
  673. adjust_directory_permissions_mock.reset_mock()
  674. # negative scenario: user is not defined (setup process), user creation failed
  675. read_ambari_user_mock.return_value = None
  676. get_YN_input_mock.return_value = True
  677. create_custom_user_mock.return_value = (1, None)
  678. result = ambari_server.check_ambari_user()
  679. self.assertTrue(get_YN_input_mock.called)
  680. self.assertTrue(create_custom_user_mock.called)
  681. self.assertFalse(write_property_mock.called)
  682. self.assertFalse(adjust_directory_permissions_mock.called)
  683. self.assertEqual(result, 1)
  684. get_YN_input_mock.reset_mock()
  685. create_custom_user_mock.reset_mock()
  686. write_property_mock.reset_mock()
  687. adjust_directory_permissions_mock.reset_mock()
  688. # Scenario: user is not defined and left to be root
  689. read_ambari_user_mock.return_value = None
  690. get_YN_input_mock.return_value = False
  691. result = ambari_server.check_ambari_user()
  692. self.assertTrue(get_YN_input_mock.called)
  693. self.assertFalse(create_custom_user_mock.called)
  694. self.assertTrue(write_property_mock.called)
  695. self.assertTrue(write_property_mock.call_args[0][1] == "root")
  696. self.assertTrue(adjust_directory_permissions_mock.called)
  697. self.assertEqual(result, 0)
  698. @patch.object(ambari_server, "search_file")
  699. @patch("__builtin__.open")
  700. @patch.object(ambari_server, "read_ambari_user")
  701. @patch.object(ambari_server, "set_file_permissions")
  702. def test_store_password_file(self, set_file_permissions_mock,
  703. read_ambari_user_mock, open_mock, search_file_mock):
  704. search_file_mock.return_value = "/etc/ambari-server/conf/ambari.properties"
  705. open_mock.return_value = MagicMock()
  706. ambari_server.store_password_file("password", "passfile")
  707. self.assertTrue(set_file_permissions_mock.called)
  708. @patch.object(ambari_server, "run_os_command")
  709. def test_check_iptables(self, run_os_command_mock):
  710. run_os_command_mock.return_value = (1, "test", "")
  711. rcode, info = ambari_server.check_iptables()
  712. self.assertEqual(1, rcode)
  713. self.assertEqual("test", info)
  714. run_os_command_mock.return_value = (2, "",
  715. ambari_server.IP_TBLS_SRVC_NT_FND)
  716. rcode = ambari_server.check_iptables()
  717. self.assertEqual(0, rcode)
  718. def test_dlprogress(self):
  719. out = StringIO.StringIO()
  720. sys.stdout = out
  721. ambari_server.dlprogress("filename", 10, 2, 100)
  722. sys.stdout = sys.__stdout__
  723. self.assertNotEqual("", out.getvalue())
  724. @patch("urllib2.urlopen")
  725. @patch("__builtin__.open")
  726. @patch.object(ambari_server, "dlprogress")
  727. def test_track_jdk(self, dlprogress_mock, openMock, urlopenMock):
  728. u = MagicMock()
  729. u.info.return_value = {"Content-Length":"24576"}
  730. chunks = [None, "second", "first"]
  731. def side_effect(*args, **kwargs):
  732. return chunks.pop()
  733. u.read.side_effect = side_effect
  734. urlopenMock.return_value = u
  735. f = MagicMock()
  736. openMock.return_value = f
  737. ambari_server.track_jdk("base", "url", "local")
  738. self.assertEqual(0, len(chunks))
  739. self.assertTrue(f.write.called)
  740. self.assertTrue(f.flush.called)
  741. self.assertTrue(f.close.called)
  742. self.assertEqual(2, len(dlprogress_mock.call_args_list))
  743. @patch("shutil.copy")
  744. @patch("os.path.join")
  745. @patch("os.path.exists")
  746. @patch.object(ambari_server, "get_ambari_properties")
  747. def test_install_jce_manualy(self, get_ambari_properties_mock,\
  748. os_path_exists_mock, os_path_join_mock,\
  749. shutil_copy_mock):
  750. args = MagicMock()
  751. args.jce_policy = "somewhere"
  752. p = MagicMock()
  753. get_ambari_properties_mock.return_value = p
  754. p.__getitem__.side_effect = None
  755. p.__getitem__.return_value = "somewhere"
  756. os_path_exists_mock.return_value = True
  757. os_path_join_mock.return_value = \
  758. "/var/lib/ambari-server/resources/jce_policy-6.zip"
  759. ambari_server.install_jce_manualy(args)
  760. self.assertTrue(shutil_copy_mock.called)
  761. shutil_copy_mock.side_effect = Exception("exception")
  762. try:
  763. ambari_server.install_jce_manualy(args)
  764. self.fail("Should throw exception because of not found jce_policy-6.zip")
  765. except Exception:
  766. # Expected
  767. self.assertTrue(shutil_copy_mock.called)
  768. pass
  769. shutil_copy_mock.side_effect = None
  770. args.jce_policy = None
  771. ambari_server.install_jce_manualy(args)
  772. @patch.object(ambari_server, 'read_ambari_user')
  773. @patch.object(ambari_server, "get_validated_string_input")
  774. @patch.object(ambari_server, "find_properties_file")
  775. @patch.object(ambari_server, "get_ambari_properties")
  776. @patch.object(ambari_server, "is_server_runing")
  777. @patch.object(ambari_server, "import_cert_and_key_action")
  778. @patch.object(ambari_server, "get_YN_input")
  779. @patch("__builtin__.open")
  780. @patch("ambari-server.Properties")
  781. @patch.object(ambari_server, "is_root")
  782. @patch.object(ambari_server, "is_valid_cert_host")
  783. @patch.object(ambari_server, "is_valid_cert_exp")
  784. def test_setup_https(self, is_valid_cert_exp_mock, is_valid_cert_host_mock,\
  785. is_root_mock, Properties_mock, open_Mock, get_YN_input_mock,\
  786. import_cert_and_key_action_mock,
  787. is_server_runing_mock, get_ambari_properties_mock,\
  788. find_properties_file_mock,\
  789. get_validated_string_input_mock,
  790. read_ambari_user_method):
  791. is_valid_cert_exp_mock.return_value=True
  792. is_valid_cert_host_mock.return_value=True
  793. args = MagicMock()
  794. open_Mock.return_value = file
  795. p = get_ambari_properties_mock.return_value
  796. # Testing call under non-root
  797. is_root_mock.return_value = False
  798. try:
  799. ambari_server.setup_https(args)
  800. self.fail("Should throw exception")
  801. except FatalException as fe:
  802. # Expected
  803. self.assertTrue("root-level" in fe.reason)
  804. pass
  805. # Testing call under root
  806. is_root_mock.return_value = True
  807. read_ambari_user_method.return_value = None
  808. #Case #1: if client ssl is on and user didnt choose
  809. #disable ssl option and choose import certs and keys
  810. p.get_property.side_effect = ["key_dir","5555","6666", "true"]
  811. get_YN_input_mock.side_effect = [False,True]
  812. get_validated_string_input_mock.side_effect = ["4444"]
  813. get_property_expected = "[call('security.server.keys_dir'),\n"+\
  814. " call('client.api.ssl.port'),\n"+\
  815. " call('client.api.ssl.port'),\n call('api.ssl')]"
  816. process_pair_expected = "[call('client.api.ssl.port', '4444')]"
  817. ambari_server.SILENT = False
  818. ambari_server.setup_https(args)
  819. self.assertTrue(p.process_pair.called)
  820. self.assertTrue(p.get_property.call_count == 4)
  821. self.assertEqual(str(p.get_property.call_args_list), get_property_expected)
  822. self.assertEqual(str(p.process_pair.call_args_list), process_pair_expected)
  823. self.assertTrue(p.store.called)
  824. self.assertTrue(import_cert_and_key_action_mock.called)
  825. p.process_pair.reset_mock()
  826. p.get_property.reset_mock()
  827. p.store.reset_mock()
  828. import_cert_and_key_action_mock.reset_mock()
  829. #Case #2: if client ssl is on and user choose to disable ssl option
  830. p.get_property.side_effect = ["key_dir","", "true"]
  831. get_YN_input_mock.side_effect = [True]
  832. get_validated_string_input_mock.side_effect = ["4444"]
  833. get_property_expected = "[call('security.server.keys_dir'),\n"+\
  834. " call('client.api.ssl.port'),\n call('api.ssl')]"
  835. process_pair_expected = "[call('api.ssl', 'false')]"
  836. ambari_server.setup_https(args)
  837. self.assertTrue(p.process_pair.called)
  838. self.assertTrue(p.get_property.call_count == 3)
  839. self.assertEqual(str(p.get_property.call_args_list), get_property_expected)
  840. self.assertEqual(str(p.process_pair.call_args_list), process_pair_expected)
  841. self.assertTrue(p.store.called)
  842. self.assertFalse(import_cert_and_key_action_mock.called)
  843. p.process_pair.reset_mock()
  844. p.get_property.reset_mock()
  845. p.store.reset_mock()
  846. import_cert_and_key_action_mock.reset_mock()
  847. #Case #3: if client ssl is off and user choose option
  848. #to import cert and keys
  849. p.get_property.side_effect = ["key_dir","", None]
  850. get_YN_input_mock.side_effect = [True, True]
  851. get_validated_string_input_mock.side_effect = ["4444"]
  852. get_property_expected = "[call('security.server.keys_dir'),\n"+\
  853. " call('client.api.ssl.port'),\n call('api.ssl')]"
  854. process_pair_expected = "[call('client.api.ssl.port', '4444')]"
  855. ambari_server.setup_https(args)
  856. self.assertTrue(p.process_pair.called)
  857. self.assertTrue(p.get_property.call_count == 3)
  858. self.assertEqual(str(p.get_property.call_args_list), get_property_expected)
  859. self.assertEqual(str(p.process_pair.call_args_list), process_pair_expected)
  860. self.assertTrue(p.store.called)
  861. self.assertTrue(import_cert_and_key_action_mock.called)
  862. p.process_pair.reset_mock()
  863. p.get_property.reset_mock()
  864. p.store.reset_mock()
  865. import_cert_and_key_action_mock.reset_mock()
  866. #Case #4: if client ssl is off and
  867. #user did not choose option to import cert and keys
  868. p.get_property.side_effect = ["key_dir","", None]
  869. get_YN_input_mock.side_effect = [False]
  870. get_validated_string_input_mock.side_effect = ["4444"]
  871. get_property_expected = "[call('security.server.keys_dir'),\n"+\
  872. " call('client.api.ssl.port'),\n call('api.ssl')]"
  873. process_pair_expected = "[]"
  874. ambari_server.setup_https(args)
  875. self.assertFalse(p.process_pair.called)
  876. self.assertTrue(p.get_property.call_count == 3)
  877. self.assertEqual(str(p.get_property.call_args_list), get_property_expected)
  878. self.assertEqual(str(p.process_pair.call_args_list), process_pair_expected)
  879. self.assertFalse(p.store.called)
  880. self.assertFalse(import_cert_and_key_action_mock.called)
  881. p.process_pair.reset_mock()
  882. p.get_property.reset_mock()
  883. p.store.reset_mock()
  884. import_cert_and_key_action_mock.reset_mock()
  885. ambari_server.SILENT = True
  886. @patch.object(ambari_server, "import_cert_and_key")
  887. def test_import_cert_and_key_action(self, import_cert_and_key_mock):
  888. import_cert_and_key_mock.return_value = True
  889. properties = MagicMock()
  890. properties.get_property.side_effect = ["key_dir","5555","6666", "true"]
  891. properties.process_pair = MagicMock()
  892. expect_process_pair = "[call('client.api.ssl.cert_name', 'https.crt'),\n"+\
  893. " call('client.api.ssl.key_name', 'https.key'),\n"+\
  894. " call('api.ssl', 'true')]"
  895. ambari_server.import_cert_and_key_action("key_dir", properties)
  896. self.assertEqual(str(properties.process_pair.call_args_list),\
  897. expect_process_pair)
  898. @patch.object(ambari_server, "remove_file")
  899. @patch.object(ambari_server, "copy_file")
  900. @patch.object(ambari_server, "read_ambari_user")
  901. @patch.object(ambari_server, "set_file_permissions")
  902. @patch.object(ambari_server, "import_file_to_keystore")
  903. @patch("__builtin__.open")
  904. @patch.object(ambari_server, "run_os_command")
  905. @patch("os.path.join")
  906. @patch.object(ambari_server, "get_validated_filepath_input")
  907. @patch.object(ambari_server, "get_validated_string_input")
  908. @patch.object(ambari_server, "is_valid_cert_host")
  909. @patch.object(ambari_server, "is_valid_cert_exp")
  910. def test_import_cert_and_key(self,is_valid_cert_exp_mock,\
  911. is_valid_cert_host_mock,\
  912. get_validated_string_input_mock,\
  913. get_validated_filepath_input_mock,\
  914. os_path_join_mock, run_os_command_mock,\
  915. open_mock, import_file_to_keystore_mock,\
  916. set_file_permissions_mock, read_ambari_user_mock, copy_file_mock,\
  917. remove_file_mock):
  918. is_valid_cert_exp_mock.return_value=True
  919. is_valid_cert_host_mock.return_value=True
  920. get_validated_string_input_mock.return_value = "password"
  921. get_validated_filepath_input_mock.side_effect = \
  922. ["cert_file_path","key_file_path"]
  923. os_path_join_mock.side_effect = ["keystore_file_path","pass_file_path",\
  924. "passin_file_path","password_file_path","keystore_cert_file_path",\
  925. "keystore_cert_key_file_path",]
  926. run_os_command_mock.return_value = (0, "", "")
  927. om = open_mock.return_value
  928. expect_import_file_to_keystore = "[call('cert_file_path',"+\
  929. " 'keystore_cert_file_path'),\n"+\
  930. " call('key_file_path',"+\
  931. " 'keystore_cert_key_file_path')]"
  932. ambari_server.import_cert_and_key("key_dir")
  933. self.assertTrue(get_validated_filepath_input_mock.call_count == 2)
  934. self.assertTrue(get_validated_string_input_mock.called)
  935. self.assertEqual(os_path_join_mock.call_count, 6)
  936. self.assertTrue(set_file_permissions_mock.call_count == 2)
  937. self.assertEqual(str(import_file_to_keystore_mock.call_args_list),\
  938. expect_import_file_to_keystore)
  939. @patch.object(ambari_server, "remove_file")
  940. @patch.object(ambari_server, "copy_file")
  941. @patch.object(ambari_server, "generate_random_string")
  942. @patch.object(ambari_server, "read_ambari_user")
  943. @patch.object(ambari_server, "set_file_permissions")
  944. @patch.object(ambari_server, "import_file_to_keystore")
  945. @patch("__builtin__.open")
  946. @patch.object(ambari_server, "run_os_command")
  947. @patch("os.path.join")
  948. @patch.object(ambari_server, "get_validated_filepath_input")
  949. @patch.object(ambari_server, "get_validated_string_input")
  950. @patch.object(ambari_server, "is_valid_cert_host")
  951. @patch.object(ambari_server, "is_valid_cert_exp")
  952. def test_import_cert_and_key_with_empty_password(self, \
  953. is_valid_cert_exp_mock, is_valid_cert_host_mock,
  954. get_validated_string_input_mock, get_validated_filepath_input_mock,\
  955. os_path_join_mock, run_os_command_mock, open_mock, \
  956. import_file_to_keystore_mock, set_file_permissions_mock,
  957. read_ambari_user_mock, generate_random_string_mock, copy_file_mock,\
  958. remove_file_mock):
  959. is_valid_cert_exp_mock.return_value=True
  960. is_valid_cert_host_mock.return_value=True
  961. get_validated_string_input_mock.return_value = ""
  962. get_validated_filepath_input_mock.side_effect =\
  963. ["cert_file_path","key_file_path"]
  964. os_path_join_mock.side_effect = ["keystore_file_path","pass_file_path",\
  965. "passin_file_path","password_file_path","keystore_cert_file_path",\
  966. "keystore_cert_key_file_path",]
  967. run_os_command_mock.return_value = (0, "", "")
  968. expect_import_file_to_keystore = "[call('cert_file_path',"+\
  969. " 'keystore_cert_file_path'),\n"+\
  970. " call('key_file_path.secured',"+\
  971. " 'keystore_cert_key_file_path')]"
  972. ambari_server.import_cert_and_key("key_dir")
  973. self.assertEquals(get_validated_filepath_input_mock.call_count, 2)
  974. self.assertTrue(get_validated_string_input_mock.called)
  975. self.assertEquals(os_path_join_mock.call_count, 6)
  976. self.assertEquals(set_file_permissions_mock.call_count, 2)
  977. self.assertEqual(str(import_file_to_keystore_mock.call_args_list),\
  978. expect_import_file_to_keystore)
  979. self.assertTrue(generate_random_string_mock.called)
  980. def test_is_valid_cert_exp(self):
  981. #No data in certInfo
  982. certInfo = {}
  983. is_valid = ambari_server.is_valid_cert_exp(certInfo)
  984. self.assertFalse(is_valid)
  985. #Issued in future
  986. issuedOn = (datetime.datetime.now() + datetime.timedelta(hours=1000)).strftime(ambari_server.SSL_DATE_FORMAT)
  987. expiresOn = (datetime.datetime.now() + datetime.timedelta(hours=2000)).strftime(ambari_server.SSL_DATE_FORMAT)
  988. certInfo = {ambari_server.NOT_BEFORE_ATTR : issuedOn,
  989. ambari_server.NOT_AFTER_ATTR : expiresOn}
  990. is_valid = ambari_server.is_valid_cert_exp(certInfo)
  991. self.assertFalse(is_valid)
  992. #Was expired
  993. issuedOn = (datetime.datetime.now() - datetime.timedelta(hours=2000)).strftime(ambari_server.SSL_DATE_FORMAT)
  994. expiresOn = (datetime.datetime.now() - datetime.timedelta(hours=1000)).strftime(ambari_server.SSL_DATE_FORMAT)
  995. certInfo = {ambari_server.NOT_BEFORE_ATTR : issuedOn,
  996. ambari_server.NOT_AFTER_ATTR : expiresOn}
  997. is_valid = ambari_server.is_valid_cert_exp(certInfo)
  998. self.assertFalse(is_valid)
  999. #Valid
  1000. issuedOn = (datetime.datetime.now() - datetime.timedelta(hours=2000)).strftime(ambari_server.SSL_DATE_FORMAT)
  1001. expiresOn = (datetime.datetime.now() + datetime.timedelta(hours=1000)).strftime(ambari_server.SSL_DATE_FORMAT)
  1002. certInfo = {ambari_server.NOT_BEFORE_ATTR : issuedOn,
  1003. ambari_server.NOT_AFTER_ATTR : expiresOn}
  1004. is_valid = ambari_server.is_valid_cert_exp(certInfo)
  1005. self.assertTrue(is_valid)
  1006. @patch.object(ambari_server, "get_fqdn")
  1007. def is_valid_cert_host(self, get_fqdn_mock):
  1008. #No data in certInfo
  1009. certInfo = {}
  1010. is_valid = ambari_server.is_valid_cert_host(certInfo)
  1011. self.assertFalse(is_valid)
  1012. #Failed to get FQDN
  1013. get_fqdn_mock.return_value = None
  1014. is_valid = ambari_server.is_valid_cert_host(certInfo)
  1015. self.assertFalse(is_valid)
  1016. #FQDN and Common name in certificated don't correspond
  1017. get_fqdn_mock.return_value = 'host1'
  1018. certInfo = {ambari_server.COMMON_NAME_ATTR : 'host2'}
  1019. is_valid = ambari_server.is_valid_cert_host(certInfo)
  1020. self.assertFalse(is_valid)
  1021. #FQDN and Common name in certificated correspond
  1022. get_fqdn_mock.return_value = 'host1'
  1023. certInfo = {ambari_server.COMMON_NAME_ATTR : 'host1'}
  1024. is_valid = ambari_server.is_valid_cert_host(certInfo)
  1025. self.assertFalse(is_valid)
  1026. @patch("socket.getfqdn")
  1027. @patch("urllib2.urlopen")
  1028. @patch.object(ambari_server, "get_ambari_properties")
  1029. def test_get_fqdn(self, get_ambari_properties_mock, url_open_mock, getfqdn_mock):
  1030. #No ambari.properties
  1031. get_ambari_properties_mock.return_value = -1
  1032. fqdn = ambari_server.get_fqdn()
  1033. self.assertEqual(fqdn, None)
  1034. #Check mbari_server.GET_FQDN_SERVICE_URL property name (AMBARI-2612)
  1035. #property name should be server.fqdn.service.url
  1036. self.assertEqual(ambari_server.GET_FQDN_SERVICE_URL, "server.fqdn.service.url")
  1037. #Read FQDN from service
  1038. p = MagicMock()
  1039. p[ambari_server.GET_FQDN_SERVICE_URL] = 'someurl'
  1040. get_ambari_properties_mock.return_value = p
  1041. u = MagicMock()
  1042. host = 'host1.domain.com'
  1043. u.read.return_value = host
  1044. url_open_mock.return_value = u
  1045. fqdn = ambari_server.get_fqdn()
  1046. self.assertEqual(fqdn, host)
  1047. #Failed to read FQDN from service, getting from socket
  1048. u.reset_mock()
  1049. u.side_effect = Exception("Failed to read FQDN from service")
  1050. getfqdn_mock.return_value = host
  1051. fqdn = ambari_server.get_fqdn()
  1052. self.assertEqual(fqdn, host)
  1053. @patch.object(ambari_server, "run_os_command")
  1054. def test_get_cert_info(self, run_os_command_mock):
  1055. # Error running openssl command
  1056. path = 'path/to/certificate'
  1057. run_os_command_mock.return_value = -1, None, None
  1058. cert_info = ambari_server.get_cert_info(path)
  1059. self.assertEqual(cert_info, None)
  1060. #Empty result of openssl command
  1061. run_os_command_mock.return_value = 0, None, None
  1062. cert_info = ambari_server.get_cert_info(path)
  1063. self.assertEqual(cert_info, None)
  1064. #Positive scenario
  1065. notAfter = 'Jul 3 14:12:57 2014 GMT'
  1066. notBefore = 'Jul 3 14:12:57 2013 GMT'
  1067. attr1_key = 'A'
  1068. attr1_value = 'foo'
  1069. attr2_key = 'B'
  1070. attr2_value = 'bar'
  1071. attr3_key = 'CN'
  1072. attr3_value = 'host.domain.com'
  1073. subject_pattern = '/{attr1_key}={attr1_value}/{attr2_key}={attr2_value}/{attr3_key}={attr3_value}'
  1074. subject = subject_pattern.format(attr1_key = attr1_key, attr1_value = attr1_value,
  1075. attr2_key = attr2_key, attr2_value = attr2_value,
  1076. attr3_key = attr3_key, attr3_value = attr3_value)
  1077. out_pattern = """
  1078. notAfter={notAfter}
  1079. notBefore={notBefore}
  1080. subject={subject}
  1081. -----BEGIN CERTIFICATE-----
  1082. MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
  1083. ...
  1084. 5lqd8XxOGSYoMOf+70BLN2sB
  1085. -----END CERTIFICATE-----
  1086. """
  1087. out = out_pattern.format(notAfter = notAfter, notBefore = notBefore, subject = subject)
  1088. run_os_command_mock.return_value = 0, out, None
  1089. cert_info = ambari_server.get_cert_info(path)
  1090. self.assertEqual(cert_info['notAfter'], notAfter)
  1091. self.assertEqual(cert_info['notBefore'], notBefore)
  1092. self.assertEqual(cert_info['subject'], subject)
  1093. self.assertEqual(cert_info[attr1_key], attr1_value)
  1094. self.assertEqual(cert_info[attr2_key], attr2_value)
  1095. self.assertEqual(cert_info[attr3_key], attr3_value)
  1096. @patch.object(ambari_server, "run_os_command")
  1097. @patch("__builtin__.open")
  1098. @patch("os.path.exists")
  1099. def test_is_server_runing(self, os_path_exists_mock, open_mock,\
  1100. run_os_command_mock):
  1101. os_path_exists_mock.return_value = True
  1102. f = open_mock.return_value
  1103. f.readline.return_value = "111"
  1104. run_os_command_mock.return_value = 0, "", ""
  1105. status, pid = ambari_server.is_server_runing()
  1106. self.assertTrue(status)
  1107. self.assertEqual(111, pid)
  1108. os_path_exists_mock.return_value = False
  1109. status, pid = ambari_server.is_server_runing()
  1110. self.assertFalse(status)
  1111. @patch.object(ambari_server, "install_jce_manualy")
  1112. @patch("os.stat")
  1113. @patch("os.path.isfile")
  1114. @patch("os.path.exists")
  1115. @patch.object(ambari_server, "track_jdk")
  1116. @patch.object(ambari_server, "get_YN_input")
  1117. @patch.object(ambari_server, "run_os_command")
  1118. @patch.object(ambari_server, "write_property")
  1119. @patch.object(ambari_server, "print_info_msg")
  1120. @patch.object(ambari_server, "get_JAVA_HOME")
  1121. @patch.object(ambari_server, "get_ambari_properties")
  1122. @patch("shutil.copyfile")
  1123. def test_download_jdk(self, copyfile_mock, get_ambari_properties_mock, get_JAVA_HOME_mock,\
  1124. print_info_msg_mock, write_property_mock,\
  1125. run_os_command_mock, get_YN_input_mock, track_jdk_mock,
  1126. path_existsMock, path_isfileMock, statMock,\
  1127. install_jce_manualy_mock):
  1128. args = MagicMock()
  1129. args.java_home = "somewhere"
  1130. path_existsMock.return_value = False
  1131. get_JAVA_HOME_mock.return_value = False
  1132. get_ambari_properties_mock.return_value = -1
  1133. # Test case: ambari.properties not found
  1134. try:
  1135. ambari_server.download_jdk(args)
  1136. self.fail("Should throw exception because of not found ambari.properties")
  1137. except FatalException:
  1138. # Expected
  1139. self.assertTrue(get_ambari_properties_mock.called)
  1140. pass
  1141. # Test case: JDK already exists
  1142. p = MagicMock()
  1143. get_ambari_properties_mock.return_value = p
  1144. p.__getitem__.return_value = "somewhere"
  1145. get_JAVA_HOME_mock.return_value = True
  1146. path_existsMock.return_value = True
  1147. rcode = ambari_server.download_jdk(args)
  1148. self.assertEqual(0, rcode)
  1149. # Test case: java home setup
  1150. get_JAVA_HOME_mock.return_value = False
  1151. rcode = ambari_server.download_jdk(args)
  1152. self.assertEqual(0, rcode)
  1153. self.assertTrue(write_property_mock.called)
  1154. # Test case: JDK file does not exist, property not defined
  1155. path_existsMock.return_value = False
  1156. p = MagicMock()
  1157. get_ambari_properties_mock.return_value = p
  1158. p.__getitem__.side_effect = KeyError("test exception")
  1159. try:
  1160. ambari_server.download_jdk(args)
  1161. self.fail("Should throw exception")
  1162. except FatalException:
  1163. # Expected
  1164. pass
  1165. # Test case: JDK file does not exist, os command (curl) result does not
  1166. # contain Content-Length
  1167. p.__getitem__.return_value = "somewhere"
  1168. p.__getitem__.side_effect = None
  1169. path_existsMock.return_value = False
  1170. run_os_command_mock.return_value = (0, "Wrong out", None)
  1171. try:
  1172. ambari_server.download_jdk(args)
  1173. self.fail("Should throw exception")
  1174. except FatalException:
  1175. # Expected
  1176. pass
  1177. # Successful JDK download
  1178. ambari_server.JDK_INSTALL_DIR = os.getcwd()
  1179. get_YN_input_mock.return_value = True
  1180. run_os_command_mock.return_value = (0, "Creating jdk-1.2/jre"
  1181. "Content-Length: 32000\r\n"
  1182. , None)
  1183. statResult = MagicMock()
  1184. statResult.st_size = 32000
  1185. statMock.return_value = statResult
  1186. rcode = ambari_server.download_jdk(args)
  1187. self.assertEqual(0, rcode)
  1188. # Test case: JDK file does not exist, jdk-location argument passed
  1189. p.__getitem__.return_value = "somewhere"
  1190. p.__getitem__.side_effect = None
  1191. args.jdk_location = "/existing/jdk/file"
  1192. path_existsMock.side_effect = [False, False, True, False, False, False]
  1193. ambari_server.download_jdk(args)
  1194. self.assertTrue(copyfile_mock.called)
  1195. copyfile_mock.reset_mock()
  1196. # Negative test case: JDK file does not exist, jdk-location argument
  1197. # (non-accessible file) passed
  1198. p.__getitem__.return_value = "somewhere"
  1199. p.__getitem__.side_effect = None
  1200. args.jdk_location = "/existing/jdk/file"
  1201. path_existsMock.side_effect = [False, False, True, False, False, False]
  1202. def copyfile_side_effect(s, d):
  1203. raise Exception("TerribleException")
  1204. copyfile_mock.side_effect = copyfile_side_effect
  1205. try:
  1206. ambari_server.download_jdk(args)
  1207. self.fail("Should throw exception")
  1208. except FatalException:
  1209. # Expected
  1210. self.assertTrue(copyfile_mock.called)
  1211. copyfile_mock.reset_mock()
  1212. # Test case: jdk is already installed, ensure that JCE check is not skipped
  1213. p = MagicMock()
  1214. get_ambari_properties_mock.return_value = p
  1215. p.__getitem__.return_value = "somewhere"
  1216. get_JAVA_HOME_mock.return_value = True
  1217. path_existsMock.return_value = True
  1218. install_jce_manualy_mock.return_value = 1
  1219. with patch.object(ambari_server, "download_jce_policy") as download_jce_policy_mock:
  1220. rcode = ambari_server.download_jdk(args)
  1221. self.assertTrue(download_jce_policy_mock.called)
  1222. @patch.object(ambari_server, "run_os_command")
  1223. def test_get_postgre_status(self, run_os_command_mock):
  1224. run_os_command_mock.return_value = (1, "running", None)
  1225. result = ambari_server.get_postgre_status()
  1226. self.assertEqual("running", result)
  1227. run_os_command_mock.return_value = (1, "wrong", None)
  1228. result = ambari_server.get_postgre_status()
  1229. self.assertEqual(None, result)
  1230. @patch("time.sleep")
  1231. @patch("subprocess.Popen")
  1232. @patch.object(ambari_server, "run_os_command")
  1233. @patch.object(ambari_server, "get_postgre_status")
  1234. def test_check_postgre_up(self, get_postgre_status_mock, run_os_command_mock,
  1235. popen_mock, sleep_mock):
  1236. p = MagicMock()
  1237. p.poll.return_value = 0
  1238. popen_mock.return_value = p
  1239. run_os_command_mock.return_value = (0, None, None)
  1240. rcode = ambari_server.check_postgre_up()
  1241. self.assertEqual(0, rcode)
  1242. p.poll.return_value = 4
  1243. get_postgre_status_mock.return_value = None
  1244. rcode = ambari_server.check_postgre_up()
  1245. self.assertEqual(4, rcode)
  1246. @patch("platform.linux_distribution")
  1247. @patch("platform.system")
  1248. @patch.object(ambari_server, "print_info_msg")
  1249. @patch.object(ambari_server, "print_error_msg")
  1250. @patch.object(ambari_server, "get_ambari_properties")
  1251. @patch.object(ambari_server, "write_property")
  1252. @patch.object(ambari_server, "get_conf_dir")
  1253. def test_configure_os_settings(self, get_conf_dir_mock, write_property_mock, get_ambari_properties_mock,
  1254. print_error_msg_mock, print_info_msg_mock,
  1255. systemMock, distMock):
  1256. get_ambari_properties_mock.return_value = -1
  1257. rcode = ambari_server.configure_os_settings()
  1258. self.assertEqual(-1, rcode)
  1259. p = MagicMock()
  1260. p[ambari_server.OS_TYPE_PROPERTY] = 'somevalue'
  1261. get_ambari_properties_mock.return_value = p
  1262. rcode = ambari_server.configure_os_settings()
  1263. self.assertEqual(0, rcode)
  1264. p.__getitem__.return_value = ""
  1265. systemMock.return_value = "NonLinux"
  1266. rcode = ambari_server.configure_os_settings()
  1267. self.assertEqual(-1, rcode)
  1268. systemMock.return_value = "Linux"
  1269. distMock.return_value = ("CentOS", "6.3", None)
  1270. rcode = ambari_server.configure_os_settings()
  1271. self.assertEqual(0, rcode)
  1272. self.assertTrue(write_property_mock.called)
  1273. @patch("__builtin__.open")
  1274. @patch.object(ambari_server, "Properties")
  1275. @patch.object(ambari_server, "search_file")
  1276. @patch.object(ambari_server, "get_conf_dir")
  1277. def test_get_JAVA_HOME(self, get_conf_dir_mock, search_file_mock,
  1278. Properties_mock, openMock):
  1279. openMock.side_effect = Exception("exception")
  1280. result = ambari_server.get_JAVA_HOME()
  1281. self.assertEqual(None, result)
  1282. expected = os.path.dirname(__file__)
  1283. p = MagicMock()
  1284. p.__getitem__.return_value = expected
  1285. openMock.side_effect = None
  1286. Properties_mock.return_value = p
  1287. result = ambari_server.get_JAVA_HOME()
  1288. self.assertEqual(expected, result)
  1289. def test_prompt_db_properties_default(self):
  1290. args = MagicMock()
  1291. ambari_server.load_default_db_properties(args)
  1292. ambari_server.prompt_db_properties(args)
  1293. self.assertEqual(args.database, "postgres")
  1294. self.assertEqual(args.database_host, "localhost")
  1295. self.assertEqual(args.database_name, "ambari")
  1296. self.assertEqual(args.database_port, "5432")
  1297. @patch.object(ambari_server, "setup_master_key")
  1298. @patch.object(ambari_server, "read_password")
  1299. @patch.object(ambari_server, "get_validated_string_input")
  1300. @patch.object(ambari_server, "get_YN_input")
  1301. def test_prompt_db_properties_oracle_sname(self, gyni_mock, gvsi_mock, rp_mock, smk_mock):
  1302. ambari_server.PROMPT_DATABASE_OPTIONS = True
  1303. gyni_mock.return_value = True
  1304. list_of_return_values= ["ambari-server", "ambari", "1", "1521", "localhost", "2"]
  1305. def side_effect(*args, **kwargs):
  1306. return list_of_return_values.pop()
  1307. gvsi_mock.side_effect = side_effect
  1308. rp_mock.return_value = "password"
  1309. smk_mock.return_value = (None, False, True)
  1310. args = MagicMock()
  1311. ambari_server.load_default_db_properties(args)
  1312. ambari_server.prompt_db_properties(args)
  1313. self.assertEqual(args.database, "oracle")
  1314. self.assertEqual(args.database_port, "1521")
  1315. self.assertEqual(args.database_host, "localhost")
  1316. self.assertEqual(args.database_name, "ambari")
  1317. self.assertEqual(args.database_username, "ambari-server")
  1318. self.assertEqual(args.sid_or_sname, "sname")
  1319. @patch.object(ambari_server, "setup_master_key")
  1320. @patch.object(ambari_server, "read_password")
  1321. @patch.object(ambari_server, "get_validated_string_input")
  1322. @patch.object(ambari_server, "get_YN_input")
  1323. def test_prompt_db_properties_oracle_sid(self, gyni_mock, gvsi_mock, rp_mock, smk_mock):
  1324. ambari_server.PROMPT_DATABASE_OPTIONS = True
  1325. gyni_mock.return_value = True
  1326. list_of_return_values= ["ambari-server", "ambari", "2", "1521", "localhost", "2"]
  1327. def side_effect(*args, **kwargs):
  1328. return list_of_return_values.pop()
  1329. gvsi_mock.side_effect = side_effect
  1330. rp_mock.return_value = "password"
  1331. smk_mock.return_value = (None, False, True)
  1332. args = MagicMock()
  1333. ambari_server.load_default_db_properties(args)
  1334. ambari_server.prompt_db_properties(args)
  1335. self.assertEqual(args.database, "oracle")
  1336. self.assertEqual(args.database_port, "1521")
  1337. self.assertEqual(args.database_host, "localhost")
  1338. self.assertEqual(args.database_name, "ambari")
  1339. self.assertEqual(args.database_username, "ambari-server")
  1340. self.assertEqual(args.sid_or_sname, "sid")
  1341. @patch.object(ambari_server, "setup_master_key")
  1342. @patch.object(ambari_server, "read_password")
  1343. @patch.object(ambari_server, "get_validated_string_input")
  1344. @patch.object(ambari_server, "get_YN_input")
  1345. def test_prompt_db_properties_postgre_adv(self, gyni_mock, gvsi_mock, rp_mock, smk_mock):
  1346. ambari_server.PROMPT_DATABASE_OPTIONS = True
  1347. gyni_mock.return_value = True
  1348. list_of_return_values= ["ambari-server", "ambari", "1"]
  1349. def side_effect(*args, **kwargs):
  1350. return list_of_return_values.pop()
  1351. gvsi_mock.side_effect = side_effect
  1352. rp_mock.return_value = "password"
  1353. smk_mock.return_value = (None, False, True)
  1354. args = MagicMock()
  1355. ambari_server.load_default_db_properties(args)
  1356. ambari_server.prompt_db_properties(args)
  1357. self.assertEqual(args.database, "postgres")
  1358. self.assertEqual(args.database_port, "5432")
  1359. self.assertEqual(args.database_host, "localhost")
  1360. self.assertEqual(args.database_name, "ambari")
  1361. self.assertEqual(args.database_username, "ambari-server")
  1362. self.assertEqual(args.sid_or_sname, "sname")
  1363. @patch("glob.glob")
  1364. @patch.object(ambari_server, "get_JAVA_HOME")
  1365. def test_find_jdk(self, get_JAVA_HOME_mock, globMock):
  1366. get_JAVA_HOME_mock.return_value = "somewhere"
  1367. result = ambari_server.find_jdk()
  1368. self.assertEqual("somewhere", result)
  1369. get_JAVA_HOME_mock.return_value = None
  1370. globMock.return_value = []
  1371. result = ambari_server.find_jdk()
  1372. self.assertEqual(None, result)
  1373. globMock.return_value = ["one", "two"]
  1374. result = ambari_server.find_jdk()
  1375. self.assertNotEqual(None, result)
  1376. @patch.object(ambari_server, "get_YN_input")
  1377. @patch.object(ambari_server, "configure_os_settings")
  1378. @patch.object(ambari_server, "download_jdk")
  1379. @patch.object(ambari_server, "configure_postgres")
  1380. @patch.object(ambari_server, "setup_db")
  1381. @patch.object(ambari_server, "check_postgre_up")
  1382. @patch.object(ambari_server, "check_iptables")
  1383. @patch.object(ambari_server, "check_ambari_user")
  1384. @patch.object(ambari_server, "check_jdbc_drivers")
  1385. @patch.object(ambari_server, "check_selinux")
  1386. @patch.object(ambari_server, "setup_remote_db")
  1387. @patch.object(ambari_server, "store_remote_properties")
  1388. @patch.object(ambari_server, "is_local_database")
  1389. @patch.object(ambari_server, "store_local_properties")
  1390. @patch.object(ambari_server, "is_root")
  1391. def test_setup(self, is_root_mock, store_local_properties_mock, is_local_database_mock, store_remote_properties_mock,
  1392. setup_remote_db_mock, check_selinux_mock, check_jdbc_drivers_mock, check_ambari_user_mock,
  1393. check_iptables_mock, check_postgre_up_mock, setup_db_mock, configure_postgres_mock,
  1394. download_jdk_mock, configure_os_settings_mock,get_YN_input ):
  1395. args = MagicMock()
  1396. failed = False
  1397. get_YN_input.return_value = False
  1398. def reset_mocks():
  1399. is_root_mock.reset_mock()
  1400. store_local_properties_mock.reset_mock()
  1401. store_remote_properties_mock.reset_mock()
  1402. is_local_database_mock.reset_mock()
  1403. setup_remote_db_mock.reset_mock()
  1404. check_selinux_mock.reset_mock()
  1405. check_jdbc_drivers_mock.reset_mock()
  1406. check_ambari_user_mock.reset_mock()
  1407. check_iptables_mock.reset_mock()
  1408. check_postgre_up_mock.reset_mock()
  1409. setup_db_mock.reset_mock()
  1410. configure_postgres_mock.reset_mock()
  1411. download_jdk_mock.reset_mock()
  1412. configure_os_settings_mock.reset_mock()
  1413. pass
  1414. # Testing call under non-root
  1415. is_root_mock.return_value = False
  1416. try:
  1417. ambari_server.setup(args)
  1418. self.fail("Should throw exception")
  1419. except FatalException as fe:
  1420. # Expected
  1421. self.assertTrue("root-level" in fe.reason)
  1422. pass
  1423. # Testing calls under root
  1424. # remote case
  1425. is_root_mock.return_value = True
  1426. check_selinux_mock.return_value = 0
  1427. check_ambari_user_mock.return_value = 0
  1428. check_jdbc_drivers_mock.return_value = 0
  1429. check_iptables_mock.return_value = (0, "other")
  1430. check_postgre_up_mock.return_value = 0
  1431. setup_db_mock.return_value = 0
  1432. setup_remote_db_mock.return_value = 0
  1433. is_local_database_mock.return_value = False
  1434. configure_postgres_mock.return_value = 0
  1435. download_jdk_mock.return_value = 0
  1436. configure_os_settings_mock.return_value = 0
  1437. store_remote_properties_mock.return_value = 0
  1438. store_local_properties_mock.return_value = 0
  1439. result = ambari_server.setup(args)
  1440. self.assertEqual(None, result)
  1441. self.assertTrue(check_ambari_user_mock.called)
  1442. self.assertEquals(True, store_remote_properties_mock.called)
  1443. self.assertEquals(False, store_local_properties_mock.called)
  1444. #Local case
  1445. reset_mocks()
  1446. is_local_database_mock.return_value = True
  1447. try:
  1448. result = ambari_server.setup(args)
  1449. except FatalException:
  1450. self.fail("Setup should be successful")
  1451. self.assertEqual(None, result)
  1452. self.assertEquals(True, store_local_properties_mock.called)
  1453. self.assertEquals(False, store_remote_properties_mock.called)
  1454. #negative case
  1455. reset_mocks()
  1456. is_local_database_mock.return_value = False
  1457. setup_remote_db_mock.return_value = -1
  1458. try:
  1459. result = ambari_server.setup(args)
  1460. self.fail("Should throw exception")
  1461. except NonFatalException as fe:
  1462. self.assertTrue("cli was not found" in fe.reason)
  1463. @patch.object(ambari_server, "get_YN_input")
  1464. @patch.object(ambari_server, "setup_db")
  1465. @patch.object(ambari_server, "print_info_msg")
  1466. @patch.object(ambari_server, "run_os_command")
  1467. @patch.object(ambari_server, "configure_database_username_password")
  1468. @patch.object(ambari_server, "parse_properties_file")
  1469. @patch.object(ambari_server, "execute_remote_script")
  1470. @patch.object(ambari_server, "is_root")
  1471. def test_reset(self, is_root_mock, execute_remote_script_mock, parse_properties_file_mock, configure_database_username_password_mock,
  1472. run_os_command_mock, print_info_msg_mock,
  1473. setup_db_mock, get_YN_inputMock):
  1474. parse_properties_file_mock.return_value = 0
  1475. args = MagicMock()
  1476. args.persistence_type = "local"
  1477. get_YN_inputMock.return_value = False
  1478. # Testing call under non-root
  1479. is_root_mock.return_value = False
  1480. try:
  1481. ambari_server.reset(args)
  1482. self.fail("Should throw exception")
  1483. except FatalException as fe:
  1484. # Expected
  1485. self.assertTrue("root-level" in fe.reason)
  1486. pass
  1487. # Testing calls under root
  1488. is_root_mock.return_value = True
  1489. try:
  1490. ambari_server.reset(args)
  1491. self.fail("Should throw exception")
  1492. except FatalException as fe:
  1493. # Expected
  1494. self.assertFalse("root-level" in fe.reason)
  1495. pass
  1496. get_YN_inputMock.return_value = True
  1497. run_os_command_mock.return_value = (1, None, None)
  1498. try:
  1499. ambari_server.reset(args)
  1500. self.fail("Should throw exception")
  1501. except FatalException:
  1502. # Expected
  1503. pass
  1504. run_os_command_mock.return_value = (0, None, None)
  1505. ambari_server.reset(args)
  1506. self.assertTrue(setup_db_mock.called)
  1507. #remote db case
  1508. args.persistence_type = "remote"
  1509. execute_remote_script_mock.return_value=(0, None, None)
  1510. rcode = ambari_server.reset(args)
  1511. self.assertEqual(None, rcode)
  1512. self.assertTrue(execute_remote_script_mock.called)
  1513. @patch.object(ambari_server, "setup_db")
  1514. @patch.object(ambari_server, "print_info_msg")
  1515. @patch.object(ambari_server, "run_os_command")
  1516. @patch.object(ambari_server, "parse_properties_file")
  1517. @patch.object(ambari_server, "is_root")
  1518. def test_silent_reset(self, is_root_mock, parse_properties_file_mock,
  1519. run_os_command_mock, print_info_msg_mock,
  1520. setup_db_mock):
  1521. is_root_mock.return_value = True
  1522. args = MagicMock()
  1523. ambari_server.SILENT = True
  1524. self.assertTrue(ambari_server.SILENT)
  1525. run_os_command_mock.return_value = (0, None, None)
  1526. def signal_handler(signum, frame):
  1527. self.fail("Timed out!")
  1528. signal.signal(signal.SIGALRM, signal_handler)
  1529. signal.alarm(5)
  1530. rcode = ambari_server.reset(args)
  1531. signal.alarm(0)
  1532. self.assertEqual(None, rcode)
  1533. self.assertTrue(setup_db_mock.called)
  1534. @patch("os.chown")
  1535. @patch("pwd.getpwnam")
  1536. @patch.object(ambari_server, 'get_master_key_location')
  1537. @patch.object(ambari_server, 'save_master_key')
  1538. @patch('os.chmod', autospec=True)
  1539. @patch.object(ambari_server, 'get_validated_string_input')
  1540. @patch("os.environ")
  1541. @patch.object(ambari_server, "get_ambari_properties")
  1542. @patch("os.kill")
  1543. @patch("os.path.exists")
  1544. @patch("__builtin__.open")
  1545. @patch("subprocess.Popen")
  1546. @patch.object(ambari_server, "print_info_msg")
  1547. @patch.object(ambari_server, "search_file")
  1548. @patch.object(ambari_server, "find_jdk")
  1549. @patch.object(ambari_server, "print_error_msg")
  1550. @patch.object(ambari_server, "check_postgre_up")
  1551. @patch.object(ambari_server, "check_iptables")
  1552. @patch.object(ambari_server, "parse_properties_file")
  1553. @patch.object(ambari_server, "read_ambari_user")
  1554. @patch.object(ambari_server, "is_root")
  1555. @patch("getpass.getuser")
  1556. @patch("os.chdir")
  1557. def test_start(self, chdir_mock, getuser_mock, is_root_mock, read_ambari_user_mock,
  1558. parse_properties_file_mock, check_iptables_mock, check_postgre_up_mock,
  1559. print_error_msg_mock, find_jdk_mock, search_file_mock,
  1560. print_info_msg_mock, popenMock, openMock, pexistsMock,
  1561. killMock, get_ambari_properties_mock, os_environ_mock,
  1562. get_validated_string_input_method, os_chmod_method,
  1563. save_master_key_method, get_master_key_location_method,
  1564. getpwnam_mock, os_chown_mock):
  1565. args = MagicMock()
  1566. f = MagicMock()
  1567. f.readline.return_value = 42
  1568. openMock.return_value = f
  1569. p = get_ambari_properties_mock.return_value
  1570. p.get_property.return_value = 'False'
  1571. search_file_mock.return_value = None
  1572. pw = MagicMock()
  1573. pw.setattr('pw_uid', 0)
  1574. pw.setattr('pw_gid', 0)
  1575. getpwnam_mock.return_value = pw
  1576. os_chown_mock.return_value = None
  1577. # Checking "server is running"
  1578. pexistsMock.return_value = True
  1579. try:
  1580. ambari_server.start(args)
  1581. self.fail("Should fail with 'Server is running'")
  1582. except FatalException:
  1583. # Expected
  1584. pass
  1585. self.assertTrue(killMock.called)
  1586. killMock.reset_mock()
  1587. parse_properties_file_mock.reset_mock()
  1588. pexistsMock.return_value = False
  1589. # Checking situation when ambari user is not set up
  1590. read_ambari_user_mock.return_value = None
  1591. try:
  1592. ambari_server.start(args)
  1593. self.fail("Should fail with 'Can not detect a system user for Ambari'")
  1594. except FatalException as e:
  1595. # Expected
  1596. self.assertTrue('Unable to detect a system user for Ambari Server.' in e.reason)
  1597. parse_properties_file_mock.reset_mock()
  1598. # Checking start from non-root when current user is not the same as a
  1599. # custom user
  1600. read_ambari_user_mock.return_value = "dummy-user"
  1601. getuser_mock.return_value = "non_custom_user"
  1602. is_root_mock.return_value = False
  1603. try:
  1604. ambari_server.start(args)
  1605. self.fail("Should fail with 'Can not start ambari-server as user...'")
  1606. except FatalException as e:
  1607. # Expected
  1608. self.assertTrue('Unable to start Ambari Server as user' in e.reason)
  1609. self.assertFalse(parse_properties_file_mock.called)
  1610. parse_properties_file_mock.reset_mock()
  1611. # Checking "jdk not found"
  1612. is_root_mock.return_value = True
  1613. find_jdk_mock.return_value = None
  1614. try:
  1615. ambari_server.start(args)
  1616. self.fail("Should fail with 'No JDK found'")
  1617. except FatalException as e:
  1618. # Expected
  1619. self.assertTrue('No JDK found' in e.reason)
  1620. find_jdk_mock.return_value = "somewhere"
  1621. parse_properties_file_mock.reset_mock()
  1622. ## Testing workflow under root
  1623. is_root_mock.return_value = True
  1624. # Remote DB
  1625. args.persistence_type="remote"
  1626. check_iptables_mock.return_value = (0, None)
  1627. try:
  1628. ambari_server.start(args)
  1629. except FatalException as e:
  1630. # Ignored
  1631. pass
  1632. self.assertFalse('Unable to start PostgreSQL server' in e.reason)
  1633. self.assertFalse(check_postgre_up_mock.called)
  1634. check_postgre_up_mock.reset_mock()
  1635. parse_properties_file_mock.reset_mock()
  1636. # Local DB
  1637. args.persistence_type="local"
  1638. # case: postgres failed to start
  1639. check_postgre_up_mock.return_value = 1
  1640. try:
  1641. ambari_server.start(args)
  1642. self.fail("Should fail with 'Unable to start PostgreSQL server'")
  1643. except FatalException as e:
  1644. # Expected
  1645. self.assertTrue('Unable to start PostgreSQL server' in e.reason)
  1646. self.assertTrue(check_postgre_up_mock.called)
  1647. parse_properties_file_mock.reset_mock()
  1648. # case: iptables failed to stop
  1649. check_postgre_up_mock.return_value = 0
  1650. check_iptables_mock.return_value = (1, ambari_server.IP_TBLS_ENABLED)
  1651. try:
  1652. ambari_server.start(args)
  1653. self.fail("Should fail with 'Failed to stop iptables'")
  1654. except FatalException as e:
  1655. # Expected
  1656. self.assertTrue('Failed to stop iptables' in e.reason)
  1657. parse_properties_file_mock.reset_mock()
  1658. check_iptables_mock.return_value = (0, None)
  1659. # Case: custom user is "root"
  1660. read_ambari_user_mock.return_value = "root"
  1661. ambari_server.start(args)
  1662. self.assertTrue(popenMock.called)
  1663. popen_arg = popenMock.call_args[0][0]
  1664. self.assertTrue(popen_arg[0] == "/bin/sh")
  1665. popenMock.reset_mock()
  1666. parse_properties_file_mock.reset_mock()
  1667. # Case: custom user is not "root"
  1668. read_ambari_user_mock.return_value = "not-root-user"
  1669. ambari_server.start(args)
  1670. self.assertTrue(chdir_mock.called)
  1671. self.assertTrue(popenMock.called)
  1672. popen_arg = popenMock.call_args[0][0]
  1673. self.assertTrue(popen_arg[0] == "/bin/su")
  1674. check_postgre_up_mock.reset_mock()
  1675. popenMock.reset_mock()
  1676. parse_properties_file_mock.reset_mock()
  1677. ## Testing workflow under non-root
  1678. is_root_mock.return_value = False
  1679. read_ambari_user_mock.return_value = "not-root-user"
  1680. getuser_mock.return_value = read_ambari_user_mock.return_value
  1681. parse_properties_file_mock.reset_mock()
  1682. # Local DB
  1683. args.persistence_type="local"
  1684. ambari_server.start(args)
  1685. self.assertFalse(check_postgre_up_mock.called)
  1686. parse_properties_file_mock.reset_mock()
  1687. # Remote DB
  1688. args.persistence_type="remote"
  1689. ambari_server.start(args)
  1690. self.assertFalse(check_postgre_up_mock.called)
  1691. parse_properties_file_mock.reset_mock()
  1692. # Checking call
  1693. check_iptables_mock.reset_mock()
  1694. check_iptables_mock.return_value = (0, None)
  1695. ambari_server.start(args)
  1696. self.assertTrue(popenMock.called)
  1697. popen_arg = popenMock.call_args[0][0]
  1698. self.assertTrue(popen_arg[0] == "/bin/sh")
  1699. self.assertFalse(check_iptables_mock.called)
  1700. parse_properties_file_mock.reset_mock()
  1701. # Test start under wrong user
  1702. read_ambari_user_mock.return_value = "not-root-user"
  1703. getuser_mock.return_value = "non_custom_user"
  1704. try:
  1705. ambari_server.start(args)
  1706. self.fail("Can not start ambari-server as user non_custom_user.")
  1707. except FatalException as e:
  1708. # Expected
  1709. self.assertTrue('Unable to start Ambari Server as user' in e.reason)
  1710. parse_properties_file_mock.reset_mock()
  1711. # Check environ master key is set
  1712. popenMock.reset_mock()
  1713. os_environ_mock.copy.return_value = {"a" : "b",
  1714. ambari_server.SECURITY_KEY_ENV_VAR_NAME : "masterkey"}
  1715. args.persistence_type="local"
  1716. read_ambari_user_mock.return_value = "root"
  1717. is_root_mock.return_value = True
  1718. ambari_server.start(args)
  1719. self.assertFalse(get_validated_string_input_method.called)
  1720. self.assertFalse(save_master_key_method.called)
  1721. popen_arg = popenMock.call_args[1]['env']
  1722. self.assertEquals(os_environ_mock.copy.return_value, popen_arg)
  1723. parse_properties_file_mock.reset_mock()
  1724. # Check environ master key is not set
  1725. popenMock.reset_mock()
  1726. os_environ_mock.reset_mock()
  1727. p.get_property.return_value = 'True'
  1728. os_environ_mock.copy.return_value = {"a" : "b"}
  1729. args.persistence_type="local"
  1730. read_ambari_user_mock.return_value = "root"
  1731. is_root_mock.return_value = True
  1732. get_validated_string_input_method.return_value = "masterkey"
  1733. os_chmod_method.return_value = None
  1734. ambari_server.start(args)
  1735. self.assertTrue(get_validated_string_input_method.called)
  1736. self.assertTrue(save_master_key_method.called)
  1737. popen_arg = popenMock.call_args[1]['env']
  1738. self.assertEquals(os_environ_mock.copy.return_value, popen_arg)
  1739. @patch("__builtin__.open")
  1740. @patch("os.path.exists")
  1741. @patch("os.remove")
  1742. @patch("os.killpg")
  1743. @patch("os.getpgid")
  1744. @patch.object(ambari_server, "print_info_msg")
  1745. def test_stop(self, print_info_msg_mock, gpidMock, removeMock,
  1746. killMock, pexistsMock, openMock):
  1747. pexistsMock.return_value = True
  1748. f = MagicMock()
  1749. f.readline.return_value = "42"
  1750. openMock.return_value = f
  1751. ambari_server.stop(None)
  1752. self.assertTrue(f.readline.called)
  1753. self.assertTrue(killMock.called)
  1754. self.assertTrue(killMock.called)
  1755. self.assertTrue(f.close.called)
  1756. self.assertTrue(removeMock.called)
  1757. @patch.object(ambari_server, "configure_database_username_password")
  1758. @patch.object(ambari_server, "run_os_command")
  1759. @patch.object(ambari_server, "is_root")
  1760. def test_upgrade_stack(self, is_root_mock, run_os_command_mock,
  1761. configure_postgres_username_password_mock):
  1762. args = MagicMock()
  1763. # Testing call under non-root
  1764. is_root_mock.return_value = False
  1765. try:
  1766. ambari_server.upgrade_stack(args, 'HDP-2.0')
  1767. self.fail("Should throw exception")
  1768. except FatalException as fe:
  1769. # Expected
  1770. self.assertTrue("root-level" in fe.reason)
  1771. pass
  1772. # Testing calls under root
  1773. is_root_mock.return_value = True
  1774. run_os_command_mock.return_value = (0, '', '')
  1775. ambari_server.upgrade_stack(args, 'HDP-2.0')
  1776. self.assertTrue(configure_postgres_username_password_mock.called)
  1777. self.assertTrue(run_os_command_mock.called)
  1778. @patch.object(ambari_server, "adjust_directory_permissions")
  1779. @patch.object(ambari_server, "print_warning_msg")
  1780. @patch.object(ambari_server, "read_ambari_user")
  1781. @patch.object(ambari_server, "check_db_consistency")
  1782. @patch.object(ambari_server, "execute_db_script")
  1783. @patch.object(ambari_server, "check_postgre_up")
  1784. @patch.object(ambari_server, "update_ambari_properties")
  1785. @patch.object(ambari_server, "parse_properties_file")
  1786. @patch.object(ambari_server, "is_root")
  1787. def test_upgrade(self, is_root_mock, parse_properties_file_mock, update_ambari_properties_mock,
  1788. check_postgre_up_mock, execute_db_script_mock,
  1789. check_db_consistency_mock, read_ambari_user_mock,
  1790. print_warning_msg_mock, adjust_directory_permissions_mock):
  1791. args = MagicMock()
  1792. args.upgrade_script_file = "/var/lib/"\
  1793. "ambari-server/resources/upgrade/ddl/"\
  1794. "Ambari-DDL-Postgres-UPGRADE-1.3.0.sql"
  1795. update_ambari_properties_mock.return_value = 0
  1796. check_postgre_up_mock.return_value = 0
  1797. execute_db_script_mock.return_value = 0
  1798. check_db_consistency_mock.return_value = 0
  1799. # Testing call under non-root
  1800. is_root_mock.return_value = False
  1801. try:
  1802. ambari_server.upgrade(args)
  1803. self.fail("Should throw exception")
  1804. except FatalException as fe:
  1805. # Expected
  1806. self.assertTrue("root-level" in fe.reason)
  1807. pass
  1808. # Testing calls under root
  1809. is_root_mock.return_value = True
  1810. # Testing with undefined custom user
  1811. read_ambari_user_mock.return_value = None
  1812. ambari_server.upgrade(args)
  1813. self.assertTrue(print_warning_msg_mock.called)
  1814. warning_args = print_warning_msg_mock.call_args[0][0]
  1815. self.assertTrue("custom ambari user" in warning_args)
  1816. # Testing with defined custom user
  1817. read_ambari_user_mock.return_value = "ambari-custom-user"
  1818. ambari_server.upgrade(args)
  1819. self.assertTrue(adjust_directory_permissions_mock.called)
  1820. def test_print_info_msg(self):
  1821. out = StringIO.StringIO()
  1822. sys.stdout = out
  1823. ambari_server.VERBOSE = True
  1824. ambari_server.print_info_msg("msg")
  1825. self.assertNotEqual("", out.getvalue())
  1826. sys.stdout = sys.__stdout__
  1827. def test_print_error_msg(self):
  1828. out = StringIO.StringIO()
  1829. sys.stdout = out
  1830. ambari_server.VERBOSE = True
  1831. ambari_server.print_error_msg("msg")
  1832. self.assertNotEqual("", out.getvalue())
  1833. sys.stdout = sys.__stdout__
  1834. def test_print_warning_msg(self):
  1835. out = StringIO.StringIO()
  1836. sys.stdout = out
  1837. ambari_server.VERBOSE = True
  1838. ambari_server.print_warning_msg("msg")
  1839. self.assertNotEqual("", out.getvalue())
  1840. sys.stdout = sys.__stdout__
  1841. @patch.object(ambari_server, "get_choice_string_input")
  1842. def test_get_YN_input(self, get_choice_string_input_mock):
  1843. ambari_server.get_YN_input("prompt", "default")
  1844. self.assertTrue(get_choice_string_input_mock.called)
  1845. self.assertEqual(4, len(get_choice_string_input_mock.call_args_list[0][0]))
  1846. def test_load_default_db_properties(self):
  1847. args = MagicMock()
  1848. ambari_server.load_default_db_properties(args)
  1849. self.assertEquals(args.database, "postgres")
  1850. self.assertEquals(args.database_host, "localhost")
  1851. self.assertEquals(args.database_port, "5432")
  1852. self.assertEquals(args.database_name, "ambari")
  1853. self.assertEquals(args.database_username, "ambari")
  1854. self.assertEquals(args.database_password, "bigdata")
  1855. args = MagicMock()
  1856. ambari_server.DATABASE_INDEX=1
  1857. ambari_server.load_default_db_properties(args)
  1858. self.assertEquals(args.database, "oracle")
  1859. self.assertEquals(args.database_port, "1521")
  1860. failed = False
  1861. args = MagicMock()
  1862. ambari_server.DATABASE_INDEX=2
  1863. try:
  1864. ambari_server.load_default_db_properties(args)
  1865. except:
  1866. failed = True
  1867. self.assertTrue(failed)
  1868. pass
  1869. @patch.object(ambari_server, 'setup')
  1870. def test_main_db_options(self, setup_mock):
  1871. base_args = ["ambari-server.py", "setup"]
  1872. db_args = ["--database", "postgres", "--databasehost", "somehost.net", "--databaseport", "12345",
  1873. "--databasename", "ambari", "--databaseusername", "ambari", "--databasepassword", "bigdata"]
  1874. #test no args
  1875. failed = False
  1876. sys.argv = list(base_args)
  1877. try:
  1878. ambari_server.main()
  1879. except SystemExit:
  1880. failed = True
  1881. pass
  1882. self.assertFalse(failed)
  1883. self.assertTrue(setup_mock.called)
  1884. setup_mock.reset_mock()
  1885. #test full args
  1886. sys.argv = list(base_args)
  1887. sys.argv.extend(db_args)
  1888. try:
  1889. ambari_server.main()
  1890. except SystemExit:
  1891. failed = True
  1892. pass
  1893. self.assertTrue(ambari_server.PROMPT_DATABASE_OPTIONS)
  1894. self.assertFalse(failed)
  1895. self.assertTrue(setup_mock.called)
  1896. setup_mock.reset_mock()
  1897. #test not full args
  1898. sys.argv = list(base_args)
  1899. sys.argv.extend(["--database", "postgres"])
  1900. try:
  1901. ambari_server.main()
  1902. except SystemExit:
  1903. failed = True
  1904. pass
  1905. self.assertFalse(setup_mock.called)
  1906. self.assertTrue(failed)
  1907. setup_mock.reset_mock()
  1908. #test wrong database
  1909. failed = False
  1910. sys.argv = list(base_args)
  1911. sys.argv.extend(["--database", "unknown"])
  1912. sys.argv.extend(db_args[2:])
  1913. try:
  1914. ambari_server.main()
  1915. except SystemExit:
  1916. failed = True
  1917. pass
  1918. self.assertTrue(failed)
  1919. self.assertFalse(setup_mock.called)
  1920. setup_mock.reset_mock()
  1921. #test wrong port check
  1922. failed = False
  1923. sys.argv = list(base_args)
  1924. sys.argv.extend(["--databaseport", "unknown"])
  1925. sys.argv.extend(db_args[:4])
  1926. sys.argv.extend(db_args[6:])
  1927. try:
  1928. ambari_server.main()
  1929. except SystemExit:
  1930. failed = True
  1931. pass
  1932. self.assertTrue(failed)
  1933. self.assertFalse(setup_mock.called)
  1934. setup_mock.reset_mock()
  1935. pass
  1936. @patch.object(ambari_server, "load_default_db_properties")
  1937. @patch.object(ambari_server, "get_YN_input")
  1938. @patch.object(ambari_server, "get_validated_string_input")
  1939. @patch.object(ambari_server, "setup_master_key")
  1940. @patch.object(ambari_server, "configure_database_password")
  1941. def test_prompt_db_properties(self, configure_database_password_mock, setup_master_key_mock,
  1942. get_validated_string_input_mock, get_YN_input_mock, load_default_db_properties_mock):
  1943. args = MagicMock()
  1944. #test not prompt
  1945. ambari_server.PROMPT_DATABASE_OPTIONS = False
  1946. ambari_server.prompt_db_properties(args)
  1947. self.assertFalse(load_default_db_properties_mock.called)
  1948. self.assertFalse(get_validated_string_input_mock.called)
  1949. self.assertFalse(get_YN_input_mock.called)
  1950. load_default_db_properties_mock.reset_mock()
  1951. get_validated_string_input_mock.reset_mock()
  1952. get_YN_input_mock.reset_mock()
  1953. #test prompt
  1954. get_YN_input_mock.return_value = False
  1955. ambari_server.PROMPT_DATABASE_OPTIONS = True
  1956. ambari_server.prompt_db_properties(args)
  1957. self.assertTrue(get_YN_input_mock.called)
  1958. self.assertFalse(get_validated_string_input_mock.called)
  1959. self.assertTrue(load_default_db_properties_mock.called)
  1960. load_default_db_properties_mock.reset_mock()
  1961. get_validated_string_input_mock.reset_mock()
  1962. get_YN_input_mock.reset_mock()
  1963. #test prompt advanced
  1964. get_YN_input_mock.return_value = True
  1965. ambari_server.PROMPT_DATABASE_OPTIONS = True
  1966. setup_master_key_mock.return_value = (None, False, True)
  1967. configure_database_password_mock.return_value = ("test", None)
  1968. ambari_server.prompt_db_properties(args)
  1969. self.assertTrue(get_YN_input_mock.called)
  1970. self.assertTrue(get_validated_string_input_mock.called)
  1971. self.assertTrue(load_default_db_properties_mock.called)
  1972. self.assertEquals(args.database, "postgres")
  1973. load_default_db_properties_mock.reset_mock()
  1974. get_validated_string_input_mock.reset_mock()
  1975. get_YN_input_mock.reset_mock()
  1976. pass
  1977. @patch.object(ambari_server, "get_db_cli_tool")
  1978. @patch.object(ambari_server, "run_in_shell")
  1979. def test_execute_remote_script(self, run_in_shell_mock, get_db_cli_tool_mock):
  1980. args = MagicMock()
  1981. script = "script"
  1982. #success
  1983. run_in_shell_mock.return_value=(0, None, None)
  1984. get_db_cli_tool_mock.return_value="tool"
  1985. args.database = "postgres"
  1986. args.database_password = "some_password"
  1987. retcode, out, err = ambari_server.execute_remote_script(args, script)
  1988. self.assertEquals(retcode, 0)
  1989. self.assertTrue(get_db_cli_tool_mock.called)
  1990. self.assertTrue(run_in_shell_mock.called)
  1991. #fail no cli tool
  1992. get_db_cli_tool_mock.return_value = None
  1993. get_db_cli_tool_mock.called = False
  1994. run_in_shell_mock.called = False
  1995. retcode, out, err = ambari_server.execute_remote_script(args, script)
  1996. self.assertEquals(retcode, -1)
  1997. self.assertTrue(get_db_cli_tool_mock.called)
  1998. self.assertFalse(run_in_shell_mock.called)
  1999. #fail execute
  2000. errcode = 1
  2001. get_db_cli_tool_mock.return_value = "tool"
  2002. run_in_shell_mock.return_value=(errcode, None, None)
  2003. get_db_cli_tool_mock.called = False
  2004. run_in_shell_mock.called = False
  2005. retcode, out, err = ambari_server.execute_remote_script(args, script)
  2006. self.assertEquals(retcode, errcode)
  2007. self.assertTrue(get_db_cli_tool_mock.called)
  2008. self.assertTrue(run_in_shell_mock.called)
  2009. #fail wrong database - case should be completely impossible
  2010. get_db_cli_tool_mock.return_value = "tool"
  2011. run_in_shell_mock.return_value=(0, None, None)
  2012. get_db_cli_tool_mock.called = False
  2013. run_in_shell_mock.called = False
  2014. args.database = "unknown"
  2015. retcode, out, err = ambari_server.execute_remote_script(args, script)
  2016. self.assertEquals(retcode, -2)
  2017. self.assertTrue(get_db_cli_tool_mock.called)
  2018. self.assertFalse(run_in_shell_mock.called)
  2019. pass
  2020. @patch.object(ambari_server, "get_conf_dir")
  2021. def test_update_ambari_properties(self, get_conf_dir_mock):
  2022. properties = ["server.jdbc.user.name=ambari-server\n",
  2023. "server.jdbc.user.passwd=/etc/ambari-server/conf/password.dat\n",
  2024. "java.home=/usr/jdk64/jdk1.6.0_31\n",
  2025. "server.os_type=redhat6\n",
  2026. "ambari-server.user=ambari\n",
  2027. "agent.fqdn.service.url=URL\n"]
  2028. NEW_PROPERTY = 'some_new_property=some_value\n'
  2029. CHANGED_VALUE_PROPERTY = 'server.os_type=should_not_overwrite_value\n'
  2030. get_conf_dir_mock.return_value = '/etc/ambari-server/conf'
  2031. (tf1, fn1) = tempfile.mkstemp()
  2032. (tf2, fn2) = tempfile.mkstemp()
  2033. ambari_server.AMBARI_PROPERTIES_RPMSAVE_FILE = fn1
  2034. ambari_server.AMBARI_PROPERTIES_FILE = fn2
  2035. with open(ambari_server.AMBARI_PROPERTIES_FILE, "w") as f:
  2036. f.write(NEW_PROPERTY)
  2037. f.write(CHANGED_VALUE_PROPERTY)
  2038. with open(ambari_server.AMBARI_PROPERTIES_RPMSAVE_FILE, 'w') as f:
  2039. for line in properties:
  2040. f.write(line)
  2041. #Call tested method
  2042. ambari_server.update_ambari_properties()
  2043. timestamp = datetime.datetime.now()
  2044. #RPMSAVE_FILE wasn't found
  2045. self.assertFalse(os.path.exists(ambari_server.AMBARI_PROPERTIES_RPMSAVE_FILE))
  2046. #Renamed RPMSAVE_FILE exists
  2047. self.assertTrue(os.path.exists(ambari_server.AMBARI_PROPERTIES_RPMSAVE_FILE
  2048. + '.' + timestamp.strftime('%Y%m%d%H%M%S')))
  2049. with open(ambari_server.AMBARI_PROPERTIES_FILE, 'r') as f:
  2050. ambari_properties_content = f.readlines()
  2051. for line in properties:
  2052. if (line == "agent.fqdn.service.url=URL\n"):
  2053. if (not ambari_server.GET_FQDN_SERVICE_URL+"=URL\n" in ambari_properties_content) and (line in ambari_properties_content):
  2054. self.fail()
  2055. else:
  2056. if not line in ambari_properties_content:
  2057. self.fail()
  2058. if not NEW_PROPERTY in ambari_properties_content:
  2059. self.fail()
  2060. if CHANGED_VALUE_PROPERTY in ambari_properties_content:
  2061. self.fail()
  2062. # Command should not fail if *.rpmsave file is missing
  2063. result = ambari_server.update_ambari_properties()
  2064. self.assertEquals(result, 0)
  2065. os.unlink(fn2)
  2066. #if ambari.properties file is absent then "ambari-server upgrade" should
  2067. # fail
  2068. (tf, fn) = tempfile.mkstemp()
  2069. ambari_server.AMBARI_PROPERTIES_RPMSAVE_FILE = fn
  2070. result = ambari_server.update_ambari_properties()
  2071. self.assertNotEquals(result, 0)
  2072. @patch.object(ambari_server.Properties, '__init__')
  2073. @patch.object(ambari_server, 'search_file')
  2074. def test_update_ambari_properties_negative_case(self, search_file_mock, properties_mock):
  2075. search_file_mock.return_value = None
  2076. #Call tested method
  2077. self.assertEquals(0, ambari_server.update_ambari_properties())
  2078. self.assertFalse(properties_mock.called)
  2079. search_file_mock.return_value = False
  2080. #Call tested method
  2081. self.assertEquals(0, ambari_server.update_ambari_properties())
  2082. self.assertFalse(properties_mock.called)
  2083. search_file_mock.return_value = ''
  2084. #Call tested method
  2085. self.assertEquals(0, ambari_server.update_ambari_properties())
  2086. self.assertFalse(properties_mock.called)
  2087. @patch.object(ambari_server, "get_conf_dir")
  2088. def test_update_ambari_properties_without_user_property(self, get_conf_dir_mock):
  2089. '''
  2090. Checks: update_ambari_properties call should add ambari-server.user property if
  2091. it's absent
  2092. '''
  2093. properties = ["server.jdbc.user.name=ambari-server\n",
  2094. "server.jdbc.user.passwd=/etc/ambari-server/conf/password.dat\n",
  2095. "java.home=/usr/jdk64/jdk1.6.0_31\n",
  2096. "server.os_type=redhat6\n"]
  2097. get_conf_dir_mock.return_value = '/etc/ambari-server/conf'
  2098. (tf1, fn1) = tempfile.mkstemp()
  2099. (tf2, fn2) = tempfile.mkstemp()
  2100. ambari_server.AMBARI_PROPERTIES_RPMSAVE_FILE = fn1
  2101. ambari_server.AMBARI_PROPERTIES_FILE = fn2
  2102. with open(ambari_server.AMBARI_PROPERTIES_RPMSAVE_FILE, 'w') as f:
  2103. for line in properties:
  2104. f.write(line)
  2105. #Call tested method
  2106. ambari_server.update_ambari_properties()
  2107. ambari_properties = ambari_server.Properties()
  2108. ambari_properties.load(open(fn2))
  2109. self.assertTrue(ambari_server.NR_USER_PROPERTY in ambari_properties.keys())
  2110. value = ambari_properties[ambari_server.NR_USER_PROPERTY]
  2111. self.assertEqual(value, "root")
  2112. os.unlink(fn2)
  2113. @patch("sys.exit")
  2114. @patch.object(ambari_server, "get_YN_input")
  2115. @patch.object(ambari_server, "get_db_cli_tool")
  2116. @patch.object(ambari_server, "store_remote_properties")
  2117. @patch.object(ambari_server, "is_local_database")
  2118. @patch.object(ambari_server, "check_iptables")
  2119. @patch.object(ambari_server, "check_jdbc_drivers")
  2120. @patch.object(ambari_server, "is_root")
  2121. @patch.object(ambari_server, "check_ambari_user")
  2122. @patch.object(ambari_server, "download_jdk")
  2123. @patch.object(ambari_server, "configure_os_settings")
  2124. @patch('__builtin__.raw_input')
  2125. def test_setup_remote_db_wo_client(self,raw_input, 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,
  2126. store_remote_properties_mock, get_db_cli_tool_mock, get_YN_input, exit_mock):
  2127. args = MagicMock()
  2128. raw_input.return_value =""
  2129. is_root_mock.return_value = True
  2130. is_local_db_mock.return_value = False
  2131. get_YN_input.return_value = False
  2132. check_iptables_mock.return_value = (0, "other")
  2133. store_remote_properties_mock.return_value = 0
  2134. get_db_cli_tool_mock.return_value = None
  2135. check_jdbc_drivers_mock.return_value=0
  2136. check_ambari_user_mock.return_value = 0
  2137. download_jdk_mock.return_value = 0
  2138. configure_os_settings_mock.return_value = 0
  2139. try:
  2140. ambari_server.setup(args)
  2141. self.fail("Should throw exception")
  2142. except NonFatalException as fe:
  2143. # Expected
  2144. self.assertTrue("The cli was not found" in fe.reason)
  2145. @patch.object(ambari_server, "parse_properties_file")
  2146. @patch.object(ambari_server, "get_db_cli_tool")
  2147. @patch.object(ambari_server, "print_error_msg")
  2148. @patch.object(ambari_server, "get_YN_input")
  2149. @patch.object(ambari_server, "setup_db")
  2150. @patch.object(ambari_server, "run_os_command")
  2151. @patch.object(ambari_server, "is_root")
  2152. def test_reset_remote_db_wo_client(self, is_root_mock, run_os_command_mock, setup_db_mock,
  2153. get_YN_inputMock, print_error_msg_mock, get_db_cli_tool_mock, parse_properties_file_mock):
  2154. args = MagicMock()
  2155. get_YN_inputMock.return_value = True
  2156. run_os_command_mock.return_value = (0, None, None)
  2157. args.persistence_type="remote"
  2158. get_db_cli_tool_mock.return_value = None
  2159. is_root_mock.return_value = True
  2160. try:
  2161. ambari_server.reset(args)
  2162. self.fail("Should throw exception")
  2163. except NonFatalException as fe:
  2164. # Expected
  2165. self.assertTrue("Client wasn't found" in fe.reason)
  2166. pass
  2167. @patch.object(ambari_server, "find_properties_file")
  2168. def test_get_ambari_properties(self, find_properties_file_mock):
  2169. find_properties_file_mock.return_value = None
  2170. rcode = ambari_server.get_ambari_properties()
  2171. self.assertEqual(rcode, -1)
  2172. tf1 = tempfile.NamedTemporaryFile()
  2173. find_properties_file_mock.return_value = tf1.name
  2174. prop_name='name'
  2175. prop_value='val'
  2176. with open(tf1.name, 'w') as fout:
  2177. fout.write(prop_name + '=' + prop_value)
  2178. fout.close()
  2179. properties = ambari_server.get_ambari_properties()
  2180. self.assertEqual(properties[prop_name], prop_value)
  2181. @patch.object(ambari_server, "get_ambari_properties")
  2182. @patch.object(ambari_server, "find_jdbc_driver")
  2183. @patch.object(ambari_server, "copy_files")
  2184. @patch.object(ambari_server, "print_error_msg")
  2185. @patch.object(ambari_server, "print_warning_msg")
  2186. @patch('__builtin__.raw_input')
  2187. @patch("sys.exit")
  2188. def check_jdbc_drivers(self, exit_mock, raw_input_mock, print_warning_msg, print_error_msg_mock, copy_files_mock,
  2189. find_jdbc_driver_mock, get_ambari_properties_mock):
  2190. out = StringIO.StringIO()
  2191. sys.stdout = out
  2192. args = MagicMock()
  2193. # Check positive scenario
  2194. drivers_list = ['driver_file']
  2195. resources_dir = '/tmp'
  2196. get_ambari_properties_mock.return_value = {ambari_server.RESOURCES_DIR_PROPERTY : resources_dir}
  2197. find_jdbc_driver_mock.return_value = drivers_list
  2198. args.database = "oracle"
  2199. rcode = ambari_server.check_jdbc_drivers(args)
  2200. self.assertEqual(0, rcode)
  2201. copy_files_mock.assert_called_with(drivers_list, resources_dir)
  2202. # Check negative scenarios
  2203. # Silent option, no drivers
  2204. ambari_server.SILENT = True
  2205. find_jdbc_driver_mock.return_value = -1
  2206. rcode = ambari_server.check_jdbc_drivers(args)
  2207. self.assertTrue(print_error_msg_mock.called)
  2208. self.assertTrue(exit_mock.called)
  2209. # Non-Silent option, no drivers
  2210. ambari_server.SILENT = False
  2211. find_jdbc_driver_mock.return_value = -1
  2212. rcode = ambari_server.check_jdbc_drivers(args)
  2213. self.assertTrue(exit_mock.called)
  2214. self.assertTrue(print_error_msg_mock.called)
  2215. # Non-Silent option, no drivers at first ask, present drivers after that
  2216. find_jdbc_driver_mock.side_effect = [-1, drivers_list]
  2217. rcode = ambari_server.check_jdbc_drivers(args)
  2218. self.assertEqual(0, rcode)
  2219. copy_files_mock.assert_called_with(drivers_list, resources_dir)
  2220. # Non-Silent option, no drivers at first ask, present drivers after that
  2221. find_jdbc_driver_mock.reset()
  2222. find_jdbc_driver_mock.side_effect = [-1, -1]
  2223. rcode = ambari_server.check_jdbc_drivers(args)
  2224. self.assertTrue(exit_mock.called)
  2225. self.assertTrue(print_error_msg_mock.called)
  2226. sys.stdout = sys.__stdout__
  2227. @patch.object(ambari_server, "find_properties_file")
  2228. def test_get_ambari_properties(self, find_properties_file):
  2229. find_properties_file.return_value = None
  2230. rcode = ambari_server.get_ambari_properties()
  2231. self.assertEqual(rcode, -1)
  2232. tf1 = tempfile.NamedTemporaryFile()
  2233. find_properties_file.return_value = tf1.name
  2234. prop_name='name'
  2235. prop_value='val'
  2236. with open(tf1.name, 'w') as fout:
  2237. fout.write(prop_name + '=' + prop_value)
  2238. fout.close()
  2239. properties = ambari_server.get_ambari_properties()
  2240. self.assertEqual(properties[prop_name], prop_value)
  2241. self.assertEqual(properties.fileName, os.path.abspath(tf1.name))
  2242. sys.stdout = sys.__stdout__
  2243. @patch("os.path.exists")
  2244. @patch("os.remove")
  2245. @patch.object(ambari_server,"print_warning_msg")
  2246. def test_remove_file(self, printWarningMsgMock, removeMock, pathExistsMock):
  2247. def side_effect():
  2248. raise Exception(-1, "Failed to delete!")
  2249. removeMock.side_effect = side_effect
  2250. pathExistsMock.return_value = 1
  2251. res = ambari_server.remove_file("/someNonExsistantDir/filename")
  2252. self.assertEquals(res,1)
  2253. removeMock.side_effect = None
  2254. res = ambari_server.remove_file("/someExsistantDir/filename")
  2255. self.assertEquals(res, 0)
  2256. @patch("shutil.copyfile")
  2257. def test_copy_file(self, shutilCopyfileMock):
  2258. def side_effect():
  2259. raise Exception(-1, "Failed to copy!")
  2260. shutilCopyfileMock.side_effect = side_effect
  2261. try:
  2262. ambari_server.copy_file("/tmp/psswd","/someNonExsistantDir/filename")
  2263. self.fail("Exception on file not copied has not been thrown!")
  2264. except FatalException:
  2265. # Expected
  2266. pass
  2267. self.assertTrue(shutilCopyfileMock.called)
  2268. shutilCopyfileMock.side_effect = None
  2269. try:
  2270. ambari_server.copy_file("/tmp/psswd","/root/psswd")
  2271. except FatalException:
  2272. self.fail("Exception on file copied should not be thrown!")
  2273. self.assertTrue(shutilCopyfileMock.called)
  2274. @patch.object(ambari_server, "get_ambari_properties")
  2275. @patch.object(ambari_server, "find_jdbc_driver")
  2276. @patch.object(ambari_server, "copy_files")
  2277. @patch.object(ambari_server, "print_error_msg")
  2278. @patch.object(ambari_server, "print_warning_msg")
  2279. @patch('__builtin__.raw_input')
  2280. def test_check_jdbc_drivers(self, raw_input_mock, print_warning_msg, print_error_msg_mock, copy_files_mock,
  2281. find_jdbc_driver_mock, get_ambari_properties_mock):
  2282. out = StringIO.StringIO()
  2283. sys.stdout = out
  2284. args = MagicMock()
  2285. # Check positive scenario
  2286. drivers_list = ['driver_file']
  2287. resources_dir = '/tmp'
  2288. get_ambari_properties_mock.return_value = {ambari_server.RESOURCES_DIR_PROPERTY : resources_dir}
  2289. find_jdbc_driver_mock.return_value = drivers_list
  2290. copy_files_mock.return_value = 0
  2291. args.database = "oracle"
  2292. rcode = ambari_server.check_jdbc_drivers(args)
  2293. self.assertEqual(0, rcode)
  2294. copy_files_mock.assert_called_with(drivers_list, resources_dir)
  2295. get_ambari_properties_mock.reset_mock()
  2296. find_jdbc_driver_mock.reset_mock()
  2297. copy_files_mock.reset_mock()
  2298. print_error_msg_mock.reset_mock()
  2299. print_warning_msg.reset_mock()
  2300. raw_input_mock.reset_mock()
  2301. # Check negative scenarios
  2302. # Silent option, no drivers
  2303. ambari_server.SILENT = True
  2304. find_jdbc_driver_mock.return_value = -1
  2305. failed = False
  2306. try:
  2307. rcode = ambari_server.check_jdbc_drivers(args)
  2308. except FatalException:
  2309. failed = True
  2310. self.assertTrue(print_error_msg_mock.called)
  2311. self.assertTrue(failed)
  2312. get_ambari_properties_mock.reset_mock()
  2313. find_jdbc_driver_mock.reset_mock()
  2314. copy_files_mock.reset_mock()
  2315. print_error_msg_mock.reset_mock()
  2316. print_warning_msg.reset_mock()
  2317. raw_input_mock.reset_mock()
  2318. # Non-Silent option, no drivers
  2319. ambari_server.SILENT = False
  2320. find_jdbc_driver_mock.return_value = -1
  2321. failed = False
  2322. try:
  2323. rcode = ambari_server.check_jdbc_drivers(args)
  2324. except FatalException:
  2325. failed = True
  2326. self.assertTrue(failed)
  2327. self.assertTrue(print_error_msg_mock.called)
  2328. get_ambari_properties_mock.reset_mock()
  2329. find_jdbc_driver_mock.reset_mock()
  2330. copy_files_mock.reset_mock()
  2331. print_error_msg_mock.reset_mock()
  2332. print_warning_msg.reset_mock()
  2333. raw_input_mock.reset_mock()
  2334. # Non-Silent option, no drivers at first ask, present drivers after that
  2335. find_jdbc_driver_mock.side_effect = [-1, drivers_list]
  2336. rcode = ambari_server.check_jdbc_drivers(args)
  2337. self.assertEqual(0, rcode)
  2338. copy_files_mock.assert_called_with(drivers_list, resources_dir)
  2339. get_ambari_properties_mock.reset_mock()
  2340. find_jdbc_driver_mock.reset_mock()
  2341. copy_files_mock.reset_mock()
  2342. print_error_msg_mock.reset_mock()
  2343. print_warning_msg.reset_mock()
  2344. raw_input_mock.reset_mock()
  2345. # Non-Silent option, no drivers at first ask, no drivers after that
  2346. find_jdbc_driver_mock.side_effect = [-1, -1]
  2347. failed = False
  2348. try:
  2349. rcode = ambari_server.check_jdbc_drivers(args)
  2350. except FatalException:
  2351. failed = True
  2352. self.assertTrue(failed)
  2353. self.assertTrue(print_error_msg_mock.called)
  2354. get_ambari_properties_mock.reset_mock()
  2355. find_jdbc_driver_mock.reset_mock()
  2356. copy_files_mock.reset_mock()
  2357. print_error_msg_mock.reset_mock()
  2358. print_warning_msg.reset_mock()
  2359. raw_input_mock.reset_mock()
  2360. # Failed to copy_files
  2361. find_jdbc_driver_mock.side_effect = [drivers_list]
  2362. try:
  2363. rcode = ambari_server.check_jdbc_drivers(args)
  2364. except FatalException:
  2365. failed = True
  2366. self.assertTrue(failed)
  2367. sys.stdout = sys.__stdout__
  2368. @patch.object(ambari_server, "find_properties_file")
  2369. def test_get_ambari_properties(self, find_properties_file_mock):
  2370. find_properties_file_mock.return_value = None
  2371. rcode = ambari_server.get_ambari_properties()
  2372. self.assertEqual(rcode, -1)
  2373. tf1 = tempfile.NamedTemporaryFile()
  2374. find_properties_file_mock.return_value = tf1.name
  2375. prop_name='name'
  2376. prop_value='val'
  2377. with open(tf1.name, 'w') as fout:
  2378. fout.write(prop_name + '=' + prop_value)
  2379. fout.close()
  2380. properties = ambari_server.get_ambari_properties()
  2381. self.assertEqual(properties[prop_name], prop_value)
  2382. self.assertEqual(properties.fileName, os.path.abspath(tf1.name))
  2383. sys.stdout = sys.__stdout__
  2384. @patch.object(ambari_server, "find_properties_file")
  2385. def test_parse_properties_file(self, find_properties_file_mock):
  2386. tf1 = tempfile.NamedTemporaryFile(mode='r')
  2387. find_properties_file_mock.return_value = tf1.name
  2388. args = MagicMock()
  2389. ambari_server.parse_properties_file(args)
  2390. self.assertEquals(args.persistence_type, "local")
  2391. with open(tf1.name, 'w') as fout:
  2392. fout.write("\n")
  2393. fout.write(ambari_server.PERSISTENCE_TYPE_PROPERTY+"=remote")
  2394. args = MagicMock()
  2395. ambari_server.parse_properties_file(args)
  2396. self.assertEquals(args.persistence_type, "remote")
  2397. @patch.object(ambari_server, 'decrypt_password_for_alias')
  2398. @patch.object(ambari_server, 'is_alias_string')
  2399. @patch.object(ambari_server, 'get_ambari_properties')
  2400. def test_configure_database_username_password_masterkey_persisted(self,
  2401. get_ambari_properties_method, is_alias_string_method,
  2402. decrypt_password_for_alias_method):
  2403. out = StringIO.StringIO()
  2404. sys.stdout = out
  2405. configs = {ambari_server.JDBC_USER_NAME_PROPERTY: "fakeuser",
  2406. ambari_server.JDBC_PASSWORD_PROPERTY: "${alias=somealias}",
  2407. ambari_server.SECURITY_KEY_IS_PERSISTED: "True" }
  2408. get_ambari_properties_method.return_value = configs
  2409. is_alias_string_method.return_value = True
  2410. decrypt_password_for_alias_method.return_value = "falepasswd"
  2411. args = MagicMock()
  2412. args.master_key = None
  2413. ambari_server.configure_database_username_password(args)
  2414. self.assertTrue(decrypt_password_for_alias_method.called)
  2415. self.assertTrue(is_alias_string_method.called)
  2416. self.assertEquals("fakeuser", args.database_username)
  2417. self.assertEquals("falepasswd", args.database_password)
  2418. sys.stdout = sys.__stdout__
  2419. @patch.object(ambari_server, 'read_password')
  2420. def test_configure_database_password(self, read_password_method):
  2421. out = StringIO.StringIO()
  2422. sys.stdout = out
  2423. read_password_method.return_value = "fakepasswd"
  2424. result = ambari_server.configure_database_password(True)
  2425. self.assertTrue(read_password_method.called)
  2426. self.assertEquals("fakepasswd", result)
  2427. result = ambari_server.configure_database_password(True)
  2428. self.assertEquals("fakepasswd", result)
  2429. result = ambari_server.configure_database_password(True)
  2430. self.assertEquals("fakepasswd", result)
  2431. sys.stdout = sys.__stdout__
  2432. @patch.object(ambari_server, 'remove_password_file')
  2433. @patch.object(ambari_server, 'save_passwd_for_alias')
  2434. @patch.object(ambari_server, 'read_master_key')
  2435. @patch.object(ambari_server, 'read_ambari_user')
  2436. @patch.object(ambari_server, 'get_master_key_location')
  2437. @patch.object(ambari_server, 'update_properties')
  2438. @patch.object(ambari_server, 'save_master_key')
  2439. @patch.object(ambari_server, 'get_YN_input')
  2440. @patch.object(ambari_server, 'search_file')
  2441. @patch.object(ambari_server, 'get_ambari_properties')
  2442. @patch.object(ambari_server, 'is_root')
  2443. def test_setup_master_key_not_persist(self, is_root_method,
  2444. get_ambari_properties_method, search_file_message,
  2445. get_YN_input_method, save_master_key_method,
  2446. update_properties_method, get_master_key_location_method,
  2447. read_ambari_user_method, read_master_key_method,
  2448. save_passwd_for_alias_method, remove_password_file_method):
  2449. is_root_method.return_value = True
  2450. p = get_ambari_properties_method.return_value
  2451. p.get_property.side_effect = [ None, "fakepasswd", "fakepasswd", "fakepasswd"]
  2452. read_master_key_method.return_value = "aaa"
  2453. get_YN_input_method.return_value = False
  2454. read_ambari_user_method.return_value = None
  2455. save_passwd_for_alias_method.return_value = 0
  2456. ambari_server.setup_master_key()
  2457. self.assertTrue(get_YN_input_method.called)
  2458. self.assertTrue(read_master_key_method.called)
  2459. self.assertTrue(read_ambari_user_method.called)
  2460. self.assertTrue(update_properties_method.called)
  2461. self.assertFalse(save_master_key_method.called)
  2462. self.assertTrue(save_passwd_for_alias_method.called)
  2463. self.assertEquals(3, save_passwd_for_alias_method.call_count)
  2464. self.assertTrue(remove_password_file_method.called)
  2465. result_expected = {ambari_server.JDBC_PASSWORD_PROPERTY :
  2466. ambari_server.get_alias_string(ambari_server.JDBC_RCA_PASSWORD_ALIAS),
  2467. ambari_server.LDAP_MGR_PASSWORD_PROPERTY :
  2468. ambari_server.get_alias_string(ambari_server.LDAP_MGR_PASSWORD_ALIAS),
  2469. ambari_server.SSL_TRUSTSTORE_PASSWORD_PROPERTY :
  2470. ambari_server.get_alias_string(ambari_server.SSL_TRUSTSTORE_PASSWORD_ALIAS),
  2471. ambari_server.SECURITY_IS_ENCRYPTION_ENABLED : 'true'}
  2472. sorted_x = sorted(result_expected.iteritems(), key=operator.itemgetter(0))
  2473. sorted_y = sorted(update_properties_method.call_args[0][1].iteritems(),
  2474. key=operator.itemgetter(0))
  2475. self.assertEquals(sorted_x, sorted_y)
  2476. @patch.object(ambari_server, 'read_master_key')
  2477. @patch.object(ambari_server, 'read_ambari_user')
  2478. @patch.object(ambari_server, 'get_master_key_location')
  2479. @patch.object(ambari_server, 'update_properties')
  2480. @patch.object(ambari_server, 'save_master_key')
  2481. @patch.object(ambari_server, 'get_YN_input')
  2482. @patch.object(ambari_server, 'search_file')
  2483. @patch.object(ambari_server, 'get_ambari_properties')
  2484. @patch.object(ambari_server, 'is_root')
  2485. def test_setup_master_key_persist(self, is_root_method,
  2486. get_ambari_properties_method, search_file_message,
  2487. get_YN_input_method, save_master_key_method,
  2488. update_properties_method, get_master_key_location_method,
  2489. read_ambari_user_method, read_master_key_method):
  2490. is_root_method.return_value = True
  2491. p = get_ambari_properties_method.return_value
  2492. p.get_property.side_effect = [ None, "fakepasswd", None, None]
  2493. read_master_key_method.return_value = "aaa"
  2494. get_YN_input_method.side_effect = [True, False]
  2495. read_ambari_user_method.return_value = None
  2496. ambari_server.setup_master_key()
  2497. self.assertTrue(get_YN_input_method.called)
  2498. self.assertTrue(read_master_key_method.called)
  2499. self.assertTrue(read_ambari_user_method.called)
  2500. self.assertTrue(update_properties_method.called)
  2501. self.assertTrue(save_master_key_method.called)
  2502. result_expected = {ambari_server.JDBC_PASSWORD_PROPERTY:
  2503. ambari_server.get_alias_string(ambari_server.JDBC_RCA_PASSWORD_ALIAS),
  2504. ambari_server.SECURITY_IS_ENCRYPTION_ENABLED: 'true'}
  2505. sorted_x = sorted(result_expected.iteritems(), key=operator.itemgetter(0))
  2506. sorted_y = sorted(update_properties_method.call_args[0][1].iteritems(),
  2507. key=operator.itemgetter(0))
  2508. self.assertEquals(sorted_x, sorted_y)
  2509. @patch.object(ambari_server, 'read_master_key')
  2510. @patch.object(ambari_server, 'remove_password_file')
  2511. @patch("os.path.exists")
  2512. @patch.object(ambari_server, 'read_ambari_user')
  2513. @patch.object(ambari_server, 'get_master_key_location')
  2514. @patch("ambari-server.Properties")
  2515. @patch.object(ambari_server, 'save_passwd_for_alias')
  2516. @patch.object(ambari_server, 'read_passwd_for_alias')
  2517. @patch.object(ambari_server, 'update_properties')
  2518. @patch.object(ambari_server, 'save_master_key')
  2519. @patch.object(ambari_server, 'get_validated_string_input')
  2520. @patch.object(ambari_server, 'get_YN_input')
  2521. @patch.object(ambari_server, 'search_file')
  2522. @patch.object(ambari_server, 'get_ambari_properties')
  2523. @patch.object(ambari_server, 'is_root')
  2524. def test_reset_master_key_persisted(self, is_root_method,
  2525. get_ambari_properties_method, search_file_message,
  2526. get_YN_input_method, get_validated_string_input_method,
  2527. save_master_key_method, update_properties_method,
  2528. read_passwd_for_alias_method, save_passwd_for_alias_method,
  2529. Properties_mock, get_master_key_location_method,
  2530. read_ambari_user_method, exists_mock,
  2531. remove_password_file_method, read_master_key_method):
  2532. # Testing call under non-root
  2533. is_root_method.return_value = False
  2534. try:
  2535. ambari_server.setup_master_key()
  2536. self.fail("Should throw exception")
  2537. except FatalException as fe:
  2538. # Expected
  2539. self.assertTrue("root-level" in fe.reason)
  2540. pass
  2541. # Testing call under root
  2542. is_root_method.return_value = True
  2543. search_file_message.return_value = "filepath"
  2544. read_ambari_user_method.return_value = None
  2545. p = get_ambari_properties_method.return_value
  2546. p.get_property.side_effect = [ 'true', '${alias=fakealias}',
  2547. '${alias=fakealias}', '${alias=fakealias}']
  2548. get_YN_input_method.side_effect = [ True, True ]
  2549. read_master_key_method.return_value = "aaa"
  2550. read_passwd_for_alias_method.return_value = "fakepassword"
  2551. save_passwd_for_alias_method.return_value = 0
  2552. exists_mock.return_value = False
  2553. ambari_server.setup_master_key()
  2554. self.assertTrue(save_master_key_method.called)
  2555. self.assertTrue(get_YN_input_method.called)
  2556. self.assertTrue(read_master_key_method.called)
  2557. self.assertTrue(update_properties_method.called)
  2558. self.assertTrue(read_passwd_for_alias_method.called)
  2559. self.assertTrue(3, read_passwd_for_alias_method.call_count)
  2560. self.assertTrue(3, save_passwd_for_alias_method.call_count)
  2561. result_expected = {ambari_server.JDBC_PASSWORD_PROPERTY:
  2562. ambari_server.get_alias_string(ambari_server.JDBC_RCA_PASSWORD_ALIAS),
  2563. ambari_server.LDAP_MGR_PASSWORD_PROPERTY:
  2564. ambari_server.get_alias_string(ambari_server.LDAP_MGR_PASSWORD_ALIAS),
  2565. ambari_server.SSL_TRUSTSTORE_PASSWORD_PROPERTY:
  2566. ambari_server.get_alias_string(ambari_server.SSL_TRUSTSTORE_PASSWORD_ALIAS),
  2567. ambari_server.SECURITY_IS_ENCRYPTION_ENABLED: 'true'}
  2568. sorted_x = sorted(result_expected.iteritems(), key=operator.itemgetter(0))
  2569. sorted_y = sorted(update_properties_method.call_args[0][1].iteritems(),
  2570. key=operator.itemgetter(0))
  2571. self.assertEquals(sorted_x, sorted_y)
  2572. @patch.object(ambari_server, 'remove_password_file')
  2573. @patch("os.path.exists")
  2574. @patch.object(ambari_server, 'read_ambari_user')
  2575. @patch.object(ambari_server, 'get_master_key_location')
  2576. @patch("ambari-server.Properties")
  2577. @patch.object(ambari_server, 'save_passwd_for_alias')
  2578. @patch.object(ambari_server, 'read_passwd_for_alias')
  2579. @patch.object(ambari_server, 'update_properties')
  2580. @patch.object(ambari_server, 'save_master_key')
  2581. @patch.object(ambari_server, 'get_validated_string_input')
  2582. @patch.object(ambari_server, 'get_YN_input')
  2583. @patch.object(ambari_server, 'search_file')
  2584. @patch.object(ambari_server, 'get_ambari_properties')
  2585. @patch.object(ambari_server, 'is_root')
  2586. def test_reset_master_key_not_persisted(self, is_root_method,
  2587. get_ambari_properties_method,
  2588. search_file_message, get_YN_input_method,
  2589. get_validated_string_input_method, save_master_key_method,
  2590. update_properties_method, read_passwd_for_alias_method,
  2591. save_passwd_for_alias_method, Properties_mock,
  2592. get_master_key_location_method, read_ambari_user_method,
  2593. exists_mock, remove_password_file_method):
  2594. is_root_method.return_value = True
  2595. search_file_message.return_value = False
  2596. read_ambari_user_method.return_value = None
  2597. p = get_ambari_properties_method.return_value
  2598. p.get_property.side_effect = [ 'true', '${alias=fakealias}',
  2599. '${alias=fakealias}', '${alias=fakealias}']
  2600. get_YN_input_method.side_effect = [ True, False ]
  2601. get_validated_string_input_method.return_value = "aaa"
  2602. read_passwd_for_alias_method.return_value = "fakepassword"
  2603. save_passwd_for_alias_method.return_value = 0
  2604. exists_mock.return_value = False
  2605. ambari_server.setup_master_key()
  2606. self.assertFalse(save_master_key_method.called)
  2607. self.assertTrue(get_YN_input_method.called)
  2608. self.assertTrue(get_validated_string_input_method.called)
  2609. self.assertTrue(update_properties_method.called)
  2610. self.assertTrue(read_passwd_for_alias_method.called)
  2611. self.assertTrue(3, read_passwd_for_alias_method.call_count)
  2612. self.assertTrue(3, save_passwd_for_alias_method.call_count)
  2613. self.assertFalse(save_master_key_method.called)
  2614. result_expected = {ambari_server.JDBC_PASSWORD_PROPERTY:
  2615. ambari_server.get_alias_string(ambari_server.JDBC_RCA_PASSWORD_ALIAS),
  2616. ambari_server.LDAP_MGR_PASSWORD_PROPERTY:
  2617. ambari_server.get_alias_string(ambari_server.LDAP_MGR_PASSWORD_ALIAS),
  2618. ambari_server.SSL_TRUSTSTORE_PASSWORD_PROPERTY:
  2619. ambari_server.get_alias_string(ambari_server.SSL_TRUSTSTORE_PASSWORD_ALIAS),
  2620. ambari_server.SECURITY_IS_ENCRYPTION_ENABLED: 'true'}
  2621. sorted_x = sorted(result_expected.iteritems(), key=operator.itemgetter(0))
  2622. sorted_y = sorted(update_properties_method.call_args[0][1].iteritems(),
  2623. key=operator.itemgetter(0))
  2624. self.assertEquals(sorted_x, sorted_y)
  2625. @patch.object(ambari_server, 'save_passwd_for_alias')
  2626. @patch.object(ambari_server, 'get_YN_input')
  2627. @patch.object(ambari_server, 'update_properties')
  2628. @patch.object(ambari_server, 'configure_ldap_password')
  2629. @patch.object(ambari_server, 'get_validated_string_input')
  2630. @patch.object(ambari_server, 'setup_master_key')
  2631. @patch.object(ambari_server, 'search_file')
  2632. @patch.object(ambari_server, 'get_ambari_properties')
  2633. @patch.object(ambari_server, 'is_root')
  2634. def test_setup_ldap(self, is_root_method, get_ambari_properties_method,
  2635. search_file_message, setup_master_key_method,
  2636. get_validated_string_input_method,
  2637. configure_ldap_password_method, update_properties_method,
  2638. get_YN_input_method, save_passwd_for_alias_method):
  2639. out = StringIO.StringIO()
  2640. sys.stdout = out
  2641. # Testing call under non-root
  2642. is_root_method.return_value = False
  2643. try:
  2644. ambari_server.setup_ldap()
  2645. self.fail("Should throw exception")
  2646. except FatalException as fe:
  2647. # Expected
  2648. self.assertTrue("root-level" in fe.reason)
  2649. pass
  2650. # Testing call under root
  2651. is_root_method.return_value = True
  2652. search_file_message.return_value = "filepath"
  2653. configs = { ambari_server.SECURITY_MASTER_KEY_LOCATION : "filepath",
  2654. ambari_server.SECURITY_KEYS_DIR : tempfile.gettempdir(),
  2655. ambari_server.SECURITY_KEY_IS_PERSISTED : "true"
  2656. }
  2657. get_ambari_properties_method.return_value = configs
  2658. configure_ldap_password_method.return_value = "password"
  2659. setup_master_key_method.return_value = (None, True, True)
  2660. get_YN_input_method.return_value = True
  2661. save_passwd_for_alias_method.return_value = 0
  2662. def side_effect(*args, **kwargs):
  2663. if 'Bind anonymously' in args[0]:
  2664. return 'false'
  2665. if args[1] == "true" or args[1] == "false":
  2666. return args[1]
  2667. else:
  2668. return "test"
  2669. get_validated_string_input_method.side_effect = side_effect
  2670. ambari_server.setup_ldap()
  2671. ldap_properties_map =\
  2672. {
  2673. "authentication.ldap.primaryUrl" : "test",
  2674. "authentication.ldap.secondaryUrl" : "test",
  2675. "authentication.ldap.useSSL" : "false",
  2676. "authentication.ldap.usernameAttribute" : "test",
  2677. "authentication.ldap.baseDn" : "test",
  2678. "authentication.ldap.bindAnonymously" : "false",
  2679. "authentication.ldap.managerDn" : "test",
  2680. "authentication.ldap.managerPassword" : \
  2681. 'password',
  2682. "client.security" : "ldap"
  2683. }
  2684. sorted_x = sorted(ldap_properties_map.iteritems(), key=operator.itemgetter(0))
  2685. sorted_y = sorted(update_properties_method.call_args[0][1].iteritems(),
  2686. key=operator.itemgetter(0))
  2687. self.assertEquals(sorted_x, sorted_y)
  2688. self.assertTrue(update_properties_method.called)
  2689. self.assertTrue(configure_ldap_password_method.called)
  2690. self.assertTrue(get_validated_string_input_method.called)
  2691. self.assertTrue(get_YN_input_method.called)
  2692. sys.stdout = sys.__stdout__
  2693. @patch.object(ambari_server, 'read_password')
  2694. def test_configure_ldap_password(self, read_password_method):
  2695. out = StringIO.StringIO()
  2696. sys.stdout = out
  2697. read_password_method.return_value = "blah"
  2698. ambari_server.configure_ldap_password()
  2699. self.assertTrue(read_password_method.called)
  2700. sys.stdout = sys.__stdout__
  2701. def test_generate_random_string(self):
  2702. random_str_len = 100
  2703. str1 = ambari_server.generate_random_string(random_str_len)
  2704. self.assertTrue(len(str1) == random_str_len)
  2705. str2 = ambari_server.generate_random_string(random_str_len)
  2706. self.assertTrue(str1 != str2)
  2707. @patch("__builtin__.open")
  2708. @patch.object(ambari_server, "search_file")
  2709. @patch.object(ambari_server, "backup_file_in_temp")
  2710. def test_update_properties(self, backup_file_in_temp_mock, search_file_mock, open_mock):
  2711. conf_file = "ambari.properties"
  2712. propertyMap = {"1":"1", "2":"2"}
  2713. properties = MagicMock()
  2714. f = MagicMock(name = "file")
  2715. # f.__enter__.return_value = f #mimic file behavior
  2716. search_file_mock.return_value = conf_file
  2717. open_mock.return_value = f
  2718. ambari_server.update_properties(properties, propertyMap)
  2719. properties.store.assert_called_with(f.__enter__.return_value)
  2720. backup_file_in_temp_mock.assert_called_with(conf_file)
  2721. self.assertEquals(2, properties.removeOldProp.call_count)
  2722. self.assertEquals(2, properties.process_pair.call_count)
  2723. properties = MagicMock()
  2724. backup_file_in_temp_mock.reset_mock()
  2725. open_mock.reset_mock()
  2726. ambari_server.update_properties(properties, None)
  2727. properties.store.assert_called_with(f.__enter__.return_value)
  2728. backup_file_in_temp_mock.assert_called_with(conf_file)
  2729. self.assertFalse(properties.removeOldProp.called)
  2730. self.assertFalse(properties.process_pair.called)
  2731. pass
  2732. def test_regexps(self):
  2733. res = re.search(ambari_server.REGEX_HOSTNAME_PORT, "")
  2734. self.assertTrue(res is None)
  2735. res = re.search(ambari_server.REGEX_HOSTNAME_PORT, "ddd")
  2736. self.assertTrue(res is None)
  2737. res = re.search(ambari_server.REGEX_HOSTNAME_PORT, "gg:ff")
  2738. self.assertTrue(res is None)
  2739. res = re.search(ambari_server.REGEX_HOSTNAME_PORT, "gg:55444325")
  2740. self.assertTrue(res is None)
  2741. res = re.search(ambari_server.REGEX_HOSTNAME_PORT, "gg:555")
  2742. self.assertTrue(res is not None)
  2743. res = re.search(ambari_server.REGEX_TRUE_FALSE, "")
  2744. self.assertTrue(res is not None)
  2745. res = re.search(ambari_server.REGEX_TRUE_FALSE, "t")
  2746. self.assertTrue(res is None)
  2747. res = re.search(ambari_server.REGEX_TRUE_FALSE, "trrrr")
  2748. self.assertTrue(res is None)
  2749. res = re.search(ambari_server.REGEX_TRUE_FALSE, "true|false")
  2750. self.assertTrue(res is None)
  2751. res = re.search(ambari_server.REGEX_TRUE_FALSE, "true")
  2752. self.assertTrue(res is not None)
  2753. res = re.search(ambari_server.REGEX_TRUE_FALSE, "false")
  2754. self.assertTrue(res is not None)
  2755. res = re.search(ambari_server.REGEX_ANYTHING, "")
  2756. self.assertTrue(res is not None)
  2757. res = re.search(ambari_server.REGEX_ANYTHING, "t")
  2758. self.assertTrue(res is not None)
  2759. res = re.search(ambari_server.REGEX_ANYTHING, "trrrr")
  2760. self.assertTrue(res is not None)
  2761. def get_sample(self, sample):
  2762. """
  2763. Returns sample file content as string with normalized line endings
  2764. """
  2765. path = self.get_samples_dir(sample)
  2766. return self.get_file_string(path)
  2767. def get_file_string(self, file):
  2768. """
  2769. Returns file content as string with normalized line endings
  2770. """
  2771. string = open(file, 'r').read()
  2772. return self.normalize(string)
  2773. def normalize(self, string):
  2774. """
  2775. Normalizes line ending in string according to platform-default encoding
  2776. """
  2777. return string.replace("\n", os.linesep)
  2778. def get_samples_dir(self, sample):
  2779. """
  2780. Returns full file path by sample name
  2781. """
  2782. testdir = os.path.dirname(__file__)
  2783. return os.path.dirname(testdir) + os.sep + "resources" + os.sep \
  2784. + 'TestAmbaryServer.samples/' + sample