TestAmbariServer.py 190 KB

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