test_hbase_master.py 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836
  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. from mock.mock import MagicMock, patch
  19. from stacks.utils.RMFTestCase import *
  20. @patch("platform.linux_distribution", new = MagicMock(return_value="Linux"))
  21. @patch("os.path.exists", new = MagicMock(return_value=True))
  22. class TestHBaseMaster(RMFTestCase):
  23. COMMON_SERVICES_PACKAGE_DIR = "HBASE/0.96.0.2.0/package"
  24. STACK_VERSION = "2.0.6"
  25. TMP_PATH = "/hadoop"
  26. def test_install_hbase_master_default_no_phx(self):
  27. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/hbase_master.py",
  28. classname = "HbaseMaster",
  29. command = "install",
  30. config_file="hbase_no_phx.json",
  31. hdp_stack_version = self.STACK_VERSION,
  32. target = RMFTestCase.TARGET_COMMON_SERVICES,
  33. try_install=True
  34. )
  35. self.assertResourceCalled('Package', 'hbase_2_3_*',)
  36. self.assertNoMoreResources()
  37. def test_install_hbase_master_default_with_phx(self):
  38. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/hbase_master.py",
  39. classname = "HbaseMaster",
  40. command = "install",
  41. config_file="hbase_with_phx.json",
  42. hdp_stack_version = self.STACK_VERSION,
  43. target = RMFTestCase.TARGET_COMMON_SERVICES,
  44. try_install=True
  45. )
  46. self.assertResourceCalled('Package', 'hbase_2_3_*',)
  47. self.assertResourceCalled('Package', 'phoenix_2_3_*',)
  48. self.assertNoMoreResources()
  49. def test_configure_default(self):
  50. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/hbase_master.py",
  51. classname = "HbaseMaster",
  52. command = "configure",
  53. config_file="default.json",
  54. hdp_stack_version = self.STACK_VERSION,
  55. target = RMFTestCase.TARGET_COMMON_SERVICES
  56. )
  57. self.assert_configure_default()
  58. self.assertNoMoreResources()
  59. def test_start_default(self):
  60. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/hbase_master.py",
  61. classname = "HbaseMaster",
  62. command = "start",
  63. config_file="default.json",
  64. hdp_stack_version = self.STACK_VERSION,
  65. target = RMFTestCase.TARGET_COMMON_SERVICES
  66. )
  67. self.assert_configure_default()
  68. self.assertResourceCalled('Execute', '/usr/lib/hbase/bin/hbase-daemon.sh --config /etc/hbase/conf start master',
  69. not_if = 'ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E test -f /var/run/hbase/hbase-hbase-master.pid && ps -p `ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E cat /var/run/hbase/hbase-hbase-master.pid` >/dev/null 2>&1',
  70. user = 'hbase'
  71. )
  72. self.assertNoMoreResources()
  73. def test_stop_default(self):
  74. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/hbase_master.py",
  75. classname = "HbaseMaster",
  76. command = "stop",
  77. config_file="default.json",
  78. hdp_stack_version = self.STACK_VERSION,
  79. target = RMFTestCase.TARGET_COMMON_SERVICES
  80. )
  81. self.assertResourceCalled('Execute', '/usr/lib/hbase/bin/hbase-daemon.sh --config /etc/hbase/conf stop master',
  82. only_if = 'ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E test -f /var/run/hbase/hbase-hbase-master.pid && ps -p `ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E cat /var/run/hbase/hbase-hbase-master.pid` >/dev/null 2>&1',
  83. on_timeout = '! ( ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E test -f /var/run/hbase/hbase-hbase-master.pid && ps -p `ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E cat /var/run/hbase/hbase-hbase-master.pid` >/dev/null 2>&1 ) || ambari-sudo.sh -H -E kill -9 `ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E cat /var/run/hbase/hbase-hbase-master.pid`',
  84. timeout = 30,
  85. user = 'hbase',
  86. )
  87. self.assertResourceCalled('File', '/var/run/hbase/hbase-hbase-master.pid',
  88. action = ['delete'],
  89. )
  90. self.assertNoMoreResources()
  91. def test_decom_default(self):
  92. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/hbase_master.py",
  93. classname = "HbaseMaster",
  94. command = "decommission",
  95. config_file="default.json",
  96. hdp_stack_version = self.STACK_VERSION,
  97. target = RMFTestCase.TARGET_COMMON_SERVICES
  98. )
  99. self.assertResourceCalled('File', '/usr/lib/hbase/bin/draining_servers.rb',
  100. content = StaticFile('draining_servers.rb'),
  101. mode = 0755,
  102. )
  103. self.assertResourceCalled('Execute', ' /usr/lib/hbase/bin/hbase --config /etc/hbase/conf org.jruby.Main /usr/lib/hbase/bin/draining_servers.rb add host1',
  104. logoutput = True,
  105. user = 'hbase',
  106. )
  107. self.assertResourceCalled('Execute', ' /usr/lib/hbase/bin/hbase --config /etc/hbase/conf org.jruby.Main /usr/lib/hbase/bin/region_mover.rb unload host1',
  108. logoutput = True,
  109. user = 'hbase',
  110. )
  111. self.assertResourceCalled('Execute', ' /usr/lib/hbase/bin/hbase --config /etc/hbase/conf org.jruby.Main /usr/lib/hbase/bin/draining_servers.rb add host2',
  112. logoutput = True,
  113. user = 'hbase',
  114. )
  115. self.assertResourceCalled('Execute', ' /usr/lib/hbase/bin/hbase --config /etc/hbase/conf org.jruby.Main /usr/lib/hbase/bin/region_mover.rb unload host2',
  116. logoutput = True,
  117. user = 'hbase',
  118. )
  119. self.assertNoMoreResources()
  120. def test_decom_default_draining_only(self):
  121. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/hbase_master.py",
  122. classname = "HbaseMaster",
  123. command = "decommission",
  124. config_file="default.hbasedecom.json",
  125. hdp_stack_version = self.STACK_VERSION,
  126. target = RMFTestCase.TARGET_COMMON_SERVICES
  127. )
  128. self.assertResourceCalled('File', '/usr/lib/hbase/bin/draining_servers.rb',
  129. content = StaticFile('draining_servers.rb'),
  130. mode = 0755,
  131. )
  132. self.assertResourceCalled('Execute', ' /usr/lib/hbase/bin/hbase --config /etc/hbase/conf org.jruby.Main /usr/lib/hbase/bin/draining_servers.rb remove host1',
  133. logoutput = True,
  134. user = 'hbase',
  135. )
  136. self.assertNoMoreResources()
  137. def test_configure_secured(self):
  138. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/hbase_master.py",
  139. classname = "HbaseMaster",
  140. command = "configure",
  141. config_file="secured.json",
  142. hdp_stack_version = self.STACK_VERSION,
  143. target = RMFTestCase.TARGET_COMMON_SERVICES
  144. )
  145. self.assert_configure_secured()
  146. self.assertNoMoreResources()
  147. def test_start_secured(self):
  148. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/hbase_master.py",
  149. classname = "HbaseMaster",
  150. command = "start",
  151. config_file="secured.json",
  152. hdp_stack_version = self.STACK_VERSION,
  153. target = RMFTestCase.TARGET_COMMON_SERVICES
  154. )
  155. self.assert_configure_secured()
  156. self.assertResourceCalled('Execute', '/usr/lib/hbase/bin/hbase-daemon.sh --config /etc/hbase/conf start master',
  157. not_if = 'ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E test -f /var/run/hbase/hbase-hbase-master.pid && ps -p `ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E cat /var/run/hbase/hbase-hbase-master.pid` >/dev/null 2>&1',
  158. user = 'hbase',
  159. )
  160. self.assertNoMoreResources()
  161. def test_stop_secured(self):
  162. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/hbase_master.py",
  163. classname = "HbaseMaster",
  164. command = "stop",
  165. config_file="secured.json",
  166. hdp_stack_version = self.STACK_VERSION,
  167. target = RMFTestCase.TARGET_COMMON_SERVICES
  168. )
  169. self.assertResourceCalled('Execute', '/usr/lib/hbase/bin/hbase-daemon.sh --config /etc/hbase/conf stop master',
  170. only_if = 'ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E test -f /var/run/hbase/hbase-hbase-master.pid && ps -p `ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E cat /var/run/hbase/hbase-hbase-master.pid` >/dev/null 2>&1',
  171. on_timeout = '! ( ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E test -f /var/run/hbase/hbase-hbase-master.pid && ps -p `ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E cat /var/run/hbase/hbase-hbase-master.pid` >/dev/null 2>&1 ) || ambari-sudo.sh -H -E kill -9 `ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E cat /var/run/hbase/hbase-hbase-master.pid`',
  172. timeout = 30,
  173. user = 'hbase',
  174. )
  175. self.assertResourceCalled('File', '/var/run/hbase/hbase-hbase-master.pid',
  176. action = ['delete'],
  177. )
  178. self.assertNoMoreResources()
  179. def test_decom_secure(self):
  180. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/hbase_master.py",
  181. classname = "HbaseMaster",
  182. command = "decommission",
  183. config_file="secured.json",
  184. hdp_stack_version = self.STACK_VERSION,
  185. target = RMFTestCase.TARGET_COMMON_SERVICES
  186. )
  187. self.assertResourceCalled('File', '/usr/lib/hbase/bin/draining_servers.rb',
  188. content = StaticFile('draining_servers.rb'),
  189. mode = 0755,
  190. )
  191. self.assertResourceCalled('Execute', '/usr/bin/kinit -kt /etc/security/keytabs/hbase.headless.keytab hbase; /usr/lib/hbase/bin/hbase --config /etc/hbase/conf org.jruby.Main /usr/lib/hbase/bin/draining_servers.rb add host1',
  192. logoutput = True,
  193. user = 'hbase',
  194. )
  195. self.assertResourceCalled('Execute', '/usr/bin/kinit -kt /etc/security/keytabs/hbase.headless.keytab hbase; /usr/lib/hbase/bin/hbase --config /etc/hbase/conf org.jruby.Main /usr/lib/hbase/bin/region_mover.rb unload host1',
  196. logoutput = True,
  197. user = 'hbase',
  198. )
  199. self.assertNoMoreResources()
  200. def assert_configure_default(self):
  201. self.assertResourceCalled('Directory', '/etc/hbase',
  202. mode = 0755
  203. )
  204. self.assertResourceCalled('Directory', '/etc/hbase/conf',
  205. owner = 'hbase',
  206. group = 'hadoop',
  207. recursive = True,
  208. )
  209. self.assertResourceCalled('Directory', '/tmp',
  210. owner = 'hbase',
  211. group = 'hadoop',
  212. recursive = True,
  213. mode = 0777
  214. )
  215. self.assertResourceCalled('Directory', '/hadoop',
  216. recursive = True,
  217. cd_access = 'a',
  218. )
  219. self.assertResourceCalled('Execute', ('chmod', '1777', u'/hadoop'),
  220. sudo = True,
  221. )
  222. self.assertResourceCalled('XmlConfig', 'hbase-site.xml',
  223. owner = 'hbase',
  224. group = 'hadoop',
  225. conf_dir = '/etc/hbase/conf',
  226. configurations = self.getConfig()['configurations']['hbase-site'],
  227. configuration_attributes = self.getConfig()['configuration_attributes']['hbase-site']
  228. )
  229. self.assertResourceCalled('XmlConfig', 'core-site.xml',
  230. owner = 'hbase',
  231. group = 'hadoop',
  232. conf_dir = '/etc/hbase/conf',
  233. configurations = self.getConfig()['configurations']['core-site'],
  234. configuration_attributes = self.getConfig()['configuration_attributes']['core-site']
  235. )
  236. self.assertResourceCalled('XmlConfig', 'hdfs-site.xml',
  237. owner = 'hbase',
  238. group = 'hadoop',
  239. conf_dir = '/etc/hbase/conf',
  240. configurations = self.getConfig()['configurations']['hdfs-site'],
  241. configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
  242. )
  243. self.assertResourceCalled('XmlConfig', 'hdfs-site.xml',
  244. owner = 'hdfs',
  245. group = 'hadoop',
  246. conf_dir = '/etc/hadoop/conf',
  247. configurations = self.getConfig()['configurations']['hdfs-site'],
  248. configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
  249. )
  250. self.assertResourceCalled('File', '/etc/hbase/conf/hbase-policy.xml',
  251. owner = 'hbase',
  252. group = 'hadoop'
  253. )
  254. self.assertResourceCalled('File', '/etc/hbase/conf/hbase-env.sh',
  255. owner = 'hbase',
  256. content = InlineTemplate(self.getConfig()['configurations']['hbase-env']['content']),
  257. group = 'hadoop',
  258. )
  259. self.assertResourceCalled('Directory', '/etc/security/limits.d',
  260. owner = 'root',
  261. group = 'root',
  262. recursive = True,
  263. )
  264. self.assertResourceCalled('File', '/etc/security/limits.d/hbase.conf',
  265. content = Template('hbase.conf.j2'),
  266. owner = 'root',
  267. group = 'root',
  268. mode = 0644,
  269. )
  270. self.assertResourceCalled('TemplateConfig', '/etc/hbase/conf/hadoop-metrics2-hbase.properties',
  271. owner = 'hbase',
  272. template_tag = 'GANGLIA-MASTER',
  273. )
  274. self.assertResourceCalled('TemplateConfig', '/etc/hbase/conf/regionservers',
  275. owner = 'hbase',
  276. template_tag = None,
  277. )
  278. self.assertResourceCalled('Directory', '/var/run/hbase',
  279. owner = 'hbase',
  280. recursive = True,
  281. mode = 0755,
  282. cd_access = 'a',
  283. )
  284. self.assertResourceCalled('Directory', '/var/log/hbase',
  285. owner = 'hbase',
  286. recursive = True,
  287. mode = 0755,
  288. cd_access = 'a',
  289. )
  290. self.assertResourceCalled('File',
  291. '/etc/hbase/conf/log4j.properties',
  292. mode=0644,
  293. group='hadoop',
  294. owner='hbase',
  295. content='log4jproperties\nline2'
  296. )
  297. self.assertResourceCalled('HdfsResource', 'hdfs://c6401.ambari.apache.org:8020/apps/hbase/data',
  298. security_enabled = False,
  299. hadoop_bin_dir = '/usr/bin',
  300. keytab = UnknownConfigurationMock(),
  301. kinit_path_local = '/usr/bin/kinit',
  302. user = 'hdfs',
  303. dfs_type = '',
  304. owner = 'hbase',
  305. hadoop_conf_dir = '/etc/hadoop/conf',
  306. type = 'directory',
  307. action = ['create_on_execute'], hdfs_site=self.getConfig()['configurations']['hdfs-site'], principal_name=UnknownConfigurationMock(), default_fs='hdfs://c6401.ambari.apache.org:8020',
  308. )
  309. self.assertResourceCalled('HdfsResource', '/apps/hbase/staging',
  310. security_enabled = False,
  311. hadoop_conf_dir = '/etc/hadoop/conf',
  312. keytab = UnknownConfigurationMock(),
  313. kinit_path_local = '/usr/bin/kinit',
  314. user = 'hdfs',
  315. dfs_type = '',
  316. owner = 'hbase',
  317. hadoop_bin_dir = '/usr/bin',
  318. type = 'directory',
  319. action = ['create_on_execute'], hdfs_site=self.getConfig()['configurations']['hdfs-site'], principal_name=UnknownConfigurationMock(), default_fs='hdfs://c6401.ambari.apache.org:8020',
  320. mode = 0711,
  321. )
  322. self.assertResourceCalled('HdfsResource', None,
  323. security_enabled = False,
  324. hadoop_bin_dir = '/usr/bin',
  325. keytab = UnknownConfigurationMock(),
  326. kinit_path_local = '/usr/bin/kinit',
  327. user = 'hdfs',
  328. dfs_type = '',
  329. action = ['execute'], hdfs_site=self.getConfig()['configurations']['hdfs-site'], principal_name=UnknownConfigurationMock(), default_fs='hdfs://c6401.ambari.apache.org:8020',
  330. hadoop_conf_dir = '/etc/hadoop/conf',
  331. )
  332. def assert_configure_secured(self):
  333. self.assertResourceCalled('Directory', '/etc/hbase',
  334. mode = 0755
  335. )
  336. self.assertResourceCalled('Directory', '/etc/hbase/conf',
  337. owner = 'hbase',
  338. group = 'hadoop',
  339. recursive = True,
  340. )
  341. self.assertResourceCalled('Directory', '/tmp',
  342. owner = 'hbase',
  343. group = 'hadoop',
  344. recursive = True,
  345. mode = 0777
  346. )
  347. self.assertResourceCalled('Directory', '/hadoop',
  348. recursive = True,
  349. cd_access = 'a',
  350. )
  351. self.assertResourceCalled('Execute', ('chmod', '1777', u'/hadoop'),
  352. sudo = True,
  353. )
  354. self.assertResourceCalled('XmlConfig', 'hbase-site.xml',
  355. owner = 'hbase',
  356. group = 'hadoop',
  357. conf_dir = '/etc/hbase/conf',
  358. configurations = self.getConfig()['configurations']['hbase-site'],
  359. configuration_attributes = self.getConfig()['configuration_attributes']['hbase-site']
  360. )
  361. self.assertResourceCalled('XmlConfig', 'core-site.xml',
  362. owner = 'hbase',
  363. group = 'hadoop',
  364. conf_dir = '/etc/hbase/conf',
  365. configurations = self.getConfig()['configurations']['core-site'],
  366. configuration_attributes = self.getConfig()['configuration_attributes']['core-site']
  367. )
  368. self.assertResourceCalled('XmlConfig', 'hdfs-site.xml',
  369. owner = 'hbase',
  370. group = 'hadoop',
  371. conf_dir = '/etc/hbase/conf',
  372. configurations = self.getConfig()['configurations']['hdfs-site'],
  373. configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
  374. )
  375. self.assertResourceCalled('XmlConfig', 'hdfs-site.xml',
  376. owner = 'hdfs',
  377. group = 'hadoop',
  378. conf_dir = '/etc/hadoop/conf',
  379. configurations = self.getConfig()['configurations']['hdfs-site'],
  380. configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
  381. )
  382. self.assertResourceCalled('File', '/etc/hbase/conf/hbase-policy.xml',
  383. owner = 'hbase',
  384. group = 'hadoop',
  385. )
  386. self.assertResourceCalled('File', '/etc/hbase/conf/hbase-env.sh',
  387. owner = 'hbase',
  388. content = InlineTemplate(self.getConfig()['configurations']['hbase-env']['content']),
  389. group = 'hadoop',
  390. )
  391. self.assertResourceCalled('Directory', '/etc/security/limits.d',
  392. owner = 'root',
  393. group = 'root',
  394. recursive = True,
  395. )
  396. self.assertResourceCalled('File', '/etc/security/limits.d/hbase.conf',
  397. content = Template('hbase.conf.j2'),
  398. owner = 'root',
  399. group = 'root',
  400. mode = 0644,
  401. )
  402. self.assertResourceCalled('TemplateConfig', '/etc/hbase/conf/hadoop-metrics2-hbase.properties',
  403. owner = 'hbase',
  404. template_tag = 'GANGLIA-MASTER',
  405. )
  406. self.assertResourceCalled('TemplateConfig', '/etc/hbase/conf/regionservers',
  407. owner = 'hbase',
  408. template_tag = None,
  409. )
  410. self.assertResourceCalled('TemplateConfig', '/etc/hbase/conf/hbase_master_jaas.conf',
  411. owner = 'hbase',
  412. template_tag = None,
  413. )
  414. self.assertResourceCalled('Directory', '/var/run/hbase',
  415. owner = 'hbase',
  416. recursive = True,
  417. mode = 0755,
  418. cd_access = 'a',
  419. )
  420. self.assertResourceCalled('Directory', '/var/log/hbase',
  421. owner = 'hbase',
  422. recursive = True,
  423. mode = 0755,
  424. cd_access = 'a',
  425. )
  426. self.assertResourceCalled('File',
  427. '/etc/hbase/conf/log4j.properties',
  428. mode=0644,
  429. group='hadoop',
  430. owner='hbase',
  431. content='log4jproperties\nline2'
  432. )
  433. self.assertResourceCalled('HdfsResource', 'hdfs://c6401.ambari.apache.org:8020/apps/hbase/data',
  434. security_enabled = True,
  435. hadoop_bin_dir = '/usr/bin',
  436. keytab = '/etc/security/keytabs/hdfs.headless.keytab',
  437. kinit_path_local = '/usr/bin/kinit',
  438. user = 'hdfs',
  439. dfs_type = '',
  440. owner = 'hbase',
  441. hadoop_conf_dir = '/etc/hadoop/conf',
  442. type = 'directory',
  443. action = ['create_on_execute'], hdfs_site=self.getConfig()['configurations']['hdfs-site'], principal_name='hdfs', default_fs='hdfs://c6401.ambari.apache.org:8020',
  444. )
  445. self.assertResourceCalled('HdfsResource', '/apps/hbase/staging',
  446. security_enabled = True,
  447. hadoop_conf_dir = '/etc/hadoop/conf',
  448. keytab = '/etc/security/keytabs/hdfs.headless.keytab',
  449. kinit_path_local = '/usr/bin/kinit',
  450. user = 'hdfs',
  451. dfs_type = '',
  452. owner = 'hbase',
  453. hadoop_bin_dir = '/usr/bin',
  454. type = 'directory',
  455. action = ['create_on_execute'], hdfs_site=self.getConfig()['configurations']['hdfs-site'], principal_name='hdfs', default_fs='hdfs://c6401.ambari.apache.org:8020',
  456. mode = 0711,
  457. )
  458. self.assertResourceCalled('HdfsResource', None,
  459. security_enabled = True,
  460. hadoop_bin_dir = '/usr/bin',
  461. keytab = '/etc/security/keytabs/hdfs.headless.keytab',
  462. kinit_path_local = '/usr/bin/kinit',
  463. user = 'hdfs',
  464. dfs_type = '',
  465. action = ['execute'], hdfs_site=self.getConfig()['configurations']['hdfs-site'], principal_name='hdfs', default_fs='hdfs://c6401.ambari.apache.org:8020',
  466. hadoop_conf_dir = '/etc/hadoop/conf',
  467. )
  468. def test_start_default_22(self):
  469. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/hbase_master.py",
  470. classname = "HbaseMaster",
  471. command = "start",
  472. config_file="hbase-2.2.json",
  473. hdp_stack_version = self.STACK_VERSION,
  474. target = RMFTestCase.TARGET_COMMON_SERVICES)
  475. self.assertResourceCalled('Directory', '/etc/hbase',
  476. mode = 0755)
  477. self.assertResourceCalled('Directory', '/usr/hdp/current/hbase-master/conf',
  478. owner = 'hbase',
  479. group = 'hadoop',
  480. recursive = True)
  481. self.assertResourceCalled('Directory', '/tmp',
  482. owner = 'hbase',
  483. group = 'hadoop',
  484. recursive = True,
  485. mode = 0777
  486. )
  487. self.assertResourceCalled('Directory', '/hadoop',
  488. recursive = True,
  489. cd_access = 'a',
  490. )
  491. self.assertResourceCalled('Execute', ('chmod', '1777', u'/hadoop'),
  492. sudo = True,
  493. )
  494. self.assertResourceCalled('XmlConfig', 'hbase-site.xml',
  495. owner = 'hbase',
  496. group = 'hadoop',
  497. conf_dir = '/usr/hdp/current/hbase-master/conf',
  498. configurations = self.getConfig()['configurations']['hbase-site'],
  499. configuration_attributes = self.getConfig()['configuration_attributes']['hbase-site'])
  500. self.assertResourceCalled('XmlConfig', 'core-site.xml',
  501. owner = 'hbase',
  502. group = 'hadoop',
  503. conf_dir = '/usr/hdp/current/hbase-master/conf',
  504. configurations = self.getConfig()['configurations']['core-site'],
  505. configuration_attributes = self.getConfig()['configuration_attributes']['core-site'])
  506. self.assertResourceCalled('XmlConfig', 'hdfs-site.xml',
  507. owner = 'hbase',
  508. group = 'hadoop',
  509. conf_dir = '/usr/hdp/current/hbase-master/conf',
  510. configurations = self.getConfig()['configurations']['hdfs-site'],
  511. configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site'])
  512. self.assertResourceCalled('XmlConfig', 'hdfs-site.xml',
  513. owner = 'hdfs',
  514. group = 'hadoop',
  515. conf_dir = '/usr/hdp/current/hadoop-client/conf',
  516. configurations = self.getConfig()['configurations']['hdfs-site'],
  517. configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site'])
  518. self.assertResourceCalled('XmlConfig', 'hbase-policy.xml',
  519. owner = 'hbase',
  520. group = 'hadoop',
  521. conf_dir = '/usr/hdp/current/hbase-master/conf',
  522. configurations = self.getConfig()['configurations']['hbase-policy'],
  523. configuration_attributes = self.getConfig()['configuration_attributes']['hbase-policy'])
  524. self.assertResourceCalled('File', '/usr/hdp/current/hbase-master/conf/hbase-env.sh',
  525. owner = 'hbase',
  526. content = InlineTemplate(self.getConfig()['configurations']['hbase-env']['content']),
  527. group = 'hadoop'
  528. )
  529. self.assertResourceCalled('Directory', '/etc/security/limits.d',
  530. owner = 'root',
  531. group = 'root',
  532. recursive = True,
  533. )
  534. self.assertResourceCalled('File', '/etc/security/limits.d/hbase.conf',
  535. content = Template('hbase.conf.j2'),
  536. owner = 'root',
  537. group = 'root',
  538. mode = 0644,
  539. )
  540. self.assertResourceCalled('TemplateConfig', '/usr/hdp/current/hbase-master/conf/hadoop-metrics2-hbase.properties',
  541. owner = 'hbase',
  542. template_tag = 'GANGLIA-MASTER')
  543. self.assertResourceCalled('TemplateConfig', '/usr/hdp/current/hbase-master/conf/regionservers',
  544. owner = 'hbase',
  545. template_tag = None)
  546. self.assertResourceCalled('Directory', '/var/run/hbase',
  547. owner = 'hbase',
  548. recursive = True,
  549. mode = 0755,
  550. cd_access = 'a',
  551. )
  552. self.assertResourceCalled('Directory', '/var/log/hbase',
  553. owner = 'hbase',
  554. recursive = True,
  555. mode = 0755,
  556. cd_access = 'a',
  557. )
  558. self.assertResourceCalled('File',
  559. '/usr/hdp/current/hbase-master/conf/log4j.properties',
  560. mode=0644,
  561. group='hadoop',
  562. owner='hbase',
  563. content='log4jproperties\nline2')
  564. self.assertResourceCalled('HdfsResource', 'hdfs://nn1/apps/hbase/data',
  565. security_enabled = False,
  566. hadoop_bin_dir = '/usr/hdp/current/hadoop-client/bin',
  567. keytab = UnknownConfigurationMock(),
  568. default_fs = 'hdfs://nn1',
  569. hdfs_site = self.getConfig()['configurations']['hdfs-site'],
  570. kinit_path_local = '/usr/bin/kinit',
  571. principal_name = UnknownConfigurationMock(),
  572. user = 'hdfs',
  573. dfs_type = '',
  574. owner = 'hbase',
  575. hadoop_conf_dir = '/usr/hdp/current/hadoop-client/conf',
  576. type = 'directory',
  577. action = ['create_on_execute'],
  578. )
  579. self.assertResourceCalled('HdfsResource', '/apps/hbase/staging',
  580. security_enabled = False,
  581. hadoop_bin_dir = '/usr/hdp/current/hadoop-client/bin',
  582. keytab = UnknownConfigurationMock(),
  583. default_fs = 'hdfs://nn1',
  584. hdfs_site = self.getConfig()['configurations']['hdfs-site'],
  585. kinit_path_local = '/usr/bin/kinit',
  586. principal_name = UnknownConfigurationMock(),
  587. user = 'hdfs',
  588. dfs_type = '',
  589. owner = 'hbase',
  590. hadoop_conf_dir = '/usr/hdp/current/hadoop-client/conf',
  591. type = 'directory',
  592. action = ['create_on_execute'],
  593. mode = 0711,
  594. )
  595. self.assertResourceCalled('HdfsResource', None,
  596. security_enabled = False,
  597. hadoop_bin_dir = '/usr/hdp/current/hadoop-client/bin',
  598. keytab = UnknownConfigurationMock(),
  599. default_fs = 'hdfs://nn1',
  600. hdfs_site = self.getConfig()['configurations']['hdfs-site'],
  601. kinit_path_local = '/usr/bin/kinit',
  602. principal_name = UnknownConfigurationMock(),
  603. user = 'hdfs',
  604. dfs_type = '',
  605. action = ['execute'],
  606. hadoop_conf_dir = '/usr/hdp/current/hadoop-client/conf',
  607. )
  608. self.assertResourceCalled('Execute', '/usr/hdp/current/hbase-master/bin/hbase-daemon.sh --config /usr/hdp/current/hbase-master/conf start master',
  609. not_if = 'ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E test -f /var/run/hbase/hbase-hbase-master.pid && ps -p `ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E cat /var/run/hbase/hbase-hbase-master.pid` >/dev/null 2>&1',
  610. user = 'hbase')
  611. self.assertNoMoreResources()
  612. @patch("resource_management.libraries.functions.security_commons.build_expectations")
  613. @patch("resource_management.libraries.functions.security_commons.get_params_from_filesystem")
  614. @patch("resource_management.libraries.functions.security_commons.validate_security_config_properties")
  615. @patch("resource_management.libraries.functions.security_commons.cached_kinit_executor")
  616. @patch("resource_management.libraries.script.Script.put_structured_out")
  617. def test_security_status(self, put_structured_out_mock, cached_kinit_executor_mock, validate_security_config_mock, get_params_mock, build_exp_mock):
  618. # Test that function works when is called with correct parameters
  619. security_params = {
  620. 'hbase-site': {
  621. 'hbase.master.kerberos.principal': '/path/to/hbase_keytab',
  622. 'hbase.master.keytab.file': 'hbase_principal'
  623. }
  624. }
  625. result_issues = []
  626. props_value_check = {"hbase.security.authentication": "kerberos",
  627. "hbase.security.authorization": "true"}
  628. props_empty_check = ["hbase.master.keytab.file",
  629. "hbase.master.kerberos.principal"]
  630. props_read_check = ["hbase.master.keytab.file"]
  631. get_params_mock.return_value = security_params
  632. validate_security_config_mock.return_value = result_issues
  633. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/hbase_master.py",
  634. classname = "HbaseMaster",
  635. command = "security_status",
  636. config_file="secured.json",
  637. hdp_stack_version = self.STACK_VERSION,
  638. target = RMFTestCase.TARGET_COMMON_SERVICES
  639. )
  640. build_exp_mock.assert_called_with('hbase-site', props_value_check, props_empty_check, props_read_check)
  641. put_structured_out_mock.assert_called_with({"securityState": "SECURED_KERBEROS"})
  642. cached_kinit_executor_mock.called_with('/usr/bin/kinit',
  643. self.config_dict['configurations']['hbase-env']['hbase_user'],
  644. security_params['hbase-site']['hbase.master.keytab.file'],
  645. security_params['hbase-site']['hbase.master.kerberos.principal'],
  646. self.config_dict['hostname'],
  647. '/tmp')
  648. # Testing that the exception throw by cached_executor is caught
  649. cached_kinit_executor_mock.reset_mock()
  650. cached_kinit_executor_mock.side_effect = Exception("Invalid command")
  651. try:
  652. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/hbase_master.py",
  653. classname = "HbaseMaster",
  654. command = "security_status",
  655. config_file="secured.json",
  656. hdp_stack_version = self.STACK_VERSION,
  657. target = RMFTestCase.TARGET_COMMON_SERVICES
  658. )
  659. except:
  660. self.assertTrue(True)
  661. # Testing with a security_params which doesn't contains hbase-site
  662. empty_security_params = {}
  663. cached_kinit_executor_mock.reset_mock()
  664. get_params_mock.reset_mock()
  665. put_structured_out_mock.reset_mock()
  666. get_params_mock.return_value = empty_security_params
  667. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/hbase_master.py",
  668. classname = "HbaseMaster",
  669. command = "security_status",
  670. config_file="secured.json",
  671. hdp_stack_version = self.STACK_VERSION,
  672. target = RMFTestCase.TARGET_COMMON_SERVICES
  673. )
  674. put_structured_out_mock.assert_called_with({"securityIssuesFound": "Keytab file or principal are not set property."})
  675. # Testing with not empty result_issues
  676. result_issues_with_params = {}
  677. result_issues_with_params['hbase-site']="Something bad happened"
  678. validate_security_config_mock.reset_mock()
  679. get_params_mock.reset_mock()
  680. validate_security_config_mock.return_value = result_issues_with_params
  681. get_params_mock.return_value = security_params
  682. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/hbase_master.py",
  683. classname = "HbaseMaster",
  684. command = "security_status",
  685. config_file="default.json",
  686. hdp_stack_version = self.STACK_VERSION,
  687. target = RMFTestCase.TARGET_COMMON_SERVICES
  688. )
  689. put_structured_out_mock.assert_called_with({"securityState": "UNSECURED"})
  690. # Testing with security_enable = false
  691. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/hbase_master.py",
  692. classname = "HbaseMaster",
  693. command = "security_status",
  694. config_file="secured.json",
  695. hdp_stack_version = self.STACK_VERSION,
  696. target = RMFTestCase.TARGET_COMMON_SERVICES
  697. )
  698. put_structured_out_mock.assert_called_with({"securityState": "UNSECURED"})
  699. def test_upgrade_backup(self):
  700. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/hbase_upgrade.py",
  701. classname = "HbaseMasterUpgrade",
  702. command = "take_snapshot",
  703. config_file="hbase-preupgrade.json",
  704. hdp_stack_version = self.STACK_VERSION,
  705. target = RMFTestCase.TARGET_COMMON_SERVICES)
  706. self.assertResourceCalled('Execute', " echo 'snapshot_all' | /usr/hdp/current/hbase-client/bin/hbase shell",
  707. user = 'hbase')
  708. self.assertNoMoreResources()
  709. @patch("resource_management.core.shell.call")
  710. def test_pre_upgrade_restart(self, call_mock):
  711. call_mock.side_effects = [(0, None), (0, None)]
  712. config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json"
  713. with open(config_file, "r") as f:
  714. json_content = json.load(f)
  715. version = '2.2.1.0-3242'
  716. json_content['commandParams']['version'] = version
  717. mocks_dict = {}
  718. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/hbase_master.py",
  719. classname = "HbaseMaster",
  720. command = "pre_upgrade_restart",
  721. config_dict = json_content,
  722. hdp_stack_version = self.STACK_VERSION,
  723. target = RMFTestCase.TARGET_COMMON_SERVICES,
  724. mocks_dict = mocks_dict)
  725. self.assertResourceCalled('Execute',
  726. ('ambari-python-wrap', '/usr/bin/hdp-select', 'set', 'hbase-master', version), sudo=True,)
  727. self.assertFalse(call_mock.called)
  728. self.assertNoMoreResources()
  729. @patch("resource_management.core.shell.call")
  730. def test_upgrade_23(self, call_mock):
  731. call_mock.side_effects = [(0, None), (0, None)]
  732. config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json"
  733. with open(config_file, "r") as f:
  734. json_content = json.load(f)
  735. version = '2.3.0.0-1234'
  736. json_content['commandParams']['version'] = version
  737. mocks_dict = {}
  738. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/hbase_master.py",
  739. classname = "HbaseMaster",
  740. command = "pre_upgrade_restart",
  741. config_dict = json_content,
  742. hdp_stack_version = self.STACK_VERSION,
  743. target = RMFTestCase.TARGET_COMMON_SERVICES,
  744. call_mocks = [(0, None, ''), (0, None, ''), (0, None, ''), (0, None, '')],
  745. mocks_dict = mocks_dict)
  746. self.assertResourceCalled('Execute', ('ambari-python-wrap', '/usr/bin/hdp-select', 'set', 'hbase-master', version), sudo=True)
  747. self.assertEquals(1, mocks_dict['call'].call_count)
  748. self.assertEquals(3, mocks_dict['checked_call'].call_count)
  749. self.assertEquals(
  750. ('ambari-python-wrap', '/usr/bin/conf-select', 'set-conf-dir', '--package', 'hbase', '--stack-version', '2.3.0.0-1234', '--conf-version', '0'),
  751. mocks_dict['checked_call'].call_args_list[1][0][0])
  752. self.assertEquals(
  753. ('ambari-python-wrap', '/usr/bin/conf-select', 'create-conf-dir', '--package', 'hbase', '--stack-version', '2.3.0.0-1234', '--conf-version', '0'),
  754. mocks_dict['call'].call_args_list[0][0][0])