/* * as_pg_add_accts - add accounts * * IN pg_conn: database connection * IN uid: user performing the add operation * IN acct_list: accounts to add * RET: error code */ extern int as_pg_add_accts(pgsql_conn_t *pg_conn, uint32_t uid, List acct_list) { ListIterator itr = NULL; slurmdb_account_rec_t *object = NULL; List assoc_list = NULL; int rc = SLURM_SUCCESS; char *user_name = NULL, *query = NULL, *txn_query = NULL; char *rec = NULL, *info = NULL; time_t now = time(NULL); if (check_db_connection(pg_conn) != SLURM_SUCCESS) return ESLURM_DB_CONNECTION; assoc_list = list_create(slurmdb_destroy_association_rec); user_name = uid_to_string((uid_t) uid); itr = list_iterator_create(acct_list); while((object = list_next(itr))) { if(!object->name || !object->description || !object->organization) { error("as/pg: add_accts: We need an account name, " "description, and organization to add. %s %s %s", object->name, object->description, object->organization); rc = SLURM_ERROR; continue; } /* order of vals must match structure of acct_table */ rec = xstrdup_printf("(%ld, %ld, 0, '%s', '%s', '%s')", now, now, object->name, object->description, object->organization); query = xstrdup_printf("SELECT public.add_acct(%s);", rec); xfree(rec); rc = DEF_QUERY_RET_RC; if(rc != SLURM_SUCCESS) { error("as/pg: couldn't add acct %s", object->name); continue; } info = xstrdup_printf("description='%s', organization='%s'", object->description, object->organization); if(txn_query) xstrfmtcat(txn_query, ", (%ld, %u, '%s', '%s', $$%s$$)", now, DBD_ADD_ACCOUNTS, object->name, user_name, info); else xstrfmtcat(txn_query, "INSERT INTO %s " "(timestamp, action, name, actor, info) " "VALUES (%ld, %u, '%s', '%s', $$%s$$)", txn_table, now, DBD_ADD_ACCOUNTS, object->name, user_name, info); xfree(info); if(!object->assoc_list) continue; list_transfer(assoc_list, object->assoc_list); } list_iterator_destroy(itr); xfree(user_name); if(rc == SLURM_SUCCESS) { if(txn_query) { xstrcat(txn_query, ";"); rc = pgsql_db_query(pg_conn->db_conn, txn_query); xfree(txn_query); if(rc != SLURM_SUCCESS) { error("as/pg: add_accts: couldn't add txn"); rc = SLURM_SUCCESS; } } } else xfree(txn_query); if(rc == SLURM_SUCCESS && list_count(assoc_list)) { if(acct_storage_p_add_associations(pg_conn, uid, assoc_list) != SLURM_SUCCESS) { error("as/pg: add_accts: problem adding account " "associations"); rc = SLURM_ERROR; } } list_destroy(assoc_list); return rc; }
/* * as_pg_add_clusters - add clusters * * IN pg_conn: database connection * IN uid: user performing the add operation * IN cluster_list: clusters to add * RET: error code */ extern int as_pg_add_clusters(pgsql_conn_t *pg_conn, uint32_t uid, List cluster_list) { ListIterator itr = NULL; int rc = SLURM_SUCCESS, added = 0; slurmdb_cluster_rec_t *object = NULL; time_t now = time(NULL); List assoc_list = NULL; slurmdb_association_rec_t *assoc = NULL; char *txn_info = NULL, *query = NULL, *user_name = NULL; if (check_db_connection(pg_conn) != SLURM_SUCCESS) return ESLURM_DB_CONNECTION; assoc_list = list_create(slurmdb_destroy_association_rec); user_name = uid_to_string((uid_t) uid); itr = list_iterator_create(cluster_list); while((object = list_next(itr))) { if(!object->name) { error("as/pg: add_clusters: We need a cluster " "name to add."); rc = SLURM_ERROR; continue; } if (strchr(object->name, '.')) { error("as/pg: add_clusters: invalid cluster name %s", object->name); rc = SLURM_ERROR; continue; } if (cluster_in_db(pg_conn, object->name)) { error("cluster %s already added", object->name); rc = SLURM_ERROR; continue; } query = xstrdup_printf( "SELECT public.add_cluster(" "(%ld, %ld, 0, '%s', '', 0, 0, %u, 1, 0, 0));", (long)now, (long)now, object->name, object->classification); rc = DEF_QUERY_RET_RC; if(rc != SLURM_SUCCESS) { error("Couldn't add cluster %s", object->name); added = 0; /* rollback modification to DB */ break; } rc = _create_cluster_tables(pg_conn, object->name); if (rc != SLURM_SUCCESS) { error("Failed creating cluster tables for %s", object->name); added = 0; break; } /* add root account assoc: <'cluster', 'root', '', ''> */ if (add_cluster_root_assoc(pg_conn, now, object, &txn_info) != SLURM_SUCCESS) { added = 0; break; } if (add_txn(pg_conn, now, "", DBD_ADD_CLUSTERS, object->name, user_name, txn_info) != SLURM_SUCCESS) { error("as/pg: add_cluster: couldn't add txn"); } else { added ++; } xfree(txn_info); /* Add user root by default to run from the root * association. This gets popped off so we need to * read it every time here. */ assoc = xmalloc(sizeof(slurmdb_association_rec_t)); slurmdb_init_association_rec(assoc, 0); list_append(assoc_list, assoc); assoc->cluster = xstrdup(object->name); assoc->user = xstrdup("root"); assoc->acct = xstrdup("root"); if(acct_storage_p_add_associations(pg_conn, uid, assoc_list) == SLURM_ERROR) { error("Problem adding root user association"); rc = SLURM_ERROR; } list_flush(assoc_list); /* do not add it again, in case not popped */ } list_iterator_destroy(itr); xfree(user_name); list_destroy(assoc_list); if (!added) { reset_pgsql_conn(pg_conn); } else { /* when loading sacctmgr cfg file, get_assoc will be called before commit */ pg_conn->cluster_changed = 1; } return rc; }