extern int sacctmgr_list_res(int argc, char *argv[]) { int rc = SLURM_SUCCESS; slurmdb_res_cond_t *res_cond = xmalloc(sizeof(slurmdb_res_cond_t)); int i=0; ListIterator itr = NULL; ListIterator itr2 = NULL; slurmdb_res_rec_t *res = NULL; slurmdb_clus_res_rec_t *clus_res = NULL; List res_list = NULL; int field_count = 0; List format_list = list_create(slurm_destroy_char); List print_fields_list; /* types are of print_field_t */ slurmdb_init_res_cond(res_cond, 0); for (i=0; i<argc; i++) { int command_len = strlen(argv[i]); if (!strncasecmp(argv[i], "Where", MAX(command_len, 5)) || !strncasecmp(argv[i], "Set", MAX(command_len, 3))) i++; _set_res_cond(&i, argc, argv, res_cond, format_list); } if (exit_code) { slurmdb_destroy_res_cond(res_cond); FREE_NULL_LIST(format_list); return SLURM_ERROR; } else if (!list_count(format_list)) { slurm_addto_char_list( format_list, "Name,Server,Type,Count,Used"); if (res_cond->with_clusters) slurm_addto_char_list( format_list, "Cluster,Allowed"); } print_fields_list = sacctmgr_process_format_list(format_list); FREE_NULL_LIST(format_list); if (exit_code) { FREE_NULL_LIST(print_fields_list); return SLURM_ERROR; } res_list = acct_storage_g_get_res(db_conn, my_uid, res_cond); slurmdb_destroy_res_cond(res_cond); if (!res_list) { exit_code=1; fprintf(stderr, " Problem with query.\n"); FREE_NULL_LIST(print_fields_list); return SLURM_ERROR; } itr = list_iterator_create(res_list); itr2 = list_iterator_create(print_fields_list); print_fields_header(print_fields_list); field_count = list_count(print_fields_list); while ((res = list_next(itr))) { if (res_cond->with_clusters && res->clus_res_list && list_count(res->clus_res_list)) { ListIterator clus_itr = list_iterator_create( res->clus_res_list); while ((clus_res = list_next(clus_itr))) { _print_res_format(res, clus_res, itr2, field_count); } list_iterator_destroy(clus_itr); } else _print_res_format(res, NULL, itr2, field_count); } list_iterator_destroy(itr2); list_iterator_destroy(itr); FREE_NULL_LIST(res_list); FREE_NULL_LIST(print_fields_list); return rc; }
static void _print_overcommit(slurmdb_res_rec_t *res, slurmdb_res_cond_t *res_cond) { List res_list = NULL, cluster_list = NULL; ListIterator itr, clus_itr = NULL, found_clus_itr = NULL; slurmdb_res_rec_t *found_res; slurmdb_clus_res_rec_t *clus_res = NULL; char *cluster; if (res->percent_used == (uint16_t)NO_VAL) return; /* Don't use the global g_res_list since we are going to * change the contents of this one. */ res_cond->with_clusters = 1; if (res_cond->cluster_list) { cluster_list = res_cond->cluster_list; res_cond->cluster_list = NULL; } res_list = acct_storage_g_get_res(db_conn, my_uid, res_cond); if (!res_list) { exit_code=1; fprintf(stderr, " Problem getting system resources " "from database. Contact your admin.\n"); return; } itr = list_iterator_create(res_list); while ((found_res = list_next(itr))) { int total = 0, percent_allowed; fprintf(stderr, " %s@%s\n", found_res->name, found_res->server); if (cluster_list) clus_itr = list_iterator_create(cluster_list); if (found_res->clus_res_list) { found_clus_itr = list_iterator_create( found_res->clus_res_list); while ((clus_res = list_next(found_clus_itr))) { cluster = NULL; if (clus_itr) { while ((cluster = list_next(clus_itr))) if (!strcmp(cluster, clus_res->cluster)) break; list_iterator_reset(clus_itr); } else /* This means we didn't specify any clusters (All clusters are overwritten with the requested percentage) so just put something there to get the correct percent_allowed. */ cluster = "nothing"; percent_allowed = cluster ? res->percent_used : clus_res->percent_allowed; total += percent_allowed; fprintf(stderr, " Cluster - %s\t %u%%\n", clus_res->cluster, percent_allowed); } } else if (clus_itr) { while ((cluster = list_next(clus_itr))) { total += res->percent_used; if (clus_res) { fprintf(stderr, " Cluster - %s\t %u%%\n", clus_res->cluster, res->percent_used); } else { error("%s: clus_res is NULL", __func__); } } } if (clus_itr) list_iterator_destroy(clus_itr); if (found_clus_itr) list_iterator_destroy(found_clus_itr); fprintf(stderr, " total\t\t%u%%\n", total); } list_iterator_destroy(itr); if (cluster_list) { res_cond->cluster_list = cluster_list; cluster_list = NULL; } }
extern int sacctmgr_add_res(int argc, char *argv[]) { int rc = SLURM_SUCCESS; int i=0, limit_set=0; ListIterator itr = NULL; ListIterator clus_itr = NULL; slurmdb_res_rec_t *res = NULL; slurmdb_res_rec_t *found_res = NULL; slurmdb_res_rec_t *start_res = xmalloc(sizeof(slurmdb_res_rec_t)); List cluster_list = list_create(slurm_destroy_char); List name_list = list_create(slurm_destroy_char); char *name = NULL; List res_list = NULL; char *res_str = NULL; slurmdb_init_res_rec(start_res, 0); for (i=0; i<argc; i++) { int command_len = strlen(argv[i]); if (!strncasecmp(argv[i], "Where", MAX(command_len, 5)) || !strncasecmp(argv[i], "Set", MAX(command_len, 3))) i++; limit_set += _set_res_rec(&i, argc, argv, name_list, cluster_list, start_res); } if (exit_code) { FREE_NULL_LIST(name_list); FREE_NULL_LIST(cluster_list); slurmdb_destroy_res_rec(start_res); return SLURM_ERROR; } else if (!list_count(name_list)) { FREE_NULL_LIST(name_list); FREE_NULL_LIST(cluster_list); slurmdb_destroy_res_rec(start_res); exit_code=1; fprintf(stderr, " Need name of resource to add.\n"); return SLURM_SUCCESS; } if (!start_res->server) { /* assign some server name */ start_res->server = xstrdup("slurmdb"); } if (!g_res_list) { slurmdb_res_cond_t res_cond; slurmdb_init_res_cond(&res_cond, 0); res_cond.with_clusters = 1; g_res_list = acct_storage_g_get_res(db_conn, my_uid, &res_cond); if (!g_res_list) { exit_code=1; fprintf(stderr, " Problem getting system resources " "from database. " "Contact your admin.\n"); FREE_NULL_LIST(name_list); FREE_NULL_LIST(cluster_list); slurmdb_destroy_res_rec(start_res); return SLURM_ERROR; } } res_list = list_create(slurmdb_destroy_res_rec); itr = list_iterator_create(name_list); if (cluster_list) clus_itr = list_iterator_create(cluster_list); while ((name = list_next(itr))) { bool added = 0; found_res = sacctmgr_find_res_from_list( g_res_list, NO_VAL, name, start_res->server); if (!found_res) { if (start_res->type == SLURMDB_RESOURCE_NOTSET) { exit_code=1; fprintf(stderr, " Need to designate a resource " "type to initially add '%s'.\n", name); break; } else if (start_res->count == NO_VAL) { exit_code=1; fprintf(stderr, " Need to designate a resource " "count to initially add '%s'.\n", name); break; } added = 1; res = xmalloc(sizeof(slurmdb_res_rec_t)); slurmdb_init_res_rec(res, 0); res->name = xstrdup(name); res->description = xstrdup(start_res->description ? start_res->description : name); res->manager = xstrdup(start_res->manager); res->server = xstrdup(start_res->server); res->count = start_res->count; res->flags = start_res->flags; res->type = start_res->type; xstrfmtcat(res_str, " %s@%s\n", res->name, res->server); list_append(res_list, res); } if (cluster_list && list_count(cluster_list)) { ListIterator found_itr = NULL; slurmdb_clus_res_rec_t *clus_res; char *cluster; uint16_t start_used = 0; if (found_res) { found_itr = list_iterator_create( found_res->clus_res_list); res = xmalloc(sizeof(slurmdb_res_rec_t)); slurmdb_init_res_rec(res, 0); res->id = found_res->id; res->type = found_res->type; start_used = res->percent_used = found_res->percent_used; } res->clus_res_list = list_create( slurmdb_destroy_clus_res_rec); while ((cluster = list_next(clus_itr))) { clus_res = NULL; if (found_res) { while ((clus_res = list_next(found_itr))) { if (!strcmp(clus_res->cluster, cluster)) break; } list_iterator_reset(found_itr); } if (!clus_res) { if (!added) { added = 1; xstrfmtcat(res_str, " %s@%s\n", name, res->server); list_append(res_list, res); } /* make sure we don't overcommit */ res->percent_used += start_res->percent_used; if (res->percent_used > 100) { exit_code=1; fprintf(stderr, " Adding this %d " "clusters to resource " "%s@%s at %u%% each " ", with %u%% already " "used, would go over " "100%%. Please redo " "your math and " "resubmit.\n", list_count( cluster_list), res->name, res->server, start_res->percent_used, start_used); break; } clus_res = xmalloc( sizeof(slurmdb_clus_res_rec_t)); list_append(res->clus_res_list, clus_res); clus_res->cluster = xstrdup(cluster); clus_res->percent_allowed = start_res->percent_used; xstrfmtcat(res_str, " Cluster - %s\t%u%%\n", cluster, clus_res->percent_allowed); /* FIXME: make sure we don't overcommit */ } } if (res->percent_used > 100) break; if (found_res) list_iterator_destroy(found_itr); if (!added) slurmdb_destroy_res_rec(res); list_iterator_reset(clus_itr); } } if (cluster_list) list_iterator_destroy(clus_itr); list_iterator_destroy(itr); FREE_NULL_LIST(name_list); FREE_NULL_LIST(cluster_list); if (exit_code) { rc = SLURM_ERROR; goto end_it; } if (!list_count(res_list)) { printf(" Nothing new added.\n"); rc = SLURM_ERROR; goto end_it; } if (res_str) { char *tmp_str; switch (res->type) { case SLURMDB_RESOURCE_LICENSE: tmp_str = "License"; break; default: tmp_str = "Unknown"; } printf(" Adding Resource(s)\n%s", res_str); printf(" Settings\n"); if (res->name) printf(" Name = %s\n", res->name); if (res->server) printf(" Server = %s\n", res->server); if (res->description) printf(" Description = %s\n", res->description); if (res->manager) printf(" Manager = %s\n", res->manager); if (res->count != NO_VAL) printf(" Count = %u\n", res->count); printf(" Type = %s\n", tmp_str); xfree(res_str); } if (list_count(res_list)) { notice_thread_init(); rc = acct_storage_g_add_res(db_conn, my_uid, res_list); notice_thread_fini(); } else goto end_it; if (rc == SLURM_SUCCESS) { if (commit_check("Would you like to commit changes?")) { acct_storage_g_commit(db_conn, 1); } else { printf(" Changes Discarded\n"); acct_storage_g_commit(db_conn, 0); } } else { exit_code=1; fprintf(stderr, " Problem adding system resource: %s\n", slurm_strerror(rc)); rc = SLURM_ERROR; } end_it: FREE_NULL_LIST(res_list); slurmdb_destroy_res_rec(start_res); return rc; }
/* * get res info from the storage * IN: slurmdb_res_cond_t * * RET: List of slurmdb_res_rec_t * * note List needs to be freed with slurm_list_destroy() when called */ extern List slurmdb_res_get(void *db_conn, slurmdb_res_cond_t *res_cond) { return acct_storage_g_get_res(db_conn, getuid(), res_cond); }