extern int as_mysql_get_usage(mysql_conn_t *mysql_conn, uid_t uid, void *in, slurmdbd_msg_type_t type, time_t start, time_t end) { int rc = SLURM_SUCCESS; int i=0, is_admin=1; MYSQL_RES *result = NULL; MYSQL_ROW row; char *tmp = NULL; char *my_usage_table = NULL; slurmdb_association_rec_t *slurmdb_assoc = in; slurmdb_wckey_rec_t *slurmdb_wckey = in; char *query = NULL; char *username = NULL; uint16_t private_data = 0; slurmdb_user_rec_t user; List *my_list; uint32_t id = NO_VAL; char *cluster_name = NULL; char **usage_req_inx = NULL; enum { USAGE_ID, USAGE_START, USAGE_ACPU, USAGE_COUNT, USAGE_ENERGY }; switch (type) { case DBD_GET_ASSOC_USAGE: { char *temp_usage[] = { "t3.id_assoc", "t1.time_start", "t1.alloc_cpu_secs" }; usage_req_inx = temp_usage; id = slurmdb_assoc->id; cluster_name = slurmdb_assoc->cluster; username = slurmdb_assoc->user; my_list = &slurmdb_assoc->accounting_list; my_usage_table = assoc_day_table; break; } case DBD_GET_WCKEY_USAGE: { char *temp_usage[] = { "id_wckey", "time_start", "alloc_cpu_secs" }; usage_req_inx = temp_usage; id = slurmdb_wckey->id; cluster_name = slurmdb_wckey->cluster; username = slurmdb_wckey->user; my_list = &slurmdb_wckey->accounting_list; my_usage_table = wckey_day_table; break; } case DBD_GET_CLUSTER_USAGE: { return _get_cluster_usage(mysql_conn, uid, in, type, start, end); break; } default: error("Unknown usage type %d", type); return SLURM_ERROR; break; } if (!id) { error("We need an id to set data for getting usage"); return SLURM_ERROR; } else if (!cluster_name) { error("We need a cluster_name to set data for getting usage"); return SLURM_ERROR; } if (check_connection(mysql_conn) != SLURM_SUCCESS) return ESLURM_DB_CONNECTION; memset(&user, 0, sizeof(slurmdb_user_rec_t)); user.uid = uid; private_data = slurm_get_private_data(); if (private_data & PRIVATE_DATA_USAGE) { if (!(is_admin = is_user_min_admin_level( mysql_conn, uid, SLURMDB_ADMIN_OPERATOR))) { ListIterator itr = NULL; slurmdb_coord_rec_t *coord = NULL; if (username && !strcmp(slurmdb_assoc->user, user.name)) goto is_user; if (type != DBD_GET_ASSOC_USAGE) goto bad_user; if (!slurmdb_assoc->acct) { debug("No account name given " "in association."); goto bad_user; } if (!is_user_any_coord(mysql_conn, &user)) { debug4("This user is not a coordinator."); goto bad_user; } /* Existance of user.coord_accts is checked in is_user_any_coord. */ itr = list_iterator_create(user.coord_accts); while ((coord = list_next(itr))) if (!strcasecmp(coord->name, slurmdb_assoc->acct)) break; list_iterator_destroy(itr); if (coord) goto is_user; bad_user: errno = ESLURM_ACCESS_DENIED; return SLURM_ERROR; } } is_user: if (set_usage_information(&my_usage_table, type, &start, &end) != SLURM_SUCCESS) { return SLURM_ERROR; } xfree(tmp); i=0; xstrfmtcat(tmp, "%s", usage_req_inx[i]); for(i=1; i<USAGE_COUNT; i++) { xstrfmtcat(tmp, ", %s", usage_req_inx[i]); } switch (type) { case DBD_GET_ASSOC_USAGE: query = xstrdup_printf( "select %s from \"%s_%s\" as t1, " "\"%s_%s\" as t2, \"%s_%s\" as t3 " "where (t1.time_start < %ld && t1.time_start >= %ld) " "&& t1.id_assoc=t2.id_assoc && t3.id_assoc=%d && " "t2.lft between t3.lft and t3.rgt " "order by t3.id_assoc, time_start;", tmp, cluster_name, my_usage_table, cluster_name, cluster_name, assoc_table, assoc_table, end, start, id); break; case DBD_GET_WCKEY_USAGE: query = xstrdup_printf( "select %s from \"%s_%s\" " "where (time_start < %ld && time_start >= %ld) " "&& id_wckey=%d order by id_wckey, time_start;", tmp, cluster_name, my_usage_table, end, start, id); break; default: error("Unknown usage type %d", type); return SLURM_ERROR; break; } xfree(tmp); debug4("%d(%s:%d) query\n%s", mysql_conn->conn, THIS_FILE, __LINE__, query); if (!(result = mysql_db_query_ret( mysql_conn, query, 0))) { xfree(query); return SLURM_ERROR; } xfree(query); if (!(*my_list)) (*my_list) = list_create(slurmdb_destroy_accounting_rec); while ((row = mysql_fetch_row(result))) { slurmdb_accounting_rec_t *accounting_rec = xmalloc(sizeof(slurmdb_accounting_rec_t)); accounting_rec->id = slurm_atoul(row[USAGE_ID]); accounting_rec->period_start = slurm_atoul(row[USAGE_START]); accounting_rec->alloc_secs = slurm_atoull(row[USAGE_ACPU]); accounting_rec->consumed_energy = slurm_atoull(row[USAGE_ENERGY]); list_append((*my_list), accounting_rec); } mysql_free_result(result); return rc; }
/* The assoc_mgr locks should be unlocked before coming here. */ extern int as_mysql_get_usage(mysql_conn_t *mysql_conn, uid_t uid, void *in, slurmdbd_msg_type_t type, time_t start, time_t end) { int rc = SLURM_SUCCESS; int is_admin=1; char *my_usage_table = NULL; slurmdb_assoc_rec_t *slurmdb_assoc = in; slurmdb_wckey_rec_t *slurmdb_wckey = in; char *username = NULL; uint16_t private_data = 0; List *my_list = NULL; char *cluster_name = NULL; char *id_str = NULL; if (check_connection(mysql_conn) != SLURM_SUCCESS) return ESLURM_DB_CONNECTION; switch (type) { case DBD_GET_ASSOC_USAGE: if (!slurmdb_assoc->id) { error("We need an id to set data for getting usage"); return SLURM_ERROR; } id_str = xstrdup_printf("t3.id_assoc=%u", slurmdb_assoc->id); cluster_name = slurmdb_assoc->cluster; username = slurmdb_assoc->user; my_list = &slurmdb_assoc->accounting_list; my_usage_table = assoc_day_table; break; case DBD_GET_WCKEY_USAGE: if (!slurmdb_wckey->id) { error("We need an id to set data for getting usage"); return SLURM_ERROR; } id_str = xstrdup_printf("id=%d", slurmdb_wckey->id); cluster_name = slurmdb_wckey->cluster; username = slurmdb_wckey->user; my_list = &slurmdb_wckey->accounting_list; my_usage_table = wckey_day_table; break; case DBD_GET_CLUSTER_USAGE: rc = _get_cluster_usage(mysql_conn, uid, in, type, start, end); return rc; break; default: error("Unknown usage type %d", type); return SLURM_ERROR; break; } if (!cluster_name) { error("We need a cluster_name to set data for getting usage"); xfree(id_str); return SLURM_ERROR; } private_data = slurm_get_private_data(); if (private_data & PRIVATE_DATA_USAGE) { if (!(is_admin = is_user_min_admin_level( mysql_conn, uid, SLURMDB_ADMIN_OPERATOR))) { ListIterator itr = NULL; slurmdb_coord_rec_t *coord = NULL; slurmdb_user_rec_t user; bool is_coord; memset(&user, 0, sizeof(slurmdb_user_rec_t)); user.uid = uid; is_coord = is_user_any_coord(mysql_conn, &user); if (username && !strcmp(username, user.name)) goto is_user; if (type != DBD_GET_ASSOC_USAGE) goto bad_user; if (!slurmdb_assoc->acct) { debug("No account name given " "in association."); goto bad_user; } if (!is_coord) { debug4("This user is not a coordinator."); goto bad_user; } /* Existance of user.coord_accts is checked in is_user_any_coord. */ itr = list_iterator_create(user.coord_accts); while ((coord = list_next(itr))) if (!strcasecmp(coord->name, slurmdb_assoc->acct)) break; list_iterator_destroy(itr); if (coord) goto is_user; bad_user: errno = ESLURM_ACCESS_DENIED; xfree(id_str); return SLURM_ERROR; } } is_user: if (set_usage_information(&my_usage_table, type, &start, &end) != SLURM_SUCCESS) { xfree(id_str); return SLURM_ERROR; } _get_object_usage(mysql_conn, type, my_usage_table, cluster_name, id_str, start, end, my_list); xfree(id_str); return rc; }