TestAmbariServer.py 185 KB

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