TestAmbaryServer.py 121 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391
  1. '''
  2. Licensed to the Apache Software Foundation (ASF) under one
  3. or more contributor license agreements. See the NOTICE file
  4. distributed with this work for additional information
  5. regarding copyright ownership. The ASF licenses this file
  6. to you under the Apache License, Version 2.0 (the
  7. "License"); you may not use this file except in compliance
  8. with the License. You may obtain a copy of the License at
  9. http://www.apache.org/licenses/LICENSE-2.0
  10. Unless required by applicable law or agreed to in writing, software
  11. distributed under the License is distributed on an "AS IS" BASIS,
  12. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. See the License for the specific language governing permissions and
  14. limitations under the License.
  15. '''
  16. import StringIO
  17. import re
  18. from unittest import TestCase
  19. import sys
  20. from mock.mock import patch
  21. from mock.mock import MagicMock
  22. from mock.mock import create_autospec
  23. import os, errno, tempfile
  24. import signal
  25. import stat
  26. import datetime
  27. import operator
  28. from pwd import getpwnam
  29. # We have to use this import HACK because the filename contains a dash
  30. ambari_server = __import__('ambari-server')
  31. FatalException = ambari_server.FatalException
  32. NonFatalException = ambari_server.NonFatalException
  33. class TestAmbariServer(TestCase):
  34. def setUp(self):
  35. out = StringIO.StringIO()
  36. sys.stdout = out
  37. def tearDown(self):
  38. sys.stdout = sys.__stdout__
  39. @patch.object(ambari_server, 'configure_database_username_password')
  40. @patch.object(ambari_server, 'run_os_command')
  41. @patch('optparse.Values')
  42. def test_configure_pg_hba_ambaridb_users(self, OptParseValuesMock,
  43. run_os_command_method,
  44. configure_database_username_password_method):
  45. # Prepare mocks
  46. run_os_command_method.return_value = (0, "", "")
  47. opvm = OptParseValuesMock.return_value
  48. opvm.database_username = "ffdf"
  49. tf1 = tempfile.NamedTemporaryFile()
  50. ambari_server.PG_HBA_CONF_FILE = tf1.name
  51. # Run test
  52. ambari_server.configure_pg_hba_ambaridb_users()
  53. # Check results
  54. self.assertTrue(run_os_command_method.called)
  55. self.assertTrue(configure_database_username_password_method.called)
  56. string_expected = self.get_file_string(self
  57. .get_samples_dir("configure_pg_hba_ambaridb_users1"))
  58. string_actual = self.get_file_string(ambari_server.PG_HBA_CONF_FILE)
  59. self.assertEquals(string_expected, string_actual)
  60. pass
  61. @patch('__builtin__.raw_input')
  62. def test_servicename_regex(self, raw_input_method):
  63. ''' Test to make sure the service name can contain digits '''
  64. ambari_server.SILENT = False
  65. raw_input_method.return_value = "OT100"
  66. result = ambari_server.get_validated_service_name("ambari", 1)
  67. self.assertEqual("OT100", result, "Not accepting digits")
  68. pass
  69. @patch('__builtin__.raw_input')
  70. def test_dbname_regex(self, raw_input_method):
  71. ''' Test to make sure the service name can contain digits '''
  72. ambari_server.SILENT = False
  73. raw_input_method.return_value = "OT100"
  74. result = ambari_server.get_validated_db_name("ambari")
  75. self.assertEqual("OT100", result, "Not accepting digits")
  76. def test_configure_pg_hba_postgres_user(self):
  77. tf1 = tempfile.NamedTemporaryFile()
  78. ambari_server.PG_HBA_CONF_FILE = tf1.name
  79. with open(ambari_server.PG_HBA_CONF_FILE, 'w') as fout:
  80. fout.write("\n")
  81. fout.write("local all all md5\n")
  82. fout.write("host all all 0.0.0.0/0 md5\n")
  83. fout.write("host all all ::/0 md5\n")
  84. ambari_server.configure_pg_hba_postgres_user()
  85. expected = self.get_file_string(self.get_samples_dir(
  86. "configure_pg_hba_ambaridb_users2"))
  87. result = self.get_file_string(ambari_server.PG_HBA_CONF_FILE)
  88. self.assertEqual(expected, result, "pg_hba_conf not processed")
  89. mode = oct(os.stat(ambari_server.PG_HBA_CONF_FILE)[stat.ST_MODE])
  90. str_mode = str(mode)[-4:]
  91. self.assertEqual("0644", str_mode, "Wrong file permissions")
  92. @patch('__builtin__.raw_input')
  93. def get_choice_string_input(self, raw_input_method):
  94. prompt = "blablabla"
  95. default = "default blablabla"
  96. firstChoice = set(['yes','ye', 'y'])
  97. secondChoice = set(['no','n'])
  98. # test first input
  99. raw_input_method.return_value = "Y"
  100. result = ambari_server.get_choice_string_input(prompt, default,
  101. firstChoice, secondChoice)
  102. self.assertEquals(result, True)
  103. raw_input_method.reset_mock()
  104. # test second input
  105. raw_input_method.return_value = "N"
  106. result = ambari_server.get_choice_string_input(prompt, default,
  107. firstChoice, secondChoice)
  108. self.assertEquals(result, False)
  109. raw_input_method.reset_mock()
  110. # test enter pressed
  111. raw_input_method.return_value = ""
  112. result = ambari_server.get_choice_string_input(prompt, default,
  113. firstChoice, secondChoice)
  114. self.assertEquals(result, default)
  115. raw_input_method.reset_mock()
  116. # test wrong input
  117. list_of_return_values= ['yes', 'dsad', 'fdsfds']
  118. def side_effect(list):
  119. return list_of_return_values.pop()
  120. raw_input_method.side_effect = side_effect
  121. result = ambari_server.get_choice_string_input(prompt, default,
  122. firstChoice, secondChoice)
  123. self.assertEquals(result, True)
  124. self.assertEquals(raw_input_method.call_count, 3)
  125. pass
  126. @patch('re.search')
  127. @patch('__builtin__.raw_input')
  128. @patch('getpass.getpass')
  129. def get_validated_string_input(self, get_pass_method,
  130. raw_input_method, re_search_method):
  131. prompt = "blabla"
  132. default = "default_pass"
  133. pattern = "pattern_pp"
  134. description = "blabla2"
  135. # check password input
  136. self.assertFalse(False, ambari_server.SILENT)
  137. is_pass = True
  138. get_pass_method.return_value = "dfdsfdsfds"
  139. result = ambari_server.get_validated_string_input(prompt, default,
  140. pattern, description, is_pass)
  141. self.assertEquals(get_pass_method.return_value, result)
  142. get_pass_method.assure_called_once(prompt)
  143. self.assertFalse(raw_input_method.called)
  144. # check raw input
  145. get_pass_method.reset_mock()
  146. raw_input_method.reset_mock()
  147. is_pass = False
  148. raw_input_method.return_value = "dkf90ewuf0"
  149. result = ambari_server.get_validated_string_input(prompt, default,
  150. pattern, description, is_pass)
  151. self.assertEquals(raw_input_method.return_value, result)
  152. self.assertFalse(get_pass_method.called)
  153. raw_input_method.assure_called_once(prompt)
  154. def test_get_pass_file_path(self):
  155. result = ambari_server.get_pass_file_path("/etc/ambari/conf_file")
  156. self.assertEquals("/etc/ambari/password.dat", result)
  157. pass
  158. @patch.object(ambari_server, 'setup')
  159. @patch.object(ambari_server, 'start')
  160. @patch.object(ambari_server, 'stop')
  161. @patch.object(ambari_server, 'reset')
  162. @patch('optparse.OptionParser')
  163. def test_main_test_setup(self, OptionParserMock, reset_method, stop_method,
  164. start_method, setup_method):
  165. opm = OptionParserMock.return_value
  166. options = MagicMock()
  167. args = ["setup"]
  168. opm.parse_args.return_value = (options, args)
  169. options.database=None
  170. options.sid_or_sname = "sid"
  171. ambari_server.main()
  172. self.assertTrue(setup_method.called)
  173. self.assertFalse(start_method.called)
  174. self.assertFalse(stop_method.called)
  175. self.assertFalse(reset_method.called)
  176. self.assertFalse(False, ambari_server.VERBOSE)
  177. self.assertFalse(False, ambari_server.SILENT)
  178. @patch.object(ambari_server, 'setup')
  179. @patch.object(ambari_server, 'start')
  180. @patch.object(ambari_server, 'stop')
  181. @patch.object(ambari_server, 'reset')
  182. @patch('optparse.OptionParser')
  183. def test_main_test_start(self, OptionParserMock, reset_method, stop_method,
  184. start_method, setup_method):
  185. opm = OptionParserMock.return_value
  186. options = MagicMock()
  187. args = ["setup"]
  188. opm.parse_args.return_value = (options, args)
  189. options.database=None
  190. options.sid_or_sname = "sname"
  191. ambari_server.main()
  192. self.assertTrue(setup_method.called)
  193. self.assertFalse(start_method.called)
  194. self.assertFalse(stop_method.called)
  195. self.assertFalse(reset_method.called)
  196. self.assertFalse(False, ambari_server.VERBOSE)
  197. self.assertFalse(False, ambari_server.SILENT)
  198. @patch.object(ambari_server, 'setup')
  199. @patch.object(ambari_server, 'start')
  200. @patch.object(ambari_server, 'stop')
  201. @patch.object(ambari_server, 'reset')
  202. @patch('optparse.OptionParser')
  203. def test_main_test_start_debug_short(self, OptionParserMock, reset_method, stop_method,
  204. start_method, setup_method):
  205. opm = OptionParserMock.return_value
  206. options = MagicMock()
  207. args = ["start", "-g"]
  208. opm.parse_args.return_value = (options, args)
  209. options.database=None
  210. options.sid_or_sname = "sid"
  211. ambari_server.main()
  212. self.assertFalse(setup_method.called)
  213. self.assertTrue(start_method.called)
  214. self.assertFalse(stop_method.called)
  215. self.assertFalse(reset_method.called)
  216. self.assertTrue(ambari_server.SERVER_DEBUG_MODE)
  217. @patch.object(ambari_server, 'setup')
  218. @patch.object(ambari_server, 'start')
  219. @patch.object(ambari_server, 'stop')
  220. @patch.object(ambari_server, 'reset')
  221. @patch('optparse.OptionParser')
  222. def test_main_test_start_debug_long(self, OptionParserMock, reset_method, stop_method,
  223. start_method, setup_method):
  224. opm = OptionParserMock.return_value
  225. options = MagicMock()
  226. args = ["start", "--debug"]
  227. opm.parse_args.return_value = (options, args)
  228. options.database=None
  229. options.sid_or_sname = "sid"
  230. ambari_server.main()
  231. self.assertFalse(setup_method.called)
  232. self.assertTrue(start_method.called)
  233. self.assertFalse(stop_method.called)
  234. self.assertFalse(reset_method.called)
  235. self.assertTrue(ambari_server.SERVER_DEBUG_MODE)
  236. @patch.object(ambari_server, 'setup')
  237. @patch.object(ambari_server, 'start')
  238. @patch.object(ambari_server, 'stop')
  239. @patch.object(ambari_server, 'reset')
  240. @patch('optparse.OptionParser')
  241. def test_main_test_stop(self, OptionParserMock, reset_method, stop_method,
  242. start_method, setup_method):
  243. opm = OptionParserMock.return_value
  244. options = MagicMock()
  245. args = ["stop"]
  246. opm.parse_args.return_value = (options, args)
  247. options.database = None
  248. options.sid_or_sname = "sid"
  249. ambari_server.main()
  250. self.assertFalse(setup_method.called)
  251. self.assertFalse(start_method.called)
  252. self.assertTrue(stop_method.called)
  253. self.assertFalse(reset_method.called)
  254. self.assertFalse(False, ambari_server.VERBOSE)
  255. self.assertFalse(False, ambari_server.SILENT)
  256. @patch.object(ambari_server, 'setup')
  257. @patch.object(ambari_server, 'start')
  258. @patch.object(ambari_server, 'stop')
  259. @patch.object(ambari_server, 'reset')
  260. @patch('optparse.OptionParser')
  261. def test_main_test_reset(self, OptionParserMock, reset_method, stop_method,
  262. start_method, setup_method):
  263. opm = OptionParserMock.return_value
  264. options = MagicMock()
  265. args = ["reset"]
  266. opm.parse_args.return_value = (options, args)
  267. options.database=None
  268. options.sid_or_sname = "sid"
  269. ambari_server.main()
  270. self.assertFalse(setup_method.called)
  271. self.assertFalse(start_method.called)
  272. self.assertFalse(stop_method.called)
  273. self.assertTrue(reset_method.called)
  274. self.assertFalse(False, ambari_server.VERBOSE)
  275. self.assertFalse(False, ambari_server.SILENT)
  276. def test_configure_postgresql_conf(self):
  277. tf1 = tempfile.NamedTemporaryFile()
  278. ambari_server.POSTGRESQL_CONF_FILE = tf1.name
  279. with open(ambari_server.POSTGRESQL_CONF_FILE, 'w') as f:
  280. f.write("#listen_addresses = '127.0.0.1' #\n")
  281. f.write("#listen_addresses = '127.0.0.1'")
  282. ambari_server.configure_postgresql_conf()
  283. expected = self.get_file_string(self.get_samples_dir(
  284. "configure_postgresql_conf1"))
  285. result = self.get_file_string(ambari_server.POSTGRESQL_CONF_FILE)
  286. self.assertEqual(expected, result, "postgresql.conf not updated")
  287. mode = oct(os.stat(ambari_server.POSTGRESQL_CONF_FILE)[stat.ST_MODE])
  288. str_mode = str(mode)[-4:]
  289. self.assertEqual("0644", str_mode, "Wrong file permissions")
  290. @patch.object(ambari_server, "restart_postgres")
  291. @patch.object(ambari_server, "get_postgre_status")
  292. @patch.object(ambari_server, "configure_postgresql_conf")
  293. @patch.object(ambari_server, "configure_pg_hba_ambaridb_users")
  294. @patch.object(ambari_server, "configure_pg_hba_postgres_user")
  295. def test_configure_postgres(self, configure_pg_hba_postgres_user_mock,
  296. configure_pg_hba_ambaridb_users_mock,
  297. configure_postgresql_conf_mock,
  298. get_postgre_status_mock,
  299. restart_postgres_mock):
  300. tf1 = tempfile.NamedTemporaryFile()
  301. tf2 = tempfile.NamedTemporaryFile()
  302. ambari_server.PG_HBA_CONF_FILE = tf1.name
  303. ambari_server.PG_HBA_CONF_FILE_BACKUP = tf2.name
  304. args = MagicMock()
  305. out = StringIO.StringIO()
  306. sys.stdout = out
  307. rcode = ambari_server.configure_postgres()
  308. sys.stdout = sys.__stdout__
  309. self.assertEqual(0, rcode)
  310. self.assertEqual("Backup for pg_hba found, reconfiguration not required\n",
  311. out.getvalue())
  312. ambari_server.PG_HBA_CONF_FILE_BACKUP = tempfile.mktemp()
  313. get_postgre_status_mock.return_value = ambari_server.PG_STATUS_RUNNING
  314. restart_postgres_mock.return_value = 0
  315. rcode = ambari_server.configure_postgres()
  316. self.assertTrue(os.path.isfile(ambari_server.PG_HBA_CONF_FILE_BACKUP),
  317. "postgresql.conf backup not created")
  318. self.assertTrue(configure_pg_hba_postgres_user_mock.called)
  319. self.assertTrue(configure_pg_hba_ambaridb_users_mock.called)
  320. mode = oct(os.stat(ambari_server.PG_HBA_CONF_FILE)[stat.ST_MODE])
  321. str_mode = str(mode)[-4:]
  322. self.assertEqual("0644", str_mode, "Wrong file permissions")
  323. self.assertTrue(configure_postgresql_conf_mock.called)
  324. self.assertEqual(0, rcode)
  325. os.unlink(ambari_server.PG_HBA_CONF_FILE_BACKUP)
  326. get_postgre_status_mock.return_value = "stopped"
  327. rcode = ambari_server.configure_postgres()
  328. self.assertEqual(0, rcode)
  329. os.unlink(ambari_server.PG_HBA_CONF_FILE_BACKUP)
  330. sys.stdout = sys.__stdout__
  331. @patch("time.sleep")
  332. @patch("subprocess.Popen")
  333. @patch.object(ambari_server, "run_os_command")
  334. @patch.object(ambari_server, "get_postgre_status")
  335. @patch.object(ambari_server, "print_info_msg")
  336. def test_restart_postgres(self, printInfoMsg_mock, get_postgre_status_mock,
  337. run_os_command_mock, popenMock, sleepMock):
  338. p = MagicMock()
  339. p.poll.return_value = 0
  340. popenMock.return_value = p
  341. rcode = ambari_server.restart_postgres()
  342. self.assertEqual(0, rcode)
  343. p.poll.return_value = None
  344. get_postgre_status_mock.return_value = "stopped"
  345. run_os_command_mock.return_value = (1, None, None)
  346. rcode = ambari_server.restart_postgres()
  347. self.assertEqual(1, rcode)
  348. @patch("shlex.split")
  349. @patch("subprocess.Popen")
  350. @patch.object(ambari_server, "print_info_msg")
  351. def test_run_os_command(self, printInfoMsg_mock, popenMock, splitMock):
  352. p = MagicMock()
  353. p.communicate.return_value = (None, None)
  354. p.returncode = 3
  355. popenMock.return_value = p
  356. # with list arg
  357. cmd = ["exec", "arg"]
  358. ambari_server.run_os_command(cmd)
  359. self.assertFalse(splitMock.called)
  360. # with str arg
  361. resp = ambari_server.run_os_command("runme")
  362. self.assertEqual(3, resp[0])
  363. self.assertTrue(splitMock.called)
  364. @patch.object(ambari_server, "get_conf_dir")
  365. @patch.object(ambari_server, "search_file")
  366. def test_write_property(self, search_file_mock, get_conf_dir_mock):
  367. expected_content = "key1=val1\n"
  368. tf1 = tempfile.NamedTemporaryFile()
  369. search_file_mock.return_value = tf1.name
  370. ambari_server.write_property("key1", "val1")
  371. result = tf1.read()
  372. self.assertTrue(expected_content in result)
  373. @patch.object(ambari_server, "configure_database_username_password")
  374. @patch.object(ambari_server, "run_os_command")
  375. def test_setup_db(self, run_os_command_mock,
  376. configure_database_username_password_mock):
  377. run_os_command_mock.return_value = (0, None, None)
  378. result = ambari_server.setup_db(MagicMock())
  379. self.assertTrue(configure_database_username_password_mock.called)
  380. self.assertEqual(0, result)
  381. @patch.object(ambari_server, "get_YN_input")
  382. @patch.object(ambari_server, "run_os_command")
  383. def test_check_selinux(self, run_os_command_mock, getYNInput_mock):
  384. run_os_command_mock.return_value = (0, ambari_server.SE_STATUS_DISABLED,
  385. None)
  386. rcode = ambari_server.check_selinux()
  387. self.assertEqual(0, rcode)
  388. getYNInput_mock.return_value = True
  389. run_os_command_mock.return_value = (0,"enabled "
  390. + ambari_server.SE_MODE_ENFORCING,
  391. None)
  392. rcode = ambari_server.check_selinux()
  393. self.assertEqual(0, rcode)
  394. self.assertTrue(run_os_command_mock.called)
  395. self.assertTrue(getYNInput_mock.called)
  396. @patch.object(ambari_server, "print_info_msg")
  397. def test_get_ambari_jars(self, printInfoMsg_mock):
  398. env = "/ambari/jars"
  399. os.environ[ambari_server.AMBARI_SERVER_LIB] = env
  400. result = ambari_server.get_ambari_jars()
  401. self.assertEqual(env, result)
  402. del os.environ[ambari_server.AMBARI_SERVER_LIB]
  403. result = ambari_server.get_ambari_jars()
  404. self.assertEqual("/usr/lib/ambari-server", result)
  405. self.assertTrue(printInfoMsg_mock.called)
  406. @patch("glob.glob")
  407. @patch.object(ambari_server, "print_info_msg")
  408. def test_get_share_jars(self, printInfoMsg_mock, globMock):
  409. globMock.return_value = ["one", "two"]
  410. expected = "one:two:one:two"
  411. result = ambari_server.get_share_jars()
  412. self.assertEqual(expected, result)
  413. globMock.return_value = []
  414. expected = ""
  415. result = ambari_server.get_share_jars()
  416. self.assertEqual(expected, result)
  417. @patch("glob.glob")
  418. @patch.object(ambari_server, "print_info_msg")
  419. def test_get_ambari_classpath(self, printInfoMsg_mock, globMock):
  420. globMock.return_value = ["one"]
  421. result = ambari_server.get_ambari_classpath()
  422. self.assertTrue(ambari_server.get_ambari_jars() in result)
  423. self.assertTrue(ambari_server.get_share_jars() in result)
  424. globMock.return_value = []
  425. result = ambari_server.get_ambari_classpath()
  426. self.assertTrue(ambari_server.get_ambari_jars() in result)
  427. self.assertFalse(":" in result)
  428. @patch.object(ambari_server, "print_info_msg")
  429. def test_get_conf_dir(self, printInfoMsg_mock):
  430. env = "/dummy/ambari/conf"
  431. os.environ[ambari_server.AMBARI_CONF_VAR] = env
  432. result = ambari_server.get_conf_dir()
  433. self.assertEqual(env, result)
  434. del os.environ[ambari_server.AMBARI_CONF_VAR]
  435. result = ambari_server.get_conf_dir()
  436. self.assertEqual("/etc/ambari-server/conf", result)
  437. def test_search_file(self):
  438. path = os.path.dirname(__file__)
  439. result = ambari_server.search_file(__file__, path)
  440. expected = os.path.abspath(__file__)
  441. self.assertEqual(expected, result)
  442. result = ambari_server.search_file("non_existent_file", path)
  443. self.assertEqual(None, result)
  444. @patch.object(ambari_server, "search_file")
  445. def test_find_properties_file(self, search_file_mock):
  446. # Testing case when file is not found
  447. search_file_mock.return_value = None
  448. try:
  449. ambari_server.find_properties_file()
  450. self.fail("File not found'")
  451. except FatalException:
  452. # Expected
  453. pass
  454. self.assertTrue(search_file_mock.called)
  455. # Testing case when file is found
  456. value = MagicMock()
  457. search_file_mock.return_value = value
  458. result = ambari_server.find_properties_file()
  459. self.assertTrue(result is value)
  460. @patch.object(ambari_server, "find_properties_file")
  461. @patch("__builtin__.open")
  462. @patch("ambari-server.Properties")
  463. def test_read_ambari_user(self, properties_mock, open_mock, find_properties_file_mock):
  464. open_mock.return_value = "dummy"
  465. find_properties_file_mock.return_value = "dummy"
  466. # Testing with defined user
  467. properties_mock.return_value.__getitem__.return_value = "dummy_user"
  468. user = ambari_server.read_ambari_user()
  469. self.assertEquals(user, "dummy_user")
  470. # Testing with undefined user
  471. properties_mock.return_value.__getitem__.return_value = None
  472. user = ambari_server.read_ambari_user()
  473. self.assertEquals(user, None)
  474. @patch("os.path.exists")
  475. @patch.object(ambari_server, "set_file_permissions")
  476. @patch.object(ambari_server, "run_os_command")
  477. @patch.object(ambari_server, "get_ambari_properties")
  478. @patch.object(ambari_server, "get_value_from_properties")
  479. @patch("os.mkdir")
  480. def test_adjust_directory_permissions(self, mkdir_mock,
  481. get_value_from_properties_mock, get_ambari_properties_mock,
  482. run_os_command_mock, set_file_permissions_mock, exists_mock):
  483. # Testing boostrap dir wipe
  484. properties_mock = MagicMock()
  485. get_value_from_properties_mock.return_value = "dummy_bootstrap_dir"
  486. ambari_server.adjust_directory_permissions("user")
  487. exists_mock.return_value = False
  488. self.assertEquals(run_os_command_mock.call_args_list[0][0][0], "rm -rf dummy_bootstrap_dir")
  489. self.assertTrue(mkdir_mock.called)
  490. set_file_permissions_mock.reset_mock()
  491. # Test recursive calls
  492. old_list = ambari_server.NR_ADJUST_OWNERSHIP_LIST
  493. ambari_server.NR_ADJUST_OWNERSHIP_LIST = [
  494. ( "/etc/ambari-server/conf", "755", "{0}", True ),
  495. ( "/etc/ambari-server/conf/ambari.properties", "644", "{0}", False )
  496. ]
  497. ambari_server.adjust_directory_permissions("user")
  498. self.assertTrue(len(set_file_permissions_mock.call_args_list) ==
  499. len(ambari_server.NR_ADJUST_OWNERSHIP_LIST))
  500. self.assertEquals(set_file_permissions_mock.call_args_list[0][0][3], True)
  501. self.assertEquals(set_file_permissions_mock.call_args_list[1][0][3], False)
  502. ambari_server.NR_ADJUST_OWNERSHIP_LIST = old_list
  503. @patch("os.path.exists")
  504. @patch.object(ambari_server, "run_os_command")
  505. @patch.object(ambari_server, "print_warning_msg")
  506. @patch.object(ambari_server, "print_info_msg")
  507. def test_set_file_permissions(self, print_info_msg_mock, print_warning_msg_mock,
  508. run_os_command_mock, exists_mock):
  509. # Testing not existent file scenario
  510. exists_mock.return_value = False
  511. ambari_server.set_file_permissions("dummy-file", "dummy-mod",
  512. "dummy-user", False)
  513. self.assertFalse(run_os_command_mock.called)
  514. self.assertTrue(print_info_msg_mock.called)
  515. run_os_command_mock.reset_mock()
  516. print_warning_msg_mock.reset_mock()
  517. # Testing OK scenario
  518. exists_mock.return_value = True
  519. run_os_command_mock.side_effect = [(0, "", ""), (0, "", "")]
  520. ambari_server.set_file_permissions("dummy-file", "dummy-mod",
  521. "dummy-user", False)
  522. self.assertTrue(len(run_os_command_mock.call_args_list) == 2)
  523. self.assertFalse(print_warning_msg_mock.called)
  524. run_os_command_mock.reset_mock()
  525. print_warning_msg_mock.reset_mock()
  526. # Testing first command fail
  527. run_os_command_mock.side_effect = [(1, "", ""), (0, "", "")]
  528. ambari_server.set_file_permissions("dummy-file", "dummy-mod",
  529. "dummy-user", False)
  530. self.assertTrue(len(run_os_command_mock.call_args_list) == 2)
  531. self.assertTrue(print_warning_msg_mock.called)
  532. run_os_command_mock.reset_mock()
  533. print_warning_msg_mock.reset_mock()
  534. # Testing second command fail
  535. run_os_command_mock.side_effect = [(0, "", ""), (1, "", "")]
  536. ambari_server.set_file_permissions("dummy-file", "dummy-mod",
  537. "dummy-user", False)
  538. self.assertTrue(len(run_os_command_mock.call_args_list) == 2)
  539. self.assertTrue(print_warning_msg_mock.called)
  540. run_os_command_mock.reset_mock()
  541. print_warning_msg_mock.reset_mock()
  542. # Testing recursive operation
  543. exists_mock.return_value = True
  544. run_os_command_mock.side_effect = [(0, "", ""), (0, "", "")]
  545. ambari_server.set_file_permissions("dummy-file", "dummy-mod",
  546. "dummy-user", True)
  547. self.assertTrue(len(run_os_command_mock.call_args_list) == 2)
  548. self.assertTrue("-R" in run_os_command_mock.call_args_list[0][0][0])
  549. self.assertTrue("-R" in run_os_command_mock.call_args_list[1][0][0])
  550. self.assertFalse(print_warning_msg_mock.called)
  551. run_os_command_mock.reset_mock()
  552. print_warning_msg_mock.reset_mock()
  553. # Testing non-recursive operation
  554. exists_mock.return_value = True
  555. run_os_command_mock.side_effect = [(0, "", ""), (0, "", "")]
  556. ambari_server.set_file_permissions("dummy-file", "dummy-mod",
  557. "dummy-user", False)
  558. self.assertTrue(len(run_os_command_mock.call_args_list) == 2)
  559. self.assertFalse("-R" in run_os_command_mock.call_args_list[0][0][0])
  560. self.assertFalse("-R" in run_os_command_mock.call_args_list[1][0][0])
  561. self.assertFalse(print_warning_msg_mock.called)
  562. run_os_command_mock.reset_mock()
  563. print_warning_msg_mock.reset_mock()
  564. @patch.object(ambari_server, "get_validated_string_input")
  565. @patch.object(ambari_server, "print_info_msg")
  566. @patch.object(ambari_server, "print_warning_msg")
  567. @patch.object(ambari_server, "run_os_command")
  568. def test_create_custom_user(self, run_os_command_mock, print_warning_msg_mock,
  569. print_info_msg_mock, get_validated_string_input_mock):
  570. user = "dummy-user"
  571. get_validated_string_input_mock.return_value = user
  572. # Testing scenario: absent user
  573. run_os_command_mock.side_effect = [(0, "", "")]
  574. result = ambari_server.create_custom_user()
  575. self.assertFalse(print_warning_msg_mock.called)
  576. self.assertEquals(result, (0, user))
  577. print_info_msg_mock.reset_mock()
  578. print_warning_msg_mock.reset_mock()
  579. run_os_command_mock.reset_mock()
  580. # Testing scenario: existing user
  581. run_os_command_mock.side_effect = [(9, "", "")]
  582. result = ambari_server.create_custom_user()
  583. self.assertTrue("User dummy-user already exists" in str(print_info_msg_mock.call_args_list[1][0]))
  584. self.assertEquals(result, (0, user))
  585. print_info_msg_mock.reset_mock()
  586. print_warning_msg_mock.reset_mock()
  587. run_os_command_mock.reset_mock()
  588. # Testing scenario: os command fail
  589. run_os_command_mock.side_effect = [(1, "", "")]
  590. result = ambari_server.create_custom_user()
  591. self.assertTrue(print_warning_msg_mock.called)
  592. self.assertEquals(result, (1, None))
  593. @patch.object(ambari_server, "read_ambari_user")
  594. @patch.object(ambari_server, "get_YN_input")
  595. @patch.object(ambari_server, "create_custom_user")
  596. @patch.object(ambari_server, "write_property")
  597. @patch.object(ambari_server, "adjust_directory_permissions")
  598. @patch.object(ambari_server, "print_error_msg")
  599. def test_check_ambari_user(self, print_error_msg_mock,
  600. adjust_directory_permissions_mock, write_property_mock,
  601. create_custom_user_mock, get_YN_input_mock, read_ambari_user_mock):
  602. # Scenario: user is already defined, user does not want to reconfigure it
  603. read_ambari_user_mock.return_value = "dummy-user"
  604. get_YN_input_mock.return_value = False
  605. result = ambari_server.check_ambari_user()
  606. self.assertTrue(get_YN_input_mock.called)
  607. self.assertFalse(write_property_mock.called)
  608. self.assertFalse(create_custom_user_mock.called)
  609. self.assertTrue(adjust_directory_permissions_mock.called)
  610. self.assertEqual(result, 0)
  611. get_YN_input_mock.reset_mock()
  612. write_property_mock.reset_mock()
  613. adjust_directory_permissions_mock.reset_mock()
  614. create_custom_user_mock.reset_mock()
  615. # Scenario: user is already defined, but user wants to reconfigure it
  616. read_ambari_user_mock.return_value = "dummy-user"
  617. create_custom_user_mock.return_value = (0, "new-dummy-user")
  618. get_YN_input_mock.return_value = True
  619. result = ambari_server.check_ambari_user()
  620. self.assertTrue(get_YN_input_mock.called)
  621. self.assertTrue(write_property_mock.called)
  622. self.assertTrue(write_property_mock.call_args[0][1] == "new-dummy-user")
  623. self.assertTrue(create_custom_user_mock.called)
  624. self.assertTrue(adjust_directory_permissions_mock.called)
  625. self.assertEqual(result, 0)
  626. get_YN_input_mock.reset_mock()
  627. write_property_mock.reset_mock()
  628. adjust_directory_permissions_mock.reset_mock()
  629. create_custom_user_mock.reset_mock()
  630. # Negative scenario: user is already defined, but user wants
  631. # to reconfigure it, user creation failed
  632. read_ambari_user_mock.return_value = "dummy-user"
  633. create_custom_user_mock.return_value = (1, None)
  634. get_YN_input_mock.return_value = True
  635. result = ambari_server.check_ambari_user()
  636. self.assertTrue(get_YN_input_mock.called)
  637. self.assertTrue(create_custom_user_mock.called)
  638. self.assertFalse(write_property_mock.called)
  639. self.assertFalse(adjust_directory_permissions_mock.called)
  640. self.assertEqual(result, 1)
  641. get_YN_input_mock.reset_mock()
  642. create_custom_user_mock.reset_mock()
  643. write_property_mock.reset_mock()
  644. adjust_directory_permissions_mock.reset_mock()
  645. # Scenario: user is not defined (setup process)
  646. read_ambari_user_mock.return_value = None
  647. get_YN_input_mock.return_value = True
  648. create_custom_user_mock.return_value = (0, "dummy-user")
  649. result = ambari_server.check_ambari_user()
  650. self.assertTrue(get_YN_input_mock.called)
  651. self.assertTrue(create_custom_user_mock.called)
  652. self.assertTrue(write_property_mock.called)
  653. self.assertTrue(write_property_mock.call_args[0][1] == "dummy-user")
  654. self.assertTrue(adjust_directory_permissions_mock.called)
  655. self.assertEqual(result, 0)
  656. get_YN_input_mock.reset_mock()
  657. create_custom_user_mock.reset_mock()
  658. write_property_mock.reset_mock()
  659. adjust_directory_permissions_mock.reset_mock()
  660. # Scenario: user is not defined (setup process), user creation failed
  661. read_ambari_user_mock.return_value = None
  662. get_YN_input_mock.return_value = True
  663. create_custom_user_mock.return_value = (1, None)
  664. result = ambari_server.check_ambari_user()
  665. self.assertTrue(get_YN_input_mock.called)
  666. self.assertTrue(create_custom_user_mock.called)
  667. self.assertFalse(write_property_mock.called)
  668. self.assertFalse(adjust_directory_permissions_mock.called)
  669. self.assertEqual(result, 1)
  670. get_YN_input_mock.reset_mock()
  671. create_custom_user_mock.reset_mock()
  672. write_property_mock.reset_mock()
  673. adjust_directory_permissions_mock.reset_mock()
  674. # negative scenario: user is not defined (setup process), user creation failed
  675. read_ambari_user_mock.return_value = None
  676. get_YN_input_mock.return_value = True
  677. create_custom_user_mock.return_value = (1, None)
  678. result = ambari_server.check_ambari_user()
  679. self.assertTrue(get_YN_input_mock.called)
  680. self.assertTrue(create_custom_user_mock.called)
  681. self.assertFalse(write_property_mock.called)
  682. self.assertFalse(adjust_directory_permissions_mock.called)
  683. self.assertEqual(result, 1)
  684. get_YN_input_mock.reset_mock()
  685. create_custom_user_mock.reset_mock()
  686. write_property_mock.reset_mock()
  687. adjust_directory_permissions_mock.reset_mock()
  688. # Scenario: user is not defined and left to be root
  689. read_ambari_user_mock.return_value = None
  690. get_YN_input_mock.return_value = False
  691. result = ambari_server.check_ambari_user()
  692. self.assertTrue(get_YN_input_mock.called)
  693. self.assertFalse(create_custom_user_mock.called)
  694. self.assertTrue(write_property_mock.called)
  695. self.assertTrue(write_property_mock.call_args[0][1] == "root")
  696. self.assertTrue(adjust_directory_permissions_mock.called)
  697. self.assertEqual(result, 0)
  698. @patch.object(ambari_server, "search_file")
  699. @patch("__builtin__.open")
  700. @patch.object(ambari_server, "read_ambari_user")
  701. @patch.object(ambari_server, "set_file_permissions")
  702. def test_store_password_file(self, set_file_permissions_mock,
  703. read_ambari_user_mock, open_mock, search_file_mock):
  704. search_file_mock.return_value = "/etc/ambari-server/conf/ambari.properties"
  705. open_mock.return_value = MagicMock()
  706. ambari_server.store_password_file("password", "passfile")
  707. self.assertTrue(set_file_permissions_mock.called)
  708. @patch.object(ambari_server, "run_os_command")
  709. def test_check_iptables(self, run_os_command_mock):
  710. run_os_command_mock.return_value = (1, "test", "")
  711. rcode, info = ambari_server.check_iptables()
  712. self.assertEqual(1, rcode)
  713. self.assertEqual("test", info)
  714. run_os_command_mock.return_value = (2, "",
  715. ambari_server.IP_TBLS_SRVC_NT_FND)
  716. rcode = ambari_server.check_iptables()
  717. self.assertEqual(0, rcode)
  718. def test_dlprogress(self):
  719. out = StringIO.StringIO()
  720. sys.stdout = out
  721. ambari_server.dlprogress("filename", 10, 2, 100)
  722. sys.stdout = sys.__stdout__
  723. self.assertNotEqual("", out.getvalue())
  724. @patch("urllib2.urlopen")
  725. @patch("__builtin__.open")
  726. @patch.object(ambari_server, "dlprogress")
  727. def test_track_jdk(self, dlprogress_mock, openMock, urlopenMock):
  728. u = MagicMock()
  729. u.info.return_value = {"Content-Length":"24576"}
  730. chunks = [None, "second", "first"]
  731. def side_effect(*args, **kwargs):
  732. return chunks.pop()
  733. u.read.side_effect = side_effect
  734. urlopenMock.return_value = u
  735. f = MagicMock()
  736. openMock.return_value = f
  737. ambari_server.track_jdk("base", "url", "local")
  738. self.assertEqual(0, len(chunks))
  739. self.assertTrue(f.write.called)
  740. self.assertTrue(f.flush.called)
  741. self.assertTrue(f.close.called)
  742. self.assertEqual(2, len(dlprogress_mock.call_args_list))
  743. @patch("shutil.copy")
  744. @patch("os.path.join")
  745. @patch("os.path.exists")
  746. @patch.object(ambari_server, "get_ambari_properties")
  747. def test_install_jce_manualy(self, get_ambari_properties_mock,\
  748. os_path_exists_mock, os_path_join_mock,\
  749. shutil_copy_mock):
  750. args = MagicMock()
  751. args.jce_policy = "somewhere"
  752. p = MagicMock()
  753. get_ambari_properties_mock.return_value = p
  754. p.__getitem__.side_effect = None
  755. p.__getitem__.return_value = "somewhere"
  756. os_path_exists_mock.return_value = True
  757. os_path_join_mock.return_value = \
  758. "/var/lib/ambari-server/resources/jce_policy-6.zip"
  759. ambari_server.install_jce_manualy(args)
  760. self.assertTrue(shutil_copy_mock.called)
  761. shutil_copy_mock.side_effect = Exception("exception")
  762. try:
  763. ambari_server.install_jce_manualy(args)
  764. self.fail("Should throw exception because of not found jce_policy-6.zip")
  765. except Exception:
  766. # Expected
  767. self.assertTrue(shutil_copy_mock.called)
  768. pass
  769. shutil_copy_mock.side_effect = None
  770. args.jce_policy = None
  771. ambari_server.install_jce_manualy(args)
  772. @patch.object(ambari_server, 'read_ambari_user')
  773. @patch.object(ambari_server, "get_validated_string_input")
  774. @patch.object(ambari_server, "find_properties_file")
  775. @patch.object(ambari_server, "get_ambari_properties")
  776. @patch.object(ambari_server, "is_server_runing")
  777. @patch.object(ambari_server, "import_cert_and_key_action")
  778. @patch.object(ambari_server, "get_YN_input")
  779. @patch("__builtin__.open")
  780. @patch("ambari-server.Properties")
  781. @patch.object(ambari_server, "is_root")
  782. @patch.object(ambari_server, "is_valid_cert_host")
  783. @patch.object(ambari_server, "is_valid_cert_exp")
  784. def test_setup_https(self, is_valid_cert_exp_mock, is_valid_cert_host_mock,\
  785. is_root_mock, Properties_mock, open_Mock, get_YN_input_mock,\
  786. import_cert_and_key_action_mock,
  787. is_server_runing_mock, get_ambari_properties_mock,\
  788. find_properties_file_mock,\
  789. get_validated_string_input_mock,
  790. read_ambari_user_method):
  791. is_valid_cert_exp_mock.return_value=True
  792. is_valid_cert_host_mock.return_value=True
  793. args = MagicMock()
  794. open_Mock.return_value = file
  795. p = get_ambari_properties_mock.return_value
  796. # Testing call under non-root
  797. is_root_mock.return_value = False
  798. try:
  799. ambari_server.setup_https(args)
  800. self.fail("Should throw exception")
  801. except FatalException as fe:
  802. # Expected
  803. self.assertTrue("root-level" in fe.reason)
  804. pass
  805. # Testing call under root
  806. is_root_mock.return_value = True
  807. read_ambari_user_method.return_value = None
  808. #Case #1: if client ssl is on and user didnt choose
  809. #disable ssl option and choose import certs and keys
  810. p.get_property.side_effect = ["key_dir","5555","6666", "true"]
  811. get_YN_input_mock.side_effect = [False,True]
  812. get_validated_string_input_mock.side_effect = ["4444"]
  813. get_property_expected = "[call('security.server.keys_dir'),\n"+\
  814. " call('client.api.ssl.port'),\n"+\
  815. " call('client.api.ssl.port'),\n call('api.ssl')]"
  816. process_pair_expected = "[call('client.api.ssl.port', '4444')]"
  817. ambari_server.SILENT = False
  818. ambari_server.setup_https(args)
  819. self.assertTrue(p.process_pair.called)
  820. self.assertTrue(p.get_property.call_count == 4)
  821. self.assertEqual(str(p.get_property.call_args_list), get_property_expected)
  822. self.assertEqual(str(p.process_pair.call_args_list), process_pair_expected)
  823. self.assertTrue(p.store.called)
  824. self.assertTrue(import_cert_and_key_action_mock.called)
  825. p.process_pair.reset_mock()
  826. p.get_property.reset_mock()
  827. p.store.reset_mock()
  828. import_cert_and_key_action_mock.reset_mock()
  829. #Case #2: if client ssl is on and user choose to disable ssl option
  830. p.get_property.side_effect = ["key_dir","", "true"]
  831. get_YN_input_mock.side_effect = [True]
  832. get_validated_string_input_mock.side_effect = ["4444"]
  833. get_property_expected = "[call('security.server.keys_dir'),\n"+\
  834. " call('client.api.ssl.port'),\n call('api.ssl')]"
  835. process_pair_expected = "[call('api.ssl', 'false')]"
  836. ambari_server.setup_https(args)
  837. self.assertTrue(p.process_pair.called)
  838. self.assertTrue(p.get_property.call_count == 3)
  839. self.assertEqual(str(p.get_property.call_args_list), get_property_expected)
  840. self.assertEqual(str(p.process_pair.call_args_list), process_pair_expected)
  841. self.assertTrue(p.store.called)
  842. self.assertFalse(import_cert_and_key_action_mock.called)
  843. p.process_pair.reset_mock()
  844. p.get_property.reset_mock()
  845. p.store.reset_mock()
  846. import_cert_and_key_action_mock.reset_mock()
  847. #Case #3: if client ssl is off and user choose option
  848. #to import cert and keys
  849. p.get_property.side_effect = ["key_dir","", None]
  850. get_YN_input_mock.side_effect = [True, True]
  851. get_validated_string_input_mock.side_effect = ["4444"]
  852. get_property_expected = "[call('security.server.keys_dir'),\n"+\
  853. " call('client.api.ssl.port'),\n call('api.ssl')]"
  854. process_pair_expected = "[call('client.api.ssl.port', '4444')]"
  855. ambari_server.setup_https(args)
  856. self.assertTrue(p.process_pair.called)
  857. self.assertTrue(p.get_property.call_count == 3)
  858. self.assertEqual(str(p.get_property.call_args_list), get_property_expected)
  859. self.assertEqual(str(p.process_pair.call_args_list), process_pair_expected)
  860. self.assertTrue(p.store.called)
  861. self.assertTrue(import_cert_and_key_action_mock.called)
  862. p.process_pair.reset_mock()
  863. p.get_property.reset_mock()
  864. p.store.reset_mock()
  865. import_cert_and_key_action_mock.reset_mock()
  866. #Case #4: if client ssl is off and
  867. #user did not choose option to import cert and keys
  868. p.get_property.side_effect = ["key_dir","", None]
  869. get_YN_input_mock.side_effect = [False]
  870. get_validated_string_input_mock.side_effect = ["4444"]
  871. get_property_expected = "[call('security.server.keys_dir'),\n"+\
  872. " call('client.api.ssl.port'),\n call('api.ssl')]"
  873. process_pair_expected = "[]"
  874. ambari_server.setup_https(args)
  875. self.assertFalse(p.process_pair.called)
  876. self.assertTrue(p.get_property.call_count == 3)
  877. self.assertEqual(str(p.get_property.call_args_list), get_property_expected)
  878. self.assertEqual(str(p.process_pair.call_args_list), process_pair_expected)
  879. self.assertFalse(p.store.called)
  880. self.assertFalse(import_cert_and_key_action_mock.called)
  881. p.process_pair.reset_mock()
  882. p.get_property.reset_mock()
  883. p.store.reset_mock()
  884. import_cert_and_key_action_mock.reset_mock()
  885. ambari_server.SILENT = True
  886. @patch.object(ambari_server, "import_cert_and_key")
  887. def test_import_cert_and_key_action(self, import_cert_and_key_mock):
  888. import_cert_and_key_mock.return_value = True
  889. properties = MagicMock()
  890. properties.get_property.side_effect = ["key_dir","5555","6666", "true"]
  891. properties.process_pair = MagicMock()
  892. expect_process_pair = "[call('client.api.ssl.cert_name', 'https.crt'),\n"+\
  893. " call('client.api.ssl.key_name', 'https.key'),\n"+\
  894. " call('api.ssl', 'true')]"
  895. ambari_server.import_cert_and_key_action("key_dir", properties)
  896. self.assertEqual(str(properties.process_pair.call_args_list),\
  897. expect_process_pair)
  898. @patch.object(ambari_server, "read_ambari_user")
  899. @patch.object(ambari_server, "set_file_permissions")
  900. @patch.object(ambari_server, "import_file_to_keystore")
  901. @patch("__builtin__.open")
  902. @patch.object(ambari_server, "run_os_command")
  903. @patch("os.path.join")
  904. @patch.object(ambari_server, "get_validated_filepath_input")
  905. @patch.object(ambari_server, "get_validated_string_input")
  906. @patch.object(ambari_server, "is_valid_cert_host")
  907. @patch.object(ambari_server, "is_valid_cert_exp")
  908. def test_import_cert_and_key(self,is_valid_cert_exp_mock,\
  909. is_valid_cert_host_mock,\
  910. get_validated_string_input_mock,\
  911. get_validated_filepath_input_mock,\
  912. os_path_join_mock, run_os_command_mock,\
  913. open_mock, import_file_to_keystore_mock,\
  914. set_file_permissions_mock, read_ambari_user_mock):
  915. is_valid_cert_exp_mock.return_value=True
  916. is_valid_cert_host_mock.return_value=True
  917. get_validated_string_input_mock.return_value = "password"
  918. get_validated_filepath_input_mock.side_effect = \
  919. ["cert_file_path","key_file_path"]
  920. os_path_join_mock.side_effect = ["cert_file_path","key_file_path",\
  921. "keystore_cert_file_path",\
  922. "keystore_cert_key_file_path",]
  923. run_os_command_mock.return_value = (0, "", "")
  924. om = open_mock.return_value
  925. expect_import_file_to_keystore = "[call('cert_file_path',"+\
  926. " 'keystore_cert_file_path'),\n"+\
  927. " call('key_file_path',"+\
  928. " 'keystore_cert_key_file_path')]"
  929. ambari_server.import_cert_and_key("key_dir")
  930. self.assertTrue(get_validated_filepath_input_mock.call_count == 2)
  931. self.assertTrue(get_validated_string_input_mock.called)
  932. self.assertTrue(os_path_join_mock.call_count == 4)
  933. self.assertTrue(set_file_permissions_mock.call_count == 2)
  934. self.assertEqual(str(import_file_to_keystore_mock.call_args_list),\
  935. expect_import_file_to_keystore)
  936. @patch.object(ambari_server, "generate_random_string")
  937. @patch.object(ambari_server, "read_ambari_user")
  938. @patch.object(ambari_server, "set_file_permissions")
  939. @patch.object(ambari_server, "import_file_to_keystore")
  940. @patch("__builtin__.open")
  941. @patch.object(ambari_server, "run_os_command")
  942. @patch("os.path.join")
  943. @patch.object(ambari_server, "get_validated_filepath_input")
  944. @patch.object(ambari_server, "get_validated_string_input")
  945. @patch.object(ambari_server, "is_valid_cert_host")
  946. @patch.object(ambari_server, "is_valid_cert_exp")
  947. def test_import_cert_and_key_with_empty_password(self, \
  948. is_valid_cert_exp_mock, is_valid_cert_host_mock,
  949. get_validated_string_input_mock, get_validated_filepath_input_mock,\
  950. os_path_join_mock, run_os_command_mock, open_mock, \
  951. import_file_to_keystore_mock, set_file_permissions_mock,
  952. read_ambari_user_mock, generate_random_string_mock):
  953. is_valid_cert_exp_mock.return_value=True
  954. is_valid_cert_host_mock.return_value=True
  955. get_validated_string_input_mock.return_value = ""
  956. get_validated_filepath_input_mock.side_effect =\
  957. ["cert_file_path","key_file_path"]
  958. os_path_join_mock.side_effect = ["cert_file_path","key_file_path",\
  959. "keystore_cert_file_path",\
  960. "keystore_cert_key_file_path",]
  961. run_os_command_mock.return_value = (0, "", "")
  962. expect_import_file_to_keystore = "[call('cert_file_path',"+\
  963. " 'keystore_cert_file_path'),\n"+\
  964. " call('key_file_path.secured',"+\
  965. " 'keystore_cert_key_file_path')]"
  966. ambari_server.import_cert_and_key("key_dir")
  967. self.assertEquals(get_validated_filepath_input_mock.call_count, 2)
  968. self.assertTrue(get_validated_string_input_mock.called)
  969. self.assertEquals(os_path_join_mock.call_count, 4)
  970. self.assertEquals(set_file_permissions_mock.call_count, 2)
  971. self.assertEqual(str(import_file_to_keystore_mock.call_args_list),\
  972. expect_import_file_to_keystore)
  973. self.assertTrue(generate_random_string_mock.called)
  974. def test_is_valid_cert_exp(self):
  975. #No data in certInfo
  976. certInfo = {}
  977. is_valid = ambari_server.is_valid_cert_exp(certInfo)
  978. self.assertFalse(is_valid)
  979. #Issued in future
  980. issuedOn = (datetime.datetime.now() + datetime.timedelta(hours=1000)).strftime(ambari_server.SSL_DATE_FORMAT)
  981. expiresOn = (datetime.datetime.now() + datetime.timedelta(hours=2000)).strftime(ambari_server.SSL_DATE_FORMAT)
  982. certInfo = {ambari_server.NOT_BEFORE_ATTR : issuedOn,
  983. ambari_server.NOT_AFTER_ATTR : expiresOn}
  984. is_valid = ambari_server.is_valid_cert_exp(certInfo)
  985. self.assertFalse(is_valid)
  986. #Was expired
  987. issuedOn = (datetime.datetime.now() - datetime.timedelta(hours=2000)).strftime(ambari_server.SSL_DATE_FORMAT)
  988. expiresOn = (datetime.datetime.now() - datetime.timedelta(hours=1000)).strftime(ambari_server.SSL_DATE_FORMAT)
  989. certInfo = {ambari_server.NOT_BEFORE_ATTR : issuedOn,
  990. ambari_server.NOT_AFTER_ATTR : expiresOn}
  991. is_valid = ambari_server.is_valid_cert_exp(certInfo)
  992. self.assertFalse(is_valid)
  993. #Valid
  994. issuedOn = (datetime.datetime.now() - datetime.timedelta(hours=2000)).strftime(ambari_server.SSL_DATE_FORMAT)
  995. expiresOn = (datetime.datetime.now() + datetime.timedelta(hours=1000)).strftime(ambari_server.SSL_DATE_FORMAT)
  996. certInfo = {ambari_server.NOT_BEFORE_ATTR : issuedOn,
  997. ambari_server.NOT_AFTER_ATTR : expiresOn}
  998. is_valid = ambari_server.is_valid_cert_exp(certInfo)
  999. self.assertTrue(is_valid)
  1000. @patch.object(ambari_server, "get_fqdn")
  1001. def is_valid_cert_host(self, get_fqdn_mock):
  1002. #No data in certInfo
  1003. certInfo = {}
  1004. is_valid = ambari_server.is_valid_cert_host(certInfo)
  1005. self.assertFalse(is_valid)
  1006. #Failed to get FQDN
  1007. get_fqdn_mock.return_value = None
  1008. is_valid = ambari_server.is_valid_cert_host(certInfo)
  1009. self.assertFalse(is_valid)
  1010. #FQDN and Common name in certificated don't correspond
  1011. get_fqdn_mock.return_value = 'host1'
  1012. certInfo = {ambari_server.COMMON_NAME_ATTR : 'host2'}
  1013. is_valid = ambari_server.is_valid_cert_host(certInfo)
  1014. self.assertFalse(is_valid)
  1015. #FQDN and Common name in certificated correspond
  1016. get_fqdn_mock.return_value = 'host1'
  1017. certInfo = {ambari_server.COMMON_NAME_ATTR : 'host1'}
  1018. is_valid = ambari_server.is_valid_cert_host(certInfo)
  1019. self.assertFalse(is_valid)
  1020. @patch("socket.getfqdn")
  1021. @patch("urllib2.urlopen")
  1022. @patch.object(ambari_server, "get_ambari_properties")
  1023. def test_get_fqdn(self, get_ambari_properties_mock, url_open_mock, getfqdn_mock):
  1024. #No ambari.properties
  1025. get_ambari_properties_mock.return_value = -1
  1026. fqdn = ambari_server.get_fqdn()
  1027. self.assertEqual(fqdn, None)
  1028. #Read FQDN from service
  1029. p = MagicMock()
  1030. p[ambari_server.GET_FQDN_SERVICE_URL] = 'someurl'
  1031. get_ambari_properties_mock.return_value = p
  1032. u = MagicMock()
  1033. host = 'host1.domain.com'
  1034. u.read.return_value = host
  1035. url_open_mock.return_value = u
  1036. fqdn = ambari_server.get_fqdn()
  1037. self.assertEqual(fqdn, host)
  1038. #Failed to read FQDN from service, getting from socket
  1039. u.reset_mock()
  1040. u.side_effect = Exception("Failed to read FQDN from service")
  1041. getfqdn_mock.return_value = host
  1042. fqdn = ambari_server.get_fqdn()
  1043. self.assertEqual(fqdn, host)
  1044. @patch.object(ambari_server, "run_os_command")
  1045. def test_get_cert_info(self, run_os_command_mock):
  1046. # Error running openssl command
  1047. path = 'path/to/certificate'
  1048. run_os_command_mock.return_value = -1, None, None
  1049. cert_info = ambari_server.get_cert_info(path)
  1050. self.assertEqual(cert_info, None)
  1051. #Empty result of openssl command
  1052. run_os_command_mock.return_value = 0, None, None
  1053. cert_info = ambari_server.get_cert_info(path)
  1054. self.assertEqual(cert_info, None)
  1055. #Positive scenario
  1056. notAfter = 'Jul 3 14:12:57 2014 GMT'
  1057. notBefore = 'Jul 3 14:12:57 2013 GMT'
  1058. attr1_key = 'A'
  1059. attr1_value = 'foo'
  1060. attr2_key = 'B'
  1061. attr2_value = 'bar'
  1062. attr3_key = 'CN'
  1063. attr3_value = 'host.domain.com'
  1064. subject_pattern = '/{attr1_key}={attr1_value}/{attr2_key}={attr2_value}/{attr3_key}={attr3_value}'
  1065. subject = subject_pattern.format(attr1_key = attr1_key, attr1_value = attr1_value,
  1066. attr2_key = attr2_key, attr2_value = attr2_value,
  1067. attr3_key = attr3_key, attr3_value = attr3_value)
  1068. out_pattern = """
  1069. notAfter={notAfter}
  1070. notBefore={notBefore}
  1071. subject={subject}
  1072. -----BEGIN CERTIFICATE-----
  1073. MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
  1074. ...
  1075. 5lqd8XxOGSYoMOf+70BLN2sB
  1076. -----END CERTIFICATE-----
  1077. """
  1078. out = out_pattern.format(notAfter = notAfter, notBefore = notBefore, subject = subject)
  1079. run_os_command_mock.return_value = 0, out, None
  1080. cert_info = ambari_server.get_cert_info(path)
  1081. self.assertEqual(cert_info['notAfter'], notAfter)
  1082. self.assertEqual(cert_info['notBefore'], notBefore)
  1083. self.assertEqual(cert_info['subject'], subject)
  1084. self.assertEqual(cert_info[attr1_key], attr1_value)
  1085. self.assertEqual(cert_info[attr2_key], attr2_value)
  1086. self.assertEqual(cert_info[attr3_key], attr3_value)
  1087. @patch.object(ambari_server, "run_os_command")
  1088. @patch("__builtin__.open")
  1089. @patch("os.path.exists")
  1090. def test_is_server_runing(self, os_path_exists_mock, open_mock,\
  1091. run_os_command_mock):
  1092. os_path_exists_mock.return_value = True
  1093. f = open_mock.return_value
  1094. f.readline.return_value = "111"
  1095. run_os_command_mock.return_value = 0, "", ""
  1096. status, pid = ambari_server.is_server_runing()
  1097. self.assertTrue(status)
  1098. self.assertEqual(111, pid)
  1099. os_path_exists_mock.return_value = False
  1100. status, pid = ambari_server.is_server_runing()
  1101. self.assertFalse(status)
  1102. @patch.object(ambari_server, "install_jce_manualy")
  1103. @patch("os.stat")
  1104. @patch("os.path.isfile")
  1105. @patch("os.path.exists")
  1106. @patch.object(ambari_server, "track_jdk")
  1107. @patch.object(ambari_server, "get_YN_input")
  1108. @patch.object(ambari_server, "run_os_command")
  1109. @patch.object(ambari_server, "write_property")
  1110. @patch.object(ambari_server, "print_info_msg")
  1111. @patch.object(ambari_server, "get_JAVA_HOME")
  1112. @patch.object(ambari_server, "get_ambari_properties")
  1113. @patch("shutil.copyfile")
  1114. def test_download_jdk(self, copyfile_mock, get_ambari_properties_mock, get_JAVA_HOME_mock,\
  1115. print_info_msg_mock, write_property_mock,\
  1116. run_os_command_mock, get_YN_input_mock, track_jdk_mock,
  1117. path_existsMock, path_isfileMock, statMock,\
  1118. install_jce_manualy_mock):
  1119. args = MagicMock()
  1120. args.java_home = "somewhere"
  1121. path_existsMock.return_value = False
  1122. get_JAVA_HOME_mock.return_value = False
  1123. get_ambari_properties_mock.return_value = -1
  1124. # Test case: ambari.properties not found
  1125. try:
  1126. ambari_server.download_jdk(args)
  1127. self.fail("Should throw exception because of not found ambari.properties")
  1128. except FatalException:
  1129. # Expected
  1130. self.assertTrue(get_ambari_properties_mock.called)
  1131. pass
  1132. # Test case: JDK already exists
  1133. p = MagicMock()
  1134. get_ambari_properties_mock.return_value = p
  1135. p.__getitem__.return_value = "somewhere"
  1136. get_JAVA_HOME_mock.return_value = True
  1137. path_existsMock.return_value = True
  1138. rcode = ambari_server.download_jdk(args)
  1139. self.assertEqual(0, rcode)
  1140. # Test case: java home setup
  1141. get_JAVA_HOME_mock.return_value = False
  1142. rcode = ambari_server.download_jdk(args)
  1143. self.assertEqual(0, rcode)
  1144. self.assertTrue(write_property_mock.called)
  1145. # Test case: JDK file does not exist, property not defined
  1146. path_existsMock.return_value = False
  1147. p = MagicMock()
  1148. get_ambari_properties_mock.return_value = p
  1149. p.__getitem__.side_effect = KeyError("test exception")
  1150. try:
  1151. ambari_server.download_jdk(args)
  1152. self.fail("Should throw exception")
  1153. except FatalException:
  1154. # Expected
  1155. pass
  1156. # Test case: JDK file does not exist, os command (curl) result does not
  1157. # contain Content-Length
  1158. p.__getitem__.return_value = "somewhere"
  1159. p.__getitem__.side_effect = None
  1160. path_existsMock.return_value = False
  1161. run_os_command_mock.return_value = (0, "Wrong out", None)
  1162. try:
  1163. ambari_server.download_jdk(args)
  1164. self.fail("Should throw exception")
  1165. except FatalException:
  1166. # Expected
  1167. pass
  1168. # Successful JDK download
  1169. ambari_server.JDK_INSTALL_DIR = os.getcwd()
  1170. get_YN_input_mock.return_value = True
  1171. run_os_command_mock.return_value = (0, "Creating jdk-1.2/jre"
  1172. "Content-Length: 32000\r\n"
  1173. , None)
  1174. statResult = MagicMock()
  1175. statResult.st_size = 32000
  1176. statMock.return_value = statResult
  1177. rcode = ambari_server.download_jdk(args)
  1178. self.assertEqual(0, rcode)
  1179. # Test case: JDK file does not exist, jdk-location argument passed
  1180. p.__getitem__.return_value = "somewhere"
  1181. p.__getitem__.side_effect = None
  1182. args.jdk_location = "/existing/jdk/file"
  1183. path_existsMock.side_effect = [False, False, True, False, False, False]
  1184. ambari_server.download_jdk(args)
  1185. self.assertTrue(copyfile_mock.called)
  1186. copyfile_mock.reset_mock()
  1187. # Negative test case: JDK file does not exist, jdk-location argument
  1188. # (non-accessible file) passed
  1189. p.__getitem__.return_value = "somewhere"
  1190. p.__getitem__.side_effect = None
  1191. args.jdk_location = "/existing/jdk/file"
  1192. path_existsMock.side_effect = [False, False, True, False, False, False]
  1193. def copyfile_side_effect(s, d):
  1194. raise Exception("TerribleException")
  1195. copyfile_mock.side_effect = copyfile_side_effect
  1196. try:
  1197. ambari_server.download_jdk(args)
  1198. self.fail("Should throw exception")
  1199. except FatalException:
  1200. # Expected
  1201. self.assertTrue(copyfile_mock.called)
  1202. copyfile_mock.reset_mock()
  1203. # Test case: jdk is already installed, ensure that JCE check is not skipped
  1204. p = MagicMock()
  1205. get_ambari_properties_mock.return_value = p
  1206. p.__getitem__.return_value = "somewhere"
  1207. get_JAVA_HOME_mock.return_value = True
  1208. path_existsMock.return_value = True
  1209. install_jce_manualy_mock.return_value = 1
  1210. with patch.object(ambari_server, "download_jce_policy") as download_jce_policy_mock:
  1211. rcode = ambari_server.download_jdk(args)
  1212. self.assertTrue(download_jce_policy_mock.called)
  1213. @patch.object(ambari_server, "run_os_command")
  1214. def test_get_postgre_status(self, run_os_command_mock):
  1215. run_os_command_mock.return_value = (1, "running", None)
  1216. result = ambari_server.get_postgre_status()
  1217. self.assertEqual("running", result)
  1218. run_os_command_mock.return_value = (1, "wrong", None)
  1219. result = ambari_server.get_postgre_status()
  1220. self.assertEqual(None, result)
  1221. @patch("time.sleep")
  1222. @patch("subprocess.Popen")
  1223. @patch.object(ambari_server, "run_os_command")
  1224. @patch.object(ambari_server, "get_postgre_status")
  1225. def test_check_postgre_up(self, get_postgre_status_mock, run_os_command_mock,
  1226. popen_mock, sleep_mock):
  1227. p = MagicMock()
  1228. p.poll.return_value = 0
  1229. popen_mock.return_value = p
  1230. run_os_command_mock.return_value = (0, None, None)
  1231. rcode = ambari_server.check_postgre_up()
  1232. self.assertEqual(0, rcode)
  1233. p.poll.return_value = 4
  1234. get_postgre_status_mock.return_value = None
  1235. rcode = ambari_server.check_postgre_up()
  1236. self.assertEqual(4, rcode)
  1237. @patch("platform.linux_distribution")
  1238. @patch("platform.system")
  1239. @patch.object(ambari_server, "print_info_msg")
  1240. @patch.object(ambari_server, "print_error_msg")
  1241. @patch.object(ambari_server, "get_ambari_properties")
  1242. @patch.object(ambari_server, "write_property")
  1243. @patch.object(ambari_server, "get_conf_dir")
  1244. def test_configure_os_settings(self, get_conf_dir_mock, write_property_mock, get_ambari_properties_mock,
  1245. print_error_msg_mock, print_info_msg_mock,
  1246. systemMock, distMock):
  1247. get_ambari_properties_mock.return_value = -1
  1248. rcode = ambari_server.configure_os_settings()
  1249. self.assertEqual(-1, rcode)
  1250. p = MagicMock()
  1251. p[ambari_server.OS_TYPE_PROPERTY] = 'somevalue'
  1252. get_ambari_properties_mock.return_value = p
  1253. rcode = ambari_server.configure_os_settings()
  1254. self.assertEqual(0, rcode)
  1255. p.__getitem__.return_value = ""
  1256. systemMock.return_value = "NonLinux"
  1257. rcode = ambari_server.configure_os_settings()
  1258. self.assertEqual(-1, rcode)
  1259. systemMock.return_value = "Linux"
  1260. distMock.return_value = ("CentOS", "6.3", None)
  1261. rcode = ambari_server.configure_os_settings()
  1262. self.assertEqual(0, rcode)
  1263. self.assertTrue(write_property_mock.called)
  1264. @patch("__builtin__.open")
  1265. @patch.object(ambari_server, "Properties")
  1266. @patch.object(ambari_server, "search_file")
  1267. @patch.object(ambari_server, "get_conf_dir")
  1268. def test_get_JAVA_HOME(self, get_conf_dir_mock, search_file_mock,
  1269. Properties_mock, openMock):
  1270. openMock.side_effect = Exception("exception")
  1271. result = ambari_server.get_JAVA_HOME()
  1272. self.assertEqual(None, result)
  1273. expected = os.path.dirname(__file__)
  1274. p = MagicMock()
  1275. p.__getitem__.return_value = expected
  1276. openMock.side_effect = None
  1277. Properties_mock.return_value = p
  1278. result = ambari_server.get_JAVA_HOME()
  1279. self.assertEqual(expected, result)
  1280. def test_prompt_db_properties_default(self):
  1281. args = MagicMock()
  1282. ambari_server.load_default_db_properties(args)
  1283. ambari_server.prompt_db_properties(args)
  1284. self.assertEqual(args.database, "postgres")
  1285. self.assertEqual(args.database_host, "localhost")
  1286. self.assertEqual(args.database_name, "ambari")
  1287. self.assertEqual(args.database_port, "5432")
  1288. @patch.object(ambari_server, "setup_master_key")
  1289. @patch.object(ambari_server, "read_password")
  1290. @patch.object(ambari_server, "get_validated_string_input")
  1291. @patch.object(ambari_server, "get_YN_input")
  1292. def test_prompt_db_properties_oracle_sname(self, gyni_mock, gvsi_mock, rp_mock, smk_mock):
  1293. ambari_server.PROMPT_DATABASE_OPTIONS = True
  1294. gyni_mock.return_value = True
  1295. list_of_return_values= ["ambari-server", "ambari", "1", "1521", "localhost", "2"]
  1296. def side_effect(*args, **kwargs):
  1297. return list_of_return_values.pop()
  1298. gvsi_mock.side_effect = side_effect
  1299. rp_mock.return_value = "password"
  1300. smk_mock.return_value = (None, False, True)
  1301. args = MagicMock()
  1302. ambari_server.load_default_db_properties(args)
  1303. ambari_server.prompt_db_properties(args)
  1304. self.assertEqual(args.database, "oracle")
  1305. self.assertEqual(args.database_port, "1521")
  1306. self.assertEqual(args.database_host, "localhost")
  1307. self.assertEqual(args.database_name, "ambari")
  1308. self.assertEqual(args.database_username, "ambari-server")
  1309. self.assertEqual(args.sid_or_sname, "sname")
  1310. @patch.object(ambari_server, "setup_master_key")
  1311. @patch.object(ambari_server, "read_password")
  1312. @patch.object(ambari_server, "get_validated_string_input")
  1313. @patch.object(ambari_server, "get_YN_input")
  1314. def test_prompt_db_properties_oracle_sid(self, gyni_mock, gvsi_mock, rp_mock, smk_mock):
  1315. ambari_server.PROMPT_DATABASE_OPTIONS = True
  1316. gyni_mock.return_value = True
  1317. list_of_return_values= ["ambari-server", "ambari", "2", "1521", "localhost", "2"]
  1318. def side_effect(*args, **kwargs):
  1319. return list_of_return_values.pop()
  1320. gvsi_mock.side_effect = side_effect
  1321. rp_mock.return_value = "password"
  1322. smk_mock.return_value = (None, False, True)
  1323. args = MagicMock()
  1324. ambari_server.load_default_db_properties(args)
  1325. ambari_server.prompt_db_properties(args)
  1326. self.assertEqual(args.database, "oracle")
  1327. self.assertEqual(args.database_port, "1521")
  1328. self.assertEqual(args.database_host, "localhost")
  1329. self.assertEqual(args.database_name, "ambari")
  1330. self.assertEqual(args.database_username, "ambari-server")
  1331. self.assertEqual(args.sid_or_sname, "sid")
  1332. @patch.object(ambari_server, "setup_master_key")
  1333. @patch.object(ambari_server, "read_password")
  1334. @patch.object(ambari_server, "get_validated_string_input")
  1335. @patch.object(ambari_server, "get_YN_input")
  1336. def test_prompt_db_properties_postgre_adv(self, gyni_mock, gvsi_mock, rp_mock, smk_mock):
  1337. ambari_server.PROMPT_DATABASE_OPTIONS = True
  1338. gyni_mock.return_value = True
  1339. list_of_return_values= ["ambari-server", "ambari", "1"]
  1340. def side_effect(*args, **kwargs):
  1341. return list_of_return_values.pop()
  1342. gvsi_mock.side_effect = side_effect
  1343. rp_mock.return_value = "password"
  1344. smk_mock.return_value = (None, False, True)
  1345. args = MagicMock()
  1346. ambari_server.load_default_db_properties(args)
  1347. ambari_server.prompt_db_properties(args)
  1348. self.assertEqual(args.database, "postgres")
  1349. self.assertEqual(args.database_port, "5432")
  1350. self.assertEqual(args.database_host, "localhost")
  1351. self.assertEqual(args.database_name, "ambari")
  1352. self.assertEqual(args.database_username, "ambari-server")
  1353. self.assertEqual(args.sid_or_sname, "sname")
  1354. @patch("glob.glob")
  1355. @patch.object(ambari_server, "get_JAVA_HOME")
  1356. def test_find_jdk(self, get_JAVA_HOME_mock, globMock):
  1357. get_JAVA_HOME_mock.return_value = "somewhere"
  1358. result = ambari_server.find_jdk()
  1359. self.assertEqual("somewhere", result)
  1360. get_JAVA_HOME_mock.return_value = None
  1361. globMock.return_value = []
  1362. result = ambari_server.find_jdk()
  1363. self.assertEqual(None, result)
  1364. globMock.return_value = ["one", "two"]
  1365. result = ambari_server.find_jdk()
  1366. self.assertNotEqual(None, result)
  1367. @patch.object(ambari_server, "get_YN_input")
  1368. @patch.object(ambari_server, "configure_os_settings")
  1369. @patch.object(ambari_server, "download_jdk")
  1370. @patch.object(ambari_server, "configure_postgres")
  1371. @patch.object(ambari_server, "setup_db")
  1372. @patch.object(ambari_server, "check_postgre_up")
  1373. @patch.object(ambari_server, "check_iptables")
  1374. @patch.object(ambari_server, "check_ambari_user")
  1375. @patch.object(ambari_server, "check_jdbc_drivers")
  1376. @patch.object(ambari_server, "check_selinux")
  1377. @patch.object(ambari_server, "setup_remote_db")
  1378. @patch.object(ambari_server, "store_remote_properties")
  1379. @patch.object(ambari_server, "is_local_database")
  1380. @patch.object(ambari_server, "store_local_properties")
  1381. @patch.object(ambari_server, "is_root")
  1382. def test_setup(self, is_root_mock, store_local_properties_mock, is_local_database_mock, store_remote_properties_mock,
  1383. setup_remote_db_mock, check_selinux_mock, check_jdbc_drivers_mock, check_ambari_user_mock,
  1384. check_iptables_mock, check_postgre_up_mock, setup_db_mock, configure_postgres_mock,
  1385. download_jdk_mock, configure_os_settings_mock,get_YN_input ):
  1386. args = MagicMock()
  1387. failed = False
  1388. get_YN_input.return_value = False
  1389. def reset_mocks():
  1390. is_root_mock.reset_mock()
  1391. store_local_properties_mock.reset_mock()
  1392. store_remote_properties_mock.reset_mock()
  1393. is_local_database_mock.reset_mock()
  1394. setup_remote_db_mock.reset_mock()
  1395. check_selinux_mock.reset_mock()
  1396. check_jdbc_drivers_mock.reset_mock()
  1397. check_ambari_user_mock.reset_mock()
  1398. check_iptables_mock.reset_mock()
  1399. check_postgre_up_mock.reset_mock()
  1400. setup_db_mock.reset_mock()
  1401. configure_postgres_mock.reset_mock()
  1402. download_jdk_mock.reset_mock()
  1403. configure_os_settings_mock.reset_mock()
  1404. pass
  1405. # Testing call under non-root
  1406. is_root_mock.return_value = False
  1407. try:
  1408. ambari_server.setup(args)
  1409. self.fail("Should throw exception")
  1410. except FatalException as fe:
  1411. # Expected
  1412. self.assertTrue("root-level" in fe.reason)
  1413. pass
  1414. # Testing calls under root
  1415. # remote case
  1416. is_root_mock.return_value = True
  1417. check_selinux_mock.return_value = 0
  1418. check_ambari_user_mock.return_value = 0
  1419. check_jdbc_drivers_mock.return_value = 0
  1420. check_iptables_mock.return_value = (0, "other")
  1421. check_postgre_up_mock.return_value = 0
  1422. setup_db_mock.return_value = 0
  1423. setup_remote_db_mock.return_value = 0
  1424. is_local_database_mock.return_value = False
  1425. configure_postgres_mock.return_value = 0
  1426. download_jdk_mock.return_value = 0
  1427. configure_os_settings_mock.return_value = 0
  1428. store_remote_properties_mock.return_value = 0
  1429. store_local_properties_mock.return_value = 0
  1430. result = ambari_server.setup(args)
  1431. self.assertEqual(None, result)
  1432. self.assertTrue(check_ambari_user_mock.called)
  1433. self.assertEquals(True, store_remote_properties_mock.called)
  1434. self.assertEquals(False, store_local_properties_mock.called)
  1435. #Local case
  1436. reset_mocks()
  1437. is_local_database_mock.return_value = True
  1438. try:
  1439. result = ambari_server.setup(args)
  1440. except FatalException:
  1441. self.fail("Setup should be successful")
  1442. self.assertEqual(None, result)
  1443. self.assertEquals(True, store_local_properties_mock.called)
  1444. self.assertEquals(False, store_remote_properties_mock.called)
  1445. #negative case
  1446. reset_mocks()
  1447. is_local_database_mock.return_value = False
  1448. setup_remote_db_mock.return_value = -1
  1449. try:
  1450. result = ambari_server.setup(args)
  1451. self.fail("Should throw exception")
  1452. except NonFatalException as fe:
  1453. self.assertTrue("cli was not found" in fe.reason)
  1454. @patch.object(ambari_server, "get_YN_input")
  1455. @patch.object(ambari_server, "setup_db")
  1456. @patch.object(ambari_server, "print_info_msg")
  1457. @patch.object(ambari_server, "run_os_command")
  1458. @patch.object(ambari_server, "configure_database_username_password")
  1459. @patch.object(ambari_server, "parse_properties_file")
  1460. @patch.object(ambari_server, "execute_remote_script")
  1461. @patch.object(ambari_server, "is_root")
  1462. def test_reset(self, is_root_mock, execute_remote_script_mock, parse_properties_file_mock, configure_database_username_password_mock,
  1463. run_os_command_mock, print_info_msg_mock,
  1464. setup_db_mock, get_YN_inputMock):
  1465. parse_properties_file_mock.return_value = 0
  1466. args = MagicMock()
  1467. args.persistence_type = "local"
  1468. get_YN_inputMock.return_value = False
  1469. # Testing call under non-root
  1470. is_root_mock.return_value = False
  1471. try:
  1472. ambari_server.reset(args)
  1473. self.fail("Should throw exception")
  1474. except FatalException as fe:
  1475. # Expected
  1476. self.assertTrue("root-level" in fe.reason)
  1477. pass
  1478. # Testing calls under root
  1479. is_root_mock.return_value = True
  1480. try:
  1481. ambari_server.reset(args)
  1482. self.fail("Should throw exception")
  1483. except FatalException as fe:
  1484. # Expected
  1485. self.assertFalse("root-level" in fe.reason)
  1486. pass
  1487. get_YN_inputMock.return_value = True
  1488. run_os_command_mock.return_value = (1, None, None)
  1489. try:
  1490. ambari_server.reset(args)
  1491. self.fail("Should throw exception")
  1492. except FatalException:
  1493. # Expected
  1494. pass
  1495. run_os_command_mock.return_value = (0, None, None)
  1496. ambari_server.reset(args)
  1497. self.assertTrue(setup_db_mock.called)
  1498. #remote db case
  1499. args.persistence_type = "remote"
  1500. execute_remote_script_mock.return_value=(0, None, None)
  1501. rcode = ambari_server.reset(args)
  1502. self.assertEqual(None, rcode)
  1503. self.assertTrue(execute_remote_script_mock.called)
  1504. @patch.object(ambari_server, "setup_db")
  1505. @patch.object(ambari_server, "print_info_msg")
  1506. @patch.object(ambari_server, "run_os_command")
  1507. @patch.object(ambari_server, "parse_properties_file")
  1508. @patch.object(ambari_server, "is_root")
  1509. def test_silent_reset(self, is_root_mock, parse_properties_file_mock,
  1510. run_os_command_mock, print_info_msg_mock,
  1511. setup_db_mock):
  1512. is_root_mock.return_value = True
  1513. args = MagicMock()
  1514. ambari_server.SILENT = True
  1515. self.assertTrue(ambari_server.SILENT)
  1516. run_os_command_mock.return_value = (0, None, None)
  1517. def signal_handler(signum, frame):
  1518. self.fail("Timed out!")
  1519. signal.signal(signal.SIGALRM, signal_handler)
  1520. signal.alarm(5)
  1521. rcode = ambari_server.reset(args)
  1522. signal.alarm(0)
  1523. self.assertEqual(None, rcode)
  1524. self.assertTrue(setup_db_mock.called)
  1525. @patch("os.chown")
  1526. @patch("pwd.getpwnam")
  1527. @patch.object(ambari_server, 'get_master_key_location')
  1528. @patch.object(ambari_server, 'save_master_key')
  1529. @patch('os.chmod', autospec=True)
  1530. @patch.object(ambari_server, 'get_validated_string_input')
  1531. @patch("os.environ")
  1532. @patch.object(ambari_server, "get_ambari_properties")
  1533. @patch("os.kill")
  1534. @patch("os.path.exists")
  1535. @patch("__builtin__.open")
  1536. @patch("subprocess.Popen")
  1537. @patch.object(ambari_server, "print_info_msg")
  1538. @patch.object(ambari_server, "search_file")
  1539. @patch.object(ambari_server, "find_jdk")
  1540. @patch.object(ambari_server, "print_error_msg")
  1541. @patch.object(ambari_server, "check_postgre_up")
  1542. @patch.object(ambari_server, "check_iptables")
  1543. @patch.object(ambari_server, "parse_properties_file")
  1544. @patch.object(ambari_server, "read_ambari_user")
  1545. @patch.object(ambari_server, "is_root")
  1546. @patch("getpass.getuser")
  1547. @patch("os.chdir")
  1548. def test_start(self, chdir_mock, getuser_mock, is_root_mock, read_ambari_user_mock,
  1549. parse_properties_file_mock, check_iptables_mock, check_postgre_up_mock,
  1550. print_error_msg_mock, find_jdk_mock, search_file_mock,
  1551. print_info_msg_mock, popenMock, openMock, pexistsMock,
  1552. killMock, get_ambari_properties_mock, os_environ_mock,
  1553. get_validated_string_input_method, os_chmod_method,
  1554. save_master_key_method, get_master_key_location_method,
  1555. getpwnam_mock, os_chown_mock):
  1556. args = MagicMock()
  1557. f = MagicMock()
  1558. f.readline.return_value = 42
  1559. openMock.return_value = f
  1560. p = get_ambari_properties_mock.return_value
  1561. p.get_property.return_value = 'False'
  1562. search_file_mock.return_value = None
  1563. pw = MagicMock()
  1564. pw.setattr('pw_uid', 0)
  1565. pw.setattr('pw_gid', 0)
  1566. getpwnam_mock.return_value = pw
  1567. os_chown_mock.return_value = None
  1568. # Checking "server is running"
  1569. pexistsMock.return_value = True
  1570. try:
  1571. ambari_server.start(args)
  1572. self.fail("Should fail with 'Server is running'")
  1573. except FatalException:
  1574. # Expected
  1575. pass
  1576. self.assertTrue(killMock.called)
  1577. killMock.reset_mock()
  1578. parse_properties_file_mock.reset_mock()
  1579. pexistsMock.return_value = False
  1580. # Checking situation when ambari user is not set up
  1581. read_ambari_user_mock.return_value = None
  1582. try:
  1583. ambari_server.start(args)
  1584. self.fail("Should fail with 'Can not detect a system user for Ambari'")
  1585. except FatalException as e:
  1586. # Expected
  1587. self.assertTrue('Can not detect a system user' in e.reason)
  1588. parse_properties_file_mock.reset_mock()
  1589. # Checking start from non-root when current user is not the same as a
  1590. # custom user
  1591. read_ambari_user_mock.return_value = "dummy-user"
  1592. getuser_mock.return_value = "non_custom_user"
  1593. is_root_mock.return_value = False
  1594. try:
  1595. ambari_server.start(args)
  1596. self.fail("Should fail with 'Can not start ambari-server as user...'")
  1597. except FatalException as e:
  1598. # Expected
  1599. self.assertTrue('Can not start ambari-server as user' in e.reason)
  1600. self.assertFalse(parse_properties_file_mock.called)
  1601. parse_properties_file_mock.reset_mock()
  1602. # Checking "jdk not found"
  1603. is_root_mock.return_value = True
  1604. find_jdk_mock.return_value = None
  1605. try:
  1606. ambari_server.start(args)
  1607. self.fail("Should fail with 'No JDK found'")
  1608. except FatalException as e:
  1609. # Expected
  1610. self.assertTrue('No JDK found' in e.reason)
  1611. find_jdk_mock.return_value = "somewhere"
  1612. parse_properties_file_mock.reset_mock()
  1613. ## Testing workflow under root
  1614. is_root_mock.return_value = True
  1615. # Remote DB
  1616. args.persistence_type="remote"
  1617. check_iptables_mock.return_value = (0, None)
  1618. try:
  1619. ambari_server.start(args)
  1620. except FatalException as e:
  1621. # Ignored
  1622. pass
  1623. self.assertFalse('Unable to start PostgreSQL server' in e.reason)
  1624. self.assertFalse(check_postgre_up_mock.called)
  1625. check_postgre_up_mock.reset_mock()
  1626. parse_properties_file_mock.reset_mock()
  1627. # Local DB
  1628. args.persistence_type="local"
  1629. # case: postgres failed to start
  1630. check_postgre_up_mock.return_value = 1
  1631. try:
  1632. ambari_server.start(args)
  1633. self.fail("Should fail with 'Unable to start PostgreSQL server'")
  1634. except FatalException as e:
  1635. # Expected
  1636. self.assertTrue('Unable to start PostgreSQL server' in e.reason)
  1637. self.assertTrue(check_postgre_up_mock.called)
  1638. parse_properties_file_mock.reset_mock()
  1639. # case: iptables failed to stop
  1640. check_postgre_up_mock.return_value = 0
  1641. check_iptables_mock.return_value = (1, ambari_server.IP_TBLS_ENABLED)
  1642. try:
  1643. ambari_server.start(args)
  1644. self.fail("Should fail with 'Failed to stop iptables'")
  1645. except FatalException as e:
  1646. # Expected
  1647. self.assertTrue('Failed to stop iptables' in e.reason)
  1648. parse_properties_file_mock.reset_mock()
  1649. check_iptables_mock.return_value = (0, None)
  1650. # Case: custom user is "root"
  1651. read_ambari_user_mock.return_value = "root"
  1652. ambari_server.start(args)
  1653. self.assertTrue(popenMock.called)
  1654. popen_arg = popenMock.call_args[0][0]
  1655. self.assertTrue(popen_arg[0] == "/bin/sh")
  1656. popenMock.reset_mock()
  1657. parse_properties_file_mock.reset_mock()
  1658. # Case: custom user is not "root"
  1659. read_ambari_user_mock.return_value = "not-root-user"
  1660. ambari_server.start(args)
  1661. self.assertTrue(chdir_mock.called)
  1662. self.assertTrue(popenMock.called)
  1663. popen_arg = popenMock.call_args[0][0]
  1664. self.assertTrue(popen_arg[0] == "/bin/su")
  1665. check_postgre_up_mock.reset_mock()
  1666. popenMock.reset_mock()
  1667. parse_properties_file_mock.reset_mock()
  1668. ## Testing workflow under non-root
  1669. is_root_mock.return_value = False
  1670. read_ambari_user_mock.return_value = "not-root-user"
  1671. getuser_mock.return_value = read_ambari_user_mock.return_value
  1672. parse_properties_file_mock.reset_mock()
  1673. # Local DB
  1674. args.persistence_type="local"
  1675. ambari_server.start(args)
  1676. self.assertFalse(check_postgre_up_mock.called)
  1677. parse_properties_file_mock.reset_mock()
  1678. # Remote DB
  1679. args.persistence_type="remote"
  1680. ambari_server.start(args)
  1681. self.assertFalse(check_postgre_up_mock.called)
  1682. parse_properties_file_mock.reset_mock()
  1683. # Checking call
  1684. check_iptables_mock.reset_mock()
  1685. check_iptables_mock.return_value = (0, None)
  1686. ambari_server.start(args)
  1687. self.assertTrue(popenMock.called)
  1688. popen_arg = popenMock.call_args[0][0]
  1689. self.assertTrue(popen_arg[0] == "/bin/sh")
  1690. self.assertFalse(check_iptables_mock.called)
  1691. parse_properties_file_mock.reset_mock()
  1692. # Test start under wrong user
  1693. read_ambari_user_mock.return_value = "not-root-user"
  1694. getuser_mock.return_value = "non_custom_user"
  1695. try:
  1696. ambari_server.start(args)
  1697. self.fail("Can not start ambari-server as user non_custom_user.")
  1698. except FatalException as e:
  1699. # Expected
  1700. self.assertTrue('Can not start ambari-server as user' in e.reason)
  1701. parse_properties_file_mock.reset_mock()
  1702. # Check environ master key is set
  1703. popenMock.reset_mock()
  1704. os_environ_mock.copy.return_value = {"a" : "b",
  1705. ambari_server.SECURITY_KEY_ENV_VAR_NAME : "masterkey"}
  1706. args.persistence_type="local"
  1707. read_ambari_user_mock.return_value = "root"
  1708. is_root_mock.return_value = True
  1709. ambari_server.start(args)
  1710. self.assertFalse(get_validated_string_input_method.called)
  1711. self.assertFalse(save_master_key_method.called)
  1712. popen_arg = popenMock.call_args[1]['env']
  1713. self.assertEquals(os_environ_mock.copy.return_value, popen_arg)
  1714. parse_properties_file_mock.reset_mock()
  1715. # Check environ master key is not set
  1716. popenMock.reset_mock()
  1717. os_environ_mock.reset_mock()
  1718. p.get_property.return_value = 'True'
  1719. os_environ_mock.copy.return_value = {"a" : "b"}
  1720. args.persistence_type="local"
  1721. read_ambari_user_mock.return_value = "root"
  1722. is_root_mock.return_value = True
  1723. get_validated_string_input_method.return_value = "masterkey"
  1724. os_chmod_method.return_value = None
  1725. ambari_server.start(args)
  1726. self.assertTrue(get_validated_string_input_method.called)
  1727. self.assertTrue(save_master_key_method.called)
  1728. popen_arg = popenMock.call_args[1]['env']
  1729. self.assertEquals(os_environ_mock.copy.return_value, popen_arg)
  1730. @patch("__builtin__.open")
  1731. @patch("os.path.exists")
  1732. @patch("os.remove")
  1733. @patch("os.killpg")
  1734. @patch("os.getpgid")
  1735. @patch.object(ambari_server, "print_info_msg")
  1736. def test_stop(self, print_info_msg_mock, gpidMock, removeMock,
  1737. killMock, pexistsMock, openMock):
  1738. pexistsMock.return_value = True
  1739. f = MagicMock()
  1740. f.readline.return_value = "42"
  1741. openMock.return_value = f
  1742. ambari_server.stop(None)
  1743. self.assertTrue(f.readline.called)
  1744. self.assertTrue(killMock.called)
  1745. self.assertTrue(killMock.called)
  1746. self.assertTrue(f.close.called)
  1747. self.assertTrue(removeMock.called)
  1748. @patch.object(ambari_server, "configure_database_username_password")
  1749. @patch.object(ambari_server, "run_os_command")
  1750. @patch.object(ambari_server, "is_root")
  1751. def test_upgrade_stack(self, is_root_mock, run_os_command_mock,
  1752. configure_postgres_username_password_mock):
  1753. args = MagicMock()
  1754. # Testing call under non-root
  1755. is_root_mock.return_value = False
  1756. try:
  1757. ambari_server.upgrade_stack(args, 'HDP-2.0')
  1758. self.fail("Should throw exception")
  1759. except FatalException as fe:
  1760. # Expected
  1761. self.assertTrue("root-level" in fe.reason)
  1762. pass
  1763. # Testing calls under root
  1764. is_root_mock.return_value = True
  1765. run_os_command_mock.return_value = (0, '', '')
  1766. ambari_server.upgrade_stack(args, 'HDP-2.0')
  1767. self.assertTrue(configure_postgres_username_password_mock.called)
  1768. self.assertTrue(run_os_command_mock.called)
  1769. @patch.object(ambari_server, "adjust_directory_permissions")
  1770. @patch.object(ambari_server, "print_warning_msg")
  1771. @patch.object(ambari_server, "read_ambari_user")
  1772. @patch.object(ambari_server, "check_db_consistency")
  1773. @patch.object(ambari_server, "execute_db_script")
  1774. @patch.object(ambari_server, "check_postgre_up")
  1775. @patch.object(ambari_server, "update_ambari_properties")
  1776. @patch.object(ambari_server, "parse_properties_file")
  1777. @patch.object(ambari_server, "is_root")
  1778. def test_upgrade(self, is_root_mock, parse_properties_file_mock, update_ambari_properties_mock,
  1779. check_postgre_up_mock, execute_db_script_mock,
  1780. check_db_consistency_mock, read_ambari_user_mock,
  1781. print_warning_msg_mock, adjust_directory_permissions_mock):
  1782. args = MagicMock()
  1783. args.upgrade_script_file = "/var/lib/"\
  1784. "ambari-server/resources/upgrade/ddl/"\
  1785. "Ambari-DDL-Postgres-UPGRADE-1.3.0.sql"
  1786. update_ambari_properties_mock.return_value = 0
  1787. check_postgre_up_mock.return_value = 0
  1788. execute_db_script_mock.return_value = 0
  1789. check_db_consistency_mock.return_value = 0
  1790. # Testing call under non-root
  1791. is_root_mock.return_value = False
  1792. try:
  1793. ambari_server.upgrade(args)
  1794. self.fail("Should throw exception")
  1795. except FatalException as fe:
  1796. # Expected
  1797. self.assertTrue("root-level" in fe.reason)
  1798. pass
  1799. # Testing calls under root
  1800. is_root_mock.return_value = True
  1801. # Testing with undefined custom user
  1802. read_ambari_user_mock.return_value = None
  1803. ambari_server.upgrade(args)
  1804. self.assertTrue(print_warning_msg_mock.called)
  1805. warning_args = print_warning_msg_mock.call_args[0][0]
  1806. self.assertTrue("custom ambari user" in warning_args)
  1807. # Testing with defined custom user
  1808. read_ambari_user_mock.return_value = "ambari-custom-user"
  1809. ambari_server.upgrade(args)
  1810. self.assertTrue(adjust_directory_permissions_mock.called)
  1811. def test_print_info_msg(self):
  1812. out = StringIO.StringIO()
  1813. sys.stdout = out
  1814. ambari_server.VERBOSE = True
  1815. ambari_server.print_info_msg("msg")
  1816. self.assertNotEqual("", out.getvalue())
  1817. sys.stdout = sys.__stdout__
  1818. def test_print_error_msg(self):
  1819. out = StringIO.StringIO()
  1820. sys.stdout = out
  1821. ambari_server.VERBOSE = True
  1822. ambari_server.print_error_msg("msg")
  1823. self.assertNotEqual("", out.getvalue())
  1824. sys.stdout = sys.__stdout__
  1825. def test_print_warning_msg(self):
  1826. out = StringIO.StringIO()
  1827. sys.stdout = out
  1828. ambari_server.VERBOSE = True
  1829. ambari_server.print_warning_msg("msg")
  1830. self.assertNotEqual("", out.getvalue())
  1831. sys.stdout = sys.__stdout__
  1832. @patch.object(ambari_server, "get_choice_string_input")
  1833. def test_get_YN_input(self, get_choice_string_input_mock):
  1834. ambari_server.get_YN_input("prompt", "default")
  1835. self.assertTrue(get_choice_string_input_mock.called)
  1836. self.assertEqual(4, len(get_choice_string_input_mock.call_args_list[0][0]))
  1837. def test_load_default_db_properties(self):
  1838. args = MagicMock()
  1839. ambari_server.load_default_db_properties(args)
  1840. self.assertEquals(args.database, "postgres")
  1841. self.assertEquals(args.database_host, "localhost")
  1842. self.assertEquals(args.database_port, "5432")
  1843. self.assertEquals(args.database_name, "ambari")
  1844. self.assertEquals(args.database_username, "ambari")
  1845. self.assertEquals(args.database_password, "bigdata")
  1846. args = MagicMock()
  1847. ambari_server.DATABASE_INDEX=1
  1848. ambari_server.load_default_db_properties(args)
  1849. self.assertEquals(args.database, "oracle")
  1850. self.assertEquals(args.database_port, "1521")
  1851. failed = False
  1852. args = MagicMock()
  1853. ambari_server.DATABASE_INDEX=2
  1854. try:
  1855. ambari_server.load_default_db_properties(args)
  1856. except:
  1857. failed = True
  1858. self.assertTrue(failed)
  1859. pass
  1860. @patch.object(ambari_server, 'setup')
  1861. def test_main_db_options(self, setup_mock):
  1862. base_args = ["ambari-server.py", "setup"]
  1863. db_args = ["--database", "postgres", "--databasehost", "somehost.net", "--databaseport", "12345",
  1864. "--databasename", "ambari", "--databaseusername", "ambari", "--databasepassword", "bigdata"]
  1865. #test no args
  1866. failed = False
  1867. sys.argv = list(base_args)
  1868. try:
  1869. ambari_server.main()
  1870. except SystemExit:
  1871. failed = True
  1872. pass
  1873. self.assertFalse(failed)
  1874. self.assertTrue(setup_mock.called)
  1875. setup_mock.reset_mock()
  1876. #test full args
  1877. sys.argv = list(base_args)
  1878. sys.argv.extend(db_args)
  1879. try:
  1880. ambari_server.main()
  1881. except SystemExit:
  1882. failed = True
  1883. pass
  1884. self.assertTrue(ambari_server.PROMPT_DATABASE_OPTIONS)
  1885. self.assertFalse(failed)
  1886. self.assertTrue(setup_mock.called)
  1887. setup_mock.reset_mock()
  1888. #test not full args
  1889. sys.argv = list(base_args)
  1890. sys.argv.extend(["--database", "postgres"])
  1891. try:
  1892. ambari_server.main()
  1893. except SystemExit:
  1894. failed = True
  1895. pass
  1896. self.assertFalse(setup_mock.called)
  1897. self.assertTrue(failed)
  1898. setup_mock.reset_mock()
  1899. #test wrong database
  1900. failed = False
  1901. sys.argv = list(base_args)
  1902. sys.argv.extend(["--database", "unknown"])
  1903. sys.argv.extend(db_args[2:])
  1904. try:
  1905. ambari_server.main()
  1906. except SystemExit:
  1907. failed = True
  1908. pass
  1909. self.assertTrue(failed)
  1910. self.assertFalse(setup_mock.called)
  1911. setup_mock.reset_mock()
  1912. #test wrong port check
  1913. failed = False
  1914. sys.argv = list(base_args)
  1915. sys.argv.extend(["--databaseport", "unknown"])
  1916. sys.argv.extend(db_args[:4])
  1917. sys.argv.extend(db_args[6:])
  1918. try:
  1919. ambari_server.main()
  1920. except SystemExit:
  1921. failed = True
  1922. pass
  1923. self.assertTrue(failed)
  1924. self.assertFalse(setup_mock.called)
  1925. setup_mock.reset_mock()
  1926. pass
  1927. @patch.object(ambari_server, "load_default_db_properties")
  1928. @patch.object(ambari_server, "get_YN_input")
  1929. @patch.object(ambari_server, "get_validated_string_input")
  1930. @patch.object(ambari_server, "setup_master_key")
  1931. @patch.object(ambari_server, "configure_database_password")
  1932. def test_prompt_db_properties(self, configure_database_password_mock, setup_master_key_mock,
  1933. get_validated_string_input_mock, get_YN_input_mock, load_default_db_properties_mock):
  1934. args = MagicMock()
  1935. #test not prompt
  1936. ambari_server.PROMPT_DATABASE_OPTIONS = False
  1937. ambari_server.prompt_db_properties(args)
  1938. self.assertFalse(load_default_db_properties_mock.called)
  1939. self.assertFalse(get_validated_string_input_mock.called)
  1940. self.assertFalse(get_YN_input_mock.called)
  1941. load_default_db_properties_mock.reset_mock()
  1942. get_validated_string_input_mock.reset_mock()
  1943. get_YN_input_mock.reset_mock()
  1944. #test prompt
  1945. get_YN_input_mock.return_value = False
  1946. ambari_server.PROMPT_DATABASE_OPTIONS = True
  1947. ambari_server.prompt_db_properties(args)
  1948. self.assertTrue(get_YN_input_mock.called)
  1949. self.assertFalse(get_validated_string_input_mock.called)
  1950. self.assertTrue(load_default_db_properties_mock.called)
  1951. load_default_db_properties_mock.reset_mock()
  1952. get_validated_string_input_mock.reset_mock()
  1953. get_YN_input_mock.reset_mock()
  1954. #test prompt advanced
  1955. get_YN_input_mock.return_value = True
  1956. ambari_server.PROMPT_DATABASE_OPTIONS = True
  1957. setup_master_key_mock.return_value = (None, False, True)
  1958. configure_database_password_mock.return_value = ("test", None)
  1959. ambari_server.prompt_db_properties(args)
  1960. self.assertTrue(get_YN_input_mock.called)
  1961. self.assertTrue(get_validated_string_input_mock.called)
  1962. self.assertTrue(load_default_db_properties_mock.called)
  1963. self.assertEquals(args.database, "postgres")
  1964. load_default_db_properties_mock.reset_mock()
  1965. get_validated_string_input_mock.reset_mock()
  1966. get_YN_input_mock.reset_mock()
  1967. pass
  1968. @patch.object(ambari_server, "get_db_cli_tool")
  1969. @patch.object(ambari_server, "run_in_shell")
  1970. def test_execute_remote_script(self, run_in_shell_mock, get_db_cli_tool_mock):
  1971. args = MagicMock()
  1972. script = "script"
  1973. #success
  1974. run_in_shell_mock.return_value=(0, None, None)
  1975. get_db_cli_tool_mock.return_value="tool"
  1976. args.database = "postgres"
  1977. args.database_password = "some_password"
  1978. retcode, out, err = ambari_server.execute_remote_script(args, script)
  1979. self.assertEquals(retcode, 0)
  1980. self.assertTrue(get_db_cli_tool_mock.called)
  1981. self.assertTrue(run_in_shell_mock.called)
  1982. #fail no cli tool
  1983. get_db_cli_tool_mock.return_value = None
  1984. get_db_cli_tool_mock.called = False
  1985. run_in_shell_mock.called = False
  1986. retcode, out, err = ambari_server.execute_remote_script(args, script)
  1987. self.assertEquals(retcode, -1)
  1988. self.assertTrue(get_db_cli_tool_mock.called)
  1989. self.assertFalse(run_in_shell_mock.called)
  1990. #fail execute
  1991. errcode = 1
  1992. get_db_cli_tool_mock.return_value = "tool"
  1993. run_in_shell_mock.return_value=(errcode, None, None)
  1994. get_db_cli_tool_mock.called = False
  1995. run_in_shell_mock.called = False
  1996. retcode, out, err = ambari_server.execute_remote_script(args, script)
  1997. self.assertEquals(retcode, errcode)
  1998. self.assertTrue(get_db_cli_tool_mock.called)
  1999. self.assertTrue(run_in_shell_mock.called)
  2000. #fail wrong database - case should be completely impossible
  2001. get_db_cli_tool_mock.return_value = "tool"
  2002. run_in_shell_mock.return_value=(0, None, None)
  2003. get_db_cli_tool_mock.called = False
  2004. run_in_shell_mock.called = False
  2005. args.database = "unknown"
  2006. retcode, out, err = ambari_server.execute_remote_script(args, script)
  2007. self.assertEquals(retcode, -2)
  2008. self.assertTrue(get_db_cli_tool_mock.called)
  2009. self.assertFalse(run_in_shell_mock.called)
  2010. pass
  2011. @patch.object(ambari_server, "get_conf_dir")
  2012. def test_update_ambari_properties(self, get_conf_dir_mock):
  2013. properties = ["server.jdbc.user.name=ambari-server\n",
  2014. "server.jdbc.user.passwd=/etc/ambari-server/conf/password.dat\n",
  2015. "java.home=/usr/jdk64/jdk1.6.0_31\n",
  2016. "server.os_type=redhat6\n",
  2017. "ambari-server.user=ambari\n"]
  2018. NEW_PROPERTY = 'some_new_property=some_value\n'
  2019. CHANGED_VALUE_PROPERTY = 'server.os_type=should_not_overwrite_value\n'
  2020. get_conf_dir_mock.return_value = '/etc/ambari-server/conf'
  2021. (tf1, fn1) = tempfile.mkstemp()
  2022. (tf2, fn2) = tempfile.mkstemp()
  2023. ambari_server.AMBARI_PROPERTIES_RPMSAVE_FILE = fn1
  2024. ambari_server.AMBARI_PROPERTIES_FILE = fn2
  2025. with open(ambari_server.AMBARI_PROPERTIES_FILE, "w") as f:
  2026. f.write(NEW_PROPERTY)
  2027. f.write(CHANGED_VALUE_PROPERTY)
  2028. with open(ambari_server.AMBARI_PROPERTIES_RPMSAVE_FILE, 'w') as f:
  2029. for line in properties:
  2030. f.write(line)
  2031. #Call tested method
  2032. ambari_server.update_ambari_properties()
  2033. timestamp = datetime.datetime.now()
  2034. #RPMSAVE_FILE wasn't found
  2035. self.assertFalse(os.path.exists(ambari_server.AMBARI_PROPERTIES_RPMSAVE_FILE))
  2036. #Renamed RPMSAVE_FILE exists
  2037. self.assertTrue(os.path.exists(ambari_server.AMBARI_PROPERTIES_RPMSAVE_FILE
  2038. + '.' + timestamp.strftime('%Y%m%d%H%M%S')))
  2039. with open(ambari_server.AMBARI_PROPERTIES_FILE, 'r') as f:
  2040. ambari_properties_content = f.readlines()
  2041. for line in properties:
  2042. if not line in ambari_properties_content:
  2043. self.fail()
  2044. if not NEW_PROPERTY in ambari_properties_content:
  2045. self.fail()
  2046. if CHANGED_VALUE_PROPERTY in ambari_properties_content:
  2047. self.fail()
  2048. # Command should not fail if *.rpmsave file is missing
  2049. result = ambari_server.update_ambari_properties()
  2050. self.assertEquals(result, 0)
  2051. os.unlink(fn2)
  2052. #if ambari.properties file is absent then "ambari-server upgrade" should
  2053. # fail
  2054. (tf, fn) = tempfile.mkstemp()
  2055. ambari_server.AMBARI_PROPERTIES_RPMSAVE_FILE = fn
  2056. result = ambari_server.update_ambari_properties()
  2057. self.assertNotEquals(result, 0)
  2058. @patch.object(ambari_server.Properties, '__init__')
  2059. @patch.object(ambari_server, 'search_file')
  2060. def test_update_ambari_properties_negative_case(self, search_file_mock, properties_mock):
  2061. search_file_mock.return_value = None
  2062. #Call tested method
  2063. self.assertEquals(0, ambari_server.update_ambari_properties())
  2064. self.assertFalse(properties_mock.called)
  2065. search_file_mock.return_value = False
  2066. #Call tested method
  2067. self.assertEquals(0, ambari_server.update_ambari_properties())
  2068. self.assertFalse(properties_mock.called)
  2069. search_file_mock.return_value = ''
  2070. #Call tested method
  2071. self.assertEquals(0, ambari_server.update_ambari_properties())
  2072. self.assertFalse(properties_mock.called)
  2073. @patch.object(ambari_server, "get_conf_dir")
  2074. def test_update_ambari_properties_without_user_property(self, get_conf_dir_mock):
  2075. '''
  2076. Checks: update_ambari_properties call should add ambari-server.user property if
  2077. it's absent
  2078. '''
  2079. properties = ["server.jdbc.user.name=ambari-server\n",
  2080. "server.jdbc.user.passwd=/etc/ambari-server/conf/password.dat\n",
  2081. "java.home=/usr/jdk64/jdk1.6.0_31\n",
  2082. "server.os_type=redhat6\n"]
  2083. get_conf_dir_mock.return_value = '/etc/ambari-server/conf'
  2084. (tf1, fn1) = tempfile.mkstemp()
  2085. (tf2, fn2) = tempfile.mkstemp()
  2086. ambari_server.AMBARI_PROPERTIES_RPMSAVE_FILE = fn1
  2087. ambari_server.AMBARI_PROPERTIES_FILE = fn2
  2088. with open(ambari_server.AMBARI_PROPERTIES_RPMSAVE_FILE, 'w') as f:
  2089. for line in properties:
  2090. f.write(line)
  2091. #Call tested method
  2092. ambari_server.update_ambari_properties()
  2093. ambari_properties = ambari_server.Properties()
  2094. ambari_properties.load(open(fn2))
  2095. self.assertTrue(ambari_server.NR_USER_PROPERTY in ambari_properties.keys())
  2096. value = ambari_properties[ambari_server.NR_USER_PROPERTY]
  2097. self.assertEqual(value, "root")
  2098. os.unlink(fn2)
  2099. @patch("sys.exit")
  2100. @patch.object(ambari_server, "get_YN_input")
  2101. @patch.object(ambari_server, "get_db_cli_tool")
  2102. @patch.object(ambari_server, "store_remote_properties")
  2103. @patch.object(ambari_server, "is_local_database")
  2104. @patch.object(ambari_server, "check_iptables")
  2105. @patch.object(ambari_server, "check_jdbc_drivers")
  2106. @patch.object(ambari_server, "is_root")
  2107. @patch.object(ambari_server, "check_ambari_user")
  2108. @patch.object(ambari_server, "download_jdk")
  2109. @patch.object(ambari_server, "configure_os_settings")
  2110. @patch('__builtin__.raw_input')
  2111. def test_setup_remote_db_wo_client(self,raw_input, configure_os_settings_mock, download_jdk_mock, check_ambari_user_mock, is_root_mock, check_jdbc_drivers_mock, check_iptables_mock, is_local_db_mock,
  2112. store_remote_properties_mock, get_db_cli_tool_mock, get_YN_input, exit_mock):
  2113. args = MagicMock()
  2114. raw_input.return_value =""
  2115. is_root_mock.return_value = True
  2116. is_local_db_mock.return_value = False
  2117. get_YN_input.return_value = False
  2118. check_iptables_mock.return_value = (0, "other")
  2119. store_remote_properties_mock.return_value = 0
  2120. get_db_cli_tool_mock.return_value = None
  2121. check_jdbc_drivers_mock.return_value=0
  2122. check_ambari_user_mock.return_value = 0
  2123. download_jdk_mock.return_value = 0
  2124. configure_os_settings_mock.return_value = 0
  2125. try:
  2126. ambari_server.setup(args)
  2127. self.fail("Should throw exception")
  2128. except NonFatalException as fe:
  2129. # Expected
  2130. self.assertTrue("The cli was not found" in fe.reason)
  2131. @patch.object(ambari_server, "parse_properties_file")
  2132. @patch.object(ambari_server, "get_db_cli_tool")
  2133. @patch.object(ambari_server, "print_error_msg")
  2134. @patch.object(ambari_server, "get_YN_input")
  2135. @patch.object(ambari_server, "setup_db")
  2136. @patch.object(ambari_server, "run_os_command")
  2137. @patch.object(ambari_server, "is_root")
  2138. def test_reset_remote_db_wo_client(self, is_root_mock, run_os_command_mock, setup_db_mock,
  2139. get_YN_inputMock, print_error_msg_mock, get_db_cli_tool_mock, parse_properties_file_mock):
  2140. args = MagicMock()
  2141. get_YN_inputMock.return_value = True
  2142. run_os_command_mock.return_value = (0, None, None)
  2143. args.persistence_type="remote"
  2144. get_db_cli_tool_mock.return_value = None
  2145. is_root_mock.return_value = True
  2146. try:
  2147. ambari_server.reset(args)
  2148. self.fail("Should throw exception")
  2149. except NonFatalException as fe:
  2150. # Expected
  2151. self.assertTrue("Client wasn't found" in fe.reason)
  2152. pass
  2153. @patch.object(ambari_server, "find_properties_file")
  2154. def test_get_ambari_properties(self, find_properties_file_mock):
  2155. find_properties_file_mock.return_value = None
  2156. rcode = ambari_server.get_ambari_properties()
  2157. self.assertEqual(rcode, -1)
  2158. tf1 = tempfile.NamedTemporaryFile()
  2159. find_properties_file_mock.return_value = tf1.name
  2160. prop_name='name'
  2161. prop_value='val'
  2162. with open(tf1.name, 'w') as fout:
  2163. fout.write(prop_name + '=' + prop_value)
  2164. fout.close()
  2165. properties = ambari_server.get_ambari_properties()
  2166. self.assertEqual(properties[prop_name], prop_value)
  2167. @patch.object(ambari_server, "get_ambari_properties")
  2168. @patch.object(ambari_server, "find_jdbc_driver")
  2169. @patch.object(ambari_server, "copy_files")
  2170. @patch.object(ambari_server, "print_error_msg")
  2171. @patch.object(ambari_server, "print_warning_msg")
  2172. @patch('__builtin__.raw_input')
  2173. @patch("sys.exit")
  2174. def check_jdbc_drivers(self, exit_mock, raw_input_mock, print_warning_msg, print_error_msg_mock, copy_files_mock,
  2175. find_jdbc_driver_mock, get_ambari_properties_mock):
  2176. out = StringIO.StringIO()
  2177. sys.stdout = out
  2178. args = MagicMock()
  2179. # Check positive scenario
  2180. drivers_list = ['driver_file']
  2181. resources_dir = '/tmp'
  2182. get_ambari_properties_mock.return_value = {ambari_server.RESOURCES_DIR_PROPERTY : resources_dir}
  2183. find_jdbc_driver_mock.return_value = drivers_list
  2184. args.database = "oracle"
  2185. rcode = ambari_server.check_jdbc_drivers(args)
  2186. self.assertEqual(0, rcode)
  2187. copy_files_mock.assert_called_with(drivers_list, resources_dir)
  2188. # Check negative scenarios
  2189. # Silent option, no drivers
  2190. ambari_server.SILENT = True
  2191. find_jdbc_driver_mock.return_value = -1
  2192. rcode = ambari_server.check_jdbc_drivers(args)
  2193. self.assertTrue(print_error_msg_mock.called)
  2194. self.assertTrue(exit_mock.called)
  2195. # Non-Silent option, no drivers
  2196. ambari_server.SILENT = False
  2197. find_jdbc_driver_mock.return_value = -1
  2198. rcode = ambari_server.check_jdbc_drivers(args)
  2199. self.assertTrue(exit_mock.called)
  2200. self.assertTrue(print_error_msg_mock.called)
  2201. # Non-Silent option, no drivers at first ask, present drivers after that
  2202. find_jdbc_driver_mock.side_effect = [-1, drivers_list]
  2203. rcode = ambari_server.check_jdbc_drivers(args)
  2204. self.assertEqual(0, rcode)
  2205. copy_files_mock.assert_called_with(drivers_list, resources_dir)
  2206. # Non-Silent option, no drivers at first ask, present drivers after that
  2207. find_jdbc_driver_mock.reset()
  2208. find_jdbc_driver_mock.side_effect = [-1, -1]
  2209. rcode = ambari_server.check_jdbc_drivers(args)
  2210. self.assertTrue(exit_mock.called)
  2211. self.assertTrue(print_error_msg_mock.called)
  2212. sys.stdout = sys.__stdout__
  2213. @patch.object(ambari_server, "find_properties_file")
  2214. def test_get_ambari_properties(self, find_properties_file):
  2215. find_properties_file.return_value = None
  2216. rcode = ambari_server.get_ambari_properties()
  2217. self.assertEqual(rcode, -1)
  2218. tf1 = tempfile.NamedTemporaryFile()
  2219. find_properties_file.return_value = tf1.name
  2220. prop_name='name'
  2221. prop_value='val'
  2222. with open(tf1.name, 'w') as fout:
  2223. fout.write(prop_name + '=' + prop_value)
  2224. fout.close()
  2225. properties = ambari_server.get_ambari_properties()
  2226. self.assertEqual(properties[prop_name], prop_value)
  2227. self.assertEqual(properties.fileName, os.path.abspath(tf1.name))
  2228. sys.stdout = sys.__stdout__
  2229. @patch.object(ambari_server, "get_ambari_properties")
  2230. @patch.object(ambari_server, "find_jdbc_driver")
  2231. @patch.object(ambari_server, "copy_files")
  2232. @patch.object(ambari_server, "print_error_msg")
  2233. @patch.object(ambari_server, "print_warning_msg")
  2234. @patch('__builtin__.raw_input')
  2235. def test_check_jdbc_drivers(self, raw_input_mock, print_warning_msg, print_error_msg_mock, copy_files_mock,
  2236. find_jdbc_driver_mock, get_ambari_properties_mock):
  2237. out = StringIO.StringIO()
  2238. sys.stdout = out
  2239. args = MagicMock()
  2240. # Check positive scenario
  2241. drivers_list = ['driver_file']
  2242. resources_dir = '/tmp'
  2243. get_ambari_properties_mock.return_value = {ambari_server.RESOURCES_DIR_PROPERTY : resources_dir}
  2244. find_jdbc_driver_mock.return_value = drivers_list
  2245. copy_files_mock.return_value = 0
  2246. args.database = "oracle"
  2247. rcode = ambari_server.check_jdbc_drivers(args)
  2248. self.assertEqual(0, rcode)
  2249. copy_files_mock.assert_called_with(drivers_list, resources_dir)
  2250. get_ambari_properties_mock.reset_mock()
  2251. find_jdbc_driver_mock.reset_mock()
  2252. copy_files_mock.reset_mock()
  2253. print_error_msg_mock.reset_mock()
  2254. print_warning_msg.reset_mock()
  2255. raw_input_mock.reset_mock()
  2256. # Check negative scenarios
  2257. # Silent option, no drivers
  2258. ambari_server.SILENT = True
  2259. find_jdbc_driver_mock.return_value = -1
  2260. failed = False
  2261. try:
  2262. rcode = ambari_server.check_jdbc_drivers(args)
  2263. except FatalException:
  2264. failed = True
  2265. self.assertTrue(print_error_msg_mock.called)
  2266. self.assertTrue(failed)
  2267. get_ambari_properties_mock.reset_mock()
  2268. find_jdbc_driver_mock.reset_mock()
  2269. copy_files_mock.reset_mock()
  2270. print_error_msg_mock.reset_mock()
  2271. print_warning_msg.reset_mock()
  2272. raw_input_mock.reset_mock()
  2273. # Non-Silent option, no drivers
  2274. ambari_server.SILENT = False
  2275. find_jdbc_driver_mock.return_value = -1
  2276. failed = False
  2277. try:
  2278. rcode = ambari_server.check_jdbc_drivers(args)
  2279. except FatalException:
  2280. failed = True
  2281. self.assertTrue(failed)
  2282. self.assertTrue(print_error_msg_mock.called)
  2283. get_ambari_properties_mock.reset_mock()
  2284. find_jdbc_driver_mock.reset_mock()
  2285. copy_files_mock.reset_mock()
  2286. print_error_msg_mock.reset_mock()
  2287. print_warning_msg.reset_mock()
  2288. raw_input_mock.reset_mock()
  2289. # Non-Silent option, no drivers at first ask, present drivers after that
  2290. find_jdbc_driver_mock.side_effect = [-1, drivers_list]
  2291. rcode = ambari_server.check_jdbc_drivers(args)
  2292. self.assertEqual(0, rcode)
  2293. copy_files_mock.assert_called_with(drivers_list, resources_dir)
  2294. get_ambari_properties_mock.reset_mock()
  2295. find_jdbc_driver_mock.reset_mock()
  2296. copy_files_mock.reset_mock()
  2297. print_error_msg_mock.reset_mock()
  2298. print_warning_msg.reset_mock()
  2299. raw_input_mock.reset_mock()
  2300. # Non-Silent option, no drivers at first ask, no drivers after that
  2301. find_jdbc_driver_mock.side_effect = [-1, -1]
  2302. failed = False
  2303. try:
  2304. rcode = ambari_server.check_jdbc_drivers(args)
  2305. except FatalException:
  2306. failed = True
  2307. self.assertTrue(failed)
  2308. self.assertTrue(print_error_msg_mock.called)
  2309. get_ambari_properties_mock.reset_mock()
  2310. find_jdbc_driver_mock.reset_mock()
  2311. copy_files_mock.reset_mock()
  2312. print_error_msg_mock.reset_mock()
  2313. print_warning_msg.reset_mock()
  2314. raw_input_mock.reset_mock()
  2315. # Failed to copy_files
  2316. find_jdbc_driver_mock.side_effect = [drivers_list]
  2317. try:
  2318. rcode = ambari_server.check_jdbc_drivers(args)
  2319. except FatalException:
  2320. failed = True
  2321. self.assertTrue(failed)
  2322. sys.stdout = sys.__stdout__
  2323. @patch.object(ambari_server, "find_properties_file")
  2324. def test_get_ambari_properties(self, find_properties_file_mock):
  2325. find_properties_file_mock.return_value = None
  2326. rcode = ambari_server.get_ambari_properties()
  2327. self.assertEqual(rcode, -1)
  2328. tf1 = tempfile.NamedTemporaryFile()
  2329. find_properties_file_mock.return_value = tf1.name
  2330. prop_name='name'
  2331. prop_value='val'
  2332. with open(tf1.name, 'w') as fout:
  2333. fout.write(prop_name + '=' + prop_value)
  2334. fout.close()
  2335. properties = ambari_server.get_ambari_properties()
  2336. self.assertEqual(properties[prop_name], prop_value)
  2337. self.assertEqual(properties.fileName, os.path.abspath(tf1.name))
  2338. sys.stdout = sys.__stdout__
  2339. @patch.object(ambari_server, "find_properties_file")
  2340. def test_parse_properties_file(self, find_properties_file_mock):
  2341. tf1 = tempfile.NamedTemporaryFile(mode='r')
  2342. find_properties_file_mock.return_value = tf1.name
  2343. args = MagicMock()
  2344. ambari_server.parse_properties_file(args)
  2345. self.assertEquals(args.persistence_type, "local")
  2346. with open(tf1.name, 'w') as fout:
  2347. fout.write("\n")
  2348. fout.write(ambari_server.PERSISTENCE_TYPE_PROPERTY+"=remote")
  2349. args = MagicMock()
  2350. ambari_server.parse_properties_file(args)
  2351. self.assertEquals(args.persistence_type, "remote")
  2352. @patch.object(ambari_server, 'decrypt_password_for_alias')
  2353. @patch.object(ambari_server, 'is_alias_string')
  2354. @patch.object(ambari_server, 'get_ambari_properties')
  2355. def test_configure_database_username_password_masterkey_persisted(self,
  2356. get_ambari_properties_method, is_alias_string_method,
  2357. decrypt_password_for_alias_method):
  2358. out = StringIO.StringIO()
  2359. sys.stdout = out
  2360. configs = {ambari_server.JDBC_USER_NAME_PROPERTY: "fakeuser",
  2361. ambari_server.JDBC_PASSWORD_PROPERTY: "${alias=somealias}",
  2362. ambari_server.SECURITY_KEY_IS_PERSISTED: "True" }
  2363. get_ambari_properties_method.return_value = configs
  2364. is_alias_string_method.return_value = True
  2365. decrypt_password_for_alias_method.return_value = "falepasswd"
  2366. args = MagicMock()
  2367. args.master_key = None
  2368. ambari_server.configure_database_username_password(args)
  2369. self.assertTrue(decrypt_password_for_alias_method.called)
  2370. self.assertTrue(is_alias_string_method.called)
  2371. self.assertEquals("fakeuser", args.database_username)
  2372. self.assertEquals("falepasswd", args.database_password)
  2373. sys.stdout = sys.__stdout__
  2374. @patch.object(ambari_server, 'read_password')
  2375. def test_configure_database_password(self, read_password_method):
  2376. out = StringIO.StringIO()
  2377. sys.stdout = out
  2378. read_password_method.return_value = "fakepasswd"
  2379. result = ambari_server.configure_database_password(True)
  2380. self.assertTrue(read_password_method.called)
  2381. self.assertEquals("fakepasswd", result)
  2382. result = ambari_server.configure_database_password(True)
  2383. self.assertEquals("fakepasswd", result)
  2384. result = ambari_server.configure_database_password(True)
  2385. self.assertEquals("fakepasswd", result)
  2386. sys.stdout = sys.__stdout__
  2387. @patch.object(ambari_server, 'remove_password_file')
  2388. @patch.object(ambari_server, 'save_passwd_for_alias')
  2389. @patch.object(ambari_server, 'read_master_key')
  2390. @patch.object(ambari_server, 'read_ambari_user')
  2391. @patch.object(ambari_server, 'get_master_key_location')
  2392. @patch.object(ambari_server, 'update_properties')
  2393. @patch.object(ambari_server, 'save_master_key')
  2394. @patch.object(ambari_server, 'get_YN_input')
  2395. @patch.object(ambari_server, 'search_file')
  2396. @patch.object(ambari_server, 'get_ambari_properties')
  2397. @patch.object(ambari_server, 'is_root')
  2398. def test_setup_master_key_not_persist(self, is_root_method,
  2399. get_ambari_properties_method, search_file_message,
  2400. get_YN_input_method, save_master_key_method,
  2401. update_properties_method, get_master_key_location_method,
  2402. read_ambari_user_method, read_master_key_method,
  2403. save_passwd_for_alias_method, remove_password_file_method):
  2404. out = StringIO.StringIO()
  2405. sys.stdout = out
  2406. is_root_method.return_value = True
  2407. p = get_ambari_properties_method.return_value
  2408. p.get_property.side_effect = [ None, "fakepasswd", "fakepasswd" ]
  2409. read_master_key_method.return_value = "aaa"
  2410. get_YN_input_method.return_value = False
  2411. read_ambari_user_method.return_value = None
  2412. save_passwd_for_alias_method.return_value = 0
  2413. ambari_server.setup_master_key()
  2414. self.assertTrue(get_YN_input_method.called)
  2415. self.assertTrue(read_master_key_method.called)
  2416. self.assertTrue(read_ambari_user_method.called)
  2417. self.assertTrue(update_properties_method.called)
  2418. self.assertFalse(save_master_key_method.called)
  2419. self.assertTrue(save_passwd_for_alias_method.called)
  2420. self.assertEquals(2, save_passwd_for_alias_method.call_count)
  2421. self.assertTrue(remove_password_file_method.called)
  2422. result_expected = {ambari_server.JDBC_PASSWORD_PROPERTY :
  2423. ambari_server.get_alias_string(ambari_server.JDBC_RCA_PASSWORD_ALIAS),
  2424. ambari_server.LDAP_MGR_PASSWORD_PROPERTY :
  2425. ambari_server.get_alias_string(ambari_server.LDAP_MGR_PASSWORD_ALIAS),
  2426. ambari_server.SECURITY_IS_ENCRYPTION_ENABLED : 'true'}
  2427. sorted_x = sorted(result_expected.iteritems(), key=operator.itemgetter(0))
  2428. sorted_y = sorted(update_properties_method.call_args[0][0].iteritems(),
  2429. key=operator.itemgetter(0))
  2430. self.assertEquals(sorted_x, sorted_y)
  2431. sys.stdout = sys.__stdout__
  2432. @patch.object(ambari_server, 'read_master_key')
  2433. @patch.object(ambari_server, 'read_ambari_user')
  2434. @patch.object(ambari_server, 'get_master_key_location')
  2435. @patch.object(ambari_server, 'update_properties')
  2436. @patch.object(ambari_server, 'save_master_key')
  2437. @patch.object(ambari_server, 'get_YN_input')
  2438. @patch.object(ambari_server, 'search_file')
  2439. @patch.object(ambari_server, 'get_ambari_properties')
  2440. @patch.object(ambari_server, 'is_root')
  2441. def test_setup_master_key_persist(self, is_root_method,
  2442. get_ambari_properties_method, search_file_message,
  2443. get_YN_input_method, save_master_key_method,
  2444. update_properties_method, get_master_key_location_method,
  2445. read_ambari_user_method, read_master_key_method):
  2446. out = StringIO.StringIO()
  2447. sys.stdout = out
  2448. is_root_method.return_value = True
  2449. p = get_ambari_properties_method.return_value
  2450. p.get_property.side_effect = [ None, "fakepasswd", None ]
  2451. read_master_key_method.return_value = "aaa"
  2452. get_YN_input_method.side_effect = [True, False]
  2453. read_ambari_user_method.return_value = None
  2454. ambari_server.setup_master_key()
  2455. self.assertTrue(get_YN_input_method.called)
  2456. self.assertTrue(read_master_key_method.called)
  2457. self.assertTrue(read_ambari_user_method.called)
  2458. self.assertTrue(update_properties_method.called)
  2459. self.assertTrue(save_master_key_method.called)
  2460. result_expected = {ambari_server.JDBC_PASSWORD_PROPERTY:
  2461. ambari_server.get_alias_string(ambari_server.JDBC_RCA_PASSWORD_ALIAS),
  2462. ambari_server.SECURITY_IS_ENCRYPTION_ENABLED: 'true'}
  2463. sorted_x = sorted(result_expected.iteritems(), key=operator.itemgetter(0))
  2464. sorted_y = sorted(update_properties_method.call_args[0][0].iteritems(),
  2465. key=operator.itemgetter(0))
  2466. self.assertEquals(sorted_x, sorted_y)
  2467. sys.stdout = sys.__stdout__
  2468. @patch.object(ambari_server, 'read_master_key')
  2469. @patch.object(ambari_server, 'remove_password_file')
  2470. @patch("os.path.exists")
  2471. @patch.object(ambari_server, 'read_ambari_user')
  2472. @patch.object(ambari_server, 'get_master_key_location')
  2473. @patch("ambari-server.Properties")
  2474. @patch.object(ambari_server, 'save_passwd_for_alias')
  2475. @patch.object(ambari_server, 'read_passwd_for_alias')
  2476. @patch.object(ambari_server, 'update_properties')
  2477. @patch.object(ambari_server, 'save_master_key')
  2478. @patch.object(ambari_server, 'get_validated_string_input')
  2479. @patch.object(ambari_server, 'get_YN_input')
  2480. @patch.object(ambari_server, 'search_file')
  2481. @patch.object(ambari_server, 'get_ambari_properties')
  2482. @patch.object(ambari_server, 'is_root')
  2483. def test_reset_master_key_persisted(self, is_root_method,
  2484. get_ambari_properties_method, search_file_message,
  2485. get_YN_input_method, get_validated_string_input_method,
  2486. save_master_key_method, update_properties_method,
  2487. read_passwd_for_alias_method, save_passwd_for_alias_method,
  2488. Properties_mock, get_master_key_location_method,
  2489. read_ambari_user_method, exists_mock,
  2490. remove_password_file_method, read_master_key_method):
  2491. out = StringIO.StringIO()
  2492. sys.stdout = out
  2493. # Testing call under non-root
  2494. is_root_method.return_value = False
  2495. try:
  2496. ambari_server.setup_master_key()
  2497. self.fail("Should throw exception")
  2498. except FatalException as fe:
  2499. # Expected
  2500. self.assertTrue("root-level" in fe.reason)
  2501. pass
  2502. # Testing call under root
  2503. is_root_method.return_value = True
  2504. search_file_message.return_value = "filepath"
  2505. read_ambari_user_method.return_value = None
  2506. p = get_ambari_properties_method.return_value
  2507. p.get_property.side_effect = [ 'true', '${alias=fakealias}',
  2508. '${alias=fakealias}' ]
  2509. get_YN_input_method.side_effect = [ True, True ]
  2510. read_master_key_method.return_value = "aaa"
  2511. read_passwd_for_alias_method.return_value = "fakepassword"
  2512. save_passwd_for_alias_method.return_value = 0
  2513. exists_mock.return_value = False
  2514. ambari_server.setup_master_key()
  2515. self.assertTrue(save_master_key_method.called)
  2516. self.assertTrue(get_YN_input_method.called)
  2517. self.assertTrue(read_master_key_method.called)
  2518. self.assertTrue(update_properties_method.called)
  2519. self.assertTrue(read_passwd_for_alias_method.called)
  2520. self.assertTrue(2, read_passwd_for_alias_method.call_count)
  2521. self.assertTrue(2, save_passwd_for_alias_method.call_count)
  2522. result_expected = {ambari_server.JDBC_PASSWORD_PROPERTY:
  2523. ambari_server.get_alias_string(ambari_server.JDBC_RCA_PASSWORD_ALIAS),
  2524. ambari_server.LDAP_MGR_PASSWORD_PROPERTY:
  2525. ambari_server.get_alias_string(ambari_server.LDAP_MGR_PASSWORD_ALIAS),
  2526. ambari_server.SECURITY_IS_ENCRYPTION_ENABLED: 'true'}
  2527. sorted_x = sorted(result_expected.iteritems(), key=operator.itemgetter(0))
  2528. sorted_y = sorted(update_properties_method.call_args[0][0].iteritems(),
  2529. key=operator.itemgetter(0))
  2530. self.assertEquals(sorted_x, sorted_y)
  2531. sys.stdout = sys.__stdout__
  2532. @patch.object(ambari_server, 'remove_password_file')
  2533. @patch("os.path.exists")
  2534. @patch.object(ambari_server, 'read_ambari_user')
  2535. @patch.object(ambari_server, 'get_master_key_location')
  2536. @patch("ambari-server.Properties")
  2537. @patch.object(ambari_server, 'save_passwd_for_alias')
  2538. @patch.object(ambari_server, 'read_passwd_for_alias')
  2539. @patch.object(ambari_server, 'update_properties')
  2540. @patch.object(ambari_server, 'save_master_key')
  2541. @patch.object(ambari_server, 'get_validated_string_input')
  2542. @patch.object(ambari_server, 'get_YN_input')
  2543. @patch.object(ambari_server, 'search_file')
  2544. @patch.object(ambari_server, 'get_ambari_properties')
  2545. @patch.object(ambari_server, 'is_root')
  2546. def test_reset_master_key_not_persisted(self, is_root_method,
  2547. get_ambari_properties_method,
  2548. search_file_message, get_YN_input_method,
  2549. get_validated_string_input_method, save_master_key_method,
  2550. update_properties_method, read_passwd_for_alias_method,
  2551. save_passwd_for_alias_method, Properties_mock,
  2552. get_master_key_location_method, read_ambari_user_method,
  2553. exists_mock, remove_password_file_method):
  2554. out = StringIO.StringIO()
  2555. sys.stdout = out
  2556. is_root_method.return_value = True
  2557. search_file_message.return_value = False
  2558. read_ambari_user_method.return_value = None
  2559. p = get_ambari_properties_method.return_value
  2560. p.get_property.side_effect = [ 'true', '${alias=fakealias}',
  2561. '${alias=fakealias}' ]
  2562. get_YN_input_method.side_effect = [ True, False ]
  2563. get_validated_string_input_method.return_value = "aaa"
  2564. read_passwd_for_alias_method.return_value = "fakepassword"
  2565. save_passwd_for_alias_method.return_value = 0
  2566. exists_mock.return_value = False
  2567. ambari_server.setup_master_key()
  2568. self.assertFalse(save_master_key_method.called)
  2569. self.assertTrue(get_YN_input_method.called)
  2570. self.assertTrue(get_validated_string_input_method.called)
  2571. self.assertTrue(update_properties_method.called)
  2572. self.assertTrue(read_passwd_for_alias_method.called)
  2573. self.assertTrue(2, read_passwd_for_alias_method.call_count)
  2574. self.assertTrue(2, save_passwd_for_alias_method.call_count)
  2575. self.assertFalse(save_master_key_method.called)
  2576. result_expected = {ambari_server.JDBC_PASSWORD_PROPERTY:
  2577. ambari_server.get_alias_string(ambari_server.JDBC_RCA_PASSWORD_ALIAS),
  2578. ambari_server.LDAP_MGR_PASSWORD_PROPERTY:
  2579. ambari_server.get_alias_string(ambari_server.LDAP_MGR_PASSWORD_ALIAS),
  2580. ambari_server.SECURITY_IS_ENCRYPTION_ENABLED: 'true'}
  2581. sorted_x = sorted(result_expected.iteritems(), key=operator.itemgetter(0))
  2582. sorted_y = sorted(update_properties_method.call_args[0][0].iteritems(),
  2583. key=operator.itemgetter(0))
  2584. self.assertEquals(sorted_x, sorted_y)
  2585. sys.stdout = sys.__stdout__
  2586. @patch.object(ambari_server, 'save_passwd_for_alias')
  2587. @patch.object(ambari_server, 'get_YN_input')
  2588. @patch.object(ambari_server, 'update_properties')
  2589. @patch.object(ambari_server, 'configure_ldap_password')
  2590. @patch.object(ambari_server, 'get_validated_string_input')
  2591. @patch.object(ambari_server, 'setup_master_key')
  2592. @patch.object(ambari_server, 'search_file')
  2593. @patch.object(ambari_server, 'get_ambari_properties')
  2594. @patch.object(ambari_server, 'is_root')
  2595. def test_setup_ldap(self, is_root_method, get_ambari_properties_method,
  2596. search_file_message, setup_master_key_method,
  2597. get_validated_string_input_method,
  2598. configure_ldap_password_method, update_properties_method,
  2599. get_YN_input_method, save_passwd_for_alias_method):
  2600. out = StringIO.StringIO()
  2601. sys.stdout = out
  2602. # Testing call under non-root
  2603. is_root_method.return_value = False
  2604. try:
  2605. ambari_server.setup_ldap()
  2606. self.fail("Should throw exception")
  2607. except FatalException as fe:
  2608. # Expected
  2609. self.assertTrue("root-level" in fe.reason)
  2610. pass
  2611. # Testing call under root
  2612. is_root_method.return_value = True
  2613. search_file_message.return_value = "filepath"
  2614. configs = { ambari_server.SECURITY_MASTER_KEY_LOCATION : "filepath",
  2615. ambari_server.SECURITY_KEYS_DIR : tempfile.gettempdir(),
  2616. ambari_server.SECURITY_KEY_IS_PERSISTED : "true"
  2617. }
  2618. get_ambari_properties_method.return_value = configs
  2619. configure_ldap_password_method.return_value = "password"
  2620. setup_master_key_method.return_value = (None, True, True)
  2621. get_YN_input_method.return_value = True
  2622. save_passwd_for_alias_method.return_value = 0
  2623. def side_effect(*args, **kwargs):
  2624. if 'Bind anonymously' in args[0]:
  2625. return 'false'
  2626. if args[1] == "true" or args[1] == "false":
  2627. return args[1]
  2628. else:
  2629. return "test"
  2630. get_validated_string_input_method.side_effect = side_effect
  2631. ambari_server.setup_ldap()
  2632. ldap_properties_map =\
  2633. {
  2634. "authentication.ldap.primaryUrl" : "test",
  2635. "authentication.ldap.secondaryUrl" : "test",
  2636. "authentication.ldap.useSSL" : "false",
  2637. "authentication.ldap.usernameAttribute" : "test",
  2638. "authentication.ldap.baseDn" : "test",
  2639. "authentication.ldap.bindAnonymously" : "false",
  2640. "authentication.ldap.managerDn" : "test",
  2641. "authentication.ldap.managerPassword" : \
  2642. 'password',
  2643. "client.security" : "ldap"
  2644. }
  2645. sorted_x = sorted(ldap_properties_map.iteritems(), key=operator.itemgetter(0))
  2646. sorted_y = sorted(update_properties_method.call_args[0][0].iteritems(),
  2647. key=operator.itemgetter(0))
  2648. self.assertEquals(sorted_x, sorted_y)
  2649. self.assertTrue(update_properties_method.called)
  2650. self.assertTrue(configure_ldap_password_method.called)
  2651. self.assertTrue(get_validated_string_input_method.called)
  2652. self.assertTrue(get_YN_input_method.called)
  2653. sys.stdout = sys.__stdout__
  2654. @patch.object(ambari_server, 'read_password')
  2655. def test_configure_ldap_password(self, read_password_method):
  2656. out = StringIO.StringIO()
  2657. sys.stdout = out
  2658. read_password_method.return_value = "blah"
  2659. ambari_server.configure_ldap_password()
  2660. self.assertTrue(read_password_method.called)
  2661. sys.stdout = sys.__stdout__
  2662. def test_generate_random_string(self):
  2663. random_str_len = 100
  2664. str1 = ambari_server.generate_random_string(random_str_len)
  2665. self.assertTrue(len(str1) == random_str_len)
  2666. str2 = ambari_server.generate_random_string(random_str_len)
  2667. self.assertTrue(str1 != str2)
  2668. def test_regexps(self):
  2669. res = re.search(ambari_server.REGEX_HOSTNAME_PORT, "")
  2670. self.assertTrue(res is None)
  2671. res = re.search(ambari_server.REGEX_HOSTNAME_PORT, "ddd")
  2672. self.assertTrue(res is None)
  2673. res = re.search(ambari_server.REGEX_HOSTNAME_PORT, "gg:ff")
  2674. self.assertTrue(res is None)
  2675. res = re.search(ambari_server.REGEX_HOSTNAME_PORT, "gg:55444325")
  2676. self.assertTrue(res is None)
  2677. res = re.search(ambari_server.REGEX_HOSTNAME_PORT, "gg:555")
  2678. self.assertTrue(res is not None)
  2679. res = re.search(ambari_server.REGEX_TRUE_FALSE, "")
  2680. self.assertTrue(res is not None)
  2681. res = re.search(ambari_server.REGEX_TRUE_FALSE, "t")
  2682. self.assertTrue(res is None)
  2683. res = re.search(ambari_server.REGEX_TRUE_FALSE, "trrrr")
  2684. self.assertTrue(res is None)
  2685. res = re.search(ambari_server.REGEX_TRUE_FALSE, "true|false")
  2686. self.assertTrue(res is None)
  2687. res = re.search(ambari_server.REGEX_TRUE_FALSE, "true")
  2688. self.assertTrue(res is not None)
  2689. res = re.search(ambari_server.REGEX_TRUE_FALSE, "false")
  2690. self.assertTrue(res is not None)
  2691. res = re.search(ambari_server.REGEX_ANYTHING, "")
  2692. self.assertTrue(res is not None)
  2693. res = re.search(ambari_server.REGEX_ANYTHING, "t")
  2694. self.assertTrue(res is not None)
  2695. res = re.search(ambari_server.REGEX_ANYTHING, "trrrr")
  2696. self.assertTrue(res is not None)
  2697. def get_sample(self, sample):
  2698. """
  2699. Returns sample file content as string with normalized line endings
  2700. """
  2701. path = self.get_samples_dir(sample)
  2702. return self.get_file_string(path)
  2703. def get_file_string(self, file):
  2704. """
  2705. Returns file content as string with normalized line endings
  2706. """
  2707. string = open(file, 'r').read()
  2708. return self.normalize(string)
  2709. def normalize(self, string):
  2710. """
  2711. Normalizes line ending in string according to platform-default encoding
  2712. """
  2713. return string.replace("\n", os.linesep)
  2714. def get_samples_dir(self, sample):
  2715. """
  2716. Returns full file path by sample name
  2717. """
  2718. testdir = os.path.dirname(__file__)
  2719. return os.path.dirname(testdir) + os.sep + "resources" + os.sep \
  2720. + 'TestAmbaryServer.samples/' + sample