test_nodemanager.py 33 KB

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