test_nodemanager.py 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805
  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. cd_access = 'a',
  225. )
  226. self.assertResourceCalled('Directory', '/var/run/hadoop-yarn/yarn',
  227. owner = 'yarn',
  228. group = 'hadoop',
  229. recursive = True,
  230. cd_access = 'a',
  231. )
  232. self.assertResourceCalled('Directory', '/var/log/hadoop-yarn/yarn',
  233. owner = 'yarn',
  234. group = 'hadoop',
  235. recursive = True,
  236. cd_access = 'a',
  237. )
  238. self.assertResourceCalled('Directory', '/var/run/hadoop-mapreduce',
  239. owner = 'mapred',
  240. group = 'hadoop',
  241. recursive = True,
  242. cd_access = 'a',
  243. )
  244. self.assertResourceCalled('Directory', '/var/run/hadoop-mapreduce/mapred',
  245. owner = 'mapred',
  246. group = 'hadoop',
  247. recursive = True,
  248. cd_access = 'a',
  249. )
  250. self.assertResourceCalled('Directory', '/var/log/hadoop-mapreduce',
  251. owner = 'mapred',
  252. group = 'hadoop',
  253. recursive = True,
  254. cd_access = 'a',
  255. )
  256. self.assertResourceCalled('Directory', '/var/log/hadoop-mapreduce/mapred',
  257. owner = 'mapred',
  258. group = 'hadoop',
  259. recursive = True,
  260. cd_access = 'a',
  261. )
  262. self.assertResourceCalled('Directory', '/var/log/hadoop-yarn',
  263. owner = 'yarn',
  264. recursive = True,
  265. ignore_failures = True,
  266. cd_access = 'a',
  267. )
  268. self.assertResourceCalled('XmlConfig', 'core-site.xml',
  269. owner = 'hdfs',
  270. group = 'hadoop',
  271. mode = 0644,
  272. conf_dir = '/etc/hadoop/conf',
  273. configurations = self.getConfig()['configurations']['core-site'],
  274. configuration_attributes = self.getConfig()['configuration_attributes']['core-site']
  275. )
  276. self.assertResourceCalled('XmlConfig', 'mapred-site.xml',
  277. owner = 'yarn',
  278. group = 'hadoop',
  279. mode = 0644,
  280. conf_dir = '/etc/hadoop/conf',
  281. configurations = self.getConfig()['configurations']['mapred-site'],
  282. configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
  283. )
  284. self.assertResourceCalled('XmlConfig', 'yarn-site.xml',
  285. owner = 'yarn',
  286. group = 'hadoop',
  287. mode = 0644,
  288. conf_dir = '/etc/hadoop/conf',
  289. configurations = self.getConfig()['configurations']['yarn-site'],
  290. configuration_attributes = self.getConfig()['configuration_attributes']['yarn-site']
  291. )
  292. self.assertResourceCalled('XmlConfig', 'capacity-scheduler.xml',
  293. owner = 'yarn',
  294. group = 'hadoop',
  295. mode = 0644,
  296. conf_dir = '/etc/hadoop/conf',
  297. configurations = self.getConfig()['configurations']['capacity-scheduler'],
  298. configuration_attributes = self.getConfig()['configuration_attributes']['capacity-scheduler']
  299. )
  300. self.assertResourceCalled('File', '/etc/hadoop/conf/yarn.exclude',
  301. owner = 'yarn',
  302. group = 'hadoop',
  303. )
  304. self.assertResourceCalled('File', '/etc/security/limits.d/yarn.conf',
  305. content = Template('yarn.conf.j2'),
  306. mode = 0644,
  307. )
  308. self.assertResourceCalled('File', '/etc/security/limits.d/mapreduce.conf',
  309. content = Template('mapreduce.conf.j2'),
  310. mode = 0644,
  311. )
  312. self.assertResourceCalled('File', '/etc/hadoop/conf/yarn-env.sh',
  313. content = InlineTemplate(self.getConfig()['configurations']['yarn-env']['content']),
  314. owner = 'yarn',
  315. group = 'hadoop',
  316. mode = 0755,
  317. )
  318. self.assertResourceCalled('File', '/usr/lib/hadoop-yarn/bin/container-executor',
  319. group = 'hadoop',
  320. mode = 06050,
  321. )
  322. self.assertResourceCalled('File', '/etc/hadoop/conf/container-executor.cfg',
  323. content = Template('container-executor.cfg.j2'),
  324. group = 'hadoop',
  325. mode = 0644,
  326. )
  327. self.assertResourceCalled('Directory', '/cgroups_test/cpu',
  328. group = 'hadoop',
  329. recursive = True,
  330. mode = 0755,
  331. cd_access="a"
  332. )
  333. self.assertResourceCalled('File', '/etc/hadoop/conf/mapred-env.sh',
  334. content = InlineTemplate(self.getConfig()['configurations']['mapred-env']['content']),
  335. owner = 'hdfs',
  336. )
  337. self.assertResourceCalled('File', '/etc/hadoop/conf/taskcontroller.cfg',
  338. content = Template('taskcontroller.cfg.j2'),
  339. owner = 'hdfs',
  340. )
  341. self.assertResourceCalled('XmlConfig', 'mapred-site.xml',
  342. owner = 'mapred',
  343. group = 'hadoop',
  344. conf_dir = '/etc/hadoop/conf',
  345. configurations = self.getConfig()['configurations']['mapred-site'],
  346. configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
  347. )
  348. self.assertResourceCalled('XmlConfig', 'capacity-scheduler.xml',
  349. owner = 'hdfs',
  350. group = 'hadoop',
  351. conf_dir = '/etc/hadoop/conf',
  352. configurations = self.getConfig()['configurations']['capacity-scheduler'],
  353. configuration_attributes = self.getConfig()['configuration_attributes']['capacity-scheduler']
  354. )
  355. self.assertResourceCalled('File', '/etc/hadoop/conf/fair-scheduler.xml',
  356. owner = 'mapred',
  357. group = 'hadoop',
  358. )
  359. self.assertResourceCalled('File', '/etc/hadoop/conf/ssl-client.xml.example',
  360. owner = 'mapred',
  361. group = 'hadoop',
  362. )
  363. self.assertResourceCalled('File', '/etc/hadoop/conf/ssl-server.xml.example',
  364. owner = 'mapred',
  365. group = 'hadoop',
  366. )
  367. def assert_configure_secured(self):
  368. self.assertResourceCalled('HdfsDirectory', '/app-logs',
  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. recursive_chmod = True,
  375. owner = 'yarn',
  376. group = 'hadoop',
  377. action = ['create_delayed'],
  378. bin_dir = '/usr/bin',
  379. mode = 0777,
  380. )
  381. self.assertResourceCalled('HdfsDirectory', '/mapred',
  382. security_enabled = True,
  383. keytab = '/etc/security/keytabs/hdfs.headless.keytab',
  384. conf_dir = '/etc/hadoop/conf',
  385. hdfs_user = 'hdfs',
  386. kinit_path_local = '/usr/bin/kinit',
  387. owner = 'mapred',
  388. bin_dir = '/usr/bin',
  389. action = ['create_delayed'],
  390. )
  391. self.assertResourceCalled('HdfsDirectory', '/mapred/system',
  392. security_enabled = True,
  393. keytab = '/etc/security/keytabs/hdfs.headless.keytab',
  394. conf_dir = '/etc/hadoop/conf',
  395. hdfs_user = 'hdfs',
  396. kinit_path_local = '/usr/bin/kinit',
  397. owner = 'hdfs',
  398. bin_dir = '/usr/bin',
  399. action = ['create_delayed'],
  400. )
  401. self.assertResourceCalled('HdfsDirectory', '/mr-history/tmp',
  402. security_enabled = True,
  403. keytab = '/etc/security/keytabs/hdfs.headless.keytab',
  404. conf_dir = '/etc/hadoop/conf',
  405. hdfs_user = 'hdfs',
  406. kinit_path_local = '/usr/bin/kinit',
  407. mode = 0777,
  408. bin_dir = '/usr/bin',
  409. owner = 'mapred',
  410. group = 'hadoop',
  411. action = ['create_delayed'],
  412. )
  413. self.assertResourceCalled('HdfsDirectory', '/mr-history/done',
  414. security_enabled = True,
  415. keytab = '/etc/security/keytabs/hdfs.headless.keytab',
  416. conf_dir = '/etc/hadoop/conf',
  417. hdfs_user = 'hdfs',
  418. kinit_path_local = '/usr/bin/kinit',
  419. mode = 01777,
  420. bin_dir = '/usr/bin',
  421. owner = 'mapred',
  422. group = 'hadoop',
  423. action = ['create_delayed'],
  424. )
  425. self.assertResourceCalled('HdfsDirectory', None,
  426. security_enabled = True,
  427. keytab = '/etc/security/keytabs/hdfs.headless.keytab',
  428. conf_dir = '/etc/hadoop/conf',
  429. bin_dir = '/usr/bin',
  430. hdfs_user = 'hdfs',
  431. kinit_path_local = '/usr/bin/kinit',
  432. action = ['create'],
  433. )
  434. self.assertResourceCalled('Directory', '/hadoop/yarn/local',
  435. owner = 'yarn',
  436. group = 'hadoop',
  437. recursive = True,
  438. ignore_failures = True,
  439. mode = 0775,
  440. cd_access='a'
  441. )
  442. self.assertResourceCalled('Directory', '/hadoop/yarn/log',
  443. owner = 'yarn',
  444. group = 'hadoop',
  445. recursive = True,
  446. ignore_failures = True,
  447. mode = 0775,
  448. cd_access='a'
  449. )
  450. self.assertResourceCalled('Execute', ('chown', '-R', u'yarn', u'/hadoop/yarn/local'),
  451. sudo = True,
  452. only_if = 'test -d /hadoop/yarn/local',
  453. )
  454. self.assertResourceCalled('Execute', ('chown', '-R', u'ambari-qa', u'/hadoop/yarn/local/usercache/ambari-qa'),
  455. sudo = True,
  456. only_if = 'test -d /hadoop/yarn/local/usercache/ambari-qa',
  457. )
  458. self.assertResourceCalled('Directory', '/var/run/hadoop-yarn',
  459. owner = 'yarn',
  460. group = 'hadoop',
  461. recursive = True,
  462. cd_access = 'a',
  463. )
  464. self.assertResourceCalled('Directory', '/var/run/hadoop-yarn/yarn',
  465. owner = 'yarn',
  466. group = 'hadoop',
  467. recursive = True,
  468. cd_access = 'a',
  469. )
  470. self.assertResourceCalled('Directory', '/var/log/hadoop-yarn/yarn',
  471. owner = 'yarn',
  472. group = 'hadoop',
  473. recursive = True,
  474. cd_access = 'a',
  475. )
  476. self.assertResourceCalled('Directory', '/var/run/hadoop-mapreduce',
  477. owner = 'mapred',
  478. group = 'hadoop',
  479. recursive = True,
  480. cd_access = 'a',
  481. )
  482. self.assertResourceCalled('Directory', '/var/run/hadoop-mapreduce/mapred',
  483. owner = 'mapred',
  484. group = 'hadoop',
  485. recursive = True,
  486. cd_access = 'a',
  487. )
  488. self.assertResourceCalled('Directory', '/var/log/hadoop-mapreduce',
  489. owner = 'mapred',
  490. group = 'hadoop',
  491. recursive = True,
  492. cd_access = 'a',
  493. )
  494. self.assertResourceCalled('Directory', '/var/log/hadoop-mapreduce/mapred',
  495. owner = 'mapred',
  496. group = 'hadoop',
  497. recursive = True,
  498. cd_access = 'a',
  499. )
  500. self.assertResourceCalled('Directory', '/var/log/hadoop-yarn',
  501. owner = 'yarn',
  502. recursive = True,
  503. ignore_failures = True,
  504. cd_access = 'a',
  505. )
  506. self.assertResourceCalled('XmlConfig', 'core-site.xml',
  507. owner = 'hdfs',
  508. group = 'hadoop',
  509. mode = 0644,
  510. conf_dir = '/etc/hadoop/conf',
  511. configurations = self.getConfig()['configurations']['core-site'],
  512. configuration_attributes = self.getConfig()['configuration_attributes']['core-site']
  513. )
  514. self.assertResourceCalled('XmlConfig', 'mapred-site.xml',
  515. owner = 'yarn',
  516. group = 'hadoop',
  517. mode = 0644,
  518. conf_dir = '/etc/hadoop/conf',
  519. configurations = self.getConfig()['configurations']['mapred-site'],
  520. configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
  521. )
  522. self.assertResourceCalled('XmlConfig', 'yarn-site.xml',
  523. owner = 'yarn',
  524. group = 'hadoop',
  525. mode = 0644,
  526. conf_dir = '/etc/hadoop/conf',
  527. configurations = self.getConfig()['configurations']['yarn-site'],
  528. configuration_attributes = self.getConfig()['configuration_attributes']['yarn-site']
  529. )
  530. self.assertResourceCalled('XmlConfig', 'capacity-scheduler.xml',
  531. owner = 'yarn',
  532. group = 'hadoop',
  533. mode = 0644,
  534. conf_dir = '/etc/hadoop/conf',
  535. configurations = self.getConfig()['configurations']['capacity-scheduler'],
  536. configuration_attributes = self.getConfig()['configuration_attributes']['capacity-scheduler']
  537. )
  538. self.assertResourceCalled('File', '/etc/hadoop/conf/yarn.exclude',
  539. owner = 'yarn',
  540. group = 'hadoop',
  541. )
  542. self.assertResourceCalled('File', '/etc/security/limits.d/yarn.conf',
  543. content = Template('yarn.conf.j2'),
  544. mode = 0644,
  545. )
  546. self.assertResourceCalled('File', '/etc/security/limits.d/mapreduce.conf',
  547. content = Template('mapreduce.conf.j2'),
  548. mode = 0644,
  549. )
  550. self.assertResourceCalled('File', '/etc/hadoop/conf/yarn-env.sh',
  551. content = InlineTemplate(self.getConfig()['configurations']['yarn-env']['content']),
  552. owner = 'yarn',
  553. group = 'hadoop',
  554. mode = 0755,
  555. )
  556. self.assertResourceCalled('File', '/usr/lib/hadoop-yarn/bin/container-executor',
  557. group = 'hadoop',
  558. mode = 06050,
  559. )
  560. self.assertResourceCalled('File', '/etc/hadoop/conf/container-executor.cfg',
  561. content = Template('container-executor.cfg.j2'),
  562. group = 'hadoop',
  563. mode = 0644,
  564. )
  565. self.assertResourceCalled('Directory', '/cgroups_test/cpu',
  566. group = 'hadoop',
  567. recursive = True,
  568. mode = 0755,
  569. cd_access="a"
  570. )
  571. self.assertResourceCalled('File', '/etc/hadoop/conf/mapred-env.sh',
  572. content = InlineTemplate(self.getConfig()['configurations']['mapred-env']['content']),
  573. owner = 'root',
  574. )
  575. self.assertResourceCalled('File', '/usr/lib/hadoop/sbin/task-controller',
  576. owner = 'root',
  577. group = 'hadoop',
  578. mode = 06050,
  579. )
  580. self.assertResourceCalled('File', '/etc/hadoop/conf/taskcontroller.cfg',
  581. content = Template('taskcontroller.cfg.j2'),
  582. owner = 'root',
  583. group = 'hadoop',
  584. mode = 0644,
  585. )
  586. self.assertResourceCalled('XmlConfig', 'mapred-site.xml',
  587. owner = 'mapred',
  588. group = 'hadoop',
  589. conf_dir = '/etc/hadoop/conf',
  590. configurations = self.getConfig()['configurations']['mapred-site'],
  591. configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
  592. )
  593. self.assertResourceCalled('XmlConfig', 'capacity-scheduler.xml',
  594. owner = 'hdfs',
  595. group = 'hadoop',
  596. conf_dir = '/etc/hadoop/conf',
  597. configurations = self.getConfig()['configurations']['capacity-scheduler'],
  598. configuration_attributes = self.getConfig()['configuration_attributes']['capacity-scheduler']
  599. )
  600. self.assertResourceCalled('File', '/etc/hadoop/conf/fair-scheduler.xml',
  601. owner = 'mapred',
  602. group = 'hadoop',
  603. )
  604. self.assertResourceCalled('File', '/etc/hadoop/conf/ssl-client.xml.example',
  605. owner = 'mapred',
  606. group = 'hadoop',
  607. )
  608. self.assertResourceCalled('File', '/etc/hadoop/conf/ssl-server.xml.example',
  609. owner = 'mapred',
  610. group = 'hadoop',
  611. )
  612. @patch('time.sleep')
  613. @patch.object(shell, "call")
  614. def test_post_rolling_restart(self, process_mock, time_mock):
  615. process_output = """
  616. c6401.ambari.apache.org:45454 RUNNING c6401.ambari.apache.org:8042 0
  617. """
  618. process_mock.return_value = (0, process_output)
  619. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/nodemanager.py",
  620. classname="Nodemanager",
  621. command = "post_rolling_restart",
  622. config_file="default.json",
  623. hdp_stack_version = self.STACK_VERSION,
  624. target = RMFTestCase.TARGET_COMMON_SERVICES
  625. )
  626. self.assertTrue(process_mock.called)
  627. self.assertEqual(process_mock.call_count,1)
  628. @patch('time.sleep')
  629. @patch.object(shell, "call")
  630. def test_post_rolling_restart_nodemanager_not_ready(self, process_mock, time_mock):
  631. process_output = """
  632. c9999.ambari.apache.org:45454 RUNNING c9999.ambari.apache.org:8042 0
  633. """
  634. process_mock.return_value = (0, process_output)
  635. try:
  636. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/nodemanager.py",
  637. classname="Nodemanager",
  638. command = "post_rolling_restart",
  639. config_file="default.json",
  640. hdp_stack_version = self.STACK_VERSION,
  641. target = RMFTestCase.TARGET_COMMON_SERVICES
  642. )
  643. self.fail('Missing NodeManager should have caused a failure')
  644. except Fail,fail:
  645. self.assertTrue(process_mock.called)
  646. self.assertEqual(process_mock.call_count,12)
  647. @patch('time.sleep')
  648. @patch.object(shell, "call")
  649. def test_post_rolling_restart_nodemanager_not_ready(self, process_mock, time_mock):
  650. process_output = """
  651. c6401.ambari.apache.org:45454 RUNNING c6401.ambari.apache.org:8042 0
  652. """
  653. process_mock.return_value = (999, process_output)
  654. try:
  655. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/nodemanager.py",
  656. classname="Nodemanager",
  657. command = "post_rolling_restart",
  658. config_file="default.json",
  659. hdp_stack_version = self.STACK_VERSION,
  660. target = RMFTestCase.TARGET_COMMON_SERVICES
  661. )
  662. self.fail('Invalid return code should cause a failure')
  663. except Fail,fail:
  664. self.assertTrue(process_mock.called)
  665. self.assertEqual(process_mock.call_count,12)
  666. @patch("resource_management.libraries.functions.security_commons.build_expectations")
  667. @patch("resource_management.libraries.functions.security_commons.get_params_from_filesystem")
  668. @patch("resource_management.libraries.functions.security_commons.validate_security_config_properties")
  669. @patch("resource_management.libraries.functions.security_commons.cached_kinit_executor")
  670. @patch("resource_management.libraries.script.Script.put_structured_out")
  671. def test_security_status(self, put_structured_out_mock, cached_kinit_executor_mock, validate_security_config_mock, get_params_mock, build_exp_mock):
  672. # Test that function works when is called with correct parameters
  673. security_params = {
  674. 'yarn-site': {
  675. 'yarn.nodemanager.keytab': 'path/to/nodemanager/keytab',
  676. 'yarn.nodemanager.principal': 'nodemanager_principal',
  677. 'yarn.nodemanager.webapp.spnego-keytab-file': 'path/to/nodemanager/webapp/keytab',
  678. 'yarn.nodemanager.webapp.spnego-principal': 'nodemanager_webapp_principal'
  679. }
  680. }
  681. result_issues = []
  682. props_value_check = {"yarn.timeline-service.http-authentication.type": "kerberos",
  683. "yarn.acl.enable": "true"}
  684. props_empty_check = ["yarn.nodemanager.principal",
  685. "yarn.nodemanager.keytab",
  686. "yarn.nodemanager.webapp.spnego-principal",
  687. "yarn.nodemanager.webapp.spnego-keytab-file"]
  688. props_read_check = ["yarn.nodemanager.keytab",
  689. "yarn.nodemanager.webapp.spnego-keytab-file"]
  690. get_params_mock.return_value = security_params
  691. validate_security_config_mock.return_value = result_issues
  692. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/nodemanager.py",
  693. classname="Nodemanager",
  694. command="security_status",
  695. config_file="secured.json",
  696. hdp_stack_version = self.STACK_VERSION,
  697. target = RMFTestCase.TARGET_COMMON_SERVICES
  698. )
  699. build_exp_mock.assert_called_with('yarn-site', props_value_check, props_empty_check, props_read_check)
  700. put_structured_out_mock.assert_called_with({"securityState": "SECURED_KERBEROS"})
  701. self.assertTrue(cached_kinit_executor_mock.call_count, 2)
  702. cached_kinit_executor_mock.assert_called_with('/usr/bin/kinit',
  703. self.config_dict['configurations']['yarn-env']['yarn_user'],
  704. security_params['yarn-site']['yarn.nodemanager.webapp.spnego-keytab-file'],
  705. security_params['yarn-site']['yarn.nodemanager.webapp.spnego-principal'],
  706. self.config_dict['hostname'],
  707. '/tmp')
  708. # Testing that the exception throw by cached_executor is caught
  709. cached_kinit_executor_mock.reset_mock()
  710. cached_kinit_executor_mock.side_effect = Exception("Invalid command")
  711. try:
  712. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/nodemanager.py",
  713. classname="Nodemanager",
  714. command="security_status",
  715. config_file="secured.json",
  716. hdp_stack_version = self.STACK_VERSION,
  717. target = RMFTestCase.TARGET_COMMON_SERVICES
  718. )
  719. except:
  720. self.assertTrue(True)
  721. # Testing with a security_params which doesn't contains yarn-site
  722. empty_security_params = {}
  723. cached_kinit_executor_mock.reset_mock()
  724. get_params_mock.reset_mock()
  725. put_structured_out_mock.reset_mock()
  726. get_params_mock.return_value = empty_security_params
  727. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/nodemanager.py",
  728. classname="Nodemanager",
  729. command="security_status",
  730. config_file="secured.json",
  731. hdp_stack_version = self.STACK_VERSION,
  732. target = RMFTestCase.TARGET_COMMON_SERVICES
  733. )
  734. put_structured_out_mock.assert_called_with({"securityIssuesFound": "Keytab file or principal are not set property."})
  735. # Testing with not empty result_issues
  736. result_issues_with_params = {
  737. 'yarn-site': "Something bad happened"
  738. }
  739. validate_security_config_mock.reset_mock()
  740. get_params_mock.reset_mock()
  741. validate_security_config_mock.return_value = result_issues_with_params
  742. get_params_mock.return_value = security_params
  743. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/nodemanager.py",
  744. classname="Nodemanager",
  745. command="security_status",
  746. config_file="secured.json",
  747. hdp_stack_version = self.STACK_VERSION,
  748. target = RMFTestCase.TARGET_COMMON_SERVICES
  749. )
  750. put_structured_out_mock.assert_called_with({"securityState": "UNSECURED"})
  751. # Testing with security_enable = false
  752. self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/nodemanager.py",
  753. classname="Nodemanager",
  754. command="security_status",
  755. config_file="default.json",
  756. hdp_stack_version = self.STACK_VERSION,
  757. target = RMFTestCase.TARGET_COMMON_SERVICES
  758. )
  759. put_structured_out_mock.assert_called_with({"securityState": "UNSECURED"})