TestAmbariServer.py 179 KB

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