TestScript.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  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 ConfigParser
  18. import os
  19. import pprint
  20. from unittest import TestCase
  21. import threading
  22. import tempfile
  23. import time
  24. from threading import Thread
  25. import StringIO
  26. import sys, logging, pprint
  27. from ambari_agent import AgentException
  28. from resource_management.libraries.script import Script
  29. from resource_management.core.environment import Environment
  30. from mock.mock import MagicMock, patch
  31. class TestScript(TestCase):
  32. def setUp(self):
  33. # disable stdout
  34. out = StringIO.StringIO()
  35. sys.stdout = out
  36. @patch.object(Script, 'set_version')
  37. @patch("resource_management.core.providers.package.PackageProvider")
  38. def test_install_packages(self, package_provider_mock, set_version_mock):
  39. no_packages_config = {
  40. 'hostLevelParams' : {
  41. 'repo_info' : "[{\"baseUrl\":\"http://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.0.6.0\",\"osType\":\"centos6\",\"repoId\":\"HDP-2.0._\",\"repoName\":\"HDP\",\"defaultBaseUrl\":\"http://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.0.6.0\"}]"
  42. }
  43. }
  44. empty_config = {
  45. 'hostLevelParams' : {
  46. 'package_list' : '',
  47. 'repo_info' : "[{\"baseUrl\":\"http://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.0.6.0\",\"osType\":\"centos6\",\"repoId\":\"HDP-2.0._\",\"repoName\":\"HDP\",\"defaultBaseUrl\":\"http://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.0.6.0\"}]"
  48. }
  49. }
  50. dummy_config = {
  51. 'hostLevelParams' : {
  52. 'package_list' : "[{\"type\":\"rpm\",\"name\":\"hbase\"},"
  53. "{\"type\":\"rpm\",\"name\":\"yet-another-package\"}]",
  54. 'repo_info' : "[{\"baseUrl\":\"http://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.0.6.0\",\"osType\":\"centos6\",\"repoId\":\"HDP-2.0._\",\"repoName\":\"HDP\",\"defaultBaseUrl\":\"http://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.0.6.0\"}]",
  55. 'service_repo_info' : "[{\"mirrorsList\":\"abc\",\"osType\":\"centos6\",\"repoId\":\"HDP-2.0._\",\"repoName\":\"HDP\",\"defaultBaseUrl\":\"http://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.0.6.0\"}]"
  56. }
  57. }
  58. # Testing config without any keys
  59. with Environment(".", test_mode=True) as env:
  60. script = Script()
  61. Script.config = no_packages_config
  62. script.install_packages(env)
  63. resource_dump = pprint.pformat(env.resource_list)
  64. self.assertEquals(resource_dump, "[]")
  65. # Testing empty package list
  66. with Environment(".", test_mode=True) as env:
  67. script = Script()
  68. Script.config = empty_config
  69. script.install_packages(env)
  70. resource_dump = pprint.pformat(env.resource_list)
  71. self.assertEquals(resource_dump, "[]")
  72. # Testing installing of a list of packages
  73. with Environment(".", test_mode=True) as env:
  74. script = Script()
  75. Script.config = dummy_config
  76. script.install_packages("env")
  77. resource_dump = pprint.pformat(env.resource_list)
  78. self.assertEqual(resource_dump, '[Package[\'hbase\'], Package[\'yet-another-package\']]')
  79. self.assertTrue(set_version_mock.called)
  80. @patch("__builtin__.open")
  81. def test_structured_out(self, open_mock):
  82. script = Script()
  83. script.stroutfile = ''
  84. self.assertEqual(Script.structuredOut, {})
  85. script.put_structured_out({"1": "1"})
  86. self.assertEqual(Script.structuredOut, {"1": "1"})
  87. self.assertTrue(open_mock.called)
  88. script.put_structured_out({"2": "2"})
  89. self.assertEqual(open_mock.call_count, 2)
  90. self.assertEqual(Script.structuredOut, {"1": "1", "2": "2"})
  91. #Overriding
  92. script.put_structured_out({"1": "3"})
  93. self.assertEqual(open_mock.call_count, 3)
  94. self.assertEqual(Script.structuredOut, {"1": "3", "2": "2"})
  95. @patch.object(Script, 'get_stack_to_component')
  96. def test_set_version(self, get_stack_to_component_mock):
  97. good_config = {
  98. 'hostLevelParams': {
  99. 'stack_name': "HDP",
  100. 'stack_version': "2.2"
  101. },
  102. 'commandParams': {
  103. 'version': "2.2.0.0-2041"
  104. }
  105. }
  106. get_stack_to_component_mock.return_value = {"HDP": "kafka-broker"}
  107. # Testing default workflow
  108. with Environment(".", test_mode=True) as env:
  109. script = Script()
  110. Script.config = good_config
  111. script.set_version()
  112. resource_dump = pprint.pformat(env.resource_list)
  113. self.assertEquals(resource_dump, '[Execute[\'(\'/usr/bin/hdp-select\', \'set\', \'kafka-broker\', \'2.2.0.0-2041\')\']]')
  114. # Component does not provide mapping
  115. get_stack_to_component_mock.return_value = {}
  116. with Environment(".", test_mode=True) as env:
  117. script = Script()
  118. Script.config = good_config
  119. script.set_version()
  120. resource_dump = pprint.pformat(env.resource_list)
  121. self.assertEquals(resource_dump, '[]')
  122. # Component provided mapping, but configuration is not complete (testing fallback)
  123. get_stack_to_component_mock.return_value = {"HDP": "kafka-broker"}
  124. bad_config = {}
  125. with Environment(".", test_mode=True) as env:
  126. script = Script()
  127. Script.config = bad_config
  128. script.set_version()
  129. resource_dump = pprint.pformat(env.resource_list)
  130. self.assertEquals(resource_dump, '[]')
  131. def tearDown(self):
  132. # enable stdout
  133. sys.stdout = sys.__stdout__