TestAmbariServer.py 188 KB

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