PageRenderTime 53ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/src/common/slurmdb_defs.c

https://github.com/cfenoy/slurm
C | 2239 lines | 1822 code | 290 blank | 127 comment | 507 complexity | 70f454b31f96ed22c9f37cefbd52d559 MD5 | raw file
Possible License(s): GPL-2.0, AGPL-1.0

Large files files are truncated, but you can click here to view the full file

  1. /*****************************************************************************\
  2. * slurmdb_defs.c - definitions used by slurmdb api
  3. ******************************************************************************
  4. * Copyright (C) 2010 Lawrence Livermore National Security.
  5. * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
  6. * Written by Danny Auble da@llnl.gov, et. al.
  7. * CODE-OCEC-09-009. All rights reserved.
  8. *
  9. * This file is part of SLURM, a resource management program.
  10. * For details, see <http://www.schedmd.com/slurmdocs/>.
  11. * Please also read the included file: DISCLAIMER.
  12. *
  13. * SLURM is free software; you can redistribute it and/or modify it under
  14. * the terms of the GNU General Public License as published by the Free
  15. * Software Foundation; either version 2 of the License, or (at your option)
  16. * any later version.
  17. *
  18. * In addition, as a special exception, the copyright holders give permission
  19. * to link the code of portions of this program with the OpenSSL library under
  20. * certain conditions as described in each individual source file, and
  21. * distribute linked combinations including the two. You must obey the GNU
  22. * General Public License in all respects for all of the code used other than
  23. * OpenSSL. If you modify file(s) with this exception, you may extend this
  24. * exception to your version of the file(s), but you are not obligated to do
  25. * so. If you do not wish to do so, delete this exception statement from your
  26. * version. If you delete this exception statement from all source files in
  27. * the program, then also delete it here.
  28. *
  29. * SLURM is distributed in the hope that it will be useful, but WITHOUT ANY
  30. * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  31. * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  32. * details.
  33. *
  34. * You should have received a copy of the GNU General Public License along
  35. * with SLURM; if not, write to the Free Software Foundation, Inc.,
  36. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  37. \*****************************************************************************/
  38. #include <stdlib.h>
  39. #include "src/common/slurmdb_defs.h"
  40. #include "src/common/assoc_mgr.h"
  41. #include "src/common/xmalloc.h"
  42. #include "src/common/xstring.h"
  43. #include "src/common/slurm_strcasestr.h"
  44. #include "src/common/slurm_protocol_defs.h"
  45. #include "src/common/parse_time.h"
  46. #include "src/common/node_select.h"
  47. #include "src/common/slurm_auth.h"
  48. #include "src/slurmdbd/read_config.h"
  49. slurmdb_cluster_rec_t *working_cluster_rec = NULL;
  50. static void _free_assoc_rec_members(slurmdb_association_rec_t *assoc)
  51. {
  52. if (assoc) {
  53. if(assoc->accounting_list)
  54. list_destroy(assoc->accounting_list);
  55. xfree(assoc->acct);
  56. xfree(assoc->cluster);
  57. xfree(assoc->parent_acct);
  58. xfree(assoc->partition);
  59. if(assoc->qos_list)
  60. list_destroy(assoc->qos_list);
  61. xfree(assoc->user);
  62. destroy_assoc_mgr_association_usage(assoc->usage);
  63. }
  64. }
  65. static void _free_cluster_rec_members(slurmdb_cluster_rec_t *cluster)
  66. {
  67. if (cluster) {
  68. if(cluster->accounting_list)
  69. list_destroy(cluster->accounting_list);
  70. xfree(cluster->control_host);
  71. xfree(cluster->dim_size);
  72. xfree(cluster->name);
  73. xfree(cluster->nodes);
  74. slurmdb_destroy_association_rec(cluster->root_assoc);
  75. }
  76. }
  77. static void _free_qos_rec_members(slurmdb_qos_rec_t *qos)
  78. {
  79. if (qos) {
  80. xfree(qos->description);
  81. xfree(qos->name);
  82. FREE_NULL_BITMAP(qos->preempt_bitstr);
  83. if(qos->preempt_list)
  84. list_destroy(qos->preempt_list);
  85. destroy_assoc_mgr_qos_usage(qos->usage);
  86. }
  87. }
  88. static void _free_wckey_rec_members(slurmdb_wckey_rec_t *wckey)
  89. {
  90. if (wckey) {
  91. if(wckey->accounting_list)
  92. list_destroy(wckey->accounting_list);
  93. xfree(wckey->cluster);
  94. xfree(wckey->name);
  95. xfree(wckey->user);
  96. }
  97. }
  98. static void _free_cluster_cond_members(slurmdb_cluster_cond_t *cluster_cond)
  99. {
  100. if (cluster_cond) {
  101. if (cluster_cond->cluster_list)
  102. list_destroy(cluster_cond->cluster_list);
  103. }
  104. }
  105. /*
  106. * Comparator used for sorting immediate childern of acct_hierarchical_recs
  107. *
  108. * returns: -1: assoc_a > assoc_b 0: assoc_a == assoc_b 1: assoc_a < assoc_b
  109. *
  110. */
  111. static int _sort_childern_list(slurmdb_hierarchical_rec_t *assoc_a,
  112. slurmdb_hierarchical_rec_t *assoc_b)
  113. {
  114. int diff = 0;
  115. /* Since all these assocations are on the same level we don't
  116. * have to check the lfts
  117. */
  118. /* check to see if this is a user association or an account.
  119. * We want the accounts at the bottom
  120. */
  121. if(assoc_a->assoc->user && !assoc_b->assoc->user)
  122. return -1;
  123. else if(!assoc_a->assoc->user && assoc_b->assoc->user)
  124. return 1;
  125. /* Sort by alpha */
  126. diff = strcmp(assoc_a->sort_name, assoc_b->sort_name);
  127. if (diff < 0)
  128. return -1;
  129. else if (diff > 0)
  130. return 1;
  131. return 0;
  132. }
  133. /*
  134. * Comparator used for sorting immediate childern of acct_hierarchical_recs
  135. *
  136. * returns: -1: assoc_a > assoc_b 0: assoc_a == assoc_b 1: assoc_a < assoc_b
  137. *
  138. */
  139. static int _sort_assoc_by_lft_dec(slurmdb_association_rec_t *assoc_a,
  140. slurmdb_association_rec_t *assoc_b)
  141. {
  142. if(assoc_a->lft > assoc_b->lft)
  143. return 1;
  144. return -1;
  145. }
  146. static int _sort_slurmdb_hierarchical_rec_list(
  147. List slurmdb_hierarchical_rec_list)
  148. {
  149. slurmdb_hierarchical_rec_t *slurmdb_hierarchical_rec = NULL;
  150. ListIterator itr;
  151. if(!list_count(slurmdb_hierarchical_rec_list))
  152. return SLURM_SUCCESS;
  153. list_sort(slurmdb_hierarchical_rec_list, (ListCmpF)_sort_childern_list);
  154. itr = list_iterator_create(slurmdb_hierarchical_rec_list);
  155. while((slurmdb_hierarchical_rec = list_next(itr))) {
  156. if(list_count(slurmdb_hierarchical_rec->childern))
  157. _sort_slurmdb_hierarchical_rec_list(
  158. slurmdb_hierarchical_rec->childern);
  159. }
  160. list_iterator_destroy(itr);
  161. return SLURM_SUCCESS;
  162. }
  163. static int _append_hierarchical_childern_ret_list(
  164. List ret_list, List slurmdb_hierarchical_rec_list)
  165. {
  166. slurmdb_hierarchical_rec_t *slurmdb_hierarchical_rec = NULL;
  167. ListIterator itr;
  168. if(!ret_list)
  169. return SLURM_ERROR;
  170. if(!list_count(slurmdb_hierarchical_rec_list))
  171. return SLURM_SUCCESS;
  172. itr = list_iterator_create(slurmdb_hierarchical_rec_list);
  173. while((slurmdb_hierarchical_rec = list_next(itr))) {
  174. list_append(ret_list, slurmdb_hierarchical_rec->assoc);
  175. if(list_count(slurmdb_hierarchical_rec->childern))
  176. _append_hierarchical_childern_ret_list(
  177. ret_list, slurmdb_hierarchical_rec->childern);
  178. }
  179. list_iterator_destroy(itr);
  180. return SLURM_SUCCESS;
  181. }
  182. static char *_get_qos_list_str(List qos_list)
  183. {
  184. char *qos_char = NULL;
  185. ListIterator itr = NULL;
  186. slurmdb_qos_rec_t *qos = NULL;
  187. if(!qos_list)
  188. return NULL;
  189. itr = list_iterator_create(qos_list);
  190. while((qos = list_next(itr))) {
  191. if(qos_char)
  192. xstrfmtcat(qos_char, ",%s", qos->name);
  193. else
  194. xstrcat(qos_char, qos->name);
  195. }
  196. list_iterator_destroy(itr);
  197. return qos_char;
  198. }
  199. static int _setup_cluster_rec(slurmdb_cluster_rec_t *cluster_rec)
  200. {
  201. int plugin_id_select = 0;
  202. xassert(cluster_rec);
  203. if (!cluster_rec->control_port) {
  204. debug("Slurmctld on '%s' hasn't registered yet.",
  205. cluster_rec->name);
  206. return SLURM_ERROR;
  207. }
  208. if (cluster_rec->rpc_version < 8) {
  209. debug("Slurmctld on '%s' must be running at least "
  210. "SLURM 2.2 for cross-cluster communication.",
  211. cluster_rec->name);
  212. return SLURM_ERROR;
  213. }
  214. if ((plugin_id_select = select_get_plugin_id_pos(
  215. cluster_rec->plugin_id_select)) == SLURM_ERROR) {
  216. error("Cluster '%s' has an unknown select plugin_id %u",
  217. cluster_rec->name,
  218. cluster_rec->plugin_id_select);
  219. return SLURM_ERROR;
  220. }
  221. cluster_rec->plugin_id_select = plugin_id_select;
  222. slurm_set_addr(&cluster_rec->control_addr,
  223. cluster_rec->control_port,
  224. cluster_rec->control_host);
  225. if (cluster_rec->control_addr.sin_port == 0) {
  226. error("Unable to establish control "
  227. "machine address for '%s'(%s:%u)",
  228. cluster_rec->name,
  229. cluster_rec->control_host,
  230. cluster_rec->control_port);
  231. return SLURM_ERROR;
  232. }
  233. if (cluster_rec->dimensions > 1) {
  234. int number, i, len;
  235. char *nodes = cluster_rec->nodes;
  236. cluster_rec->dim_size = xmalloc(sizeof(int) *
  237. cluster_rec->dimensions);
  238. len = strlen(nodes);
  239. i = len - cluster_rec->dimensions;
  240. if (nodes[len-1] == ']')
  241. i--;
  242. if (i > 0) {
  243. char *p = '\0';
  244. number = xstrntol(nodes + i, &p,
  245. cluster_rec->dimensions, 36);
  246. hostlist_parse_int_to_array(
  247. number, cluster_rec->dim_size,
  248. cluster_rec->dimensions, 36);
  249. /* all calculations this is for should
  250. * be expecting 0 not to count as a
  251. * number so add 1 to it. */
  252. for (i=0; i<cluster_rec->dimensions; i++)
  253. cluster_rec->dim_size[i]++;
  254. }
  255. }
  256. return SLURM_SUCCESS;
  257. }
  258. static uint32_t _str_2_qos_flags(char *flags)
  259. {
  260. if (slurm_strcasestr(flags, "DenyOnLimit"))
  261. return QOS_FLAG_DENY_LIMIT;
  262. if (slurm_strcasestr(flags, "EnforceUsageThreshold"))
  263. return QOS_FLAG_ENFORCE_USAGE_THRES;
  264. if (slurm_strcasestr(flags, "PartitionMinNodes"))
  265. return QOS_FLAG_PART_MIN_NODE;
  266. if (slurm_strcasestr(flags, "PartitionMaxNodes"))
  267. return QOS_FLAG_PART_MAX_NODE;
  268. if (slurm_strcasestr(flags, "PartitionTimeLimit"))
  269. return QOS_FLAG_PART_TIME_LIMIT;
  270. if (slurm_strcasestr(flags, "RequiresReservation"))
  271. return QOS_FLAG_REQ_RESV;
  272. if (slurm_strcasestr(flags, "NoReserve"))
  273. return QOS_FLAG_NO_RESERVE;
  274. return 0;
  275. }
  276. extern slurmdb_job_rec_t *slurmdb_create_job_rec()
  277. {
  278. slurmdb_job_rec_t *job = xmalloc(sizeof(slurmdb_job_rec_t));
  279. memset(&job->stats, 0, sizeof(slurmdb_stats_t));
  280. job->derived_ec = NO_VAL;
  281. job->stats.cpu_min = NO_VAL;
  282. job->state = JOB_PENDING;
  283. job->steps = list_create(slurmdb_destroy_step_rec);
  284. job->requid = -1;
  285. job->lft = (uint32_t)NO_VAL;
  286. job->resvid = (uint32_t)NO_VAL;
  287. return job;
  288. }
  289. extern slurmdb_step_rec_t *slurmdb_create_step_rec()
  290. {
  291. slurmdb_step_rec_t *step = xmalloc(sizeof(slurmdb_step_rec_t));
  292. memset(&step->stats, 0, sizeof(slurmdb_stats_t));
  293. step->stepid = (uint32_t)NO_VAL;
  294. step->state = NO_VAL;
  295. step->exitcode = NO_VAL;
  296. step->ncpus = (uint32_t)NO_VAL;
  297. step->elapsed = (uint32_t)NO_VAL;
  298. step->tot_cpu_sec = (uint32_t)NO_VAL;
  299. step->tot_cpu_usec = (uint32_t)NO_VAL;
  300. step->requid = -1;
  301. return step;
  302. }
  303. extern void slurmdb_destroy_user_rec(void *object)
  304. {
  305. slurmdb_user_rec_t *slurmdb_user = (slurmdb_user_rec_t *)object;
  306. if(slurmdb_user) {
  307. if(slurmdb_user->assoc_list)
  308. list_destroy(slurmdb_user->assoc_list);
  309. if(slurmdb_user->coord_accts)
  310. list_destroy(slurmdb_user->coord_accts);
  311. xfree(slurmdb_user->default_acct);
  312. xfree(slurmdb_user->default_wckey);
  313. xfree(slurmdb_user->name);
  314. xfree(slurmdb_user->old_name);
  315. if(slurmdb_user->wckey_list)
  316. list_destroy(slurmdb_user->wckey_list);
  317. xfree(slurmdb_user);
  318. }
  319. }
  320. extern void slurmdb_destroy_account_rec(void *object)
  321. {
  322. slurmdb_account_rec_t *slurmdb_account =
  323. (slurmdb_account_rec_t *)object;
  324. if(slurmdb_account) {
  325. if(slurmdb_account->assoc_list)
  326. list_destroy(slurmdb_account->assoc_list);
  327. if(slurmdb_account->coordinators)
  328. list_destroy(slurmdb_account->coordinators);
  329. xfree(slurmdb_account->description);
  330. xfree(slurmdb_account->name);
  331. xfree(slurmdb_account->organization);
  332. xfree(slurmdb_account);
  333. }
  334. }
  335. extern void slurmdb_destroy_coord_rec(void *object)
  336. {
  337. slurmdb_coord_rec_t *slurmdb_coord =
  338. (slurmdb_coord_rec_t *)object;
  339. if(slurmdb_coord) {
  340. xfree(slurmdb_coord->name);
  341. xfree(slurmdb_coord);
  342. }
  343. }
  344. extern void slurmdb_destroy_cluster_accounting_rec(void *object)
  345. {
  346. slurmdb_cluster_accounting_rec_t *clusteracct_rec =
  347. (slurmdb_cluster_accounting_rec_t *)object;
  348. if(clusteracct_rec) {
  349. xfree(clusteracct_rec);
  350. }
  351. }
  352. extern void slurmdb_destroy_cluster_rec(void *object)
  353. {
  354. slurmdb_cluster_rec_t *slurmdb_cluster =
  355. (slurmdb_cluster_rec_t *)object;
  356. if(slurmdb_cluster) {
  357. _free_cluster_rec_members(slurmdb_cluster);
  358. xfree(slurmdb_cluster);
  359. }
  360. }
  361. extern void slurmdb_destroy_accounting_rec(void *object)
  362. {
  363. slurmdb_accounting_rec_t *slurmdb_accounting =
  364. (slurmdb_accounting_rec_t *)object;
  365. if(slurmdb_accounting) {
  366. xfree(slurmdb_accounting);
  367. }
  368. }
  369. extern void slurmdb_destroy_association_rec(void *object)
  370. {
  371. slurmdb_association_rec_t *slurmdb_association =
  372. (slurmdb_association_rec_t *)object;
  373. if(slurmdb_association) {
  374. _free_assoc_rec_members(slurmdb_association);
  375. xfree(slurmdb_association);
  376. }
  377. }
  378. extern void slurmdb_destroy_event_rec(void *object)
  379. {
  380. slurmdb_event_rec_t *slurmdb_event =
  381. (slurmdb_event_rec_t *)object;
  382. if(slurmdb_event) {
  383. xfree(slurmdb_event->cluster);
  384. xfree(slurmdb_event->cluster_nodes);
  385. xfree(slurmdb_event->node_name);
  386. xfree(slurmdb_event->reason);
  387. xfree(slurmdb_event);
  388. }
  389. }
  390. extern void slurmdb_destroy_job_rec(void *object)
  391. {
  392. slurmdb_job_rec_t *job = (slurmdb_job_rec_t *)object;
  393. if (job) {
  394. xfree(job->account);
  395. xfree(job->blockid);
  396. xfree(job->cluster);
  397. xfree(job->derived_es);
  398. xfree(job->jobname);
  399. xfree(job->partition);
  400. xfree(job->nodes);
  401. if(job->steps) {
  402. list_destroy(job->steps);
  403. job->steps = NULL;
  404. }
  405. xfree(job->user);
  406. xfree(job->wckey);
  407. xfree(job);
  408. }
  409. }
  410. extern void slurmdb_destroy_qos_rec(void *object)
  411. {
  412. slurmdb_qos_rec_t *slurmdb_qos = (slurmdb_qos_rec_t *)object;
  413. if(slurmdb_qos) {
  414. _free_qos_rec_members(slurmdb_qos);
  415. xfree(slurmdb_qos);
  416. }
  417. }
  418. extern void slurmdb_destroy_reservation_rec(void *object)
  419. {
  420. slurmdb_reservation_rec_t *slurmdb_resv =
  421. (slurmdb_reservation_rec_t *)object;
  422. if(slurmdb_resv) {
  423. xfree(slurmdb_resv->assocs);
  424. xfree(slurmdb_resv->cluster);
  425. xfree(slurmdb_resv->name);
  426. xfree(slurmdb_resv->nodes);
  427. xfree(slurmdb_resv->node_inx);
  428. xfree(slurmdb_resv);
  429. }
  430. }
  431. extern void slurmdb_destroy_step_rec(void *object)
  432. {
  433. slurmdb_step_rec_t *step = (slurmdb_step_rec_t *)object;
  434. if (step) {
  435. xfree(step->nodes);
  436. xfree(step->pid_str);
  437. xfree(step->stepname);
  438. xfree(step);
  439. }
  440. }
  441. extern void slurmdb_destroy_txn_rec(void *object)
  442. {
  443. slurmdb_txn_rec_t *slurmdb_txn = (slurmdb_txn_rec_t *)object;
  444. if(slurmdb_txn) {
  445. xfree(slurmdb_txn->accts);
  446. xfree(slurmdb_txn->actor_name);
  447. xfree(slurmdb_txn->clusters);
  448. xfree(slurmdb_txn->set_info);
  449. xfree(slurmdb_txn->users);
  450. xfree(slurmdb_txn->where_query);
  451. xfree(slurmdb_txn);
  452. }
  453. }
  454. extern void slurmdb_destroy_wckey_rec(void *object)
  455. {
  456. slurmdb_wckey_rec_t *wckey = (slurmdb_wckey_rec_t *)object;
  457. if(wckey) {
  458. _free_wckey_rec_members(wckey);
  459. xfree(wckey);
  460. }
  461. }
  462. extern void slurmdb_destroy_archive_rec(void *object)
  463. {
  464. slurmdb_archive_rec_t *arch_rec = (slurmdb_archive_rec_t *)object;
  465. if(arch_rec) {
  466. xfree(arch_rec->archive_file);
  467. xfree(arch_rec->insert);
  468. xfree(arch_rec);
  469. }
  470. }
  471. extern void slurmdb_destroy_report_assoc_rec(void *object)
  472. {
  473. slurmdb_report_assoc_rec_t *slurmdb_report_assoc =
  474. (slurmdb_report_assoc_rec_t *)object;
  475. if(slurmdb_report_assoc) {
  476. xfree(slurmdb_report_assoc->acct);
  477. xfree(slurmdb_report_assoc->cluster);
  478. xfree(slurmdb_report_assoc->parent_acct);
  479. xfree(slurmdb_report_assoc->user);
  480. xfree(slurmdb_report_assoc);
  481. }
  482. }
  483. extern void slurmdb_destroy_report_user_rec(void *object)
  484. {
  485. slurmdb_report_user_rec_t *slurmdb_report_user =
  486. (slurmdb_report_user_rec_t *)object;
  487. if(slurmdb_report_user) {
  488. xfree(slurmdb_report_user->acct);
  489. if(slurmdb_report_user->acct_list)
  490. list_destroy(slurmdb_report_user->acct_list);
  491. if(slurmdb_report_user->assoc_list)
  492. list_destroy(slurmdb_report_user->assoc_list);
  493. xfree(slurmdb_report_user->name);
  494. xfree(slurmdb_report_user);
  495. }
  496. }
  497. extern void slurmdb_destroy_report_cluster_rec(void *object)
  498. {
  499. slurmdb_report_cluster_rec_t *slurmdb_report_cluster =
  500. (slurmdb_report_cluster_rec_t *)object;
  501. if(slurmdb_report_cluster) {
  502. if(slurmdb_report_cluster->assoc_list)
  503. list_destroy(slurmdb_report_cluster->assoc_list);
  504. xfree(slurmdb_report_cluster->name);
  505. if(slurmdb_report_cluster->user_list)
  506. list_destroy(slurmdb_report_cluster->user_list);
  507. xfree(slurmdb_report_cluster);
  508. }
  509. }
  510. extern void slurmdb_destroy_user_cond(void *object)
  511. {
  512. slurmdb_user_cond_t *slurmdb_user = (slurmdb_user_cond_t *)object;
  513. if(slurmdb_user) {
  514. slurmdb_destroy_association_cond(slurmdb_user->assoc_cond);
  515. if(slurmdb_user->def_acct_list)
  516. list_destroy(slurmdb_user->def_acct_list);
  517. if(slurmdb_user->def_wckey_list)
  518. list_destroy(slurmdb_user->def_wckey_list);
  519. xfree(slurmdb_user);
  520. }
  521. }
  522. extern void slurmdb_destroy_account_cond(void *object)
  523. {
  524. slurmdb_account_cond_t *slurmdb_account =
  525. (slurmdb_account_cond_t *)object;
  526. if(slurmdb_account) {
  527. slurmdb_destroy_association_cond(slurmdb_account->assoc_cond);
  528. if(slurmdb_account->description_list)
  529. list_destroy(slurmdb_account->description_list);
  530. if(slurmdb_account->organization_list)
  531. list_destroy(slurmdb_account->organization_list);
  532. xfree(slurmdb_account);
  533. }
  534. }
  535. extern void slurmdb_destroy_cluster_cond(void *object)
  536. {
  537. slurmdb_cluster_cond_t *slurmdb_cluster =
  538. (slurmdb_cluster_cond_t *)object;
  539. if(slurmdb_cluster) {
  540. _free_cluster_cond_members(slurmdb_cluster);
  541. xfree(slurmdb_cluster);
  542. }
  543. }
  544. extern void slurmdb_destroy_association_cond(void *object)
  545. {
  546. slurmdb_association_cond_t *slurmdb_association =
  547. (slurmdb_association_cond_t *)object;
  548. if(slurmdb_association) {
  549. if(slurmdb_association->acct_list)
  550. list_destroy(slurmdb_association->acct_list);
  551. if(slurmdb_association->cluster_list)
  552. list_destroy(slurmdb_association->cluster_list);
  553. if(slurmdb_association->def_qos_id_list)
  554. list_destroy(slurmdb_association->def_qos_id_list);
  555. if(slurmdb_association->fairshare_list)
  556. list_destroy(slurmdb_association->fairshare_list);
  557. if(slurmdb_association->grp_cpu_mins_list)
  558. list_destroy(slurmdb_association->grp_cpu_mins_list);
  559. if(slurmdb_association->grp_cpu_run_mins_list)
  560. list_destroy(slurmdb_association->
  561. grp_cpu_run_mins_list);
  562. if(slurmdb_association->grp_cpus_list)
  563. list_destroy(slurmdb_association->grp_cpus_list);
  564. if(slurmdb_association->grp_jobs_list)
  565. list_destroy(slurmdb_association->grp_jobs_list);
  566. if(slurmdb_association->grp_mem_list)
  567. list_destroy(slurmdb_association->grp_mem_list);
  568. if(slurmdb_association->grp_nodes_list)
  569. list_destroy(slurmdb_association->grp_nodes_list);
  570. if(slurmdb_association->grp_submit_jobs_list)
  571. list_destroy(slurmdb_association->grp_submit_jobs_list);
  572. if(slurmdb_association->grp_wall_list)
  573. list_destroy(slurmdb_association->grp_wall_list);
  574. if(slurmdb_association->id_list)
  575. list_destroy(slurmdb_association->id_list);
  576. if(slurmdb_association->max_cpu_mins_pj_list)
  577. list_destroy(slurmdb_association->max_cpu_mins_pj_list);
  578. if(slurmdb_association->max_cpu_run_mins_list)
  579. list_destroy(slurmdb_association->
  580. max_cpu_run_mins_list);
  581. if(slurmdb_association->max_cpus_pj_list)
  582. list_destroy(slurmdb_association->max_cpus_pj_list);
  583. if(slurmdb_association->max_jobs_list)
  584. list_destroy(slurmdb_association->max_jobs_list);
  585. if(slurmdb_association->max_nodes_pj_list)
  586. list_destroy(slurmdb_association->max_nodes_pj_list);
  587. if(slurmdb_association->max_submit_jobs_list)
  588. list_destroy(slurmdb_association->max_submit_jobs_list);
  589. if(slurmdb_association->max_wall_pj_list)
  590. list_destroy(slurmdb_association->max_wall_pj_list);
  591. if(slurmdb_association->partition_list)
  592. list_destroy(slurmdb_association->partition_list);
  593. if(slurmdb_association->parent_acct_list)
  594. list_destroy(slurmdb_association->parent_acct_list);
  595. if(slurmdb_association->qos_list)
  596. list_destroy(slurmdb_association->qos_list);
  597. if(slurmdb_association->user_list)
  598. list_destroy(slurmdb_association->user_list);
  599. xfree(slurmdb_association);
  600. }
  601. }
  602. extern void slurmdb_destroy_event_cond(void *object)
  603. {
  604. slurmdb_event_cond_t *slurmdb_event =
  605. (slurmdb_event_cond_t *)object;
  606. if(slurmdb_event) {
  607. if(slurmdb_event->cluster_list)
  608. list_destroy(slurmdb_event->cluster_list);
  609. if(slurmdb_event->node_list)
  610. list_destroy(slurmdb_event->node_list);
  611. if(slurmdb_event->reason_list)
  612. list_destroy(slurmdb_event->reason_list);
  613. if(slurmdb_event->reason_uid_list)
  614. list_destroy(slurmdb_event->reason_uid_list);
  615. if(slurmdb_event->state_list)
  616. list_destroy(slurmdb_event->state_list);
  617. xfree(slurmdb_event);
  618. }
  619. }
  620. extern void slurmdb_destroy_job_cond(void *object)
  621. {
  622. slurmdb_job_cond_t *job_cond =
  623. (slurmdb_job_cond_t *)object;
  624. if(job_cond) {
  625. if(job_cond->acct_list)
  626. list_destroy(job_cond->acct_list);
  627. if(job_cond->associd_list)
  628. list_destroy(job_cond->associd_list);
  629. if(job_cond->cluster_list)
  630. list_destroy(job_cond->cluster_list);
  631. if(job_cond->groupid_list)
  632. list_destroy(job_cond->groupid_list);
  633. if(job_cond->jobname_list)
  634. list_destroy(job_cond->jobname_list);
  635. if(job_cond->partition_list)
  636. list_destroy(job_cond->partition_list);
  637. if(job_cond->qos_list)
  638. list_destroy(job_cond->qos_list);
  639. if(job_cond->resv_list)
  640. list_destroy(job_cond->resv_list);
  641. if(job_cond->resvid_list)
  642. list_destroy(job_cond->resvid_list);
  643. if(job_cond->step_list)
  644. list_destroy(job_cond->step_list);
  645. if(job_cond->state_list)
  646. list_destroy(job_cond->state_list);
  647. xfree(job_cond->used_nodes);
  648. if(job_cond->userid_list)
  649. list_destroy(job_cond->userid_list);
  650. if(job_cond->wckey_list)
  651. list_destroy(job_cond->wckey_list);
  652. xfree(job_cond);
  653. }
  654. }
  655. extern void slurmdb_destroy_job_modify_cond(void *object)
  656. {
  657. slurmdb_job_modify_cond_t *job_cond =
  658. (slurmdb_job_modify_cond_t *)object;
  659. if(job_cond) {
  660. xfree(job_cond->cluster);
  661. xfree(job_cond);
  662. }
  663. }
  664. extern void slurmdb_destroy_qos_cond(void *object)
  665. {
  666. slurmdb_qos_cond_t *slurmdb_qos = (slurmdb_qos_cond_t *)object;
  667. if(slurmdb_qos) {
  668. if(slurmdb_qos->id_list)
  669. list_destroy(slurmdb_qos->id_list);
  670. if(slurmdb_qos->name_list)
  671. list_destroy(slurmdb_qos->name_list);
  672. xfree(slurmdb_qos);
  673. }
  674. }
  675. extern void slurmdb_destroy_reservation_cond(void *object)
  676. {
  677. slurmdb_reservation_cond_t *slurmdb_resv =
  678. (slurmdb_reservation_cond_t *)object;
  679. if(slurmdb_resv) {
  680. if(slurmdb_resv->cluster_list)
  681. list_destroy(slurmdb_resv->cluster_list);
  682. if(slurmdb_resv->id_list)
  683. list_destroy(slurmdb_resv->id_list);
  684. if(slurmdb_resv->name_list)
  685. list_destroy(slurmdb_resv->name_list);
  686. xfree(slurmdb_resv->nodes);
  687. xfree(slurmdb_resv);
  688. }
  689. }
  690. extern void slurmdb_destroy_txn_cond(void *object)
  691. {
  692. slurmdb_txn_cond_t *slurmdb_txn = (slurmdb_txn_cond_t *)object;
  693. if(slurmdb_txn) {
  694. if(slurmdb_txn->acct_list)
  695. list_destroy(slurmdb_txn->acct_list);
  696. if(slurmdb_txn->action_list)
  697. list_destroy(slurmdb_txn->action_list);
  698. if(slurmdb_txn->actor_list)
  699. list_destroy(slurmdb_txn->actor_list);
  700. if(slurmdb_txn->cluster_list)
  701. list_destroy(slurmdb_txn->cluster_list);
  702. if(slurmdb_txn->id_list)
  703. list_destroy(slurmdb_txn->id_list);
  704. if(slurmdb_txn->info_list)
  705. list_destroy(slurmdb_txn->info_list);
  706. if(slurmdb_txn->name_list)
  707. list_destroy(slurmdb_txn->name_list);
  708. if(slurmdb_txn->user_list)
  709. list_destroy(slurmdb_txn->user_list);
  710. xfree(slurmdb_txn);
  711. }
  712. }
  713. extern void slurmdb_destroy_wckey_cond(void *object)
  714. {
  715. slurmdb_wckey_cond_t *wckey = (slurmdb_wckey_cond_t *)object;
  716. if(wckey) {
  717. if(wckey->cluster_list)
  718. list_destroy(wckey->cluster_list);
  719. if(wckey->id_list)
  720. list_destroy(wckey->id_list);
  721. if(wckey->name_list)
  722. list_destroy(wckey->name_list);
  723. if(wckey->user_list)
  724. list_destroy(wckey->user_list);
  725. xfree(wckey);
  726. }
  727. }
  728. extern void slurmdb_destroy_archive_cond(void *object)
  729. {
  730. slurmdb_archive_cond_t *arch_cond = (slurmdb_archive_cond_t *)object;
  731. if(arch_cond) {
  732. xfree(arch_cond->archive_dir);
  733. xfree(arch_cond->archive_script);
  734. slurmdb_destroy_job_cond(arch_cond->job_cond);
  735. xfree(arch_cond);
  736. }
  737. }
  738. extern void slurmdb_destroy_update_object(void *object)
  739. {
  740. slurmdb_update_object_t *slurmdb_update =
  741. (slurmdb_update_object_t *) object;
  742. if(slurmdb_update) {
  743. if(slurmdb_update->objects)
  744. list_destroy(slurmdb_update->objects);
  745. xfree(slurmdb_update);
  746. }
  747. }
  748. extern void slurmdb_destroy_used_limits(void *object)
  749. {
  750. slurmdb_used_limits_t *slurmdb_used_limits =
  751. (slurmdb_used_limits_t *)object;
  752. if(slurmdb_used_limits) {
  753. xfree(slurmdb_used_limits);
  754. }
  755. }
  756. extern void slurmdb_destroy_update_shares_rec(void *object)
  757. {
  758. xfree(object);
  759. }
  760. extern void slurmdb_destroy_print_tree(void *object)
  761. {
  762. slurmdb_print_tree_t *slurmdb_print_tree =
  763. (slurmdb_print_tree_t *)object;
  764. if(slurmdb_print_tree) {
  765. xfree(slurmdb_print_tree->name);
  766. xfree(slurmdb_print_tree->print_name);
  767. xfree(slurmdb_print_tree->spaces);
  768. xfree(slurmdb_print_tree);
  769. }
  770. }
  771. extern void slurmdb_destroy_hierarchical_rec(void *object)
  772. {
  773. /* Most of this is pointers to something else that will be
  774. * destroyed elsewhere.
  775. */
  776. slurmdb_hierarchical_rec_t *slurmdb_hierarchical_rec =
  777. (slurmdb_hierarchical_rec_t *)object;
  778. if(slurmdb_hierarchical_rec) {
  779. if(slurmdb_hierarchical_rec->childern) {
  780. list_destroy(slurmdb_hierarchical_rec->childern);
  781. }
  782. xfree(slurmdb_hierarchical_rec);
  783. }
  784. }
  785. extern void slurmdb_destroy_selected_step(void *object)
  786. {
  787. slurmdb_selected_step_t *step = (slurmdb_selected_step_t *)object;
  788. if (step) {
  789. xfree(step);
  790. }
  791. }
  792. extern void slurmdb_destroy_report_job_grouping(void *object)
  793. {
  794. slurmdb_report_job_grouping_t *job_grouping =
  795. (slurmdb_report_job_grouping_t *)object;
  796. if(job_grouping) {
  797. if(job_grouping->jobs)
  798. list_destroy(job_grouping->jobs);
  799. xfree(job_grouping);
  800. }
  801. }
  802. extern void slurmdb_destroy_report_acct_grouping(void *object)
  803. {
  804. slurmdb_report_acct_grouping_t *acct_grouping =
  805. (slurmdb_report_acct_grouping_t *)object;
  806. if(acct_grouping) {
  807. xfree(acct_grouping->acct);
  808. if(acct_grouping->groups)
  809. list_destroy(acct_grouping->groups);
  810. xfree(acct_grouping);
  811. }
  812. }
  813. extern void slurmdb_destroy_report_cluster_grouping(void *object)
  814. {
  815. slurmdb_report_cluster_grouping_t *cluster_grouping =
  816. (slurmdb_report_cluster_grouping_t *)object;
  817. if(cluster_grouping) {
  818. xfree(cluster_grouping->cluster);
  819. if(cluster_grouping->acct_list)
  820. list_destroy(cluster_grouping->acct_list);
  821. xfree(cluster_grouping);
  822. }
  823. }
  824. extern List slurmdb_get_info_cluster(char *cluster_names)
  825. {
  826. slurmdb_cluster_rec_t *cluster_rec = NULL;
  827. slurmdb_cluster_cond_t cluster_cond;
  828. List temp_list = NULL;
  829. char *cluster_name = NULL;
  830. void *db_conn = NULL;
  831. ListIterator itr, itr2;
  832. bool all_clusters = 0;
  833. if (cluster_names && !strcmp(cluster_names, "all"))
  834. all_clusters = 1;
  835. cluster_name = slurm_get_cluster_name();
  836. db_conn = acct_storage_g_get_connection(NULL, 0, 1, cluster_name);
  837. xfree(cluster_name);
  838. slurmdb_init_cluster_cond(&cluster_cond, 0);
  839. if (cluster_names && !all_clusters) {
  840. cluster_cond.cluster_list = list_create(slurm_destroy_char);
  841. slurm_addto_char_list(cluster_cond.cluster_list, cluster_names);
  842. }
  843. if (!(temp_list = acct_storage_g_get_clusters(db_conn, getuid(),
  844. &cluster_cond))) {
  845. error("Problem talking to database");
  846. goto end_it;
  847. }
  848. itr = list_iterator_create(temp_list);
  849. if (!cluster_names || all_clusters) {
  850. while ((cluster_rec = list_next(itr))) {
  851. if (_setup_cluster_rec(cluster_rec) != SLURM_SUCCESS) {
  852. list_delete_item(itr);
  853. }
  854. }
  855. } else {
  856. itr2 = list_iterator_create(cluster_cond.cluster_list);
  857. if (itr2 == NULL)
  858. fatal("list_iterator_create: malloc failure");
  859. while ((cluster_name = list_next(itr2))) {
  860. while ((cluster_rec = list_next(itr))) {
  861. if (!strcmp(cluster_name, cluster_rec->name))
  862. break;
  863. }
  864. if (!cluster_rec) {
  865. error("No cluster '%s' known by database.",
  866. cluster_name);
  867. goto next;
  868. }
  869. if (_setup_cluster_rec(cluster_rec) != SLURM_SUCCESS) {
  870. list_delete_item(itr);
  871. }
  872. next:
  873. list_iterator_reset(itr);
  874. }
  875. list_iterator_destroy(itr2);
  876. }
  877. list_iterator_destroy(itr);
  878. end_it:
  879. if (cluster_cond.cluster_list)
  880. list_destroy(cluster_cond.cluster_list);
  881. acct_storage_g_close_connection(&db_conn);
  882. if (temp_list && !list_count(temp_list)) {
  883. list_destroy(temp_list);
  884. temp_list = NULL;
  885. }
  886. return temp_list;
  887. }
  888. extern void slurmdb_init_association_rec(slurmdb_association_rec_t *assoc,
  889. bool free_it)
  890. {
  891. if (!assoc)
  892. return;
  893. if (free_it)
  894. _free_assoc_rec_members(assoc);
  895. memset(assoc, 0, sizeof(slurmdb_association_rec_t));
  896. assoc->def_qos_id = NO_VAL;
  897. assoc->is_def = (uint16_t)NO_VAL;
  898. assoc->grp_cpu_mins = (uint64_t)NO_VAL;
  899. assoc->grp_cpu_run_mins = (uint64_t)NO_VAL;
  900. assoc->grp_cpus = NO_VAL;
  901. assoc->grp_jobs = NO_VAL;
  902. assoc->grp_mem = NO_VAL;
  903. assoc->grp_nodes = NO_VAL;
  904. assoc->grp_submit_jobs = NO_VAL;
  905. assoc->grp_wall = NO_VAL;
  906. assoc->lft = NO_VAL;
  907. assoc->rgt = NO_VAL;
  908. /* assoc->level_shares = NO_VAL; */
  909. assoc->max_cpu_mins_pj = (uint64_t)NO_VAL;
  910. assoc->max_cpu_run_mins = (uint64_t)NO_VAL;
  911. assoc->max_cpus_pj = NO_VAL;
  912. assoc->max_jobs = NO_VAL;
  913. assoc->max_nodes_pj = NO_VAL;
  914. assoc->max_submit_jobs = NO_VAL;
  915. assoc->max_wall_pj = NO_VAL;
  916. /* assoc->shares_norm = (double)NO_VAL; */
  917. assoc->shares_raw = NO_VAL;
  918. /* assoc->usage_efctv = 0; */
  919. /* assoc->usage_norm = (long double)NO_VAL; */
  920. /* assoc->usage_raw = 0; */
  921. }
  922. extern void slurmdb_init_cluster_rec(slurmdb_cluster_rec_t *cluster,
  923. bool free_it)
  924. {
  925. if (!cluster)
  926. return;
  927. if (free_it)
  928. _free_cluster_rec_members(cluster);
  929. memset(cluster, 0, sizeof(slurmdb_cluster_rec_t));
  930. cluster->flags = NO_VAL;
  931. }
  932. extern void slurmdb_init_qos_rec(slurmdb_qos_rec_t *qos, bool free_it)
  933. {
  934. if (!qos)
  935. return;
  936. if (free_it)
  937. _free_qos_rec_members(qos);
  938. memset(qos, 0, sizeof(slurmdb_qos_rec_t));
  939. qos->flags = QOS_FLAG_NOTSET;
  940. qos->grace_time = NO_VAL;
  941. qos->preempt_mode = (uint16_t)NO_VAL;
  942. qos->priority = NO_VAL;
  943. qos->grp_cpu_mins = (uint64_t)NO_VAL;
  944. qos->grp_cpu_run_mins = (uint64_t)NO_VAL;
  945. qos->grp_cpus = NO_VAL;
  946. qos->grp_jobs = NO_VAL;
  947. qos->grp_mem = NO_VAL;
  948. qos->grp_nodes = NO_VAL;
  949. qos->grp_submit_jobs = NO_VAL;
  950. qos->grp_wall = NO_VAL;
  951. qos->max_cpu_mins_pj = (uint64_t)NO_VAL;
  952. qos->max_cpu_run_mins_pu = (uint64_t)NO_VAL;
  953. qos->max_cpus_pj = NO_VAL;
  954. qos->max_cpus_pu = NO_VAL;
  955. qos->max_jobs_pu = NO_VAL;
  956. qos->max_nodes_pj = NO_VAL;
  957. qos->max_nodes_pu = NO_VAL;
  958. qos->max_submit_jobs_pu = NO_VAL;
  959. qos->max_wall_pj = NO_VAL;
  960. qos->usage_factor = (double)NO_VAL;
  961. qos->usage_thres = (double)NO_VAL;
  962. }
  963. extern void slurmdb_init_wckey_rec(slurmdb_wckey_rec_t *wckey, bool free_it)
  964. {
  965. if (!wckey)
  966. return;
  967. if (free_it)
  968. _free_wckey_rec_members(wckey);
  969. memset(wckey, 0, sizeof(slurmdb_wckey_rec_t));
  970. wckey->is_def = (uint16_t)NO_VAL;
  971. }
  972. extern void slurmdb_init_cluster_cond(slurmdb_cluster_cond_t *cluster,
  973. bool free_it)
  974. {
  975. if(!cluster)
  976. return;
  977. if (free_it)
  978. _free_cluster_cond_members(cluster);
  979. memset(cluster, 0, sizeof(slurmdb_cluster_cond_t));
  980. cluster->flags = NO_VAL;
  981. }
  982. extern char *slurmdb_qos_str(List qos_list, uint32_t level)
  983. {
  984. ListIterator itr = NULL;
  985. slurmdb_qos_rec_t *qos = NULL;
  986. if(!qos_list) {
  987. error("We need a qos list to translate");
  988. return NULL;
  989. } else if(!level) {
  990. debug2("no level");
  991. return "";
  992. }
  993. itr = list_iterator_create(qos_list);
  994. while((qos = list_next(itr))) {
  995. if(level == qos->id)
  996. break;
  997. }
  998. list_iterator_destroy(itr);
  999. if(qos)
  1000. return qos->name;
  1001. else
  1002. return NULL;
  1003. }
  1004. extern uint32_t str_2_slurmdb_qos(List qos_list, char *level)
  1005. {
  1006. ListIterator itr = NULL;
  1007. slurmdb_qos_rec_t *qos = NULL;
  1008. char *working_level = NULL;
  1009. if(!qos_list) {
  1010. error("We need a qos list to translate");
  1011. return NO_VAL;
  1012. } else if(!level) {
  1013. debug2("no level");
  1014. return 0;
  1015. }
  1016. if(level[0] == '+' || level[0] == '-')
  1017. working_level = level+1;
  1018. else
  1019. working_level = level;
  1020. itr = list_iterator_create(qos_list);
  1021. while((qos = list_next(itr))) {
  1022. if (!strcasecmp(working_level, qos->name))
  1023. break;
  1024. }
  1025. list_iterator_destroy(itr);
  1026. if(qos)
  1027. return qos->id;
  1028. else
  1029. return NO_VAL;
  1030. }
  1031. extern char *slurmdb_qos_flags_str(uint32_t flags)
  1032. {
  1033. char *qos_flags = NULL;
  1034. if (flags & QOS_FLAG_NOTSET)
  1035. return xstrdup("NotSet");
  1036. if (flags & QOS_FLAG_ADD)
  1037. xstrcat(qos_flags, "Add,");
  1038. if (flags & QOS_FLAG_REMOVE)
  1039. xstrcat(qos_flags, "Remove,");
  1040. if (flags & QOS_FLAG_DENY_LIMIT)
  1041. xstrcat(qos_flags, "DenyOnLimit,");
  1042. if (flags & QOS_FLAG_ENFORCE_USAGE_THRES)
  1043. xstrcat(qos_flags, "EnforceUsageThreshold,");
  1044. if (flags & QOS_FLAG_NO_RESERVE)
  1045. xstrcat(qos_flags, "NoReserve,");
  1046. if (flags & QOS_FLAG_PART_MAX_NODE)
  1047. xstrcat(qos_flags, "PartitionMaxNodes,");
  1048. if (flags & QOS_FLAG_PART_MIN_NODE)
  1049. xstrcat(qos_flags, "PartitionMinNodes,");
  1050. if (flags & QOS_FLAG_PART_TIME_LIMIT)
  1051. xstrcat(qos_flags, "PartitionTimeLimit,");
  1052. if (flags & QOS_FLAG_REQ_RESV)
  1053. xstrcat(qos_flags, "RequiresReservation,");
  1054. if (qos_flags)
  1055. qos_flags[strlen(qos_flags)-1] = '\0';
  1056. return qos_flags;
  1057. }
  1058. extern uint32_t str_2_qos_flags(char *flags, int option)
  1059. {
  1060. uint32_t qos_flags = 0;
  1061. char *token, *my_flags, *last = NULL;
  1062. if (!flags) {
  1063. error("We need a qos flags string to translate");
  1064. return QOS_FLAG_NOTSET;
  1065. } else if (atoi(flags) == -1) {
  1066. /* clear them all */
  1067. qos_flags = INFINITE;
  1068. qos_flags &= (~QOS_FLAG_NOTSET &
  1069. ~QOS_FLAG_ADD);
  1070. return qos_flags;
  1071. }
  1072. my_flags = xstrdup(flags);
  1073. token = strtok_r(my_flags, ",", &last);
  1074. while (token) {
  1075. qos_flags |= _str_2_qos_flags(token);
  1076. token = strtok_r(NULL, ",", &last);
  1077. }
  1078. xfree(my_flags);
  1079. if (!qos_flags)
  1080. qos_flags = QOS_FLAG_NOTSET;
  1081. else if (option == '+')
  1082. qos_flags |= QOS_FLAG_ADD;
  1083. else if (option == '-')
  1084. qos_flags |= QOS_FLAG_REMOVE;
  1085. return qos_flags;
  1086. }
  1087. extern char *slurmdb_admin_level_str(slurmdb_admin_level_t level)
  1088. {
  1089. switch(level) {
  1090. case SLURMDB_ADMIN_NOTSET:
  1091. return "Not Set";
  1092. break;
  1093. case SLURMDB_ADMIN_NONE:
  1094. return "None";
  1095. break;
  1096. case SLURMDB_ADMIN_OPERATOR:
  1097. return "Operator";
  1098. break;
  1099. case SLURMDB_ADMIN_SUPER_USER:
  1100. return "Administrator";
  1101. break;
  1102. default:
  1103. return "Unknown";
  1104. break;
  1105. }
  1106. return "Unknown";
  1107. }
  1108. extern slurmdb_admin_level_t str_2_slurmdb_admin_level(char *level)
  1109. {
  1110. if(!level) {
  1111. return SLURMDB_ADMIN_NOTSET;
  1112. } else if(!strncasecmp(level, "None", 1)) {
  1113. return SLURMDB_ADMIN_NONE;
  1114. } else if(!strncasecmp(level, "Operator", 1)) {
  1115. return SLURMDB_ADMIN_OPERATOR;
  1116. } else if(!strncasecmp(level, "SuperUser", 1)
  1117. || !strncasecmp(level, "Admin", 1)) {
  1118. return SLURMDB_ADMIN_SUPER_USER;
  1119. } else {
  1120. return SLURMDB_ADMIN_NOTSET;
  1121. }
  1122. }
  1123. /* This reorders the list into a alphabetical hierarchy returned in a
  1124. * separate list. The orginal list is not affected */
  1125. extern List slurmdb_get_hierarchical_sorted_assoc_list(List assoc_list)
  1126. {
  1127. List slurmdb_hierarchical_rec_list =
  1128. slurmdb_get_acct_hierarchical_rec_list(assoc_list);
  1129. List ret_list = list_create(NULL);
  1130. _append_hierarchical_childern_ret_list(ret_list,
  1131. slurmdb_hierarchical_rec_list);
  1132. list_destroy(slurmdb_hierarchical_rec_list);
  1133. return ret_list;
  1134. }
  1135. /* This reorders the list into a alphabetical hierarchy. */
  1136. extern void slurmdb_sort_hierarchical_assoc_list(List assoc_list)
  1137. {
  1138. List slurmdb_hierarchical_rec_list =
  1139. slurmdb_get_acct_hierarchical_rec_list(assoc_list);
  1140. /* Clear all the pointers out of the list without freeing the
  1141. memory since we will just add them back in later.
  1142. */
  1143. while(list_pop(assoc_list)) {
  1144. }
  1145. _append_hierarchical_childern_ret_list(assoc_list,
  1146. slurmdb_hierarchical_rec_list);
  1147. list_destroy(slurmdb_hierarchical_rec_list);
  1148. }
  1149. extern List slurmdb_get_acct_hierarchical_rec_list(List assoc_list)
  1150. {
  1151. slurmdb_hierarchical_rec_t *par_arch_rec = NULL;
  1152. slurmdb_hierarchical_rec_t *last_acct_parent = NULL;
  1153. slurmdb_hierarchical_rec_t *last_parent = NULL;
  1154. slurmdb_hierarchical_rec_t *arch_rec = NULL;
  1155. slurmdb_association_rec_t *assoc = NULL;
  1156. List total_assoc_list = list_create(NULL);
  1157. List arch_rec_list =
  1158. list_create(slurmdb_destroy_hierarchical_rec);
  1159. ListIterator itr, itr2;
  1160. /* The list should already be sorted by lfts, do it anyway
  1161. * just to make sure it is correct. */
  1162. list_sort(assoc_list, (ListCmpF)_sort_assoc_by_lft_dec);
  1163. itr = list_iterator_create(assoc_list);
  1164. itr2 = list_iterator_create(total_assoc_list);
  1165. while((assoc = list_next(itr))) {
  1166. arch_rec = xmalloc(sizeof(slurmdb_hierarchical_rec_t));
  1167. arch_rec->childern =
  1168. list_create(slurmdb_destroy_hierarchical_rec);
  1169. arch_rec->assoc = assoc;
  1170. /* To speed things up we are first looking if we have
  1171. a parent_id to look for. If that doesn't work see
  1172. if the last parent we had was what we are looking
  1173. for. Then if that isn't panning out look at the
  1174. last account parent. If still we don't have it we
  1175. will look for it in the list. If it isn't there we
  1176. will just add it to the parent and call it good
  1177. */
  1178. if(!assoc->parent_id) {
  1179. arch_rec->sort_name = assoc->cluster;
  1180. list_append(arch_rec_list, arch_rec);
  1181. list_append(total_assoc_list, arch_rec);
  1182. continue;
  1183. }
  1184. if(assoc->user)
  1185. arch_rec->sort_name = assoc->user;
  1186. else
  1187. arch_rec->sort_name = assoc->acct;
  1188. if(last_parent && assoc->parent_id == last_parent->assoc->id
  1189. && !strcmp(assoc->cluster, last_parent->assoc->cluster)) {
  1190. par_arch_rec = last_parent;
  1191. } else if(last_acct_parent
  1192. && (assoc->parent_id == last_acct_parent->assoc->id)
  1193. && !strcmp(assoc->cluster,
  1194. last_acct_parent->assoc->cluster)) {
  1195. par_arch_rec = last_acct_parent;
  1196. } else {
  1197. list_iterator_reset(itr2);
  1198. while((par_arch_rec = list_next(itr2))) {
  1199. if(assoc->parent_id == par_arch_rec->assoc->id
  1200. && !strcmp(assoc->cluster,
  1201. par_arch_rec->assoc->cluster)) {
  1202. if(assoc->user)
  1203. last_parent = par_arch_rec;
  1204. else
  1205. last_parent
  1206. = last_acct_parent
  1207. = par_arch_rec;
  1208. break;
  1209. }
  1210. }
  1211. }
  1212. if(!par_arch_rec) {
  1213. list_append(arch_rec_list, arch_rec);
  1214. last_parent = last_acct_parent = arch_rec;
  1215. } else
  1216. list_append(par_arch_rec->childern, arch_rec);
  1217. list_append(total_assoc_list, arch_rec);
  1218. }
  1219. list_iterator_destroy(itr);
  1220. list_iterator_destroy(itr2);
  1221. list_destroy(total_assoc_list);
  1222. // info("got %d", list_count(arch_rec_list));
  1223. _sort_slurmdb_hierarchical_rec_list(arch_rec_list);
  1224. return arch_rec_list;
  1225. }
  1226. /* IN/OUT: tree_list a list of slurmdb_print_tree_t's */
  1227. extern char *slurmdb_tree_name_get(char *name, char *parent, List tree_list)
  1228. {
  1229. ListIterator itr = NULL;
  1230. slurmdb_print_tree_t *slurmdb_print_tree = NULL;
  1231. slurmdb_print_tree_t *par_slurmdb_print_tree = NULL;
  1232. if(!tree_list)
  1233. return NULL;
  1234. itr = list_iterator_create(tree_list);
  1235. while((slurmdb_print_tree = list_next(itr))) {
  1236. /* we don't care about users in this list. They are
  1237. only there so we don't leak memory */
  1238. if(slurmdb_print_tree->user)
  1239. continue;
  1240. if(!strcmp(name, slurmdb_print_tree->name))
  1241. break;
  1242. else if(parent && !strcmp(parent, slurmdb_print_tree->name))
  1243. par_slurmdb_print_tree = slurmdb_print_tree;
  1244. }
  1245. list_iterator_destroy(itr);
  1246. if(parent && slurmdb_print_tree)
  1247. return slurmdb_print_tree->print_name;
  1248. slurmdb_print_tree = xmalloc(sizeof(slurmdb_print_tree_t));
  1249. slurmdb_print_tree->name = xstrdup(name);
  1250. if(par_slurmdb_print_tree)
  1251. slurmdb_print_tree->spaces =
  1252. xstrdup_printf(" %s", par_slurmdb_print_tree->spaces);
  1253. else
  1254. slurmdb_print_tree->spaces = xstrdup("");
  1255. /* user account */
  1256. if(name[0] == '|') {
  1257. slurmdb_print_tree->print_name = xstrdup_printf(
  1258. "%s%s", slurmdb_print_tree->spaces, parent);
  1259. slurmdb_print_tree->user = 1;
  1260. } else
  1261. slurmdb_print_tree->print_name = xstrdup_printf(
  1262. "%s%s", slurmdb_print_tree->spaces, name);
  1263. list_append(tree_list, slurmdb_print_tree);
  1264. return slurmdb_print_tree->print_name;
  1265. }
  1266. extern int set_qos_bitstr_from_list(bitstr_t *valid_qos, List qos_list)
  1267. {
  1268. ListIterator itr = NULL;
  1269. bitoff_t bit = 0;
  1270. int rc = SLURM_SUCCESS;
  1271. char *temp_char = NULL;
  1272. void (*my_function) (bitstr_t *b, bitoff_t bit);
  1273. xassert(valid_qos);
  1274. if(!qos_list)
  1275. return SLURM_ERROR;
  1276. itr = list_iterator_create(qos_list);
  1277. while((temp_char = list_next(itr))) {
  1278. if(temp_char[0] == '-') {
  1279. temp_char++;
  1280. my_function = bit_clear;
  1281. } else if(temp_char[0] == '+') {
  1282. temp_char++;
  1283. my_function = bit_set;
  1284. } else
  1285. my_function = bit_set;
  1286. bit = atoi(temp_char);
  1287. if(bit >= bit_size(valid_qos)) {
  1288. rc = SLURM_ERROR;
  1289. break;
  1290. }
  1291. (*(my_function))(valid_qos, bit);
  1292. }
  1293. list_iterator_destroy(itr);
  1294. return rc;
  1295. }
  1296. extern char *get_qos_complete_str_bitstr(List qos_list, bitstr_t *valid_qos)
  1297. {
  1298. List temp_list = NULL;
  1299. char *temp_char = NULL;
  1300. char *print_this = NULL;
  1301. ListIterator itr = NULL;
  1302. int i = 0;
  1303. if(!qos_list || !list_count(qos_list)
  1304. || !valid_qos || (bit_ffs(valid_qos) == -1))
  1305. return xstrdup("");
  1306. temp_list = list_create(NULL);
  1307. for(i=0; i<bit_size(valid_qos); i++) {
  1308. if(!bit_test(valid_qos, i))
  1309. continue;
  1310. if((temp_char = slurmdb_qos_str(qos_list, i)))
  1311. list_append(temp_list, temp_char);
  1312. }
  1313. list_sort(temp_list, (ListCmpF)slurm_sort_char_list_asc);
  1314. itr = list_iterator_create(temp_list);
  1315. while((temp_char = list_next(itr))) {
  1316. if(print_this)
  1317. xstrfmtcat(print_this, ",%s", temp_char);
  1318. else
  1319. print_this = xstrdup(temp_char);
  1320. }
  1321. list_iterator_destroy(itr);
  1322. list_destroy(temp_list);
  1323. if(!print_this)
  1324. return xstrdup("");
  1325. return print_this;
  1326. }
  1327. extern char *get_qos_complete_str(List qos_list, List num_qos_list)
  1328. {
  1329. List temp_list = NULL;
  1330. char *temp_char = NULL;
  1331. char *print_this = NULL;
  1332. ListIterator itr = NULL;
  1333. int option = 0;
  1334. if(!qos_list || !list_count(qos_list)
  1335. || !num_qos_list || !list_count(num_qos_list))
  1336. return xstrdup("");
  1337. temp_list = list_create(slurm_destroy_char);
  1338. itr = list_iterator_create(num_qos_list);
  1339. while((temp_char = list_next(itr))) {
  1340. option = 0;
  1341. if(temp_char[0] == '+' || temp_char[0] == '-') {
  1342. option = temp_char[0];
  1343. temp_char++;
  1344. }
  1345. temp_char = slurmdb_qos_str(qos_list, atoi(temp_char));
  1346. if(temp_char) {
  1347. if(option)
  1348. list_append(temp_list, xstrdup_printf(
  1349. "%c%s", option, temp_char));
  1350. else
  1351. list_append(temp_list, xstrdup(temp_char));
  1352. }
  1353. }
  1354. list_iterator_destroy(itr);
  1355. list_sort(temp_list, (ListCmpF)slurm_sort_char_list_asc);
  1356. itr = list_iterator_create(temp_list);
  1357. while((temp_char = list_next(itr))) {
  1358. if(print_this)
  1359. xstrfmtcat(print_this, ",%s", temp_char);
  1360. else
  1361. print_this = xstrdup(temp_char);
  1362. }
  1363. list_iterator_destroy(itr);
  1364. list_destroy(temp_list);
  1365. if(!print_this)
  1366. return xstrdup("");
  1367. return print_this;
  1368. }
  1369. extern char *get_classification_str(uint16_t class)
  1370. {
  1371. bool classified = class & SLURMDB_CLASSIFIED_FLAG;
  1372. slurmdb_classification_type_t type = class & SLURMDB_CLASS_BASE;
  1373. switch(type) {
  1374. case SLURMDB_CLASS_NONE:
  1375. return NULL;
  1376. break;
  1377. case SLURMDB_CLASS_CAPACITY:
  1378. if(classified)
  1379. return "*Capacity";
  1380. else
  1381. return "Capacity";
  1382. break;
  1383. case SLURMDB_CLASS_CAPABILITY:
  1384. if(classified)
  1385. return "*Capability";
  1386. else
  1387. return "Capability";
  1388. break;
  1389. case SLURMDB_CLASS_CAPAPACITY:
  1390. if(classified)
  1391. return "*Capapacity";
  1392. else
  1393. return "Capapacity";
  1394. break;
  1395. default:
  1396. if(classified)
  1397. return "*Unknown";
  1398. else
  1399. return "Unknown";
  1400. break;
  1401. }
  1402. }
  1403. extern uint16_t str_2_classification(char *class)
  1404. {
  1405. uint16_t type = 0;
  1406. if(!class)
  1407. return type;
  1408. if(slurm_strcasestr(class, "capac"))
  1409. type = SLURMDB_CLASS_CAPACITY;
  1410. else if(slurm_strcasestr(class, "capab"))
  1411. type = SLURMDB_CLASS_CAPABILITY;
  1412. else if(slurm_strcasestr(class, "capap"))
  1413. type = SLURMDB_CLASS_CAPAPACITY;
  1414. if(slurm_strcasestr(class, "*"))
  1415. type |= SLURMDB_CLASSIFIED_FLAG;
  1416. else if(slurm_strcasestr(class, "class"))
  1417. type |= SLURMDB_CLASSIFIED_FLAG;
  1418. return type;
  1419. }
  1420. extern char *slurmdb_problem_str_get(uint16_t problem)
  1421. {
  1422. slurmdb_problem_type_t type = problem;
  1423. switch(type) {
  1424. case SLURMDB_PROBLEM_NOT_SET:
  1425. return NULL;
  1426. break;
  1427. case SLURMDB_PROBLEM_ACCT_NO_ASSOC:
  1428. return "Account has no Associations";
  1429. break;
  1430. case SLURMDB_PROBLEM_ACCT_NO_USERS:
  1431. return "Account has no users";
  1432. break;
  1433. case SLURMDB_PROBLEM_USER_NO_ASSOC:
  1434. return "User has no Associations";
  1435. break;
  1436. case SLURMDB_PROBLEM_USER_NO_UID:
  1437. return "User does not have a uid";
  1438. break;
  1439. default:
  1440. return "Unknown";
  1441. break;
  1442. }
  1443. }
  1444. extern uint16_t str_2_slurmdb_problem(char *problem)
  1445. {
  1446. uint16_t type = 0;
  1447. if(!problem)
  1448. return type;
  1449. if(slurm_strcasestr(problem, "account no associations"))
  1450. type = SLURMDB_PROBLEM_USER_NO_ASSOC;
  1451. else if(slurm_strcasestr(problem, "account no users"))
  1452. type = SLURMDB_PROBLEM_ACCT_NO_USERS;
  1453. else if(slurm_strcasestr(problem, "user no associations"))
  1454. type = SLURMDB_PROBLEM_USER_NO_ASSOC;
  1455. else if(slurm_strcasestr(problem, "user no uid"))
  1456. type = SLURMDB_PROBLEM_USER_NO_UID;
  1457. return type;
  1458. }
  1459. extern void log_assoc_rec(slurmdb_association_rec_t *assoc_ptr,
  1460. List qos_list)
  1461. {
  1462. xassert(assoc_ptr);
  1463. debug2("association rec id : %u", assoc_ptr->id);
  1464. debug2(" acct : %s", assoc_ptr->acct);
  1465. debug2(" cluster : %s", assoc_ptr->cluster);
  1466. if(assoc_ptr->shares_raw == INFINITE)
  1467. debug2(" RawShares : NONE");
  1468. else if(assoc_ptr->shares_raw != NO_VAL)
  1469. debug2(" RawShares : %u", assoc_ptr->shares_raw);
  1470. if(assoc_ptr->def_qos_id)
  1471. debug2(" Default QOS : %s",
  1472. slurmdb_qos_str(qos_list, assoc_ptr->def_qos_id));
  1473. else
  1474. debug2(" Default QOS : NONE");
  1475. if(assoc_ptr->grp_cpu_mins == INFINITE)
  1476. debug2(" GrpCPUMins : NONE");
  1477. else if(assoc_ptr->grp_cpu_mins != NO_VAL)
  1478. debug2(" GrpCPUMins : %"PRIu64"",
  1479. assoc_ptr->grp_cpu_mins);
  1480. if(assoc_ptr->grp_cpu_run_mins == INFINITE)
  1481. debug2(" GrpCPURunMins : NONE");
  1482. else if(assoc_ptr->grp_cpu_run_mins != NO_VAL)
  1483. debug2(" GrpCPURunMins : %"PRIu64"",
  1484. assoc_ptr->grp_cpu_run_mins);
  1485. if(assoc_ptr->grp_cpus == INFINITE)
  1486. debug2(" GrpCPUs : NONE");
  1487. else if(assoc_ptr->grp_cpus != NO_VAL)
  1488. debug2(" GrpCPUs : %u", assoc_ptr->grp_cpus);
  1489. if(assoc_ptr->grp_jobs == INFINITE)
  1490. debug2(" GrpJobs : NONE");
  1491. else if(assoc_ptr->grp_jobs != NO_VAL)
  1492. debug2(" GrpJobs : %u", assoc_ptr->grp_jobs);
  1493. if(assoc_ptr->grp_mem == INFINITE)
  1494. debug2(" GrpMemory : NONE");
  1495. else if(assoc_ptr->grp_mem != NO_VAL)
  1496. debug2(" GrpMemory : %u", assoc_ptr->grp_mem);
  1497. if(assoc_ptr->grp_nodes == INFINITE)
  1498. debug2(" GrpNodes : NONE");
  1499. else if(assoc_ptr->grp_nodes != NO_VAL)
  1500. debug2(" GrpNodes : %u", assoc_ptr->grp_nodes);
  1501. if(assoc_ptr->grp_submit_jobs == INFINITE)
  1502. debug2(" GrpSubmitJobs : NONE");
  1503. else if(assoc_ptr->grp_submit_jobs != NO_VAL)
  1504. debug2(" GrpSubmitJobs : %u", assoc_ptr->grp_submit_jobs);
  1505. if(assoc_ptr->grp_wall == INFINITE)
  1506. debug2(" GrpWall : NONE");
  1507. else if(assoc_ptr->grp_wall != NO_VAL) {
  1508. char time_buf[32];
  1509. mins2time_str((time_t) assoc_ptr->grp_wall,
  1510. time_buf, sizeof(time_buf));
  1511. debug2(" GrpWall : %s", time_buf);
  1512. }
  1513. if(assoc_ptr->max_cpu_mins_pj == INFINITE)
  1514. debug2(" MaxCPUMins : NONE");
  1515. else if(assoc_ptr->max_cpu_mins_pj != NO_VAL)
  1516. debug2(" MaxCPUMins : %"PRIu64"",
  1517. assoc_ptr->max_cpu_mins_pj);
  1518. if(assoc_ptr->max_cpu_run_mins == INFINITE)
  1519. debug2(" MaxCPURunMins : NONE");
  1520. else if(assoc_ptr->max_cpu_run_mins != NO_VAL)
  1521. debug2(" MaxCPURunMins : %"PRIu64"",
  1522. assoc_ptr->max_cpu_run_mins);
  1523. if(assoc_ptr->max_cpus_pj == INFINITE)
  1524. debug2(" MaxCPUs : NONE");
  1525. else if(assoc_ptr->max_cpus_pj != NO_VAL)
  1526. debug2(" MaxCPUs : %u", assoc_ptr->max_cpus_pj);
  1527. if(assoc_ptr->max_jobs == INFINITE)
  1528. debug2(" MaxJobs : NONE");
  1529. else if(assoc_ptr->max_jobs != NO_VAL)
  1530. debug2(" MaxJobs : %u", assoc_ptr->max_jobs);
  1531. if(assoc_ptr->max_nodes_pj == INFINITE)
  1532. debug2(" MaxNodes : NONE");
  1533. else if(assoc_ptr->max_nodes_pj != NO_VAL)
  1534. debug2(" MaxNodes : %u", assoc_ptr->max_nodes_pj);
  1535. if(assoc_ptr->max_submit_jobs == INFINITE)
  1536. debug2(" MaxSubmitJobs : NONE");
  1537. else if(assoc_ptr->max_submit_jobs != NO_VAL)
  1538. debug2(" MaxSubmitJobs : %u", assoc_ptr->max_submit_jobs);
  1539. if(assoc_ptr->max_wall_pj == INFINITE)
  1540. debug2(" MaxWall : NONE");
  1541. else if(assoc_ptr->max_wall_pj != NO_VAL) {
  1542. char time_buf[32];
  1543. mins2time_str((time_t) assoc_ptr->max_wall_pj,
  1544. time_buf, sizeof(time_buf));
  1545. debug2(" MaxWall : %s", time_buf);
  1546. }
  1547. if(assoc_ptr->qos_list) {
  1548. char *temp_char = get_qos_complete_str(qos_list,
  1549. assoc_ptr->qos_list);
  1550. if(temp_char) {
  1551. debug2(" Qos : %s", temp_char);
  1552. xfree(temp_char);
  1553. if(assoc_ptr->usage && assoc_ptr->usage->valid_qos) {
  1554. temp_char = get_qos_complete_str_bitstr(
  1555. qos_list, assoc_ptr->usage->valid_qos);
  1556. debug3(" Valid Qos : %s", temp_char);
  1557. xfree(temp_char);
  1558. }
  1559. }
  1560. } else {
  1561. debug2(" Qos : %s", "Normal");
  1562. }
  1563. if (assoc_ptr->parent_acct)
  1564. debug2(" ParentAccount : %s", assoc_ptr->parent_acct);
  1565. if (assoc_ptr->partition)
  1566. debug2(" Partition : %s", assoc_ptr->partition);
  1567. if (assoc_ptr->user)
  1568. debug2(" User : %s(%u)",
  1569. assoc_ptr->user, assoc_ptr->uid);
  1570. if (assoc_ptr->usage) {
  1571. if (!fuzzy_equal(assoc_ptr->usage->shares_norm, NO_VAL))
  1572. debug2(" NormalizedShares : %f",
  1573. assoc_ptr->usage->shares_norm);
  1574. if (assoc_ptr->usage->level_shares != NO_VAL)
  1575. debug2(" LevelShares : %u",
  1576. assoc_ptr->usage->level_shares);
  1577. debug2(" UsedJobs : %u", assoc_ptr->usage->used_jobs);
  1578. debug2(" RawUsage : %Lf", assoc_ptr->usage->usage_raw);
  1579. }
  1580. }
  1581. extern int slurmdb_report_set_start_end_time(time_t *start, time_t *end)
  1582. {
  1583. time_t my_time = time(NULL);
  1584. time_t temp_time;
  1585. struct tm start_tm;
  1586. struct tm end_tm;
  1587. int sent_start = (*start), sent_end = (*end);
  1588. // info("now got %d and %d sent", (*start), (*end));
  1589. /* Default is going to be the last day */
  1590. if(!sent_end) {
  1591. if(!localtime_r(&my_time, &end_tm)) {
  1592. error("Couldn't get localtime from end %ld",
  1593. (long)my_time);
  1594. return SLURM_ERROR;
  1595. }
  1596. end_tm.tm_hour = 0;
  1597. //(*end) = mktime(&end_tm);
  1598. } else {
  1599. temp_time = sent_end;
  1600. if(!localtime_r(&temp_time, &end_tm)) {
  1601. error("Couldn't get localtime from user end %ld",
  1602. (long)my_time);
  1603. return SLURM_ERROR;
  1604. }
  1605. if(end_tm.tm_sec >= 30)
  1606. end_tm.tm_min++;
  1607. if(end_tm.tm_min >= 30)
  1608. end_tm.tm_hour++;
  1609. }
  1610. end_tm.tm_sec = 0;
  1611. end_tm.tm_min = 0;
  1612. end_tm.tm_isdst = -1;
  1613. (*end) = mktime(&end_tm);
  1614. if(!sent_start) {
  1615. if(!localtime_r(&my_time, &start_tm)) {
  1616. error("Couldn't get localtim…

Large files files are truncated, but you can click here to view the full file