extern List as_mysql_modify_accts(mysql_conn_t *mysql_conn, uint32_t uid, slurmdb_account_cond_t *acct_cond, slurmdb_account_rec_t *acct) { ListIterator itr = NULL; List ret_list = NULL; int rc = SLURM_SUCCESS; char *object = NULL; char *vals = NULL, *extra = NULL, *query = NULL, *name_char = NULL; time_t now = time(NULL); char *user_name = NULL; int set = 0; MYSQL_RES *result = NULL; MYSQL_ROW row; if (!acct_cond || !acct) { error("we need something to change"); return NULL; } if (check_connection(mysql_conn) != SLURM_SUCCESS) return NULL; xstrcat(extra, "where deleted=0"); if (acct_cond->assoc_cond && acct_cond->assoc_cond->acct_list && list_count(acct_cond->assoc_cond->acct_list)) { set = 0; xstrcat(extra, " && ("); itr = list_iterator_create(acct_cond->assoc_cond->acct_list); while ((object = list_next(itr))) { if (set) xstrcat(extra, " || "); xstrfmtcat(extra, "name='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(extra, ")"); } if (acct_cond->description_list && list_count(acct_cond->description_list)) { set = 0; xstrcat(extra, " && ("); itr = list_iterator_create(acct_cond->description_list); while ((object = list_next(itr))) { if (set) xstrcat(extra, " || "); xstrfmtcat(extra, "description='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(extra, ")"); } if (acct_cond->organization_list && list_count(acct_cond->organization_list)) { set = 0; xstrcat(extra, " && ("); itr = list_iterator_create(acct_cond->organization_list); while ((object = list_next(itr))) { if (set) xstrcat(extra, " || "); xstrfmtcat(extra, "organization='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(extra, ")"); } if (acct->description) xstrfmtcat(vals, ", description='%s'", acct->description); if (acct->organization) xstrfmtcat(vals, ", organization='%s'", acct->organization); if (!extra || !vals) { errno = SLURM_NO_CHANGE_IN_DATA; error("Nothing to change"); return NULL; } query = xstrdup_printf("select name from %s %s;", acct_table, extra); xfree(extra); if (debug_flags & DEBUG_FLAG_DB_ASSOC) DB_DEBUG(mysql_conn->conn, "query\n%s", query); if (!(result = mysql_db_query_ret( mysql_conn, query, 0))) { xfree(query); xfree(vals); return NULL; } rc = 0; ret_list = list_create(slurm_destroy_char); while ((row = mysql_fetch_row(result))) { object = xstrdup(row[0]); list_append(ret_list, object); if (!rc) { xstrfmtcat(name_char, "(name='%s'", object); rc = 1; } else { xstrfmtcat(name_char, " || name='%s'", object); } } mysql_free_result(result); if (!list_count(ret_list)) { errno = SLURM_NO_CHANGE_IN_DATA; if (debug_flags & DEBUG_FLAG_DB_ASSOC) DB_DEBUG(mysql_conn->conn, "didn't effect anything\n%s", query); xfree(query); xfree(vals); return ret_list; } xfree(query); xstrcat(name_char, ")"); user_name = uid_to_string((uid_t) uid); rc = modify_common(mysql_conn, DBD_MODIFY_ACCOUNTS, now, user_name, acct_table, name_char, vals, NULL); xfree(user_name); if (rc == SLURM_ERROR) { error("Couldn't modify accounts"); list_destroy(ret_list); errno = SLURM_ERROR; ret_list = NULL; } xfree(name_char); xfree(vals); return ret_list; }
extern List as_mysql_modify_users(mysql_conn_t *mysql_conn, uint32_t uid, slurmdb_user_cond_t *user_cond, slurmdb_user_rec_t *user) { ListIterator itr = NULL; List ret_list = NULL; int rc = SLURM_SUCCESS; char *object = NULL; char *vals = NULL, *extra = NULL, *query = NULL, *name_char = NULL; time_t now = time(NULL); char *user_name = NULL; int set = 0; MYSQL_RES *result = NULL; MYSQL_ROW row; if (!user_cond || !user) { error("we need something to change"); return NULL; } if (check_connection(mysql_conn) != SLURM_SUCCESS) return NULL; if (user_cond->assoc_cond && user_cond->assoc_cond->user_list && list_count(user_cond->assoc_cond->user_list)) { set = 0; xstrcat(extra, " && ("); itr = list_iterator_create(user_cond->assoc_cond->user_list); while ((object = list_next(itr))) { if (set) xstrcat(extra, " || "); xstrfmtcat(extra, "name='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(extra, ")"); } if (user_cond->admin_level != SLURMDB_ADMIN_NOTSET) xstrfmtcat(extra, " && admin_level=%u", user_cond->admin_level); ret_list = _get_other_user_names_to_mod(mysql_conn, uid, user_cond); if (user->name) xstrfmtcat(vals, ", name='%s'", user->name); if (user->admin_level != SLURMDB_ADMIN_NOTSET) xstrfmtcat(vals, ", admin_level=%u", user->admin_level); if ((!extra && !ret_list) || (!vals && !user->default_acct && !user->default_wckey)) { errno = SLURM_NO_CHANGE_IN_DATA; error("Nothing to change"); return NULL; } if (!extra) { /* means we got a ret_list and don't need to look at the user_table. */ goto no_user_table; } query = xstrdup_printf( "select distinct name from %s where deleted=0 %s;", user_table, extra); xfree(extra); if (!(result = mysql_db_query_ret( mysql_conn, query, 0))) { xfree(query); if (ret_list) list_destroy(ret_list); return NULL; } if (!ret_list) ret_list = list_create(slurm_destroy_char); while ((row = mysql_fetch_row(result))) { slurmdb_user_rec_t *user_rec = NULL; object = row[0]; slurm_addto_char_list(ret_list, object); if (!name_char) xstrfmtcat(name_char, "(name='%s'", object); else xstrfmtcat(name_char, " || name='%s'", object); user_rec = xmalloc(sizeof(slurmdb_user_rec_t)); if (!user->name) user_rec->name = xstrdup(object); else { user_rec->name = xstrdup(user->name); user_rec->old_name = xstrdup(object); if (_change_user_name(mysql_conn, user_rec) != SLURM_SUCCESS) break; } user_rec->admin_level = user->admin_level; if (addto_update_list(mysql_conn->update_list, SLURMDB_MODIFY_USER, user_rec) != SLURM_SUCCESS) slurmdb_destroy_user_rec(user_rec); } mysql_free_result(result); no_user_table: if (!list_count(ret_list)) { errno = SLURM_NO_CHANGE_IN_DATA; debug3("didn't effect anything\n%s", query); xfree(vals); xfree(query); return ret_list; } else if (user->name && (list_count(ret_list) != 1)) { errno = ESLURM_ONE_CHANGE; xfree(vals); xfree(query); if (ret_list) list_destroy(ret_list); return NULL; } xfree(query); if (name_char && vals) { xstrcat(name_char, ")"); user_name = uid_to_string((uid_t) uid); rc = modify_common(mysql_conn, DBD_MODIFY_USERS, now, user_name, user_table, name_char, vals, NULL); xfree(user_name); } xfree(name_char); xfree(vals); if (rc == SLURM_ERROR) { error("Couldn't modify users"); list_destroy(ret_list); ret_list = NULL; } if (user->default_acct) { slurmdb_association_cond_t assoc_cond; slurmdb_association_rec_t assoc; List tmp_list = NULL; memset(&assoc_cond, 0, sizeof(slurmdb_association_cond_t)); slurmdb_init_association_rec(&assoc, 0); assoc.is_def = 1; assoc_cond.acct_list = list_create(NULL); list_append(assoc_cond.acct_list, user->default_acct); assoc_cond.user_list = ret_list; if (user_cond->assoc_cond && user_cond->assoc_cond->cluster_list) assoc_cond.cluster_list = user_cond->assoc_cond->cluster_list; tmp_list = as_mysql_modify_assocs(mysql_conn, uid, &assoc_cond, &assoc); list_destroy(assoc_cond.acct_list); if (!tmp_list) { list_destroy(ret_list); ret_list = NULL; goto end_it; } /* char *names = NULL; */ /* ListIterator itr = list_iterator_create(tmp_list); */ /* while ((names = list_next(itr))) { */ /* info("%s", names); */ /* } */ /* list_iterator_destroy(itr); */ list_destroy(tmp_list); } if (user->default_wckey) { slurmdb_wckey_cond_t wckey_cond; slurmdb_wckey_rec_t wckey; List tmp_list = NULL; memset(&wckey_cond, 0, sizeof(slurmdb_wckey_cond_t)); slurmdb_init_wckey_rec(&wckey, 0); wckey.is_def = 1; wckey_cond.name_list = list_create(NULL); list_append(wckey_cond.name_list, user->default_wckey); wckey_cond.user_list = ret_list; if (user_cond->assoc_cond && user_cond->assoc_cond->cluster_list) wckey_cond.cluster_list = user_cond->assoc_cond->cluster_list; tmp_list = as_mysql_modify_wckeys(mysql_conn, uid, &wckey_cond, &wckey); list_destroy(wckey_cond.name_list); if (!tmp_list) { list_destroy(ret_list); ret_list = NULL; goto end_it; } /* char *names = NULL; */ /* ListIterator itr = list_iterator_create(tmp_list); */ /* while ((names = list_next(itr))) { */ /* info("%s", names); */ /* } */ /* list_iterator_destroy(itr); */ list_destroy(tmp_list); } end_it: return ret_list; }
extern List as_mysql_modify_clusters(mysql_conn_t *mysql_conn, uint32_t uid, slurmdb_cluster_cond_t *cluster_cond, slurmdb_cluster_rec_t *cluster) { List ret_list = NULL; int rc = SLURM_SUCCESS; char *object = NULL; char *vals = NULL, *extra = NULL, *query = NULL, *name_char = NULL, *send_char = NULL; time_t now = time(NULL); char *user_name = NULL; int set = 0; MYSQL_RES *result = NULL; MYSQL_ROW row; bool clust_reg = false; /* If you need to alter the default values of the cluster use * modify_assocs since this is used only for registering * the controller when it loads */ if (!cluster_cond || !cluster) { error("we need something to change"); return NULL; } if (check_connection(mysql_conn) != SLURM_SUCCESS) return NULL; if (!is_user_min_admin_level(mysql_conn, uid, SLURMDB_ADMIN_SUPER_USER)) { errno = ESLURM_ACCESS_DENIED; return NULL; } /* force to only do non-deleted clusters */ cluster_cond->with_deleted = 0; _setup_cluster_cond_limits(cluster_cond, &extra); /* Needed if talking to older SLURM versions < 2.2 */ if (!mysql_conn->cluster_name && cluster_cond->cluster_list && list_count(cluster_cond->cluster_list)) mysql_conn->cluster_name = xstrdup(list_peek(cluster_cond->cluster_list)); set = 0; if (cluster->control_host) { xstrfmtcat(vals, ", control_host='%s'", cluster->control_host); set++; clust_reg = true; } if (cluster->control_port) { xstrfmtcat(vals, ", control_port=%u, last_port=%u", cluster->control_port, cluster->control_port); set++; clust_reg = true; } if (cluster->rpc_version) { xstrfmtcat(vals, ", rpc_version=%u", cluster->rpc_version); set++; clust_reg = true; } if (cluster->dimensions) { xstrfmtcat(vals, ", dimensions=%u", cluster->dimensions); clust_reg = true; } if (cluster->plugin_id_select) { xstrfmtcat(vals, ", plugin_id_select=%u", cluster->plugin_id_select); clust_reg = true; } if (cluster->flags != NO_VAL) { xstrfmtcat(vals, ", flags=%u", cluster->flags); clust_reg = true; } if (cluster->classification) { xstrfmtcat(vals, ", classification=%u", cluster->classification); } if (!vals) { xfree(extra); errno = SLURM_NO_CHANGE_IN_DATA; error("Nothing to change"); return NULL; } else if (clust_reg && (set != 3)) { xfree(vals); xfree(extra); errno = EFAULT; error("Need control host, port and rpc version " "to register a cluster"); return NULL; } xstrfmtcat(query, "select name, control_port from %s%s;", cluster_table, extra); if (debug_flags & DEBUG_FLAG_DB_ASSOC) DB_DEBUG(mysql_conn->conn, "query\n%s", query); if (!(result = mysql_db_query_ret( mysql_conn, query, 0))) { xfree(query); xfree(vals); error("no result given for %s", extra); xfree(extra); return NULL; } xfree(extra); rc = 0; ret_list = list_create(slurm_destroy_char); while ((row = mysql_fetch_row(result))) { object = xstrdup(row[0]); list_append(ret_list, object); if (!rc) { xstrfmtcat(name_char, "name='%s'", object); rc = 1; } else { xstrfmtcat(name_char, " || name='%s'", object); } } mysql_free_result(result); if (!list_count(ret_list)) { errno = SLURM_NO_CHANGE_IN_DATA; if (debug_flags & DEBUG_FLAG_DB_ASSOC) DB_DEBUG(mysql_conn->conn, "didn't effect anything\n%s", query); xfree(name_char); xfree(vals); xfree(query); return ret_list; } xfree(query); if (vals) { send_char = xstrdup_printf("(%s)", name_char); user_name = uid_to_string((uid_t) uid); rc = modify_common(mysql_conn, DBD_MODIFY_CLUSTERS, now, user_name, cluster_table, send_char, vals, NULL); xfree(user_name); if (rc == SLURM_ERROR) { error("Couldn't modify cluster 1"); FREE_NULL_LIST(ret_list); ret_list = NULL; goto end_it; } } end_it: xfree(name_char); xfree(vals); xfree(send_char); return ret_list; }
extern List as_mysql_modify_qos(mysql_conn_t *mysql_conn, uint32_t uid, slurmdb_qos_cond_t *qos_cond, slurmdb_qos_rec_t *qos) { ListIterator itr = NULL; List ret_list = NULL; int rc = SLURM_SUCCESS; char *object = NULL; char *vals = NULL, *extra = NULL, *query = NULL, *name_char = NULL; time_t now = time(NULL); char *user_name = NULL; int set = 0; MYSQL_RES *result = NULL; MYSQL_ROW row; char *tmp_char1=NULL, *tmp_char2=NULL; bitstr_t *preempt_bitstr = NULL; char *added_preempt = NULL; if (!qos_cond || !qos) { error("we need something to change"); return NULL; } if (check_connection(mysql_conn) != SLURM_SUCCESS) return NULL; xstrcat(extra, "where deleted=0"); if (qos_cond->description_list && list_count(qos_cond->description_list)) { set = 0; xstrcat(extra, " && ("); itr = list_iterator_create(qos_cond->description_list); while ((object = list_next(itr))) { if (set) xstrcat(extra, " || "); xstrfmtcat(extra, "description='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(extra, ")"); } if (qos_cond->id_list && list_count(qos_cond->id_list)) { set = 0; xstrcat(extra, " && ("); itr = list_iterator_create(qos_cond->id_list); while ((object = list_next(itr))) { if (set) xstrcat(extra, " || "); xstrfmtcat(extra, "id='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(extra, ")"); } if (qos_cond->name_list && list_count(qos_cond->name_list)) { set = 0; xstrcat(extra, " && ("); itr = list_iterator_create(qos_cond->name_list); while ((object = list_next(itr))) { if (set) xstrcat(extra, " || "); xstrfmtcat(extra, "name='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(extra, ")"); } _setup_qos_limits(qos, &tmp_char1, &tmp_char2, &vals, &added_preempt, 0); if (added_preempt) { preempt_bitstr = bit_alloc(g_qos_count); bit_unfmt(preempt_bitstr, added_preempt+1); xfree(added_preempt); } xfree(tmp_char1); xfree(tmp_char2); if (!extra || !vals) { errno = SLURM_NO_CHANGE_IN_DATA; FREE_NULL_BITMAP(preempt_bitstr); error("Nothing to change"); return NULL; } query = xstrdup_printf("select name, preempt, id from %s %s;", qos_table, extra); xfree(extra); if (!(result = mysql_db_query_ret(mysql_conn, query, 0))) { xfree(query); FREE_NULL_BITMAP(preempt_bitstr); return NULL; } rc = 0; ret_list = list_create(slurm_destroy_char); while ((row = mysql_fetch_row(result))) { slurmdb_qos_rec_t *qos_rec = NULL; uint32_t id = slurm_atoul(row[2]); if (preempt_bitstr) { if (_preemption_loop(mysql_conn, id, preempt_bitstr)) break; } object = xstrdup(row[0]); list_append(ret_list, object); if (!rc) { xstrfmtcat(name_char, "(name='%s'", object); rc = 1; } else { xstrfmtcat(name_char, " || name='%s'", object); } qos_rec = xmalloc(sizeof(slurmdb_qos_rec_t)); qos_rec->name = xstrdup(object); qos_rec->id = id; qos_rec->flags = qos->flags; qos_rec->grp_cpus = qos->grp_cpus; qos_rec->grace_time = qos->grace_time; qos_rec->grp_cpu_mins = qos->grp_cpu_mins; qos_rec->grp_cpu_run_mins = qos->grp_cpu_run_mins; qos_rec->grp_jobs = qos->grp_jobs; qos_rec->grp_nodes = qos->grp_nodes; qos_rec->grp_submit_jobs = qos->grp_submit_jobs; qos_rec->grp_wall = qos->grp_wall; qos_rec->max_cpus_pj = qos->max_cpus_pj; qos_rec->max_cpu_mins_pj = qos->max_cpu_mins_pj; qos_rec->max_cpu_run_mins_pu = qos->max_cpu_run_mins_pu; qos_rec->max_jobs_pu = qos->max_jobs_pu; qos_rec->max_nodes_pj = qos->max_nodes_pj; qos_rec->max_submit_jobs_pu = qos->max_submit_jobs_pu; qos_rec->max_wall_pj = qos->max_wall_pj; qos_rec->preempt_mode = qos->preempt_mode; qos_rec->priority = qos->priority; if (qos->preempt_list) { ListIterator new_preempt_itr = list_iterator_create(qos->preempt_list); char *new_preempt = NULL; qos_rec->preempt_bitstr = bit_alloc(g_qos_count); if (row[1] && row[1][0]) bit_unfmt(qos_rec->preempt_bitstr, row[1]+1); while ((new_preempt = list_next(new_preempt_itr))) { bool cleared = 0; if (new_preempt[0] == '-') { bit_clear(qos_rec->preempt_bitstr, atol(new_preempt+1)); } else if (new_preempt[0] == '+') { bit_set(qos_rec->preempt_bitstr, atol(new_preempt+1)); } else { if (!cleared) { cleared = 1; bit_nclear( qos_rec->preempt_bitstr, 0, g_qos_count-1); } bit_set(qos_rec->preempt_bitstr, atol(new_preempt)); } } list_iterator_destroy(new_preempt_itr); } qos_rec->usage_factor = qos->usage_factor; qos_rec->usage_thres = qos->usage_thres; if (addto_update_list(mysql_conn->update_list, SLURMDB_MODIFY_QOS, qos_rec) != SLURM_SUCCESS) slurmdb_destroy_qos_rec(qos_rec); } mysql_free_result(result); FREE_NULL_BITMAP(preempt_bitstr); if (row) { xfree(vals); xfree(name_char); xfree(query); list_destroy(ret_list); ret_list = NULL; errno = ESLURM_QOS_PREEMPTION_LOOP; return ret_list; } if (!list_count(ret_list)) { errno = SLURM_NO_CHANGE_IN_DATA; debug3("didn't effect anything\n%s", query); xfree(vals); xfree(query); return ret_list; } xfree(query); xstrcat(name_char, ")"); user_name = uid_to_string((uid_t) uid); rc = modify_common(mysql_conn, DBD_MODIFY_QOS, now, user_name, qos_table, name_char, vals, NULL); xfree(user_name); xfree(name_char); xfree(vals); if (rc == SLURM_ERROR) { error("Couldn't modify qos"); list_destroy(ret_list); ret_list = NULL; } return ret_list; }
static int _cluster_modify_wckeys(mysql_conn_t *mysql_conn, slurmdb_wckey_rec_t *wckey, char *cluster_name, char *extra, char *vals, char *user_name, List ret_list) { int rc = SLURM_SUCCESS; MYSQL_RES *result = NULL; MYSQL_ROW row; char *wckey_char = NULL; time_t now = time(NULL); char *query = NULL; query = xstrdup_printf("select t1.id_wckey, t1.wckey_name, t1.user " "from \"%s_%s\" as t1%s;", cluster_name, wckey_table, extra); if (!(result = mysql_db_query_ret(mysql_conn, query, 0))) { xfree(query); return SLURM_ERROR; } /* This key doesn't exist on this cluster, that is ok. */ if (!mysql_num_rows(result)) return SLURM_SUCCESS; while ((row = mysql_fetch_row(result))) { slurmdb_wckey_rec_t *wckey_rec = NULL; char *object = xstrdup_printf( "C = %-10s W = %-20s U = %-9s", cluster_name, row[1], row[2]); list_append(ret_list, object); if (!wckey_char) xstrfmtcat(wckey_char, "id_wckey='%s'", row[0]); else xstrfmtcat(wckey_char, " || id_wckey='%s'", row[0]); wckey_rec = xmalloc(sizeof(slurmdb_wckey_rec_t)); /* we only need id and cluster when removing no real need to init */ wckey_rec->id = slurm_atoul(row[0]); wckey_rec->cluster = xstrdup(cluster_name); wckey_rec->is_def = wckey->is_def; if (addto_update_list(mysql_conn->update_list, SLURMDB_MODIFY_WCKEY, wckey_rec) != SLURM_SUCCESS) slurmdb_destroy_wckey_rec(wckey_rec); if (wckey->is_def == 1) { /* Use fresh one here so we don't have to worry about dealing with bad values. */ slurmdb_wckey_rec_t tmp_wckey; slurmdb_init_wckey_rec(&tmp_wckey, 0); tmp_wckey.is_def = 1; tmp_wckey.cluster = cluster_name; tmp_wckey.name = row[1]; tmp_wckey.user = row[2]; if ((rc = _reset_default_wckey(mysql_conn, &tmp_wckey)) != SLURM_SUCCESS) break; } } mysql_free_result(result); if (!list_count(ret_list)) { errno = SLURM_NO_CHANGE_IN_DATA; if (debug_flags & DEBUG_FLAG_DB_WCKEY) DB_DEBUG(mysql_conn->conn, "didn't effect anything\n%s", query); xfree(query); xfree(wckey_char); return SLURM_SUCCESS; } xfree(query); rc = modify_common(mysql_conn, DBD_MODIFY_WCKEYS, now, user_name, wckey_table, wckey_char, vals, cluster_name); xfree(wckey_char); return rc; }
extern List as_mysql_modify_job(mysql_conn_t *mysql_conn, uint32_t uid, slurmdb_job_modify_cond_t *job_cond, slurmdb_job_rec_t *job) { List ret_list = NULL; int rc = SLURM_SUCCESS; char *object = NULL; char *vals = NULL, *query = NULL, *cond_char = NULL; time_t now = time(NULL); char *user_name = NULL; MYSQL_RES *result = NULL; MYSQL_ROW row; if (!job_cond || !job) { error("we need something to change"); return NULL; } else if (job_cond->job_id == NO_VAL) { errno = SLURM_NO_CHANGE_IN_DATA; error("Job ID was not specified for job modification\n"); return NULL; } else if (!job_cond->cluster) { errno = SLURM_NO_CHANGE_IN_DATA; error("Cluster was not specified for job modification\n"); return NULL; } else if (check_connection(mysql_conn) != SLURM_SUCCESS) return NULL; if (job->derived_ec != NO_VAL) xstrfmtcat(vals, ", derived_ec=%u", job->derived_ec); if (job->derived_es) { char *derived_es = slurm_add_slash_to_quotes(job->derived_es); xstrfmtcat(vals, ", derived_es='%s'", derived_es); xfree(derived_es); } if (!vals) { errno = SLURM_NO_CHANGE_IN_DATA; error("No change specified for job modification"); return NULL; } /* Here we want to get the last job submitted here */ query = xstrdup_printf("select job_db_inx, id_job, time_submit, " "id_user " "from \"%s_%s\" where deleted=0 " "&& id_job=%u " "order by time_submit desc limit 1;", job_cond->cluster, job_table, job_cond->job_id); debug3("%d(%s:%d) query\n%s", mysql_conn->conn, THIS_FILE, __LINE__, query); if (!(result = mysql_db_query_ret(mysql_conn, query, 0))) { xfree(vals); xfree(query); return NULL; } if ((row = mysql_fetch_row(result))) { char tmp_char[25]; time_t time_submit = atol(row[2]); if ((uid != atoi(row[3])) && !is_user_min_admin_level(mysql_conn, uid, SLURMDB_ADMIN_OPERATOR)) { errno = ESLURM_ACCESS_DENIED; xfree(vals); xfree(query); mysql_free_result(result); return NULL; } slurm_make_time_str(&time_submit, tmp_char, sizeof(tmp_char)); xstrfmtcat(cond_char, "job_db_inx=%s", row[0]); object = xstrdup_printf("%s submitted at %s", row[1], tmp_char); ret_list = list_create(slurm_destroy_char); list_append(ret_list, object); mysql_free_result(result); } else { errno = ESLURM_INVALID_JOB_ID; debug3("as_mysql_modify_job: Job not found\n%s", query); xfree(vals); xfree(query); mysql_free_result(result); return NULL; } xfree(query); user_name = uid_to_string((uid_t) uid); rc = modify_common(mysql_conn, DBD_MODIFY_JOB, now, user_name, job_table, cond_char, vals, job_cond->cluster); xfree(user_name); xfree(cond_char); xfree(vals); if (rc == SLURM_ERROR) { error("Couldn't modify job"); list_destroy(ret_list); ret_list = NULL; } return ret_list; }
extern List as_mysql_modify_qos(mysql_conn_t *mysql_conn, uint32_t uid, slurmdb_qos_cond_t *qos_cond, slurmdb_qos_rec_t *qos) { ListIterator itr = NULL; List ret_list = NULL; int rc = SLURM_SUCCESS; char *object = NULL; char *vals = NULL, *extra = NULL, *query = NULL, *name_char = NULL; time_t now = time(NULL); char *user_name = NULL; int set = 0, i; MYSQL_RES *result = NULL; MYSQL_ROW row; char *tmp_char1=NULL, *tmp_char2=NULL; bitstr_t *preempt_bitstr = NULL; char *added_preempt = NULL; uint32_t qos_cnt; assoc_mgr_lock_t locks = { NO_LOCK, NO_LOCK, READ_LOCK, NO_LOCK, NO_LOCK, NO_LOCK, NO_LOCK }; if (!qos_cond || !qos) { error("we need something to change"); return NULL; } if (check_connection(mysql_conn) != SLURM_SUCCESS) return NULL; if (!is_user_min_admin_level(mysql_conn, uid, SLURMDB_ADMIN_SUPER_USER)) { errno = ESLURM_ACCESS_DENIED; return NULL; } xstrcat(extra, "where deleted=0"); if (qos_cond->description_list && list_count(qos_cond->description_list)) { set = 0; xstrcat(extra, " && ("); itr = list_iterator_create(qos_cond->description_list); while ((object = list_next(itr))) { if (set) xstrcat(extra, " || "); xstrfmtcat(extra, "description='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(extra, ")"); } if (qos_cond->id_list && list_count(qos_cond->id_list)) { set = 0; xstrcat(extra, " && ("); itr = list_iterator_create(qos_cond->id_list); while ((object = list_next(itr))) { if (set) xstrcat(extra, " || "); xstrfmtcat(extra, "id='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(extra, ")"); } if (qos_cond->name_list && list_count(qos_cond->name_list)) { set = 0; xstrcat(extra, " && ("); itr = list_iterator_create(qos_cond->name_list); while ((object = list_next(itr))) { if (set) xstrcat(extra, " || "); xstrfmtcat(extra, "name='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(extra, ")"); } _setup_qos_limits(qos, &tmp_char1, &tmp_char2, &vals, &added_preempt, 0); assoc_mgr_lock(&locks); qos_cnt = g_qos_count; assoc_mgr_unlock(&locks); if (added_preempt) { preempt_bitstr = bit_alloc(qos_cnt); bit_unfmt(preempt_bitstr, added_preempt+1); xfree(added_preempt); } xfree(tmp_char1); xfree(tmp_char2); if (!extra || !vals) { errno = SLURM_NO_CHANGE_IN_DATA; FREE_NULL_BITMAP(preempt_bitstr); error("Nothing to change"); return NULL; } object = xstrdup(mqos_req_inx[0]); for (i = 1; i < MQOS_COUNT; i++) xstrfmtcat(object, ", %s", mqos_req_inx[i]); query = xstrdup_printf("select %s from %s %s;", object, qos_table, extra); xfree(extra); xfree(object); if (!(result = mysql_db_query_ret(mysql_conn, query, 0))) { xfree(query); FREE_NULL_BITMAP(preempt_bitstr); return NULL; } rc = 0; ret_list = list_create(slurm_destroy_char); while ((row = mysql_fetch_row(result))) { slurmdb_qos_rec_t *qos_rec = NULL; uint32_t id = slurm_atoul(row[MQOS_ID]); if (preempt_bitstr) { if (_preemption_loop(mysql_conn, id, preempt_bitstr)) break; } object = xstrdup(row[MQOS_NAME]); list_append(ret_list, object); if (!rc) { xstrfmtcat(name_char, "(name='%s'", object); rc = 1; } else { xstrfmtcat(name_char, " || name='%s'", object); } qos_rec = xmalloc(sizeof(slurmdb_qos_rec_t)); qos_rec->name = xstrdup(object); qos_rec->id = id; qos_rec->flags = qos->flags; qos_rec->grace_time = qos->grace_time; mod_tres_str(&qos_rec->grp_tres, qos->grp_tres, row[MQOS_GT], NULL, "grp_tres", &vals, qos_rec->id, 0); mod_tres_str(&qos_rec->grp_tres_mins, qos->grp_tres_mins, row[MQOS_GTM], NULL, "grp_tres_mins", &vals, qos_rec->id, 0); mod_tres_str(&qos_rec->grp_tres_run_mins, qos->grp_tres_run_mins, row[MQOS_GTRM], NULL, "grp_tres_run_mins", &vals, qos_rec->id, 0); qos_rec->grp_jobs = qos->grp_jobs; qos_rec->grp_submit_jobs = qos->grp_submit_jobs; qos_rec->grp_wall = qos->grp_wall; mod_tres_str(&qos_rec->max_tres_pa, qos->max_tres_pa, row[MQOS_MTPA], NULL, "max_tres_pa", &vals, qos_rec->id, 0); mod_tres_str(&qos_rec->max_tres_pj, qos->max_tres_pj, row[MQOS_MTPJ], NULL, "max_tres_pj", &vals, qos_rec->id, 0); mod_tres_str(&qos_rec->max_tres_pn, qos->max_tres_pn, row[MQOS_MTPN], NULL, "max_tres_pn", &vals, qos_rec->id, 0); mod_tres_str(&qos_rec->max_tres_pu, qos->max_tres_pu, row[MQOS_MTPU], NULL, "max_tres_pu", &vals, qos_rec->id, 0); mod_tres_str(&qos_rec->max_tres_mins_pj, qos->max_tres_mins_pj, row[MQOS_MTMPJ], NULL, "max_tres_mins_pj", &vals, qos_rec->id, 0); mod_tres_str(&qos_rec->max_tres_run_mins_pa, qos->max_tres_run_mins_pa, row[MQOS_MTRM], NULL, "max_tres_run_mins_pa", &vals, qos_rec->id, 0); mod_tres_str(&qos_rec->max_tres_run_mins_pu, qos->max_tres_run_mins_pu, row[MQOS_MTRM], NULL, "max_tres_run_mins_pu", &vals, qos_rec->id, 0); qos_rec->max_jobs_pa = qos->max_jobs_pa; qos_rec->max_jobs_pu = qos->max_jobs_pu; qos_rec->max_submit_jobs_pa = qos->max_submit_jobs_pa; qos_rec->max_submit_jobs_pu = qos->max_submit_jobs_pu; qos_rec->max_wall_pj = qos->max_wall_pj; mod_tres_str(&qos_rec->min_tres_pj, qos->min_tres_pj, row[MQOS_MITPJ], NULL, "min_tres_pj", &vals, qos_rec->id, 0); qos_rec->preempt_mode = qos->preempt_mode; qos_rec->priority = qos->priority; if (qos->preempt_list) { ListIterator new_preempt_itr = list_iterator_create(qos->preempt_list); char *new_preempt = NULL; bool cleared = 0; qos_rec->preempt_bitstr = bit_alloc(qos_cnt); if (row[MQOS_PREEMPT] && row[MQOS_PREEMPT][0]) bit_unfmt(qos_rec->preempt_bitstr, row[MQOS_PREEMPT]+1); while ((new_preempt = list_next(new_preempt_itr))) { if (new_preempt[0] == '-') { bit_clear(qos_rec->preempt_bitstr, atol(new_preempt+1)); } else if (new_preempt[0] == '+') { bit_set(qos_rec->preempt_bitstr, atol(new_preempt+1)); } else { if (!cleared) { cleared = 1; bit_nclear( qos_rec->preempt_bitstr, 0, qos_cnt-1); } bit_set(qos_rec->preempt_bitstr, atol(new_preempt)); } } list_iterator_destroy(new_preempt_itr); } qos_rec->usage_factor = qos->usage_factor; qos_rec->usage_thres = qos->usage_thres; if (addto_update_list(mysql_conn->update_list, SLURMDB_MODIFY_QOS, qos_rec) != SLURM_SUCCESS) slurmdb_destroy_qos_rec(qos_rec); } mysql_free_result(result); FREE_NULL_BITMAP(preempt_bitstr); if (row) { xfree(vals); xfree(name_char); xfree(query); FREE_NULL_LIST(ret_list); ret_list = NULL; errno = ESLURM_QOS_PREEMPTION_LOOP; return ret_list; } if (!list_count(ret_list)) { errno = SLURM_NO_CHANGE_IN_DATA; if (debug_flags & DEBUG_FLAG_DB_QOS) DB_DEBUG(mysql_conn->conn, "didn't effect anything\n%s", query); xfree(vals); xfree(query); return ret_list; } xfree(query); xstrcat(name_char, ")"); user_name = uid_to_string((uid_t) uid); rc = modify_common(mysql_conn, DBD_MODIFY_QOS, now, user_name, qos_table, name_char, vals, NULL); xfree(user_name); xfree(name_char); xfree(vals); if (rc == SLURM_ERROR) { error("Couldn't modify qos"); FREE_NULL_LIST(ret_list); ret_list = NULL; } return ret_list; }
extern List as_mysql_modify_federations( mysql_conn_t *mysql_conn, uint32_t uid, slurmdb_federation_cond_t *fed_cond, slurmdb_federation_rec_t *fed) { List ret_list = NULL; int rc = SLURM_SUCCESS; int req_inx = 0; char *object = NULL; char *vals = NULL, *extra = NULL, *query = NULL, *name_char = NULL, *fed_items = NULL; char *tmp_char1 = NULL, *tmp_char2 = NULL; time_t now = time(NULL); MYSQL_RES *result = NULL; MYSQL_ROW row; if (!fed_cond || !fed) { error("we need something to change"); return NULL; } if (check_connection(mysql_conn) != SLURM_SUCCESS) return NULL; if (!is_user_min_admin_level(mysql_conn, uid, SLURMDB_ADMIN_SUPER_USER)) { errno = ESLURM_ACCESS_DENIED; return NULL; } /* force to only do non-deleted federations */ fed_cond->with_deleted = 0; _setup_federation_cond_limits(fed_cond, &extra); _setup_federation_rec_limits(fed, &tmp_char1, &tmp_char2, &vals); xfree(tmp_char1); xfree(tmp_char2); if (!extra || (!vals && (!fed->cluster_list || !list_count(fed->cluster_list)))) { xfree(extra); xfree(vals); errno = SLURM_NO_CHANGE_IN_DATA; error("Nothing to change"); return NULL; } if (fed->cluster_list && fed_cond->federation_list && (list_count(fed_cond->federation_list) > 1)) { xfree(extra); xfree(vals); error("Clusters can only be assigned to one federation"); errno = ESLURM_FED_CLUSTER_MULTIPLE_ASSIGNMENT; return NULL; } /* Select records that are going to get updated. * 1 - to be able to report what is getting updated * 2 - to create an update object to let the controller know. */ xstrfmtcat(fed_items, "%s", fed_req_inx[req_inx]); for(req_inx = 1; req_inx < FED_REQ_COUNT; req_inx++) { xstrfmtcat(fed_items, ", %s", fed_req_inx[req_inx]); } xstrfmtcat(query, "select %s from %s as t1 %s;", fed_items, federation_table, extra); xfree(fed_items); if (debug_flags & DEBUG_FLAG_FEDR) DB_DEBUG(mysql_conn->conn, "query\n%s", query); if (!(result = mysql_db_query_ret(mysql_conn, query, 0))) { xfree(query); xfree(vals); xfree(extra); error("no result given for %s", extra); return NULL; } xfree(extra); ret_list = list_create(slurm_destroy_char); while ((row = mysql_fetch_row(result))) { object = xstrdup(row[0]); list_append(ret_list, object); if (!name_char) { xstrfmtcat(name_char, "(name='%s'", object); } else { xstrfmtcat(name_char, " || name='%s'", object); } } mysql_free_result(result); if (fed->cluster_list && (_assign_clusters_to_federation(mysql_conn, object, fed->cluster_list))) { xfree(vals); xfree(name_char); xfree(query); return NULL; } if (!list_count(ret_list)) { errno = SLURM_NO_CHANGE_IN_DATA; if (debug_flags & DEBUG_FLAG_FEDR) DB_DEBUG(mysql_conn->conn, "didn't effect anything\n%s", query); xfree(vals); xfree(name_char); xfree(query); return ret_list; } xfree(query); xstrcat(name_char, ")"); if (vals) { char *user_name = uid_to_string((uid_t) uid); rc = modify_common(mysql_conn, DBD_MODIFY_FEDERATIONS, now, user_name, federation_table, name_char, vals, NULL); xfree(user_name); } xfree(name_char); xfree(vals); if (rc == SLURM_ERROR) { error("Couldn't modify federation"); FREE_NULL_LIST(ret_list); ret_list = NULL; } else as_mysql_add_feds_to_update_list(mysql_conn); return ret_list; }