TestAmbaryServer.py 133 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648
  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", "keystore_file_path_tmp",\
  924. "pass_file_path", "pass_file_path_tmp",\
  925. "passin_file_path","password_file_path",\
  926. "keystore_cert_file_path",\
  927. "keystore_cert_key_file_path",]
  928. run_os_command_mock.return_value = (0, "", "")
  929. om = open_mock.return_value
  930. expect_import_file_to_keystore = "[call('keystore_file_path_tmp',"+\
  931. " 'keystore_file_path'),\n"+\
  932. " call('pass_file_path_tmp',"+\
  933. " 'pass_file_path'),\n"+\
  934. " call('cert_file_path',"+\
  935. " 'keystore_cert_file_path'),\n"+\
  936. " call('key_file_path',"+\
  937. " 'keystore_cert_key_file_path')]"
  938. ambari_server.import_cert_and_key("key_dir")
  939. self.assertTrue(get_validated_filepath_input_mock.call_count == 2)
  940. self.assertTrue(get_validated_string_input_mock.called)
  941. self.assertEqual(os_path_join_mock.call_count, 8)
  942. self.assertTrue(set_file_permissions_mock.call_count == 1)
  943. self.assertEqual(str(import_file_to_keystore_mock.call_args_list),\
  944. expect_import_file_to_keystore)
  945. @patch.object(ambari_server, "remove_file")
  946. @patch.object(ambari_server, "copy_file")
  947. @patch.object(ambari_server, "generate_random_string")
  948. @patch.object(ambari_server, "read_ambari_user")
  949. @patch.object(ambari_server, "set_file_permissions")
  950. @patch.object(ambari_server, "import_file_to_keystore")
  951. @patch("__builtin__.open")
  952. @patch.object(ambari_server, "run_os_command")
  953. @patch("os.path.join")
  954. @patch.object(ambari_server, "get_validated_filepath_input")
  955. @patch.object(ambari_server, "get_validated_string_input")
  956. @patch.object(ambari_server, "is_valid_cert_host")
  957. @patch.object(ambari_server, "is_valid_cert_exp")
  958. def test_import_cert_and_key_with_empty_password(self, \
  959. is_valid_cert_exp_mock, is_valid_cert_host_mock,
  960. get_validated_string_input_mock, get_validated_filepath_input_mock,\
  961. os_path_join_mock, run_os_command_mock, open_mock, \
  962. import_file_to_keystore_mock, set_file_permissions_mock,
  963. read_ambari_user_mock, generate_random_string_mock, copy_file_mock,\
  964. remove_file_mock):
  965. is_valid_cert_exp_mock.return_value=True
  966. is_valid_cert_host_mock.return_value=True
  967. get_validated_string_input_mock.return_value = ""
  968. get_validated_filepath_input_mock.side_effect =\
  969. ["cert_file_path","key_file_path"]
  970. os_path_join_mock.side_effect = ["keystore_file_path", "keystore_file_path_tmp",\
  971. "pass_file_path", "pass_file_path_tmp",\
  972. "passin_file_path","password_file_path",\
  973. "keystore_cert_file_path",\
  974. "keystore_cert_key_file_path",]
  975. run_os_command_mock.return_value = (0, "", "")
  976. expect_import_file_to_keystore = "[call('keystore_file_path_tmp',"+\
  977. " 'keystore_file_path'),\n"+\
  978. " call('pass_file_path_tmp',"+\
  979. " 'pass_file_path'),\n"+\
  980. " call('cert_file_path',"+\
  981. " 'keystore_cert_file_path'),\n"+\
  982. " call('key_file_path.secured',"+\
  983. " 'keystore_cert_key_file_path')]"
  984. ambari_server.import_cert_and_key("key_dir")
  985. self.assertEquals(get_validated_filepath_input_mock.call_count, 2)
  986. self.assertTrue(get_validated_string_input_mock.called)
  987. self.assertEquals(os_path_join_mock.call_count, 8)
  988. self.assertEquals(set_file_permissions_mock.call_count, 1)
  989. self.assertEqual(str(import_file_to_keystore_mock.call_args_list),\
  990. expect_import_file_to_keystore)
  991. self.assertTrue(generate_random_string_mock.called)
  992. @patch("__builtin__.open")
  993. @patch.object(ambari_server, "copy_file")
  994. @patch.object(ambari_server, "is_root")
  995. @patch.object(ambari_server, "read_ambari_user")
  996. @patch.object(ambari_server, "set_file_permissions")
  997. @patch.object(ambari_server, "import_file_to_keystore")
  998. @patch.object(ambari_server, "run_os_command")
  999. @patch("os.path.join")
  1000. @patch.object(ambari_server, "get_validated_filepath_input")
  1001. @patch.object(ambari_server, "get_validated_string_input")
  1002. def test_import_cert_and_key_with_incorrect_password(self,
  1003. get_validated_string_input_mock,\
  1004. get_validated_filepath_input_mock,\
  1005. os_path_join_mock,\
  1006. run_os_command_mock,\
  1007. import_file_to_keystore_mock,\
  1008. set_file_permissions_mock,\
  1009. read_ambari_user_mock,\
  1010. is_root_mock,\
  1011. copy_file_mock,\
  1012. open_mock):
  1013. get_validated_string_input_mock.return_value = "incorrect_password"
  1014. get_validated_filepath_input_mock.return_value = 'filename'
  1015. open_mock.return_value = MagicMock()
  1016. os_path_join_mock.return_value = ''
  1017. is_root_mock.return_value = True
  1018. #provided password doesn't match, openssl command returns an error
  1019. run_os_command_mock.return_value = (1, "", "Some error message")
  1020. self.assertFalse(ambari_server.import_cert_and_key_action(*["key_dir", None]))
  1021. self.assertFalse(ambari_server.import_cert_and_key("key_dir"))
  1022. def test_is_valid_cert_exp(self):
  1023. #No data in certInfo
  1024. certInfo = {}
  1025. is_valid = ambari_server.is_valid_cert_exp(certInfo)
  1026. self.assertFalse(is_valid)
  1027. #Issued in future
  1028. issuedOn = (datetime.datetime.now() + datetime.timedelta(hours=1000)).strftime(ambari_server.SSL_DATE_FORMAT)
  1029. expiresOn = (datetime.datetime.now() + datetime.timedelta(hours=2000)).strftime(ambari_server.SSL_DATE_FORMAT)
  1030. certInfo = {ambari_server.NOT_BEFORE_ATTR : issuedOn,
  1031. ambari_server.NOT_AFTER_ATTR : expiresOn}
  1032. is_valid = ambari_server.is_valid_cert_exp(certInfo)
  1033. self.assertFalse(is_valid)
  1034. #Was expired
  1035. issuedOn = (datetime.datetime.now() - datetime.timedelta(hours=2000)).strftime(ambari_server.SSL_DATE_FORMAT)
  1036. expiresOn = (datetime.datetime.now() - datetime.timedelta(hours=1000)).strftime(ambari_server.SSL_DATE_FORMAT)
  1037. certInfo = {ambari_server.NOT_BEFORE_ATTR : issuedOn,
  1038. ambari_server.NOT_AFTER_ATTR : expiresOn}
  1039. is_valid = ambari_server.is_valid_cert_exp(certInfo)
  1040. self.assertFalse(is_valid)
  1041. #Valid
  1042. issuedOn = (datetime.datetime.now() - datetime.timedelta(hours=2000)).strftime(ambari_server.SSL_DATE_FORMAT)
  1043. expiresOn = (datetime.datetime.now() + datetime.timedelta(hours=1000)).strftime(ambari_server.SSL_DATE_FORMAT)
  1044. certInfo = {ambari_server.NOT_BEFORE_ATTR : issuedOn,
  1045. ambari_server.NOT_AFTER_ATTR : expiresOn}
  1046. is_valid = ambari_server.is_valid_cert_exp(certInfo)
  1047. self.assertTrue(is_valid)
  1048. @patch.object(ambari_server, "get_fqdn")
  1049. def test_is_valid_cert_host(self, get_fqdn_mock):
  1050. #No data in certInfo
  1051. certInfo = {}
  1052. is_valid = ambari_server.is_valid_cert_host(certInfo)
  1053. self.assertFalse(is_valid)
  1054. #Failed to get FQDN
  1055. get_fqdn_mock.return_value = None
  1056. is_valid = ambari_server.is_valid_cert_host(certInfo)
  1057. self.assertFalse(is_valid)
  1058. #FQDN and Common name in certificated don't correspond
  1059. get_fqdn_mock.return_value = 'host1'
  1060. certInfo = {ambari_server.COMMON_NAME_ATTR : 'host2'}
  1061. is_valid = ambari_server.is_valid_cert_host(certInfo)
  1062. self.assertFalse(is_valid)
  1063. #FQDN and Common name in certificated correspond
  1064. get_fqdn_mock.return_value = 'host1'
  1065. certInfo = {ambari_server.COMMON_NAME_ATTR : 'host1'}
  1066. is_valid = ambari_server.is_valid_cert_host(certInfo)
  1067. self.assertTrue(is_valid)
  1068. @patch.object(ambari_server, "get_ambari_properties")
  1069. def test_is_valid_https_port(self, get_ambari_properties_mock):
  1070. #No ambari.properties
  1071. get_ambari_properties_mock.return_value = -1
  1072. is_valid = ambari_server.is_valid_https_port(1111)
  1073. self.assertEqual(is_valid, False)
  1074. #User entered port used by one way auth
  1075. portOneWay = "1111"
  1076. portTwoWay = "2222"
  1077. validPort = "3333"
  1078. get_ambari_properties_mock.return_value = {ambari_server.SRVR_ONE_WAY_SSL_PORT_PROPERTY : portOneWay,
  1079. ambari_server.SRVR_TWO_WAY_SSL_PORT_PROPERTY : portTwoWay}
  1080. is_valid = ambari_server.is_valid_https_port(portOneWay)
  1081. self.assertEqual(is_valid, False)
  1082. #User entered port used by two way auth
  1083. is_valid = ambari_server.is_valid_https_port(portTwoWay)
  1084. self.assertEqual(is_valid, False)
  1085. #User entered valid port
  1086. get_ambari_properties_mock.return_value = {ambari_server.SRVR_ONE_WAY_SSL_PORT_PROPERTY : portOneWay,
  1087. ambari_server.SRVR_TWO_WAY_SSL_PORT_PROPERTY : portTwoWay}
  1088. is_valid = ambari_server.is_valid_https_port(validPort)
  1089. self.assertEqual(is_valid, True)
  1090. @patch("socket.getfqdn")
  1091. @patch("urllib2.urlopen")
  1092. @patch.object(ambari_server, "get_ambari_properties")
  1093. def test_get_fqdn(self, get_ambari_properties_mock, url_open_mock, getfqdn_mock):
  1094. #No ambari.properties
  1095. get_ambari_properties_mock.return_value = -1
  1096. fqdn = ambari_server.get_fqdn()
  1097. self.assertEqual(fqdn, None)
  1098. #Check mbari_server.GET_FQDN_SERVICE_URL property name (AMBARI-2612)
  1099. #property name should be server.fqdn.service.url
  1100. self.assertEqual(ambari_server.GET_FQDN_SERVICE_URL, "server.fqdn.service.url")
  1101. #Read FQDN from service
  1102. p = MagicMock()
  1103. p[ambari_server.GET_FQDN_SERVICE_URL] = 'someurl'
  1104. get_ambari_properties_mock.return_value = p
  1105. u = MagicMock()
  1106. host = 'host1.domain.com'
  1107. u.read.return_value = host
  1108. url_open_mock.return_value = u
  1109. fqdn = ambari_server.get_fqdn()
  1110. self.assertEqual(fqdn, host)
  1111. #Failed to read FQDN from service, getting from socket
  1112. u.reset_mock()
  1113. u.side_effect = Exception("Failed to read FQDN from service")
  1114. getfqdn_mock.return_value = host
  1115. fqdn = ambari_server.get_fqdn()
  1116. self.assertEqual(fqdn, host)
  1117. @patch.object(ambari_server, "run_os_command")
  1118. def test_get_cert_info(self, run_os_command_mock):
  1119. # Error running openssl command
  1120. path = 'path/to/certificate'
  1121. run_os_command_mock.return_value = -1, None, None
  1122. cert_info = ambari_server.get_cert_info(path)
  1123. self.assertEqual(cert_info, None)
  1124. #Empty result of openssl command
  1125. run_os_command_mock.return_value = 0, None, None
  1126. cert_info = ambari_server.get_cert_info(path)
  1127. self.assertEqual(cert_info, None)
  1128. #Positive scenario
  1129. notAfter = 'Jul 3 14:12:57 2014 GMT'
  1130. notBefore = 'Jul 3 14:12:57 2013 GMT'
  1131. attr1_key = 'A'
  1132. attr1_value = 'foo'
  1133. attr2_key = 'B'
  1134. attr2_value = 'bar'
  1135. attr3_key = 'CN'
  1136. attr3_value = 'host.domain.com'
  1137. subject_pattern = '/{attr1_key}={attr1_value}/{attr2_key}={attr2_value}/{attr3_key}={attr3_value}'
  1138. subject = subject_pattern.format(attr1_key = attr1_key, attr1_value = attr1_value,
  1139. attr2_key = attr2_key, attr2_value = attr2_value,
  1140. attr3_key = attr3_key, attr3_value = attr3_value)
  1141. out_pattern = """
  1142. notAfter={notAfter}
  1143. notBefore={notBefore}
  1144. subject={subject}
  1145. -----BEGIN CERTIFICATE-----
  1146. MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
  1147. ...
  1148. 5lqd8XxOGSYoMOf+70BLN2sB
  1149. -----END CERTIFICATE-----
  1150. """
  1151. out = out_pattern.format(notAfter = notAfter, notBefore = notBefore, subject = subject)
  1152. run_os_command_mock.return_value = 0, out, None
  1153. cert_info = ambari_server.get_cert_info(path)
  1154. self.assertEqual(cert_info['notAfter'], notAfter)
  1155. self.assertEqual(cert_info['notBefore'], notBefore)
  1156. self.assertEqual(cert_info['subject'], subject)
  1157. self.assertEqual(cert_info[attr1_key], attr1_value)
  1158. self.assertEqual(cert_info[attr2_key], attr2_value)
  1159. self.assertEqual(cert_info[attr3_key], attr3_value)
  1160. @patch('__builtin__.raw_input')
  1161. def test_get_validated_string_input(self, raw_input_mock):
  1162. prompt = 'prompt'
  1163. default_value = 'default'
  1164. description = 'desc'
  1165. validator = MagicMock()
  1166. validator.return_value = True
  1167. inputed_value1 = 'val1'
  1168. inputed_value2 = 'val2'
  1169. raw_input_mock.return_value = inputed_value1
  1170. input = ambari_server.get_validated_string_input(prompt, default_value, None,
  1171. description, False, False, validator)
  1172. self.assertTrue(validator.called)
  1173. self.assertEqual(inputed_value1, input)
  1174. validator.side_effect = [False, True]
  1175. raw_input_mock.side_effect = [inputed_value1, inputed_value2]
  1176. input = ambari_server.get_validated_string_input(prompt, default_value, None,
  1177. description, False, False, validator)
  1178. self.assertEqual(inputed_value2, input)
  1179. @patch.object(ambari_server, "run_os_command")
  1180. @patch("__builtin__.open")
  1181. @patch("os.path.exists")
  1182. def test_is_server_runing(self, os_path_exists_mock, open_mock,\
  1183. run_os_command_mock):
  1184. os_path_exists_mock.return_value = True
  1185. f = open_mock.return_value
  1186. f.readline.return_value = "111"
  1187. run_os_command_mock.return_value = 0, "", ""
  1188. status, pid = ambari_server.is_server_runing()
  1189. self.assertTrue(status)
  1190. self.assertEqual(111, pid)
  1191. os_path_exists_mock.return_value = False
  1192. status, pid = ambari_server.is_server_runing()
  1193. self.assertFalse(status)
  1194. @patch.object(ambari_server, "install_jce_manualy")
  1195. @patch("os.stat")
  1196. @patch("os.path.isfile")
  1197. @patch("os.path.exists")
  1198. @patch.object(ambari_server, "track_jdk")
  1199. @patch.object(ambari_server, "get_YN_input")
  1200. @patch.object(ambari_server, "run_os_command")
  1201. @patch.object(ambari_server, "write_property")
  1202. @patch.object(ambari_server, "print_info_msg")
  1203. @patch.object(ambari_server, "get_JAVA_HOME")
  1204. @patch.object(ambari_server, "get_ambari_properties")
  1205. @patch("shutil.copyfile")
  1206. def test_download_jdk(self, copyfile_mock, get_ambari_properties_mock, get_JAVA_HOME_mock,\
  1207. print_info_msg_mock, write_property_mock,\
  1208. run_os_command_mock, get_YN_input_mock, track_jdk_mock,
  1209. path_existsMock, path_isfileMock, statMock,\
  1210. install_jce_manualy_mock):
  1211. args = MagicMock()
  1212. args.java_home = "somewhere"
  1213. path_existsMock.return_value = False
  1214. get_JAVA_HOME_mock.return_value = False
  1215. get_ambari_properties_mock.return_value = -1
  1216. # Test case: ambari.properties not found
  1217. try:
  1218. ambari_server.download_jdk(args)
  1219. self.fail("Should throw exception because of not found ambari.properties")
  1220. except FatalException:
  1221. # Expected
  1222. self.assertTrue(get_ambari_properties_mock.called)
  1223. pass
  1224. # Test case: JDK already exists
  1225. p = MagicMock()
  1226. get_ambari_properties_mock.return_value = p
  1227. p.__getitem__.return_value = "somewhere"
  1228. get_JAVA_HOME_mock.return_value = True
  1229. path_existsMock.return_value = True
  1230. rcode = ambari_server.download_jdk(args)
  1231. self.assertEqual(0, rcode)
  1232. # Test case: java home setup
  1233. get_JAVA_HOME_mock.return_value = False
  1234. rcode = ambari_server.download_jdk(args)
  1235. self.assertEqual(0, rcode)
  1236. self.assertTrue(write_property_mock.called)
  1237. # Test case: JDK file does not exist, property not defined
  1238. path_existsMock.return_value = False
  1239. p = MagicMock()
  1240. get_ambari_properties_mock.return_value = p
  1241. p.__getitem__.side_effect = KeyError("test exception")
  1242. try:
  1243. ambari_server.download_jdk(args)
  1244. self.fail("Should throw exception")
  1245. except FatalException:
  1246. # Expected
  1247. pass
  1248. # Test case: JDK file does not exist, os command (curl) result does not
  1249. # contain Content-Length
  1250. p.__getitem__.return_value = "somewhere"
  1251. p.__getitem__.side_effect = None
  1252. path_existsMock.return_value = False
  1253. run_os_command_mock.return_value = (0, "Wrong out", None)
  1254. try:
  1255. ambari_server.download_jdk(args)
  1256. self.fail("Should throw exception")
  1257. except FatalException:
  1258. # Expected
  1259. pass
  1260. # Successful JDK download
  1261. ambari_server.JDK_INSTALL_DIR = os.getcwd()
  1262. get_YN_input_mock.return_value = True
  1263. run_os_command_mock.return_value = (0, "Creating jdk-1.2/jre"
  1264. "Content-Length: 32000\r\n"
  1265. , None)
  1266. statResult = MagicMock()
  1267. statResult.st_size = 32000
  1268. statMock.return_value = statResult
  1269. rcode = ambari_server.download_jdk(args)
  1270. self.assertEqual(0, rcode)
  1271. # Test case: JDK file does not exist, jdk-location argument passed
  1272. p.__getitem__.return_value = "somewhere"
  1273. p.__getitem__.side_effect = None
  1274. args.jdk_location = "/existing/jdk/file"
  1275. path_existsMock.side_effect = [False, False, True, False, False, False]
  1276. ambari_server.download_jdk(args)
  1277. self.assertTrue(copyfile_mock.called)
  1278. copyfile_mock.reset_mock()
  1279. # Negative test case: JDK file does not exist, jdk-location argument
  1280. # (non-accessible file) passed
  1281. p.__getitem__.return_value = "somewhere"
  1282. p.__getitem__.side_effect = None
  1283. args.jdk_location = "/existing/jdk/file"
  1284. path_existsMock.side_effect = [False, False, True, False, False, False]
  1285. def copyfile_side_effect(s, d):
  1286. raise Exception("TerribleException")
  1287. copyfile_mock.side_effect = copyfile_side_effect
  1288. try:
  1289. ambari_server.download_jdk(args)
  1290. self.fail("Should throw exception")
  1291. except FatalException:
  1292. # Expected
  1293. self.assertTrue(copyfile_mock.called)
  1294. copyfile_mock.reset_mock()
  1295. # Test case: jdk is already installed, ensure that JCE check is not skipped
  1296. p = MagicMock()
  1297. get_ambari_properties_mock.return_value = p
  1298. p.__getitem__.return_value = "somewhere"
  1299. get_JAVA_HOME_mock.return_value = True
  1300. path_existsMock.return_value = True
  1301. install_jce_manualy_mock.return_value = 1
  1302. with patch.object(ambari_server, "download_jce_policy") as download_jce_policy_mock:
  1303. rcode = ambari_server.download_jdk(args)
  1304. self.assertTrue(download_jce_policy_mock.called)
  1305. @patch.object(ambari_server, "run_os_command")
  1306. def test_get_postgre_status(self, run_os_command_mock):
  1307. run_os_command_mock.return_value = (1, "running", None)
  1308. result = ambari_server.get_postgre_status()
  1309. self.assertEqual("running", result)
  1310. run_os_command_mock.return_value = (1, "wrong", None)
  1311. result = ambari_server.get_postgre_status()
  1312. self.assertEqual(None, result)
  1313. @patch("time.sleep")
  1314. @patch("subprocess.Popen")
  1315. @patch.object(ambari_server, "run_os_command")
  1316. @patch.object(ambari_server, "get_postgre_status")
  1317. def test_check_postgre_up(self, get_postgre_status_mock, run_os_command_mock,
  1318. popen_mock, sleep_mock):
  1319. p = MagicMock()
  1320. p.poll.return_value = 0
  1321. popen_mock.return_value = p
  1322. run_os_command_mock.return_value = (0, None, None)
  1323. rcode = ambari_server.check_postgre_up()
  1324. self.assertEqual(0, rcode)
  1325. p.poll.return_value = 4
  1326. get_postgre_status_mock.return_value = None
  1327. rcode = ambari_server.check_postgre_up()
  1328. self.assertEqual(4, rcode)
  1329. @patch("platform.linux_distribution")
  1330. @patch("platform.system")
  1331. @patch.object(ambari_server, "print_info_msg")
  1332. @patch.object(ambari_server, "print_error_msg")
  1333. @patch.object(ambari_server, "get_ambari_properties")
  1334. @patch.object(ambari_server, "write_property")
  1335. @patch.object(ambari_server, "get_conf_dir")
  1336. def test_configure_os_settings(self, get_conf_dir_mock, write_property_mock, get_ambari_properties_mock,
  1337. print_error_msg_mock, print_info_msg_mock,
  1338. systemMock, distMock):
  1339. get_ambari_properties_mock.return_value = -1
  1340. rcode = ambari_server.configure_os_settings()
  1341. self.assertEqual(-1, rcode)
  1342. p = MagicMock()
  1343. p[ambari_server.OS_TYPE_PROPERTY] = 'somevalue'
  1344. get_ambari_properties_mock.return_value = p
  1345. rcode = ambari_server.configure_os_settings()
  1346. self.assertEqual(0, rcode)
  1347. p.__getitem__.return_value = ""
  1348. systemMock.return_value = "NonLinux"
  1349. rcode = ambari_server.configure_os_settings()
  1350. self.assertEqual(-1, rcode)
  1351. systemMock.return_value = "Linux"
  1352. distMock.return_value = ("CentOS", "6.3", None)
  1353. rcode = ambari_server.configure_os_settings()
  1354. self.assertEqual(0, rcode)
  1355. self.assertTrue(write_property_mock.called)
  1356. @patch("__builtin__.open")
  1357. @patch.object(ambari_server, "Properties")
  1358. @patch.object(ambari_server, "search_file")
  1359. @patch.object(ambari_server, "get_conf_dir")
  1360. def test_get_JAVA_HOME(self, get_conf_dir_mock, search_file_mock,
  1361. Properties_mock, openMock):
  1362. openMock.side_effect = Exception("exception")
  1363. result = ambari_server.get_JAVA_HOME()
  1364. self.assertEqual(None, result)
  1365. expected = os.path.dirname(__file__)
  1366. p = MagicMock()
  1367. p.__getitem__.return_value = expected
  1368. openMock.side_effect = None
  1369. Properties_mock.return_value = p
  1370. result = ambari_server.get_JAVA_HOME()
  1371. self.assertEqual(expected, result)
  1372. def test_prompt_db_properties_default(self):
  1373. args = MagicMock()
  1374. ambari_server.load_default_db_properties(args)
  1375. ambari_server.prompt_db_properties(args)
  1376. self.assertEqual(args.database, "postgres")
  1377. self.assertEqual(args.database_host, "localhost")
  1378. self.assertEqual(args.database_name, "ambari")
  1379. self.assertEqual(args.database_port, "5432")
  1380. @patch.object(ambari_server, "setup_master_key")
  1381. @patch.object(ambari_server, "read_password")
  1382. @patch.object(ambari_server, "get_validated_string_input")
  1383. @patch.object(ambari_server, "get_YN_input")
  1384. def test_prompt_db_properties_oracle_sname(self, gyni_mock, gvsi_mock, rp_mock, smk_mock):
  1385. ambari_server.PROMPT_DATABASE_OPTIONS = True
  1386. gyni_mock.return_value = True
  1387. list_of_return_values= ["ambari-server", "ambari", "1", "1521", "localhost", "2"]
  1388. def side_effect(*args, **kwargs):
  1389. return list_of_return_values.pop()
  1390. gvsi_mock.side_effect = side_effect
  1391. rp_mock.return_value = "password"
  1392. smk_mock.return_value = (None, False, True)
  1393. args = MagicMock()
  1394. ambari_server.load_default_db_properties(args)
  1395. ambari_server.prompt_db_properties(args)
  1396. self.assertEqual(args.database, "oracle")
  1397. self.assertEqual(args.database_port, "1521")
  1398. self.assertEqual(args.database_host, "localhost")
  1399. self.assertEqual(args.database_name, "ambari")
  1400. self.assertEqual(args.database_username, "ambari-server")
  1401. self.assertEqual(args.sid_or_sname, "sname")
  1402. @patch.object(ambari_server, "setup_master_key")
  1403. @patch.object(ambari_server, "read_password")
  1404. @patch.object(ambari_server, "get_validated_string_input")
  1405. @patch.object(ambari_server, "get_YN_input")
  1406. def test_prompt_db_properties_oracle_sid(self, gyni_mock, gvsi_mock, rp_mock, smk_mock):
  1407. ambari_server.PROMPT_DATABASE_OPTIONS = True
  1408. gyni_mock.return_value = True
  1409. list_of_return_values= ["ambari-server", "ambari", "2", "1521", "localhost", "2"]
  1410. def side_effect(*args, **kwargs):
  1411. return list_of_return_values.pop()
  1412. gvsi_mock.side_effect = side_effect
  1413. rp_mock.return_value = "password"
  1414. smk_mock.return_value = (None, False, True)
  1415. args = MagicMock()
  1416. ambari_server.load_default_db_properties(args)
  1417. ambari_server.prompt_db_properties(args)
  1418. self.assertEqual(args.database, "oracle")
  1419. self.assertEqual(args.database_port, "1521")
  1420. self.assertEqual(args.database_host, "localhost")
  1421. self.assertEqual(args.database_name, "ambari")
  1422. self.assertEqual(args.database_username, "ambari-server")
  1423. self.assertEqual(args.sid_or_sname, "sid")
  1424. @patch.object(ambari_server, "setup_master_key")
  1425. @patch.object(ambari_server, "read_password")
  1426. @patch.object(ambari_server, "get_validated_string_input")
  1427. @patch.object(ambari_server, "get_YN_input")
  1428. def test_prompt_db_properties_postgre_adv(self, gyni_mock, gvsi_mock, rp_mock, smk_mock):
  1429. ambari_server.PROMPT_DATABASE_OPTIONS = True
  1430. gyni_mock.return_value = True
  1431. list_of_return_values= ["ambari-server", "ambari", "1"]
  1432. def side_effect(*args, **kwargs):
  1433. return list_of_return_values.pop()
  1434. gvsi_mock.side_effect = side_effect
  1435. rp_mock.return_value = "password"
  1436. smk_mock.return_value = (None, False, True)
  1437. args = MagicMock()
  1438. ambari_server.load_default_db_properties(args)
  1439. ambari_server.prompt_db_properties(args)
  1440. self.assertEqual(args.database, "postgres")
  1441. self.assertEqual(args.database_port, "5432")
  1442. self.assertEqual(args.database_host, "localhost")
  1443. self.assertEqual(args.database_name, "ambari")
  1444. self.assertEqual(args.database_username, "ambari-server")
  1445. self.assertEqual(args.sid_or_sname, "sname")
  1446. @patch("glob.glob")
  1447. @patch.object(ambari_server, "get_JAVA_HOME")
  1448. def test_find_jdk(self, get_JAVA_HOME_mock, globMock):
  1449. get_JAVA_HOME_mock.return_value = "somewhere"
  1450. result = ambari_server.find_jdk()
  1451. self.assertEqual("somewhere", result)
  1452. get_JAVA_HOME_mock.return_value = None
  1453. globMock.return_value = []
  1454. result = ambari_server.find_jdk()
  1455. self.assertEqual(None, result)
  1456. globMock.return_value = ["one", "two"]
  1457. result = ambari_server.find_jdk()
  1458. self.assertNotEqual(None, result)
  1459. @patch("os.path.exists")
  1460. @patch.object(ambari_server, 'verify_setup_allowed')
  1461. @patch.object(ambari_server, "get_YN_input")
  1462. @patch.object(ambari_server, "configure_os_settings")
  1463. @patch.object(ambari_server, "download_jdk")
  1464. @patch.object(ambari_server, "configure_postgres")
  1465. @patch.object(ambari_server, "setup_db")
  1466. @patch.object(ambari_server, "check_postgre_up")
  1467. @patch.object(ambari_server, "check_iptables")
  1468. @patch.object(ambari_server, "check_ambari_user")
  1469. @patch.object(ambari_server, "check_jdbc_drivers")
  1470. @patch.object(ambari_server, "check_selinux")
  1471. @patch.object(ambari_server, "setup_remote_db")
  1472. @patch.object(ambari_server, "store_remote_properties")
  1473. @patch.object(ambari_server, "is_local_database")
  1474. @patch.object(ambari_server, "store_local_properties")
  1475. @patch.object(ambari_server, "is_root")
  1476. def test_setup(self, is_root_mock, store_local_properties_mock, is_local_database_mock, store_remote_properties_mock,
  1477. setup_remote_db_mock, check_selinux_mock, check_jdbc_drivers_mock, check_ambari_user_mock,
  1478. check_iptables_mock, check_postgre_up_mock, setup_db_mock, configure_postgres_mock,
  1479. download_jdk_mock, configure_os_settings_mock,get_YN_input,
  1480. verify_setup_allowed_method, exists_mock):
  1481. args = MagicMock()
  1482. failed = False
  1483. get_YN_input.return_value = False
  1484. verify_setup_allowed_method.return_value = 0
  1485. exists_mock.return_value = False
  1486. def reset_mocks():
  1487. is_root_mock.reset_mock()
  1488. store_local_properties_mock.reset_mock()
  1489. store_remote_properties_mock.reset_mock()
  1490. is_local_database_mock.reset_mock()
  1491. setup_remote_db_mock.reset_mock()
  1492. check_selinux_mock.reset_mock()
  1493. check_jdbc_drivers_mock.reset_mock()
  1494. check_ambari_user_mock.reset_mock()
  1495. check_iptables_mock.reset_mock()
  1496. check_postgre_up_mock.reset_mock()
  1497. setup_db_mock.reset_mock()
  1498. configure_postgres_mock.reset_mock()
  1499. download_jdk_mock.reset_mock()
  1500. configure_os_settings_mock.reset_mock()
  1501. pass
  1502. # Testing call under non-root
  1503. is_root_mock.return_value = False
  1504. try:
  1505. ambari_server.setup(args)
  1506. self.fail("Should throw exception")
  1507. except FatalException as fe:
  1508. # Expected
  1509. self.assertTrue("root-level" in fe.reason)
  1510. pass
  1511. # Testing calls under root
  1512. # remote case
  1513. is_root_mock.return_value = True
  1514. check_selinux_mock.return_value = 0
  1515. check_ambari_user_mock.return_value = 0
  1516. check_jdbc_drivers_mock.return_value = 0
  1517. check_iptables_mock.return_value = (0, "other")
  1518. check_postgre_up_mock.return_value = 0
  1519. setup_db_mock.return_value = 0
  1520. setup_remote_db_mock.return_value = 0
  1521. is_local_database_mock.return_value = False
  1522. configure_postgres_mock.return_value = 0
  1523. download_jdk_mock.return_value = 0
  1524. configure_os_settings_mock.return_value = 0
  1525. store_remote_properties_mock.return_value = 0
  1526. store_local_properties_mock.return_value = 0
  1527. result = ambari_server.setup(args)
  1528. self.assertEqual(None, result)
  1529. self.assertTrue(check_ambari_user_mock.called)
  1530. self.assertEquals(True, store_remote_properties_mock.called)
  1531. self.assertEquals(False, store_local_properties_mock.called)
  1532. #Local case
  1533. reset_mocks()
  1534. is_local_database_mock.return_value = True
  1535. try:
  1536. result = ambari_server.setup(args)
  1537. except FatalException:
  1538. self.fail("Setup should be successful")
  1539. self.assertEqual(None, result)
  1540. self.assertEquals(True, store_local_properties_mock.called)
  1541. self.assertEquals(False, store_remote_properties_mock.called)
  1542. #negative case
  1543. reset_mocks()
  1544. is_local_database_mock.return_value = False
  1545. setup_remote_db_mock.return_value = -1
  1546. try:
  1547. result = ambari_server.setup(args)
  1548. self.fail("Should throw exception")
  1549. except NonFatalException as fe:
  1550. self.assertTrue("cli was not found" in fe.reason)
  1551. @patch.object(ambari_server, "get_YN_input")
  1552. @patch.object(ambari_server, "setup_db")
  1553. @patch.object(ambari_server, "print_info_msg")
  1554. @patch.object(ambari_server, "run_os_command")
  1555. @patch.object(ambari_server, "configure_database_username_password")
  1556. @patch.object(ambari_server, "parse_properties_file")
  1557. @patch.object(ambari_server, "execute_remote_script")
  1558. @patch.object(ambari_server, "is_root")
  1559. def test_reset(self, is_root_mock, execute_remote_script_mock, parse_properties_file_mock, configure_database_username_password_mock,
  1560. run_os_command_mock, print_info_msg_mock,
  1561. setup_db_mock, get_YN_inputMock):
  1562. parse_properties_file_mock.return_value = 0
  1563. args = MagicMock()
  1564. args.persistence_type = "local"
  1565. get_YN_inputMock.return_value = False
  1566. # Testing call under non-root
  1567. is_root_mock.return_value = False
  1568. try:
  1569. ambari_server.reset(args)
  1570. self.fail("Should throw exception")
  1571. except FatalException as fe:
  1572. # Expected
  1573. self.assertTrue("root-level" in fe.reason)
  1574. pass
  1575. # Testing calls under root
  1576. is_root_mock.return_value = True
  1577. try:
  1578. ambari_server.reset(args)
  1579. self.fail("Should throw exception")
  1580. except FatalException as fe:
  1581. # Expected
  1582. self.assertFalse("root-level" in fe.reason)
  1583. pass
  1584. get_YN_inputMock.return_value = True
  1585. run_os_command_mock.return_value = (1, None, None)
  1586. try:
  1587. ambari_server.reset(args)
  1588. self.fail("Should throw exception")
  1589. except FatalException:
  1590. # Expected
  1591. pass
  1592. run_os_command_mock.return_value = (0, None, None)
  1593. ambari_server.reset(args)
  1594. self.assertTrue(setup_db_mock.called)
  1595. #remote db case
  1596. args.persistence_type = "remote"
  1597. execute_remote_script_mock.return_value=(0, None, None)
  1598. rcode = ambari_server.reset(args)
  1599. self.assertEqual(None, rcode)
  1600. self.assertTrue(execute_remote_script_mock.called)
  1601. @patch.object(ambari_server, "setup_db")
  1602. @patch.object(ambari_server, "print_info_msg")
  1603. @patch.object(ambari_server, "run_os_command")
  1604. @patch.object(ambari_server, "parse_properties_file")
  1605. @patch.object(ambari_server, "is_root")
  1606. def test_silent_reset(self, is_root_mock, parse_properties_file_mock,
  1607. run_os_command_mock, print_info_msg_mock,
  1608. setup_db_mock):
  1609. is_root_mock.return_value = True
  1610. args = MagicMock()
  1611. ambari_server.SILENT = True
  1612. self.assertTrue(ambari_server.SILENT)
  1613. run_os_command_mock.return_value = (0, None, None)
  1614. def signal_handler(signum, frame):
  1615. self.fail("Timed out!")
  1616. signal.signal(signal.SIGALRM, signal_handler)
  1617. signal.alarm(5)
  1618. rcode = ambari_server.reset(args)
  1619. signal.alarm(0)
  1620. self.assertEqual(None, rcode)
  1621. self.assertTrue(setup_db_mock.called)
  1622. @patch("os.chown")
  1623. @patch("pwd.getpwnam")
  1624. @patch.object(ambari_server, 'get_master_key_location')
  1625. @patch.object(ambari_server, 'save_master_key')
  1626. @patch('os.chmod', autospec=True)
  1627. @patch.object(ambari_server, 'get_validated_string_input')
  1628. @patch("os.environ")
  1629. @patch.object(ambari_server, "get_ambari_properties")
  1630. @patch("os.kill")
  1631. @patch("os.path.exists")
  1632. @patch("__builtin__.open")
  1633. @patch("subprocess.Popen")
  1634. @patch.object(ambari_server, "print_info_msg")
  1635. @patch.object(ambari_server, "search_file")
  1636. @patch.object(ambari_server, "find_jdk")
  1637. @patch.object(ambari_server, "print_error_msg")
  1638. @patch.object(ambari_server, "check_postgre_up")
  1639. @patch.object(ambari_server, "check_iptables")
  1640. @patch.object(ambari_server, "parse_properties_file")
  1641. @patch.object(ambari_server, "read_ambari_user")
  1642. @patch.object(ambari_server, "is_root")
  1643. @patch("getpass.getuser")
  1644. @patch("os.chdir")
  1645. def test_start(self, chdir_mock, getuser_mock, is_root_mock, read_ambari_user_mock,
  1646. parse_properties_file_mock, check_iptables_mock, check_postgre_up_mock,
  1647. print_error_msg_mock, find_jdk_mock, search_file_mock,
  1648. print_info_msg_mock, popenMock, openMock, pexistsMock,
  1649. killMock, get_ambari_properties_mock, os_environ_mock,
  1650. get_validated_string_input_method, os_chmod_method,
  1651. save_master_key_method, get_master_key_location_method,
  1652. getpwnam_mock, os_chown_mock):
  1653. args = MagicMock()
  1654. f = MagicMock()
  1655. f.readline.return_value = 42
  1656. openMock.return_value = f
  1657. p = get_ambari_properties_mock.return_value
  1658. p.get_property.return_value = 'False'
  1659. search_file_mock.return_value = None
  1660. pw = MagicMock()
  1661. pw.setattr('pw_uid', 0)
  1662. pw.setattr('pw_gid', 0)
  1663. getpwnam_mock.return_value = pw
  1664. os_chown_mock.return_value = None
  1665. # Checking "server is running"
  1666. pexistsMock.return_value = True
  1667. try:
  1668. ambari_server.start(args)
  1669. self.fail("Should fail with 'Server is running'")
  1670. except FatalException:
  1671. # Expected
  1672. pass
  1673. self.assertTrue(killMock.called)
  1674. killMock.reset_mock()
  1675. parse_properties_file_mock.reset_mock()
  1676. pexistsMock.return_value = False
  1677. # Checking situation when ambari user is not set up
  1678. read_ambari_user_mock.return_value = None
  1679. try:
  1680. ambari_server.start(args)
  1681. self.fail("Should fail with 'Can not detect a system user for Ambari'")
  1682. except FatalException as e:
  1683. # Expected
  1684. self.assertTrue('Unable to detect a system user for Ambari Server.' in e.reason)
  1685. parse_properties_file_mock.reset_mock()
  1686. # Checking start from non-root when current user is not the same as a
  1687. # custom user
  1688. read_ambari_user_mock.return_value = "dummy-user"
  1689. getuser_mock.return_value = "non_custom_user"
  1690. is_root_mock.return_value = False
  1691. try:
  1692. ambari_server.start(args)
  1693. self.fail("Should fail with 'Can not start ambari-server as user...'")
  1694. except FatalException as e:
  1695. # Expected
  1696. self.assertTrue('Unable to start Ambari Server as user' in e.reason)
  1697. self.assertFalse(parse_properties_file_mock.called)
  1698. parse_properties_file_mock.reset_mock()
  1699. # Checking "jdk not found"
  1700. is_root_mock.return_value = True
  1701. find_jdk_mock.return_value = None
  1702. try:
  1703. ambari_server.start(args)
  1704. self.fail("Should fail with 'No JDK found'")
  1705. except FatalException as e:
  1706. # Expected
  1707. self.assertTrue('No JDK found' in e.reason)
  1708. find_jdk_mock.return_value = "somewhere"
  1709. parse_properties_file_mock.reset_mock()
  1710. ## Testing workflow under root
  1711. is_root_mock.return_value = True
  1712. # Remote DB
  1713. args.persistence_type="remote"
  1714. check_iptables_mock.return_value = (0, None)
  1715. try:
  1716. ambari_server.start(args)
  1717. except FatalException as e:
  1718. # Ignored
  1719. pass
  1720. self.assertFalse('Unable to start PostgreSQL server' in e.reason)
  1721. self.assertFalse(check_postgre_up_mock.called)
  1722. check_postgre_up_mock.reset_mock()
  1723. parse_properties_file_mock.reset_mock()
  1724. # Local DB
  1725. args.persistence_type="local"
  1726. # case: postgres failed to start
  1727. check_postgre_up_mock.return_value = 1
  1728. try:
  1729. ambari_server.start(args)
  1730. self.fail("Should fail with 'Unable to start PostgreSQL server'")
  1731. except FatalException as e:
  1732. # Expected
  1733. self.assertTrue('Unable to start PostgreSQL server' in e.reason)
  1734. self.assertTrue(check_postgre_up_mock.called)
  1735. parse_properties_file_mock.reset_mock()
  1736. # case: iptables failed to stop
  1737. check_postgre_up_mock.return_value = 0
  1738. check_iptables_mock.return_value = (1, ambari_server.IP_TBLS_ENABLED)
  1739. try:
  1740. ambari_server.start(args)
  1741. self.fail("Should fail with 'Failed to stop iptables'")
  1742. except FatalException as e:
  1743. # Expected
  1744. self.assertTrue('Failed to stop iptables' in e.reason)
  1745. parse_properties_file_mock.reset_mock()
  1746. check_iptables_mock.return_value = (0, None)
  1747. # Case: custom user is "root"
  1748. read_ambari_user_mock.return_value = "root"
  1749. ambari_server.start(args)
  1750. self.assertTrue(popenMock.called)
  1751. popen_arg = popenMock.call_args[0][0]
  1752. self.assertTrue(popen_arg[0] == "/bin/sh")
  1753. popenMock.reset_mock()
  1754. parse_properties_file_mock.reset_mock()
  1755. # Case: custom user is not "root"
  1756. read_ambari_user_mock.return_value = "not-root-user"
  1757. ambari_server.start(args)
  1758. self.assertTrue(chdir_mock.called)
  1759. self.assertTrue(popenMock.called)
  1760. popen_arg = popenMock.call_args[0][0]
  1761. self.assertTrue(popen_arg[0] == "/bin/su")
  1762. check_postgre_up_mock.reset_mock()
  1763. popenMock.reset_mock()
  1764. parse_properties_file_mock.reset_mock()
  1765. ## Testing workflow under non-root
  1766. is_root_mock.return_value = False
  1767. read_ambari_user_mock.return_value = "not-root-user"
  1768. getuser_mock.return_value = read_ambari_user_mock.return_value
  1769. parse_properties_file_mock.reset_mock()
  1770. # Local DB
  1771. args.persistence_type="local"
  1772. ambari_server.start(args)
  1773. self.assertFalse(check_postgre_up_mock.called)
  1774. parse_properties_file_mock.reset_mock()
  1775. # Remote DB
  1776. args.persistence_type="remote"
  1777. ambari_server.start(args)
  1778. self.assertFalse(check_postgre_up_mock.called)
  1779. parse_properties_file_mock.reset_mock()
  1780. # Checking call
  1781. check_iptables_mock.reset_mock()
  1782. check_iptables_mock.return_value = (0, None)
  1783. ambari_server.start(args)
  1784. self.assertTrue(popenMock.called)
  1785. popen_arg = popenMock.call_args[0][0]
  1786. self.assertTrue(popen_arg[0] == "/bin/sh")
  1787. self.assertFalse(check_iptables_mock.called)
  1788. parse_properties_file_mock.reset_mock()
  1789. # Test start under wrong user
  1790. read_ambari_user_mock.return_value = "not-root-user"
  1791. getuser_mock.return_value = "non_custom_user"
  1792. try:
  1793. ambari_server.start(args)
  1794. self.fail("Can not start ambari-server as user non_custom_user.")
  1795. except FatalException as e:
  1796. # Expected
  1797. self.assertTrue('Unable to start Ambari Server as user' in e.reason)
  1798. parse_properties_file_mock.reset_mock()
  1799. # Check environ master key is set
  1800. popenMock.reset_mock()
  1801. os_environ_mock.copy.return_value = {"a" : "b",
  1802. ambari_server.SECURITY_KEY_ENV_VAR_NAME : "masterkey"}
  1803. args.persistence_type="local"
  1804. read_ambari_user_mock.return_value = "root"
  1805. is_root_mock.return_value = True
  1806. ambari_server.start(args)
  1807. self.assertFalse(get_validated_string_input_method.called)
  1808. self.assertFalse(save_master_key_method.called)
  1809. popen_arg = popenMock.call_args[1]['env']
  1810. self.assertEquals(os_environ_mock.copy.return_value, popen_arg)
  1811. parse_properties_file_mock.reset_mock()
  1812. # Check environ master key is not set
  1813. popenMock.reset_mock()
  1814. os_environ_mock.reset_mock()
  1815. p.get_property.return_value = 'True'
  1816. os_environ_mock.copy.return_value = {"a" : "b"}
  1817. args.persistence_type="local"
  1818. read_ambari_user_mock.return_value = "root"
  1819. is_root_mock.return_value = True
  1820. get_validated_string_input_method.return_value = "masterkey"
  1821. os_chmod_method.return_value = None
  1822. ambari_server.start(args)
  1823. self.assertTrue(get_validated_string_input_method.called)
  1824. self.assertTrue(save_master_key_method.called)
  1825. popen_arg = popenMock.call_args[1]['env']
  1826. self.assertEquals(os_environ_mock.copy.return_value, popen_arg)
  1827. @patch("__builtin__.open")
  1828. @patch("os.path.exists")
  1829. @patch("os.remove")
  1830. @patch("os.killpg")
  1831. @patch("os.getpgid")
  1832. @patch.object(ambari_server, "print_info_msg")
  1833. def test_stop(self, print_info_msg_mock, gpidMock, removeMock,
  1834. killMock, pexistsMock, openMock):
  1835. pexistsMock.return_value = True
  1836. f = MagicMock()
  1837. f.readline.return_value = "42"
  1838. openMock.return_value = f
  1839. ambari_server.stop(None)
  1840. self.assertTrue(f.readline.called)
  1841. self.assertTrue(killMock.called)
  1842. self.assertTrue(killMock.called)
  1843. self.assertTrue(f.close.called)
  1844. self.assertTrue(removeMock.called)
  1845. @patch.object(ambari_server, "configure_database_username_password")
  1846. @patch.object(ambari_server, "run_os_command")
  1847. @patch.object(ambari_server, "is_root")
  1848. def test_upgrade_stack(self, is_root_mock, run_os_command_mock,
  1849. configure_postgres_username_password_mock):
  1850. args = MagicMock()
  1851. # Testing call under non-root
  1852. is_root_mock.return_value = False
  1853. try:
  1854. ambari_server.upgrade_stack(args, 'HDP-2.0')
  1855. self.fail("Should throw exception")
  1856. except FatalException as fe:
  1857. # Expected
  1858. self.assertTrue("root-level" in fe.reason)
  1859. pass
  1860. # Testing calls under root
  1861. is_root_mock.return_value = True
  1862. run_os_command_mock.return_value = (0, '', '')
  1863. ambari_server.upgrade_stack(args, 'HDP-2.0')
  1864. self.assertTrue(configure_postgres_username_password_mock.called)
  1865. self.assertTrue(run_os_command_mock.called)
  1866. @patch.object(ambari_server, "adjust_directory_permissions")
  1867. @patch.object(ambari_server, "print_warning_msg")
  1868. @patch.object(ambari_server, "read_ambari_user")
  1869. @patch.object(ambari_server, "check_db_consistency")
  1870. @patch.object(ambari_server, "execute_db_script")
  1871. @patch.object(ambari_server, "check_postgre_up")
  1872. @patch.object(ambari_server, "update_ambari_properties")
  1873. @patch.object(ambari_server, "parse_properties_file")
  1874. @patch.object(ambari_server, "is_root")
  1875. def test_upgrade(self, is_root_mock, parse_properties_file_mock, update_ambari_properties_mock,
  1876. check_postgre_up_mock, execute_db_script_mock,
  1877. check_db_consistency_mock, read_ambari_user_mock,
  1878. print_warning_msg_mock, adjust_directory_permissions_mock):
  1879. args = MagicMock()
  1880. args.upgrade_script_file = "/var/lib/"\
  1881. "ambari-server/resources/upgrade/ddl/"\
  1882. "Ambari-DDL-Postgres-UPGRADE-1.3.0.sql"
  1883. update_ambari_properties_mock.return_value = 0
  1884. check_postgre_up_mock.return_value = 0
  1885. execute_db_script_mock.return_value = 0
  1886. check_db_consistency_mock.return_value = 0
  1887. # Testing call under non-root
  1888. is_root_mock.return_value = False
  1889. try:
  1890. ambari_server.upgrade(args)
  1891. self.fail("Should throw exception")
  1892. except FatalException as fe:
  1893. # Expected
  1894. self.assertTrue("root-level" in fe.reason)
  1895. pass
  1896. # Testing calls under root
  1897. is_root_mock.return_value = True
  1898. # Testing with undefined custom user
  1899. read_ambari_user_mock.return_value = None
  1900. ambari_server.upgrade(args)
  1901. self.assertTrue(print_warning_msg_mock.called)
  1902. warning_args = print_warning_msg_mock.call_args[0][0]
  1903. self.assertTrue("custom ambari user" in warning_args)
  1904. # Testing with defined custom user
  1905. read_ambari_user_mock.return_value = "ambari-custom-user"
  1906. ambari_server.upgrade(args)
  1907. self.assertTrue(adjust_directory_permissions_mock.called)
  1908. def test_print_info_msg(self):
  1909. out = StringIO.StringIO()
  1910. sys.stdout = out
  1911. ambari_server.VERBOSE = True
  1912. ambari_server.print_info_msg("msg")
  1913. self.assertNotEqual("", out.getvalue())
  1914. sys.stdout = sys.__stdout__
  1915. def test_print_error_msg(self):
  1916. out = StringIO.StringIO()
  1917. sys.stdout = out
  1918. ambari_server.VERBOSE = True
  1919. ambari_server.print_error_msg("msg")
  1920. self.assertNotEqual("", out.getvalue())
  1921. sys.stdout = sys.__stdout__
  1922. def test_print_warning_msg(self):
  1923. out = StringIO.StringIO()
  1924. sys.stdout = out
  1925. ambari_server.VERBOSE = True
  1926. ambari_server.print_warning_msg("msg")
  1927. self.assertNotEqual("", out.getvalue())
  1928. sys.stdout = sys.__stdout__
  1929. @patch.object(ambari_server, "get_choice_string_input")
  1930. def test_get_YN_input(self, get_choice_string_input_mock):
  1931. ambari_server.get_YN_input("prompt", "default")
  1932. self.assertTrue(get_choice_string_input_mock.called)
  1933. self.assertEqual(4, len(get_choice_string_input_mock.call_args_list[0][0]))
  1934. def test_load_default_db_properties(self):
  1935. args = MagicMock()
  1936. ambari_server.load_default_db_properties(args)
  1937. self.assertEquals(args.database, "postgres")
  1938. self.assertEquals(args.database_host, "localhost")
  1939. self.assertEquals(args.database_port, "5432")
  1940. self.assertEquals(args.database_name, "ambari")
  1941. self.assertEquals(args.database_username, "ambari")
  1942. self.assertEquals(args.database_password, "bigdata")
  1943. args = MagicMock()
  1944. ambari_server.DATABASE_INDEX=1
  1945. ambari_server.load_default_db_properties(args)
  1946. self.assertEquals(args.database, "oracle")
  1947. self.assertEquals(args.database_port, "1521")
  1948. failed = False
  1949. args = MagicMock()
  1950. ambari_server.DATABASE_INDEX=2
  1951. try:
  1952. ambari_server.load_default_db_properties(args)
  1953. except:
  1954. failed = True
  1955. self.assertTrue(failed)
  1956. pass
  1957. @patch.object(ambari_server, 'setup')
  1958. def test_main_db_options(self, setup_mock):
  1959. base_args = ["ambari-server.py", "setup"]
  1960. db_args = ["--database", "postgres", "--databasehost", "somehost.net", "--databaseport", "12345",
  1961. "--databasename", "ambari", "--databaseusername", "ambari", "--databasepassword", "bigdata"]
  1962. #test no args
  1963. failed = False
  1964. sys.argv = list(base_args)
  1965. try:
  1966. ambari_server.main()
  1967. except SystemExit:
  1968. failed = True
  1969. pass
  1970. self.assertFalse(failed)
  1971. self.assertTrue(setup_mock.called)
  1972. setup_mock.reset_mock()
  1973. #test full args
  1974. sys.argv = list(base_args)
  1975. sys.argv.extend(db_args)
  1976. try:
  1977. ambari_server.main()
  1978. except SystemExit:
  1979. failed = True
  1980. pass
  1981. self.assertTrue(ambari_server.PROMPT_DATABASE_OPTIONS)
  1982. self.assertFalse(failed)
  1983. self.assertTrue(setup_mock.called)
  1984. setup_mock.reset_mock()
  1985. #test not full args
  1986. sys.argv = list(base_args)
  1987. sys.argv.extend(["--database", "postgres"])
  1988. try:
  1989. ambari_server.main()
  1990. except SystemExit:
  1991. failed = True
  1992. pass
  1993. self.assertFalse(setup_mock.called)
  1994. self.assertTrue(failed)
  1995. setup_mock.reset_mock()
  1996. #test wrong database
  1997. failed = False
  1998. sys.argv = list(base_args)
  1999. sys.argv.extend(["--database", "unknown"])
  2000. sys.argv.extend(db_args[2:])
  2001. try:
  2002. ambari_server.main()
  2003. except SystemExit:
  2004. failed = True
  2005. pass
  2006. self.assertTrue(failed)
  2007. self.assertFalse(setup_mock.called)
  2008. setup_mock.reset_mock()
  2009. #test wrong port check
  2010. failed = False
  2011. sys.argv = list(base_args)
  2012. sys.argv.extend(["--databaseport", "unknown"])
  2013. sys.argv.extend(db_args[:4])
  2014. sys.argv.extend(db_args[6:])
  2015. try:
  2016. ambari_server.main()
  2017. except SystemExit:
  2018. failed = True
  2019. pass
  2020. self.assertTrue(failed)
  2021. self.assertFalse(setup_mock.called)
  2022. setup_mock.reset_mock()
  2023. pass
  2024. @patch.object(ambari_server, "load_default_db_properties")
  2025. @patch.object(ambari_server, "get_YN_input")
  2026. @patch.object(ambari_server, "get_validated_string_input")
  2027. @patch.object(ambari_server, "setup_master_key")
  2028. @patch.object(ambari_server, "configure_database_password")
  2029. def test_prompt_db_properties(self, configure_database_password_mock, setup_master_key_mock,
  2030. get_validated_string_input_mock, get_YN_input_mock, load_default_db_properties_mock):
  2031. args = MagicMock()
  2032. #test not prompt
  2033. ambari_server.PROMPT_DATABASE_OPTIONS = False
  2034. ambari_server.prompt_db_properties(args)
  2035. self.assertFalse(load_default_db_properties_mock.called)
  2036. self.assertFalse(get_validated_string_input_mock.called)
  2037. self.assertFalse(get_YN_input_mock.called)
  2038. load_default_db_properties_mock.reset_mock()
  2039. get_validated_string_input_mock.reset_mock()
  2040. get_YN_input_mock.reset_mock()
  2041. #test prompt
  2042. get_YN_input_mock.return_value = False
  2043. ambari_server.PROMPT_DATABASE_OPTIONS = True
  2044. ambari_server.prompt_db_properties(args)
  2045. self.assertTrue(get_YN_input_mock.called)
  2046. self.assertFalse(get_validated_string_input_mock.called)
  2047. self.assertTrue(load_default_db_properties_mock.called)
  2048. load_default_db_properties_mock.reset_mock()
  2049. get_validated_string_input_mock.reset_mock()
  2050. get_YN_input_mock.reset_mock()
  2051. #test prompt advanced
  2052. get_YN_input_mock.return_value = True
  2053. ambari_server.PROMPT_DATABASE_OPTIONS = True
  2054. setup_master_key_mock.return_value = (None, False, True)
  2055. configure_database_password_mock.return_value = ("test", None)
  2056. ambari_server.prompt_db_properties(args)
  2057. self.assertTrue(get_YN_input_mock.called)
  2058. self.assertTrue(get_validated_string_input_mock.called)
  2059. self.assertTrue(load_default_db_properties_mock.called)
  2060. self.assertEquals(args.database, "postgres")
  2061. load_default_db_properties_mock.reset_mock()
  2062. get_validated_string_input_mock.reset_mock()
  2063. get_YN_input_mock.reset_mock()
  2064. pass
  2065. @patch.object(ambari_server, "get_db_cli_tool")
  2066. @patch.object(ambari_server, "run_in_shell")
  2067. def test_execute_remote_script(self, run_in_shell_mock, get_db_cli_tool_mock):
  2068. args = MagicMock()
  2069. script = "script"
  2070. #success
  2071. run_in_shell_mock.return_value=(0, None, None)
  2072. get_db_cli_tool_mock.return_value="tool"
  2073. args.database = "postgres"
  2074. args.database_password = "some_password"
  2075. retcode, out, err = ambari_server.execute_remote_script(args, script)
  2076. self.assertEquals(retcode, 0)
  2077. self.assertTrue(get_db_cli_tool_mock.called)
  2078. self.assertTrue(run_in_shell_mock.called)
  2079. #fail no cli tool
  2080. get_db_cli_tool_mock.return_value = None
  2081. get_db_cli_tool_mock.called = False
  2082. run_in_shell_mock.called = False
  2083. retcode, out, err = ambari_server.execute_remote_script(args, script)
  2084. self.assertEquals(retcode, -1)
  2085. self.assertTrue(get_db_cli_tool_mock.called)
  2086. self.assertFalse(run_in_shell_mock.called)
  2087. #fail execute
  2088. errcode = 1
  2089. get_db_cli_tool_mock.return_value = "tool"
  2090. run_in_shell_mock.return_value=(errcode, None, None)
  2091. get_db_cli_tool_mock.called = False
  2092. run_in_shell_mock.called = False
  2093. retcode, out, err = ambari_server.execute_remote_script(args, script)
  2094. self.assertEquals(retcode, errcode)
  2095. self.assertTrue(get_db_cli_tool_mock.called)
  2096. self.assertTrue(run_in_shell_mock.called)
  2097. #fail wrong database - case should be completely impossible
  2098. get_db_cli_tool_mock.return_value = "tool"
  2099. run_in_shell_mock.return_value=(0, None, None)
  2100. get_db_cli_tool_mock.called = False
  2101. run_in_shell_mock.called = False
  2102. args.database = "unknown"
  2103. retcode, out, err = ambari_server.execute_remote_script(args, script)
  2104. self.assertEquals(retcode, -2)
  2105. self.assertTrue(get_db_cli_tool_mock.called)
  2106. self.assertFalse(run_in_shell_mock.called)
  2107. pass
  2108. @patch.object(ambari_server, "get_conf_dir")
  2109. def test_update_ambari_properties(self, get_conf_dir_mock):
  2110. properties = ["server.jdbc.user.name=ambari-server\n",
  2111. "server.jdbc.user.passwd=/etc/ambari-server/conf/password.dat\n",
  2112. "java.home=/usr/jdk64/jdk1.6.0_31\n",
  2113. "server.os_type=redhat6\n",
  2114. "ambari-server.user=ambari\n",
  2115. "agent.fqdn.service.url=URL\n"]
  2116. NEW_PROPERTY = 'some_new_property=some_value\n'
  2117. CHANGED_VALUE_PROPERTY = 'server.os_type=should_not_overwrite_value\n'
  2118. get_conf_dir_mock.return_value = '/etc/ambari-server/conf'
  2119. (tf1, fn1) = tempfile.mkstemp()
  2120. (tf2, fn2) = tempfile.mkstemp()
  2121. ambari_server.AMBARI_PROPERTIES_RPMSAVE_FILE = fn1
  2122. ambari_server.AMBARI_PROPERTIES_FILE = fn2
  2123. with open(ambari_server.AMBARI_PROPERTIES_FILE, "w") as f:
  2124. f.write(NEW_PROPERTY)
  2125. f.write(CHANGED_VALUE_PROPERTY)
  2126. with open(ambari_server.AMBARI_PROPERTIES_RPMSAVE_FILE, 'w') as f:
  2127. for line in properties:
  2128. f.write(line)
  2129. #Call tested method
  2130. ambari_server.update_ambari_properties()
  2131. timestamp = datetime.datetime.now()
  2132. #RPMSAVE_FILE wasn't found
  2133. self.assertFalse(os.path.exists(ambari_server.AMBARI_PROPERTIES_RPMSAVE_FILE))
  2134. #Renamed RPMSAVE_FILE exists
  2135. self.assertTrue(os.path.exists(ambari_server.AMBARI_PROPERTIES_RPMSAVE_FILE
  2136. + '.' + timestamp.strftime('%Y%m%d%H%M%S')))
  2137. with open(ambari_server.AMBARI_PROPERTIES_FILE, 'r') as f:
  2138. ambari_properties_content = f.readlines()
  2139. for line in properties:
  2140. if (line == "agent.fqdn.service.url=URL\n"):
  2141. if (not ambari_server.GET_FQDN_SERVICE_URL+"=URL\n" in ambari_properties_content) and (line in ambari_properties_content):
  2142. self.fail()
  2143. else:
  2144. if not line in ambari_properties_content:
  2145. self.fail()
  2146. if not NEW_PROPERTY in ambari_properties_content:
  2147. self.fail()
  2148. if CHANGED_VALUE_PROPERTY in ambari_properties_content:
  2149. self.fail()
  2150. # Command should not fail if *.rpmsave file is missing
  2151. result = ambari_server.update_ambari_properties()
  2152. self.assertEquals(result, 0)
  2153. os.unlink(fn2)
  2154. #if ambari.properties file is absent then "ambari-server upgrade" should
  2155. # fail
  2156. (tf, fn) = tempfile.mkstemp()
  2157. ambari_server.AMBARI_PROPERTIES_RPMSAVE_FILE = fn
  2158. result = ambari_server.update_ambari_properties()
  2159. self.assertNotEquals(result, 0)
  2160. @patch.object(ambari_server.Properties, '__init__')
  2161. @patch.object(ambari_server, 'search_file')
  2162. def test_update_ambari_properties_negative_case(self, search_file_mock, properties_mock):
  2163. search_file_mock.return_value = None
  2164. #Call tested method
  2165. self.assertEquals(0, ambari_server.update_ambari_properties())
  2166. self.assertFalse(properties_mock.called)
  2167. search_file_mock.return_value = False
  2168. #Call tested method
  2169. self.assertEquals(0, ambari_server.update_ambari_properties())
  2170. self.assertFalse(properties_mock.called)
  2171. search_file_mock.return_value = ''
  2172. #Call tested method
  2173. self.assertEquals(0, ambari_server.update_ambari_properties())
  2174. self.assertFalse(properties_mock.called)
  2175. @patch.object(ambari_server, "get_conf_dir")
  2176. def test_update_ambari_properties_without_user_property(self, get_conf_dir_mock):
  2177. '''
  2178. Checks: update_ambari_properties call should add ambari-server.user property if
  2179. it's absent
  2180. '''
  2181. properties = ["server.jdbc.user.name=ambari-server\n",
  2182. "server.jdbc.user.passwd=/etc/ambari-server/conf/password.dat\n",
  2183. "java.home=/usr/jdk64/jdk1.6.0_31\n",
  2184. "server.os_type=redhat6\n"]
  2185. get_conf_dir_mock.return_value = '/etc/ambari-server/conf'
  2186. (tf1, fn1) = tempfile.mkstemp()
  2187. (tf2, fn2) = tempfile.mkstemp()
  2188. ambari_server.AMBARI_PROPERTIES_RPMSAVE_FILE = fn1
  2189. ambari_server.AMBARI_PROPERTIES_FILE = fn2
  2190. with open(ambari_server.AMBARI_PROPERTIES_RPMSAVE_FILE, 'w') as f:
  2191. for line in properties:
  2192. f.write(line)
  2193. #Call tested method
  2194. ambari_server.update_ambari_properties()
  2195. ambari_properties = ambari_server.Properties()
  2196. ambari_properties.load(open(fn2))
  2197. self.assertTrue(ambari_server.NR_USER_PROPERTY in ambari_properties.keys())
  2198. value = ambari_properties[ambari_server.NR_USER_PROPERTY]
  2199. self.assertEqual(value, "root")
  2200. os.unlink(fn2)
  2201. @patch.object(ambari_server, 'verify_setup_allowed')
  2202. @patch("sys.exit")
  2203. @patch.object(ambari_server, "get_YN_input")
  2204. @patch.object(ambari_server, "get_db_cli_tool")
  2205. @patch.object(ambari_server, "store_remote_properties")
  2206. @patch.object(ambari_server, "is_local_database")
  2207. @patch.object(ambari_server, "check_iptables")
  2208. @patch.object(ambari_server, "check_jdbc_drivers")
  2209. @patch.object(ambari_server, "is_root")
  2210. @patch.object(ambari_server, "check_ambari_user")
  2211. @patch.object(ambari_server, "download_jdk")
  2212. @patch.object(ambari_server, "configure_os_settings")
  2213. @patch('__builtin__.raw_input')
  2214. def test_setup_remote_db_wo_client(self,raw_input, configure_os_settings_mock,
  2215. download_jdk_mock, check_ambari_user_mock, is_root_mock,
  2216. check_jdbc_drivers_mock, check_iptables_mock, is_local_db_mock,
  2217. store_remote_properties_mock, get_db_cli_tool_mock, get_YN_input,
  2218. exit_mock, verify_setup_allowed_method):
  2219. args = MagicMock()
  2220. raw_input.return_value =""
  2221. is_root_mock.return_value = True
  2222. is_local_db_mock.return_value = False
  2223. get_YN_input.return_value = False
  2224. check_iptables_mock.return_value = (0, "other")
  2225. store_remote_properties_mock.return_value = 0
  2226. get_db_cli_tool_mock.return_value = None
  2227. check_jdbc_drivers_mock.return_value=0
  2228. check_ambari_user_mock.return_value = 0
  2229. download_jdk_mock.return_value = 0
  2230. configure_os_settings_mock.return_value = 0
  2231. verify_setup_allowed_method.return_value = 0
  2232. try:
  2233. ambari_server.setup(args)
  2234. self.fail("Should throw exception")
  2235. except NonFatalException as fe:
  2236. # Expected
  2237. self.assertTrue("The cli was not found" in fe.reason)
  2238. @patch.object(ambari_server, "parse_properties_file")
  2239. @patch.object(ambari_server, "get_db_cli_tool")
  2240. @patch.object(ambari_server, "print_error_msg")
  2241. @patch.object(ambari_server, "get_YN_input")
  2242. @patch.object(ambari_server, "setup_db")
  2243. @patch.object(ambari_server, "run_os_command")
  2244. @patch.object(ambari_server, "is_root")
  2245. def test_reset_remote_db_wo_client(self, is_root_mock, run_os_command_mock, setup_db_mock,
  2246. get_YN_inputMock, print_error_msg_mock, get_db_cli_tool_mock, parse_properties_file_mock):
  2247. args = MagicMock()
  2248. get_YN_inputMock.return_value = True
  2249. run_os_command_mock.return_value = (0, None, None)
  2250. args.persistence_type="remote"
  2251. get_db_cli_tool_mock.return_value = None
  2252. is_root_mock.return_value = True
  2253. try:
  2254. ambari_server.reset(args)
  2255. self.fail("Should throw exception")
  2256. except NonFatalException as fe:
  2257. # Expected
  2258. self.assertTrue("Client wasn't found" in fe.reason)
  2259. pass
  2260. @patch.object(ambari_server, "find_properties_file")
  2261. def test_get_ambari_properties(self, find_properties_file_mock):
  2262. find_properties_file_mock.return_value = None
  2263. rcode = ambari_server.get_ambari_properties()
  2264. self.assertEqual(rcode, -1)
  2265. tf1 = tempfile.NamedTemporaryFile()
  2266. find_properties_file_mock.return_value = tf1.name
  2267. prop_name='name'
  2268. prop_value='val'
  2269. with open(tf1.name, 'w') as fout:
  2270. fout.write(prop_name + '=' + prop_value)
  2271. fout.close()
  2272. properties = ambari_server.get_ambari_properties()
  2273. self.assertEqual(properties[prop_name], prop_value)
  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. @patch("sys.exit")
  2281. def check_jdbc_drivers(self, exit_mock, raw_input_mock, print_warning_msg, print_error_msg_mock, copy_files_mock,
  2282. find_jdbc_driver_mock, get_ambari_properties_mock):
  2283. out = StringIO.StringIO()
  2284. sys.stdout = out
  2285. args = MagicMock()
  2286. # Check positive scenario
  2287. drivers_list = ['driver_file']
  2288. resources_dir = '/tmp'
  2289. get_ambari_properties_mock.return_value = {ambari_server.RESOURCES_DIR_PROPERTY : resources_dir}
  2290. find_jdbc_driver_mock.return_value = drivers_list
  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. # Check negative scenarios
  2296. # Silent option, no drivers
  2297. ambari_server.SILENT = True
  2298. find_jdbc_driver_mock.return_value = -1
  2299. rcode = ambari_server.check_jdbc_drivers(args)
  2300. self.assertTrue(print_error_msg_mock.called)
  2301. self.assertTrue(exit_mock.called)
  2302. # Non-Silent option, no drivers
  2303. ambari_server.SILENT = False
  2304. find_jdbc_driver_mock.return_value = -1
  2305. rcode = ambari_server.check_jdbc_drivers(args)
  2306. self.assertTrue(exit_mock.called)
  2307. self.assertTrue(print_error_msg_mock.called)
  2308. # Non-Silent option, no drivers at first ask, present drivers after that
  2309. find_jdbc_driver_mock.side_effect = [-1, drivers_list]
  2310. rcode = ambari_server.check_jdbc_drivers(args)
  2311. self.assertEqual(0, rcode)
  2312. copy_files_mock.assert_called_with(drivers_list, resources_dir)
  2313. # Non-Silent option, no drivers at first ask, present drivers after that
  2314. find_jdbc_driver_mock.reset()
  2315. find_jdbc_driver_mock.side_effect = [-1, -1]
  2316. rcode = ambari_server.check_jdbc_drivers(args)
  2317. self.assertTrue(exit_mock.called)
  2318. self.assertTrue(print_error_msg_mock.called)
  2319. sys.stdout = sys.__stdout__
  2320. @patch.object(ambari_server, "find_properties_file")
  2321. def test_get_ambari_properties(self, find_properties_file):
  2322. find_properties_file.return_value = None
  2323. rcode = ambari_server.get_ambari_properties()
  2324. self.assertEqual(rcode, -1)
  2325. tf1 = tempfile.NamedTemporaryFile()
  2326. find_properties_file.return_value = tf1.name
  2327. prop_name='name'
  2328. prop_value='val'
  2329. with open(tf1.name, 'w') as fout:
  2330. fout.write(prop_name + '=' + prop_value)
  2331. fout.close()
  2332. properties = ambari_server.get_ambari_properties()
  2333. self.assertEqual(properties[prop_name], prop_value)
  2334. self.assertEqual(properties.fileName, os.path.abspath(tf1.name))
  2335. sys.stdout = sys.__stdout__
  2336. @patch("os.path.exists")
  2337. @patch("os.remove")
  2338. @patch.object(ambari_server,"print_warning_msg")
  2339. def test_remove_file(self, printWarningMsgMock, removeMock, pathExistsMock):
  2340. def side_effect():
  2341. raise Exception(-1, "Failed to delete!")
  2342. removeMock.side_effect = side_effect
  2343. pathExistsMock.return_value = 1
  2344. res = ambari_server.remove_file("/someNonExsistantDir/filename")
  2345. self.assertEquals(res,1)
  2346. removeMock.side_effect = None
  2347. res = ambari_server.remove_file("/someExsistantDir/filename")
  2348. self.assertEquals(res, 0)
  2349. @patch("shutil.copyfile")
  2350. def test_copy_file(self, shutilCopyfileMock):
  2351. def side_effect():
  2352. raise Exception(-1, "Failed to copy!")
  2353. shutilCopyfileMock.side_effect = side_effect
  2354. try:
  2355. ambari_server.copy_file("/tmp/psswd","/someNonExsistantDir/filename")
  2356. self.fail("Exception on file not copied has not been thrown!")
  2357. except FatalException:
  2358. # Expected
  2359. pass
  2360. self.assertTrue(shutilCopyfileMock.called)
  2361. shutilCopyfileMock.side_effect = None
  2362. try:
  2363. ambari_server.copy_file("/tmp/psswd","/root/psswd")
  2364. except FatalException:
  2365. self.fail("Exception on file copied should not be thrown!")
  2366. self.assertTrue(shutilCopyfileMock.called)
  2367. @patch.object(ambari_server, "get_ambari_properties")
  2368. @patch.object(ambari_server, "find_jdbc_driver")
  2369. @patch.object(ambari_server, "copy_files")
  2370. @patch.object(ambari_server, "print_error_msg")
  2371. @patch.object(ambari_server, "print_warning_msg")
  2372. @patch('__builtin__.raw_input')
  2373. def test_check_jdbc_drivers(self, raw_input_mock, print_warning_msg, print_error_msg_mock, copy_files_mock,
  2374. find_jdbc_driver_mock, get_ambari_properties_mock):
  2375. out = StringIO.StringIO()
  2376. sys.stdout = out
  2377. args = MagicMock()
  2378. # Check positive scenario
  2379. drivers_list = ['driver_file']
  2380. resources_dir = '/tmp'
  2381. get_ambari_properties_mock.return_value = {ambari_server.RESOURCES_DIR_PROPERTY : resources_dir}
  2382. find_jdbc_driver_mock.return_value = drivers_list
  2383. copy_files_mock.return_value = 0
  2384. args.database = "oracle"
  2385. rcode = ambari_server.check_jdbc_drivers(args)
  2386. self.assertEqual(0, rcode)
  2387. copy_files_mock.assert_called_with(drivers_list, resources_dir)
  2388. get_ambari_properties_mock.reset_mock()
  2389. find_jdbc_driver_mock.reset_mock()
  2390. copy_files_mock.reset_mock()
  2391. print_error_msg_mock.reset_mock()
  2392. print_warning_msg.reset_mock()
  2393. raw_input_mock.reset_mock()
  2394. # Check negative scenarios
  2395. # Silent option, no drivers
  2396. ambari_server.SILENT = True
  2397. find_jdbc_driver_mock.return_value = -1
  2398. failed = False
  2399. try:
  2400. rcode = ambari_server.check_jdbc_drivers(args)
  2401. except FatalException:
  2402. failed = True
  2403. self.assertTrue(print_error_msg_mock.called)
  2404. self.assertTrue(failed)
  2405. get_ambari_properties_mock.reset_mock()
  2406. find_jdbc_driver_mock.reset_mock()
  2407. copy_files_mock.reset_mock()
  2408. print_error_msg_mock.reset_mock()
  2409. print_warning_msg.reset_mock()
  2410. raw_input_mock.reset_mock()
  2411. # Non-Silent option, no drivers
  2412. ambari_server.SILENT = False
  2413. find_jdbc_driver_mock.return_value = -1
  2414. failed = False
  2415. try:
  2416. rcode = ambari_server.check_jdbc_drivers(args)
  2417. except FatalException:
  2418. failed = True
  2419. self.assertTrue(failed)
  2420. self.assertTrue(print_error_msg_mock.called)
  2421. get_ambari_properties_mock.reset_mock()
  2422. find_jdbc_driver_mock.reset_mock()
  2423. copy_files_mock.reset_mock()
  2424. print_error_msg_mock.reset_mock()
  2425. print_warning_msg.reset_mock()
  2426. raw_input_mock.reset_mock()
  2427. # Non-Silent option, no drivers at first ask, present drivers after that
  2428. find_jdbc_driver_mock.side_effect = [-1, drivers_list]
  2429. rcode = ambari_server.check_jdbc_drivers(args)
  2430. self.assertEqual(0, rcode)
  2431. copy_files_mock.assert_called_with(drivers_list, resources_dir)
  2432. get_ambari_properties_mock.reset_mock()
  2433. find_jdbc_driver_mock.reset_mock()
  2434. copy_files_mock.reset_mock()
  2435. print_error_msg_mock.reset_mock()
  2436. print_warning_msg.reset_mock()
  2437. raw_input_mock.reset_mock()
  2438. # Non-Silent option, no drivers at first ask, no drivers after that
  2439. find_jdbc_driver_mock.side_effect = [-1, -1]
  2440. failed = False
  2441. try:
  2442. rcode = ambari_server.check_jdbc_drivers(args)
  2443. except FatalException:
  2444. failed = True
  2445. self.assertTrue(failed)
  2446. self.assertTrue(print_error_msg_mock.called)
  2447. get_ambari_properties_mock.reset_mock()
  2448. find_jdbc_driver_mock.reset_mock()
  2449. copy_files_mock.reset_mock()
  2450. print_error_msg_mock.reset_mock()
  2451. print_warning_msg.reset_mock()
  2452. raw_input_mock.reset_mock()
  2453. # Failed to copy_files
  2454. find_jdbc_driver_mock.side_effect = [drivers_list]
  2455. try:
  2456. rcode = ambari_server.check_jdbc_drivers(args)
  2457. except FatalException:
  2458. failed = True
  2459. self.assertTrue(failed)
  2460. sys.stdout = sys.__stdout__
  2461. @patch.object(ambari_server, "find_properties_file")
  2462. def test_get_ambari_properties(self, find_properties_file_mock):
  2463. find_properties_file_mock.return_value = None
  2464. rcode = ambari_server.get_ambari_properties()
  2465. self.assertEqual(rcode, -1)
  2466. tf1 = tempfile.NamedTemporaryFile()
  2467. find_properties_file_mock.return_value = tf1.name
  2468. prop_name='name'
  2469. prop_value='val'
  2470. with open(tf1.name, 'w') as fout:
  2471. fout.write(prop_name + '=' + prop_value)
  2472. fout.close()
  2473. properties = ambari_server.get_ambari_properties()
  2474. self.assertEqual(properties[prop_name], prop_value)
  2475. self.assertEqual(properties.fileName, os.path.abspath(tf1.name))
  2476. sys.stdout = sys.__stdout__
  2477. @patch.object(ambari_server, "find_properties_file")
  2478. def test_parse_properties_file(self, find_properties_file_mock):
  2479. tf1 = tempfile.NamedTemporaryFile(mode='r')
  2480. find_properties_file_mock.return_value = tf1.name
  2481. args = MagicMock()
  2482. ambari_server.parse_properties_file(args)
  2483. self.assertEquals(args.persistence_type, "local")
  2484. with open(tf1.name, 'w') as fout:
  2485. fout.write("\n")
  2486. fout.write(ambari_server.PERSISTENCE_TYPE_PROPERTY+"=remote")
  2487. args = MagicMock()
  2488. ambari_server.parse_properties_file(args)
  2489. self.assertEquals(args.persistence_type, "remote")
  2490. @patch.object(ambari_server, 'decrypt_password_for_alias')
  2491. @patch.object(ambari_server, 'is_alias_string')
  2492. @patch.object(ambari_server, 'get_ambari_properties')
  2493. def test_configure_database_username_password_masterkey_persisted(self,
  2494. get_ambari_properties_method, is_alias_string_method,
  2495. decrypt_password_for_alias_method):
  2496. out = StringIO.StringIO()
  2497. sys.stdout = out
  2498. configs = {ambari_server.JDBC_USER_NAME_PROPERTY: "fakeuser",
  2499. ambari_server.JDBC_PASSWORD_PROPERTY: "${alias=somealias}",
  2500. ambari_server.SECURITY_KEY_IS_PERSISTED: "True" }
  2501. get_ambari_properties_method.return_value = configs
  2502. is_alias_string_method.return_value = True
  2503. decrypt_password_for_alias_method.return_value = "falepasswd"
  2504. args = MagicMock()
  2505. args.master_key = None
  2506. ambari_server.configure_database_username_password(args)
  2507. self.assertTrue(decrypt_password_for_alias_method.called)
  2508. self.assertTrue(is_alias_string_method.called)
  2509. self.assertEquals("fakeuser", args.database_username)
  2510. self.assertEquals("falepasswd", args.database_password)
  2511. sys.stdout = sys.__stdout__
  2512. @patch.object(ambari_server, 'read_password')
  2513. def test_configure_database_password(self, read_password_method):
  2514. out = StringIO.StringIO()
  2515. sys.stdout = out
  2516. read_password_method.return_value = "fakepasswd"
  2517. result = ambari_server.configure_database_password(True)
  2518. self.assertTrue(read_password_method.called)
  2519. self.assertEquals("fakepasswd", result)
  2520. result = ambari_server.configure_database_password(True)
  2521. self.assertEquals("fakepasswd", result)
  2522. result = ambari_server.configure_database_password(True)
  2523. self.assertEquals("fakepasswd", result)
  2524. sys.stdout = sys.__stdout__
  2525. @patch("os.path.exists")
  2526. @patch.object(ambari_server, 'get_is_secure')
  2527. @patch.object(ambari_server, 'get_is_persisted')
  2528. @patch.object(ambari_server, 'remove_password_file')
  2529. @patch.object(ambari_server, 'save_passwd_for_alias')
  2530. @patch.object(ambari_server, 'read_master_key')
  2531. @patch.object(ambari_server, 'read_ambari_user')
  2532. @patch.object(ambari_server, 'get_master_key_location')
  2533. @patch.object(ambari_server, 'update_properties')
  2534. @patch.object(ambari_server, 'save_master_key')
  2535. @patch.object(ambari_server, 'get_YN_input')
  2536. @patch.object(ambari_server, 'search_file')
  2537. @patch.object(ambari_server, 'get_ambari_properties')
  2538. @patch.object(ambari_server, 'is_root')
  2539. def test_setup_master_key_not_persist(self, is_root_method,
  2540. get_ambari_properties_method, search_file_message,
  2541. get_YN_input_method, save_master_key_method,
  2542. update_properties_method, get_master_key_location_method,
  2543. read_ambari_user_method, read_master_key_method,
  2544. save_passwd_for_alias_method, remove_password_file_method,
  2545. get_is_persisted_method, get_is_secure_method, exists_mock):
  2546. is_root_method.return_value = True
  2547. p = get_ambari_properties_method.return_value
  2548. p.get_property.side_effect = [ "fakepasswd", "fakepasswd", "fakepasswd", "fakepasswd"]
  2549. read_master_key_method.return_value = "aaa"
  2550. get_YN_input_method.return_value = False
  2551. read_ambari_user_method.return_value = None
  2552. save_passwd_for_alias_method.return_value = 0
  2553. get_is_persisted_method.return_value = (True, "filepath")
  2554. get_is_secure_method.return_value = False
  2555. exists_mock.return_value = False
  2556. ambari_server.setup_master_key()
  2557. self.assertTrue(get_YN_input_method.called)
  2558. self.assertTrue(read_master_key_method.called)
  2559. self.assertTrue(read_ambari_user_method.called)
  2560. self.assertTrue(update_properties_method.called)
  2561. self.assertFalse(save_master_key_method.called)
  2562. self.assertTrue(save_passwd_for_alias_method.called)
  2563. self.assertEquals(3, save_passwd_for_alias_method.call_count)
  2564. self.assertTrue(remove_password_file_method.called)
  2565. result_expected = {ambari_server.JDBC_PASSWORD_PROPERTY :
  2566. ambari_server.get_alias_string(ambari_server.JDBC_RCA_PASSWORD_ALIAS),
  2567. ambari_server.JDBC_RCA_PASSWORD_FILE_PROPERTY:
  2568. ambari_server.get_alias_string(ambari_server.JDBC_RCA_PASSWORD_ALIAS),
  2569. ambari_server.LDAP_MGR_PASSWORD_PROPERTY :
  2570. ambari_server.get_alias_string(ambari_server.LDAP_MGR_PASSWORD_ALIAS),
  2571. ambari_server.SSL_TRUSTSTORE_PASSWORD_PROPERTY :
  2572. ambari_server.get_alias_string(ambari_server.SSL_TRUSTSTORE_PASSWORD_ALIAS),
  2573. ambari_server.SECURITY_IS_ENCRYPTION_ENABLED : 'true'}
  2574. sorted_x = sorted(result_expected.iteritems(), key=operator.itemgetter(0))
  2575. sorted_y = sorted(update_properties_method.call_args[0][1].iteritems(),
  2576. key=operator.itemgetter(0))
  2577. self.assertEquals(sorted_x, sorted_y)
  2578. @patch.object(ambari_server, 'save_passwd_for_alias')
  2579. @patch("os.path.exists")
  2580. @patch.object(ambari_server, 'get_is_secure')
  2581. @patch.object(ambari_server, 'get_is_persisted')
  2582. @patch.object(ambari_server, 'read_master_key')
  2583. @patch.object(ambari_server, 'read_ambari_user')
  2584. @patch.object(ambari_server, 'get_master_key_location')
  2585. @patch.object(ambari_server, 'update_properties')
  2586. @patch.object(ambari_server, 'save_master_key')
  2587. @patch.object(ambari_server, 'get_YN_input')
  2588. @patch.object(ambari_server, 'search_file')
  2589. @patch.object(ambari_server, 'get_ambari_properties')
  2590. @patch.object(ambari_server, 'is_root')
  2591. def test_setup_master_key_persist(self, is_root_method,
  2592. get_ambari_properties_method, search_file_message,
  2593. get_YN_input_method, save_master_key_method,
  2594. update_properties_method, get_master_key_location_method,
  2595. read_ambari_user_method, read_master_key_method,
  2596. get_is_persisted_method, get_is_secure_method, exists_mock,
  2597. save_passwd_for_alias_method):
  2598. is_root_method.return_value = True
  2599. p = get_ambari_properties_method.return_value
  2600. p.get_property.side_effect = [ "fakepasswd", None, None, None ]
  2601. read_master_key_method.return_value = "aaa"
  2602. get_YN_input_method.side_effect = [True, False]
  2603. read_ambari_user_method.return_value = None
  2604. get_is_persisted_method.return_value = (True, "filepath")
  2605. get_is_secure_method.return_value = False
  2606. exists_mock.return_value = False
  2607. save_passwd_for_alias_method.return_value = 0
  2608. ambari_server.setup_master_key()
  2609. self.assertTrue(get_YN_input_method.called)
  2610. self.assertTrue(read_master_key_method.called)
  2611. self.assertTrue(read_ambari_user_method.called)
  2612. self.assertTrue(update_properties_method.called)
  2613. self.assertTrue(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.SECURITY_IS_ENCRYPTION_ENABLED: 'true'}
  2617. sorted_x = sorted(result_expected.iteritems(), key=operator.itemgetter(0))
  2618. sorted_y = sorted(update_properties_method.call_args[0][1].iteritems(),
  2619. key=operator.itemgetter(0))
  2620. self.assertEquals(sorted_x, sorted_y)
  2621. @patch.object(ambari_server, 'read_master_key')
  2622. @patch.object(ambari_server, 'remove_password_file')
  2623. @patch("os.path.exists")
  2624. @patch.object(ambari_server, 'read_ambari_user')
  2625. @patch.object(ambari_server, 'get_master_key_location')
  2626. @patch("ambari-server.Properties")
  2627. @patch.object(ambari_server, 'save_passwd_for_alias')
  2628. @patch.object(ambari_server, 'read_passwd_for_alias')
  2629. @patch.object(ambari_server, 'update_properties')
  2630. @patch.object(ambari_server, 'save_master_key')
  2631. @patch.object(ambari_server, 'get_validated_string_input')
  2632. @patch.object(ambari_server, 'get_YN_input')
  2633. @patch.object(ambari_server, 'search_file')
  2634. @patch.object(ambari_server, 'get_ambari_properties')
  2635. @patch.object(ambari_server, 'is_root')
  2636. def test_reset_master_key_persisted(self, is_root_method,
  2637. get_ambari_properties_method, search_file_message,
  2638. get_YN_input_method, get_validated_string_input_method,
  2639. save_master_key_method, update_properties_method,
  2640. read_passwd_for_alias_method, save_passwd_for_alias_method,
  2641. Properties_mock, get_master_key_location_method,
  2642. read_ambari_user_method, exists_mock,
  2643. remove_password_file_method, read_master_key_method):
  2644. # Testing call under non-root
  2645. is_root_method.return_value = False
  2646. try:
  2647. ambari_server.setup_master_key()
  2648. self.fail("Should throw exception")
  2649. except FatalException as fe:
  2650. # Expected
  2651. self.assertTrue("root-level" in fe.reason)
  2652. pass
  2653. # Testing call under root
  2654. is_root_method.return_value = True
  2655. search_file_message.return_value = "filepath"
  2656. read_ambari_user_method.return_value = None
  2657. p = get_ambari_properties_method.return_value
  2658. p.get_property.side_effect = [ 'true', '${alias=fakealias}',
  2659. '${alias=fakealias}',
  2660. '${alias=fakealias}', '${alias=fakealias}']
  2661. get_YN_input_method.side_effect = [ True, True ]
  2662. read_master_key_method.return_value = "aaa"
  2663. read_passwd_for_alias_method.return_value = "fakepassword"
  2664. save_passwd_for_alias_method.return_value = 0
  2665. exists_mock.return_value = False
  2666. ambari_server.setup_master_key()
  2667. self.assertTrue(save_master_key_method.called)
  2668. self.assertTrue(get_YN_input_method.called)
  2669. self.assertTrue(read_master_key_method.called)
  2670. self.assertTrue(update_properties_method.called)
  2671. self.assertTrue(read_passwd_for_alias_method.called)
  2672. self.assertTrue(3, read_passwd_for_alias_method.call_count)
  2673. self.assertTrue(3, save_passwd_for_alias_method.call_count)
  2674. result_expected = {ambari_server.JDBC_PASSWORD_PROPERTY:
  2675. ambari_server.get_alias_string(ambari_server.JDBC_RCA_PASSWORD_ALIAS),
  2676. ambari_server.JDBC_RCA_PASSWORD_FILE_PROPERTY:
  2677. ambari_server.get_alias_string(ambari_server.JDBC_RCA_PASSWORD_ALIAS),
  2678. ambari_server.LDAP_MGR_PASSWORD_PROPERTY:
  2679. ambari_server.get_alias_string(ambari_server.LDAP_MGR_PASSWORD_ALIAS),
  2680. ambari_server.SSL_TRUSTSTORE_PASSWORD_PROPERTY:
  2681. ambari_server.get_alias_string(ambari_server.SSL_TRUSTSTORE_PASSWORD_ALIAS),
  2682. ambari_server.SECURITY_IS_ENCRYPTION_ENABLED: 'true'}
  2683. sorted_x = sorted(result_expected.iteritems(), key=operator.itemgetter(0))
  2684. sorted_y = sorted(update_properties_method.call_args[0][1].iteritems(),
  2685. key=operator.itemgetter(0))
  2686. self.assertEquals(sorted_x, sorted_y)
  2687. @patch.object(ambari_server, 'get_is_persisted')
  2688. @patch.object(ambari_server, 'get_is_secure')
  2689. @patch.object(ambari_server, 'remove_password_file')
  2690. @patch("os.path.exists")
  2691. @patch.object(ambari_server, 'read_ambari_user')
  2692. @patch.object(ambari_server, 'get_master_key_location')
  2693. @patch("ambari-server.Properties")
  2694. @patch.object(ambari_server, 'save_passwd_for_alias')
  2695. @patch.object(ambari_server, 'read_passwd_for_alias')
  2696. @patch.object(ambari_server, 'update_properties')
  2697. @patch.object(ambari_server, 'save_master_key')
  2698. @patch.object(ambari_server, 'get_validated_string_input')
  2699. @patch.object(ambari_server, 'get_YN_input')
  2700. @patch.object(ambari_server, 'search_file')
  2701. @patch.object(ambari_server, 'get_ambari_properties')
  2702. @patch.object(ambari_server, 'is_root')
  2703. def test_reset_master_key_not_persisted(self, is_root_method,
  2704. get_ambari_properties_method,
  2705. search_file_message, get_YN_input_method,
  2706. get_validated_string_input_method, save_master_key_method,
  2707. update_properties_method, read_passwd_for_alias_method,
  2708. save_passwd_for_alias_method, Properties_mock,
  2709. get_master_key_location_method, read_ambari_user_method,
  2710. exists_mock, remove_password_file_method, get_is_secure_method,
  2711. get_is_persisted_method):
  2712. is_root_method.return_value = True
  2713. search_file_message.return_value = False
  2714. read_ambari_user_method.return_value = None
  2715. p = get_ambari_properties_method.return_value
  2716. p.get_property.side_effect = [ '${alias=fakealias}', '${alias=fakealias}',
  2717. '${alias=fakealias}', '${alias=fakealias}']
  2718. get_YN_input_method.side_effect = [ True, False ]
  2719. get_validated_string_input_method.return_value = "aaa"
  2720. read_passwd_for_alias_method.return_value = "fakepassword"
  2721. save_passwd_for_alias_method.return_value = 0
  2722. exists_mock.return_value = False
  2723. get_is_secure_method.return_value = True
  2724. get_is_persisted_method.return_value = (True, "filePath")
  2725. ambari_server.setup_master_key()
  2726. self.assertFalse(save_master_key_method.called)
  2727. self.assertTrue(get_YN_input_method.called)
  2728. self.assertTrue(get_validated_string_input_method.called)
  2729. self.assertTrue(update_properties_method.called)
  2730. self.assertTrue(read_passwd_for_alias_method.called)
  2731. self.assertTrue(3, read_passwd_for_alias_method.call_count)
  2732. self.assertTrue(3, save_passwd_for_alias_method.call_count)
  2733. self.assertFalse(save_master_key_method.called)
  2734. result_expected = {ambari_server.JDBC_PASSWORD_PROPERTY:
  2735. ambari_server.get_alias_string(ambari_server.JDBC_RCA_PASSWORD_ALIAS),
  2736. ambari_server.JDBC_RCA_PASSWORD_FILE_PROPERTY:
  2737. ambari_server.get_alias_string(ambari_server.JDBC_RCA_PASSWORD_ALIAS),
  2738. ambari_server.LDAP_MGR_PASSWORD_PROPERTY:
  2739. ambari_server.get_alias_string(ambari_server.LDAP_MGR_PASSWORD_ALIAS),
  2740. ambari_server.SSL_TRUSTSTORE_PASSWORD_PROPERTY:
  2741. ambari_server.get_alias_string(ambari_server.SSL_TRUSTSTORE_PASSWORD_ALIAS),
  2742. ambari_server.SECURITY_IS_ENCRYPTION_ENABLED: 'true'}
  2743. sorted_x = sorted(result_expected.iteritems(), key=operator.itemgetter(0))
  2744. sorted_y = sorted(update_properties_method.call_args[0][1].iteritems(),
  2745. key=operator.itemgetter(0))
  2746. self.assertEquals(sorted_x, sorted_y)
  2747. @patch.object(ambari_server, 'get_is_secure')
  2748. @patch.object(ambari_server, 'encrypt_password')
  2749. @patch.object(ambari_server, 'save_passwd_for_alias')
  2750. @patch.object(ambari_server, 'get_YN_input')
  2751. @patch.object(ambari_server, 'update_properties')
  2752. @patch.object(ambari_server, 'configure_ldap_password')
  2753. @patch.object(ambari_server, 'get_validated_string_input')
  2754. @patch.object(ambari_server, 'setup_master_key')
  2755. @patch.object(ambari_server, 'search_file')
  2756. @patch.object(ambari_server, 'get_ambari_properties')
  2757. @patch.object(ambari_server, 'is_root')
  2758. def test_setup_ldap(self, is_root_method, get_ambari_properties_method,
  2759. search_file_message, setup_master_key_method,
  2760. get_validated_string_input_method,
  2761. configure_ldap_password_method, update_properties_method,
  2762. get_YN_input_method, save_passwd_for_alias_method,
  2763. encrypt_password_method, get_is_secure_method):
  2764. out = StringIO.StringIO()
  2765. sys.stdout = out
  2766. # Testing call under non-root
  2767. is_root_method.return_value = False
  2768. try:
  2769. ambari_server.setup_ldap()
  2770. self.fail("Should throw exception")
  2771. except FatalException as fe:
  2772. # Expected
  2773. self.assertTrue("root-level" in fe.reason)
  2774. pass
  2775. # Testing call under root
  2776. is_root_method.return_value = True
  2777. search_file_message.return_value = "filepath"
  2778. configs = { ambari_server.SECURITY_MASTER_KEY_LOCATION : "filepath",
  2779. ambari_server.SECURITY_KEYS_DIR : tempfile.gettempdir(),
  2780. ambari_server.SECURITY_IS_ENCRYPTION_ENABLED : "true"
  2781. }
  2782. get_ambari_properties_method.return_value = configs
  2783. configure_ldap_password_method.return_value = "password"
  2784. setup_master_key_method.return_value = (None, True, True)
  2785. save_passwd_for_alias_method.return_value = 0
  2786. encrypt_password_method.return_value = ambari_server.get_alias_string(
  2787. ambari_server.LDAP_MGR_PASSWORD_ALIAS)
  2788. def yn_input_side_effect(*args, **kwargs):
  2789. if 'TrustStore' in args[0]:
  2790. return False
  2791. else:
  2792. return True
  2793. #get_YN_input_method.side_effect = yn_input_side_effect()
  2794. get_YN_input_method.side_effect = [ True, ]
  2795. def valid_input_side_effect(*args, **kwargs):
  2796. if 'Bind anonymously' in args[0]:
  2797. return 'false'
  2798. if args[1] == "true" or args[1] == "false":
  2799. return args[1]
  2800. else:
  2801. return "test"
  2802. get_validated_string_input_method.side_effect = valid_input_side_effect
  2803. ambari_server.setup_ldap()
  2804. ldap_properties_map =\
  2805. {
  2806. "authentication.ldap.primaryUrl" : "test",
  2807. "authentication.ldap.secondaryUrl" : "test",
  2808. "authentication.ldap.useSSL" : "false",
  2809. "authentication.ldap.usernameAttribute" : "test",
  2810. "authentication.ldap.baseDn" : "test",
  2811. "authentication.ldap.bindAnonymously" : "false",
  2812. "authentication.ldap.managerDn" : "test",
  2813. "client.security" : "ldap",\
  2814. ambari_server.LDAP_MGR_PASSWORD_PROPERTY : ambari_server.get_alias_string(\
  2815. ambari_server.LDAP_MGR_PASSWORD_ALIAS)
  2816. }
  2817. sorted_x = sorted(ldap_properties_map.iteritems(), key=operator.itemgetter(0))
  2818. sorted_y = sorted(update_properties_method.call_args[0][1].iteritems(),
  2819. key=operator.itemgetter(0))
  2820. self.assertEquals(sorted_x, sorted_y)
  2821. self.assertTrue(update_properties_method.called)
  2822. self.assertTrue(configure_ldap_password_method.called)
  2823. self.assertTrue(get_validated_string_input_method.called)
  2824. self.assertTrue(get_YN_input_method.called)
  2825. sys.stdout = sys.__stdout__
  2826. @patch.object(ambari_server, 'read_password')
  2827. def test_configure_ldap_password(self, read_password_method):
  2828. out = StringIO.StringIO()
  2829. sys.stdout = out
  2830. read_password_method.return_value = "blah"
  2831. ambari_server.configure_ldap_password()
  2832. self.assertTrue(read_password_method.called)
  2833. sys.stdout = sys.__stdout__
  2834. @patch.object(ambari_server, 'get_validated_string_input')
  2835. def test_read_password(self, get_validated_string_input_method):
  2836. out = StringIO.StringIO()
  2837. sys.stdout = out
  2838. passwordDefault = ""
  2839. passwordPrompt = 'Enter Manager Password* : '
  2840. passwordPattern = ".*"
  2841. passwordDescr = "Invalid characters in password."
  2842. get_validated_string_input_method.side_effect = ['', 'aaa', 'aaa']
  2843. password = ambari_server.read_password(passwordDefault, passwordPattern,
  2844. passwordPrompt, passwordDescr)
  2845. self.assertTrue(3, get_validated_string_input_method.call_count)
  2846. self.assertEquals('aaa', password)
  2847. get_validated_string_input_method.reset_mock()
  2848. get_validated_string_input_method.side_effect = ['aaa', 'aaa']
  2849. password = ambari_server.read_password(passwordDefault, passwordPattern,
  2850. passwordPrompt, passwordDescr)
  2851. self.assertTrue(2, get_validated_string_input_method.call_count)
  2852. self.assertEquals('aaa', password)
  2853. get_validated_string_input_method.reset_mock()
  2854. get_validated_string_input_method.side_effect = ['aaa']
  2855. password = ambari_server.read_password('aaa', passwordPattern,
  2856. passwordPrompt, passwordDescr)
  2857. self.assertTrue(1, get_validated_string_input_method.call_count)
  2858. self.assertEquals('aaa', password)
  2859. sys.stdout = sys.__stdout__
  2860. def test_generate_random_string(self):
  2861. random_str_len = 100
  2862. str1 = ambari_server.generate_random_string(random_str_len)
  2863. self.assertTrue(len(str1) == random_str_len)
  2864. str2 = ambari_server.generate_random_string(random_str_len)
  2865. self.assertTrue(str1 != str2)
  2866. @patch("__builtin__.open")
  2867. @patch.object(ambari_server, "search_file")
  2868. @patch.object(ambari_server, "backup_file_in_temp")
  2869. def test_update_properties(self, backup_file_in_temp_mock, search_file_mock, open_mock):
  2870. conf_file = "ambari.properties"
  2871. propertyMap = {"1":"1", "2":"2"}
  2872. properties = MagicMock()
  2873. f = MagicMock(name = "file")
  2874. # f.__enter__.return_value = f #mimic file behavior
  2875. search_file_mock.return_value = conf_file
  2876. open_mock.return_value = f
  2877. ambari_server.update_properties(properties, propertyMap)
  2878. properties.store.assert_called_with(f.__enter__.return_value)
  2879. backup_file_in_temp_mock.assert_called_with(conf_file)
  2880. self.assertEquals(2, properties.removeOldProp.call_count)
  2881. self.assertEquals(2, properties.process_pair.call_count)
  2882. properties = MagicMock()
  2883. backup_file_in_temp_mock.reset_mock()
  2884. open_mock.reset_mock()
  2885. ambari_server.update_properties(properties, None)
  2886. properties.store.assert_called_with(f.__enter__.return_value)
  2887. backup_file_in_temp_mock.assert_called_with(conf_file)
  2888. self.assertFalse(properties.removeOldProp.called)
  2889. self.assertFalse(properties.process_pair.called)
  2890. pass
  2891. def test_regexps(self):
  2892. res = re.search(ambari_server.REGEX_HOSTNAME_PORT, "")
  2893. self.assertTrue(res is None)
  2894. res = re.search(ambari_server.REGEX_HOSTNAME_PORT, "ddd")
  2895. self.assertTrue(res is None)
  2896. res = re.search(ambari_server.REGEX_HOSTNAME_PORT, "gg:ff")
  2897. self.assertTrue(res is None)
  2898. res = re.search(ambari_server.REGEX_HOSTNAME_PORT, "gg:55444325")
  2899. self.assertTrue(res is None)
  2900. res = re.search(ambari_server.REGEX_HOSTNAME_PORT, "gg:555")
  2901. self.assertTrue(res is not None)
  2902. res = re.search(ambari_server.REGEX_TRUE_FALSE, "")
  2903. self.assertTrue(res is not None)
  2904. res = re.search(ambari_server.REGEX_TRUE_FALSE, "t")
  2905. self.assertTrue(res is None)
  2906. res = re.search(ambari_server.REGEX_TRUE_FALSE, "trrrr")
  2907. self.assertTrue(res is None)
  2908. res = re.search(ambari_server.REGEX_TRUE_FALSE, "true|false")
  2909. self.assertTrue(res is None)
  2910. res = re.search(ambari_server.REGEX_TRUE_FALSE, "true")
  2911. self.assertTrue(res is not None)
  2912. res = re.search(ambari_server.REGEX_TRUE_FALSE, "false")
  2913. self.assertTrue(res is not None)
  2914. res = re.search(ambari_server.REGEX_ANYTHING, "")
  2915. self.assertTrue(res is not None)
  2916. res = re.search(ambari_server.REGEX_ANYTHING, "t")
  2917. self.assertTrue(res is not None)
  2918. res = re.search(ambari_server.REGEX_ANYTHING, "trrrr")
  2919. self.assertTrue(res is not None)
  2920. def get_sample(self, sample):
  2921. """
  2922. Returns sample file content as string with normalized line endings
  2923. """
  2924. path = self.get_samples_dir(sample)
  2925. return self.get_file_string(path)
  2926. def get_file_string(self, file):
  2927. """
  2928. Returns file content as string with normalized line endings
  2929. """
  2930. string = open(file, 'r').read()
  2931. return self.normalize(string)
  2932. def normalize(self, string):
  2933. """
  2934. Normalizes line ending in string according to platform-default encoding
  2935. """
  2936. return string.replace("\n", os.linesep)
  2937. def get_samples_dir(self, sample):
  2938. """
  2939. Returns full file path by sample name
  2940. """
  2941. testdir = os.path.dirname(__file__)
  2942. return os.path.dirname(testdir) + os.sep + "resources" + os.sep \
  2943. + 'TestAmbaryServer.samples/' + sample