configUtils.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528
  1. <?php
  2. function validateDirList($dirListStr) {
  3. $dirList = explode(",", trim($dirListStr));
  4. if (count($dirList) == 0) {
  5. return array ( "error" => "No directories specified");
  6. }
  7. $validDirCount = 0;
  8. foreach ($dirList as $d) {
  9. $dir = trim($d);
  10. if ($dir == "") {
  11. continue;
  12. }
  13. $check = validatePath($dir);
  14. if ($check["error"] != "") {
  15. return $check;
  16. }
  17. $validDirCount++;
  18. }
  19. if ($validDirCount == 0) {
  20. return array ( "error" => "No directories specified");
  21. }
  22. return array ( "error" => "");
  23. }
  24. function validatePath($pathStr) {
  25. $path = trim($pathStr);
  26. if ($path == "") {
  27. return array ( "error" => "No path specified");
  28. }
  29. if (substr($path, 0, 1) != "/") {
  30. return array ( "error" => "Directory path not absolute");
  31. }
  32. return array ( "error" => "");
  33. }
  34. function basicNumericCheck($val, $negativeAllowed = TRUE) {
  35. if (!is_numeric($val)) {
  36. return array ( "error" => "Invalid value specified, should be numeric");
  37. }
  38. if (!$negativeAllowed) {
  39. if ($val < 0) {
  40. return array ( "error" => "Invalid value specified, "
  41. . "negative values not allowed");
  42. }
  43. }
  44. return array ( "error" => "");
  45. }
  46. /**
  47. * @param mixed $configs
  48. * array (
  49. * "prop_key1" => "val1",
  50. * ...
  51. * )
  52. */
  53. function validateConfigs($svcConfigs) {
  54. $errors = array();
  55. // foreach ($configs as $svc => $svcConfigs) {
  56. foreach ($svcConfigs as $key => $val) {
  57. $val = trim($val);
  58. if ($key == "dfs_name_dir") {
  59. $check = validateDirList($val);
  60. if ($check["error"] != "") {
  61. $errors[$key] = $check;
  62. }
  63. } else if ($key == "dfs_data_dir") {
  64. $check = validateDirList($val);
  65. if ($check["error"] != "") {
  66. $errors[$key] = $check;
  67. }
  68. } else if ($key == "mapred_local_dir") {
  69. $check = validateDirList($val);
  70. if ($check["error"] != "") {
  71. $errors[$key] = $check;
  72. }
  73. } else if ($key == "oozie_data_dir") {
  74. $check = validateDirList($val);
  75. if ($check["error"] != "") {
  76. $errors[$key] = $check;
  77. }
  78. } else if ($key == "zk_data_dir") {
  79. $check = validateDirList($val);
  80. if ($check["error"] != "") {
  81. $errors[$key] = $check;
  82. }
  83. } else if ($key == "hive_mysql_host") {
  84. // TODO ??
  85. } else if ($key == "hive_database_name") {
  86. if ($val == "") {
  87. $errors[$key] = array ( "error" => "Database name cannot be empty");
  88. } else if (preg_match("/^\w+$/", $val) == 0) {
  89. $errors[$key] = array ( "error" => "Database name should only contain alphanumeric characters");
  90. }
  91. } else if ($key == "hive_metastore_user_name") {
  92. if ($val == "") {
  93. $errors[$key] = array ( "error" => "Database user name cannot be empty");
  94. } else if (preg_match("/^\w+$/", $val) == 0) {
  95. $errors[$key] = array ( "error" => "Database user name should only contain alphanumeric characters");
  96. }
  97. } else if ($key == "hive_metastore_user_passwd") {
  98. if ($val == "") {
  99. $errors[$key] = array ( "error" => "Database password cannot be empty");
  100. }
  101. } else if ($key == "java32_home") {
  102. if ($val != "") {
  103. $check = validatePath($val);
  104. if ($check["error"] != "") {
  105. $errors[$key] = $check;
  106. }
  107. }
  108. } else if ($key == "java64_home") {
  109. if ($val != "") {
  110. $check = validatePath($val);
  111. if ($check["error"] != "") {
  112. $errors[$key] = $check;
  113. }
  114. }
  115. } else if ($key == "jdk_location") {
  116. if ($val != "") {
  117. //if (filter_var($val, FILTER_VALIDATE_URL) === FALSE) {
  118. // $errors[$key] = array ( "error" => "Invalid url specified");
  119. //}
  120. }
  121. } else if ($key == "hdfs_user") {
  122. if ($val == "") {
  123. $errors[$key] = array ( "error" => "Empty user id specified");
  124. }
  125. } else if ($key == "mapred_user") {
  126. if ($val == "") {
  127. $errors[$key] = array ( "error" => "Empty user id specified");
  128. }
  129. } else if ($key == "dfs_support_append") {
  130. // TODO
  131. } else if ($key == "dfs_webhdfs_enabled") {
  132. // TODO
  133. } else if ($key == "hadoop_logdirprefix") {
  134. $check = validatePath($val);
  135. if ($check["error"] != "") {
  136. $errors[$key] = $check;
  137. }
  138. } else if ($key == "hadoop_piddirprefix") {
  139. $check = validatePath($val);
  140. if ($check["error"] != "") {
  141. $errors[$key] = $check;
  142. }
  143. } else if ($key == "scheduler_name") {
  144. // TODO check for valid scheduler names?
  145. } else if ($key == "hbase_log_dir") {
  146. $check = validatePath($val);
  147. if ($check["error"] != "") {
  148. $errors[$key] = $check;
  149. }
  150. } else if ($key == "hbase_pid_dir") {
  151. $check = validatePath($val);
  152. if ($check["error"] != "") {
  153. $errors[$key] = $check;
  154. }
  155. } else if ($key == "hbase_user") {
  156. if ($val == "") {
  157. $errors[$key] = array ( "error" => "Empty user id specified");
  158. }
  159. } else if ($key == "zk_log_dir") {
  160. $check = validatePath($val);
  161. if ($check["error"] != "") {
  162. $errors[$key] = $check;
  163. }
  164. } else if ($key == "zk_pid_dir") {
  165. $check = validatePath($val);
  166. if ($check["error"] != "") {
  167. $errors[$key] = $check;
  168. }
  169. } else if ($key == "zk_user") {
  170. if ($val == "") {
  171. $errors[$key] = array ( "error" => "Empty user id specified");
  172. }
  173. } else if ($key == "hcat_logdirprefix") {
  174. } else if ($key == "hcat_user") {
  175. if ($val == "") {
  176. $errors[$key] = array ( "error" => "Empty user id specified");
  177. }
  178. } else if ($key == "templeton_user") {
  179. if ($val == "") {
  180. $errors[$key] = array ( "error" => "Empty user id specified");
  181. }
  182. } else if ($key == "templeton_pid_dir") {
  183. $check = validatePath($val);
  184. if ($check["error"] != "") {
  185. $errors[$key] = $check;
  186. }
  187. } else if ($key == "templeton_log_dir") {
  188. $check = validatePath($val);
  189. if ($check["error"] != "") {
  190. $errors[$key] = $check;
  191. }
  192. } else if ($key == "oozie_log_dir") {
  193. $check = validatePath($val);
  194. if ($check["error"] != "") {
  195. $errors[$key] = $check;
  196. }
  197. } else if ($key == "oozie_pid_dir") {
  198. $check = validatePath($val);
  199. if ($check["error"] != "") {
  200. $errors[$key] = $check;
  201. }
  202. } else if ($key == "oozie_user") {
  203. if ($val == "") {
  204. $errors[$key] = array ( "error" => "Empty user id specified");
  205. }
  206. } else if ($key == "nagios_web_login") {
  207. if ($val == "") {
  208. $errors[$key] = array ( "error" => "No nagios web login specified");
  209. }
  210. } else if ($key == "nagios_web_password") {
  211. if ($val == "") {
  212. $errors[$key] = array ( "error" => "No nagios web password specified");
  213. }
  214. } else if ($key == "nagios_contact") {
  215. if ($val == "") {
  216. $errors[$key] = array ( "error" => "Empty nagios contact specified");
  217. } else if (0 == preg_match("/^(\w+((-\w+)|(\w.\w+))*)\@(\w+((\.|-)\w+)*\.\w+$)/",$val)) {
  218. $errors[$key] = array ( "error" => "Not a valid email address");
  219. }
  220. } else if ($key == "hadoop_heapsize") {
  221. $check = basicNumericCheck($val, FALSE);
  222. if ($check["error"] != "") {
  223. $errors[$key] = $check;
  224. }
  225. } else if ($key == "namenode_heapsize") {
  226. $check = basicNumericCheck($val, FALSE);
  227. if ($check["error"] != "") {
  228. $errors[$key] = $check;
  229. }
  230. } else if ($key == "namenode_opt_newsize") {
  231. $check = basicNumericCheck($val, FALSE);
  232. if ($check["error"] != "") {
  233. $errors[$key] = $check;
  234. }
  235. } else if ($key == "datanode_du_reserved") {
  236. $check = basicNumericCheck($val, FALSE);
  237. if ($check["error"] != "") {
  238. $errors[$key] = $check;
  239. }
  240. } else if ($key == "dtnode_heapsize") {
  241. $check = basicNumericCheck($val, FALSE);
  242. if ($check["error"] != "") {
  243. $errors[$key] = $check;
  244. }
  245. } else if ($key == "jtnode_opt_newsize") {
  246. $check = basicNumericCheck($val, FALSE);
  247. if ($check["error"] != "") {
  248. $errors[$key] = $check;
  249. }
  250. } else if ($key == "jtnode_opt_maxnewsize") {
  251. $check = basicNumericCheck($val, FALSE);
  252. if ($check["error"] != "") {
  253. $errors[$key] = $check;
  254. }
  255. } else if ($key == "jtnode_heapsize") {
  256. $check = basicNumericCheck($val, FALSE);
  257. if ($check["error"] != "") {
  258. $errors[$key] = $check;
  259. }
  260. } else if ($key == "mapred_map_tasks_max") {
  261. $check = basicNumericCheck($val);
  262. if ($check["error"] != "") {
  263. $errors[$key] = $check;
  264. }
  265. } else if ($key == "mapred_red_tasks_max") {
  266. $check = basicNumericCheck($val);
  267. if ($check["error"] != "") {
  268. $errors[$key] = $check;
  269. }
  270. } else if ($key == "mapred_cluster_map_mem_mb") {
  271. $check = basicNumericCheck($val);
  272. if ($check["error"] != "") {
  273. $errors[$key] = $check;
  274. }
  275. } else if ($key == "mapred_cluster_red_mem_mb") {
  276. $check = basicNumericCheck($val);
  277. if ($check["error"] != "") {
  278. $errors[$key] = $check;
  279. }
  280. } else if ($key == "mapred_cluster_max_map_mem_mb") {
  281. $check = basicNumericCheck($val);
  282. if ($check["error"] != "") {
  283. $errors[$key] = $check;
  284. }
  285. } else if ($key == "mapred_cluster_max_red_mem_mb") {
  286. $check = basicNumericCheck($val);
  287. if ($check["error"] != "") {
  288. $errors[$key] = $check;
  289. }
  290. } else if ($key == "mapred_job_map_mem_mb") {
  291. $check = basicNumericCheck($val);
  292. if ($check["error"] != "") {
  293. $errors[$key] = $check;
  294. }
  295. } else if ($key == "mapred_job_red_mem_mb") {
  296. $check = basicNumericCheck($val);
  297. if ($check["error"] != "") {
  298. $errors[$key] = $check;
  299. }
  300. } else if ($key == "mapred_child_java_opts_sz") {
  301. $check = basicNumericCheck($val, FALSE);
  302. if ($check["error"] != "") {
  303. $errors[$key] = $check;
  304. }
  305. } else if ($key == "io_sort_mb") {
  306. $check = basicNumericCheck($val, FALSE);
  307. if ($check["error"] != "") {
  308. $errors[$key] = $check;
  309. }
  310. } else if ($key == "io_sort_spill_percent") {
  311. $check = basicNumericCheck($val, FALSE);
  312. if ($check["error"] != "") {
  313. $errors[$key] = $check;
  314. }
  315. } else if ($key == "mapreduce_userlog_retainhours") {
  316. $check = basicNumericCheck($val);
  317. if ($check["error"] != "") {
  318. $errors[$key] = $check;
  319. }
  320. } else if ($key == "maxtasks_per_job") {
  321. $check = basicNumericCheck($val);
  322. if ($check["error"] != "") {
  323. $errors[$key] = $check;
  324. }
  325. } else if ($key == "dfs_datanode_failed_volume_tolerated") {
  326. $check = basicNumericCheck($val, FALSE);
  327. if ($check["error"] != "") {
  328. $errors[$key] = $check;
  329. }
  330. } else if ($key == "tickTime") {
  331. $check = basicNumericCheck($val, FALSE);
  332. if ($check["error"] != "") {
  333. $errors[$key] = $check;
  334. }
  335. } else if ($key == "initLimit") {
  336. $check = basicNumericCheck($val, FALSE);
  337. if ($check["error"] != "") {
  338. $errors[$key] = $check;
  339. }
  340. } else if ($key == "syncLimit") {
  341. $check = basicNumericCheck($val, FALSE);
  342. if ($check["error"] != "") {
  343. $errors[$key] = $check;
  344. }
  345. } else if ($key == "clientPort") {
  346. $check = basicNumericCheck($val, FALSE);
  347. if ($check["error"] != "") {
  348. $errors[$key] = $check;
  349. }
  350. } else if ($key == "hbase_master_heapsize") {
  351. $check = basicNumericCheck($val, FALSE);
  352. if ($check["error"] != "") {
  353. $errors[$key] = $check;
  354. }
  355. } else if ($key == "hbase_regionserver_heapsize") {
  356. $check = basicNumericCheck($val, FALSE);
  357. if ($check["error"] != "") {
  358. $errors[$key] = $check;
  359. }
  360. } else if ($key == "lzo_enabled") {
  361. if ($val != "true" && $val != "false") {
  362. $errors[$key] = array ( "error" => "Invalid value, only true/false allowed");
  363. }
  364. } else if ($key == "snappy_enabled") {
  365. if ($val != "true" && $val != "false") {
  366. $errors[$key] = array ( "error" => "Invalid value, only true/false allowed");
  367. }
  368. }
  369. /*
  370. hive_mysql_host|
  371. hive_database_name|
  372. hive_metastore_user_name|
  373. hive_metastore_user_passwd|
  374. java32_home|
  375. java64_home|
  376. jdk_location|
  377. dfs_support_append|true
  378. dfs_webhdfs_enabled|false
  379. scheduler_name|org.apache.hadoop.mapred.CapacityTaskScheduler
  380. nagios_web_login|nagiosadmin
  381. nagios_web_password|admin
  382. nagios_contact|nagiosadmin@hortonworks.com
  383. hadoop_heapsize|1024
  384. namenode_heapsize|1024
  385. namenode_opt_newsize|200
  386. datanode_du_reserved|1073741824
  387. dtnode_heapsize|1024
  388. jtnode_opt_newsize|200
  389. jtnode_opt_maxnewsize|200
  390. jtnode_heapsize|1024
  391. mapred_map_tasks_max|4
  392. mapred_red_tasks_max|2
  393. mapred_cluster_map_mem_mb|-1
  394. mapred_cluster_red_mem_mb|-1
  395. mapred_cluster_max_map_mem_mb|-1
  396. mapred_cluster_max_red_mem_mb|-1
  397. mapred_job_map_mem_mb|-1
  398. mapred_job_red_mem_mb|-1
  399. mapred_child_java_opts_sz|768
  400. io_sort_mb|200
  401. io_sort_spill_percent|0.9
  402. mapreduce_userlog_retainhours|24
  403. maxtasks_per_job|-1
  404. dfs_datanode_failed_volume_tolerated|0
  405. tickTime|2000
  406. initLimit|10
  407. syncLimit|5
  408. clientPort|2181
  409. hbase_master_heapsize|1024
  410. hbase_regionserver_heapsize|1024
  411. */
  412. }
  413. // }
  414. $result = 0;
  415. if (!empty($errors)) {
  416. $result = -1;
  417. }
  418. return array ( "result" => $result, "properties" => $errors );
  419. }
  420. ////////////Helper function definitions
  421. function handleHiveMysql($clusterName, &$finalProperties,
  422. $dbAccessor, $logHandle) {
  423. $services = $dbAccessor->getAllServicesInfo($clusterName);
  424. $hostForMysql = $dbAccessor->getHostsForComponent($clusterName, "HIVE_MYSQL");
  425. if ( ($services["services"]["HIVE"]["isEnabled"] == 1) &&
  426. (empty($finalProperties["hive_mysql_host"])) && (empty($hostForMysql["hosts"])) ) {
  427. $logHandle->log_debug("Hive is enabled but mysql server is not set, set it up on hive server itself");
  428. $hostComponents = $dbAccessor->getHostsForComponent($clusterName, "HIVE_SERVER");
  429. $hiveServerHosts = array_keys($hostComponents["hosts"]);
  430. $finalProperties["hive_mysql_host"] = "localhost";
  431. $dbAccessor->addHostsToComponent($clusterName, "HIVE_MYSQL",
  432. $hiveServerHosts, "ASSIGNED", "");
  433. }
  434. }
  435. /*
  436. * Trim each of the entries in a comma-separated list
  437. */
  438. function trimDirList($dirListStr) {
  439. $dirList = explode(",", $dirListStr);
  440. if (count($dirList) == 0) {
  441. return "";
  442. }
  443. $sanitizedDirs = array();
  444. foreach ($dirList as $dir) {
  445. $d = trim($dir);
  446. if ($d != "") {
  447. array_push($sanitizedDirs, $d);
  448. }
  449. }
  450. return implode(",", $sanitizedDirs);
  451. }
  452. /**
  453. * Basic trimming, conversion into required array format to update DB
  454. * @param mixed $requestObjFromUser
  455. */
  456. function sanitizeConfigs($requestObjFromUser, $logger) {
  457. $finalProperties = array();
  458. foreach ($requestObjFromUser as $serviceName=>$objects) {
  459. $allProps = $objects["properties"];
  460. foreach ($allProps as $key => $valueObj) {
  461. $val = trim($valueObj["value"]);
  462. $finalProperties[$key] = $val;
  463. if ($key == "dfs_name_dir"
  464. || $key == "dfs_data_dir"
  465. || $key == "mapred_local_dir"
  466. || $key == "oozie_data_dir"
  467. || $key == "zk_data_dir") {
  468. $finalProperties[$key] = trimDirList($val);
  469. } else if ($key == "lzo_enabled"
  470. || $key == "snappy_enabled") {
  471. $finalProperties[$key] = strtolower($val);
  472. }
  473. }
  474. }
  475. return $finalProperties;
  476. }
  477. // Reused in reConfigure
  478. function validateAndPersistConfigsFromUser($dbAccessor, $logger, $clusterName, $requestObjFromUser) {
  479. // sanitize and persist the user entered configs *******
  480. $finalProperties = sanitizeConfigs($requestObjFromUser, $logger);
  481. //Additional services that need to be enabled based on configuration.
  482. //Hack to handle mysql for hive
  483. handleHiveMysql($clusterName, $finalProperties, $dbAccessor, $logger);
  484. // Validate/verify configs
  485. $cfgResult = validateConfigs($finalProperties);
  486. $suggestProperties = new SuggestProperties();
  487. $cfgSuggestResult = $suggestProperties->verifyProperties($clusterName, $dbAccessor, $finalProperties);
  488. if ($cfgResult["result"] != 0 || $cfgSuggestResult["result"] != 0) {
  489. $mergedErrors = array( "result" => 1, "error" => "Invalid Configs",
  490. "properties" => array());
  491. if (isset($cfgResult["properties"])) {
  492. $mergedErrors["properties"] = $cfgResult["properties"];
  493. }
  494. if (isset($cfgSuggestResult["cfgErrors"])) {
  495. foreach ($cfgSuggestResult["cfgErrors"] as $propKey => $errInfo) {
  496. $mergedErrors["properties"][$propKey] = $errInfo;
  497. }
  498. }
  499. /* TODO - need to handle values with warnings - do we want to tell users they are using above recommended settings? */
  500. $logger->log_info("Got error when validating configs");
  501. return $mergedErrors;
  502. }
  503. $dbResponse = $dbAccessor->updateServiceConfigs($clusterName, $finalProperties);
  504. if ($dbResponse["result"] != 0) {
  505. $logger->log_error("Got error while persisting configs: ".$dbResponse["error"]);
  506. return $dbResponse;
  507. }
  508. // finished persisting the configs *******
  509. return array("result" => 0, "error" => 0);
  510. }
  511. ?>