TestAmbariServer.py 213 KB

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