TestUpgradeScript_HDP2.py 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646
  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 subprocess
  17. from mock.mock import MagicMock, call, patch
  18. from unittest import TestCase
  19. from mock.mock import create_autospec
  20. import sys
  21. import unittest
  22. import UpgradeHelper_HDP2
  23. import StringIO
  24. import logging
  25. class TestUpgradeHDP2Script(TestCase):
  26. def setUp(self):
  27. UpgradeHelper_HDP2.logger = MagicMock()
  28. out = StringIO.StringIO()
  29. sys.stdout = out
  30. def tearDown(self):
  31. sys.stdout = sys.__stdout__
  32. @patch.object(UpgradeHelper_HDP2, 'backup_single_config_type')
  33. def test_backup_configs(self, backup_config_mock):
  34. UpgradeHelper_HDP2.backup_configs(None)
  35. self.assertTrue(backup_config_mock.called)
  36. @patch.object(UpgradeHelper_HDP2, 'update_config')
  37. @patch.object(UpgradeHelper_HDP2, 'get_config')
  38. @patch('optparse.Values')
  39. def test_update_with_append(self, optparse_mock, get_config_mock, update_config_mock):
  40. opm = optparse_mock.return_value
  41. update_config_mock.return_value = None
  42. options = MagicMock()
  43. args = ["save-configs"]
  44. opm.parse_args.return_value = (options, args)
  45. get_config_mock.return_value = {"a1": "va1", "a2": "va2", "b1": "vb1", "b2": "vb2", "c1": "vc1", "d1": "d1"}
  46. site_template = {"y1": "vy1", "a1": "REPLACE_WITH_", "a2": "REPLACE_WITH_", "nb1": "REPLACE_WITH_b1",
  47. "nb2": "REPLACE_WITH_b2", "d1": "DELETE_OLD", "b1" : "DELETE_OLD","c1": "vc2"}
  48. expected_site = {"y1": "vy1", "a1": "va1", "a2": "va2", "nb1": "vb1", "nb2": "vb2", "c1": "vc2"}
  49. UpgradeHelper_HDP2.update_config_using_existing(opm, "global", site_template)
  50. get_config_mock.assert_called_once_with(opm, "global")
  51. update_config_mock.assert_called_once_with(opm, expected_site, "global")
  52. pass
  53. @patch.object(UpgradeHelper_HDP2, 'update_config')
  54. @patch.object(UpgradeHelper_HDP2, 'get_config')
  55. @patch('optparse.Values')
  56. def test_update_with_appen_II(self, optparse_mock, get_config_mock, update_config_mock):
  57. opm = optparse_mock.return_value
  58. update_config_mock.return_value = None
  59. options = MagicMock()
  60. args = ["save-configs"]
  61. opm.parse_args.return_value = (options, args)
  62. get_config_mock.return_value = {"a1": "va1", "a2": "va2", "b1": "vb1", "b2": "vb2", "c1": "vc1", "x1": "x1",
  63. "X1": "X1"}
  64. site_template = {"y1": "vy1", "a1": "REPLACE_WITH_", "a2": "REPLACE_WITH_", "nb1": "REPLACE_WITH_b1",
  65. "nb2": "REPLACE_WITH_b2", "x1": "DELETE_OLD", "X1": "DELETE"}
  66. expected_site = {"y1": "vy1", "a1": "va1", "a2": "va2", "nb1": "vb1", "nb2": "vb2", "c1": "vc1","X1": "DELETE"}
  67. UpgradeHelper_HDP2.update_config_using_existing(opm, "global", site_template)
  68. get_config_mock.assert_called_once_with(opm, "global")
  69. update_config_mock.assert_called_once_with(opm, expected_site, "global")
  70. pass
  71. @patch.object(logging.FileHandler, 'setFormatter')
  72. @patch.object(logging, 'basicConfig')
  73. @patch.object(logging, 'FileHandler')
  74. @patch.object(UpgradeHelper_HDP2, 'write_config')
  75. @patch.object(UpgradeHelper_HDP2, 'get_config_resp')
  76. @patch("os.remove")
  77. @patch("shutil.copyfile")
  78. @patch("os.path.exists")
  79. @patch('optparse.OptionParser')
  80. def test_save_configs(self, option_parser_mock, path_exists_mock, shutil_copy_mock, os_remove_mock,
  81. get_config_resp_mock, write_config_mock, file_handler_mock, logging_mock, set_formatter_mock):
  82. file_handler_mock.return_value = logging.FileHandler('') # disable creating real file
  83. opm = option_parser_mock.return_value
  84. path_exists_mock.return_value = True
  85. shutil_copy_mock = MagicMock()
  86. options = self.get_mock_options()
  87. args = ["backup-configs"]
  88. opm.parse_args.return_value = (options, args)
  89. def get_config_resp_side_effect(ops, type, error_if_na):
  90. if type == "global":
  91. return ("version1", "")
  92. elif type == "core-site":
  93. return ("version1", "")
  94. elif type == "hdfs-site":
  95. return ("version1", "")
  96. elif type == "mapred-site":
  97. return ("version2", "")
  98. elif type == "hbase-site":
  99. return ("version2", "")
  100. else:
  101. return (None, None)
  102. get_config_resp_mock.side_effect = get_config_resp_side_effect
  103. UpgradeHelper_HDP2.main()
  104. shutil_copy_mock.assert_called_once()
  105. os_remove_mock.assert_called_once_with("logfile")
  106. write_expected = [call("", "global", "version1"), call("", "core-site", "version1"),
  107. call("", "hdfs-site", "version1"), call("", "mapred-site", "version2"),
  108. call("", "hbase-site", "version2")]
  109. write_config_mock.assert_has_calls(write_expected, any_order=True)
  110. get_config_expected = [call(options, "global", True), call(options, "core-site", True),
  111. call(options, "hdfs-site", True), call(options, "mapred-site", True),
  112. call(options, "hbase-site", False), call(options, "oozie-site", False),
  113. call(options, "webhcat-site", False), call(options, "hive-site", False)]
  114. get_config_resp_mock.assert_has_calls(get_config_expected, any_order=True)
  115. pass
  116. @patch.object(logging, 'FileHandler')
  117. @patch.object(UpgradeHelper_HDP2, "backup_file")
  118. @patch.object(UpgradeHelper_HDP2, 'write_mapping')
  119. @patch("json.loads")
  120. @patch.object(UpgradeHelper_HDP2, 'curl')
  121. @patch('optparse.OptionParser')
  122. def test_save_mr_mapping(self, option_parser_mock, curl_mock, json_loads_mock, write_mapping_mock,
  123. backup_file_mock, file_handler_mock):
  124. file_handler_mock.return_value = logging.FileHandler('') # disable creating real file
  125. opm = option_parser_mock.return_value
  126. options = self.get_mock_options()
  127. args = ["save-mr-mapping"]
  128. opm.parse_args.return_value = (options, args)
  129. curl_mock.side_effect = ['"href" : "', '"href" : "', '"href" : "', '"href" : "']
  130. json_loads_mock.return_value = {"host_components": [{"HostRoles": {"host_name": "host1"}}]}
  131. UpgradeHelper_HDP2.main()
  132. expected_curl_calls = [
  133. call(False, "-u", "admin:admin",
  134. "http://localhost:8080/api/v1/clusters/c1/services/MAPREDUCE/components/MAPREDUCE_CLIENT"),
  135. call(False, "-u", "admin:admin",
  136. "http://localhost:8080/api/v1/clusters/c1/services/MAPREDUCE/components/TASKTRACKER"),
  137. call(False, "-u", "admin:admin",
  138. "http://localhost:8080/api/v1/clusters/c1/services/MAPREDUCE/components/JOBTRACKER")]
  139. curl_mock.assert_has_calls(expected_curl_calls, any_order=True)
  140. self.assertTrue(write_mapping_mock.called)
  141. write_call = write_mapping_mock.call_args
  142. args, kargs = write_call
  143. self.assertTrue('MAPREDUCE_CLIENT' in args[0].keys())
  144. self.assertTrue(["host1"] == args[0]['MAPREDUCE_CLIENT'])
  145. self.assertTrue('TASKTRACKER' in args[0].keys())
  146. self.assertTrue('TASKTRACKER' in args[0].keys())
  147. pass
  148. @patch.object(UpgradeHelper_HDP2, "get_YN_input")
  149. @patch.object(UpgradeHelper_HDP2, "read_mapping")
  150. @patch.object(logging, 'FileHandler')
  151. @patch.object(UpgradeHelper_HDP2, "backup_file")
  152. @patch.object(UpgradeHelper_HDP2, 'curl')
  153. @patch('optparse.OptionParser')
  154. def test_delete_mr(self, option_parser_mock, curl_mock,
  155. backup_file_mock, file_handler_mock, read_mapping_mock, get_yn_mock):
  156. file_handler_mock.return_value = logging.FileHandler('') # disable creating real file
  157. opm = option_parser_mock.return_value
  158. options = self.get_mock_options()
  159. args = ["delete-mr"]
  160. opm.parse_args.return_value = (options, args)
  161. curl_mock.return_value = ''
  162. get_yn_mock.return_value = True
  163. read_mapping_mock.return_value = {
  164. "TASKTRACKER": ["c6401", "c6402"],
  165. "JOBTRACKER": ["c6401"],
  166. "MAPREDUCE_CLIENT": ["c6401"]}
  167. UpgradeHelper_HDP2.main()
  168. expected_curl_calls = [
  169. call(False, "-u", "admin:admin", '-H', 'X-Requested-By: ambari', "-X", "PUT", "-d", """{"HostRoles": {"state": "DISABLED"}}""",
  170. "http://localhost:8080/api/v1/clusters/c1/hosts/c6401/host_components/TASKTRACKER"),
  171. call(False, "-u", "admin:admin", '-H', 'X-Requested-By: ambari', "-X", "PUT", "-d", """{"HostRoles": {"state": "DISABLED"}}""",
  172. "http://localhost:8080/api/v1/clusters/c1/hosts/c6402/host_components/TASKTRACKER"),
  173. call(False, "-u", "admin:admin", '-H', 'X-Requested-By: ambari', "-X", "PUT", "-d", """{"HostRoles": {"state": "DISABLED"}}""",
  174. "http://localhost:8080/api/v1/clusters/c1/hosts/c6401/host_components/JOBTRACKER"),
  175. call(False, "-u", "admin:admin", '-H', 'X-Requested-By: ambari', "-X", "DELETE",
  176. "http://localhost:8080/api/v1/clusters/c1/services/MAPREDUCE")]
  177. curl_mock.assert_has_calls(expected_curl_calls, any_order=True)
  178. pass
  179. @patch.object(UpgradeHelper_HDP2, "has_component_in_stack_def")
  180. @patch.object(UpgradeHelper_HDP2, "get_cluster_stackname")
  181. @patch.object(UpgradeHelper_HDP2, "read_mapping")
  182. @patch.object(logging, 'FileHandler')
  183. @patch.object(UpgradeHelper_HDP2, "backup_file")
  184. @patch.object(UpgradeHelper_HDP2, 'curl')
  185. @patch('optparse.OptionParser')
  186. def test_add_yarn_mr_with_ATS(self, option_parser_mock, curl_mock,
  187. backup_file_mock, file_handler_mock, read_mapping_mock, get_stack_mock, has_comp_mock):
  188. file_handler_mock.return_value = logging.FileHandler('') # disable creating real file
  189. opm = option_parser_mock.return_value
  190. options = self.get_mock_options()
  191. args = ["add-yarn-mr2"]
  192. opm.parse_args.return_value = (options, args)
  193. curl_mock.return_value = ''
  194. has_comp_mock.return_value = True
  195. read_mapping_mock.return_value = {
  196. "TASKTRACKER": ["c6401", "c6402"],
  197. "JOBTRACKER": ["c6401"],
  198. "HISTORYSERVER": ["c6401"],
  199. "MAPREDUCE_CLIENT": ["c6403"]}
  200. UpgradeHelper_HDP2.main()
  201. expected_curl_calls = [
  202. call(False, "-u", "admin:admin", '-H', 'X-Requested-By: ambari', "-X", "POST",
  203. "http://localhost:8080/api/v1/clusters/c1/services/YARN"),
  204. call(False, "-u", "admin:admin", '-H', 'X-Requested-By: ambari', "-X", "POST",
  205. "http://localhost:8080/api/v1/clusters/c1/services/MAPREDUCE2"),
  206. call(False, "-u", "admin:admin", '-H', 'X-Requested-By: ambari', "-X", "POST",
  207. "http://localhost:8080/api/v1/clusters/c1/services/MAPREDUCE2/components/HISTORYSERVER"),
  208. call(False, "-u", "admin:admin", '-H', 'X-Requested-By: ambari', "-X", "POST",
  209. "http://localhost:8080/api/v1/clusters/c1/services/MAPREDUCE2/components/MAPREDUCE2_CLIENT"),
  210. call(False, "-u", "admin:admin", '-H', 'X-Requested-By: ambari', "-X", "POST",
  211. "http://localhost:8080/api/v1/clusters/c1/services/YARN/components/NODEMANAGER"),
  212. call(False, "-u", "admin:admin", '-H', 'X-Requested-By: ambari', "-X", "POST",
  213. "http://localhost:8080/api/v1/clusters/c1/services/YARN/components/YARN_CLIENT"),
  214. call(False, "-u", "admin:admin", '-H', 'X-Requested-By: ambari', "-X", "POST",
  215. "http://localhost:8080/api/v1/clusters/c1/services/YARN/components/RESOURCEMANAGER"),
  216. call(False, "-u", "admin:admin", '-H', 'X-Requested-By: ambari', "-X", "POST",
  217. "http://localhost:8080/api/v1/clusters/c1/services/YARN/components/APP_TIMELINE_SERVER"),
  218. call(False, "-u", "admin:admin", '-H', 'X-Requested-By: ambari', "-X", "POST",
  219. "http://localhost:8080/api/v1/clusters/c1/hosts/c6401/host_components/NODEMANAGER"),
  220. call(False, '-u', 'admin:admin', '-H', 'X-Requested-By: ambari', '-X', 'POST',
  221. 'http://localhost:8080/api/v1/clusters/c1/hosts/c6401/host_components/HISTORYSERVER'),
  222. call(False, "-u", "admin:admin", '-H', 'X-Requested-By: ambari', "-X", "POST",
  223. "http://localhost:8080/api/v1/clusters/c1/hosts/c6402/host_components/NODEMANAGER"),
  224. call(False, "-u", "admin:admin", '-H', 'X-Requested-By: ambari', "-X", "POST",
  225. "http://localhost:8080/api/v1/clusters/c1/hosts/c6403/host_components/YARN_CLIENT"),
  226. call(False, "-u", "admin:admin", '-H', 'X-Requested-By: ambari', "-X", "POST",
  227. "http://localhost:8080/api/v1/clusters/c1/hosts/c6403/host_components/MAPREDUCE2_CLIENT"),
  228. call(False, "-u", "admin:admin", '-H', 'X-Requested-By: ambari', "-X", "POST",
  229. "http://localhost:8080/api/v1/clusters/c1/hosts/c6401/host_components/RESOURCEMANAGER"),
  230. call(False, "-u", "admin:admin", '-H', 'X-Requested-By: ambari', "-X", "POST",
  231. "http://localhost:8080/api/v1/clusters/c1/hosts/c6401/host_components/APP_TIMELINE_SERVER")]
  232. curl_mock.assert_has_calls(expected_curl_calls, any_order=True)
  233. pass
  234. @patch.object(UpgradeHelper_HDP2, "has_component_in_stack_def")
  235. @patch.object(UpgradeHelper_HDP2, "get_cluster_stackname")
  236. @patch.object(UpgradeHelper_HDP2, "read_mapping")
  237. @patch.object(logging, 'FileHandler')
  238. @patch.object(UpgradeHelper_HDP2, "backup_file")
  239. @patch.object(UpgradeHelper_HDP2, 'curl')
  240. @patch('optparse.OptionParser')
  241. def test_add_yarn_mr_without_ATS(self, option_parser_mock, curl_mock,
  242. backup_file_mock, file_handler_mock, read_mapping_mock, get_stack_mock, has_comp_mock):
  243. file_handler_mock.return_value = logging.FileHandler('') # disable creating real file
  244. opm = option_parser_mock.return_value
  245. options = self.get_mock_options()
  246. args = ["add-yarn-mr2"]
  247. opm.parse_args.return_value = (options, args)
  248. curl_mock.return_value = ''
  249. has_comp_mock.return_value = False
  250. read_mapping_mock.return_value = {
  251. "TASKTRACKER": ["c6401", "c6402"],
  252. "JOBTRACKER": ["c6401"],
  253. "HISTORYSERVER": ["c6401"],
  254. "MAPREDUCE_CLIENT": ["c6403"]}
  255. UpgradeHelper_HDP2.main()
  256. expected_curl_calls = [
  257. call(False, "-u", "admin:admin", '-H', 'X-Requested-By: ambari', "-X", "POST",
  258. "http://localhost:8080/api/v1/clusters/c1/services/YARN"),
  259. call(False, "-u", "admin:admin", '-H', 'X-Requested-By: ambari', "-X", "POST",
  260. "http://localhost:8080/api/v1/clusters/c1/services/MAPREDUCE2"),
  261. call(False, "-u", "admin:admin", '-H', 'X-Requested-By: ambari', "-X", "POST",
  262. "http://localhost:8080/api/v1/clusters/c1/services/MAPREDUCE2/components/HISTORYSERVER"),
  263. call(False, "-u", "admin:admin", '-H', 'X-Requested-By: ambari', "-X", "POST",
  264. "http://localhost:8080/api/v1/clusters/c1/services/MAPREDUCE2/components/MAPREDUCE2_CLIENT"),
  265. call(False, "-u", "admin:admin", '-H', 'X-Requested-By: ambari', "-X", "POST",
  266. "http://localhost:8080/api/v1/clusters/c1/services/YARN/components/NODEMANAGER"),
  267. call(False, "-u", "admin:admin", '-H', 'X-Requested-By: ambari', "-X", "POST",
  268. "http://localhost:8080/api/v1/clusters/c1/services/YARN/components/YARN_CLIENT"),
  269. call(False, "-u", "admin:admin", '-H', 'X-Requested-By: ambari', "-X", "POST",
  270. "http://localhost:8080/api/v1/clusters/c1/services/YARN/components/RESOURCEMANAGER"),
  271. call(False, "-u", "admin:admin", '-H', 'X-Requested-By: ambari', "-X", "POST",
  272. "http://localhost:8080/api/v1/clusters/c1/hosts/c6401/host_components/NODEMANAGER"),
  273. call(False, '-u', 'admin:admin', '-H', 'X-Requested-By: ambari', '-X', 'POST',
  274. 'http://localhost:8080/api/v1/clusters/c1/hosts/c6401/host_components/HISTORYSERVER'),
  275. call(False, "-u", "admin:admin", '-H', 'X-Requested-By: ambari', "-X", "POST",
  276. "http://localhost:8080/api/v1/clusters/c1/hosts/c6402/host_components/NODEMANAGER"),
  277. call(False, "-u", "admin:admin", '-H', 'X-Requested-By: ambari', "-X", "POST",
  278. "http://localhost:8080/api/v1/clusters/c1/hosts/c6403/host_components/YARN_CLIENT"),
  279. call(False, "-u", "admin:admin", '-H', 'X-Requested-By: ambari', "-X", "POST",
  280. "http://localhost:8080/api/v1/clusters/c1/hosts/c6403/host_components/MAPREDUCE2_CLIENT"),
  281. call(False, "-u", "admin:admin", '-H', 'X-Requested-By: ambari', "-X", "POST",
  282. "http://localhost:8080/api/v1/clusters/c1/hosts/c6401/host_components/RESOURCEMANAGER"),
  283. ]
  284. curl_mock.assert_has_calls(expected_curl_calls, any_order=True)
  285. # assert no ATS was added
  286. self.assert_(not call(False, "-u", "admin:admin", '-H', 'X-Requested-By: ambari', "-X", "POST",
  287. "http://localhost:8080/api/v1/clusters/c1/hosts/c6401/host_components/APP_TIMELINE_SERVER") in curl_mock.call_args_list, "ATS should not be added if it's not present!")
  288. self.assert_(not call(False, "-u", "admin:admin", '-H', 'X-Requested-By: ambari', "-X", "POST",
  289. "http://localhost:8080/api/v1/clusters/c1/services/YARN/components/APP_TIMELINE_SERVER") in curl_mock.call_args_list, "ATS should not be added if it's not present!")
  290. pass
  291. @patch.object(logging, 'FileHandler')
  292. @patch.object(UpgradeHelper_HDP2, "backup_file")
  293. @patch.object(UpgradeHelper_HDP2, 'curl')
  294. @patch('optparse.OptionParser')
  295. def test_install_yarn_mr2(self, option_parser_mock, curl_mock,
  296. backup_file_mock, file_handler_mock):
  297. file_handler_mock.return_value = logging.FileHandler('') # disable creating real file
  298. opm = option_parser_mock.return_value
  299. options = self.get_mock_options()
  300. args = ["install-yarn-mr2"]
  301. opm.parse_args.return_value = (options, args)
  302. curl_mock.return_value = '"href" : "'
  303. UpgradeHelper_HDP2.main()
  304. expected_curl_calls = [
  305. call(False, "-u", "admin:admin", '-H', 'X-Requested-By: ambari', "-X", "PUT", "-d",
  306. """{"RequestInfo":{"context":"Install MapReduce2"}, "Body":{"ServiceInfo": {"state":"INSTALLED"}}}""",
  307. "http://localhost:8080/api/v1/clusters/c1/services/MAPREDUCE2"),
  308. call(False, "-u", "admin:admin", '-H', 'X-Requested-By: ambari', "-X", "PUT", "-d",
  309. """{"RequestInfo":{"context":"Install YARN"}, "Body":{"ServiceInfo": {"state":"INSTALLED"}}}""",
  310. "http://localhost:8080/api/v1/clusters/c1/services/YARN")]
  311. curl_mock.assert_has_calls(expected_curl_calls, any_order=False)
  312. pass
  313. @patch.object(UpgradeHelper_HDP2, "get_config")
  314. @patch.object(UpgradeHelper_HDP2, "rename_all_properties")
  315. @patch.object(UpgradeHelper_HDP2, "update_config_using_existing_properties")
  316. @patch.object(UpgradeHelper_HDP2, "read_mapping")
  317. @patch.object(logging, 'FileHandler')
  318. @patch.object(UpgradeHelper_HDP2, "backup_file")
  319. @patch.object(UpgradeHelper_HDP2, 'curl')
  320. @patch('optparse.OptionParser')
  321. def test_update_single_configs(self, option_parser_mock, curl_mock,
  322. backup_file_mock, file_handler_mock, read_mapping_mock,
  323. update_config_mock, rename_all_prop_mock, get_config_mock):
  324. file_handler_mock.return_value = logging.FileHandler('') # disable creating real file
  325. opm = option_parser_mock.return_value
  326. options = MagicMock()
  327. args = ["update-configs", "hdfs-site"]
  328. opm.parse_args.return_value = (options, args)
  329. curl_mock.side_effect = ['', '', '', '', '', '', '']
  330. read_mapping_mock.return_value = {"JOBTRACKER": ["c6401"]}
  331. update_config_mock.side_effect = [None]
  332. get_config_mock.return_value = {}
  333. prop_to_move = {"dfs.namenode.checkpoint.edits.dir": "a1",
  334. "dfs.namenode.checkpoint.dir": "a2",
  335. "dfs.namenode.checkpoint.period": "a3"}
  336. rename_all_prop_mock.side_effect = [
  337. prop_to_move,
  338. {}, {}]
  339. UpgradeHelper_HDP2.main()
  340. self.assertTrue(update_config_mock.call_count == 1)
  341. args, kargs = update_config_mock.call_args_list[0]
  342. self.assertEqual("hdfs-site", args[1])
  343. for key in prop_to_move.keys():
  344. self.assertEqual(prop_to_move[key], args[3][key])
  345. pass
  346. @patch.object(UpgradeHelper_HDP2, "get_config_resp")
  347. @patch.object(UpgradeHelper_HDP2, "get_config")
  348. @patch.object(UpgradeHelper_HDP2, "read_mapping")
  349. @patch.object(logging, 'FileHandler')
  350. @patch.object(UpgradeHelper_HDP2, "backup_file")
  351. @patch.object(UpgradeHelper_HDP2, 'curl')
  352. @patch('optparse.OptionParser')
  353. def test_no_hbase(self, option_parser_mock, curl_mock,
  354. backup_file_mock, file_handler_mock, read_mapping_mock,
  355. get_config_mock, get_config_resp_mock):
  356. file_handler_mock.return_value = logging.FileHandler('') # disable creating real file
  357. opm = option_parser_mock.return_value
  358. options = MagicMock()
  359. args = ["update-configs"]
  360. opm.parse_args.return_value = (options, args)
  361. options.logfile = "logfile"
  362. options.user = "admin"
  363. options.password = "admin"
  364. options.hostname = "localhost"
  365. options.clustername = "c1"
  366. curl_mock.side_effect = ['', '', '', '', '', '', '']
  367. read_mapping_mock.return_value = {
  368. "TASKTRACKER": ["c6401", "c6402"],
  369. "JOBTRACKER": ["c6401"],
  370. "MAPREDUCE_CLIENT": ["c6403"]}
  371. get_config_resp_mock.return_value = "hbase-site", None
  372. get_config_mock.return_value = {
  373. "mapred.hosts": "an_old_value",
  374. "mapred.hosts.exclude": "an_old_value",
  375. "mapred.jobtracker.maxtasks.per.job": "an_old_value",
  376. "mapred.jobtracker.taskScheduler": "an_old_value",
  377. "dfs.df.interval": "an_old_value",
  378. "mapred.userlog.retain.hours": "will_not_be_stored",
  379. "global1": "global11"
  380. }
  381. UpgradeHelper_HDP2.main()
  382. self.assertEqual(6, len(curl_mock.call_args_list))
  383. @patch.object(UpgradeHelper_HDP2, "get_config_resp")
  384. @patch.object(UpgradeHelper_HDP2, "get_config")
  385. @patch.object(UpgradeHelper_HDP2, "read_mapping")
  386. @patch.object(logging, 'FileHandler')
  387. @patch.object(UpgradeHelper_HDP2, "backup_file")
  388. @patch.object(UpgradeHelper_HDP2, 'curl')
  389. @patch('optparse.OptionParser')
  390. def test_update_configs(self, option_parser_mock, curl_mock,
  391. backup_file_mock, file_handler_mock, read_mapping_mock,
  392. get_config_mock, get_config_resp_mock):
  393. file_handler_mock.return_value = logging.FileHandler('') # disable creating real file
  394. opm = option_parser_mock.return_value
  395. options = MagicMock()
  396. args = ["update-configs"]
  397. opm.parse_args.return_value = (options, args)
  398. options.logfile = "logfile"
  399. options.user = "admin"
  400. options.password = "admin"
  401. options.hostname = "localhost"
  402. options.clustername = "c1"
  403. curl_mock.side_effect = ['', '', '', '', '', '', '', '']
  404. read_mapping_mock.return_value = {
  405. "TASKTRACKER": ["c6401", "c6402"],
  406. "JOBTRACKER": ["c6401"],
  407. "MAPREDUCE_CLIENT": ["c6403"]}
  408. get_config_resp_mock.return_value = "hbase-site", {}
  409. site_properties = {
  410. "mapred.hosts": "an_old_value",
  411. "mapred.hosts.exclude": "an_old_value",
  412. "mapred.jobtracker.maxtasks.per.job": "an_old_value",
  413. "hbase.rpc.engine": "an_old_value",
  414. "dfs.df.interval": "an_old_value",
  415. "mapred.userlog.retain.hours": "will_not_be_stored",
  416. "global1": "global11"
  417. }
  418. get_config_mock.side_effect = [
  419. site_properties.copy(), site_properties.copy(), site_properties.copy(),
  420. site_properties.copy(), site_properties.copy(), site_properties.copy()]
  421. saved_global = UpgradeHelper_HDP2.GLOBAL
  422. saved_hdfs = UpgradeHelper_HDP2.HDFS_SITE
  423. saved_core = UpgradeHelper_HDP2.CORE_SITE
  424. saved_habse = UpgradeHelper_HDP2.HBASE_SITE
  425. saved_hive = UpgradeHelper_HDP2.HIVE_SITE
  426. saved_mapred = UpgradeHelper_HDP2.MAPRED_SITE
  427. try:
  428. UpgradeHelper_HDP2.GLOBAL = {"global2": "REPLACE_WITH_global1"}
  429. UpgradeHelper_HDP2.HDFS_SITE = {"global2": "REPLACE_WITH_global1"}
  430. UpgradeHelper_HDP2.CORE_SITE = {"global2": "REPLACE_WITH_global1"}
  431. UpgradeHelper_HDP2.main()
  432. finally:
  433. UpgradeHelper_HDP2.GLOBAL = saved_global
  434. UpgradeHelper_HDP2.HDFS_SITE = saved_hdfs
  435. UpgradeHelper_HDP2.CORE_SITE = saved_core
  436. UpgradeHelper_HDP2.MAPRED_SITE = saved_mapred
  437. self.assertEqual(8, len(curl_mock.call_args_list))
  438. self.validate_update_config_call(curl_mock.call_args_list[0], "capacity-scheduler")
  439. self.validate_update_config_call(curl_mock.call_args_list[1], "yarn-site")
  440. self.validate_update_config_call(curl_mock.call_args_list[3], "mapred-site")
  441. self.validate_update_config_call(curl_mock.call_args_list[2], "global")
  442. self.validate_config_replacememt(curl_mock.call_args_list[1], "yarn-site")
  443. self.validate_config_replacememt(curl_mock.call_args_list[2], "global")
  444. self.validate_config_replacememt(curl_mock.call_args_list[3], "mapred-site")
  445. self.validate_config_replacememt(curl_mock.call_args_list[4], "hdfs-site")
  446. self.validate_config_replacememt(curl_mock.call_args_list[5], "core-site")
  447. self.validate_config_replacememt(curl_mock.call_args_list[6], "hbase-site")
  448. pass
  449. @patch.object(UpgradeHelper_HDP2, "read_mapping")
  450. @patch("subprocess.Popen")
  451. @patch.object(UpgradeHelper_HDP2, "get_YN_input")
  452. @patch.object(logging, 'FileHandler')
  453. @patch.object(UpgradeHelper_HDP2, "backup_file")
  454. @patch.object(UpgradeHelper_HDP2, 'curl')
  455. @patch('optparse.OptionParser')
  456. def test_print_only(self, option_parser_mock, curl_mock,
  457. backup_file_mock, file_handler_mock, get_yn_mock, popen_mock, read_mapping_mock):
  458. file_handler_mock.return_value = logging.FileHandler('') # disable creating real file
  459. options = self.get_mock_options(True)
  460. get_yn_mock.return_value = True
  461. read_mapping_mock.return_value = {
  462. "TASKTRACKER": ["c6401", "c6402"]}
  463. UpgradeHelper_HDP2.delete_mr(options)
  464. self.assertFalse(popen_mock.called)
  465. pass
  466. @patch.object(logging, 'FileHandler')
  467. @patch.object(UpgradeHelper_HDP2, "backup_file")
  468. @patch.object(UpgradeHelper_HDP2, 'curl')
  469. def test_get_and_parse_properties(self, curl_mock,
  470. backup_file_mock, file_handler_mock):
  471. file_handler_mock.return_value = logging.FileHandler('') # disable creating real file
  472. options = self.get_mock_options()
  473. curl_mock.side_effect = [
  474. """{ "href" : "http://localhost:8080/api/v1/clusters/c1",
  475. "Clusters" : {
  476. "cluster_id" : 2,
  477. "cluster_name" : "c1",
  478. "version" : "HDP-2.0.5",
  479. "desired_configs" : {
  480. "capacity-scheduler" : {
  481. "user" : "admin",
  482. "tag" : "version137"
  483. },
  484. "core-site" : {
  485. "user" : "admin",
  486. "tag" : "version138"
  487. }}}}""",
  488. """{
  489. "href" : "http://localhost:8080/api/v1/clusters/c1/configurations?type=core-site&tag=version138",
  490. "items" : [
  491. {
  492. "href" : "http://localhost:8080/api/v1/clusters/c1/configurations?type=core-site&tag=version138",
  493. "tag" : "version1378850572477",
  494. "type" : "core-site",
  495. "Config" : {
  496. "cluster_name" : "c1"
  497. },
  498. "properties" : {
  499. "name1" : "value1",
  500. "name2" : "value2",
  501. "name3" : "value3"
  502. }}]}""",
  503. """{ "href" : "http://localhost:8080/api/v1/clusters/c1",
  504. "Clusters" : {
  505. "desired_configs" : {
  506. "capacity-scheduler" : {
  507. "user" : "admin",
  508. "tag" : "version137"
  509. }}}}"""]
  510. properties = UpgradeHelper_HDP2.get_config(options, "core-site")
  511. self.assertTrue(len(properties.keys()) == 3)
  512. self.assertTrue(properties["name1"] == "value1")
  513. self.assertTrue(properties["name2"] == "value2")
  514. self.assertTrue(properties["name3"] == "value3")
  515. try:
  516. UpgradeHelper_HDP2.get_config(options, "hdfs-site")
  517. except Exception, e:
  518. self.assertTrue('Unable to get the current version for config type hdfs-site' in e.reason)
  519. pass
  520. pass
  521. def test_rename_all_properties(self):
  522. site_properties = {
  523. "mapred.task.is.map": "mapreduce.task.ismap",
  524. "mapred.task.partition": "mapreduce.task.partition",
  525. "mapred.task.profile": "mapreduce.task.profile",
  526. "abc": "abc"
  527. }
  528. site_properties = \
  529. UpgradeHelper_HDP2.rename_all_properties(site_properties, UpgradeHelper_HDP2.PROPERTY_MAPPING)
  530. for key in site_properties.keys():
  531. self.assertEqual(key, site_properties[key])
  532. self.assertEqual(4, len(site_properties))
  533. pass
  534. def test_tags_count(self):
  535. def count_tags(template):
  536. deleted = 0
  537. replaced = 0
  538. for key in template.keys():
  539. value = template[key]
  540. if value == UpgradeHelper_HDP2.DELETE_OLD_TAG:
  541. deleted += 1
  542. continue
  543. if value.find(UpgradeHelper_HDP2.REPLACE_WITH_TAG) == 0:
  544. replaced += 1
  545. continue
  546. pass
  547. return deleted, replaced
  548. deleted, replaced = count_tags(UpgradeHelper_HDP2.GLOBAL)
  549. self.assertEqual(6, replaced)
  550. self.assertEqual(25, deleted)
  551. deleted, replaced = count_tags(UpgradeHelper_HDP2.MAPRED_SITE)
  552. self.assertEqual(0, replaced)
  553. self.assertEqual(95, deleted)
  554. deleted, replaced = count_tags(UpgradeHelper_HDP2.CORE_SITE)
  555. self.assertEqual(0, replaced)
  556. self.assertEqual(2, deleted)
  557. deleted, replaced = count_tags(UpgradeHelper_HDP2.HDFS_SITE)
  558. self.assertEqual(0, replaced)
  559. self.assertEqual(8, deleted)
  560. pass
  561. def validate_update_config_call(self, call, type):
  562. args, kargs = call
  563. self.assertTrue(args[6] == 'PUT')
  564. self.assertTrue(type in args[8])
  565. pass
  566. def validate_config_replacememt(self, call, type):
  567. args, kargs = call
  568. self.assertFalse("REPLACE_WITH_" in args[8])
  569. self.assertFalse("REPLACE_JH_HOST" in args[8])
  570. self.assertFalse("REPLACE_RM_HOST" in args[8])
  571. if type == "yarn-site":
  572. self.assertTrue("c6401" in args[8])
  573. self.assertFalse("an_old_value" in args[8])
  574. elif type == "mapred-site":
  575. self.assertFalse("will_not_be_stored" in args[8])
  576. self.assertTrue("fs.df.interval" in args[8])
  577. self.assertFalse("dfs.df.interval" in args[8])
  578. elif type == "global":
  579. self.assertTrue("global11" in args[8])
  580. self.assertTrue("an_old_value" in args[8])
  581. self.assertTrue("mapred.hosts.exclude" in args[8])
  582. elif (type == "core-site") or (type == "hdfs-site"):
  583. self.assertTrue("global11" in args[8])
  584. self.assertTrue("global2" in args[8])
  585. self.assertTrue("hbase.rpc.engine" in args[8])
  586. elif type == "hbase-site":
  587. self.assertTrue("global11" in args[8])
  588. self.assertTrue("hbase.hstore.blockingStoreFiles" in args[8])
  589. self.assertTrue("dfs.df.interval" in args[8])
  590. self.assertFalse("hbase.rpc.engine" in args[8])
  591. pass
  592. def get_mock_options(self, printonly=False):
  593. options = MagicMock()
  594. options.logfile = "logfile"
  595. options.user = "admin"
  596. options.password = "admin"
  597. options.hostname = "localhost"
  598. options.clustername = "c1"
  599. options.printonly = printonly
  600. return options
  601. if __name__ == "__main__":
  602. unittest.main()