TestInstallPackages.py 47 KB

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