TestAmbariServer.py 201 KB

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