test_nodemanager.py 32 KB

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