TestInstallPackages.py 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853
  1. #!/usr/bin/env python
  2. '''
  3. Licensed to the Apache Software Foundation (ASF) under one
  4. or more contributor license agreements. See the NOTICE file
  5. distributed with this work for additional information
  6. regarding copyright ownership. The ASF licenses this file
  7. to you under the Apache License, Version 2.0 (the
  8. "License"); you may not use this file except in compliance
  9. with the License. You may obtain a copy of the License at
  10. http://www.apache.org/licenses/LICENSE-2.0
  11. Unless required by applicable law or agreed to in writing, software
  12. distributed under the License is distributed on an "AS IS" BASIS,
  13. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. See the License for the specific language governing permissions and
  15. limitations under the License.
  16. '''
  17. import json
  18. import os
  19. import subprocess
  20. import select
  21. import install_packages
  22. from mock.mock import patch
  23. from mock.mock import MagicMock
  24. from stacks.utils.RMFTestCase import *
  25. from mock.mock import patch, MagicMock
  26. from resource_management.core.base import Resource
  27. from resource_management.core.exceptions import Fail
  28. from resource_management.libraries.script import Script
  29. OLD_VERSION_STUB = '2.1.0.0-400'
  30. VERSION_STUB_WITHOUT_BUILD_NUMBER = '2.2.0.1'
  31. VERSION_STUB = '2.2.0.1-885'
  32. from only_for_platform import get_platform, not_for_platform, only_for_platform, os_distro_value, PLATFORM_WINDOWS
  33. if get_platform() != PLATFORM_WINDOWS:
  34. import pty
  35. subproc_mock = MagicMock()
  36. subproc_mock.return_value = MagicMock()
  37. subproc_stdout = MagicMock()
  38. subproc_mock.return_value.stdout = subproc_stdout
  39. @not_for_platform(PLATFORM_WINDOWS)
  40. @patch.object(os, "read", new=MagicMock(return_value=None))
  41. @patch.object(select, "select", new=MagicMock(return_value=([subproc_stdout], None, None)))
  42. @patch("pty.openpty", new = MagicMock(return_value=(1,5)))
  43. @patch.object(os, "close", new=MagicMock())
  44. @patch.object(subprocess, "Popen", new=subproc_mock)
  45. class TestInstallPackages(RMFTestCase):
  46. def setUp(self):
  47. self.maxDiff = None
  48. @staticmethod
  49. def _add_packages(arg):
  50. arg.append(["pkg1", "1.0", "repo"])
  51. arg.append(["pkg2", "2.0", "repo2"])
  52. @patch("resource_management.libraries.functions.list_ambari_managed_repos.list_ambari_managed_repos")
  53. @patch("resource_management.libraries.functions.packages_analyzer.allInstalledPackages")
  54. @patch("resource_management.libraries.script.Script.put_structured_out")
  55. @patch("resource_management.libraries.functions.hdp_select.get_hdp_versions")
  56. @patch("resource_management.libraries.functions.repo_version_history.read_actual_version_from_history_file")
  57. @patch("resource_management.libraries.functions.repo_version_history.write_actual_version_to_history_file")
  58. def test_normal_flow_rhel(self,
  59. write_actual_version_to_history_file_mock,
  60. read_actual_version_from_history_file_mock,
  61. hdp_versions_mock,
  62. put_structured_out_mock, allInstalledPackages_mock, list_ambari_managed_repos_mock):
  63. hdp_versions_mock.side_effect = [
  64. [], # before installation attempt
  65. [VERSION_STUB]
  66. ]
  67. allInstalledPackages_mock.side_effect = TestInstallPackages._add_packages
  68. list_ambari_managed_repos_mock.return_value=[]
  69. self.executeScript("scripts/install_packages.py",
  70. classname="InstallPackages",
  71. command="actionexecute",
  72. config_file="install_packages_config.json",
  73. target=RMFTestCase.TARGET_CUSTOM_ACTIONS,
  74. os_type=('Redhat', '6.4', 'Final'),
  75. )
  76. self.assertTrue(put_structured_out_mock.called)
  77. self.assertEquals(put_structured_out_mock.call_args[0][0],
  78. {'package_installation_result': 'SUCCESS',
  79. 'installed_repository_version': VERSION_STUB,
  80. 'stack_id': 'HDP-2.2',
  81. 'actual_version': VERSION_STUB,
  82. 'ambari_repositories': []})
  83. self.assertResourceCalled('Repository', 'HDP-UTILS-2.2.0.1-885',
  84. base_url=u'http://repo1/HDP/centos5/2.x/updates/2.2.0.0',
  85. action=['create'],
  86. components=[u'HDP-UTILS', 'main'],
  87. repo_template='[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0',
  88. repo_file_name=u'HDP-2.2.0.1-885',
  89. mirror_list=None,
  90. append_to_file=False,
  91. )
  92. self.assertResourceCalled('Repository', 'HDP-2.2.0.1-885',
  93. base_url=u'http://repo1/HDP/centos5/2.x/updates/2.2.0.0',
  94. action=['create'],
  95. components=[u'HDP', 'main'],
  96. repo_template='[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0',
  97. repo_file_name=u'HDP-2.2.0.1-885',
  98. mirror_list=None,
  99. append_to_file=True,
  100. )
  101. self.assertResourceCalled('Package', 'hdp-select', action=["upgrade"])
  102. self.assertResourceCalled('Package', 'hadoop_2_2_0_1_885')
  103. self.assertResourceCalled('Package', 'snappy')
  104. self.assertResourceCalled('Package', 'snappy-devel')
  105. self.assertResourceCalled('Package', 'lzo')
  106. self.assertResourceCalled('Package', 'hadooplzo_2_2_0_1_885')
  107. self.assertResourceCalled('Package', 'hadoop_2_2_0_1_885-libhdfs')
  108. self.assertResourceCalled('Package', 'ambari-log4j')
  109. self.assertNoMoreResources()
  110. @patch("ambari_commons.os_check.OSCheck.is_suse_family")
  111. @patch("resource_management.libraries.functions.list_ambari_managed_repos.list_ambari_managed_repos")
  112. @patch("resource_management.libraries.functions.packages_analyzer.allInstalledPackages")
  113. @patch("resource_management.libraries.script.Script.put_structured_out")
  114. @patch("resource_management.libraries.functions.hdp_select.get_hdp_versions")
  115. @patch("resource_management.libraries.functions.repo_version_history.read_actual_version_from_history_file")
  116. @patch("resource_management.libraries.functions.repo_version_history.write_actual_version_to_history_file")
  117. def test_normal_flow_sles(self, write_actual_version_to_history_file_mock,
  118. read_actual_version_from_history_file_mock,
  119. hdp_versions_mock, put_structured_out_mock, allInstalledPackages_mock, list_ambari_managed_repos_mock, is_suse_family_mock):
  120. is_suse_family_mock = True
  121. Script.stack_version_from_distro_select = VERSION_STUB
  122. hdp_versions_mock.side_effect = [
  123. [], # before installation attempt
  124. [VERSION_STUB]
  125. ]
  126. allInstalledPackages_mock.side_effect = TestInstallPackages._add_packages
  127. list_ambari_managed_repos_mock.return_value=[]
  128. self.executeScript("scripts/install_packages.py",
  129. classname="InstallPackages",
  130. command="actionexecute",
  131. config_file="install_packages_config.json",
  132. target=RMFTestCase.TARGET_CUSTOM_ACTIONS,
  133. os_type=('Suse', '11', 'SP1'),
  134. )
  135. self.assertTrue(put_structured_out_mock.called)
  136. self.assertEquals(put_structured_out_mock.call_args[0][0],
  137. {'package_installation_result': 'SUCCESS',
  138. 'installed_repository_version': VERSION_STUB,
  139. 'stack_id': 'HDP-2.2',
  140. 'actual_version': VERSION_STUB,
  141. 'ambari_repositories': []})
  142. self.assertResourceCalled('Repository', 'HDP-UTILS-2.2.0.1-885',
  143. base_url=u'http://repo1/HDP/centos5/2.x/updates/2.2.0.0',
  144. action=['create'],
  145. components=[u'HDP-UTILS', 'main'],
  146. repo_template='[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0',
  147. repo_file_name=u'HDP-2.2.0.1-885',
  148. mirror_list=None,
  149. append_to_file=False,
  150. )
  151. self.assertResourceCalled('Repository', 'HDP-2.2.0.1-885',
  152. base_url=u'http://repo1/HDP/centos5/2.x/updates/2.2.0.0',
  153. action=['create'],
  154. components=[u'HDP', 'main'],
  155. repo_template=u'[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0',
  156. repo_file_name=u'HDP-2.2.0.1-885',
  157. mirror_list=None,
  158. append_to_file=True,
  159. )
  160. self.assertResourceCalled('Package', 'hdp-select', action=["upgrade"])
  161. self.assertResourceCalled('Package', 'hadoop_2_2_0_1_885')
  162. self.assertResourceCalled('Package', 'snappy')
  163. self.assertResourceCalled('Package', 'snappy-devel')
  164. self.assertResourceCalled('Package', 'lzo')
  165. self.assertResourceCalled('Package', 'hadooplzo_2_2_0_1_885')
  166. self.assertResourceCalled('Package', 'hadoop_2_2_0_1_885-libhdfs')
  167. self.assertResourceCalled('Package', 'ambari-log4j')
  168. self.assertNoMoreResources()
  169. @patch("resource_management.libraries.functions.list_ambari_managed_repos.list_ambari_managed_repos")
  170. @patch("ambari_commons.os_check.OSCheck.is_redhat_family")
  171. @patch("resource_management.libraries.script.Script.put_structured_out")
  172. @patch("resource_management.libraries.functions.packages_analyzer.allInstalledPackages")
  173. @patch("resource_management.libraries.functions.hdp_select.get_hdp_versions")
  174. @patch("resource_management.libraries.functions.repo_version_history.read_actual_version_from_history_file")
  175. @patch("resource_management.libraries.functions.repo_version_history.write_actual_version_to_history_file")
  176. def test_exclude_existing_repo(self, write_actual_version_to_history_file_mock,
  177. read_actual_version_from_history_file_mock,
  178. hdp_versions_mock,
  179. allInstalledPackages_mock, put_structured_out_mock,
  180. is_redhat_family_mock, list_ambari_managed_repos_mock):
  181. hdp_versions_mock.side_effect = [
  182. [], # before installation attempt
  183. [VERSION_STUB]
  184. ]
  185. Script.stack_version_from_distro_select = VERSION_STUB
  186. allInstalledPackages_mock.side_effect = TestInstallPackages._add_packages
  187. list_ambari_managed_repos_mock.return_value=["HDP-UTILS-2.2.0.1-885"]
  188. is_redhat_family_mock.return_value = True
  189. self.executeScript("scripts/install_packages.py",
  190. classname="InstallPackages",
  191. command="actionexecute",
  192. config_file="install_packages_config.json",
  193. target=RMFTestCase.TARGET_CUSTOM_ACTIONS,
  194. os_type=('Redhat', '6.4', 'Final'),
  195. )
  196. self.assertTrue(put_structured_out_mock.called)
  197. self.assertEquals(put_structured_out_mock.call_args[0][0],
  198. {'package_installation_result': 'SUCCESS',
  199. 'installed_repository_version': VERSION_STUB,
  200. 'stack_id': 'HDP-2.2',
  201. 'actual_version': VERSION_STUB,
  202. 'ambari_repositories': ["HDP-UTILS-2.2.0.1-885"]})
  203. self.assertResourceCalled('Repository', 'HDP-UTILS-2.2.0.1-885',
  204. base_url=u'http://repo1/HDP/centos5/2.x/updates/2.2.0.0',
  205. action=['create'],
  206. components=[u'HDP-UTILS', 'main'],
  207. repo_template=u'[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0',
  208. repo_file_name='HDP-2.2.0.1-885',
  209. mirror_list=None,
  210. append_to_file=False,
  211. )
  212. self.assertResourceCalled('Repository', 'HDP-2.2.0.1-885',
  213. base_url='http://repo1/HDP/centos5/2.x/updates/2.2.0.0',
  214. action=['create'],
  215. components=[u'HDP', 'main'],
  216. repo_template=u'[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0',
  217. repo_file_name=u'HDP-2.2.0.1-885',
  218. mirror_list=None,
  219. append_to_file=True,
  220. )
  221. self.assertResourceCalled('Package', 'hdp-select', action=["upgrade"])
  222. self.assertResourceCalled('Package', 'hadoop_2_2_0_1_885')
  223. self.assertResourceCalled('Package', 'snappy')
  224. self.assertResourceCalled('Package', 'snappy-devel')
  225. self.assertResourceCalled('Package', 'lzo')
  226. self.assertResourceCalled('Package', 'hadooplzo_2_2_0_1_885')
  227. self.assertResourceCalled('Package', 'hadoop_2_2_0_1_885-libhdfs')
  228. self.assertResourceCalled('Package', 'ambari-log4j')
  229. self.assertNoMoreResources()
  230. _install_failed = False
  231. @staticmethod
  232. def _add_packages_with_fail(arg):
  233. arg.append(["pkg1_2_2_0_1_885_pack", "1.0", "repo"])
  234. arg.append(["pkg2_2_2_0_1_885_pack2", "2.0", "repo2"])
  235. if TestInstallPackages._install_failed:
  236. arg.append(["should_not_be_removed_pkg1", "1.0", "repo"])
  237. arg.append(["hadoop_2_2_0_1_885fake_pkg", "1.0", "repo"])
  238. arg.append(["snappy__2_2_0_1_885_fake_pkg", "3.0", "repo2"])
  239. arg.append(["ubuntu-like-2-2-0-1-885-fake-pkg", "3.0", "repo2"])
  240. arg.append(["should_not_be_removed_pkg2", "3.0", "repo2"])
  241. @staticmethod
  242. def _new_with_exception(cls, name, env=None, provider=None, **kwargs):
  243. if (name != "snappy-devel"):
  244. return Resource.__new__(cls, name, env, provider, **kwargs)
  245. else:
  246. TestInstallPackages._install_failed = True
  247. raise Exception()
  248. @patch("resource_management.libraries.functions.list_ambari_managed_repos.list_ambari_managed_repos")
  249. @patch("ambari_commons.os_check.OSCheck.is_redhat_family")
  250. @patch("resource_management.libraries.functions.packages_analyzer.allInstalledPackages")
  251. @patch("resource_management.core.resources.packaging.Package.__new__")
  252. @patch("resource_management.libraries.script.Script.put_structured_out")
  253. def test_fail(self, put_structured_out_mock, Package__mock, allInstalledPackages_mock,
  254. is_redhat_family_mock, list_ambari_managed_repos_mock):
  255. allInstalledPackages_mock.side_effect = TestInstallPackages._add_packages_with_fail
  256. is_redhat_family_mock.return_value = True
  257. list_ambari_managed_repos_mock.return_value = []
  258. def side_effect(retcode):
  259. TestInstallPackages._install_failed = True
  260. raise Exception()
  261. Package__mock.side_effect = side_effect
  262. self.assertRaises(Fail, self.executeScript, "scripts/install_packages.py",
  263. classname="InstallPackages",
  264. command="actionexecute",
  265. config_file="install_packages_config.json",
  266. target=RMFTestCase.TARGET_CUSTOM_ACTIONS,
  267. os_type=('Redhat', '6.4', 'Final'))
  268. self.assertTrue(put_structured_out_mock.called)
  269. self.assertEquals(put_structured_out_mock.call_args[0][0],
  270. {'stack_id': 'HDP-2.2',
  271. 'installed_repository_version': VERSION_STUB,
  272. 'ambari_repositories': [],
  273. 'package_installation_result': 'FAIL'})
  274. self.assertResourceCalled('Repository', 'HDP-UTILS-2.2.0.1-885',
  275. base_url=u'http://repo1/HDP/centos5/2.x/updates/2.2.0.0',
  276. action=['create'],
  277. components=[u'HDP-UTILS', 'main'],
  278. repo_template=u'[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0',
  279. repo_file_name=u'HDP-2.2.0.1-885',
  280. mirror_list=None,
  281. append_to_file=False,
  282. )
  283. self.assertResourceCalled('Repository', 'HDP-2.2.0.1-885',
  284. base_url=u'http://repo1/HDP/centos5/2.x/updates/2.2.0.0',
  285. action=['create'],
  286. components=[u'HDP', 'main'],
  287. repo_template=u'[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0',
  288. repo_file_name=u'HDP-2.2.0.1-885',
  289. mirror_list=None,
  290. append_to_file=True,
  291. )
  292. self.assertNoMoreResources()
  293. TestInstallPackages._install_failed = False
  294. @patch("ambari_commons.os_check.OSCheck.is_suse_family")
  295. @patch("resource_management.core.resources.packaging.Package")
  296. @patch("resource_management.libraries.script.Script.put_structured_out")
  297. @patch("resource_management.libraries.functions.packages_analyzer.allInstalledPackages")
  298. @patch("resource_management.libraries.functions.hdp_select.get_hdp_versions")
  299. @patch("resource_management.libraries.functions.repo_version_history.read_actual_version_from_history_file")
  300. @patch("resource_management.libraries.functions.repo_version_history.write_actual_version_to_history_file")
  301. def test_format_package_name(self, write_actual_version_to_history_file_mock,
  302. read_actual_version_from_history_file_mock,
  303. hdp_versions_mock,
  304. allInstalledPackages_mock, put_structured_out_mock,
  305. package_mock, is_suse_family_mock):
  306. Script.stack_version_from_distro_select = VERSION_STUB
  307. hdp_versions_mock.side_effect = [
  308. [], # before installation attempt
  309. [VERSION_STUB]
  310. ]
  311. read_actual_version_from_history_file_mock.return_value = VERSION_STUB
  312. allInstalledPackages_mock = MagicMock(side_effect = TestInstallPackages._add_packages)
  313. is_suse_family_mock.return_value = True
  314. self.executeScript("scripts/install_packages.py",
  315. classname="InstallPackages",
  316. command="actionexecute",
  317. config_file="install_packages_config.json",
  318. target=RMFTestCase.TARGET_CUSTOM_ACTIONS,
  319. os_type=('Suse', '11', 'Final'),
  320. )
  321. self.assertTrue(put_structured_out_mock.called)
  322. self.assertEquals(put_structured_out_mock.call_args[0][0],
  323. {'package_installation_result': 'SUCCESS',
  324. 'installed_repository_version': VERSION_STUB,
  325. 'stack_id': 'HDP-2.2',
  326. 'actual_version': VERSION_STUB,
  327. 'ambari_repositories': []})
  328. self.assertResourceCalled('Repository', 'HDP-UTILS-2.2.0.1-885',
  329. base_url=u'http://repo1/HDP/centos5/2.x/updates/2.2.0.0',
  330. action=['create'],
  331. components=[u'HDP-UTILS', 'main'],
  332. repo_template=u'[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0',
  333. repo_file_name=u'HDP-2.2.0.1-885',
  334. mirror_list=None,
  335. append_to_file=False,
  336. )
  337. self.assertResourceCalled('Repository', 'HDP-2.2.0.1-885',
  338. base_url=u'http://repo1/HDP/centos5/2.x/updates/2.2.0.0',
  339. action=['create'],
  340. components=[u'HDP', 'main'],
  341. repo_template=u'[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0',
  342. repo_file_name=u'HDP-2.2.0.1-885',
  343. mirror_list=None,
  344. append_to_file=True,
  345. )
  346. self.assertResourceCalled('Package', 'hdp-select', action=["upgrade"])
  347. self.assertResourceCalled('Package', 'hadoop_2_2_0_1_885')
  348. self.assertResourceCalled('Package', 'snappy')
  349. self.assertResourceCalled('Package', 'snappy-devel')
  350. self.assertResourceCalled('Package', 'lzo')
  351. self.assertResourceCalled('Package', 'hadooplzo_2_2_0_1_885')
  352. self.assertResourceCalled('Package', 'hadoop_2_2_0_1_885-libhdfs')
  353. self.assertResourceCalled('Package', 'ambari-log4j')
  354. self.assertNoMoreResources()
  355. @patch("resource_management.libraries.functions.list_ambari_managed_repos.list_ambari_managed_repos")
  356. @patch("resource_management.libraries.functions.packages_analyzer.allInstalledPackages")
  357. @patch("resource_management.libraries.script.Script.put_structured_out")
  358. @patch("resource_management.libraries.functions.hdp_select.get_hdp_versions")
  359. @patch("resource_management.libraries.functions.repo_version_history.read_actual_version_from_history_file")
  360. @patch("resource_management.libraries.functions.repo_version_history.write_actual_version_to_history_file")
  361. def test_version_reporting__build_number_defined(self,
  362. write_actual_version_to_history_file_mock,
  363. read_actual_version_from_history_file_mock,
  364. hdp_versions_mock,
  365. put_structured_out_mock, allInstalledPackages_mock, list_ambari_managed_repos_mock):
  366. hdp_versions_mock.side_effect = [
  367. [OLD_VERSION_STUB], # before installation attempt
  368. [OLD_VERSION_STUB, VERSION_STUB]
  369. ]
  370. config_file = self.get_src_folder() + "/test/python/custom_actions/configs/install_packages_config.json"
  371. with open(config_file, "r") as f:
  372. command_json = json.load(f)
  373. command_json['roleParams']['repository_version'] = VERSION_STUB
  374. allInstalledPackages_mock.side_effect = TestInstallPackages._add_packages
  375. list_ambari_managed_repos_mock.return_value = []
  376. self.executeScript("scripts/install_packages.py",
  377. classname="InstallPackages",
  378. command="actionexecute",
  379. config_dict=command_json,
  380. target=RMFTestCase.TARGET_CUSTOM_ACTIONS,
  381. os_type=('Redhat', '6.4', 'Final'),
  382. )
  383. self.assertTrue(put_structured_out_mock.called)
  384. self.assertEquals(put_structured_out_mock.call_args[0][0],
  385. {'package_installation_result': 'SUCCESS',
  386. 'installed_repository_version': VERSION_STUB,
  387. 'stack_id': 'HDP-2.2',
  388. 'actual_version': VERSION_STUB,
  389. 'ambari_repositories': []})
  390. self.assertTrue(write_actual_version_to_history_file_mock.called)
  391. self.assertEquals(write_actual_version_to_history_file_mock.call_args[0], (VERSION_STUB_WITHOUT_BUILD_NUMBER, VERSION_STUB))
  392. hdp_versions_mock.reset_mock()
  393. write_actual_version_to_history_file_mock.reset_mock()
  394. put_structured_out_mock.reset_mock()
  395. # Test retrying install again
  396. hdp_versions_mock.side_effect = [
  397. [OLD_VERSION_STUB, VERSION_STUB],
  398. [OLD_VERSION_STUB, VERSION_STUB]
  399. ]
  400. read_actual_version_from_history_file_mock.return_value = VERSION_STUB
  401. config_file = self.get_src_folder() + "/test/python/custom_actions/configs/install_packages_config.json"
  402. with open(config_file, "r") as f:
  403. command_json = json.load(f)
  404. command_json['roleParams']['repository_version'] = VERSION_STUB
  405. allInstalledPackages_mock.side_effect = TestInstallPackages._add_packages
  406. list_ambari_managed_repos_mock.return_value = []
  407. self.executeScript("scripts/install_packages.py",
  408. classname="InstallPackages",
  409. command="actionexecute",
  410. config_dict=command_json,
  411. target=RMFTestCase.TARGET_CUSTOM_ACTIONS,
  412. os_type=('Redhat', '6.4', 'Final'),
  413. )
  414. self.assertTrue(put_structured_out_mock.called)
  415. self.assertEquals(put_structured_out_mock.call_args[0][0],
  416. {'package_installation_result': 'SUCCESS',
  417. 'installed_repository_version': VERSION_STUB,
  418. 'stack_id': 'HDP-2.2',
  419. 'actual_version': VERSION_STUB,
  420. 'ambari_repositories': []})
  421. self.assertFalse(write_actual_version_to_history_file_mock.called)
  422. @patch("resource_management.libraries.functions.list_ambari_managed_repos.list_ambari_managed_repos")
  423. @patch("resource_management.libraries.functions.packages_analyzer.allInstalledPackages")
  424. @patch("resource_management.libraries.script.Script.put_structured_out")
  425. @patch("resource_management.libraries.functions.hdp_select.get_hdp_versions")
  426. @patch("resource_management.libraries.functions.repo_version_history.read_actual_version_from_history_file")
  427. @patch("resource_management.libraries.functions.repo_version_history.write_actual_version_to_history_file")
  428. @patch("os.path.exists")
  429. def test_version_reporting__build_number_not_defined__usr_hdp_present__no_components_installed(self,
  430. exists_mock,
  431. write_actual_version_to_history_file_mock,
  432. read_actual_version_from_history_file_mock,
  433. hdp_versions_mock,
  434. put_structured_out_mock, allInstalledPackages_mock, list_ambari_managed_repos_mock):
  435. exists_mock.return_value = True
  436. hdp_versions_mock.side_effect = [
  437. [], # before installation attempt
  438. []
  439. ]
  440. read_actual_version_from_history_file_mock.return_value = None
  441. config_file = self.get_src_folder() + "/test/python/custom_actions/configs/install_packages_config.json"
  442. with open(config_file, "r") as f:
  443. command_json = json.load(f)
  444. command_json['roleParams']['repository_version'] = VERSION_STUB_WITHOUT_BUILD_NUMBER
  445. allInstalledPackages_mock.side_effect = TestInstallPackages._add_packages
  446. list_ambari_managed_repos_mock.return_value = []
  447. try:
  448. self.executeScript("scripts/install_packages.py",
  449. classname="InstallPackages",
  450. command="actionexecute",
  451. config_dict=command_json,
  452. target=RMFTestCase.TARGET_CUSTOM_ACTIONS,
  453. os_type=('Redhat', '6.4', 'Final'),
  454. )
  455. self.fail("Should throw exception")
  456. except Fail:
  457. pass # Expected
  458. self.assertTrue(put_structured_out_mock.called)
  459. self.assertEquals(put_structured_out_mock.call_args_list[-1][0][0],
  460. { 'ambari_repositories': [],
  461. 'package_installation_result': 'FAIL',
  462. 'installed_repository_version': '2.2.0.1',
  463. 'stack_id': u'HDP-2.2'})
  464. self.assertFalse(write_actual_version_to_history_file_mock.called)
  465. hdp_versions_mock.reset_mock()
  466. write_actual_version_to_history_file_mock.reset_mock()
  467. put_structured_out_mock.reset_mock()
  468. @patch("resource_management.libraries.functions.list_ambari_managed_repos.list_ambari_managed_repos")
  469. @patch("resource_management.libraries.functions.packages_analyzer.allInstalledPackages")
  470. @patch("resource_management.libraries.script.Script.put_structured_out")
  471. @patch("resource_management.libraries.functions.hdp_select.get_hdp_versions")
  472. @patch("resource_management.libraries.functions.repo_version_history.read_actual_version_from_history_file")
  473. @patch("resource_management.libraries.functions.repo_version_history.write_actual_version_to_history_file")
  474. @patch("os.path.exists")
  475. def test_version_reporting__build_number_not_defined__usr_hdp_absent(self,
  476. exists_mock,
  477. write_actual_version_to_history_file_mock,
  478. read_actual_version_from_history_file_mock,
  479. hdp_versions_mock,
  480. put_structured_out_mock, allInstalledPackages_mock, list_ambari_managed_repos_mock):
  481. exists_mock.return_value = False
  482. hdp_versions_mock.side_effect = [
  483. [], # before installation attempt
  484. []
  485. ]
  486. read_actual_version_from_history_file_mock.return_value = None
  487. config_file = self.get_src_folder() + "/test/python/custom_actions/configs/install_packages_config.json"
  488. with open(config_file, "r") as f:
  489. command_json = json.load(f)
  490. command_json['roleParams']['repository_version'] = VERSION_STUB_WITHOUT_BUILD_NUMBER
  491. allInstalledPackages_mock.side_effect = TestInstallPackages._add_packages
  492. list_ambari_managed_repos_mock.return_value = []
  493. try:
  494. self.executeScript("scripts/install_packages.py",
  495. classname="InstallPackages",
  496. command="actionexecute",
  497. config_dict=command_json,
  498. target=RMFTestCase.TARGET_CUSTOM_ACTIONS,
  499. os_type=('Redhat', '6.4', 'Final'),
  500. )
  501. self.fail("Should throw exception")
  502. except Fail:
  503. pass # Expected
  504. self.assertTrue(put_structured_out_mock.called)
  505. self.assertEquals(put_structured_out_mock.call_args_list[-1][0][0],
  506. {'package_installation_result': 'FAIL',
  507. 'stack_id': u'HDP-2.2',
  508. 'installed_repository_version': '2.2.0.1',
  509. 'ambari_repositories': []})
  510. self.assertFalse(write_actual_version_to_history_file_mock.called)
  511. hdp_versions_mock.reset_mock()
  512. write_actual_version_to_history_file_mock.reset_mock()
  513. put_structured_out_mock.reset_mock()
  514. # Test retrying install again (correct build number, provided by other nodes, is now received from server)
  515. hdp_versions_mock.side_effect = [
  516. [], # before installation attempt
  517. []
  518. ]
  519. read_actual_version_from_history_file_mock.return_value = None
  520. config_file = self.get_src_folder() + "/test/python/custom_actions/configs/install_packages_config.json"
  521. with open(config_file, "r") as f:
  522. command_json = json.load(f)
  523. command_json['roleParams']['repository_version'] = VERSION_STUB
  524. allInstalledPackages_mock.side_effect = TestInstallPackages._add_packages
  525. list_ambari_managed_repos_mock.return_value = []
  526. try:
  527. self.executeScript("scripts/install_packages.py",
  528. classname="InstallPackages",
  529. command="actionexecute",
  530. config_dict=command_json,
  531. target=RMFTestCase.TARGET_CUSTOM_ACTIONS,
  532. os_type=('Redhat', '6.4', 'Final'),
  533. )
  534. self.fail("Should throw exception")
  535. except Fail:
  536. pass # Expected
  537. self.assertTrue(put_structured_out_mock.called)
  538. self.assertEquals(put_structured_out_mock.call_args[0][0],
  539. {'package_installation_result': 'FAIL',
  540. 'stack_id': u'HDP-2.2',
  541. 'installed_repository_version': VERSION_STUB,
  542. 'actual_version': VERSION_STUB,
  543. 'ambari_repositories': []})
  544. self.assertFalse(write_actual_version_to_history_file_mock.called)
  545. @patch("resource_management.libraries.functions.list_ambari_managed_repos.list_ambari_managed_repos")
  546. @patch("resource_management.libraries.functions.packages_analyzer.allInstalledPackages")
  547. @patch("resource_management.libraries.script.Script.put_structured_out")
  548. @patch("resource_management.libraries.functions.hdp_select.get_hdp_versions")
  549. @patch("resource_management.libraries.functions.repo_version_history.read_actual_version_from_history_file")
  550. @patch("resource_management.libraries.functions.repo_version_history.write_actual_version_to_history_file")
  551. def test_version_reporting__build_number_not_defined__usr_hdp_present(self,
  552. write_actual_version_to_history_file_mock,
  553. read_actual_version_from_history_file_mock,
  554. hdp_versions_mock,
  555. put_structured_out_mock, allInstalledPackages_mock, list_ambari_managed_repos_mock):
  556. hdp_versions_mock.side_effect = [
  557. [OLD_VERSION_STUB], # before installation attempt
  558. [OLD_VERSION_STUB, VERSION_STUB]
  559. ]
  560. config_file = self.get_src_folder() + "/test/python/custom_actions/configs/install_packages_config.json"
  561. with open(config_file, "r") as f:
  562. command_json = json.load(f)
  563. command_json['roleParams']['repository_version'] = VERSION_STUB_WITHOUT_BUILD_NUMBER
  564. allInstalledPackages_mock.side_effect = TestInstallPackages._add_packages
  565. list_ambari_managed_repos_mock.return_value = []
  566. self.executeScript("scripts/install_packages.py",
  567. classname="InstallPackages",
  568. command="actionexecute",
  569. config_dict=command_json,
  570. target=RMFTestCase.TARGET_CUSTOM_ACTIONS,
  571. os_type=('Redhat', '6.4', 'Final'),
  572. )
  573. self.assertTrue(put_structured_out_mock.called)
  574. self.assertEquals(put_structured_out_mock.call_args[0][0],
  575. {'package_installation_result': 'SUCCESS',
  576. 'installed_repository_version': VERSION_STUB_WITHOUT_BUILD_NUMBER,
  577. 'stack_id': 'HDP-2.2',
  578. 'actual_version': VERSION_STUB,
  579. 'ambari_repositories': []})
  580. self.assertTrue(write_actual_version_to_history_file_mock.called)
  581. self.assertEquals(write_actual_version_to_history_file_mock.call_args[0], (VERSION_STUB_WITHOUT_BUILD_NUMBER, VERSION_STUB))
  582. hdp_versions_mock.reset_mock()
  583. write_actual_version_to_history_file_mock.reset_mock()
  584. put_structured_out_mock.reset_mock()
  585. # Test retrying install again
  586. hdp_versions_mock.side_effect = [
  587. [OLD_VERSION_STUB, VERSION_STUB],
  588. [OLD_VERSION_STUB, VERSION_STUB]
  589. ]
  590. read_actual_version_from_history_file_mock.return_value = VERSION_STUB
  591. config_file = self.get_src_folder() + "/test/python/custom_actions/configs/install_packages_config.json"
  592. with open(config_file, "r") as f:
  593. command_json = json.load(f)
  594. command_json['roleParams']['repository_version'] = VERSION_STUB_WITHOUT_BUILD_NUMBER
  595. allInstalledPackages_mock.side_effect = TestInstallPackages._add_packages
  596. list_ambari_managed_repos_mock.return_value = []
  597. self.executeScript("scripts/install_packages.py",
  598. classname="InstallPackages",
  599. command="actionexecute",
  600. config_dict=command_json,
  601. target=RMFTestCase.TARGET_CUSTOM_ACTIONS,
  602. os_type=('Redhat', '6.4', 'Final'),
  603. )
  604. self.assertTrue(put_structured_out_mock.called)
  605. self.assertEquals(put_structured_out_mock.call_args[0][0],
  606. {'package_installation_result': 'SUCCESS',
  607. 'installed_repository_version': VERSION_STUB_WITHOUT_BUILD_NUMBER,
  608. 'stack_id': 'HDP-2.2',
  609. 'actual_version': VERSION_STUB,
  610. 'ambari_repositories': []})
  611. self.assertFalse(write_actual_version_to_history_file_mock.called)
  612. @patch("resource_management.libraries.functions.list_ambari_managed_repos.list_ambari_managed_repos")
  613. @patch("resource_management.libraries.functions.packages_analyzer.allInstalledPackages")
  614. @patch("resource_management.libraries.script.Script.put_structured_out")
  615. @patch("resource_management.libraries.functions.hdp_select.get_hdp_versions")
  616. @patch("resource_management.libraries.functions.repo_version_history.read_actual_version_from_history_file")
  617. @patch("resource_management.libraries.functions.repo_version_history.write_actual_version_to_history_file")
  618. def test_version_reporting__wrong_build_number_specified__usr_hdp_present(self,
  619. write_actual_version_to_history_file_mock,
  620. read_actual_version_from_history_file_mock,
  621. hdp_versions_mock,
  622. put_structured_out_mock, allInstalledPackages_mock, list_ambari_managed_repos_mock):
  623. hdp_versions_mock.side_effect = [
  624. [OLD_VERSION_STUB], # before installation attempt
  625. [OLD_VERSION_STUB, VERSION_STUB]
  626. ]
  627. config_file = self.get_src_folder() + "/test/python/custom_actions/configs/install_packages_config.json"
  628. with open(config_file, "r") as f:
  629. command_json = json.load(f)
  630. command_json['roleParams']['repository_version'] = '2.2.0.1-500' # User specified wrong build number
  631. allInstalledPackages_mock.side_effect = TestInstallPackages._add_packages
  632. list_ambari_managed_repos_mock.return_value = []
  633. self.executeScript("scripts/install_packages.py",
  634. classname="InstallPackages",
  635. command="actionexecute",
  636. config_dict=command_json,
  637. target=RMFTestCase.TARGET_CUSTOM_ACTIONS,
  638. os_type=('Redhat', '6.4', 'Final'),
  639. )
  640. self.assertTrue(put_structured_out_mock.called)
  641. self.assertEquals(put_structured_out_mock.call_args[0][0],
  642. {'package_installation_result': 'SUCCESS',
  643. 'installed_repository_version': '2.2.0.1-500',
  644. 'stack_id': 'HDP-2.2',
  645. 'actual_version': VERSION_STUB,
  646. 'ambari_repositories': []})
  647. self.assertTrue(write_actual_version_to_history_file_mock.called)
  648. self.assertEquals(write_actual_version_to_history_file_mock.call_args[0], ('2.2.0.1', VERSION_STUB))
  649. hdp_versions_mock.reset_mock()
  650. write_actual_version_to_history_file_mock.reset_mock()
  651. put_structured_out_mock.reset_mock()
  652. # Test retrying install again
  653. hdp_versions_mock.side_effect = [
  654. [OLD_VERSION_STUB, VERSION_STUB],
  655. [OLD_VERSION_STUB, VERSION_STUB]
  656. ]
  657. read_actual_version_from_history_file_mock.return_value = VERSION_STUB
  658. config_file = self.get_src_folder() + "/test/python/custom_actions/configs/install_packages_config.json"
  659. with open(config_file, "r") as f:
  660. command_json = json.load(f)
  661. command_json['roleParams']['repository_version'] = '2.2.0.1-500' # User specified wrong build number
  662. allInstalledPackages_mock.side_effect = TestInstallPackages._add_packages
  663. list_ambari_managed_repos_mock.return_value = []
  664. self.executeScript("scripts/install_packages.py",
  665. classname="InstallPackages",
  666. command="actionexecute",
  667. config_dict=command_json,
  668. target=RMFTestCase.TARGET_CUSTOM_ACTIONS,
  669. os_type=('Redhat', '6.4', 'Final'),
  670. )
  671. self.assertTrue(put_structured_out_mock.called)
  672. self.assertEquals(put_structured_out_mock.call_args[0][0],
  673. {'package_installation_result': 'SUCCESS',
  674. 'installed_repository_version': '2.2.0.1-500',
  675. 'stack_id': 'HDP-2.2',
  676. 'actual_version': VERSION_STUB,
  677. 'ambari_repositories': []})
  678. self.assertFalse(write_actual_version_to_history_file_mock.called)
  679. @patch("resource_management.libraries.functions.list_ambari_managed_repos.list_ambari_managed_repos")
  680. @patch("resource_management.libraries.functions.packages_analyzer.allInstalledPackages")
  681. @patch("resource_management.libraries.script.Script.put_structured_out")
  682. @patch("resource_management.libraries.functions.hdp_select.get_hdp_versions")
  683. @patch("resource_management.libraries.functions.repo_version_history.read_actual_version_from_history_file")
  684. @patch("resource_management.libraries.functions.repo_version_history.write_actual_version_to_history_file")
  685. @patch("os.path.exists")
  686. def test_version_reporting__wrong_build_number_specified__usr_hdp_absent(self,
  687. exists_mock,
  688. write_actual_version_to_history_file_mock,
  689. read_actual_version_from_history_file_mock,
  690. hdp_versions_mock,
  691. put_structured_out_mock, allInstalledPackages_mock, list_ambari_managed_repos_mock):
  692. exists_mock.return_value = False
  693. hdp_versions_mock.side_effect = [
  694. [], # before installation attempt
  695. []
  696. ]
  697. read_actual_version_from_history_file_mock.return_value = None
  698. config_file = self.get_src_folder() + "/test/python/custom_actions/configs/install_packages_config.json"
  699. with open(config_file, "r") as f:
  700. command_json = json.load(f)
  701. command_json['roleParams']['repository_version'] = VERSION_STUB_WITHOUT_BUILD_NUMBER
  702. allInstalledPackages_mock.side_effect = TestInstallPackages._add_packages
  703. list_ambari_managed_repos_mock.return_value = []
  704. try:
  705. self.executeScript("scripts/install_packages.py",
  706. classname="InstallPackages",
  707. command="actionexecute",
  708. config_dict=command_json,
  709. target=RMFTestCase.TARGET_CUSTOM_ACTIONS,
  710. os_type=('Redhat', '6.4', 'Final'),
  711. )
  712. self.fail("Should throw exception")
  713. except Fail:
  714. pass # Expected
  715. self.assertTrue(put_structured_out_mock.called)
  716. self.assertEquals(put_structured_out_mock.call_args_list[-1][0][0],
  717. {'package_installation_result': 'FAIL',
  718. 'stack_id': u'HDP-2.2',
  719. 'installed_repository_version': '2.2.0.1',
  720. 'ambari_repositories': []})
  721. self.assertFalse(write_actual_version_to_history_file_mock.called)
  722. hdp_versions_mock.reset_mock()
  723. write_actual_version_to_history_file_mock.reset_mock()
  724. put_structured_out_mock.reset_mock()
  725. # Test retrying install again (correct build number, provided by other nodes, is now received from server)
  726. hdp_versions_mock.side_effect = [
  727. [], # before installation attempt
  728. []
  729. ]
  730. read_actual_version_from_history_file_mock.return_value = None
  731. config_file = self.get_src_folder() + "/test/python/custom_actions/configs/install_packages_config.json"
  732. with open(config_file, "r") as f:
  733. command_json = json.load(f)
  734. command_json['roleParams']['repository_version'] = VERSION_STUB
  735. allInstalledPackages_mock.side_effect = TestInstallPackages._add_packages
  736. list_ambari_managed_repos_mock.return_value = []
  737. try:
  738. self.executeScript("scripts/install_packages.py",
  739. classname="InstallPackages",
  740. command="actionexecute",
  741. config_dict=command_json,
  742. target=RMFTestCase.TARGET_CUSTOM_ACTIONS,
  743. os_type=('Redhat', '6.4', 'Final'),
  744. )
  745. self.fail("Should throw exception")
  746. except Fail:
  747. pass # Expected
  748. self.assertTrue(put_structured_out_mock.called)
  749. self.assertEquals(put_structured_out_mock.call_args[0][0],
  750. {'package_installation_result': 'FAIL',
  751. 'stack_id': u'HDP-2.2',
  752. 'installed_repository_version': VERSION_STUB,
  753. 'actual_version': VERSION_STUB,
  754. 'ambari_repositories': []})
  755. self.assertFalse(write_actual_version_to_history_file_mock.called)