TestAmbariServer.py 167 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443
  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_security')
  159. @patch('optparse.OptionParser')
  160. def test_main_test_setup_security(self, OptionParserMock,
  161. setup_security_method):
  162. opm = OptionParserMock.return_value
  163. options = MagicMock()
  164. args = ["setup-security"]
  165. opm.parse_args.return_value = (options, args)
  166. options.database = None
  167. options.sid_or_sname = "sid"
  168. setup_security_method.return_value = None
  169. ambari_server.main()
  170. ambari_server.main()
  171. self.assertTrue(setup_security_method.called)
  172. self.assertFalse(False, ambari_server.VERBOSE)
  173. self.assertFalse(False, ambari_server.SILENT)
  174. @patch.object(ambari_server, 'setup_ambari_krb5_jaas')
  175. @patch.object(ambari_server, 'setup_master_key')
  176. @patch.object(ambari_server, 'setup_component_https')
  177. @patch.object(ambari_server, 'setup_https')
  178. @patch.object(ambari_server, 'get_validated_string_input')
  179. def test_setup_security(self, get_validated_string_input_mock, setup_https,
  180. setup_component_https, setup_master_key,
  181. setup_ambari_krb5_jaas):
  182. args = {}
  183. get_validated_string_input_mock.return_value = '1'
  184. ambari_server.setup_security(args)
  185. self.assertTrue(setup_https.called)
  186. get_validated_string_input_mock.return_value = '2'
  187. ambari_server.setup_security(args)
  188. self.assertTrue(setup_component_https.called)
  189. setup_component_https.assert_called_with("Ganglia", "setup-ganglia-https",
  190. ambari_server.GANGLIA_HTTPS, "ganglia_cert")
  191. get_validated_string_input_mock.return_value = '3'
  192. ambari_server.setup_security(args)
  193. self.assertTrue(setup_component_https.called)
  194. setup_component_https.assert_called_with("Nagios", "setup-nagios-https",
  195. ambari_server.NAGIOS_HTTPS, "nagios_cert")
  196. get_validated_string_input_mock.return_value = '4'
  197. ambari_server.setup_security(args)
  198. self.assertTrue(setup_master_key.called)
  199. get_validated_string_input_mock.return_value = '5'
  200. ambari_server.setup_security(args)
  201. self.assertTrue(setup_ambari_krb5_jaas.called)
  202. @patch('re.sub')
  203. @patch('fileinput.FileInput')
  204. @patch.object(ambari_server, 'get_validated_string_input')
  205. @patch.object(ambari_server, 'search_file')
  206. @patch('os.path.exists')
  207. def test_setup_ambari_krb5_jaas(self, exists_mock, search_mock,
  208. get_validated_string_input_mock,
  209. fileinput_mock, re_sub_mock):
  210. search_mock.return_value = 'filepath'
  211. exists_mock.return_value = False
  212. # Negative case
  213. try:
  214. ambari_server.setup_ambari_krb5_jaas()
  215. self.fail("Should throw exception")
  216. except NonFatalException as fe:
  217. # Expected
  218. self.assertTrue("No jaas config file found at location" in fe.reason)
  219. pass
  220. # Positive case
  221. exists_mock.reset_mock()
  222. exists_mock.return_value = True
  223. get_validated_string_input_mock.side_effect = ['aaa@aaa.cnn',
  224. 'pathtokeytab']
  225. fileinput_mock.return_value = [ 'keyTab=xyz', 'principal=xyz' ]
  226. ambari_server.setup_ambari_krb5_jaas()
  227. self.assertTrue(fileinput_mock.called)
  228. self.assertTrue(re_sub_mock.called)
  229. self.assertTrue(re_sub_mock.call_args_list, [('aaa@aaa.cnn'),
  230. ('pathtokeytab')])
  231. @patch.object(ambari_server, 'setup')
  232. @patch.object(ambari_server, 'start')
  233. @patch.object(ambari_server, 'stop')
  234. @patch.object(ambari_server, 'reset')
  235. @patch('optparse.OptionParser')
  236. def test_main_test_setup(self, OptionParserMock, reset_method, stop_method,
  237. start_method, setup_method):
  238. opm = OptionParserMock.return_value
  239. options = MagicMock()
  240. args = ["setup"]
  241. opm.parse_args.return_value = (options, args)
  242. options.database = None
  243. options.sid_or_sname = "sid"
  244. ambari_server.main()
  245. self.assertTrue(setup_method.called)
  246. self.assertFalse(start_method.called)
  247. self.assertFalse(stop_method.called)
  248. self.assertFalse(reset_method.called)
  249. self.assertFalse(False, ambari_server.VERBOSE)
  250. self.assertFalse(False, ambari_server.SILENT)
  251. @patch.object(ambari_server, 'setup')
  252. @patch.object(ambari_server, 'start')
  253. @patch.object(ambari_server, 'stop')
  254. @patch.object(ambari_server, 'reset')
  255. @patch('optparse.OptionParser')
  256. def test_main_test_start(self, OptionParserMock, reset_method, stop_method,
  257. start_method, setup_method):
  258. opm = OptionParserMock.return_value
  259. options = MagicMock()
  260. args = ["setup"]
  261. opm.parse_args.return_value = (options, args)
  262. options.database = None
  263. options.sid_or_sname = "sname"
  264. ambari_server.main()
  265. self.assertTrue(setup_method.called)
  266. self.assertFalse(start_method.called)
  267. self.assertFalse(stop_method.called)
  268. self.assertFalse(reset_method.called)
  269. self.assertFalse(False, ambari_server.VERBOSE)
  270. self.assertFalse(False, ambari_server.SILENT)
  271. @patch.object(ambari_server, 'setup')
  272. @patch.object(ambari_server, 'start')
  273. @patch.object(ambari_server, 'stop')
  274. @patch.object(ambari_server, 'reset')
  275. @patch('optparse.OptionParser')
  276. def test_main_test_start_debug_short(self, OptionParserMock, reset_method, stop_method,
  277. start_method, setup_method):
  278. opm = OptionParserMock.return_value
  279. options = MagicMock()
  280. args = ["start", "-g"]
  281. opm.parse_args.return_value = (options, args)
  282. options.database = None
  283. options.sid_or_sname = "sid"
  284. ambari_server.main()
  285. self.assertFalse(setup_method.called)
  286. self.assertTrue(start_method.called)
  287. self.assertFalse(stop_method.called)
  288. self.assertFalse(reset_method.called)
  289. self.assertTrue(ambari_server.SERVER_DEBUG_MODE)
  290. @patch.object(ambari_server, 'setup')
  291. @patch.object(ambari_server, 'start')
  292. @patch.object(ambari_server, 'stop')
  293. @patch.object(ambari_server, 'reset')
  294. @patch('optparse.OptionParser')
  295. def test_main_test_start_debug_long(self, OptionParserMock, reset_method, stop_method,
  296. start_method, setup_method):
  297. opm = OptionParserMock.return_value
  298. options = MagicMock()
  299. args = ["start", "--debug"]
  300. opm.parse_args.return_value = (options, args)
  301. options.database = None
  302. options.sid_or_sname = "sid"
  303. ambari_server.main()
  304. self.assertFalse(setup_method.called)
  305. self.assertTrue(start_method.called)
  306. self.assertFalse(stop_method.called)
  307. self.assertFalse(reset_method.called)
  308. self.assertTrue(ambari_server.SERVER_DEBUG_MODE)
  309. @patch.object(ambari_server, 'setup')
  310. @patch.object(ambari_server, 'start')
  311. @patch.object(ambari_server, 'stop')
  312. @patch.object(ambari_server, 'reset')
  313. @patch('optparse.OptionParser')
  314. def test_main_test_stop(self, OptionParserMock, reset_method, stop_method,
  315. start_method, setup_method):
  316. opm = OptionParserMock.return_value
  317. options = MagicMock()
  318. args = ["stop"]
  319. opm.parse_args.return_value = (options, args)
  320. options.database = None
  321. options.sid_or_sname = "sid"
  322. ambari_server.main()
  323. self.assertFalse(setup_method.called)
  324. self.assertFalse(start_method.called)
  325. self.assertTrue(stop_method.called)
  326. self.assertFalse(reset_method.called)
  327. self.assertFalse(False, ambari_server.VERBOSE)
  328. self.assertFalse(False, ambari_server.SILENT)
  329. @patch.object(ambari_server, 'setup')
  330. @patch.object(ambari_server, 'start')
  331. @patch.object(ambari_server, 'stop')
  332. @patch.object(ambari_server, 'reset')
  333. @patch('optparse.OptionParser')
  334. def test_main_test_reset(self, OptionParserMock, reset_method, stop_method,
  335. start_method, setup_method):
  336. opm = OptionParserMock.return_value
  337. options = MagicMock()
  338. args = ["reset"]
  339. opm.parse_args.return_value = (options, args)
  340. options.database = None
  341. options.sid_or_sname = "sid"
  342. ambari_server.main()
  343. self.assertFalse(setup_method.called)
  344. self.assertFalse(start_method.called)
  345. self.assertFalse(stop_method.called)
  346. self.assertTrue(reset_method.called)
  347. self.assertFalse(False, ambari_server.VERBOSE)
  348. self.assertFalse(False, ambari_server.SILENT)
  349. def test_configure_postgresql_conf(self):
  350. tf1 = tempfile.NamedTemporaryFile()
  351. ambari_server.POSTGRESQL_CONF_FILE = tf1.name
  352. with open(ambari_server.POSTGRESQL_CONF_FILE, 'w') as f:
  353. f.write("#listen_addresses = '127.0.0.1' #\n")
  354. f.write("#listen_addresses = '127.0.0.1'")
  355. ambari_server.configure_postgresql_conf()
  356. expected = self.get_file_string(self.get_samples_dir(
  357. "configure_postgresql_conf1"))
  358. result = self.get_file_string(ambari_server.POSTGRESQL_CONF_FILE)
  359. self.assertEqual(expected, result, "postgresql.conf not updated")
  360. mode = oct(os.stat(ambari_server.POSTGRESQL_CONF_FILE)[stat.ST_MODE])
  361. str_mode = str(mode)[-4:]
  362. self.assertEqual("0644", str_mode, "Wrong file permissions")
  363. @patch.object(ambari_server, "restart_postgres")
  364. @patch.object(ambari_server, "get_postgre_status")
  365. @patch.object(ambari_server, "configure_postgresql_conf")
  366. @patch.object(ambari_server, "configure_pg_hba_ambaridb_users")
  367. @patch.object(ambari_server, "configure_pg_hba_postgres_user")
  368. def test_configure_postgres(self, configure_pg_hba_postgres_user_mock,
  369. configure_pg_hba_ambaridb_users_mock,
  370. configure_postgresql_conf_mock,
  371. get_postgre_status_mock,
  372. restart_postgres_mock):
  373. tf1 = tempfile.NamedTemporaryFile()
  374. tf2 = tempfile.NamedTemporaryFile()
  375. ambari_server.PG_HBA_CONF_FILE = tf1.name
  376. ambari_server.PG_HBA_CONF_FILE_BACKUP = tf2.name
  377. args = MagicMock()
  378. out = StringIO.StringIO()
  379. sys.stdout = out
  380. rcode = ambari_server.configure_postgres()
  381. sys.stdout = sys.__stdout__
  382. self.assertEqual(0, rcode)
  383. self.assertEqual("Backup for pg_hba found, reconfiguration not required\n",
  384. out.getvalue())
  385. ambari_server.PG_HBA_CONF_FILE_BACKUP = tempfile.mktemp()
  386. get_postgre_status_mock.return_value = ambari_server.PG_STATUS_RUNNING
  387. restart_postgres_mock.return_value = 0
  388. rcode = ambari_server.configure_postgres()
  389. self.assertTrue(os.path.isfile(ambari_server.PG_HBA_CONF_FILE_BACKUP),
  390. "postgresql.conf backup not created")
  391. self.assertTrue(configure_pg_hba_postgres_user_mock.called)
  392. self.assertTrue(configure_pg_hba_ambaridb_users_mock.called)
  393. mode = oct(os.stat(ambari_server.PG_HBA_CONF_FILE)[stat.ST_MODE])
  394. str_mode = str(mode)[-4:]
  395. self.assertEqual("0644", str_mode, "Wrong file permissions")
  396. self.assertTrue(configure_postgresql_conf_mock.called)
  397. self.assertEqual(0, rcode)
  398. os.unlink(ambari_server.PG_HBA_CONF_FILE_BACKUP)
  399. get_postgre_status_mock.return_value = "stopped"
  400. rcode = ambari_server.configure_postgres()
  401. self.assertEqual(0, rcode)
  402. os.unlink(ambari_server.PG_HBA_CONF_FILE_BACKUP)
  403. sys.stdout = sys.__stdout__
  404. @patch("time.sleep")
  405. @patch("subprocess.Popen")
  406. @patch.object(ambari_server, "run_os_command")
  407. @patch.object(ambari_server, "get_postgre_status")
  408. @patch.object(ambari_server, "print_info_msg")
  409. def test_restart_postgres(self, printInfoMsg_mock, get_postgre_status_mock,
  410. run_os_command_mock, popenMock, sleepMock):
  411. p = MagicMock()
  412. p.poll.return_value = 0
  413. popenMock.return_value = p
  414. rcode = ambari_server.restart_postgres()
  415. self.assertEqual(0, rcode)
  416. p.poll.return_value = None
  417. get_postgre_status_mock.return_value = "stopped"
  418. run_os_command_mock.return_value = (1, None, None)
  419. rcode = ambari_server.restart_postgres()
  420. self.assertEqual(1, rcode)
  421. @patch("shlex.split")
  422. @patch("subprocess.Popen")
  423. @patch.object(ambari_server, "print_info_msg")
  424. def test_run_os_command(self, printInfoMsg_mock, popenMock, splitMock):
  425. p = MagicMock()
  426. p.communicate.return_value = (None, None)
  427. p.returncode = 3
  428. popenMock.return_value = p
  429. # with list arg
  430. cmd = ["exec", "arg"]
  431. ambari_server.run_os_command(cmd)
  432. self.assertFalse(splitMock.called)
  433. # with str arg
  434. resp = ambari_server.run_os_command("runme")
  435. self.assertEqual(3, resp[0])
  436. self.assertTrue(splitMock.called)
  437. @patch.object(ambari_server, "get_conf_dir")
  438. @patch.object(ambari_server, "search_file")
  439. def test_write_property(self, search_file_mock, get_conf_dir_mock):
  440. expected_content = "key1=val1\n"
  441. tf1 = tempfile.NamedTemporaryFile()
  442. search_file_mock.return_value = tf1.name
  443. ambari_server.write_property("key1", "val1")
  444. result = tf1.read()
  445. self.assertTrue(expected_content in result)
  446. @patch.object(ambari_server, "configure_database_username_password")
  447. @patch.object(ambari_server, "run_os_command")
  448. def test_setup_db(self, run_os_command_mock,
  449. configure_database_username_password_mock):
  450. run_os_command_mock.return_value = (0, None, None)
  451. result = ambari_server.setup_db(MagicMock())
  452. self.assertTrue(configure_database_username_password_mock.called)
  453. self.assertEqual(0, result)
  454. @patch.object(ambari_server, "configure_database_username_password")
  455. @patch("time.sleep")
  456. @patch.object(ambari_server, "run_os_command")
  457. def test_setup_db_connect_attempts_fail(self, run_os_command_mock,
  458. sleep_mock, config_db_mock):
  459. run_os_command_mock.side_effect = [(1, "error", "error"), (1, "error", "error"),
  460. (1, "error", "error")]
  461. result = ambari_server.setup_db(MagicMock())
  462. self.assertTrue(run_os_command_mock.called)
  463. self.assertEqual(1, result)
  464. self.assertEqual(3, sleep_mock.call_count)
  465. pass
  466. @patch.object(ambari_server, "configure_database_username_password")
  467. @patch("time.sleep")
  468. @patch.object(ambari_server, "run_os_command")
  469. def test_setup_db_connect_attempts_success(self, run_os_command_mock,
  470. sleep_mock, config_db_mock):
  471. run_os_command_mock.side_effect = [(1, "error", "error"), (0, None, None),
  472. (0, None, None)]
  473. result = ambari_server.setup_db(MagicMock())
  474. self.assertTrue(run_os_command_mock.called)
  475. self.assertEqual(0, result)
  476. self.assertEqual(1, sleep_mock.call_count)
  477. pass
  478. @patch.object(ambari_server, "get_YN_input")
  479. @patch.object(ambari_server, "run_os_command")
  480. def test_check_selinux(self, run_os_command_mock, getYNInput_mock):
  481. run_os_command_mock.return_value = (0, ambari_server.SE_STATUS_DISABLED,
  482. None)
  483. rcode = ambari_server.check_selinux()
  484. self.assertEqual(0, rcode)
  485. getYNInput_mock.return_value = True
  486. run_os_command_mock.return_value = (0, "enabled "
  487. + ambari_server.SE_MODE_ENFORCING,
  488. None)
  489. rcode = ambari_server.check_selinux()
  490. self.assertEqual(0, rcode)
  491. self.assertTrue(run_os_command_mock.called)
  492. self.assertTrue(getYNInput_mock.called)
  493. @patch.object(ambari_server, "print_info_msg")
  494. def test_get_ambari_jars(self, printInfoMsg_mock):
  495. env = "/ambari/jars"
  496. os.environ[ambari_server.AMBARI_SERVER_LIB] = env
  497. result = ambari_server.get_ambari_jars()
  498. self.assertEqual(env, result)
  499. del os.environ[ambari_server.AMBARI_SERVER_LIB]
  500. result = ambari_server.get_ambari_jars()
  501. self.assertEqual("/usr/lib/ambari-server", result)
  502. self.assertTrue(printInfoMsg_mock.called)
  503. @patch("glob.glob")
  504. @patch.object(ambari_server, "print_info_msg")
  505. def test_get_share_jars(self, printInfoMsg_mock, globMock):
  506. globMock.return_value = ["one", "two"]
  507. expected = "one:two:one:two"
  508. result = ambari_server.get_share_jars()
  509. self.assertEqual(expected, result)
  510. globMock.return_value = []
  511. expected = ""
  512. result = ambari_server.get_share_jars()
  513. self.assertEqual(expected, result)
  514. @patch("glob.glob")
  515. @patch.object(ambari_server, "print_info_msg")
  516. def test_get_ambari_classpath(self, printInfoMsg_mock, globMock):
  517. globMock.return_value = ["one"]
  518. result = ambari_server.get_ambari_classpath()
  519. self.assertTrue(ambari_server.get_ambari_jars() in result)
  520. self.assertTrue(ambari_server.get_share_jars() in result)
  521. globMock.return_value = []
  522. result = ambari_server.get_ambari_classpath()
  523. self.assertTrue(ambari_server.get_ambari_jars() in result)
  524. self.assertFalse(":" in result)
  525. @patch.object(ambari_server, "print_info_msg")
  526. def test_get_conf_dir(self, printInfoMsg_mock):
  527. env = "/dummy/ambari/conf"
  528. os.environ[ambari_server.AMBARI_CONF_VAR] = env
  529. result = ambari_server.get_conf_dir()
  530. self.assertEqual(env, result)
  531. del os.environ[ambari_server.AMBARI_CONF_VAR]
  532. result = ambari_server.get_conf_dir()
  533. self.assertEqual("/etc/ambari-server/conf", result)
  534. def test_search_file(self):
  535. path = os.path.dirname(__file__)
  536. result = ambari_server.search_file(__file__, path)
  537. expected = os.path.abspath(__file__)
  538. self.assertEqual(expected, result)
  539. result = ambari_server.search_file("non_existent_file", path)
  540. self.assertEqual(None, result)
  541. @patch.object(ambari_server, "search_file")
  542. def test_find_properties_file(self, search_file_mock):
  543. # Testing case when file is not found
  544. search_file_mock.return_value = None
  545. try:
  546. ambari_server.find_properties_file()
  547. self.fail("File not found'")
  548. except FatalException:
  549. # Expected
  550. pass
  551. self.assertTrue(search_file_mock.called)
  552. # Testing case when file is found
  553. value = MagicMock()
  554. search_file_mock.return_value = value
  555. result = ambari_server.find_properties_file()
  556. self.assertTrue(result is value)
  557. @patch.object(ambari_server, "find_properties_file")
  558. @patch("__builtin__.open")
  559. @patch("ambari-server.Properties")
  560. def test_read_ambari_user(self, properties_mock, open_mock, find_properties_file_mock):
  561. open_mock.return_value = "dummy"
  562. find_properties_file_mock.return_value = "dummy"
  563. # Testing with defined user
  564. properties_mock.return_value.__getitem__.return_value = "dummy_user"
  565. user = ambari_server.read_ambari_user()
  566. self.assertEquals(user, "dummy_user")
  567. # Testing with undefined user
  568. properties_mock.return_value.__getitem__.return_value = None
  569. user = ambari_server.read_ambari_user()
  570. self.assertEquals(user, None)
  571. @patch("os.path.exists")
  572. @patch.object(ambari_server, "set_file_permissions")
  573. @patch.object(ambari_server, "run_os_command")
  574. @patch.object(ambari_server, "get_ambari_properties")
  575. @patch.object(ambari_server, "get_value_from_properties")
  576. @patch("os.mkdir")
  577. def test_adjust_directory_permissions(self, mkdir_mock,
  578. get_value_from_properties_mock, get_ambari_properties_mock,
  579. run_os_command_mock, set_file_permissions_mock, exists_mock):
  580. # Testing boostrap dir wipe
  581. properties_mock = MagicMock()
  582. get_value_from_properties_mock.return_value = "dummy_bootstrap_dir"
  583. ambari_server.adjust_directory_permissions("user")
  584. exists_mock.return_value = False
  585. self.assertEquals(run_os_command_mock.call_args_list[0][0][0], "rm -rf dummy_bootstrap_dir")
  586. self.assertTrue(mkdir_mock.called)
  587. set_file_permissions_mock.reset_mock()
  588. # Test recursive calls
  589. old_list = ambari_server.NR_ADJUST_OWNERSHIP_LIST
  590. ambari_server.NR_ADJUST_OWNERSHIP_LIST = [
  591. ( "/etc/ambari-server/conf", "755", "{0}", True ),
  592. ( "/etc/ambari-server/conf/ambari.properties", "644", "{0}", False )
  593. ]
  594. ambari_server.adjust_directory_permissions("user")
  595. self.assertTrue(len(set_file_permissions_mock.call_args_list) ==
  596. len(ambari_server.NR_ADJUST_OWNERSHIP_LIST))
  597. self.assertEquals(set_file_permissions_mock.call_args_list[0][0][3], True)
  598. self.assertEquals(set_file_permissions_mock.call_args_list[1][0][3], False)
  599. ambari_server.NR_ADJUST_OWNERSHIP_LIST = old_list
  600. @patch("os.path.exists")
  601. @patch.object(ambari_server, "run_os_command")
  602. @patch.object(ambari_server, "print_warning_msg")
  603. @patch.object(ambari_server, "print_info_msg")
  604. def test_set_file_permissions(self, print_info_msg_mock, print_warning_msg_mock,
  605. run_os_command_mock, exists_mock):
  606. # Testing not existent file scenario
  607. exists_mock.return_value = False
  608. ambari_server.set_file_permissions("dummy-file", "dummy-mod",
  609. "dummy-user", False)
  610. self.assertFalse(run_os_command_mock.called)
  611. self.assertTrue(print_info_msg_mock.called)
  612. run_os_command_mock.reset_mock()
  613. print_warning_msg_mock.reset_mock()
  614. # Testing OK scenario
  615. exists_mock.return_value = True
  616. run_os_command_mock.side_effect = [(0, "", ""), (0, "", "")]
  617. ambari_server.set_file_permissions("dummy-file", "dummy-mod",
  618. "dummy-user", False)
  619. self.assertTrue(len(run_os_command_mock.call_args_list) == 2)
  620. self.assertFalse(print_warning_msg_mock.called)
  621. run_os_command_mock.reset_mock()
  622. print_warning_msg_mock.reset_mock()
  623. # Testing first command fail
  624. run_os_command_mock.side_effect = [(1, "", ""), (0, "", "")]
  625. ambari_server.set_file_permissions("dummy-file", "dummy-mod",
  626. "dummy-user", False)
  627. self.assertTrue(len(run_os_command_mock.call_args_list) == 2)
  628. self.assertTrue(print_warning_msg_mock.called)
  629. run_os_command_mock.reset_mock()
  630. print_warning_msg_mock.reset_mock()
  631. # Testing second command fail
  632. run_os_command_mock.side_effect = [(0, "", ""), (1, "", "")]
  633. ambari_server.set_file_permissions("dummy-file", "dummy-mod",
  634. "dummy-user", False)
  635. self.assertTrue(len(run_os_command_mock.call_args_list) == 2)
  636. self.assertTrue(print_warning_msg_mock.called)
  637. run_os_command_mock.reset_mock()
  638. print_warning_msg_mock.reset_mock()
  639. # Testing recursive operation
  640. exists_mock.return_value = True
  641. run_os_command_mock.side_effect = [(0, "", ""), (0, "", "")]
  642. ambari_server.set_file_permissions("dummy-file", "dummy-mod",
  643. "dummy-user", True)
  644. self.assertTrue(len(run_os_command_mock.call_args_list) == 2)
  645. self.assertTrue("-R" in run_os_command_mock.call_args_list[0][0][0])
  646. self.assertTrue("-R" in run_os_command_mock.call_args_list[1][0][0])
  647. self.assertFalse(print_warning_msg_mock.called)
  648. run_os_command_mock.reset_mock()
  649. print_warning_msg_mock.reset_mock()
  650. # Testing non-recursive operation
  651. exists_mock.return_value = True
  652. run_os_command_mock.side_effect = [(0, "", ""), (0, "", "")]
  653. ambari_server.set_file_permissions("dummy-file", "dummy-mod",
  654. "dummy-user", False)
  655. self.assertTrue(len(run_os_command_mock.call_args_list) == 2)
  656. self.assertFalse("-R" in run_os_command_mock.call_args_list[0][0][0])
  657. self.assertFalse("-R" in run_os_command_mock.call_args_list[1][0][0])
  658. self.assertFalse(print_warning_msg_mock.called)
  659. run_os_command_mock.reset_mock()
  660. print_warning_msg_mock.reset_mock()
  661. @patch.object(ambari_server, "get_validated_string_input")
  662. @patch.object(ambari_server, "print_info_msg")
  663. @patch.object(ambari_server, "print_warning_msg")
  664. @patch.object(ambari_server, "run_os_command")
  665. def test_create_custom_user(self, run_os_command_mock, print_warning_msg_mock,
  666. print_info_msg_mock, get_validated_string_input_mock):
  667. user = "dummy-user"
  668. get_validated_string_input_mock.return_value = user
  669. # Testing scenario: absent user
  670. run_os_command_mock.side_effect = [(0, "", "")]
  671. result = ambari_server.create_custom_user()
  672. self.assertFalse(print_warning_msg_mock.called)
  673. self.assertEquals(result, (0, user))
  674. print_info_msg_mock.reset_mock()
  675. print_warning_msg_mock.reset_mock()
  676. run_os_command_mock.reset_mock()
  677. # Testing scenario: existing user
  678. run_os_command_mock.side_effect = [(9, "", "")]
  679. result = ambari_server.create_custom_user()
  680. self.assertTrue("User dummy-user already exists" in str(print_info_msg_mock.call_args_list[1][0]))
  681. self.assertEquals(result, (0, user))
  682. print_info_msg_mock.reset_mock()
  683. print_warning_msg_mock.reset_mock()
  684. run_os_command_mock.reset_mock()
  685. # Testing scenario: os command fail
  686. run_os_command_mock.side_effect = [(1, "", "")]
  687. result = ambari_server.create_custom_user()
  688. self.assertTrue(print_warning_msg_mock.called)
  689. self.assertEquals(result, (1, None))
  690. @patch.object(ambari_server, "read_ambari_user")
  691. @patch.object(ambari_server, "get_YN_input")
  692. @patch.object(ambari_server, "create_custom_user")
  693. @patch.object(ambari_server, "write_property")
  694. @patch.object(ambari_server, "adjust_directory_permissions")
  695. @patch.object(ambari_server, "print_error_msg")
  696. def test_check_ambari_user(self, print_error_msg_mock,
  697. adjust_directory_permissions_mock, write_property_mock,
  698. create_custom_user_mock, get_YN_input_mock, read_ambari_user_mock):
  699. # Scenario: user is already defined, user does not want to reconfigure it
  700. read_ambari_user_mock.return_value = "dummy-user"
  701. get_YN_input_mock.return_value = False
  702. result = ambari_server.check_ambari_user()
  703. self.assertTrue(get_YN_input_mock.called)
  704. self.assertFalse(write_property_mock.called)
  705. self.assertFalse(create_custom_user_mock.called)
  706. self.assertTrue(adjust_directory_permissions_mock.called)
  707. self.assertEqual(result, 0)
  708. get_YN_input_mock.reset_mock()
  709. write_property_mock.reset_mock()
  710. adjust_directory_permissions_mock.reset_mock()
  711. create_custom_user_mock.reset_mock()
  712. # Scenario: user is already defined, but user wants to reconfigure it
  713. read_ambari_user_mock.return_value = "dummy-user"
  714. create_custom_user_mock.return_value = (0, "new-dummy-user")
  715. get_YN_input_mock.return_value = True
  716. result = ambari_server.check_ambari_user()
  717. self.assertTrue(get_YN_input_mock.called)
  718. self.assertTrue(write_property_mock.called)
  719. self.assertTrue(write_property_mock.call_args[0][1] == "new-dummy-user")
  720. self.assertTrue(create_custom_user_mock.called)
  721. self.assertTrue(adjust_directory_permissions_mock.called)
  722. self.assertEqual(result, 0)
  723. get_YN_input_mock.reset_mock()
  724. write_property_mock.reset_mock()
  725. adjust_directory_permissions_mock.reset_mock()
  726. create_custom_user_mock.reset_mock()
  727. # Negative scenario: user is already defined, but user wants
  728. # to reconfigure it, user creation failed
  729. read_ambari_user_mock.return_value = "dummy-user"
  730. create_custom_user_mock.return_value = (1, None)
  731. get_YN_input_mock.return_value = True
  732. result = ambari_server.check_ambari_user()
  733. self.assertTrue(get_YN_input_mock.called)
  734. self.assertTrue(create_custom_user_mock.called)
  735. self.assertFalse(write_property_mock.called)
  736. self.assertFalse(adjust_directory_permissions_mock.called)
  737. self.assertEqual(result, 1)
  738. get_YN_input_mock.reset_mock()
  739. create_custom_user_mock.reset_mock()
  740. write_property_mock.reset_mock()
  741. adjust_directory_permissions_mock.reset_mock()
  742. # Scenario: user is not defined (setup process)
  743. read_ambari_user_mock.return_value = None
  744. get_YN_input_mock.return_value = True
  745. create_custom_user_mock.return_value = (0, "dummy-user")
  746. result = ambari_server.check_ambari_user()
  747. self.assertTrue(get_YN_input_mock.called)
  748. self.assertTrue(create_custom_user_mock.called)
  749. self.assertTrue(write_property_mock.called)
  750. self.assertTrue(write_property_mock.call_args[0][1] == "dummy-user")
  751. self.assertTrue(adjust_directory_permissions_mock.called)
  752. self.assertEqual(result, 0)
  753. get_YN_input_mock.reset_mock()
  754. create_custom_user_mock.reset_mock()
  755. write_property_mock.reset_mock()
  756. adjust_directory_permissions_mock.reset_mock()
  757. # Scenario: user is not defined (setup process), user creation failed
  758. read_ambari_user_mock.return_value = None
  759. get_YN_input_mock.return_value = True
  760. create_custom_user_mock.return_value = (1, None)
  761. result = ambari_server.check_ambari_user()
  762. self.assertTrue(get_YN_input_mock.called)
  763. self.assertTrue(create_custom_user_mock.called)
  764. self.assertFalse(write_property_mock.called)
  765. self.assertFalse(adjust_directory_permissions_mock.called)
  766. self.assertEqual(result, 1)
  767. get_YN_input_mock.reset_mock()
  768. create_custom_user_mock.reset_mock()
  769. write_property_mock.reset_mock()
  770. adjust_directory_permissions_mock.reset_mock()
  771. # negative scenario: user is not defined (setup process), user creation failed
  772. read_ambari_user_mock.return_value = None
  773. get_YN_input_mock.return_value = True
  774. create_custom_user_mock.return_value = (1, None)
  775. result = ambari_server.check_ambari_user()
  776. self.assertTrue(get_YN_input_mock.called)
  777. self.assertTrue(create_custom_user_mock.called)
  778. self.assertFalse(write_property_mock.called)
  779. self.assertFalse(adjust_directory_permissions_mock.called)
  780. self.assertEqual(result, 1)
  781. get_YN_input_mock.reset_mock()
  782. create_custom_user_mock.reset_mock()
  783. write_property_mock.reset_mock()
  784. adjust_directory_permissions_mock.reset_mock()
  785. # Scenario: user is not defined and left to be root
  786. read_ambari_user_mock.return_value = None
  787. get_YN_input_mock.return_value = False
  788. result = ambari_server.check_ambari_user()
  789. self.assertTrue(get_YN_input_mock.called)
  790. self.assertFalse(create_custom_user_mock.called)
  791. self.assertTrue(write_property_mock.called)
  792. self.assertTrue(write_property_mock.call_args[0][1] == "root")
  793. self.assertTrue(adjust_directory_permissions_mock.called)
  794. self.assertEqual(result, 0)
  795. @patch.object(ambari_server, "search_file")
  796. @patch("__builtin__.open")
  797. @patch.object(ambari_server, "read_ambari_user")
  798. @patch.object(ambari_server, "set_file_permissions")
  799. def test_store_password_file(self, set_file_permissions_mock,
  800. read_ambari_user_mock, open_mock, search_file_mock):
  801. search_file_mock.return_value = "/etc/ambari-server/conf/ambari.properties"
  802. open_mock.return_value = MagicMock()
  803. ambari_server.store_password_file("password", "passfile")
  804. self.assertTrue(set_file_permissions_mock.called)
  805. @patch.object(ambari_server, "run_os_command")
  806. @patch.object(ambari_server, "print_warning_msg")
  807. @patch.object(ambari_server, "get_YN_input")
  808. def test_check_iptables_is_running(self, get_YN_input_mock, print_warning_msg, run_os_command_mock):
  809. run_os_command_mock.return_value = (0, "Table: filter", "")
  810. get_YN_input_mock.side_effect = [True]
  811. ambari_server.check_iptables()
  812. self.assertEqual(print_warning_msg.call_args_list[0][0][0],
  813. "iptables is running. Confirm the necessary Ambari ports are accessible. " +
  814. "Refer to the Ambari documentation for more details on ports."
  815. )
  816. @patch.object(ambari_server, "run_os_command")
  817. @patch.object(ambari_server, "print_warning_msg")
  818. def test_check_iptables_is_not_running(self, print_warning_msg, run_os_command_mock):
  819. run_os_command_mock.return_value = (3, "iptables: Firewall is not running.", "")
  820. ambari_server.check_iptables()
  821. self.assertFalse(print_warning_msg.called)
  822. def test_dlprogress(self):
  823. out = StringIO.StringIO()
  824. sys.stdout = out
  825. ambari_server.dlprogress("filename", 10, 2, 100)
  826. sys.stdout = sys.__stdout__
  827. self.assertNotEqual("", out.getvalue())
  828. @patch("urllib2.urlopen")
  829. @patch("__builtin__.open")
  830. @patch.object(ambari_server, "dlprogress")
  831. def test_track_jdk(self, dlprogress_mock, openMock, urlopenMock):
  832. u = MagicMock()
  833. u.info.return_value = {"Content-Length": "24576"}
  834. chunks = [None, "second", "first"]
  835. def side_effect(*args, **kwargs):
  836. return chunks.pop()
  837. u.read.side_effect = side_effect
  838. urlopenMock.return_value = u
  839. f = MagicMock()
  840. openMock.return_value = f
  841. ambari_server.track_jdk("base", "url", "local")
  842. self.assertEqual(0, len(chunks))
  843. self.assertTrue(f.write.called)
  844. self.assertTrue(f.flush.called)
  845. self.assertTrue(f.close.called)
  846. self.assertEqual(2, len(dlprogress_mock.call_args_list))
  847. @patch("shutil.copy")
  848. @patch("os.path.join")
  849. @patch("os.path.exists")
  850. @patch("os.path.isdir")
  851. @patch.object(ambari_server, "get_ambari_properties")
  852. def test_install_jce_manualy(self, get_ambari_properties_mock, \
  853. os_path_isdir_mock, os_path_exists_mock, os_path_join_mock, \
  854. shutil_copy_mock):
  855. args = MagicMock()
  856. args.jce_policy = "somewhere"
  857. p = MagicMock()
  858. get_ambari_properties_mock.return_value = p
  859. p.__getitem__.side_effect = None
  860. p.__getitem__.return_value = "somewhere"
  861. # Case when JCE path doesn't exists
  862. os_path_exists_mock.return_value = False
  863. try:
  864. ambari_server.install_jce_manualy(args)
  865. self.fail("Should throw exception")
  866. except FatalException as fe:
  867. # Expected
  868. self.assertTrue("JCE Policy path" in fe.reason)
  869. pass
  870. os_path_exists_mock.reset()
  871. # Case when JCE is a directory
  872. os_path_exists_mock.return_value = True
  873. os_path_isdir_mock.return_value = True
  874. try:
  875. ambari_server.install_jce_manualy(args)
  876. self.fail("Should throw exception")
  877. except FatalException as fe:
  878. # Expected
  879. self.assertTrue("JCE Policy path is a directory" in fe.reason)
  880. pass
  881. os_path_isdir_mock.reset()
  882. os_path_isdir_mock.return_value = False
  883. os_path_join_mock.return_value = \
  884. "/var/lib/ambari-server/resources/jce_policy-6.zip"
  885. ambari_server.install_jce_manualy(args)
  886. self.assertTrue(shutil_copy_mock.called)
  887. shutil_copy_mock.side_effect = Exception("exception")
  888. try:
  889. ambari_server.install_jce_manualy(args)
  890. self.fail("Should throw exception because of not found jce_policy-6.zip")
  891. except Exception:
  892. # Expected
  893. self.assertTrue(shutil_copy_mock.called)
  894. pass
  895. shutil_copy_mock.side_effect = None
  896. args.jce_policy = None
  897. ambari_server.install_jce_manualy(args)
  898. @patch.object(ambari_server, "get_validated_filepath_input")
  899. @patch.object(ambari_server, "run_os_command")
  900. @patch.object(ambari_server, "get_truststore_type")
  901. @patch("__builtin__.open")
  902. @patch.object(ambari_server, "find_properties_file")
  903. @patch.object(ambari_server, "run_component_https_cmd")
  904. @patch.object(ambari_server, "get_delete_cert_command")
  905. @patch.object(ambari_server, "get_truststore_password")
  906. @patch.object(ambari_server, "get_truststore_path")
  907. @patch.object(ambari_server, "get_YN_input")
  908. @patch.object(ambari_server, "get_ambari_properties")
  909. @patch.object(ambari_server, "find_jdk")
  910. def test_setup_component_https(self, find_jdk_mock, get_ambari_properties_mock, get_YN_input_mock,
  911. get_truststore_path_mock, get_truststore_password_mock,
  912. get_delete_cert_command_mock, run_component_https_cmd_mock,
  913. find_properties_file_mock, open_mock,
  914. get_truststore_type_mock, run_os_command_mock,
  915. get_validated_filepath_input_mock):
  916. out = StringIO.StringIO()
  917. sys.stdout = out
  918. component = "component"
  919. command = "command"
  920. property = "use_ssl"
  921. alias = "alias"
  922. #Silent mode
  923. ambari_server.SILENT = True
  924. ambari_server.setup_component_https(component, command, property, alias)
  925. self.assertEqual('command is not enabled in silent mode.\n', out.getvalue())
  926. sys.stdout = sys.__stdout__
  927. #Verbouse mode and jdk_path is None
  928. ambari_server.SILENT = False
  929. p = get_ambari_properties_mock.return_value
  930. # Use ssl
  931. p.get_property.side_effect = ["true"]
  932. # Dont disable ssl
  933. get_YN_input_mock.side_effect = [False]
  934. ambari_server.setup_component_https(component, command, property, alias)
  935. self.assertTrue(p.get_property.called)
  936. self.assertTrue(get_YN_input_mock.called)
  937. p.get_property.reset_mock()
  938. get_YN_input_mock.reset_mock()
  939. # Dont use ssl
  940. p.get_property.side_effect = ["false"]
  941. # Dont enable ssl
  942. get_YN_input_mock.side_effect = [False]
  943. ambari_server.setup_component_https(component, command, property, alias)
  944. self.assertTrue(p.get_property.called)
  945. self.assertTrue(get_YN_input_mock.called)
  946. p.get_property.reset_mock()
  947. get_YN_input_mock.reset_mock()
  948. # Cant find jdk
  949. find_jdk_mock.return_value = None
  950. try:
  951. ambari_server.setup_component_https(component, command, property, alias)
  952. self.fail("Should throw exception")
  953. except FatalException as fe:
  954. # Expected
  955. self.assertTrue('No JDK found, please run the "ambari-server setup" command to install a' +
  956. ' JDK automatically or install any JDK manually to ' in fe.reason)
  957. pass
  958. #Verbouse mode and jdk_path is not None (use_https = true)
  959. find_jdk_mock.return_value = "/jdk_path"
  960. p.get_property.side_effect = ["true"]
  961. get_YN_input_mock.side_effect = [True]
  962. get_truststore_path_mock.return_value = "/truststore_path"
  963. get_truststore_password_mock.return_value = "/truststore_password"
  964. get_delete_cert_command_mock.return_value = "rm -f"
  965. ambari_server.setup_component_https(component, command, property, alias)
  966. self.assertTrue(p.process_pair.called)
  967. self.assertTrue(get_truststore_path_mock.called)
  968. self.assertTrue(get_truststore_password_mock.called)
  969. self.assertTrue(get_delete_cert_command_mock.called)
  970. self.assertTrue(find_properties_file_mock.called)
  971. self.assertTrue(open_mock.called)
  972. self.assertTrue(p.store.called)
  973. self.assertTrue(run_component_https_cmd_mock.called)
  974. p.process_pair.reset_mock()
  975. get_truststore_path_mock.reset_mock()
  976. get_truststore_password_mock.reset_mock()
  977. get_delete_cert_command_mock.reset_mock()
  978. find_properties_file_mock.reset_mock()
  979. open_mock.reset_mock()
  980. p.store.reset_mock()
  981. #Verbouse mode and jdk_path is not None (use_https = false) and import cert
  982. p.get_property.side_effect = ["false"]
  983. get_YN_input_mock.side_effect = [True]
  984. ambari_server.setup_component_https(component, command, property, alias)
  985. self.assertTrue(p.process_pair.called)
  986. self.assertTrue(get_truststore_type_mock.called)
  987. self.assertTrue(get_truststore_path_mock.called)
  988. self.assertTrue(get_truststore_password_mock.called)
  989. self.assertTrue(get_delete_cert_command_mock.called)
  990. self.assertTrue(find_properties_file_mock.called)
  991. self.assertTrue(open_mock.called)
  992. self.assertTrue(p.store.called)
  993. self.assertTrue(run_component_https_cmd_mock.called)
  994. self.assertTrue(run_os_command_mock.called)
  995. self.assertTrue(get_validated_filepath_input_mock.called)
  996. p.process_pair.reset_mock()
  997. get_truststore_type_mock.reset_mock()
  998. get_truststore_path_mock.reset_mock()
  999. get_truststore_password_mock.reset_mock()
  1000. get_delete_cert_command_mock.reset_mock()
  1001. find_properties_file_mock.reset_mock()
  1002. open_mock.reset_mock()
  1003. p.store.reset_mock()
  1004. run_os_command_mock.reset_mock()
  1005. get_validated_filepath_input_mock.reset_mock()
  1006. @patch.object(ambari_server, 'adjust_directory_permissions')
  1007. @patch.object(ambari_server, 'read_ambari_user')
  1008. @patch.object(ambari_server, "get_validated_string_input")
  1009. @patch.object(ambari_server, "find_properties_file")
  1010. @patch.object(ambari_server, "get_ambari_properties")
  1011. @patch.object(ambari_server, "is_server_runing")
  1012. @patch.object(ambari_server, "import_cert_and_key_action")
  1013. @patch.object(ambari_server, "get_YN_input")
  1014. @patch("__builtin__.open")
  1015. @patch("ambari-server.Properties")
  1016. @patch.object(ambari_server, "is_root")
  1017. @patch.object(ambari_server, "is_valid_cert_host")
  1018. @patch.object(ambari_server, "is_valid_cert_exp")
  1019. def test_setup_https(self, is_valid_cert_exp_mock, is_valid_cert_host_mock, \
  1020. is_root_mock, Properties_mock, open_Mock, get_YN_input_mock, \
  1021. import_cert_and_key_action_mock,
  1022. is_server_runing_mock, get_ambari_properties_mock, \
  1023. find_properties_file_mock, \
  1024. get_validated_string_input_mock, read_ambari_user_method, \
  1025. adjust_directory_permissions_mock):
  1026. is_valid_cert_exp_mock.return_value = True
  1027. is_valid_cert_host_mock.return_value = True
  1028. args = MagicMock()
  1029. open_Mock.return_value = file
  1030. p = get_ambari_properties_mock.return_value
  1031. # Testing call under non-root
  1032. is_root_mock.return_value = False
  1033. try:
  1034. ambari_server.setup_https(args)
  1035. self.fail("Should throw exception")
  1036. except FatalException as fe:
  1037. # Expected
  1038. self.assertTrue("root-level" in fe.reason)
  1039. pass
  1040. # Testing call under root
  1041. is_root_mock.return_value = True
  1042. read_ambari_user_method.return_value = "user"
  1043. #Case #1: if client ssl is on and user didnt choose
  1044. #disable ssl option and choose import certs and keys
  1045. p.get_property.side_effect = ["key_dir", "5555", "6666", "true"]
  1046. get_YN_input_mock.side_effect = [False, True]
  1047. get_validated_string_input_mock.side_effect = ["4444"]
  1048. get_property_expected = "[call('security.server.keys_dir'),\n" + \
  1049. " call('client.api.ssl.port'),\n" + \
  1050. " call('client.api.ssl.port'),\n call('api.ssl')]"
  1051. process_pair_expected = "[call('client.api.ssl.port', '4444')]"
  1052. ambari_server.SILENT = False
  1053. ambari_server.setup_https(args)
  1054. self.assertTrue(p.process_pair.called)
  1055. self.assertTrue(p.get_property.call_count == 4)
  1056. self.assertEqual(str(p.get_property.call_args_list), get_property_expected)
  1057. self.assertEqual(str(p.process_pair.call_args_list), process_pair_expected)
  1058. self.assertTrue(p.store.called)
  1059. self.assertTrue(import_cert_and_key_action_mock.called)
  1060. p.process_pair.reset_mock()
  1061. p.get_property.reset_mock()
  1062. p.store.reset_mock()
  1063. import_cert_and_key_action_mock.reset_mock()
  1064. #Case #2: if client ssl is on and user choose to disable ssl option
  1065. p.get_property.side_effect = ["key_dir", "", "true"]
  1066. get_YN_input_mock.side_effect = [True]
  1067. get_validated_string_input_mock.side_effect = ["4444"]
  1068. get_property_expected = "[call('security.server.keys_dir'),\n" + \
  1069. " call('client.api.ssl.port'),\n call('api.ssl')]"
  1070. process_pair_expected = "[call('api.ssl', 'false')]"
  1071. ambari_server.setup_https(args)
  1072. self.assertTrue(p.process_pair.called)
  1073. self.assertTrue(p.get_property.call_count == 3)
  1074. self.assertEqual(str(p.get_property.call_args_list), get_property_expected)
  1075. self.assertEqual(str(p.process_pair.call_args_list), process_pair_expected)
  1076. self.assertTrue(p.store.called)
  1077. self.assertFalse(import_cert_and_key_action_mock.called)
  1078. p.process_pair.reset_mock()
  1079. p.get_property.reset_mock()
  1080. p.store.reset_mock()
  1081. import_cert_and_key_action_mock.reset_mock()
  1082. #Case #3: if client ssl is off and user choose option
  1083. #to import cert and keys
  1084. p.get_property.side_effect = ["key_dir", "", None]
  1085. get_YN_input_mock.side_effect = [True, True]
  1086. get_validated_string_input_mock.side_effect = ["4444"]
  1087. get_property_expected = "[call('security.server.keys_dir'),\n" + \
  1088. " call('client.api.ssl.port'),\n call('api.ssl')]"
  1089. process_pair_expected = "[call('client.api.ssl.port', '4444')]"
  1090. ambari_server.setup_https(args)
  1091. self.assertTrue(p.process_pair.called)
  1092. self.assertTrue(p.get_property.call_count == 3)
  1093. self.assertEqual(str(p.get_property.call_args_list), get_property_expected)
  1094. self.assertEqual(str(p.process_pair.call_args_list), process_pair_expected)
  1095. self.assertTrue(p.store.called)
  1096. self.assertTrue(import_cert_and_key_action_mock.called)
  1097. p.process_pair.reset_mock()
  1098. p.get_property.reset_mock()
  1099. p.store.reset_mock()
  1100. import_cert_and_key_action_mock.reset_mock()
  1101. #Case #4: if client ssl is off and
  1102. #user did not choose option to import cert and keys
  1103. p.get_property.side_effect = ["key_dir", "", None]
  1104. get_YN_input_mock.side_effect = [False]
  1105. get_validated_string_input_mock.side_effect = ["4444"]
  1106. get_property_expected = "[call('security.server.keys_dir'),\n" + \
  1107. " call('client.api.ssl.port'),\n call('api.ssl')]"
  1108. process_pair_expected = "[]"
  1109. ambari_server.setup_https(args)
  1110. self.assertFalse(p.process_pair.called)
  1111. self.assertTrue(p.get_property.call_count == 3)
  1112. self.assertEqual(str(p.get_property.call_args_list), get_property_expected)
  1113. self.assertEqual(str(p.process_pair.call_args_list), process_pair_expected)
  1114. self.assertFalse(p.store.called)
  1115. self.assertFalse(import_cert_and_key_action_mock.called)
  1116. p.process_pair.reset_mock()
  1117. p.get_property.reset_mock()
  1118. p.store.reset_mock()
  1119. import_cert_and_key_action_mock.reset_mock()
  1120. #Case #5: if cert must be imported but didnt imported
  1121. p.get_property.side_effect = ["key_dir", "", "false"]
  1122. get_YN_input_mock.side_effect = [True]
  1123. import_cert_and_key_action_mock.side_effect = [False]
  1124. get_validated_string_input_mock.side_effect = ["4444"]
  1125. get_property_expected = "[call('security.server.keys_dir'),\n" + \
  1126. " call('client.api.ssl.port'),\n call('api.ssl')]"
  1127. process_pair_expected = "[call('client.api.ssl.port', '4444')]"
  1128. self.assertFalse(ambari_server.setup_https(args))
  1129. self.assertTrue(p.process_pair.called)
  1130. self.assertTrue(p.get_property.call_count == 3)
  1131. self.assertEqual(str(p.get_property.call_args_list), get_property_expected)
  1132. self.assertEqual(str(p.process_pair.call_args_list), process_pair_expected)
  1133. self.assertFalse(p.store.called)
  1134. self.assertTrue(import_cert_and_key_action_mock.called)
  1135. p.process_pair.reset_mock()
  1136. p.get_property.reset_mock()
  1137. p.store.reset_mock()
  1138. import_cert_and_key_action_mock.reset_mock()
  1139. #Case #6: if silent mode is enabled
  1140. ambari_server.SILENT = True
  1141. try:
  1142. ambari_server.setup_https(args)
  1143. self.fail("Should throw exception")
  1144. except NonFatalException as fe:
  1145. self.assertTrue("setup-https is not enabled in silent mode" in fe.reason)
  1146. p.process_pair.reset_mock()
  1147. p.get_property.reset_mock()
  1148. p.store.reset_mock()
  1149. import_cert_and_key_action_mock.reset_mock()
  1150. #Case #7: read property throw exception
  1151. ambari_server.SILENT = False
  1152. find_properties_file_mock.return_value = "propertyFile"
  1153. p.get_property.side_effect = KeyError("Failed to read property")
  1154. try:
  1155. ambari_server.setup_https(args)
  1156. self.fail("Should throw exception")
  1157. except FatalException as fe:
  1158. self.assertTrue("Failed to read property" in fe.reason)
  1159. @patch.object(ambari_server, "import_cert_and_key")
  1160. def test_import_cert_and_key_action(self, import_cert_and_key_mock):
  1161. import_cert_and_key_mock.return_value = True
  1162. properties = MagicMock()
  1163. properties.get_property.side_effect = ["key_dir", "5555", "6666", "true"]
  1164. properties.process_pair = MagicMock()
  1165. expect_process_pair = "[call('client.api.ssl.cert_name', 'https.crt'),\n" + \
  1166. " call('client.api.ssl.key_name', 'https.key'),\n" + \
  1167. " call('api.ssl', 'true')]"
  1168. ambari_server.import_cert_and_key_action("key_dir", properties)
  1169. self.assertEqual(str(properties.process_pair.call_args_list), \
  1170. expect_process_pair)
  1171. @patch.object(ambari_server, "remove_file")
  1172. @patch.object(ambari_server, "copy_file")
  1173. @patch.object(ambari_server, "read_ambari_user")
  1174. @patch.object(ambari_server, "set_file_permissions")
  1175. @patch.object(ambari_server, "import_file_to_keystore")
  1176. @patch("__builtin__.open")
  1177. @patch.object(ambari_server, "run_os_command")
  1178. @patch("os.path.join")
  1179. @patch.object(ambari_server, "get_validated_filepath_input")
  1180. @patch.object(ambari_server, "get_validated_string_input")
  1181. @patch.object(ambari_server, "is_valid_cert_host")
  1182. @patch.object(ambari_server, "is_valid_cert_exp")
  1183. def test_import_cert_and_key(self, is_valid_cert_exp_mock, \
  1184. is_valid_cert_host_mock, \
  1185. get_validated_string_input_mock, \
  1186. get_validated_filepath_input_mock, \
  1187. os_path_join_mock, run_os_command_mock, \
  1188. open_mock, import_file_to_keystore_mock, \
  1189. set_file_permissions_mock, read_ambari_user_mock, copy_file_mock, \
  1190. remove_file_mock):
  1191. is_valid_cert_exp_mock.return_value = True
  1192. is_valid_cert_host_mock.return_value = True
  1193. get_validated_string_input_mock.return_value = "password"
  1194. get_validated_filepath_input_mock.side_effect = \
  1195. ["cert_file_path", "key_file_path"]
  1196. os_path_join_mock.side_effect = ["keystore_file_path", "keystore_file_path_tmp", \
  1197. "pass_file_path", "pass_file_path_tmp", \
  1198. "passin_file_path", "password_file_path", \
  1199. "keystore_cert_file_path", \
  1200. "keystore_cert_key_file_path", ]
  1201. run_os_command_mock.return_value = (0, "", "")
  1202. om = open_mock.return_value
  1203. expect_import_file_to_keystore = "[call('keystore_file_path_tmp'," + \
  1204. " 'keystore_file_path'),\n" + \
  1205. " call('pass_file_path_tmp'," + \
  1206. " 'pass_file_path'),\n" + \
  1207. " call('cert_file_path'," + \
  1208. " 'keystore_cert_file_path'),\n" + \
  1209. " call('key_file_path'," + \
  1210. " 'keystore_cert_key_file_path')]"
  1211. ambari_server.import_cert_and_key("key_dir")
  1212. self.assertTrue(get_validated_filepath_input_mock.call_count == 2)
  1213. self.assertTrue(get_validated_string_input_mock.called)
  1214. self.assertEqual(os_path_join_mock.call_count, 8)
  1215. self.assertTrue(set_file_permissions_mock.call_count == 1)
  1216. self.assertEqual(str(import_file_to_keystore_mock.call_args_list), \
  1217. expect_import_file_to_keystore)
  1218. @patch.object(ambari_server, "remove_file")
  1219. @patch.object(ambari_server, "copy_file")
  1220. @patch.object(ambari_server, "generate_random_string")
  1221. @patch.object(ambari_server, "read_ambari_user")
  1222. @patch.object(ambari_server, "set_file_permissions")
  1223. @patch.object(ambari_server, "import_file_to_keystore")
  1224. @patch("__builtin__.open")
  1225. @patch.object(ambari_server, "run_os_command")
  1226. @patch("os.path.join")
  1227. @patch.object(ambari_server, "get_validated_filepath_input")
  1228. @patch.object(ambari_server, "get_validated_string_input")
  1229. @patch.object(ambari_server, "is_valid_cert_host")
  1230. @patch.object(ambari_server, "is_valid_cert_exp")
  1231. def test_import_cert_and_key_with_empty_password(self, \
  1232. is_valid_cert_exp_mock, is_valid_cert_host_mock,
  1233. get_validated_string_input_mock, get_validated_filepath_input_mock, \
  1234. os_path_join_mock, run_os_command_mock, open_mock, \
  1235. import_file_to_keystore_mock, set_file_permissions_mock,
  1236. read_ambari_user_mock, generate_random_string_mock, copy_file_mock, \
  1237. remove_file_mock):
  1238. is_valid_cert_exp_mock.return_value = True
  1239. is_valid_cert_host_mock.return_value = True
  1240. get_validated_string_input_mock.return_value = ""
  1241. get_validated_filepath_input_mock.side_effect = \
  1242. ["cert_file_path", "key_file_path"]
  1243. os_path_join_mock.side_effect = ["keystore_file_path", "keystore_file_path_tmp", \
  1244. "pass_file_path", "pass_file_path_tmp", \
  1245. "passin_file_path", "password_file_path", \
  1246. "keystore_cert_file_path", \
  1247. "keystore_cert_key_file_path", ]
  1248. run_os_command_mock.return_value = (0, "", "")
  1249. expect_import_file_to_keystore = "[call('keystore_file_path_tmp'," + \
  1250. " 'keystore_file_path'),\n" + \
  1251. " call('pass_file_path_tmp'," + \
  1252. " 'pass_file_path'),\n" + \
  1253. " call('cert_file_path'," + \
  1254. " 'keystore_cert_file_path'),\n" + \
  1255. " call('key_file_path.secured'," + \
  1256. " 'keystore_cert_key_file_path')]"
  1257. ambari_server.import_cert_and_key("key_dir")
  1258. self.assertEquals(get_validated_filepath_input_mock.call_count, 2)
  1259. self.assertTrue(get_validated_string_input_mock.called)
  1260. self.assertEquals(os_path_join_mock.call_count, 8)
  1261. self.assertEquals(set_file_permissions_mock.call_count, 1)
  1262. self.assertEqual(str(import_file_to_keystore_mock.call_args_list), \
  1263. expect_import_file_to_keystore)
  1264. self.assertTrue(generate_random_string_mock.called)
  1265. @patch("__builtin__.open")
  1266. @patch.object(ambari_server, "copy_file")
  1267. @patch.object(ambari_server, "is_root")
  1268. @patch.object(ambari_server, "read_ambari_user")
  1269. @patch.object(ambari_server, "set_file_permissions")
  1270. @patch.object(ambari_server, "import_file_to_keystore")
  1271. @patch.object(ambari_server, "run_os_command")
  1272. @patch("os.path.join")
  1273. @patch.object(ambari_server, "get_validated_filepath_input")
  1274. @patch.object(ambari_server, "get_validated_string_input")
  1275. def test_import_cert_and_key_with_incorrect_password(self,
  1276. get_validated_string_input_mock, \
  1277. get_validated_filepath_input_mock, \
  1278. os_path_join_mock, \
  1279. run_os_command_mock, \
  1280. import_file_to_keystore_mock, \
  1281. set_file_permissions_mock, \
  1282. read_ambari_user_mock, \
  1283. is_root_mock, \
  1284. copy_file_mock, \
  1285. open_mock):
  1286. get_validated_string_input_mock.return_value = "incorrect_password"
  1287. get_validated_filepath_input_mock.return_value = 'filename'
  1288. open_mock.return_value = MagicMock()
  1289. os_path_join_mock.return_value = ''
  1290. is_root_mock.return_value = True
  1291. #provided password doesn't match, openssl command returns an error
  1292. run_os_command_mock.return_value = (1, "", "Some error message")
  1293. self.assertFalse(ambari_server.import_cert_and_key_action(*["key_dir", None]))
  1294. self.assertFalse(ambari_server.import_cert_and_key("key_dir"))
  1295. def test_is_valid_cert_exp(self):
  1296. #No data in certInfo
  1297. certInfo = {}
  1298. is_valid = ambari_server.is_valid_cert_exp(certInfo)
  1299. self.assertFalse(is_valid)
  1300. #Issued in future
  1301. issuedOn = (datetime.datetime.now() + datetime.timedelta(hours=1000)).strftime(ambari_server.SSL_DATE_FORMAT)
  1302. expiresOn = (datetime.datetime.now() + datetime.timedelta(hours=2000)).strftime(ambari_server.SSL_DATE_FORMAT)
  1303. certInfo = {ambari_server.NOT_BEFORE_ATTR: issuedOn,
  1304. ambari_server.NOT_AFTER_ATTR: expiresOn}
  1305. is_valid = ambari_server.is_valid_cert_exp(certInfo)
  1306. self.assertFalse(is_valid)
  1307. #Was expired
  1308. issuedOn = (datetime.datetime.now() - datetime.timedelta(hours=2000)).strftime(ambari_server.SSL_DATE_FORMAT)
  1309. expiresOn = (datetime.datetime.now() - datetime.timedelta(hours=1000)).strftime(ambari_server.SSL_DATE_FORMAT)
  1310. certInfo = {ambari_server.NOT_BEFORE_ATTR: issuedOn,
  1311. ambari_server.NOT_AFTER_ATTR: expiresOn}
  1312. is_valid = ambari_server.is_valid_cert_exp(certInfo)
  1313. self.assertFalse(is_valid)
  1314. #Valid
  1315. issuedOn = (datetime.datetime.now() - datetime.timedelta(hours=2000)).strftime(ambari_server.SSL_DATE_FORMAT)
  1316. expiresOn = (datetime.datetime.now() + datetime.timedelta(hours=1000)).strftime(ambari_server.SSL_DATE_FORMAT)
  1317. certInfo = {ambari_server.NOT_BEFORE_ATTR: issuedOn,
  1318. ambari_server.NOT_AFTER_ATTR: expiresOn}
  1319. is_valid = ambari_server.is_valid_cert_exp(certInfo)
  1320. self.assertTrue(is_valid)
  1321. @patch.object(ambari_server, "get_fqdn")
  1322. def test_is_valid_cert_host(self, get_fqdn_mock):
  1323. #No data in certInfo
  1324. certInfo = {}
  1325. is_valid = ambari_server.is_valid_cert_host(certInfo)
  1326. self.assertFalse(is_valid)
  1327. #Failed to get FQDN
  1328. get_fqdn_mock.return_value = None
  1329. is_valid = ambari_server.is_valid_cert_host(certInfo)
  1330. self.assertFalse(is_valid)
  1331. #FQDN and Common name in certificated don't correspond
  1332. get_fqdn_mock.return_value = 'host1'
  1333. certInfo = {ambari_server.COMMON_NAME_ATTR: 'host2'}
  1334. is_valid = ambari_server.is_valid_cert_host(certInfo)
  1335. self.assertFalse(is_valid)
  1336. #FQDN and Common name in certificated correspond
  1337. get_fqdn_mock.return_value = 'host1'
  1338. certInfo = {ambari_server.COMMON_NAME_ATTR: 'host1'}
  1339. is_valid = ambari_server.is_valid_cert_host(certInfo)
  1340. self.assertTrue(is_valid)
  1341. @patch.object(ambari_server, "get_ambari_properties")
  1342. def test_is_valid_https_port(self, get_ambari_properties_mock):
  1343. #No ambari.properties
  1344. get_ambari_properties_mock.return_value = -1
  1345. is_valid = ambari_server.is_valid_https_port(1111)
  1346. self.assertEqual(is_valid, False)
  1347. #User entered port used by one way auth
  1348. portOneWay = "1111"
  1349. portTwoWay = "2222"
  1350. validPort = "3333"
  1351. get_ambari_properties_mock.return_value = {ambari_server.SRVR_ONE_WAY_SSL_PORT_PROPERTY: portOneWay,
  1352. ambari_server.SRVR_TWO_WAY_SSL_PORT_PROPERTY: portTwoWay}
  1353. is_valid = ambari_server.is_valid_https_port(portOneWay)
  1354. self.assertEqual(is_valid, False)
  1355. #User entered port used by two way auth
  1356. is_valid = ambari_server.is_valid_https_port(portTwoWay)
  1357. self.assertEqual(is_valid, False)
  1358. #User entered valid port
  1359. get_ambari_properties_mock.return_value = {ambari_server.SRVR_ONE_WAY_SSL_PORT_PROPERTY: portOneWay,
  1360. ambari_server.SRVR_TWO_WAY_SSL_PORT_PROPERTY: portTwoWay}
  1361. is_valid = ambari_server.is_valid_https_port(validPort)
  1362. self.assertEqual(is_valid, True)
  1363. @patch("socket.getfqdn")
  1364. @patch("urllib2.urlopen")
  1365. @patch.object(ambari_server, "get_ambari_properties")
  1366. def test_get_fqdn(self, get_ambari_properties_mock, url_open_mock, getfqdn_mock):
  1367. #No ambari.properties
  1368. get_ambari_properties_mock.return_value = -1
  1369. fqdn = ambari_server.get_fqdn()
  1370. self.assertEqual(fqdn, None)
  1371. #Check mbari_server.GET_FQDN_SERVICE_URL property name (AMBARI-2612)
  1372. #property name should be server.fqdn.service.url
  1373. self.assertEqual(ambari_server.GET_FQDN_SERVICE_URL, "server.fqdn.service.url")
  1374. #Read FQDN from service
  1375. p = MagicMock()
  1376. p[ambari_server.GET_FQDN_SERVICE_URL] = 'someurl'
  1377. get_ambari_properties_mock.return_value = p
  1378. u = MagicMock()
  1379. host = 'host1.domain.com'
  1380. u.read.return_value = host
  1381. url_open_mock.return_value = u
  1382. fqdn = ambari_server.get_fqdn()
  1383. self.assertEqual(fqdn, host)
  1384. #Failed to read FQDN from service, getting from socket
  1385. u.reset_mock()
  1386. u.side_effect = Exception("Failed to read FQDN from service")
  1387. getfqdn_mock.return_value = host
  1388. fqdn = ambari_server.get_fqdn()
  1389. self.assertEqual(fqdn, host)
  1390. @patch.object(ambari_server, "run_os_command")
  1391. def test_get_cert_info(self, run_os_command_mock):
  1392. # Error running openssl command
  1393. path = 'path/to/certificate'
  1394. run_os_command_mock.return_value = -1, None, None
  1395. cert_info = ambari_server.get_cert_info(path)
  1396. self.assertEqual(cert_info, None)
  1397. #Empty result of openssl command
  1398. run_os_command_mock.return_value = 0, None, None
  1399. cert_info = ambari_server.get_cert_info(path)
  1400. self.assertEqual(cert_info, None)
  1401. #Positive scenario
  1402. notAfter = 'Jul 3 14:12:57 2014 GMT'
  1403. notBefore = 'Jul 3 14:12:57 2013 GMT'
  1404. attr1_key = 'A'
  1405. attr1_value = 'foo'
  1406. attr2_key = 'B'
  1407. attr2_value = 'bar'
  1408. attr3_key = 'CN'
  1409. attr3_value = 'host.domain.com'
  1410. subject_pattern = '/{attr1_key}={attr1_value}/{attr2_key}={attr2_value}/{attr3_key}={attr3_value}'
  1411. subject = subject_pattern.format(attr1_key=attr1_key, attr1_value=attr1_value,
  1412. attr2_key=attr2_key, attr2_value=attr2_value,
  1413. attr3_key=attr3_key, attr3_value=attr3_value)
  1414. out_pattern = """
  1415. notAfter={notAfter}
  1416. notBefore={notBefore}
  1417. subject={subject}
  1418. -----BEGIN CERTIFICATE-----
  1419. MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
  1420. ...
  1421. 5lqd8XxOGSYoMOf+70BLN2sB
  1422. -----END CERTIFICATE-----
  1423. """
  1424. out = out_pattern.format(notAfter=notAfter, notBefore=notBefore, subject=subject)
  1425. run_os_command_mock.return_value = 0, out, None
  1426. cert_info = ambari_server.get_cert_info(path)
  1427. self.assertEqual(cert_info['notAfter'], notAfter)
  1428. self.assertEqual(cert_info['notBefore'], notBefore)
  1429. self.assertEqual(cert_info['subject'], subject)
  1430. self.assertEqual(cert_info[attr1_key], attr1_value)
  1431. self.assertEqual(cert_info[attr2_key], attr2_value)
  1432. self.assertEqual(cert_info[attr3_key], attr3_value)
  1433. @patch('__builtin__.raw_input')
  1434. def test_get_validated_string_input(self, raw_input_mock):
  1435. prompt = 'prompt'
  1436. default_value = 'default'
  1437. description = 'desc'
  1438. validator = MagicMock()
  1439. validator.return_value = True
  1440. inputed_value1 = 'val1'
  1441. inputed_value2 = 'val2'
  1442. raw_input_mock.return_value = inputed_value1
  1443. input = ambari_server.get_validated_string_input(prompt, default_value, None,
  1444. description, False, False, validator)
  1445. self.assertTrue(validator.called)
  1446. self.assertEqual(inputed_value1, input)
  1447. validator.side_effect = [False, True]
  1448. raw_input_mock.side_effect = [inputed_value1, inputed_value2]
  1449. input = ambari_server.get_validated_string_input(prompt, default_value, None,
  1450. description, False, False, validator)
  1451. self.assertEqual(inputed_value2, input)
  1452. @patch.object(ambari_server, "run_os_command")
  1453. @patch("__builtin__.open")
  1454. @patch("os.path.exists")
  1455. def test_is_server_runing(self, os_path_exists_mock, open_mock, \
  1456. run_os_command_mock):
  1457. os_path_exists_mock.return_value = True
  1458. f = open_mock.return_value
  1459. f.readline.return_value = "111"
  1460. run_os_command_mock.return_value = 0, "", ""
  1461. status, pid = ambari_server.is_server_runing()
  1462. self.assertTrue(status)
  1463. self.assertEqual(111, pid)
  1464. os_path_exists_mock.return_value = False
  1465. status, pid = ambari_server.is_server_runing()
  1466. self.assertFalse(status)
  1467. @patch.object(ambari_server, "run_os_command")
  1468. @patch("__builtin__.open")
  1469. @patch("os.path.exists")
  1470. def test_is_server_runing_bad_file(self, os_path_exists_mock, open_mock, \
  1471. run_os_command_mock):
  1472. os_path_exists_mock.return_value = True
  1473. f = open_mock.return_value
  1474. f.readline.return_value = "" # empty file content
  1475. run_os_command_mock.return_value = 0, "", ""
  1476. self.assertRaises(NonFatalException, ambari_server.is_server_runing)
  1477. open_mock.side_effect = IOError('[Errno 13] Permission denied: /var/run/ambari-server/ambari-server.pid')
  1478. self.assertRaises(FatalException, ambari_server.is_server_runing)
  1479. @patch("os.chdir")
  1480. @patch.object(ambari_server, "run_os_command")
  1481. def test_install_jdk(self, run_os_command_mock, os_chdir_mock):
  1482. run_os_command_mock.return_value = 1, "", ""
  1483. failed = False
  1484. try:
  1485. ambari_server.install_jdk(MagicMock())
  1486. self.fail("Exception was not rised!")
  1487. except FatalException:
  1488. failed = True
  1489. self.assertTrue(failed)
  1490. @patch("os.stat")
  1491. @patch("os.path.isfile")
  1492. @patch("os.path.exists")
  1493. @patch.object(ambari_server, "track_jdk")
  1494. @patch.object(ambari_server, "get_YN_input")
  1495. @patch.object(ambari_server, "run_os_command")
  1496. @patch.object(ambari_server, "write_property")
  1497. @patch.object(ambari_server, "print_info_msg")
  1498. @patch.object(ambari_server, "get_JAVA_HOME")
  1499. @patch.object(ambari_server, "get_ambari_properties")
  1500. @patch("shutil.copyfile")
  1501. @patch("sys.exit")
  1502. def test_download_jdk(self, exit_mock, copyfile_mock, get_ambari_properties_mock, get_JAVA_HOME_mock, \
  1503. print_info_msg_mock, write_property_mock, \
  1504. run_os_command_mock, get_YN_input_mock, track_jdk_mock,
  1505. path_existsMock, path_isfileMock, statMock):
  1506. args = MagicMock()
  1507. args.java_home = "somewhere"
  1508. path_existsMock.return_value = False
  1509. get_JAVA_HOME_mock.return_value = False
  1510. get_ambari_properties_mock.return_value = -1
  1511. # Test case: ambari.properties not found
  1512. try:
  1513. ambari_server.download_jdk(args)
  1514. self.fail("Should throw exception because of not found ambari.properties")
  1515. except FatalException:
  1516. # Expected
  1517. self.assertTrue(get_ambari_properties_mock.called)
  1518. pass
  1519. # Test case: JDK already exists
  1520. p = MagicMock()
  1521. get_ambari_properties_mock.return_value = p
  1522. p.__getitem__.return_value = "somewhere"
  1523. get_JAVA_HOME_mock.return_value = True
  1524. path_existsMock.side_effect = [True,False]
  1525. rcode = ambari_server.download_jdk(args)
  1526. self.assertEqual(0, rcode)
  1527. # Test case: java home setup
  1528. path_existsMock.side_effect = [True,False]
  1529. get_JAVA_HOME_mock.return_value = False
  1530. rcode = ambari_server.download_jdk(args)
  1531. self.assertEqual(0, rcode)
  1532. self.assertTrue(write_property_mock.called)
  1533. # Test case: JDK file does not exist, property not defined
  1534. path_existsMock.side_effect = None
  1535. path_existsMock.return_value = False
  1536. p = MagicMock()
  1537. get_ambari_properties_mock.return_value = p
  1538. p.__getitem__.side_effect = KeyError("test exception")
  1539. try:
  1540. ambari_server.download_jdk(args)
  1541. self.fail("Should throw exception")
  1542. except FatalException:
  1543. # Expected
  1544. pass
  1545. # Test case: JDK file does not exist, os command (curl) result does not
  1546. # contain Content-Length
  1547. p.__getitem__.return_value = "somewhere"
  1548. p.__getitem__.side_effect = None
  1549. path_existsMock.return_value = False
  1550. run_os_command_mock.return_value = (0, "Wrong out", None)
  1551. try:
  1552. ambari_server.download_jdk(args)
  1553. self.fail("Should throw exception")
  1554. except FatalException:
  1555. # Expected
  1556. pass
  1557. # Successful JDK download
  1558. ambari_server.JDK_INSTALL_DIR = os.getcwd()
  1559. run_os_command_mock.return_value = (0, "Creating jdk-1.2/jre"
  1560. "Content-Length: 32000\r\n"
  1561. , None)
  1562. statResult = MagicMock()
  1563. statResult.st_size = 32000
  1564. statMock.return_value = statResult
  1565. rcode = ambari_server.download_jdk(args)
  1566. self.assertEqual(0, rcode)
  1567. # Test case: not accept the license"
  1568. p.__getitem__.return_value = "somewhere"
  1569. p.__getitem__.side_effect = None
  1570. get_YN_input_mock.return_value = False
  1571. ambari_server.download_jdk(MagicMock())
  1572. self.assertTrue(exit_mock.called)
  1573. # Test case: JDK file does not exist, jdk-location argument passed
  1574. exit_mock.reset()
  1575. get_YN_input_mock.reset()
  1576. get_YN_input_mock.return_value = True
  1577. args.jdk_location = "/existing/jdk/file"
  1578. path_existsMock.side_effect = [False, False, True, False, False, False]
  1579. ambari_server.download_jdk(args)
  1580. self.assertTrue(copyfile_mock.called)
  1581. copyfile_mock.reset_mock()
  1582. # Negative test case: JDK file does not exist, jdk-location argument
  1583. # (non-accessible file) passed
  1584. p.__getitem__.return_value = "somewhere"
  1585. p.__getitem__.side_effect = None
  1586. args.jdk_location = "/existing/jdk/file"
  1587. path_existsMock.side_effect = [False, False, True, False, False, False]
  1588. def copyfile_side_effect(s, d):
  1589. raise Exception("TerribleException")
  1590. copyfile_mock.side_effect = copyfile_side_effect
  1591. try:
  1592. ambari_server.download_jdk(args)
  1593. self.fail("Should throw exception")
  1594. except FatalException:
  1595. # Expected
  1596. self.assertTrue(copyfile_mock.called)
  1597. copyfile_mock.reset_mock()
  1598. # Test case: jdk is already installed, ensure that JCE check is not skipped if -j option is not supplied.
  1599. p = MagicMock()
  1600. get_ambari_properties_mock.return_value = p
  1601. p.__getitem__.return_value = "somewhere"
  1602. get_JAVA_HOME_mock.return_value = True
  1603. path_existsMock.return_value = True
  1604. with patch.object(ambari_server, "download_jce_policy") as download_jce_policy_mock:
  1605. rcode = ambari_server.download_jdk(args)
  1606. self.assertTrue(download_jce_policy_mock.called)
  1607. # Test case: Update JAVA_HOME location using command: ambari-server setup -j %NEW_LOCATION%
  1608. write_property_mock.reset_mock()
  1609. args.java_home = "somewhere"
  1610. path_existsMock.return_value = True
  1611. path_existsMock.side_effect = [True,False]
  1612. get_JAVA_HOME_mock.return_value = True
  1613. ambari_server.download_jdk(args)
  1614. self.assertTrue(write_property_mock.called)
  1615. # Test case: Negative test case JAVA_HOME location should not be updated if -j option is supplied and
  1616. # jce_policy file already exists in resources dir.
  1617. write_property_mock.reset_mock()
  1618. args.java_home = "somewhere"
  1619. path_existsMock.side_effect = None
  1620. path_existsMock.return_value = True
  1621. get_JAVA_HOME_mock.return_value = True
  1622. try:
  1623. ambari_server.download_jdk(args)
  1624. self.fail("Should throw exception")
  1625. except FatalException as fe:
  1626. # Expected
  1627. self.assertFalse(write_property_mock.called)
  1628. pass
  1629. @patch.object(ambari_server, "run_os_command")
  1630. def test_get_postgre_status(self, run_os_command_mock):
  1631. run_os_command_mock.return_value = (1, "running", None)
  1632. result = ambari_server.get_postgre_status()
  1633. self.assertEqual("running", result)
  1634. run_os_command_mock.return_value = (1, "wrong", None)
  1635. result = ambari_server.get_postgre_status()
  1636. self.assertEqual(None, result)
  1637. @patch("time.sleep")
  1638. @patch("subprocess.Popen")
  1639. @patch.object(ambari_server, "run_os_command")
  1640. @patch.object(ambari_server, "get_postgre_status")
  1641. def test_check_postgre_up(self, get_postgre_status_mock, run_os_command_mock,
  1642. popen_mock, sleep_mock):
  1643. p = MagicMock()
  1644. p.poll.return_value = 0
  1645. popen_mock.return_value = p
  1646. run_os_command_mock.return_value = (0, None, None)
  1647. rcode = ambari_server.check_postgre_up()
  1648. self.assertEqual(0, rcode)
  1649. p.poll.return_value = 4
  1650. get_postgre_status_mock.return_value = None
  1651. rcode = ambari_server.check_postgre_up()
  1652. self.assertEqual(4, rcode)
  1653. @patch("platform.linux_distribution")
  1654. @patch("platform.system")
  1655. @patch.object(ambari_server, "print_info_msg")
  1656. @patch.object(ambari_server, "print_error_msg")
  1657. @patch.object(ambari_server, "get_ambari_properties")
  1658. @patch.object(ambari_server, "write_property")
  1659. @patch.object(ambari_server, "get_conf_dir")
  1660. def test_configure_os_settings(self, get_conf_dir_mock, write_property_mock, get_ambari_properties_mock,
  1661. print_error_msg_mock, print_info_msg_mock,
  1662. systemMock, distMock):
  1663. get_ambari_properties_mock.return_value = -1
  1664. rcode = ambari_server.configure_os_settings()
  1665. self.assertEqual(-1, rcode)
  1666. p = MagicMock()
  1667. p[ambari_server.OS_TYPE_PROPERTY] = 'somevalue'
  1668. get_ambari_properties_mock.return_value = p
  1669. rcode = ambari_server.configure_os_settings()
  1670. self.assertEqual(0, rcode)
  1671. p.__getitem__.return_value = ""
  1672. systemMock.return_value = "NonLinux"
  1673. rcode = ambari_server.configure_os_settings()
  1674. self.assertEqual(-1, rcode)
  1675. systemMock.return_value = "Linux"
  1676. distMock.return_value = ("CentOS", "6.3", None)
  1677. rcode = ambari_server.configure_os_settings()
  1678. self.assertEqual(0, rcode)
  1679. self.assertTrue(write_property_mock.called)
  1680. @patch("__builtin__.open")
  1681. @patch.object(ambari_server, "Properties")
  1682. @patch.object(ambari_server, "search_file")
  1683. @patch.object(ambari_server, "get_conf_dir")
  1684. def test_get_JAVA_HOME(self, get_conf_dir_mock, search_file_mock,
  1685. Properties_mock, openMock):
  1686. openMock.side_effect = Exception("exception")
  1687. result = ambari_server.get_JAVA_HOME()
  1688. self.assertEqual(None, result)
  1689. expected = os.path.dirname(__file__)
  1690. p = MagicMock()
  1691. p.__getitem__.return_value = expected
  1692. openMock.side_effect = None
  1693. Properties_mock.return_value = p
  1694. result = ambari_server.get_JAVA_HOME()
  1695. self.assertEqual(expected, result)
  1696. def test_prompt_db_properties_default(self):
  1697. args = MagicMock()
  1698. ambari_server.load_default_db_properties(args)
  1699. ambari_server.prompt_db_properties(args)
  1700. self.assertEqual(args.database, "postgres")
  1701. self.assertEqual(args.database_host, "localhost")
  1702. self.assertEqual(args.database_name, "ambari")
  1703. self.assertEqual(args.database_port, "5432")
  1704. @patch.object(ambari_server, "setup_master_key")
  1705. @patch.object(ambari_server, "read_password")
  1706. @patch.object(ambari_server, "get_validated_string_input")
  1707. @patch.object(ambari_server, "get_YN_input")
  1708. def test_prompt_db_properties_oracle_sname(self, gyni_mock, gvsi_mock, rp_mock, smk_mock):
  1709. ambari_server.PROMPT_DATABASE_OPTIONS = True
  1710. gyni_mock.return_value = True
  1711. list_of_return_values = ["ambari-server", "ambari", "1", "1521", "localhost", "2"]
  1712. def side_effect(*args, **kwargs):
  1713. return list_of_return_values.pop()
  1714. gvsi_mock.side_effect = side_effect
  1715. rp_mock.return_value = "password"
  1716. smk_mock.return_value = (None, False, True)
  1717. args = MagicMock()
  1718. ambari_server.load_default_db_properties(args)
  1719. ambari_server.prompt_db_properties(args)
  1720. self.assertEqual(args.database, "oracle")
  1721. self.assertEqual(args.database_port, "1521")
  1722. self.assertEqual(args.database_host, "localhost")
  1723. self.assertEqual(args.database_name, "ambari")
  1724. self.assertEqual(args.database_username, "ambari-server")
  1725. self.assertEqual(args.sid_or_sname, "sname")
  1726. @patch.object(ambari_server, "setup_master_key")
  1727. @patch.object(ambari_server, "read_password")
  1728. @patch.object(ambari_server, "get_validated_string_input")
  1729. @patch.object(ambari_server, "get_YN_input")
  1730. def test_prompt_db_properties_oracle_sid(self, gyni_mock, gvsi_mock, rp_mock, smk_mock):
  1731. ambari_server.PROMPT_DATABASE_OPTIONS = True
  1732. gyni_mock.return_value = True
  1733. list_of_return_values = ["ambari-server", "ambari", "2", "1521", "localhost", "2"]
  1734. def side_effect(*args, **kwargs):
  1735. return list_of_return_values.pop()
  1736. gvsi_mock.side_effect = side_effect
  1737. rp_mock.return_value = "password"
  1738. smk_mock.return_value = (None, False, True)
  1739. args = MagicMock()
  1740. ambari_server.load_default_db_properties(args)
  1741. ambari_server.prompt_db_properties(args)
  1742. self.assertEqual(args.database, "oracle")
  1743. self.assertEqual(args.database_port, "1521")
  1744. self.assertEqual(args.database_host, "localhost")
  1745. self.assertEqual(args.database_name, "ambari")
  1746. self.assertEqual(args.database_username, "ambari-server")
  1747. self.assertEqual(args.sid_or_sname, "sid")
  1748. @patch.object(ambari_server, "setup_master_key")
  1749. @patch.object(ambari_server, "read_password")
  1750. @patch.object(ambari_server, "get_validated_string_input")
  1751. @patch.object(ambari_server, "get_YN_input")
  1752. def test_prompt_db_properties_postgre_adv(self, gyni_mock, gvsi_mock, rp_mock, smk_mock):
  1753. ambari_server.PROMPT_DATABASE_OPTIONS = True
  1754. gyni_mock.return_value = True
  1755. list_of_return_values = ["ambari-server", "ambari", "1"]
  1756. def side_effect(*args, **kwargs):
  1757. return list_of_return_values.pop()
  1758. gvsi_mock.side_effect = side_effect
  1759. rp_mock.return_value = "password"
  1760. smk_mock.return_value = (None, False, True)
  1761. args = MagicMock()
  1762. ambari_server.load_default_db_properties(args)
  1763. ambari_server.prompt_db_properties(args)
  1764. self.assertEqual(args.database, "postgres")
  1765. self.assertEqual(args.database_port, "5432")
  1766. self.assertEqual(args.database_host, "localhost")
  1767. self.assertEqual(args.database_name, "ambari")
  1768. self.assertEqual(args.database_username, "ambari-server")
  1769. self.assertEqual(args.sid_or_sname, "sname")
  1770. @patch("glob.glob")
  1771. @patch.object(ambari_server, "get_JAVA_HOME")
  1772. def test_find_jdk(self, get_JAVA_HOME_mock, globMock):
  1773. get_JAVA_HOME_mock.return_value = "somewhere"
  1774. result = ambari_server.find_jdk()
  1775. self.assertEqual("somewhere", result)
  1776. get_JAVA_HOME_mock.return_value = None
  1777. globMock.return_value = []
  1778. result = ambari_server.find_jdk()
  1779. self.assertEqual(None, result)
  1780. globMock.return_value = ["one", "two"]
  1781. result = ambari_server.find_jdk()
  1782. self.assertNotEqual(None, result)
  1783. @patch("os.path.exists")
  1784. @patch.object(ambari_server, "remove_file")
  1785. @patch.object(ambari_server, "is_jdbc_user_changed")
  1786. @patch.object(ambari_server, 'verify_setup_allowed')
  1787. @patch.object(ambari_server, "get_YN_input")
  1788. @patch.object(ambari_server, "configure_os_settings")
  1789. @patch.object(ambari_server, "download_jdk")
  1790. @patch.object(ambari_server, "configure_postgres")
  1791. @patch.object(ambari_server, "setup_db")
  1792. @patch.object(ambari_server, "check_postgre_up")
  1793. @patch.object(ambari_server, "check_iptables")
  1794. @patch.object(ambari_server, "check_ambari_user")
  1795. @patch.object(ambari_server, "check_jdbc_drivers")
  1796. @patch.object(ambari_server, "check_selinux")
  1797. @patch.object(ambari_server, "setup_remote_db")
  1798. @patch.object(ambari_server, "store_remote_properties")
  1799. @patch.object(ambari_server, "is_local_database")
  1800. @patch.object(ambari_server, "store_local_properties")
  1801. @patch.object(ambari_server, "is_root")
  1802. def test_setup(self, is_root_mock, store_local_properties_mock, is_local_database_mock, store_remote_properties_mock,
  1803. setup_remote_db_mock, check_selinux_mock, check_jdbc_drivers_mock, check_ambari_user_mock,
  1804. check_iptables_mock, check_postgre_up_mock, setup_db_mock, configure_postgres_mock,
  1805. download_jdk_mock, configure_os_settings_mock, get_YN_input,
  1806. verify_setup_allowed_method, is_jdbc_user_changed_mock, remove_file_mock, exists_mock):
  1807. args = MagicMock()
  1808. failed = False
  1809. get_YN_input.return_value = False
  1810. verify_setup_allowed_method.return_value = 0
  1811. exists_mock.return_value = False
  1812. remove_file_mock.return_value = 0
  1813. def reset_mocks():
  1814. is_jdbc_user_changed_mock.reset_mock()
  1815. is_root_mock.reset_mock()
  1816. store_local_properties_mock.reset_mock()
  1817. store_remote_properties_mock.reset_mock()
  1818. is_local_database_mock.reset_mock()
  1819. setup_remote_db_mock.reset_mock()
  1820. check_selinux_mock.reset_mock()
  1821. check_jdbc_drivers_mock.reset_mock()
  1822. check_ambari_user_mock.reset_mock()
  1823. check_iptables_mock.reset_mock()
  1824. check_postgre_up_mock.reset_mock()
  1825. setup_db_mock.reset_mock()
  1826. configure_postgres_mock.reset_mock()
  1827. configure_os_settings_mock.reset_mock()
  1828. pass
  1829. # Testing call under non-root
  1830. is_root_mock.return_value = False
  1831. try:
  1832. ambari_server.setup(args)
  1833. self.fail("Should throw exception")
  1834. except FatalException as fe:
  1835. # Expected
  1836. self.assertTrue("root-level" in fe.reason)
  1837. pass
  1838. # Testing calls under root
  1839. # remote case
  1840. is_root_mock.return_value = True
  1841. check_selinux_mock.return_value = 0
  1842. check_ambari_user_mock.return_value = 0
  1843. check_jdbc_drivers_mock.return_value = 0
  1844. check_iptables_mock.return_value = (0, "other")
  1845. check_postgre_up_mock.return_value = 0
  1846. setup_db_mock.return_value = 0
  1847. setup_remote_db_mock.return_value = 0
  1848. is_local_database_mock.return_value = False
  1849. configure_postgres_mock.return_value = 0
  1850. download_jdk_mock.return_value = 0
  1851. configure_os_settings_mock.return_value = 0
  1852. store_remote_properties_mock.return_value = 0
  1853. store_local_properties_mock.return_value = 0
  1854. result = ambari_server.setup(args)
  1855. self.assertEqual(None, result)
  1856. self.assertTrue(check_ambari_user_mock.called)
  1857. self.assertEquals(True, store_remote_properties_mock.called)
  1858. self.assertEquals(False, store_local_properties_mock.called)
  1859. #Local case
  1860. reset_mocks()
  1861. is_local_database_mock.return_value = True
  1862. is_jdbc_user_changed_mock.return_value = False
  1863. try:
  1864. result = ambari_server.setup(args)
  1865. except FatalException:
  1866. self.fail("Setup should be successful")
  1867. self.assertEqual(None, result)
  1868. self.assertEquals(True, store_local_properties_mock.called)
  1869. self.assertEquals(False, store_remote_properties_mock.called)
  1870. self.assertEquals(True, is_jdbc_user_changed_mock.called)
  1871. self.assertEquals(False, remove_file_mock.called)
  1872. #if DB user name was changed
  1873. reset_mocks()
  1874. is_local_database_mock.return_value = True
  1875. is_jdbc_user_changed_mock.return_value = True
  1876. try:
  1877. result = ambari_server.setup(args)
  1878. except FatalException:
  1879. self.fail("Setup should be successful")
  1880. self.assertEqual(None, result)
  1881. self.assertEquals(True, store_local_properties_mock.called)
  1882. self.assertEquals(False, store_remote_properties_mock.called)
  1883. self.assertEquals(True, is_jdbc_user_changed_mock.called)
  1884. self.assertEquals(True, remove_file_mock.called)
  1885. #negative case
  1886. reset_mocks()
  1887. is_local_database_mock.return_value = False
  1888. setup_remote_db_mock.return_value = -1
  1889. try:
  1890. result = ambari_server.setup(args)
  1891. self.fail("Should throw exception")
  1892. except NonFatalException as fe:
  1893. self.assertTrue("cli was not found" in fe.reason)
  1894. @patch.object(ambari_server, "get_YN_input")
  1895. @patch.object(ambari_server, "setup_db")
  1896. @patch.object(ambari_server, "print_info_msg")
  1897. @patch.object(ambari_server, "run_os_command")
  1898. @patch.object(ambari_server, "configure_database_username_password")
  1899. @patch.object(ambari_server, "parse_properties_file")
  1900. @patch.object(ambari_server, "execute_remote_script")
  1901. @patch.object(ambari_server, "is_root")
  1902. @patch.object(ambari_server, "check_database_name_property")
  1903. def test_reset(self, check_database_name_property_mock, is_root_mock, execute_remote_script_mock,
  1904. parse_properties_file_mock, configure_database_username_password_mock,
  1905. run_os_command_mock, print_info_msg_mock,
  1906. setup_db_mock, get_YN_inputMock):
  1907. parse_properties_file_mock.return_value = 0
  1908. args = MagicMock()
  1909. args.persistence_type = "local"
  1910. get_YN_inputMock.return_value = False
  1911. # Testing call under non-root
  1912. is_root_mock.return_value = False
  1913. try:
  1914. ambari_server.reset(args)
  1915. self.fail("Should throw exception")
  1916. except FatalException as fe:
  1917. # Expected
  1918. self.assertTrue("root-level" in fe.reason)
  1919. pass
  1920. # Testing calls under root
  1921. is_root_mock.return_value = True
  1922. try:
  1923. ambari_server.reset(args)
  1924. self.fail("Should throw exception")
  1925. except FatalException as fe:
  1926. # Expected
  1927. self.assertFalse("root-level" in fe.reason)
  1928. pass
  1929. get_YN_inputMock.return_value = True
  1930. run_os_command_mock.return_value = (1, None, None)
  1931. try:
  1932. ambari_server.reset(args)
  1933. self.fail("Should throw exception")
  1934. except FatalException:
  1935. # Expected
  1936. pass
  1937. run_os_command_mock.return_value = (0, None, None)
  1938. ambari_server.reset(args)
  1939. self.assertTrue(setup_db_mock.called)
  1940. #remote db case
  1941. args.persistence_type = "remote"
  1942. execute_remote_script_mock.return_value = (0, None, None)
  1943. rcode = ambari_server.reset(args)
  1944. self.assertEqual(None, rcode)
  1945. self.assertTrue(execute_remote_script_mock.called)
  1946. @patch.object(ambari_server, "get_YN_input")
  1947. @patch("__builtin__.raw_input")
  1948. @patch.object(ambari_server, "is_root")
  1949. def test_reset_default(self, is_root_mock, raw_input_mock, get_YN_inputMock):
  1950. is_root_mock.return_value=True
  1951. get_YN_inputMock.return_value = False
  1952. raw_input_mock.return_value=""
  1953. args = MagicMock()
  1954. try:
  1955. ambari_server.reset(args)
  1956. self.fail("Should throw exception")
  1957. except FatalException as fe:
  1958. # Expected
  1959. self.assertTrue(fe.code == 1)
  1960. pass
  1961. pass
  1962. @patch.object(ambari_server, "setup_db")
  1963. @patch.object(ambari_server, "print_info_msg")
  1964. @patch.object(ambari_server, "run_os_command")
  1965. @patch.object(ambari_server, "parse_properties_file")
  1966. @patch.object(ambari_server, "is_root")
  1967. @patch.object(ambari_server, "check_database_name_property")
  1968. def test_silent_reset(self, check_database_name_property_mock, is_root_mock, parse_properties_file_mock,
  1969. run_os_command_mock, print_info_msg_mock,
  1970. setup_db_mock):
  1971. is_root_mock.return_value = True
  1972. args = MagicMock()
  1973. ambari_server.SILENT = True
  1974. self.assertTrue(ambari_server.SILENT)
  1975. run_os_command_mock.return_value = (0, None, None)
  1976. def signal_handler(signum, frame):
  1977. self.fail("Timed out!")
  1978. signal.signal(signal.SIGALRM, signal_handler)
  1979. signal.alarm(5)
  1980. rcode = ambari_server.reset(args)
  1981. signal.alarm(0)
  1982. self.assertEqual(None, rcode)
  1983. self.assertTrue(setup_db_mock.called)
  1984. @patch.object(ambari_server, 'is_server_runing')
  1985. @patch("os.chown")
  1986. @patch("pwd.getpwnam")
  1987. @patch.object(ambari_server, 'get_master_key_location')
  1988. @patch.object(ambari_server, 'save_master_key')
  1989. @patch('os.chmod', autospec=True)
  1990. @patch.object(ambari_server, 'get_validated_string_input')
  1991. @patch("os.environ")
  1992. @patch.object(ambari_server, "get_ambari_properties")
  1993. @patch("os.path.exists")
  1994. @patch("__builtin__.open")
  1995. @patch("subprocess.Popen")
  1996. @patch.object(ambari_server, "print_info_msg")
  1997. @patch.object(ambari_server, "search_file")
  1998. @patch.object(ambari_server, "find_jdk")
  1999. @patch.object(ambari_server, "print_error_msg")
  2000. @patch.object(ambari_server, "check_postgre_up")
  2001. @patch.object(ambari_server, "parse_properties_file")
  2002. @patch.object(ambari_server, "read_ambari_user")
  2003. @patch.object(ambari_server, "is_root")
  2004. @patch.object(ambari_server, "find_jdbc_driver")
  2005. @patch("getpass.getuser")
  2006. @patch("os.chdir")
  2007. def test_start(self, chdir_mock, getuser_mock, find_jdbc_driver_mock, is_root_mock, read_ambari_user_mock,
  2008. parse_properties_file_mock, check_postgre_up_mock,
  2009. print_error_msg_mock, find_jdk_mock, search_file_mock,
  2010. print_info_msg_mock, popenMock, openMock, pexistsMock,
  2011. get_ambari_properties_mock, os_environ_mock,
  2012. get_validated_string_input_method, os_chmod_method,
  2013. save_master_key_method, get_master_key_location_method,
  2014. getpwnam_mock, os_chown_mock, is_server_running_mock):
  2015. args = MagicMock()
  2016. f = MagicMock()
  2017. f.readline.return_value = 42
  2018. openMock.return_value = f
  2019. p = get_ambari_properties_mock.return_value
  2020. p.get_property.return_value = 'False'
  2021. search_file_mock.return_value = None
  2022. is_server_running_mock.return_value = (True, 123)
  2023. pw = MagicMock()
  2024. pw.setattr('pw_uid', 0)
  2025. pw.setattr('pw_gid', 0)
  2026. getpwnam_mock.return_value = pw
  2027. os_chown_mock.return_value = None
  2028. # Checking "server is running"
  2029. pexistsMock.return_value = True
  2030. try:
  2031. ambari_server.start(args)
  2032. self.fail("Should fail with 'Server is running'")
  2033. except FatalException:
  2034. # Expected
  2035. pass
  2036. parse_properties_file_mock.reset_mock()
  2037. pexistsMock.return_value = False
  2038. # Checking situation when ambari user is not set up
  2039. read_ambari_user_mock.return_value = None
  2040. try:
  2041. ambari_server.start(args)
  2042. self.fail("Should fail with 'Can not detect a system user for Ambari'")
  2043. except FatalException as e:
  2044. # Expected
  2045. self.assertTrue('Unable to detect a system user for Ambari Server.' in e.reason)
  2046. parse_properties_file_mock.reset_mock()
  2047. # Checking start from non-root when current user is not the same as a
  2048. # custom user
  2049. read_ambari_user_mock.return_value = "dummy-user"
  2050. getuser_mock.return_value = "non_custom_user"
  2051. is_root_mock.return_value = False
  2052. try:
  2053. ambari_server.start(args)
  2054. self.fail("Should fail with 'Can not start ambari-server as user...'")
  2055. except FatalException as e:
  2056. # Expected
  2057. self.assertTrue('Unable to start Ambari Server as user' in e.reason)
  2058. self.assertFalse(parse_properties_file_mock.called)
  2059. parse_properties_file_mock.reset_mock()
  2060. # Checking "jdk not found"
  2061. is_root_mock.return_value = True
  2062. find_jdk_mock.return_value = None
  2063. is_server_running_mock.return_value = (False, 0)
  2064. try:
  2065. ambari_server.start(args)
  2066. self.fail("Should fail with 'No JDK found'")
  2067. except FatalException as e:
  2068. # Expected
  2069. self.assertTrue('No JDK found' in e.reason)
  2070. find_jdk_mock.return_value = "somewhere"
  2071. parse_properties_file_mock.reset_mock()
  2072. ## Testing workflow under root
  2073. is_root_mock.return_value = True
  2074. # Remote DB
  2075. args.persistence_type = "remote"
  2076. args.database = "oracle"
  2077. # Case when jdbc driver is not used
  2078. find_jdbc_driver_mock.return_value = -1
  2079. try:
  2080. ambari_server.start(args)
  2081. self.fail("Should fail with exception")
  2082. except FatalException as e:
  2083. self.assertTrue('Before starting Ambari Server' in e.reason)
  2084. find_jdbc_driver_mock.reset_mock()
  2085. find_jdbc_driver_mock.return_value = 0
  2086. try:
  2087. ambari_server.start(args)
  2088. except FatalException as e:
  2089. # Ignored
  2090. pass
  2091. self.assertFalse('Unable to start PostgreSQL server' in e.reason)
  2092. self.assertFalse(check_postgre_up_mock.called)
  2093. check_postgre_up_mock.reset_mock()
  2094. parse_properties_file_mock.reset_mock()
  2095. # Local DB
  2096. args.persistence_type = "local"
  2097. # case: postgres failed to start
  2098. check_postgre_up_mock.return_value = 1
  2099. try:
  2100. ambari_server.start(args)
  2101. self.fail("Should fail with 'Unable to start PostgreSQL server'")
  2102. except FatalException as e:
  2103. # Expected
  2104. self.assertTrue('Unable to start PostgreSQL server' in e.reason)
  2105. self.assertTrue(check_postgre_up_mock.called)
  2106. parse_properties_file_mock.reset_mock()
  2107. check_postgre_up_mock.return_value = 0
  2108. # Case: custom user is "root"
  2109. read_ambari_user_mock.return_value = "root"
  2110. ambari_server.start(args)
  2111. self.assertTrue(popenMock.called)
  2112. popen_arg = popenMock.call_args[0][0]
  2113. self.assertTrue(popen_arg[0] == "/bin/sh")
  2114. popenMock.reset_mock()
  2115. parse_properties_file_mock.reset_mock()
  2116. # Case: custom user is not "root"
  2117. read_ambari_user_mock.return_value = "not-root-user"
  2118. ambari_server.start(args)
  2119. self.assertTrue(chdir_mock.called)
  2120. self.assertTrue(popenMock.called)
  2121. popen_arg = popenMock.call_args[0][0]
  2122. self.assertTrue(popen_arg[0] == "/bin/su")
  2123. check_postgre_up_mock.reset_mock()
  2124. popenMock.reset_mock()
  2125. parse_properties_file_mock.reset_mock()
  2126. ## Testing workflow under non-root
  2127. is_root_mock.return_value = False
  2128. read_ambari_user_mock.return_value = "not-root-user"
  2129. getuser_mock.return_value = read_ambari_user_mock.return_value
  2130. parse_properties_file_mock.reset_mock()
  2131. # Local DB
  2132. args.persistence_type = "local"
  2133. ambari_server.start(args)
  2134. self.assertFalse(check_postgre_up_mock.called)
  2135. parse_properties_file_mock.reset_mock()
  2136. # Remote DB
  2137. args.persistence_type = "remote"
  2138. ambari_server.start(args)
  2139. self.assertFalse(check_postgre_up_mock.called)
  2140. parse_properties_file_mock.reset_mock()
  2141. # Checking call
  2142. ambari_server.start(args)
  2143. self.assertTrue(popenMock.called)
  2144. popen_arg = popenMock.call_args[0][0]
  2145. self.assertTrue(popen_arg[0] == "/bin/sh")
  2146. parse_properties_file_mock.reset_mock()
  2147. # Test start under wrong user
  2148. read_ambari_user_mock.return_value = "not-root-user"
  2149. getuser_mock.return_value = "non_custom_user"
  2150. try:
  2151. ambari_server.start(args)
  2152. self.fail("Can not start ambari-server as user non_custom_user.")
  2153. except FatalException as e:
  2154. # Expected
  2155. self.assertTrue('Unable to start Ambari Server as user' in e.reason)
  2156. parse_properties_file_mock.reset_mock()
  2157. # Check environ master key is set
  2158. popenMock.reset_mock()
  2159. os_environ_mock.copy.return_value = {"a": "b",
  2160. ambari_server.SECURITY_KEY_ENV_VAR_NAME: "masterkey"}
  2161. args.persistence_type = "local"
  2162. read_ambari_user_mock.return_value = "root"
  2163. is_root_mock.return_value = True
  2164. ambari_server.start(args)
  2165. self.assertFalse(get_validated_string_input_method.called)
  2166. self.assertFalse(save_master_key_method.called)
  2167. popen_arg = popenMock.call_args[1]['env']
  2168. self.assertEquals(os_environ_mock.copy.return_value, popen_arg)
  2169. parse_properties_file_mock.reset_mock()
  2170. # Check environ master key is not set
  2171. popenMock.reset_mock()
  2172. os_environ_mock.reset_mock()
  2173. p.get_property.return_value = 'True'
  2174. os_environ_mock.copy.return_value = {"a": "b"}
  2175. args.persistence_type = "local"
  2176. read_ambari_user_mock.return_value = "root"
  2177. is_root_mock.return_value = True
  2178. get_validated_string_input_method.return_value = "masterkey"
  2179. os_chmod_method.return_value = None
  2180. ambari_server.start(args)
  2181. self.assertTrue(get_validated_string_input_method.called)
  2182. self.assertTrue(save_master_key_method.called)
  2183. popen_arg = popenMock.call_args[1]['env']
  2184. self.assertEquals(os_environ_mock.copy.return_value, popen_arg)
  2185. @patch.object(ambari_server, 'is_server_runing')
  2186. @patch("os.remove")
  2187. @patch("os.killpg")
  2188. @patch("os.getpgid")
  2189. @patch.object(ambari_server, "print_info_msg")
  2190. def test_stop(self, print_info_msg_mock, gpidMock, removeMock,
  2191. killMock, isServerRuningMock):
  2192. isServerRuningMock.return_value = (True, 123)
  2193. ambari_server.stop(None)
  2194. self.assertTrue(killMock.called)
  2195. self.assertTrue(removeMock.called)
  2196. @patch.object(ambari_server, "configure_database_username_password")
  2197. @patch.object(ambari_server, "run_os_command")
  2198. @patch.object(ambari_server, "is_root")
  2199. @patch.object(ambari_server, "check_database_name_property")
  2200. @patch.object(ambari_server, "parse_properties_file")
  2201. @patch.object(ambari_server, "get_db_cli_tool")
  2202. @patch.object(ambari_server, "remote_stack_upgrade")
  2203. def test_upgrade_stack(self, remote_stack_upgrade_mock, get_db_cli_tool_mock, parse_properties_file_mock,
  2204. check_database_name_property_mock, is_root_mock, run_os_command_mock,
  2205. configure_postgres_username_password_mock):
  2206. args = MagicMock()
  2207. args.persistence_type = "local"
  2208. # Testing call under non-root
  2209. is_root_mock.return_value = False
  2210. try:
  2211. ambari_server.upgrade_stack(args, 'HDP-2.0')
  2212. self.fail("Should throw exception")
  2213. except FatalException as fe:
  2214. # Expected
  2215. self.assertTrue("root-level" in fe.reason)
  2216. pass
  2217. # Testing calls under root
  2218. is_root_mock.return_value = True
  2219. run_os_command_mock.return_value = (0, '', '')
  2220. check_database_name_property_mock.return_value = 1
  2221. ambari_server.upgrade_stack(args, 'HDP-2.0')
  2222. self.assertTrue(configure_postgres_username_password_mock.called)
  2223. self.assertTrue(run_os_command_mock.called)
  2224. # Test remote
  2225. configure_postgres_username_password_mock.reset_mock()
  2226. run_os_command_mock.reset_mock()
  2227. args.persistence_type = "remote"
  2228. args.database = "oracle"
  2229. get_db_cli_tool_mock.return_value = "psql"
  2230. remote_stack_upgrade_mock.return_value = (0, "test", "test")
  2231. ambari_server.upgrade_stack(args, 'HDP-2.0')
  2232. self.assertTrue(get_db_cli_tool_mock.called)
  2233. self.assertTrue(remote_stack_upgrade_mock.called)
  2234. self.assertFalse(run_os_command_mock.called)
  2235. @patch("__builtin__.open")
  2236. @patch.object(ambari_server.Properties, "store")
  2237. @patch.object(ambari_server, "find_properties_file")
  2238. @patch.object(ambari_server, "adjust_directory_permissions")
  2239. @patch.object(ambari_server, "print_warning_msg")
  2240. @patch.object(ambari_server, "read_ambari_user")
  2241. @patch.object(ambari_server, "check_db_consistency")
  2242. @patch.object(ambari_server, "execute_db_script")
  2243. @patch.object(ambari_server, "check_postgre_up")
  2244. @patch.object(ambari_server, "update_ambari_properties")
  2245. @patch.object(ambari_server, "parse_properties_file")
  2246. @patch.object(ambari_server, "is_root")
  2247. @patch.object(ambari_server, "get_ambari_properties")
  2248. @patch.object(ambari_server, "get_db_cli_tool")
  2249. @patch.object(ambari_server, "execute_remote_script")
  2250. def test_upgrade(self, execute_remote_script_mock, get_db_cli_tool_mock, get_ambari_properties_mock, is_root_mock,
  2251. parse_properties_file_mock,
  2252. update_ambari_properties_mock,
  2253. check_postgre_up_mock, execute_db_script_mock,
  2254. check_db_consistency_mock, read_ambari_user_mock,
  2255. print_warning_msg_mock, adjust_directory_permissions_mock,
  2256. find_properties_file_mock, properties_store_mock, open_mock):
  2257. args = MagicMock()
  2258. check_database_name_property_mock = MagicMock()
  2259. args.upgrade_script_file = "/var/lib/" \
  2260. "ambari-server/resources/upgrade/ddl/" \
  2261. "Ambari-DDL-Postgres-UPGRADE-1.3.0.sql"
  2262. update_ambari_properties_mock.return_value = 0
  2263. check_postgre_up_mock.return_value = 0
  2264. execute_db_script_mock.return_value = 0
  2265. check_db_consistency_mock.return_value = 0
  2266. # Testing call under non-root
  2267. is_root_mock.return_value = False
  2268. try:
  2269. ambari_server.upgrade(args)
  2270. self.fail("Should throw exception")
  2271. except FatalException as fe:
  2272. # Expected
  2273. self.assertTrue("root-level" in fe.reason)
  2274. pass
  2275. # Testing calls under root
  2276. is_root_mock.return_value = True
  2277. # Testing with undefined custom user
  2278. read_ambari_user_mock.return_value = None
  2279. ambari_server.upgrade(args)
  2280. self.assertTrue(print_warning_msg_mock.called)
  2281. warning_args = print_warning_msg_mock.call_args[0][0]
  2282. self.assertTrue("custom ambari user" in warning_args)
  2283. # Testing with defined custom user
  2284. read_ambari_user_mock.return_value = "ambari-custom-user"
  2285. ambari_server.upgrade(args)
  2286. self.assertTrue(adjust_directory_permissions_mock.called)
  2287. # Test if check_database_name_property raise exception, added default
  2288. # JDBC_DATABASE_PROPERTY and upgrade process doesn't fails
  2289. def effect():
  2290. raise FatalException()
  2291. properties = ambari_server.Properties()
  2292. get_ambari_properties_mock.return_value = properties
  2293. check_database_name_property_mock.side_effect = effect
  2294. parse_properties_file_mock.called = False
  2295. retcode = ambari_server.upgrade(args)
  2296. self.assertTrue(get_ambari_properties_mock.called)
  2297. self.assertTrue(properties.get_property(ambari_server.JDBC_DATABASE_PROPERTY))
  2298. self.assertNotEqual(-1, retcode)
  2299. self.assertTrue(parse_properties_file_mock.called)
  2300. #Test remote upgrade
  2301. get_db_cli_tool_mock.return_value = "psql"
  2302. execute_remote_script_mock.return_value = (0, "test", "test")
  2303. args.persistence_type = "remote"
  2304. args.database = "oracle"
  2305. ambari_server.upgrade(args)
  2306. self.assertTrue(get_db_cli_tool_mock.called)
  2307. self.assertTrue(execute_remote_script_mock.called)
  2308. def test_print_info_msg(self):
  2309. out = StringIO.StringIO()
  2310. sys.stdout = out
  2311. ambari_server.VERBOSE = True
  2312. ambari_server.print_info_msg("msg")
  2313. self.assertNotEqual("", out.getvalue())
  2314. sys.stdout = sys.__stdout__
  2315. def test_print_error_msg(self):
  2316. out = StringIO.StringIO()
  2317. sys.stdout = out
  2318. ambari_server.VERBOSE = True
  2319. ambari_server.print_error_msg("msg")
  2320. self.assertNotEqual("", out.getvalue())
  2321. sys.stdout = sys.__stdout__
  2322. def test_print_warning_msg(self):
  2323. out = StringIO.StringIO()
  2324. sys.stdout = out
  2325. ambari_server.VERBOSE = True
  2326. ambari_server.print_warning_msg("msg")
  2327. self.assertNotEqual("", out.getvalue())
  2328. sys.stdout = sys.__stdout__
  2329. @patch.object(ambari_server, "get_choice_string_input")
  2330. def test_get_YN_input(self, get_choice_string_input_mock):
  2331. ambari_server.get_YN_input("prompt", "default")
  2332. self.assertTrue(get_choice_string_input_mock.called)
  2333. self.assertEqual(4, len(get_choice_string_input_mock.call_args_list[0][0]))
  2334. def test_load_default_db_properties(self):
  2335. args = MagicMock()
  2336. ambari_server.load_default_db_properties(args)
  2337. self.assertEquals(args.database, "postgres")
  2338. self.assertEquals(args.database_host, "localhost")
  2339. self.assertEquals(args.database_port, "5432")
  2340. self.assertEquals(args.database_name, "ambari")
  2341. self.assertEquals(args.database_username, "ambari")
  2342. self.assertEquals(args.database_password, "bigdata")
  2343. args = MagicMock()
  2344. ambari_server.DATABASE_INDEX = 1
  2345. ambari_server.load_default_db_properties(args)
  2346. self.assertEquals(args.database, "oracle")
  2347. self.assertEquals(args.database_port, "1521")
  2348. failed = False
  2349. args = MagicMock()
  2350. ambari_server.DATABASE_INDEX = 2
  2351. try:
  2352. ambari_server.load_default_db_properties(args)
  2353. except:
  2354. failed = True
  2355. self.assertTrue(failed)
  2356. pass
  2357. @patch.object(ambari_server, 'setup')
  2358. def test_main_db_options(self, setup_mock):
  2359. base_args = ["ambari-server.py", "setup"]
  2360. db_args = ["--database", "postgres", "--databasehost", "somehost.net", "--databaseport", "12345",
  2361. "--databasename", "ambari", "--databaseusername", "ambari", "--databasepassword", "bigdata"]
  2362. #test no args
  2363. failed = False
  2364. sys.argv = list(base_args)
  2365. try:
  2366. ambari_server.main()
  2367. except SystemExit:
  2368. failed = True
  2369. pass
  2370. self.assertFalse(failed)
  2371. self.assertTrue(setup_mock.called)
  2372. setup_mock.reset_mock()
  2373. #test full args
  2374. sys.argv = list(base_args)
  2375. sys.argv.extend(db_args)
  2376. try:
  2377. ambari_server.main()
  2378. except SystemExit:
  2379. failed = True
  2380. pass
  2381. self.assertTrue(ambari_server.PROMPT_DATABASE_OPTIONS)
  2382. self.assertFalse(failed)
  2383. self.assertTrue(setup_mock.called)
  2384. setup_mock.reset_mock()
  2385. #test not full args
  2386. sys.argv = list(base_args)
  2387. sys.argv.extend(["--database", "postgres"])
  2388. try:
  2389. ambari_server.main()
  2390. except SystemExit:
  2391. failed = True
  2392. pass
  2393. self.assertFalse(setup_mock.called)
  2394. self.assertTrue(failed)
  2395. setup_mock.reset_mock()
  2396. #test wrong database
  2397. failed = False
  2398. sys.argv = list(base_args)
  2399. sys.argv.extend(["--database", "unknown"])
  2400. sys.argv.extend(db_args[2:])
  2401. try:
  2402. ambari_server.main()
  2403. except SystemExit:
  2404. failed = True
  2405. pass
  2406. self.assertTrue(failed)
  2407. self.assertFalse(setup_mock.called)
  2408. setup_mock.reset_mock()
  2409. #test wrong port check
  2410. failed = False
  2411. sys.argv = list(base_args)
  2412. sys.argv.extend(["--databaseport", "unknown"])
  2413. sys.argv.extend(db_args[:4])
  2414. sys.argv.extend(db_args[6:])
  2415. try:
  2416. ambari_server.main()
  2417. except SystemExit:
  2418. failed = True
  2419. pass
  2420. self.assertTrue(failed)
  2421. self.assertFalse(setup_mock.called)
  2422. setup_mock.reset_mock()
  2423. pass
  2424. @patch.object(ambari_server, "load_default_db_properties")
  2425. @patch.object(ambari_server, "get_YN_input")
  2426. @patch.object(ambari_server, "get_validated_string_input")
  2427. @patch.object(ambari_server, "setup_master_key")
  2428. @patch.object(ambari_server, "configure_database_password")
  2429. def test_prompt_db_properties(self, configure_database_password_mock, setup_master_key_mock,
  2430. get_validated_string_input_mock, get_YN_input_mock, load_default_db_properties_mock):
  2431. args = MagicMock()
  2432. #test not prompt
  2433. ambari_server.PROMPT_DATABASE_OPTIONS = False
  2434. ambari_server.prompt_db_properties(args)
  2435. self.assertFalse(load_default_db_properties_mock.called)
  2436. self.assertFalse(get_validated_string_input_mock.called)
  2437. self.assertFalse(get_YN_input_mock.called)
  2438. load_default_db_properties_mock.reset_mock()
  2439. get_validated_string_input_mock.reset_mock()
  2440. get_YN_input_mock.reset_mock()
  2441. #test prompt
  2442. get_YN_input_mock.return_value = False
  2443. ambari_server.PROMPT_DATABASE_OPTIONS = True
  2444. ambari_server.prompt_db_properties(args)
  2445. self.assertTrue(get_YN_input_mock.called)
  2446. self.assertFalse(get_validated_string_input_mock.called)
  2447. self.assertTrue(load_default_db_properties_mock.called)
  2448. load_default_db_properties_mock.reset_mock()
  2449. get_validated_string_input_mock.reset_mock()
  2450. get_YN_input_mock.reset_mock()
  2451. #test prompt advanced
  2452. get_YN_input_mock.return_value = True
  2453. ambari_server.PROMPT_DATABASE_OPTIONS = True
  2454. setup_master_key_mock.return_value = (None, False, True)
  2455. configure_database_password_mock.return_value = ("test", None)
  2456. ambari_server.prompt_db_properties(args)
  2457. self.assertTrue(get_YN_input_mock.called)
  2458. self.assertTrue(get_validated_string_input_mock.called)
  2459. self.assertTrue(load_default_db_properties_mock.called)
  2460. self.assertEquals(args.database, "postgres")
  2461. load_default_db_properties_mock.reset_mock()
  2462. get_validated_string_input_mock.reset_mock()
  2463. get_YN_input_mock.reset_mock()
  2464. pass
  2465. @patch.object(ambari_server, "get_db_cli_tool")
  2466. @patch.object(ambari_server, "run_in_shell")
  2467. def test_execute_remote_script(self, run_in_shell_mock, get_db_cli_tool_mock):
  2468. args = MagicMock()
  2469. script = "script"
  2470. #success
  2471. run_in_shell_mock.return_value = (0, None, None)
  2472. get_db_cli_tool_mock.return_value = "tool"
  2473. args.database = "postgres"
  2474. args.database_password = "some_password"
  2475. retcode, out, err = ambari_server.execute_remote_script(args, script)
  2476. self.assertEquals(retcode, 0)
  2477. self.assertTrue(get_db_cli_tool_mock.called)
  2478. self.assertTrue(run_in_shell_mock.called)
  2479. #fail no cli tool
  2480. get_db_cli_tool_mock.return_value = None
  2481. get_db_cli_tool_mock.called = False
  2482. run_in_shell_mock.called = False
  2483. retcode, out, err = ambari_server.execute_remote_script(args, script)
  2484. self.assertEquals(retcode, -1)
  2485. self.assertTrue(get_db_cli_tool_mock.called)
  2486. self.assertFalse(run_in_shell_mock.called)
  2487. #fail execute
  2488. errcode = 1
  2489. get_db_cli_tool_mock.return_value = "tool"
  2490. run_in_shell_mock.return_value = (errcode, None, None)
  2491. get_db_cli_tool_mock.called = False
  2492. run_in_shell_mock.called = False
  2493. retcode, out, err = ambari_server.execute_remote_script(args, script)
  2494. self.assertEquals(retcode, errcode)
  2495. self.assertTrue(get_db_cli_tool_mock.called)
  2496. self.assertTrue(run_in_shell_mock.called)
  2497. #fail wrong database - case should be completely impossible
  2498. get_db_cli_tool_mock.return_value = "tool"
  2499. run_in_shell_mock.return_value = (0, None, None)
  2500. get_db_cli_tool_mock.called = False
  2501. run_in_shell_mock.called = False
  2502. args.database = "unknown"
  2503. retcode, out, err = ambari_server.execute_remote_script(args, script)
  2504. self.assertEquals(retcode, -2)
  2505. self.assertTrue(get_db_cli_tool_mock.called)
  2506. self.assertFalse(run_in_shell_mock.called)
  2507. pass
  2508. @patch.object(ambari_server, "get_conf_dir")
  2509. def test_update_ambari_properties(self, get_conf_dir_mock):
  2510. properties = ["server.jdbc.user.name=ambari-server\n",
  2511. "server.jdbc.user.passwd=/etc/ambari-server/conf/password.dat\n",
  2512. "java.home=/usr/jdk64/jdk1.6.0_31\n",
  2513. "server.os_type=redhat6\n",
  2514. "ambari-server.user=ambari\n",
  2515. "agent.fqdn.service.url=URL\n"]
  2516. NEW_PROPERTY = 'some_new_property=some_value\n'
  2517. CHANGED_VALUE_PROPERTY = 'server.os_type=should_not_overwrite_value\n'
  2518. get_conf_dir_mock.return_value = '/etc/ambari-server/conf'
  2519. (tf1, fn1) = tempfile.mkstemp()
  2520. (tf2, fn2) = tempfile.mkstemp()
  2521. ambari_server.AMBARI_PROPERTIES_RPMSAVE_FILE = fn1
  2522. ambari_server.AMBARI_PROPERTIES_FILE = fn2
  2523. with open(ambari_server.AMBARI_PROPERTIES_FILE, "w") as f:
  2524. f.write(NEW_PROPERTY)
  2525. f.write(CHANGED_VALUE_PROPERTY)
  2526. with open(ambari_server.AMBARI_PROPERTIES_RPMSAVE_FILE, 'w') as f:
  2527. for line in properties:
  2528. f.write(line)
  2529. #Call tested method
  2530. ambari_server.update_ambari_properties()
  2531. timestamp = datetime.datetime.now()
  2532. #RPMSAVE_FILE wasn't found
  2533. self.assertFalse(os.path.exists(ambari_server.AMBARI_PROPERTIES_RPMSAVE_FILE))
  2534. #Renamed RPMSAVE_FILE exists
  2535. self.assertTrue(os.path.exists(ambari_server.AMBARI_PROPERTIES_RPMSAVE_FILE
  2536. + '.' + timestamp.strftime('%Y%m%d%H%M%S')))
  2537. with open(ambari_server.AMBARI_PROPERTIES_FILE, 'r') as f:
  2538. ambari_properties_content = f.readlines()
  2539. for line in properties:
  2540. if (line == "agent.fqdn.service.url=URL\n"):
  2541. if (not ambari_server.GET_FQDN_SERVICE_URL + "=URL\n" in ambari_properties_content) and (
  2542. line in ambari_properties_content):
  2543. self.fail()
  2544. else:
  2545. if not line in ambari_properties_content:
  2546. self.fail()
  2547. if not NEW_PROPERTY in ambari_properties_content:
  2548. self.fail()
  2549. if CHANGED_VALUE_PROPERTY in ambari_properties_content:
  2550. self.fail()
  2551. # Command should not fail if *.rpmsave file is missing
  2552. result = ambari_server.update_ambari_properties()
  2553. self.assertEquals(result, 0)
  2554. os.unlink(fn2)
  2555. #if ambari.properties file is absent then "ambari-server upgrade" should
  2556. # fail
  2557. (tf, fn) = tempfile.mkstemp()
  2558. ambari_server.AMBARI_PROPERTIES_RPMSAVE_FILE = fn
  2559. result = ambari_server.update_ambari_properties()
  2560. self.assertNotEquals(result, 0)
  2561. @patch.object(ambari_server.Properties, '__init__')
  2562. @patch.object(ambari_server, 'search_file')
  2563. def test_update_ambari_properties_negative_case(self, search_file_mock, properties_mock):
  2564. search_file_mock.return_value = None
  2565. #Call tested method
  2566. self.assertEquals(0, ambari_server.update_ambari_properties())
  2567. self.assertFalse(properties_mock.called)
  2568. search_file_mock.return_value = False
  2569. #Call tested method
  2570. self.assertEquals(0, ambari_server.update_ambari_properties())
  2571. self.assertFalse(properties_mock.called)
  2572. search_file_mock.return_value = ''
  2573. #Call tested method
  2574. self.assertEquals(0, ambari_server.update_ambari_properties())
  2575. self.assertFalse(properties_mock.called)
  2576. @patch.object(ambari_server, "get_conf_dir")
  2577. def test_update_ambari_properties_without_user_property(self, get_conf_dir_mock):
  2578. '''
  2579. Checks: update_ambari_properties call should add ambari-server.user property if
  2580. it's absent
  2581. '''
  2582. properties = ["server.jdbc.user.name=ambari-server\n",
  2583. "server.jdbc.user.passwd=/etc/ambari-server/conf/password.dat\n",
  2584. "java.home=/usr/jdk64/jdk1.6.0_31\n",
  2585. "server.os_type=redhat6\n"]
  2586. get_conf_dir_mock.return_value = '/etc/ambari-server/conf'
  2587. (tf1, fn1) = tempfile.mkstemp()
  2588. (tf2, fn2) = tempfile.mkstemp()
  2589. ambari_server.AMBARI_PROPERTIES_RPMSAVE_FILE = fn1
  2590. ambari_server.AMBARI_PROPERTIES_FILE = fn2
  2591. with open(ambari_server.AMBARI_PROPERTIES_RPMSAVE_FILE, 'w') as f:
  2592. for line in properties:
  2593. f.write(line)
  2594. #Call tested method
  2595. ambari_server.update_ambari_properties()
  2596. ambari_properties = ambari_server.Properties()
  2597. ambari_properties.load(open(fn2))
  2598. self.assertTrue(ambari_server.NR_USER_PROPERTY in ambari_properties.keys())
  2599. value = ambari_properties[ambari_server.NR_USER_PROPERTY]
  2600. self.assertEqual(value, "root")
  2601. os.unlink(fn2)
  2602. @patch.object(ambari_server, 'verify_setup_allowed')
  2603. @patch("sys.exit")
  2604. @patch.object(ambari_server, "get_YN_input")
  2605. @patch.object(ambari_server, "get_db_cli_tool")
  2606. @patch.object(ambari_server, "store_remote_properties")
  2607. @patch.object(ambari_server, "is_local_database")
  2608. @patch.object(ambari_server, "check_iptables")
  2609. @patch.object(ambari_server, "check_jdbc_drivers")
  2610. @patch.object(ambari_server, "is_root")
  2611. @patch.object(ambari_server, "check_ambari_user")
  2612. @patch.object(ambari_server, "download_jdk")
  2613. @patch.object(ambari_server, "configure_os_settings")
  2614. @patch('__builtin__.raw_input')
  2615. def test_setup_remote_db_wo_client(self, raw_input, configure_os_settings_mock,
  2616. download_jdk_mock, check_ambari_user_mock, is_root_mock,
  2617. check_jdbc_drivers_mock, check_iptables_mock, is_local_db_mock,
  2618. store_remote_properties_mock, get_db_cli_tool_mock, get_YN_input,
  2619. exit_mock, verify_setup_allowed_method):
  2620. args = MagicMock()
  2621. raw_input.return_value = ""
  2622. is_root_mock.return_value = True
  2623. is_local_db_mock.return_value = False
  2624. get_YN_input.return_value = False
  2625. check_iptables_mock.return_value = (0, "other")
  2626. store_remote_properties_mock.return_value = 0
  2627. get_db_cli_tool_mock.return_value = None
  2628. check_jdbc_drivers_mock.return_value = 0
  2629. check_ambari_user_mock.return_value = 0
  2630. download_jdk_mock.return_value = 0
  2631. configure_os_settings_mock.return_value = 0
  2632. verify_setup_allowed_method.return_value = 0
  2633. try:
  2634. ambari_server.setup(args)
  2635. self.fail("Should throw exception")
  2636. except NonFatalException as fe:
  2637. # Expected
  2638. self.assertTrue("The cli was not found" in fe.reason)
  2639. @patch.object(ambari_server, 'verify_setup_allowed')
  2640. @patch("sys.exit")
  2641. @patch.object(ambari_server, "get_YN_input")
  2642. @patch.object(ambari_server, "get_db_cli_tool")
  2643. @patch.object(ambari_server, "is_local_database")
  2644. @patch.object(ambari_server, "check_iptables")
  2645. @patch.object(ambari_server, "check_jdbc_drivers")
  2646. @patch.object(ambari_server, "is_root")
  2647. @patch.object(ambari_server, "check_ambari_user")
  2648. @patch.object(ambari_server, "download_jdk")
  2649. @patch.object(ambari_server, "configure_os_settings")
  2650. @patch('__builtin__.raw_input')
  2651. def test_store_remote_properties(self, raw_input, configure_os_settings_mock,
  2652. download_jdk_mock, check_ambari_user_mock, is_root_mock,
  2653. check_jdbc_drivers_mock, check_iptables_mock, is_local_db_mock,
  2654. get_db_cli_tool_mock, get_YN_input, exit_mock, verify_setup_allowed_method):
  2655. raw_input.return_value = ""
  2656. is_root_mock.return_value = True
  2657. is_local_db_mock.return_value = False
  2658. get_YN_input.return_value = False
  2659. check_iptables_mock.return_value = (0, "other")
  2660. get_db_cli_tool_mock.return_value = None
  2661. check_jdbc_drivers_mock.return_value = 0
  2662. check_ambari_user_mock.return_value = 0
  2663. download_jdk_mock.return_value = 0
  2664. configure_os_settings_mock.return_value = 0
  2665. verify_setup_allowed_method.return_value = 0
  2666. import optparse
  2667. args = optparse.Values()
  2668. args.database = "oracle"
  2669. args.database_host = "localhost"
  2670. args.database_port = "1234"
  2671. args.database_name = "ambari"
  2672. args.sid_or_sname = "foo"
  2673. args.database_username = "foo"
  2674. args.database_password = "foo"
  2675. tempdir = tempfile.gettempdir()
  2676. prop_file = os.path.join(tempdir, "ambari.properties")
  2677. with open(prop_file, "w") as f:
  2678. f.write("dummy=dummy")
  2679. f.close()
  2680. os.environ[ambari_server.AMBARI_CONF_VAR] = tempdir
  2681. ambari_server.DATABASE_INDEX = 1
  2682. ambari_server.store_remote_properties(args)
  2683. properties = ambari_server.get_ambari_properties()
  2684. found = False
  2685. for n in properties.propertyNames():
  2686. if not found and n.startswith("server.jdbc.properties"):
  2687. found = True
  2688. ambari_server.DATABASE_INDEX = 0
  2689. del os.environ[ambari_server.AMBARI_CONF_VAR]
  2690. os.remove(prop_file)
  2691. self.assertTrue(found)
  2692. @patch.object(ambari_server, "parse_properties_file")
  2693. @patch.object(ambari_server, "get_db_cli_tool")
  2694. @patch.object(ambari_server, "print_error_msg")
  2695. @patch.object(ambari_server, "get_YN_input")
  2696. @patch.object(ambari_server, "setup_db")
  2697. @patch.object(ambari_server, "run_os_command")
  2698. @patch.object(ambari_server, "is_root")
  2699. @patch.object(ambari_server, "check_database_name_property")
  2700. def test_reset_remote_db_wo_client(self, check_database_name_property_mock, is_root_mock, run_os_command_mock,
  2701. setup_db_mock,
  2702. get_YN_inputMock, print_error_msg_mock, get_db_cli_tool_mock,
  2703. parse_properties_file_mock):
  2704. args = MagicMock()
  2705. get_YN_inputMock.return_value = True
  2706. run_os_command_mock.return_value = (0, None, None)
  2707. args.persistence_type = "remote"
  2708. get_db_cli_tool_mock.return_value = None
  2709. is_root_mock.return_value = True
  2710. try:
  2711. ambari_server.reset(args)
  2712. self.fail("Should throw exception")
  2713. except NonFatalException as fe:
  2714. # Expected
  2715. self.assertTrue("Client wasn't found" in fe.reason)
  2716. pass
  2717. @patch.object(ambari_server, "find_properties_file")
  2718. def test_get_ambari_properties(self, find_properties_file_mock):
  2719. find_properties_file_mock.return_value = None
  2720. rcode = ambari_server.get_ambari_properties()
  2721. self.assertEqual(rcode, -1)
  2722. tf1 = tempfile.NamedTemporaryFile()
  2723. find_properties_file_mock.return_value = tf1.name
  2724. prop_name = 'name'
  2725. prop_value = 'val'
  2726. with open(tf1.name, 'w') as fout:
  2727. fout.write(prop_name + '=' + prop_value)
  2728. fout.close()
  2729. properties = ambari_server.get_ambari_properties()
  2730. self.assertEqual(properties[prop_name], prop_value)
  2731. @patch.object(ambari_server, "get_ambari_properties")
  2732. @patch.object(ambari_server, "find_jdbc_driver")
  2733. @patch.object(ambari_server, "copy_files")
  2734. @patch.object(ambari_server, "print_error_msg")
  2735. @patch.object(ambari_server, "print_warning_msg")
  2736. @patch('__builtin__.raw_input')
  2737. @patch("sys.exit")
  2738. def check_jdbc_drivers(self, exit_mock, raw_input_mock, print_warning_msg, print_error_msg_mock, copy_files_mock,
  2739. find_jdbc_driver_mock, get_ambari_properties_mock):
  2740. out = StringIO.StringIO()
  2741. sys.stdout = out
  2742. args = MagicMock()
  2743. # Check positive scenario
  2744. drivers_list = ['driver_file']
  2745. resources_dir = '/tmp'
  2746. get_ambari_properties_mock.return_value = {ambari_server.RESOURCES_DIR_PROPERTY: resources_dir}
  2747. find_jdbc_driver_mock.return_value = drivers_list
  2748. args.database = "oracle"
  2749. rcode = ambari_server.check_jdbc_drivers(args)
  2750. self.assertEqual(0, rcode)
  2751. copy_files_mock.assert_called_with(drivers_list, resources_dir)
  2752. # Check negative scenarios
  2753. # Silent option, no drivers
  2754. ambari_server.SILENT = True
  2755. find_jdbc_driver_mock.return_value = -1
  2756. rcode = ambari_server.check_jdbc_drivers(args)
  2757. self.assertTrue(print_error_msg_mock.called)
  2758. self.assertTrue(exit_mock.called)
  2759. # Non-Silent option, no drivers
  2760. ambari_server.SILENT = False
  2761. find_jdbc_driver_mock.return_value = -1
  2762. rcode = ambari_server.check_jdbc_drivers(args)
  2763. self.assertTrue(exit_mock.called)
  2764. self.assertTrue(print_error_msg_mock.called)
  2765. # Non-Silent option, no drivers at first ask, present drivers after that
  2766. find_jdbc_driver_mock.side_effect = [-1, drivers_list]
  2767. rcode = ambari_server.check_jdbc_drivers(args)
  2768. self.assertEqual(0, rcode)
  2769. copy_files_mock.assert_called_with(drivers_list, resources_dir)
  2770. # Non-Silent option, no drivers at first ask, present drivers after that
  2771. find_jdbc_driver_mock.reset()
  2772. find_jdbc_driver_mock.side_effect = [-1, -1]
  2773. rcode = ambari_server.check_jdbc_drivers(args)
  2774. self.assertTrue(exit_mock.called)
  2775. self.assertTrue(print_error_msg_mock.called)
  2776. sys.stdout = sys.__stdout__
  2777. @patch.object(ambari_server, "find_properties_file")
  2778. def test_get_ambari_properties(self, find_properties_file):
  2779. find_properties_file.return_value = None
  2780. rcode = ambari_server.get_ambari_properties()
  2781. self.assertEqual(rcode, -1)
  2782. tf1 = tempfile.NamedTemporaryFile()
  2783. find_properties_file.return_value = tf1.name
  2784. prop_name = 'name'
  2785. prop_value = 'val'
  2786. with open(tf1.name, 'w') as fout:
  2787. fout.write(prop_name + '=' + prop_value)
  2788. fout.close()
  2789. properties = ambari_server.get_ambari_properties()
  2790. self.assertEqual(properties[prop_name], prop_value)
  2791. self.assertEqual(properties.fileName, os.path.abspath(tf1.name))
  2792. sys.stdout = sys.__stdout__
  2793. @patch("os.path.exists")
  2794. @patch("os.remove")
  2795. @patch.object(ambari_server, "print_warning_msg")
  2796. def test_remove_file(self, printWarningMsgMock, removeMock, pathExistsMock):
  2797. def side_effect():
  2798. raise Exception(-1, "Failed to delete!")
  2799. removeMock.side_effect = side_effect
  2800. pathExistsMock.return_value = 1
  2801. res = ambari_server.remove_file("/someNonExsistantDir/filename")
  2802. self.assertEquals(res, 1)
  2803. removeMock.side_effect = None
  2804. res = ambari_server.remove_file("/someExsistantDir/filename")
  2805. self.assertEquals(res, 0)
  2806. @patch("shutil.copyfile")
  2807. def test_copy_file(self, shutilCopyfileMock):
  2808. def side_effect():
  2809. raise Exception(-1, "Failed to copy!")
  2810. shutilCopyfileMock.side_effect = side_effect
  2811. try:
  2812. ambari_server.copy_file("/tmp/psswd", "/someNonExsistantDir/filename")
  2813. self.fail("Exception on file not copied has not been thrown!")
  2814. except FatalException:
  2815. # Expected
  2816. pass
  2817. self.assertTrue(shutilCopyfileMock.called)
  2818. shutilCopyfileMock.side_effect = None
  2819. try:
  2820. ambari_server.copy_file("/tmp/psswd", "/root/psswd")
  2821. except FatalException:
  2822. self.fail("Exception on file copied should not be thrown!")
  2823. self.assertTrue(shutilCopyfileMock.called)
  2824. @patch.object(ambari_server, "get_ambari_properties")
  2825. @patch.object(ambari_server, "find_jdbc_driver")
  2826. @patch.object(ambari_server, "copy_files")
  2827. @patch.object(ambari_server, "print_error_msg")
  2828. @patch.object(ambari_server, "print_warning_msg")
  2829. @patch('__builtin__.raw_input')
  2830. def test_check_jdbc_drivers(self, raw_input_mock, print_warning_msg, print_error_msg_mock, copy_files_mock,
  2831. find_jdbc_driver_mock, get_ambari_properties_mock):
  2832. out = StringIO.StringIO()
  2833. sys.stdout = out
  2834. args = MagicMock()
  2835. # Check positive scenario
  2836. drivers_list = ['driver_file']
  2837. resources_dir = '/tmp'
  2838. get_ambari_properties_mock.return_value = {ambari_server.RESOURCES_DIR_PROPERTY: resources_dir}
  2839. find_jdbc_driver_mock.return_value = drivers_list
  2840. copy_files_mock.return_value = 0
  2841. args.database = "oracle"
  2842. rcode = ambari_server.check_jdbc_drivers(args)
  2843. self.assertEqual(0, rcode)
  2844. copy_files_mock.assert_called_with(drivers_list, resources_dir)
  2845. get_ambari_properties_mock.reset_mock()
  2846. find_jdbc_driver_mock.reset_mock()
  2847. copy_files_mock.reset_mock()
  2848. print_error_msg_mock.reset_mock()
  2849. print_warning_msg.reset_mock()
  2850. raw_input_mock.reset_mock()
  2851. # Check negative scenarios
  2852. # Silent option, no drivers
  2853. ambari_server.SILENT = True
  2854. find_jdbc_driver_mock.return_value = -1
  2855. failed = False
  2856. try:
  2857. rcode = ambari_server.check_jdbc_drivers(args)
  2858. except FatalException:
  2859. failed = True
  2860. self.assertTrue(print_error_msg_mock.called)
  2861. self.assertTrue(failed)
  2862. get_ambari_properties_mock.reset_mock()
  2863. find_jdbc_driver_mock.reset_mock()
  2864. copy_files_mock.reset_mock()
  2865. print_error_msg_mock.reset_mock()
  2866. print_warning_msg.reset_mock()
  2867. raw_input_mock.reset_mock()
  2868. # Non-Silent option, no drivers
  2869. ambari_server.SILENT = False
  2870. find_jdbc_driver_mock.return_value = -1
  2871. failed = False
  2872. try:
  2873. rcode = ambari_server.check_jdbc_drivers(args)
  2874. except FatalException:
  2875. failed = True
  2876. self.assertTrue(failed)
  2877. self.assertTrue(print_error_msg_mock.called)
  2878. get_ambari_properties_mock.reset_mock()
  2879. find_jdbc_driver_mock.reset_mock()
  2880. copy_files_mock.reset_mock()
  2881. print_error_msg_mock.reset_mock()
  2882. print_warning_msg.reset_mock()
  2883. raw_input_mock.reset_mock()
  2884. # Non-Silent option, no drivers at first ask, present drivers after that
  2885. find_jdbc_driver_mock.side_effect = [-1, drivers_list]
  2886. rcode = ambari_server.check_jdbc_drivers(args)
  2887. self.assertEqual(0, rcode)
  2888. copy_files_mock.assert_called_with(drivers_list, resources_dir)
  2889. get_ambari_properties_mock.reset_mock()
  2890. find_jdbc_driver_mock.reset_mock()
  2891. copy_files_mock.reset_mock()
  2892. print_error_msg_mock.reset_mock()
  2893. print_warning_msg.reset_mock()
  2894. raw_input_mock.reset_mock()
  2895. # Non-Silent option, no drivers at first ask, no drivers after that
  2896. find_jdbc_driver_mock.side_effect = [-1, -1]
  2897. failed = False
  2898. try:
  2899. rcode = ambari_server.check_jdbc_drivers(args)
  2900. except FatalException:
  2901. failed = True
  2902. self.assertTrue(failed)
  2903. self.assertTrue(print_error_msg_mock.called)
  2904. get_ambari_properties_mock.reset_mock()
  2905. find_jdbc_driver_mock.reset_mock()
  2906. copy_files_mock.reset_mock()
  2907. print_error_msg_mock.reset_mock()
  2908. print_warning_msg.reset_mock()
  2909. raw_input_mock.reset_mock()
  2910. # Failed to copy_files
  2911. find_jdbc_driver_mock.side_effect = [drivers_list]
  2912. try:
  2913. rcode = ambari_server.check_jdbc_drivers(args)
  2914. except FatalException:
  2915. failed = True
  2916. self.assertTrue(failed)
  2917. sys.stdout = sys.__stdout__
  2918. @patch.object(ambari_server, "find_properties_file")
  2919. def test_get_ambari_properties(self, find_properties_file_mock):
  2920. find_properties_file_mock.return_value = None
  2921. rcode = ambari_server.get_ambari_properties()
  2922. self.assertEqual(rcode, -1)
  2923. tf1 = tempfile.NamedTemporaryFile()
  2924. find_properties_file_mock.return_value = tf1.name
  2925. prop_name = 'name'
  2926. prop_value = 'val'
  2927. with open(tf1.name, 'w') as fout:
  2928. fout.write(prop_name + '=' + prop_value)
  2929. fout.close()
  2930. properties = ambari_server.get_ambari_properties()
  2931. self.assertEqual(properties[prop_name], prop_value)
  2932. self.assertEqual(properties.fileName, os.path.abspath(tf1.name))
  2933. sys.stdout = sys.__stdout__
  2934. @patch.object(ambari_server, "check_database_name_property")
  2935. @patch.object(ambari_server, "find_properties_file")
  2936. def test_parse_properties_file(self, find_properties_file_mock, check_database_name_property_mock):
  2937. check_database_name_property_mock.return_value = 1
  2938. tf1 = tempfile.NamedTemporaryFile(mode='r')
  2939. find_properties_file_mock.return_value = tf1.name
  2940. args = MagicMock()
  2941. ambari_server.parse_properties_file(args)
  2942. self.assertEquals(args.persistence_type, "local")
  2943. with open(tf1.name, 'w') as fout:
  2944. fout.write("\n")
  2945. fout.write(ambari_server.PERSISTENCE_TYPE_PROPERTY + "=remote")
  2946. args = MagicMock()
  2947. ambari_server.parse_properties_file(args)
  2948. self.assertEquals(args.persistence_type, "remote")
  2949. @patch.object(ambari_server, 'decrypt_password_for_alias')
  2950. @patch.object(ambari_server, 'is_alias_string')
  2951. @patch.object(ambari_server, 'get_ambari_properties')
  2952. def test_configure_database_username_password_masterkey_persisted(self,
  2953. get_ambari_properties_method,
  2954. is_alias_string_method,
  2955. decrypt_password_for_alias_method):
  2956. out = StringIO.StringIO()
  2957. sys.stdout = out
  2958. configs = {ambari_server.JDBC_USER_NAME_PROPERTY: "fakeuser",
  2959. ambari_server.JDBC_PASSWORD_PROPERTY: "${alias=somealias}",
  2960. ambari_server.JDBC_DATABASE_PROPERTY: "fakedbname",
  2961. ambari_server.SECURITY_KEY_IS_PERSISTED: "True"}
  2962. get_ambari_properties_method.return_value = configs
  2963. is_alias_string_method.return_value = True
  2964. decrypt_password_for_alias_method.return_value = "falepasswd"
  2965. args = MagicMock()
  2966. args.master_key = None
  2967. ambari_server.configure_database_username_password(args)
  2968. self.assertTrue(decrypt_password_for_alias_method.called)
  2969. self.assertTrue(is_alias_string_method.called)
  2970. self.assertEquals("fakeuser", args.database_username)
  2971. self.assertEquals("falepasswd", args.database_password)
  2972. sys.stdout = sys.__stdout__
  2973. @patch.object(ambari_server, 'read_password')
  2974. def test_configure_database_password(self, read_password_method):
  2975. out = StringIO.StringIO()
  2976. sys.stdout = out
  2977. read_password_method.return_value = "fakepasswd"
  2978. result = ambari_server.configure_database_password(True)
  2979. self.assertTrue(read_password_method.called)
  2980. self.assertEquals("fakepasswd", result)
  2981. result = ambari_server.configure_database_password(True)
  2982. self.assertEquals("fakepasswd", result)
  2983. result = ambari_server.configure_database_password(True)
  2984. self.assertEquals("fakepasswd", result)
  2985. sys.stdout = sys.__stdout__
  2986. @patch("os.path.exists")
  2987. @patch.object(ambari_server, 'get_is_secure')
  2988. @patch.object(ambari_server, 'get_is_persisted')
  2989. @patch.object(ambari_server, 'remove_password_file')
  2990. @patch.object(ambari_server, 'save_passwd_for_alias')
  2991. @patch.object(ambari_server, 'read_master_key')
  2992. @patch.object(ambari_server, 'read_ambari_user')
  2993. @patch.object(ambari_server, 'get_master_key_location')
  2994. @patch.object(ambari_server, 'update_properties')
  2995. @patch.object(ambari_server, 'save_master_key')
  2996. @patch.object(ambari_server, 'get_YN_input')
  2997. @patch.object(ambari_server, 'search_file')
  2998. @patch.object(ambari_server, 'get_ambari_properties')
  2999. @patch.object(ambari_server, 'is_root')
  3000. def test_setup_master_key_not_persist(self, is_root_method,
  3001. get_ambari_properties_method, search_file_message,
  3002. get_YN_input_method, save_master_key_method,
  3003. update_properties_method, get_master_key_location_method,
  3004. read_ambari_user_method, read_master_key_method,
  3005. save_passwd_for_alias_method, remove_password_file_method,
  3006. get_is_persisted_method, get_is_secure_method, exists_mock):
  3007. is_root_method.return_value = True
  3008. p = get_ambari_properties_method.return_value
  3009. p.get_property.side_effect = ["fakepasswd", "fakepasswd", "fakepasswd", "fakepasswd"]
  3010. read_master_key_method.return_value = "aaa"
  3011. get_YN_input_method.return_value = False
  3012. read_ambari_user_method.return_value = None
  3013. save_passwd_for_alias_method.return_value = 0
  3014. get_is_persisted_method.return_value = (True, "filepath")
  3015. get_is_secure_method.return_value = False
  3016. exists_mock.return_value = False
  3017. ambari_server.setup_master_key()
  3018. self.assertTrue(get_YN_input_method.called)
  3019. self.assertTrue(read_master_key_method.called)
  3020. self.assertTrue(read_ambari_user_method.called)
  3021. self.assertTrue(update_properties_method.called)
  3022. self.assertFalse(save_master_key_method.called)
  3023. self.assertTrue(save_passwd_for_alias_method.called)
  3024. self.assertEquals(3, save_passwd_for_alias_method.call_count)
  3025. self.assertTrue(remove_password_file_method.called)
  3026. result_expected = {ambari_server.JDBC_PASSWORD_PROPERTY:
  3027. ambari_server.get_alias_string(ambari_server.JDBC_RCA_PASSWORD_ALIAS),
  3028. ambari_server.JDBC_RCA_PASSWORD_FILE_PROPERTY:
  3029. ambari_server.get_alias_string(ambari_server.JDBC_RCA_PASSWORD_ALIAS),
  3030. ambari_server.LDAP_MGR_PASSWORD_PROPERTY:
  3031. ambari_server.get_alias_string(ambari_server.LDAP_MGR_PASSWORD_ALIAS),
  3032. ambari_server.SSL_TRUSTSTORE_PASSWORD_PROPERTY:
  3033. ambari_server.get_alias_string(ambari_server.SSL_TRUSTSTORE_PASSWORD_ALIAS),
  3034. ambari_server.SECURITY_IS_ENCRYPTION_ENABLED: 'true'}
  3035. sorted_x = sorted(result_expected.iteritems(), key=operator.itemgetter(0))
  3036. sorted_y = sorted(update_properties_method.call_args[0][1].iteritems(),
  3037. key=operator.itemgetter(0))
  3038. self.assertEquals(sorted_x, sorted_y)
  3039. @patch.object(ambari_server, 'save_passwd_for_alias')
  3040. @patch("os.path.exists")
  3041. @patch.object(ambari_server, 'get_is_secure')
  3042. @patch.object(ambari_server, 'get_is_persisted')
  3043. @patch.object(ambari_server, 'read_master_key')
  3044. @patch.object(ambari_server, 'read_ambari_user')
  3045. @patch.object(ambari_server, 'get_master_key_location')
  3046. @patch.object(ambari_server, 'update_properties')
  3047. @patch.object(ambari_server, 'save_master_key')
  3048. @patch.object(ambari_server, 'get_YN_input')
  3049. @patch.object(ambari_server, 'search_file')
  3050. @patch.object(ambari_server, 'get_ambari_properties')
  3051. @patch.object(ambari_server, 'is_root')
  3052. def test_setup_master_key_persist(self, is_root_method,
  3053. get_ambari_properties_method, search_file_message,
  3054. get_YN_input_method, save_master_key_method,
  3055. update_properties_method, get_master_key_location_method,
  3056. read_ambari_user_method, read_master_key_method,
  3057. get_is_persisted_method, get_is_secure_method, exists_mock,
  3058. save_passwd_for_alias_method):
  3059. is_root_method.return_value = True
  3060. p = get_ambari_properties_method.return_value
  3061. p.get_property.side_effect = ["fakepasswd", None, None, None]
  3062. read_master_key_method.return_value = "aaa"
  3063. get_YN_input_method.side_effect = [True, False]
  3064. read_ambari_user_method.return_value = None
  3065. get_is_persisted_method.return_value = (True, "filepath")
  3066. get_is_secure_method.return_value = False
  3067. exists_mock.return_value = False
  3068. save_passwd_for_alias_method.return_value = 0
  3069. ambari_server.setup_master_key()
  3070. self.assertTrue(get_YN_input_method.called)
  3071. self.assertTrue(read_master_key_method.called)
  3072. self.assertTrue(read_ambari_user_method.called)
  3073. self.assertTrue(update_properties_method.called)
  3074. self.assertTrue(save_master_key_method.called)
  3075. result_expected = {ambari_server.JDBC_PASSWORD_PROPERTY:
  3076. ambari_server.get_alias_string(ambari_server.JDBC_RCA_PASSWORD_ALIAS),
  3077. ambari_server.SECURITY_IS_ENCRYPTION_ENABLED: 'true'}
  3078. sorted_x = sorted(result_expected.iteritems(), key=operator.itemgetter(0))
  3079. sorted_y = sorted(update_properties_method.call_args[0][1].iteritems(),
  3080. key=operator.itemgetter(0))
  3081. self.assertEquals(sorted_x, sorted_y)
  3082. @patch.object(ambari_server, 'read_master_key')
  3083. @patch.object(ambari_server, 'remove_password_file')
  3084. @patch("os.path.exists")
  3085. @patch.object(ambari_server, 'read_ambari_user')
  3086. @patch.object(ambari_server, 'get_master_key_location')
  3087. @patch("ambari-server.Properties")
  3088. @patch.object(ambari_server, 'save_passwd_for_alias')
  3089. @patch.object(ambari_server, 'read_passwd_for_alias')
  3090. @patch.object(ambari_server, 'update_properties')
  3091. @patch.object(ambari_server, 'save_master_key')
  3092. @patch.object(ambari_server, 'get_validated_string_input')
  3093. @patch.object(ambari_server, 'get_YN_input')
  3094. @patch.object(ambari_server, 'search_file')
  3095. @patch.object(ambari_server, 'get_ambari_properties')
  3096. @patch.object(ambari_server, 'is_root')
  3097. def test_reset_master_key_persisted(self, is_root_method,
  3098. get_ambari_properties_method, search_file_message,
  3099. get_YN_input_method, get_validated_string_input_method,
  3100. save_master_key_method, update_properties_method,
  3101. read_passwd_for_alias_method, save_passwd_for_alias_method,
  3102. Properties_mock, get_master_key_location_method,
  3103. read_ambari_user_method, exists_mock,
  3104. remove_password_file_method, read_master_key_method):
  3105. # Testing call under non-root
  3106. is_root_method.return_value = False
  3107. try:
  3108. ambari_server.setup_master_key()
  3109. self.fail("Should throw exception")
  3110. except FatalException as fe:
  3111. # Expected
  3112. self.assertTrue("root-level" in fe.reason)
  3113. pass
  3114. # Testing call under root
  3115. is_root_method.return_value = True
  3116. search_file_message.return_value = "filepath"
  3117. read_ambari_user_method.return_value = None
  3118. p = get_ambari_properties_method.return_value
  3119. p.get_property.side_effect = ['true', '${alias=fakealias}',
  3120. '${alias=fakealias}',
  3121. '${alias=fakealias}', '${alias=fakealias}']
  3122. get_YN_input_method.side_effect = [True, True]
  3123. read_master_key_method.return_value = "aaa"
  3124. read_passwd_for_alias_method.return_value = "fakepassword"
  3125. save_passwd_for_alias_method.return_value = 0
  3126. exists_mock.return_value = False
  3127. ambari_server.setup_master_key()
  3128. self.assertTrue(save_master_key_method.called)
  3129. self.assertTrue(get_YN_input_method.called)
  3130. self.assertTrue(read_master_key_method.called)
  3131. self.assertTrue(update_properties_method.called)
  3132. self.assertTrue(read_passwd_for_alias_method.called)
  3133. self.assertTrue(3, read_passwd_for_alias_method.call_count)
  3134. self.assertTrue(3, save_passwd_for_alias_method.call_count)
  3135. result_expected = {ambari_server.JDBC_PASSWORD_PROPERTY:
  3136. ambari_server.get_alias_string(ambari_server.JDBC_RCA_PASSWORD_ALIAS),
  3137. ambari_server.JDBC_RCA_PASSWORD_FILE_PROPERTY:
  3138. ambari_server.get_alias_string(ambari_server.JDBC_RCA_PASSWORD_ALIAS),
  3139. ambari_server.LDAP_MGR_PASSWORD_PROPERTY:
  3140. ambari_server.get_alias_string(ambari_server.LDAP_MGR_PASSWORD_ALIAS),
  3141. ambari_server.SSL_TRUSTSTORE_PASSWORD_PROPERTY:
  3142. ambari_server.get_alias_string(ambari_server.SSL_TRUSTSTORE_PASSWORD_ALIAS),
  3143. ambari_server.SECURITY_IS_ENCRYPTION_ENABLED: 'true'}
  3144. sorted_x = sorted(result_expected.iteritems(), key=operator.itemgetter(0))
  3145. sorted_y = sorted(update_properties_method.call_args[0][1].iteritems(),
  3146. key=operator.itemgetter(0))
  3147. self.assertEquals(sorted_x, sorted_y)
  3148. @patch.object(ambari_server, 'get_is_persisted')
  3149. @patch.object(ambari_server, 'get_is_secure')
  3150. @patch.object(ambari_server, 'remove_password_file')
  3151. @patch("os.path.exists")
  3152. @patch.object(ambari_server, 'read_ambari_user')
  3153. @patch.object(ambari_server, 'get_master_key_location')
  3154. @patch("ambari-server.Properties")
  3155. @patch.object(ambari_server, 'save_passwd_for_alias')
  3156. @patch.object(ambari_server, 'read_passwd_for_alias')
  3157. @patch.object(ambari_server, 'update_properties')
  3158. @patch.object(ambari_server, 'save_master_key')
  3159. @patch.object(ambari_server, 'get_validated_string_input')
  3160. @patch.object(ambari_server, 'get_YN_input')
  3161. @patch.object(ambari_server, 'search_file')
  3162. @patch.object(ambari_server, 'get_ambari_properties')
  3163. @patch.object(ambari_server, 'is_root')
  3164. def test_reset_master_key_not_persisted(self, is_root_method,
  3165. get_ambari_properties_method,
  3166. search_file_message, get_YN_input_method,
  3167. get_validated_string_input_method, save_master_key_method,
  3168. update_properties_method, read_passwd_for_alias_method,
  3169. save_passwd_for_alias_method, Properties_mock,
  3170. get_master_key_location_method, read_ambari_user_method,
  3171. exists_mock, remove_password_file_method, get_is_secure_method,
  3172. get_is_persisted_method):
  3173. is_root_method.return_value = True
  3174. search_file_message.return_value = False
  3175. read_ambari_user_method.return_value = None
  3176. p = get_ambari_properties_method.return_value
  3177. p.get_property.side_effect = ['${alias=fakealias}', '${alias=fakealias}',
  3178. '${alias=fakealias}', '${alias=fakealias}']
  3179. get_YN_input_method.side_effect = [True, False]
  3180. get_validated_string_input_method.return_value = "aaa"
  3181. read_passwd_for_alias_method.return_value = "fakepassword"
  3182. save_passwd_for_alias_method.return_value = 0
  3183. exists_mock.return_value = False
  3184. get_is_secure_method.return_value = True
  3185. get_is_persisted_method.return_value = (True, "filePath")
  3186. ambari_server.setup_master_key()
  3187. self.assertFalse(save_master_key_method.called)
  3188. self.assertTrue(get_YN_input_method.called)
  3189. self.assertTrue(get_validated_string_input_method.called)
  3190. self.assertTrue(update_properties_method.called)
  3191. self.assertTrue(read_passwd_for_alias_method.called)
  3192. self.assertTrue(3, read_passwd_for_alias_method.call_count)
  3193. self.assertTrue(3, save_passwd_for_alias_method.call_count)
  3194. self.assertFalse(save_master_key_method.called)
  3195. result_expected = {ambari_server.JDBC_PASSWORD_PROPERTY:
  3196. ambari_server.get_alias_string(ambari_server.JDBC_RCA_PASSWORD_ALIAS),
  3197. ambari_server.JDBC_RCA_PASSWORD_FILE_PROPERTY:
  3198. ambari_server.get_alias_string(ambari_server.JDBC_RCA_PASSWORD_ALIAS),
  3199. ambari_server.LDAP_MGR_PASSWORD_PROPERTY:
  3200. ambari_server.get_alias_string(ambari_server.LDAP_MGR_PASSWORD_ALIAS),
  3201. ambari_server.SSL_TRUSTSTORE_PASSWORD_PROPERTY:
  3202. ambari_server.get_alias_string(ambari_server.SSL_TRUSTSTORE_PASSWORD_ALIAS),
  3203. ambari_server.SECURITY_IS_ENCRYPTION_ENABLED: 'true'}
  3204. sorted_x = sorted(result_expected.iteritems(), key=operator.itemgetter(0))
  3205. sorted_y = sorted(update_properties_method.call_args[0][1].iteritems(),
  3206. key=operator.itemgetter(0))
  3207. self.assertEquals(sorted_x, sorted_y)
  3208. @patch('__builtin__.raw_input')
  3209. @patch.object(ambari_server, 'get_is_secure')
  3210. @patch.object(ambari_server, 'get_YN_input')
  3211. @patch.object(ambari_server, 'update_properties')
  3212. @patch.object(ambari_server, 'search_file')
  3213. @patch.object(ambari_server, 'get_ambari_properties')
  3214. @patch.object(ambari_server, 'is_root')
  3215. def test_setup_ldap_invalid_input(self, is_root_method, get_ambari_properties_method,
  3216. search_file_message,
  3217. update_properties_method,
  3218. get_YN_input_method,
  3219. get_is_secure_method,
  3220. raw_input_mock):
  3221. out = StringIO.StringIO()
  3222. sys.stdout = out
  3223. is_root_method.return_value = True
  3224. search_file_message.return_value = "filepath"
  3225. configs = {ambari_server.SECURITY_MASTER_KEY_LOCATION: "filepath",
  3226. ambari_server.SECURITY_KEYS_DIR: tempfile.gettempdir(),
  3227. ambari_server.SECURITY_IS_ENCRYPTION_ENABLED: "true"
  3228. }
  3229. get_ambari_properties_method.return_value = configs
  3230. raw_input_mock.side_effect = ['a:3', 'b:b', 'host', 'b:2', 'false', 'uid', 'base', 'true']
  3231. ambari_server.SILENT = False
  3232. get_YN_input_method.return_value = True
  3233. ambari_server.setup_ldap()
  3234. ldap_properties_map = \
  3235. {
  3236. "authentication.ldap.primaryUrl": "a:3",
  3237. "authentication.ldap.secondaryUrl": "b:2",
  3238. "authentication.ldap.useSSL": "false",
  3239. "authentication.ldap.usernameAttribute": "uid",
  3240. "authentication.ldap.baseDn": "base",
  3241. "authentication.ldap.bindAnonymously": "true",
  3242. "client.security": "ldap"
  3243. }
  3244. sorted_x = sorted(ldap_properties_map.iteritems(), key=operator.itemgetter(0))
  3245. sorted_y = sorted(update_properties_method.call_args[0][1].iteritems(),
  3246. key=operator.itemgetter(0))
  3247. self.assertEquals(sorted_x, sorted_y)
  3248. self.assertTrue(get_YN_input_method.called)
  3249. self.assertTrue(8, raw_input_mock.call_count)
  3250. raw_input_mock.reset_mock()
  3251. raw_input_mock.side_effect = ['a:3', '', 'b:2', 'false', 'uid', 'base', 'true']
  3252. ambari_server.setup_ldap()
  3253. ldap_properties_map = \
  3254. {
  3255. "authentication.ldap.primaryUrl": "a:3",
  3256. "authentication.ldap.useSSL": "false",
  3257. "authentication.ldap.usernameAttribute": "uid",
  3258. "authentication.ldap.baseDn": "base",
  3259. "authentication.ldap.bindAnonymously": "true",
  3260. "client.security": "ldap"
  3261. }
  3262. sorted_x = sorted(ldap_properties_map.iteritems(), key=operator.itemgetter(0))
  3263. sorted_y = sorted(update_properties_method.call_args[0][1].iteritems(),
  3264. key=operator.itemgetter(0))
  3265. self.assertEquals(sorted_x, sorted_y)
  3266. self.assertTrue(5, raw_input_mock.call_count)
  3267. sys.stdout = sys.__stdout__
  3268. @patch.object(ambari_server, 'get_is_secure')
  3269. @patch.object(ambari_server, 'encrypt_password')
  3270. @patch.object(ambari_server, 'save_passwd_for_alias')
  3271. @patch.object(ambari_server, 'get_YN_input')
  3272. @patch.object(ambari_server, 'update_properties')
  3273. @patch.object(ambari_server, 'configure_ldap_password')
  3274. @patch.object(ambari_server, 'get_validated_string_input')
  3275. @patch.object(ambari_server, 'setup_master_key')
  3276. @patch.object(ambari_server, 'search_file')
  3277. @patch.object(ambari_server, 'get_ambari_properties')
  3278. @patch.object(ambari_server, 'is_root')
  3279. @patch.object(ambari_server, 'read_password')
  3280. @patch("os.path.exists")
  3281. def test_setup_ldap(self, exists_method, read_password_method, is_root_method, get_ambari_properties_method,
  3282. search_file_message, setup_master_key_method,
  3283. get_validated_string_input_method,
  3284. configure_ldap_password_method, update_properties_method,
  3285. get_YN_input_method, save_passwd_for_alias_method,
  3286. encrypt_password_method, get_is_secure_method):
  3287. out = StringIO.StringIO()
  3288. sys.stdout = out
  3289. # Testing call under non-root
  3290. is_root_method.return_value = False
  3291. try:
  3292. ambari_server.setup_ldap()
  3293. self.fail("Should throw exception")
  3294. except FatalException as fe:
  3295. # Expected
  3296. self.assertTrue("root-level" in fe.reason)
  3297. pass
  3298. # Testing call under root
  3299. is_root_method.return_value = True
  3300. search_file_message.return_value = "filepath"
  3301. configs = {ambari_server.SECURITY_MASTER_KEY_LOCATION: "filepath",
  3302. ambari_server.SECURITY_KEYS_DIR: tempfile.gettempdir(),
  3303. ambari_server.SECURITY_IS_ENCRYPTION_ENABLED: "true"
  3304. }
  3305. get_ambari_properties_method.return_value = configs
  3306. configure_ldap_password_method.return_value = "password"
  3307. setup_master_key_method.return_value = (None, True, True)
  3308. save_passwd_for_alias_method.return_value = 0
  3309. encrypt_password_method.return_value = ambari_server.get_alias_string(
  3310. ambari_server.LDAP_MGR_PASSWORD_ALIAS)
  3311. def yn_input_side_effect(*args, **kwargs):
  3312. if 'TrustStore' in args[0]:
  3313. return False
  3314. else:
  3315. return True
  3316. #get_YN_input_method.side_effect = yn_input_side_effect()
  3317. get_YN_input_method.side_effect = [True, ]
  3318. def valid_input_side_effect(*args, **kwargs):
  3319. if 'Bind anonymously' in args[0]:
  3320. return 'false'
  3321. if args[1] == "true" or args[1] == "false":
  3322. return args[1]
  3323. else:
  3324. return "test"
  3325. get_validated_string_input_method.side_effect = valid_input_side_effect
  3326. ambari_server.setup_ldap()
  3327. ldap_properties_map = \
  3328. {
  3329. "authentication.ldap.primaryUrl": "test",
  3330. "authentication.ldap.secondaryUrl": "test",
  3331. "authentication.ldap.useSSL": "false",
  3332. "authentication.ldap.usernameAttribute": "test",
  3333. "authentication.ldap.baseDn": "test",
  3334. "authentication.ldap.bindAnonymously": "false",
  3335. "authentication.ldap.managerDn": "test",
  3336. "client.security": "ldap", \
  3337. ambari_server.LDAP_MGR_PASSWORD_PROPERTY: ambari_server.get_alias_string( \
  3338. ambari_server.LDAP_MGR_PASSWORD_ALIAS)
  3339. }
  3340. sorted_x = sorted(ldap_properties_map.iteritems(), key=operator.itemgetter(0))
  3341. sorted_y = sorted(update_properties_method.call_args[0][1].iteritems(),
  3342. key=operator.itemgetter(0))
  3343. self.assertEquals(sorted_x, sorted_y)
  3344. self.assertTrue(update_properties_method.called)
  3345. self.assertTrue(configure_ldap_password_method.called)
  3346. self.assertTrue(get_validated_string_input_method.called)
  3347. self.assertTrue(get_YN_input_method.called)
  3348. # truststore not found case
  3349. def os_path_exists(*args, **kwargs):
  3350. if "bogus" in args[0]:
  3351. return False
  3352. else:
  3353. return True
  3354. pass
  3355. def input_enable_ssl(*args, **kwargs):
  3356. if 'Bind anonymously' in args[0]:
  3357. return 'false'
  3358. if "SSL" in args[0]:
  3359. return "true"
  3360. if "Path to TrustStore file" in args[0]:
  3361. if input_enable_ssl.path_counter < 2:
  3362. input_enable_ssl.path_counter += 1
  3363. return "bogus"
  3364. else:
  3365. return "valid"
  3366. if args[1] == "true" or args[1] == "false":
  3367. return args[1]
  3368. else:
  3369. return "test"
  3370. pass
  3371. input_enable_ssl.path_counter = 0
  3372. exists_method.side_effect = os_path_exists
  3373. get_validated_string_input_method.side_effect = input_enable_ssl
  3374. read_password_method.return_value = "password"
  3375. get_YN_input_method.reset_mock()
  3376. get_YN_input_method.side_effect = [True, True]
  3377. update_properties_method.reset_mock()
  3378. ambari_server.setup_ldap()
  3379. self.assertTrue(read_password_method.called)
  3380. ldap_properties_map = \
  3381. {
  3382. "authentication.ldap.primaryUrl": "test",
  3383. "authentication.ldap.secondaryUrl": "test",
  3384. "authentication.ldap.useSSL": "true",
  3385. "authentication.ldap.usernameAttribute": "test",
  3386. "authentication.ldap.baseDn": "test",
  3387. "authentication.ldap.bindAnonymously": "false",
  3388. "authentication.ldap.managerDn": "test",
  3389. "client.security": "ldap",
  3390. "ssl.trustStore.type": "test",
  3391. "ssl.trustStore.path": "valid",
  3392. "ssl.trustStore.password": "password",
  3393. ambari_server.LDAP_MGR_PASSWORD_PROPERTY: ambari_server.get_alias_string( \
  3394. ambari_server.LDAP_MGR_PASSWORD_ALIAS)
  3395. }
  3396. sorted_x = sorted(ldap_properties_map.iteritems(), key=operator.itemgetter(0))
  3397. sorted_y = sorted(update_properties_method.call_args[0][1].iteritems(),
  3398. key=operator.itemgetter(0))
  3399. sys.stdout = sys.__stdout__
  3400. @patch.object(ambari_server, 'read_password')
  3401. def test_configure_ldap_password(self, read_password_method):
  3402. out = StringIO.StringIO()
  3403. sys.stdout = out
  3404. read_password_method.return_value = "blah"
  3405. ambari_server.configure_ldap_password()
  3406. self.assertTrue(read_password_method.called)
  3407. sys.stdout = sys.__stdout__
  3408. @patch.object(ambari_server, 'get_validated_string_input')
  3409. def test_read_password(self, get_validated_string_input_method):
  3410. out = StringIO.StringIO()
  3411. sys.stdout = out
  3412. passwordDefault = ""
  3413. passwordPrompt = 'Enter Manager Password* : '
  3414. passwordPattern = ".*"
  3415. passwordDescr = "Invalid characters in password."
  3416. get_validated_string_input_method.side_effect = ['', 'aaa', 'aaa']
  3417. password = ambari_server.read_password(passwordDefault, passwordPattern,
  3418. passwordPrompt, passwordDescr)
  3419. self.assertTrue(3, get_validated_string_input_method.call_count)
  3420. self.assertEquals('aaa', password)
  3421. get_validated_string_input_method.reset_mock()
  3422. get_validated_string_input_method.side_effect = ['aaa', 'aaa']
  3423. password = ambari_server.read_password(passwordDefault, passwordPattern,
  3424. passwordPrompt, passwordDescr)
  3425. self.assertTrue(2, get_validated_string_input_method.call_count)
  3426. self.assertEquals('aaa', password)
  3427. get_validated_string_input_method.reset_mock()
  3428. get_validated_string_input_method.side_effect = ['aaa']
  3429. password = ambari_server.read_password('aaa', passwordPattern,
  3430. passwordPrompt, passwordDescr)
  3431. self.assertTrue(1, get_validated_string_input_method.call_count)
  3432. self.assertEquals('aaa', password)
  3433. sys.stdout = sys.__stdout__
  3434. def test_generate_random_string(self):
  3435. random_str_len = 100
  3436. str1 = ambari_server.generate_random_string(random_str_len)
  3437. self.assertTrue(len(str1) == random_str_len)
  3438. str2 = ambari_server.generate_random_string(random_str_len)
  3439. self.assertTrue(str1 != str2)
  3440. @patch("__builtin__.open")
  3441. @patch.object(ambari_server, "search_file")
  3442. @patch.object(ambari_server, "backup_file_in_temp")
  3443. def test_update_properties(self, backup_file_in_temp_mock, search_file_mock, open_mock):
  3444. conf_file = "ambari.properties"
  3445. propertyMap = {"1": "1", "2": "2"}
  3446. properties = MagicMock()
  3447. f = MagicMock(name="file")
  3448. # f.__enter__.return_value = f #mimic file behavior
  3449. search_file_mock.return_value = conf_file
  3450. open_mock.return_value = f
  3451. ambari_server.update_properties(properties, propertyMap)
  3452. properties.store.assert_called_with(f.__enter__.return_value)
  3453. backup_file_in_temp_mock.assert_called_with(conf_file)
  3454. self.assertEquals(2, properties.removeOldProp.call_count)
  3455. self.assertEquals(2, properties.process_pair.call_count)
  3456. properties = MagicMock()
  3457. backup_file_in_temp_mock.reset_mock()
  3458. open_mock.reset_mock()
  3459. ambari_server.update_properties(properties, None)
  3460. properties.store.assert_called_with(f.__enter__.return_value)
  3461. backup_file_in_temp_mock.assert_called_with(conf_file)
  3462. self.assertFalse(properties.removeOldProp.called)
  3463. self.assertFalse(properties.process_pair.called)
  3464. pass
  3465. def test_regexps(self):
  3466. res = re.search(ambari_server.REGEX_HOSTNAME_PORT, "")
  3467. self.assertTrue(res is None)
  3468. res = re.search(ambari_server.REGEX_HOSTNAME_PORT, "ddd")
  3469. self.assertTrue(res is None)
  3470. res = re.search(ambari_server.REGEX_HOSTNAME_PORT, "gg:ff")
  3471. self.assertTrue(res is None)
  3472. res = re.search(ambari_server.REGEX_HOSTNAME_PORT, "gg:55444325")
  3473. self.assertTrue(res is None)
  3474. res = re.search(ambari_server.REGEX_HOSTNAME_PORT, "gg:555")
  3475. self.assertTrue(res is not None)
  3476. res = re.search(ambari_server.REGEX_TRUE_FALSE, "")
  3477. self.assertTrue(res is not None)
  3478. res = re.search(ambari_server.REGEX_TRUE_FALSE, "t")
  3479. self.assertTrue(res is None)
  3480. res = re.search(ambari_server.REGEX_TRUE_FALSE, "trrrr")
  3481. self.assertTrue(res is None)
  3482. res = re.search(ambari_server.REGEX_TRUE_FALSE, "true|false")
  3483. self.assertTrue(res is None)
  3484. res = re.search(ambari_server.REGEX_TRUE_FALSE, "true")
  3485. self.assertTrue(res is not None)
  3486. res = re.search(ambari_server.REGEX_TRUE_FALSE, "false")
  3487. self.assertTrue(res is not None)
  3488. res = re.search(ambari_server.REGEX_ANYTHING, "")
  3489. self.assertTrue(res is not None)
  3490. res = re.search(ambari_server.REGEX_ANYTHING, "t")
  3491. self.assertTrue(res is not None)
  3492. res = re.search(ambari_server.REGEX_ANYTHING, "trrrr")
  3493. self.assertTrue(res is not None)
  3494. def get_sample(self, sample):
  3495. """
  3496. Returns sample file content as string with normalized line endings
  3497. """
  3498. path = self.get_samples_dir(sample)
  3499. return self.get_file_string(path)
  3500. def get_file_string(self, file):
  3501. """
  3502. Returns file content as string with normalized line endings
  3503. """
  3504. string = open(file, 'r').read()
  3505. return self.normalize(string)
  3506. def normalize(self, string):
  3507. """
  3508. Normalizes line ending in string according to platform-default encoding
  3509. """
  3510. return string.replace("\n", os.linesep)
  3511. def get_samples_dir(self, sample):
  3512. """
  3513. Returns full file path by sample name
  3514. """
  3515. testdir = os.path.dirname(__file__)
  3516. return os.path.dirname(testdir) + os.sep + "resources" + os.sep \
  3517. + 'TestAmbaryServer.samples/' + sample
  3518. @patch.object(ambari_server, "get_ambari_properties")
  3519. def test_is_jdbc_user_changed(self, get_ambari_properties_mock):
  3520. previous_user = "previous_user"
  3521. new_user = "new_user"
  3522. get_ambari_properties_mock.return_value = {ambari_server.JDBC_USER_NAME_PROPERTY: previous_user}
  3523. args = MagicMock()
  3524. #check if users are different
  3525. args.database_username = new_user
  3526. result = ambari_server.is_jdbc_user_changed(args)
  3527. self.assertEqual(args.database_username, new_user)
  3528. self.assertTrue(result)
  3529. #check if users are equal
  3530. args.database_username = previous_user
  3531. result = ambari_server.is_jdbc_user_changed(args)
  3532. self.assertEqual(args.database_username, previous_user)
  3533. self.assertFalse(result)
  3534. #check if one of users is None
  3535. args.database_username = None
  3536. result = ambari_server.is_jdbc_user_changed(args)
  3537. self.assertEqual(None, args.database_username)
  3538. self.assertEqual(None, result)
  3539. @patch.object(ambari_server, "get_ambari_properties")
  3540. def test_check_database_name_property(self, get_ambari_properties_mock):
  3541. # negative case
  3542. get_ambari_properties_mock.return_value = {ambari_server.JDBC_DATABASE_PROPERTY: ""}
  3543. try:
  3544. result = ambari_server.check_database_name_property()
  3545. self.fail("Should fail with exception")
  3546. except FatalException as e:
  3547. self.assertTrue('DB Name property not set in config file.' in e.reason)
  3548. # positive case
  3549. dbname = "ambari"
  3550. get_ambari_properties_mock.reset_mock()
  3551. get_ambari_properties_mock.return_value = {ambari_server.JDBC_DATABASE_PROPERTY: dbname}
  3552. try:
  3553. result = ambari_server.check_database_name_property()
  3554. except FatalException:
  3555. self.fail("Setup should be successful")
  3556. @patch.object(ambari_server, "is_jdbc_user_changed")
  3557. @patch.object(ambari_server, 'verify_setup_allowed')
  3558. @patch.object(ambari_server, "get_YN_input")
  3559. @patch.object(ambari_server, "configure_os_settings")
  3560. @patch.object(ambari_server, "download_jdk")
  3561. @patch.object(ambari_server, "configure_postgres")
  3562. @patch.object(ambari_server, "check_postgre_up")
  3563. @patch.object(ambari_server, "check_iptables")
  3564. @patch.object(ambari_server, "check_ambari_user")
  3565. @patch.object(ambari_server, "check_jdbc_drivers")
  3566. @patch.object(ambari_server, "check_selinux")
  3567. @patch.object(ambari_server, "is_local_database")
  3568. @patch.object(ambari_server, "is_root")
  3569. @patch.object(ambari_server, "setup_db")
  3570. @patch.object(ambari_server, "get_is_secure")
  3571. @patch.object(ambari_server, "store_password_file")
  3572. @patch("sys.exit")
  3573. @patch('__builtin__.raw_input')
  3574. def test_ambariServerSetupWithCustomDbName(self, raw_input, exit_mock, store_password_file_mock,
  3575. get_is_secure_mock, setup_db_mock, is_root_mock, is_local_database_mock,
  3576. check_selinux_mock, check_jdbc_drivers_mock, check_ambari_user_mock,
  3577. check_iptables_mock, check_postgre_up_mock, configure_postgres_mock,
  3578. download_jdk_mock, configure_os_settings_mock, get_YN_input,
  3579. verify_setup_allowed_method, is_jdbc_user_changed_mock):
  3580. args = MagicMock()
  3581. raw_input.return_value = ""
  3582. get_YN_input.return_value = False
  3583. verify_setup_allowed_method.return_value = 0
  3584. is_root_mock.return_value = True
  3585. check_selinux_mock.return_value = 0
  3586. check_ambari_user_mock.return_value = 0
  3587. check_jdbc_drivers_mock.return_value = 0
  3588. check_iptables_mock.return_value = (0, "other")
  3589. check_postgre_up_mock.return_value = 0
  3590. is_local_database_mock.return_value = True
  3591. configure_postgres_mock.return_value = 0
  3592. download_jdk_mock.return_value = 0
  3593. configure_os_settings_mock.return_value = 0
  3594. is_jdbc_user_changed_mock.return_value = False
  3595. setup_db_mock.return_value = 0
  3596. get_is_secure_mock.return_value = False
  3597. store_password_file_mock.return_value = "password"
  3598. new_db = "newDBName"
  3599. args.database_name = new_db
  3600. args.database_username = "user"
  3601. args.database_password = "password"
  3602. tempdir = tempfile.gettempdir()
  3603. prop_file = os.path.join(tempdir, "ambari.properties")
  3604. with open(prop_file, "w") as f:
  3605. f.write("server.jdbc.database=oldDBName")
  3606. f.close()
  3607. os.environ[ambari_server.AMBARI_CONF_VAR] = tempdir
  3608. try:
  3609. result = ambari_server.setup(args)
  3610. except FatalException:
  3611. self.fail("Setup should be successful")
  3612. properties = ambari_server.get_ambari_properties()
  3613. self.assertTrue(ambari_server.JDBC_DATABASE_PROPERTY in properties.keys())
  3614. value = properties[ambari_server.JDBC_DATABASE_PROPERTY]
  3615. self.assertEqual(value, new_db)
  3616. del os.environ[ambari_server.AMBARI_CONF_VAR]
  3617. os.remove(prop_file)
  3618. def test_is_valid_filepath(self):
  3619. temp_dir = tempfile.gettempdir()
  3620. temp_file = tempfile.NamedTemporaryFile(mode='r')
  3621. # Correct path to an existing file
  3622. self.assertTrue(temp_file)
  3623. # Correct path to an existing directory
  3624. self.assertFalse(ambari_server.is_valid_filepath(temp_dir), \
  3625. 'is_valid_filepath(path) should return False is path is a directory')
  3626. # Incorrect path
  3627. self.assertFalse(ambari_server.is_valid_filepath(''))
  3628. @patch.object(ambari_server, "search_file")
  3629. @patch.object(ambari_server, "get_validated_string_input")
  3630. def test_setup_ambari_krb5_jaas(self, get_validated_string_input_mock,
  3631. search_file_mock):
  3632. search_file_mock.return_value = ''
  3633. # Should raise exception if jaas_conf_file isn't an existing file
  3634. self.assertRaises(NonFatalException, ambari_server.setup_ambari_krb5_jaas)
  3635. temp_file = tempfile.NamedTemporaryFile(mode='r')
  3636. search_file_mock.return_value = temp_file.name
  3637. get_validated_string_input_mock.side_effect = ['adm@EXAMPLE.COM', temp_file]
  3638. # setup_ambari_krb5_jaas() should return None if everything is OK
  3639. self.assertIsNone(ambari_server.setup_ambari_krb5_jaas())
  3640. self.assertTrue(get_validated_string_input_mock.called)
  3641. self.assertEqual(get_validated_string_input_mock.call_count, 2)