test_nodemanager.py 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768
  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. from mock.mock import MagicMock, call, patch
  18. from stacks.utils.RMFTestCase import *
  19. from resource_management.core.exceptions import Fail
  20. from resource_management.core import shell
  21. import os
  22. origin_exists = os.path.exists
  23. @patch.object(os.path, "exists", new=MagicMock(
  24. side_effect=lambda *args: origin_exists(args[0])
  25. if args[0][-2:] == "j2" else True))
  26. class TestNodeManager(RMFTestCase):
  27. COMMON_SERVICES_PACKAGE_DIR = "YARN/2.1.0.2.0/package"
  28. STACK_VERSION = "2.0.6"
  29. def test_configure_default(self):
  30. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/nodemanager.py",
  31. classname="Nodemanager",
  32. command="configure",
  33. config_file="default.json",
  34. hdp_stack_version = self.STACK_VERSION,
  35. target = RMFTestCase.TARGET_COMMON_SERVICES
  36. )
  37. self.assert_configure_default()
  38. self.assertNoMoreResources()
  39. def test_start_default(self):
  40. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/nodemanager.py",
  41. classname="Nodemanager",
  42. command="start",
  43. config_file="default.json",
  44. hdp_stack_version = self.STACK_VERSION,
  45. target = RMFTestCase.TARGET_COMMON_SERVICES
  46. )
  47. self.assert_configure_default()
  48. pid_check_cmd = 'ls /var/run/hadoop-yarn/yarn/yarn-yarn-nodemanager.pid >/dev/null 2>&1 && ps -p `cat /var/run/hadoop-yarn/yarn/yarn-yarn-nodemanager.pid` >/dev/null 2>&1'
  49. self.assertResourceCalled('File', '/var/run/hadoop-yarn/yarn/yarn-yarn-nodemanager.pid',
  50. not_if=pid_check_cmd,
  51. action=['delete'])
  52. self.assertResourceCalled('Execute', 'ulimit -c unlimited; export HADOOP_LIBEXEC_DIR=/usr/lib/hadoop/libexec && /usr/lib/hadoop-yarn/sbin/yarn-daemon.sh --config /etc/hadoop/conf start nodemanager',
  53. not_if=pid_check_cmd,
  54. user='yarn')
  55. self.assertResourceCalled('Execute', pid_check_cmd,
  56. user='yarn',
  57. not_if=pid_check_cmd,
  58. initial_wait=5)
  59. self.assertNoMoreResources()
  60. def test_stop_default(self):
  61. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/nodemanager.py",
  62. classname="Nodemanager",
  63. command="stop",
  64. config_file="default.json",
  65. hdp_stack_version = self.STACK_VERSION,
  66. target = RMFTestCase.TARGET_COMMON_SERVICES
  67. )
  68. self.assertResourceCalled('Execute', 'export HADOOP_LIBEXEC_DIR=/usr/lib/hadoop/libexec && /usr/lib/hadoop-yarn/sbin/yarn-daemon.sh --config /etc/hadoop/conf stop nodemanager',
  69. user='yarn')
  70. self.assertResourceCalled('File', '/var/run/hadoop-yarn/yarn/yarn-yarn-nodemanager.pid',
  71. action=['delete'])
  72. self.assertNoMoreResources()
  73. def test_configure_secured(self):
  74. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/nodemanager.py",
  75. classname="Nodemanager",
  76. command="configure",
  77. config_file="secured.json",
  78. hdp_stack_version = self.STACK_VERSION,
  79. target = RMFTestCase.TARGET_COMMON_SERVICES
  80. )
  81. self.assert_configure_secured()
  82. self.assertNoMoreResources()
  83. def test_start_secured(self):
  84. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/nodemanager.py",
  85. classname="Nodemanager",
  86. command="start",
  87. config_file="secured.json",
  88. hdp_stack_version = self.STACK_VERSION,
  89. target = RMFTestCase.TARGET_COMMON_SERVICES
  90. )
  91. self.assert_configure_secured()
  92. pid_check_cmd = 'ls /var/run/hadoop-yarn/yarn/yarn-yarn-nodemanager.pid >/dev/null 2>&1 && ps -p `cat /var/run/hadoop-yarn/yarn/yarn-yarn-nodemanager.pid` >/dev/null 2>&1'
  93. self.assertResourceCalled('File', '/var/run/hadoop-yarn/yarn/yarn-yarn-nodemanager.pid',
  94. not_if=pid_check_cmd,
  95. action=['delete'])
  96. self.assertResourceCalled('Execute', 'ulimit -c unlimited; export HADOOP_LIBEXEC_DIR=/usr/lib/hadoop/libexec && /usr/lib/hadoop-yarn/sbin/yarn-daemon.sh --config /etc/hadoop/conf start nodemanager',
  97. not_if=pid_check_cmd,
  98. user='yarn')
  99. self.assertResourceCalled('Execute', 'ls /var/run/hadoop-yarn/yarn/yarn-yarn-nodemanager.pid >/dev/null 2>&1 && ps -p `cat /var/run/hadoop-yarn/yarn/yarn-yarn-nodemanager.pid` >/dev/null 2>&1',
  100. user='yarn',
  101. not_if=pid_check_cmd,
  102. initial_wait=5)
  103. self.assertNoMoreResources()
  104. def test_stop_secured(self):
  105. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/nodemanager.py",
  106. classname="Nodemanager",
  107. command="stop",
  108. config_file="secured.json",
  109. hdp_stack_version = self.STACK_VERSION,
  110. target = RMFTestCase.TARGET_COMMON_SERVICES
  111. )
  112. self.assertResourceCalled('Execute', 'export HADOOP_LIBEXEC_DIR=/usr/lib/hadoop/libexec && /usr/lib/hadoop-yarn/sbin/yarn-daemon.sh --config /etc/hadoop/conf stop nodemanager',
  113. user='yarn')
  114. self.assertResourceCalled('File', '/var/run/hadoop-yarn/yarn/yarn-yarn-nodemanager.pid',
  115. action=['delete'])
  116. self.assertNoMoreResources()
  117. def assert_configure_default(self):
  118. self.assertResourceCalled('HdfsDirectory', '/app-logs',
  119. security_enabled = False,
  120. keytab = UnknownConfigurationMock(),
  121. conf_dir = '/etc/hadoop/conf',
  122. hdfs_user = 'hdfs',
  123. kinit_path_local = "/usr/bin/kinit",
  124. recursive_chmod = True,
  125. owner = 'yarn',
  126. group = 'hadoop',
  127. action = ['create_delayed'],
  128. bin_dir = '/usr/bin',
  129. mode = 0777,
  130. )
  131. self.assertResourceCalled('HdfsDirectory', '/mapred',
  132. security_enabled = False,
  133. keytab = UnknownConfigurationMock(),
  134. conf_dir = '/etc/hadoop/conf',
  135. hdfs_user = 'hdfs',
  136. kinit_path_local = "/usr/bin/kinit",
  137. owner = 'mapred',
  138. bin_dir = '/usr/bin',
  139. action = ['create_delayed'],
  140. )
  141. self.assertResourceCalled('HdfsDirectory', '/mapred/system',
  142. security_enabled = False,
  143. keytab = UnknownConfigurationMock(),
  144. conf_dir = '/etc/hadoop/conf',
  145. hdfs_user = 'hdfs',
  146. kinit_path_local = "/usr/bin/kinit",
  147. owner = 'hdfs',
  148. bin_dir = '/usr/bin',
  149. action = ['create_delayed'],
  150. )
  151. self.assertResourceCalled('HdfsDirectory', '/mr-history/tmp',
  152. security_enabled = False,
  153. keytab = UnknownConfigurationMock(),
  154. conf_dir = '/etc/hadoop/conf',
  155. hdfs_user = 'hdfs',
  156. kinit_path_local = "/usr/bin/kinit",
  157. mode = 0777,
  158. owner = 'mapred',
  159. group = 'hadoop',
  160. bin_dir = '/usr/bin',
  161. action = ['create_delayed'],
  162. )
  163. self.assertResourceCalled('HdfsDirectory', '/mr-history/done',
  164. security_enabled = False,
  165. keytab = UnknownConfigurationMock(),
  166. conf_dir = '/etc/hadoop/conf',
  167. hdfs_user = 'hdfs',
  168. kinit_path_local = "/usr/bin/kinit",
  169. mode = 01777,
  170. owner = 'mapred',
  171. group = 'hadoop',
  172. bin_dir = '/usr/bin',
  173. action = ['create_delayed'],
  174. )
  175. self.assertResourceCalled('HdfsDirectory', None,
  176. security_enabled = False,
  177. keytab = UnknownConfigurationMock(),
  178. conf_dir = '/etc/hadoop/conf',
  179. hdfs_user = 'hdfs',
  180. kinit_path_local = "/usr/bin/kinit",
  181. bin_dir = '/usr/bin',
  182. action = ['create'],
  183. )
  184. self.assertResourceCalled('Directory', '/hadoop/yarn/local',
  185. owner = 'yarn',
  186. group = 'hadoop',
  187. mode = 0775,
  188. recursive = True,
  189. ignore_failures = True,
  190. cd_access='a'
  191. )
  192. self.assertResourceCalled('Directory', '/hadoop/yarn/local1',
  193. owner = 'yarn',
  194. recursive = True,
  195. group = 'hadoop',
  196. ignore_failures = True,
  197. mode = 0775,
  198. cd_access='a'
  199. )
  200. self.assertResourceCalled('Directory', '/hadoop/yarn/log',
  201. owner = 'yarn',
  202. group = 'hadoop',
  203. recursive = True,
  204. ignore_failures = True,
  205. mode = 0775,
  206. cd_access='a'
  207. )
  208. self.assertResourceCalled('Directory', '/hadoop/yarn/log1',
  209. owner = 'yarn',
  210. group = 'hadoop',
  211. recursive = True,
  212. ignore_failures = True,
  213. mode = 0775,
  214. cd_access='a'
  215. )
  216. self.assertResourceCalled('Execute', ('chown', '-R', u'yarn', u'/hadoop/yarn/local,/hadoop/yarn/local1'),
  217. sudo = True,
  218. only_if = 'test -d /hadoop/yarn/local,/hadoop/yarn/local1',
  219. )
  220. self.assertResourceCalled('Directory', '/var/run/hadoop-yarn',
  221. owner = 'yarn',
  222. group = 'hadoop',
  223. recursive = True,
  224. )
  225. self.assertResourceCalled('Directory', '/var/run/hadoop-yarn/yarn',
  226. owner = 'yarn',
  227. group = 'hadoop',
  228. recursive = True,
  229. )
  230. self.assertResourceCalled('Directory', '/var/log/hadoop-yarn/yarn',
  231. owner = 'yarn',
  232. group = 'hadoop',
  233. recursive = True,
  234. )
  235. self.assertResourceCalled('Directory', '/var/run/hadoop-mapreduce',
  236. owner = 'mapred',
  237. group = 'hadoop',
  238. recursive = True,
  239. )
  240. self.assertResourceCalled('Directory', '/var/run/hadoop-mapreduce/mapred',
  241. owner = 'mapred',
  242. group = 'hadoop',
  243. recursive = True,
  244. )
  245. self.assertResourceCalled('Directory', '/var/log/hadoop-mapreduce',
  246. owner = 'mapred',
  247. group = 'hadoop',
  248. recursive = True,
  249. )
  250. self.assertResourceCalled('Directory', '/var/log/hadoop-mapreduce/mapred',
  251. owner = 'mapred',
  252. group = 'hadoop',
  253. recursive = True,
  254. )
  255. self.assertResourceCalled('Directory', '/var/log/hadoop-yarn',
  256. owner = 'yarn',
  257. recursive = True,
  258. ignore_failures = True,
  259. )
  260. self.assertResourceCalled('XmlConfig', 'core-site.xml',
  261. owner = 'hdfs',
  262. group = 'hadoop',
  263. mode = 0644,
  264. conf_dir = '/etc/hadoop/conf',
  265. configurations = self.getConfig()['configurations']['core-site'],
  266. configuration_attributes = self.getConfig()['configuration_attributes']['core-site']
  267. )
  268. self.assertResourceCalled('XmlConfig', 'mapred-site.xml',
  269. owner = 'yarn',
  270. group = 'hadoop',
  271. mode = 0644,
  272. conf_dir = '/etc/hadoop/conf',
  273. configurations = self.getConfig()['configurations']['mapred-site'],
  274. configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
  275. )
  276. self.assertResourceCalled('XmlConfig', 'yarn-site.xml',
  277. owner = 'yarn',
  278. group = 'hadoop',
  279. mode = 0644,
  280. conf_dir = '/etc/hadoop/conf',
  281. configurations = self.getConfig()['configurations']['yarn-site'],
  282. configuration_attributes = self.getConfig()['configuration_attributes']['yarn-site']
  283. )
  284. self.assertResourceCalled('XmlConfig', 'capacity-scheduler.xml',
  285. owner = 'yarn',
  286. group = 'hadoop',
  287. mode = 0644,
  288. conf_dir = '/etc/hadoop/conf',
  289. configurations = self.getConfig()['configurations']['capacity-scheduler'],
  290. configuration_attributes = self.getConfig()['configuration_attributes']['capacity-scheduler']
  291. )
  292. self.assertResourceCalled('File', '/etc/hadoop/conf/yarn.exclude',
  293. owner = 'yarn',
  294. group = 'hadoop',
  295. )
  296. self.assertResourceCalled('File', '/etc/security/limits.d/yarn.conf',
  297. content = Template('yarn.conf.j2'),
  298. mode = 0644,
  299. )
  300. self.assertResourceCalled('File', '/etc/security/limits.d/mapreduce.conf',
  301. content = Template('mapreduce.conf.j2'),
  302. mode = 0644,
  303. )
  304. self.assertResourceCalled('File', '/etc/hadoop/conf/yarn-env.sh',
  305. content = InlineTemplate(self.getConfig()['configurations']['yarn-env']['content']),
  306. owner = 'yarn',
  307. group = 'hadoop',
  308. mode = 0755,
  309. )
  310. self.assertResourceCalled('File', '/etc/hadoop/conf/mapred-env.sh',
  311. content = InlineTemplate(self.getConfig()['configurations']['mapred-env']['content']),
  312. owner = 'hdfs',
  313. )
  314. self.assertResourceCalled('File', '/etc/hadoop/conf/taskcontroller.cfg',
  315. content = Template('taskcontroller.cfg.j2'),
  316. owner = 'hdfs',
  317. )
  318. self.assertResourceCalled('XmlConfig', 'mapred-site.xml',
  319. owner = 'mapred',
  320. group = 'hadoop',
  321. conf_dir = '/etc/hadoop/conf',
  322. configurations = self.getConfig()['configurations']['mapred-site'],
  323. configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
  324. )
  325. self.assertResourceCalled('XmlConfig', 'capacity-scheduler.xml',
  326. owner = 'hdfs',
  327. group = 'hadoop',
  328. conf_dir = '/etc/hadoop/conf',
  329. configurations = self.getConfig()['configurations']['capacity-scheduler'],
  330. configuration_attributes = self.getConfig()['configuration_attributes']['capacity-scheduler']
  331. )
  332. self.assertResourceCalled('File', '/etc/hadoop/conf/fair-scheduler.xml',
  333. owner = 'mapred',
  334. group = 'hadoop',
  335. )
  336. self.assertResourceCalled('File', '/etc/hadoop/conf/ssl-client.xml.example',
  337. owner = 'mapred',
  338. group = 'hadoop',
  339. )
  340. self.assertResourceCalled('File', '/etc/hadoop/conf/ssl-server.xml.example',
  341. owner = 'mapred',
  342. group = 'hadoop',
  343. )
  344. def assert_configure_secured(self):
  345. self.assertResourceCalled('HdfsDirectory', '/app-logs',
  346. security_enabled = True,
  347. keytab = '/etc/security/keytabs/hdfs.headless.keytab',
  348. conf_dir = '/etc/hadoop/conf',
  349. hdfs_user = 'hdfs',
  350. kinit_path_local = '/usr/bin/kinit',
  351. recursive_chmod = True,
  352. owner = 'yarn',
  353. group = 'hadoop',
  354. action = ['create_delayed'],
  355. bin_dir = '/usr/bin',
  356. mode = 0777,
  357. )
  358. self.assertResourceCalled('HdfsDirectory', '/mapred',
  359. security_enabled = True,
  360. keytab = '/etc/security/keytabs/hdfs.headless.keytab',
  361. conf_dir = '/etc/hadoop/conf',
  362. hdfs_user = 'hdfs',
  363. kinit_path_local = '/usr/bin/kinit',
  364. owner = 'mapred',
  365. bin_dir = '/usr/bin',
  366. action = ['create_delayed'],
  367. )
  368. self.assertResourceCalled('HdfsDirectory', '/mapred/system',
  369. security_enabled = True,
  370. keytab = '/etc/security/keytabs/hdfs.headless.keytab',
  371. conf_dir = '/etc/hadoop/conf',
  372. hdfs_user = 'hdfs',
  373. kinit_path_local = '/usr/bin/kinit',
  374. owner = 'hdfs',
  375. bin_dir = '/usr/bin',
  376. action = ['create_delayed'],
  377. )
  378. self.assertResourceCalled('HdfsDirectory', '/mr-history/tmp',
  379. security_enabled = True,
  380. keytab = '/etc/security/keytabs/hdfs.headless.keytab',
  381. conf_dir = '/etc/hadoop/conf',
  382. hdfs_user = 'hdfs',
  383. kinit_path_local = '/usr/bin/kinit',
  384. mode = 0777,
  385. bin_dir = '/usr/bin',
  386. owner = 'mapred',
  387. group = 'hadoop',
  388. action = ['create_delayed'],
  389. )
  390. self.assertResourceCalled('HdfsDirectory', '/mr-history/done',
  391. security_enabled = True,
  392. keytab = '/etc/security/keytabs/hdfs.headless.keytab',
  393. conf_dir = '/etc/hadoop/conf',
  394. hdfs_user = 'hdfs',
  395. kinit_path_local = '/usr/bin/kinit',
  396. mode = 01777,
  397. bin_dir = '/usr/bin',
  398. owner = 'mapred',
  399. group = 'hadoop',
  400. action = ['create_delayed'],
  401. )
  402. self.assertResourceCalled('HdfsDirectory', None,
  403. security_enabled = True,
  404. keytab = '/etc/security/keytabs/hdfs.headless.keytab',
  405. conf_dir = '/etc/hadoop/conf',
  406. bin_dir = '/usr/bin',
  407. hdfs_user = 'hdfs',
  408. kinit_path_local = '/usr/bin/kinit',
  409. action = ['create'],
  410. )
  411. self.assertResourceCalled('Directory', '/hadoop/yarn/local',
  412. owner = 'yarn',
  413. group = 'hadoop',
  414. recursive = True,
  415. ignore_failures = True,
  416. mode = 0775,
  417. cd_access='a'
  418. )
  419. self.assertResourceCalled('Directory', '/hadoop/yarn/log',
  420. owner = 'yarn',
  421. group = 'hadoop',
  422. recursive = True,
  423. ignore_failures = True,
  424. mode = 0775,
  425. cd_access='a'
  426. )
  427. self.assertResourceCalled('Execute', ('chown', '-R', u'yarn', u'/hadoop/yarn/local'),
  428. sudo = True,
  429. only_if = 'test -d /hadoop/yarn/local',
  430. )
  431. self.assertResourceCalled('Execute', ('chown', '-R', u'ambari-qa', u'/hadoop/yarn/local/usercache/ambari-qa'),
  432. sudo = True,
  433. only_if = 'test -d /hadoop/yarn/local/usercache/ambari-qa',
  434. )
  435. self.assertResourceCalled('Directory', '/var/run/hadoop-yarn',
  436. owner = 'yarn',
  437. group = 'hadoop',
  438. recursive = True,
  439. )
  440. self.assertResourceCalled('Directory', '/var/run/hadoop-yarn/yarn',
  441. owner = 'yarn',
  442. group = 'hadoop',
  443. recursive = True,
  444. )
  445. self.assertResourceCalled('Directory', '/var/log/hadoop-yarn/yarn',
  446. owner = 'yarn',
  447. group = 'hadoop',
  448. recursive = True,
  449. )
  450. self.assertResourceCalled('Directory', '/var/run/hadoop-mapreduce',
  451. owner = 'mapred',
  452. group = 'hadoop',
  453. recursive = True,
  454. )
  455. self.assertResourceCalled('Directory', '/var/run/hadoop-mapreduce/mapred',
  456. owner = 'mapred',
  457. group = 'hadoop',
  458. recursive = True,
  459. )
  460. self.assertResourceCalled('Directory', '/var/log/hadoop-mapreduce',
  461. owner = 'mapred',
  462. group = 'hadoop',
  463. recursive = True,
  464. )
  465. self.assertResourceCalled('Directory', '/var/log/hadoop-mapreduce/mapred',
  466. owner = 'mapred',
  467. group = 'hadoop',
  468. recursive = True,
  469. )
  470. self.assertResourceCalled('Directory', '/var/log/hadoop-yarn',
  471. owner = 'yarn',
  472. recursive = True,
  473. ignore_failures = True,
  474. )
  475. self.assertResourceCalled('XmlConfig', 'core-site.xml',
  476. owner = 'hdfs',
  477. group = 'hadoop',
  478. mode = 0644,
  479. conf_dir = '/etc/hadoop/conf',
  480. configurations = self.getConfig()['configurations']['core-site'],
  481. configuration_attributes = self.getConfig()['configuration_attributes']['core-site']
  482. )
  483. self.assertResourceCalled('XmlConfig', 'mapred-site.xml',
  484. owner = 'yarn',
  485. group = 'hadoop',
  486. mode = 0644,
  487. conf_dir = '/etc/hadoop/conf',
  488. configurations = self.getConfig()['configurations']['mapred-site'],
  489. configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
  490. )
  491. self.assertResourceCalled('XmlConfig', 'yarn-site.xml',
  492. owner = 'yarn',
  493. group = 'hadoop',
  494. mode = 0644,
  495. conf_dir = '/etc/hadoop/conf',
  496. configurations = self.getConfig()['configurations']['yarn-site'],
  497. configuration_attributes = self.getConfig()['configuration_attributes']['yarn-site']
  498. )
  499. self.assertResourceCalled('XmlConfig', 'capacity-scheduler.xml',
  500. owner = 'yarn',
  501. group = 'hadoop',
  502. mode = 0644,
  503. conf_dir = '/etc/hadoop/conf',
  504. configurations = self.getConfig()['configurations']['capacity-scheduler'],
  505. configuration_attributes = self.getConfig()['configuration_attributes']['capacity-scheduler']
  506. )
  507. self.assertResourceCalled('File', '/etc/hadoop/conf/yarn.exclude',
  508. owner = 'yarn',
  509. group = 'hadoop',
  510. )
  511. self.assertResourceCalled('File', '/etc/security/limits.d/yarn.conf',
  512. content = Template('yarn.conf.j2'),
  513. mode = 0644,
  514. )
  515. self.assertResourceCalled('File', '/etc/security/limits.d/mapreduce.conf',
  516. content = Template('mapreduce.conf.j2'),
  517. mode = 0644,
  518. )
  519. self.assertResourceCalled('File', '/etc/hadoop/conf/yarn-env.sh',
  520. content = InlineTemplate(self.getConfig()['configurations']['yarn-env']['content']),
  521. owner = 'yarn',
  522. group = 'hadoop',
  523. mode = 0755,
  524. )
  525. self.assertResourceCalled('File', '/usr/lib/hadoop-yarn/bin/container-executor',
  526. group = 'hadoop',
  527. mode = 06050,
  528. )
  529. self.assertResourceCalled('File', '/etc/hadoop/conf/container-executor.cfg',
  530. content = Template('container-executor.cfg.j2'),
  531. group = 'hadoop',
  532. mode = 0644,
  533. )
  534. self.assertResourceCalled('File', '/etc/hadoop/conf/mapred-env.sh',
  535. content = InlineTemplate(self.getConfig()['configurations']['mapred-env']['content']),
  536. owner = 'root',
  537. )
  538. self.assertResourceCalled('File', '/usr/lib/hadoop/sbin/task-controller',
  539. owner = 'root',
  540. group = 'hadoop',
  541. mode = 06050,
  542. )
  543. self.assertResourceCalled('File', '/etc/hadoop/conf/taskcontroller.cfg',
  544. content = Template('taskcontroller.cfg.j2'),
  545. owner = 'root',
  546. group = 'hadoop',
  547. mode = 0644,
  548. )
  549. self.assertResourceCalled('XmlConfig', 'mapred-site.xml',
  550. owner = 'mapred',
  551. group = 'hadoop',
  552. conf_dir = '/etc/hadoop/conf',
  553. configurations = self.getConfig()['configurations']['mapred-site'],
  554. configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
  555. )
  556. self.assertResourceCalled('XmlConfig', 'capacity-scheduler.xml',
  557. owner = 'hdfs',
  558. group = 'hadoop',
  559. conf_dir = '/etc/hadoop/conf',
  560. configurations = self.getConfig()['configurations']['capacity-scheduler'],
  561. configuration_attributes = self.getConfig()['configuration_attributes']['capacity-scheduler']
  562. )
  563. self.assertResourceCalled('File', '/etc/hadoop/conf/fair-scheduler.xml',
  564. owner = 'mapred',
  565. group = 'hadoop',
  566. )
  567. self.assertResourceCalled('File', '/etc/hadoop/conf/ssl-client.xml.example',
  568. owner = 'mapred',
  569. group = 'hadoop',
  570. )
  571. self.assertResourceCalled('File', '/etc/hadoop/conf/ssl-server.xml.example',
  572. owner = 'mapred',
  573. group = 'hadoop',
  574. )
  575. @patch('time.sleep')
  576. @patch.object(shell, "call")
  577. def test_post_rolling_restart(self, process_mock, time_mock):
  578. process_output = """
  579. c6401.ambari.apache.org:45454 RUNNING c6401.ambari.apache.org:8042 0
  580. """
  581. process_mock.return_value = (0, process_output)
  582. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/nodemanager.py",
  583. classname="Nodemanager",
  584. command = "post_rolling_restart",
  585. config_file="default.json",
  586. hdp_stack_version = self.STACK_VERSION,
  587. target = RMFTestCase.TARGET_COMMON_SERVICES
  588. )
  589. self.assertTrue(process_mock.called)
  590. self.assertEqual(process_mock.call_count,1)
  591. @patch('time.sleep')
  592. @patch.object(shell, "call")
  593. def test_post_rolling_restart_nodemanager_not_ready(self, process_mock, time_mock):
  594. process_output = """
  595. c9999.ambari.apache.org:45454 RUNNING c9999.ambari.apache.org:8042 0
  596. """
  597. process_mock.return_value = (0, process_output)
  598. try:
  599. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/nodemanager.py",
  600. classname="Nodemanager",
  601. command = "post_rolling_restart",
  602. config_file="default.json",
  603. hdp_stack_version = self.STACK_VERSION,
  604. target = RMFTestCase.TARGET_COMMON_SERVICES
  605. )
  606. self.fail('Missing NodeManager should have caused a failure')
  607. except Fail,fail:
  608. self.assertTrue(process_mock.called)
  609. self.assertEqual(process_mock.call_count,12)
  610. @patch('time.sleep')
  611. @patch.object(shell, "call")
  612. def test_post_rolling_restart_nodemanager_not_ready(self, process_mock, time_mock):
  613. process_output = """
  614. c6401.ambari.apache.org:45454 RUNNING c6401.ambari.apache.org:8042 0
  615. """
  616. process_mock.return_value = (999, process_output)
  617. try:
  618. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/nodemanager.py",
  619. classname="Nodemanager",
  620. command = "post_rolling_restart",
  621. config_file="default.json",
  622. hdp_stack_version = self.STACK_VERSION,
  623. target = RMFTestCase.TARGET_COMMON_SERVICES
  624. )
  625. self.fail('Invalid return code should cause a failure')
  626. except Fail,fail:
  627. self.assertTrue(process_mock.called)
  628. self.assertEqual(process_mock.call_count,12)
  629. @patch("resource_management.libraries.functions.security_commons.build_expectations")
  630. @patch("resource_management.libraries.functions.security_commons.get_params_from_filesystem")
  631. @patch("resource_management.libraries.functions.security_commons.validate_security_config_properties")
  632. @patch("resource_management.libraries.functions.security_commons.cached_kinit_executor")
  633. @patch("resource_management.libraries.script.Script.put_structured_out")
  634. def test_security_status(self, put_structured_out_mock, cached_kinit_executor_mock, validate_security_config_mock, get_params_mock, build_exp_mock):
  635. # Test that function works when is called with correct parameters
  636. security_params = {
  637. 'yarn-site': {
  638. 'yarn.nodemanager.keytab': 'path/to/nodemanager/keytab',
  639. 'yarn.nodemanager.principal': 'nodemanager_principal',
  640. 'yarn.nodemanager.webapp.spnego-keytab-file': 'path/to/nodemanager/webapp/keytab',
  641. 'yarn.nodemanager.webapp.spnego-principal': 'nodemanager_webapp_principal'
  642. }
  643. }
  644. result_issues = []
  645. props_value_check = {"yarn.timeline-service.http-authentication.type": "kerberos",
  646. "yarn.acl.enable": "true"}
  647. props_empty_check = ["yarn.nodemanager.principal",
  648. "yarn.nodemanager.keytab",
  649. "yarn.nodemanager.webapp.spnego-principal",
  650. "yarn.nodemanager.webapp.spnego-keytab-file"]
  651. props_read_check = ["yarn.nodemanager.keytab",
  652. "yarn.nodemanager.webapp.spnego-keytab-file"]
  653. get_params_mock.return_value = security_params
  654. validate_security_config_mock.return_value = result_issues
  655. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/nodemanager.py",
  656. classname="Nodemanager",
  657. command="security_status",
  658. config_file="secured.json",
  659. hdp_stack_version = self.STACK_VERSION,
  660. target = RMFTestCase.TARGET_COMMON_SERVICES
  661. )
  662. build_exp_mock.assert_called_with('yarn-site', props_value_check, props_empty_check, props_read_check)
  663. put_structured_out_mock.assert_called_with({"securityState": "SECURED_KERBEROS"})
  664. self.assertTrue(cached_kinit_executor_mock.call_count, 2)
  665. cached_kinit_executor_mock.assert_called_with('/usr/bin/kinit',
  666. self.config_dict['configurations']['yarn-env']['yarn_user'],
  667. security_params['yarn-site']['yarn.nodemanager.webapp.spnego-keytab-file'],
  668. security_params['yarn-site']['yarn.nodemanager.webapp.spnego-principal'],
  669. self.config_dict['hostname'],
  670. '/tmp')
  671. # Testing that the exception throw by cached_executor is caught
  672. cached_kinit_executor_mock.reset_mock()
  673. cached_kinit_executor_mock.side_effect = Exception("Invalid command")
  674. try:
  675. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/nodemanager.py",
  676. classname="Nodemanager",
  677. command="security_status",
  678. config_file="secured.json",
  679. hdp_stack_version = self.STACK_VERSION,
  680. target = RMFTestCase.TARGET_COMMON_SERVICES
  681. )
  682. except:
  683. self.assertTrue(True)
  684. # Testing with a security_params which doesn't contains yarn-site
  685. empty_security_params = {}
  686. cached_kinit_executor_mock.reset_mock()
  687. get_params_mock.reset_mock()
  688. put_structured_out_mock.reset_mock()
  689. get_params_mock.return_value = empty_security_params
  690. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/nodemanager.py",
  691. classname="Nodemanager",
  692. command="security_status",
  693. config_file="secured.json",
  694. hdp_stack_version = self.STACK_VERSION,
  695. target = RMFTestCase.TARGET_COMMON_SERVICES
  696. )
  697. put_structured_out_mock.assert_called_with({"securityIssuesFound": "Keytab file or principal are not set property."})
  698. # Testing with not empty result_issues
  699. result_issues_with_params = {
  700. 'yarn-site': "Something bad happened"
  701. }
  702. validate_security_config_mock.reset_mock()
  703. get_params_mock.reset_mock()
  704. validate_security_config_mock.return_value = result_issues_with_params
  705. get_params_mock.return_value = security_params
  706. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/nodemanager.py",
  707. classname="Nodemanager",
  708. command="security_status",
  709. config_file="secured.json",
  710. hdp_stack_version = self.STACK_VERSION,
  711. target = RMFTestCase.TARGET_COMMON_SERVICES
  712. )
  713. put_structured_out_mock.assert_called_with({"securityState": "UNSECURED"})
  714. # Testing with security_enable = false
  715. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/nodemanager.py",
  716. classname="Nodemanager",
  717. command="security_status",
  718. config_file="default.json",
  719. hdp_stack_version = self.STACK_VERSION,
  720. target = RMFTestCase.TARGET_COMMON_SERVICES
  721. )
  722. put_structured_out_mock.assert_called_with({"securityState": "UNSECURED"})