blob: b320283400c0f920ca99073925ec6c07140f6773 [file] [log] [blame] [edit]
/*****************************************************************************\
* slurm_accounting_storage.h - Define accounting storage plugin functions.
*****************************************************************************
* Copyright (C) 2004-2007 The Regents of the University of California.
* Copyright (C) 2008-2009 Lawrence Livermore National Security.
* Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
* Written by Danny Auble <da@llnl.gov>
* CODE-OCEC-09-009. All rights reserved.
*
* This file is part of SLURM, a resource management program.
* For details, see <https://computing.llnl.gov/linux/slurm/>.
* Please also read the included file: DISCLAIMER.
*
* SLURM is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* In addition, as a special exception, the copyright holders give permission
* to link the code of portions of this program with the OpenSSL library under
* certain conditions as described in each individual source file, and
* distribute linked combinations including the two. You must obey the GNU
* General Public License in all respects for all of the code used other than
* OpenSSL. If you modify file(s) with this exception, you may extend this
* exception to your version of the file(s), but you are not obligated to do
* so. If you do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source files in
* the program, then also delete it here.
*
* SLURM is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along
* with SLURM; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
\*****************************************************************************/
#ifndef _SLURM_ACCOUNTING_STORAGE_H
#define _SLURM_ACCOUNTING_STORAGE_H
#include "src/common/list.h"
#include "src/slurmctld/slurmctld.h"
#include <slurm/slurm.h>
#include <slurm/slurm_errno.h>
#include <sys/types.h>
#include <pwd.h>
typedef enum {
ACCT_ADMIN_NOTSET,
ACCT_ADMIN_NONE,
ACCT_ADMIN_OPERATOR,
ACCT_ADMIN_SUPER_USER
} acct_admin_level_t;
typedef enum {
ACCT_UPDATE_NOTSET,
ACCT_ADD_USER,
ACCT_ADD_ASSOC,
ACCT_ADD_COORD,
ACCT_MODIFY_USER,
ACCT_MODIFY_ASSOC,
ACCT_REMOVE_USER,
ACCT_REMOVE_ASSOC,
ACCT_REMOVE_COORD,
ACCT_ADD_QOS,
ACCT_REMOVE_QOS,
ACCT_MODIFY_QOS,
ACCT_ADD_WCKEY,
ACCT_REMOVE_WCKEY,
ACCT_MODIFY_WCKEY,
} acct_update_type_t;
typedef enum {
ACCT_CLASS_NONE, /* no class given */
ACCT_CLASS_CAPABILITY, /* capability cluster */
ACCT_CLASS_CAPACITY, /* capacity cluster */
ACCT_CLASS_CAPAPACITY, /* a cluster that is both capability
* and capacity */
} acct_classification_type_t;
typedef enum {
ACCT_PROBLEM_NOT_SET,
ACCT_PROBLEM_ACCT_NO_ASSOC,
ACCT_PROBLEM_ACCT_NO_USERS,
ACCT_PROBLEM_USER_NO_ASSOC,
ACCT_PROBLEM_USER_NO_UID,
} acct_problem_type_t;
#define ACCT_CLASSIFIED_FLAG 0x0100
#define ACCT_CLASS_BASE 0x00ff
/* Association conditions used for queries of the database */
typedef struct {
List acct_list; /* list of char * */
List cluster_list; /* list of char * */
List fairshare_list; /* fairshare number */
List grp_cpu_mins_list; /* list of char * */
List grp_cpus_list; /* list of char * */
List grp_jobs_list; /* list of char * */
List grp_nodes_list; /* list of char * */
List grp_submit_jobs_list; /* list of char * */
List grp_wall_list; /* list of char * */
List id_list; /* list of char */
List max_cpu_mins_pj_list; /* list of char * */
List max_cpus_pj_list; /* list of char * */
List max_jobs_list; /* list of char * */
List max_nodes_pj_list; /* list of char * */
List max_submit_jobs_list; /* list of char * */
List max_wall_pj_list; /* list of char * */
List partition_list; /* list of char * */
List parent_acct_list; /* name of parent account */
List qos_list; /* list of char * */
time_t usage_end;
time_t usage_start;
List user_list; /* list of char * */
uint16_t with_usage; /* fill in usage */
uint16_t with_deleted; /* return deleted associations */
uint16_t with_raw_qos; /* return a raw qos or delta_qos */
uint16_t with_sub_accts; /* return sub acct information also */
uint16_t without_parent_info; /* don't give me parent id/name */
uint16_t without_parent_limits; /* don't give me limits from
* parents */
} acct_association_cond_t;
typedef struct {
acct_association_cond_t *assoc_cond;/* use acct_list here for
names */
List description_list; /* list of char * */
List organization_list; /* list of char * */
uint16_t with_assocs;
uint16_t with_coords;
uint16_t with_deleted;
} acct_account_cond_t;
typedef struct {
List assoc_list; /* list of acct_association_rec_t *'s */
List coordinators; /* list of acct_coord_rec_t *'s */
char *description;
char *name;
char *organization;
} acct_account_rec_t;
typedef struct {
uint64_t alloc_secs; /* number of cpu seconds allocated */
uint32_t id; /* association/wckey ID */
time_t period_start; /* when this record was started */
} acct_accounting_rec_t;
typedef struct acct_association_rec {
List accounting_list; /* list of acct_accounting_rec_t *'s */
char *acct; /* account/project associated to association */
List childern_list; /* list of childern associations
* (DON'T PACK) */
char *cluster; /* cluster associated to association
* */
uint64_t grp_cpu_mins; /* max number of cpu minutes the
* underlying group of
* associations can run for */
uint32_t grp_cpus; /* max number of cpus the
* underlying group of
* associations can allocate at one time */
uint32_t grp_jobs; /* max number of jobs the
* underlying group of associations can run
* at one time */
uint32_t grp_nodes; /* max number of nodes the
* underlying group of
* associations can allocate at once */
uint32_t grp_submit_jobs; /* max number of jobs the
* underlying group of
* associations can submit at
* one time */
uint32_t grp_wall; /* total time in hours the
* underlying group of
* associations can run for */
uint32_t grp_used_cpus; /* count of active jobs in the group
* (DON'T PACK) */
uint32_t grp_used_nodes; /* count of active jobs in the group
* (DON'T PACK) */
double grp_used_wall; /* group count of time used in
* running jobs (DON'T PACK) */
uint32_t id; /* id identifing a combination of
* user-account-cluster(-partition) */
uint32_t level_shares; /* number of shares on this level of
* the tree (DON'T PACK) */
uint32_t lft; /* lft used for grouping sub
* associations and jobs as a left
* most container used with rgt */
uint64_t max_cpu_mins_pj; /* max number of cpu seconds this
* association can have per job */
uint32_t max_cpus_pj; /* max number of cpus this
* association can allocate per job */
uint32_t max_jobs; /* max number of jobs this association can run
* at one time */
uint32_t max_nodes_pj; /* max number of nodes this
* association can allocate per job */
uint32_t max_submit_jobs; /* max number of jobs that can be
submitted by association */
uint32_t max_wall_pj; /* longest time this
* association can run a job */
char *parent_acct; /* name of parent account */
struct acct_association_rec *parent_assoc_ptr; /* ptr to parent acct
* set in
* slurmctld
* (DON'T PACK) */
uint32_t parent_id; /* id of parent account */
char *partition; /* optional partition in a cluster
* associated to association */
List qos_list; /* list of char * */
uint32_t rgt; /* rgt used for grouping sub
* associations and jobs as a right
* most container used with lft */
double shares_norm; /* normalized shares (DON'T PACK) */
uint32_t shares_raw; /* number of shares allocated to association */
uint32_t uid; /* user ID */
long double usage_efctv;/* effective, normalized usage (DON'T PACK) */
long double usage_norm; /* normalized usage (DON'T PACK) */
long double usage_raw; /* measure of resource usage (DON'T PACK) */
uint32_t used_jobs; /* count of active jobs (DON'T PACK) */
uint32_t used_submit_jobs; /* count of jobs pending or running
* (DON'T PACK) */
char *user; /* user associated to association */
bitstr_t *valid_qos; /* qos available for this association
* derived from the qos_list.
* (DON'T PACK) */
} acct_association_rec_t;
typedef struct {
uint16_t classification; /* how this machine is classified */
List cluster_list; /* list of char * */
time_t usage_end;
time_t usage_start;
uint16_t with_deleted;
uint16_t with_usage;
} acct_cluster_cond_t;
typedef struct {
List accounting_list; /* list of cluster_accounting_rec_t *'s */
uint16_t classification; /* how this machine is classified */
char *control_host;
uint32_t control_port;
uint32_t cpu_count;
char *name;
char *nodes;
acct_association_rec_t *root_assoc; /* root association for cluster */
uint16_t rpc_version; /* version of rpc this cluter is running */
} acct_cluster_rec_t;
typedef struct {
char *name;
uint16_t direct;
} acct_coord_rec_t;
typedef struct {
List acct_list; /* list of char * */
List associd_list; /* list of char */
List cluster_list; /* list of char * */
uint32_t cpus_max; /* number of cpus high range */
uint32_t cpus_min; /* number of cpus low range */
uint16_t duplicates; /* report duplicate job entries */
List groupid_list; /* list of char * */
uint32_t nodes_max; /* number of nodes high range */
uint32_t nodes_min; /* number of nodes low range */
List partition_list; /* list of char * */
List resv_list; /* list of char * */
List resvid_list; /* list of char * */
List step_list; /* list of jobacct_selected_step_t */
List state_list; /* list of char * */
time_t usage_end;
time_t usage_start;
char *used_nodes; /* a ranged node string where jobs ran */
List userid_list; /* list of char * */
List wckey_list; /* list of char * */
uint16_t without_steps; /* don't give me step info */
uint16_t without_usage_truncation; /* give me the information
* without truncating the
* time to the usage_start
* and usage_end */
} acct_job_cond_t;
typedef struct {
char *description;
uint32_t id;
List job_list; /* list of job pointers to submitted/running
jobs (DON'T PACK) */
uint64_t grp_cpu_mins; /* max number of cpu minutes all jobs
* running under this qos can run for */
uint32_t grp_cpus; /* max number of cpus this qos
can allocate at one time */
uint32_t grp_jobs; /* max number of jobs this qos can run
* at one time */
uint32_t grp_nodes; /* max number of nodes this qos
can allocate at once */
uint32_t grp_submit_jobs; /* max number of jobs this qos can submit at
* one time */
uint32_t grp_wall; /* total time in hours this qos can run for */
uint32_t grp_used_cpus; /* count of cpus in use in this qos
* (DON'T PACK) */
uint32_t grp_used_jobs; /* count of active jobs (DON'T PACK) */
uint32_t grp_used_nodes; /* count of nodes in use in this qos
* (DON'T PACK) */
uint32_t grp_used_submit_jobs; /* count of jobs pending or running
* (DON'T PACK) */
double grp_used_wall; /* group count of time (minutes) used in
* running jobs (DON'T PACK) */
uint64_t max_cpu_mins_pj; /* max number of cpu mins a user can
* use with this qos */
uint32_t max_cpus_pj; /* max number of cpus a job can
* allocate with this qos */
uint32_t max_jobs_pu; /* max number of jobs a user can
* run with this qos at one time */
uint32_t max_nodes_pj; /* max number of nodes a job can
* allocate with this qos at one time */
uint32_t max_submit_jobs_pu; /* max number of jobs a user can
submit with this qos at once */
uint32_t max_wall_pj; /* longest time this
* qos can run a job */
char *name;
double norm_priority;/* normalized priority (DON'T PACK) */
bitstr_t *preempt_bitstr; /* other qos' this qos can preempt */
List preempt_list; /* list of char *'s only used to add or
* change the other qos' this can preempt,
* when doing a get use the preempt_bitstr */
uint32_t priority; /* ranged int needs to be a unint for
* heterogeneous systems */
double usage_factor; /* factor to apply to usage in this qos */
long double usage_raw; /* measure of resource usage (DON'T PACK) */
List user_limit_list; /* acct_used_limits_t's (DON'T PACK) */
} acct_qos_rec_t;
typedef struct {
List description_list; /* list of char * */
List id_list; /* list of char * */
List name_list; /* list of char * */
uint16_t with_deleted;
} acct_qos_cond_t;
typedef struct {
List cluster_list; /* cluster reservations are on list of
* char * */
uint16_t flags; /* flags for reservation. */
List id_list; /* ids of reservations. list of char * */
List name_list; /* name of reservations. list of char * */
char *nodes; /* list of nodes in reservation */
time_t time_end; /* end time of reservation */
time_t time_start; /* start time of reservation */
uint16_t with_usage; /* send usage for reservation */
} acct_reservation_cond_t;
typedef struct {
uint64_t alloc_secs; /* number of cpu seconds allocated */
char *assocs; /* comma separated list of associations */
char *cluster; /* cluster reservation is for */
uint32_t cpus; /* how many cpus are in reservation */
uint64_t down_secs; /* number of cpu seconds down */
uint16_t flags; /* flags for reservation. */
uint32_t id; /* id of reservation. */
char *name; /* name of reservation */
char *nodes; /* list of nodes in reservation */
char *node_inx; /* node index of nodes in reservation */
time_t time_end; /* end time of reservation */
time_t time_start; /* start time of reservation */
time_t time_start_prev; /* If start time was changed this is
* the pervious start time. Needed
* for accounting */
} acct_reservation_rec_t;
/* Right now this is used in the acct_qos_rec_t structure. In the
* user_limit_list. */
typedef struct {
uint32_t jobs; /* count of active jobs */
uint32_t submit_jobs; /* count of jobs pending or running */
uint32_t uid;
} acct_used_limits_t;
typedef struct {
uint16_t admin_level; /* really acct_admin_level_t but for
packing purposes needs to be uint16_t */
acct_association_cond_t *assoc_cond; /* use user_list here for
names */
List def_acct_list; /* list of char * */
List def_wckey_list; /* list of char * */
uint16_t with_assocs;
uint16_t with_coords;
uint16_t with_deleted;
uint16_t with_wckeys;
} acct_user_cond_t;
/* If there is something that can be altered here it will need to
* added as something to check for when modifying a user since a user
* can modify there default account, and default wckey but nothing else in
* src/slurmdbd/proc_req.c.
*/
typedef struct {
uint16_t admin_level; /* really acct_admin_level_t but for
packing purposes needs to be uint16_t */
List assoc_list; /* list of acct_association_rec_t *'s */
List coord_accts; /* list of acct_coord_rec_t *'s */
char *default_acct;
char *default_wckey;
char *name;
uint32_t uid;
List wckey_list; /* list of acct_wckey_rec_t *'s */
} acct_user_rec_t;
typedef struct {
List acct_list; /* list of char * */
List action_list; /* list of char * */
List actor_list; /* list of char * */
List cluster_list; /* list of char * */
List id_list; /* list of char * */
List info_list; /* list of char * */
List name_list; /* list of char * */
time_t time_end;
time_t time_start;
List user_list; /* list of char * */
uint16_t with_assoc_info;
} acct_txn_cond_t;
typedef struct {
char *accts;
uint16_t action;
char *actor_name;
char *clusters;
uint32_t id;
char *set_info;
time_t timestamp;
char *users;
char *where_query;
} acct_txn_rec_t;
typedef struct {
List objects; /* depending on type */
uint16_t type; /* really acct_update_type_t but for
* packing purposes needs to be a
* uint16_t */
} acct_update_object_t;
typedef struct {
List cluster_list; /* list of char * */
List id_list; /* list of char * */
List name_list; /* list of char * */
time_t usage_end;
time_t usage_start;
List user_list; /* list of char * */
uint16_t with_usage; /* fill in usage */
uint16_t with_deleted; /* return deleted associations */
} acct_wckey_cond_t;
typedef struct {
List accounting_list; /* list of acct_accounting_rec_t *'s */
char *cluster; /* cluster associated */
uint32_t id; /* id identifing a combination of
* user-wckey-cluster */
char *name; /* wckey name */
uint32_t uid; /* user ID */
char *user; /* user associated */
} acct_wckey_rec_t;
typedef struct {
uint32_t assoc_id; /* association ID */
uint32_t shares_used; /* measure of recent usage */
} shares_used_object_t;
typedef struct {
uint64_t alloc_secs; /* number of cpu seconds allocated */
uint32_t cpu_count; /* number of cpus during time period */
uint64_t down_secs; /* number of cpu seconds down */
uint64_t idle_secs; /* number of cpu seconds idle */
uint64_t over_secs; /* number of cpu seconds overcommitted */
uint64_t pdown_secs; /* number of cpu seconds planned down */
time_t period_start; /* when this record was started */
uint64_t resv_secs; /* number of cpu seconds reserved */
} cluster_accounting_rec_t;
typedef struct {
char *name;
char *print_name;
char *spaces;
uint16_t user; /* set to 1 if it is a user i.e. if name[0] is
* '|' */
} acct_print_tree_t;
typedef struct {
acct_association_rec_t *assoc;
char *sort_name;
List childern;
} acct_hierarchical_rec_t;
typedef struct {
char *archive_dir; /* location to place archive file */
uint16_t archive_events; /* whether or not to keep an archive
file of events that can be loaded
later */
uint16_t archive_jobs; /* whether or not to keep an archive
file of jobs that can be loaded
later */
char *archive_script; /* script to run instead of default
actions */
uint16_t archive_steps; /* whether or not to keep an archive
file of steps that can be loaded
later */
uint16_t archive_suspend; /* whether or not to keep an archive
file of suspend data that can be loaded
later */
acct_job_cond_t *job_cond; /* conditions for the jobs to archive */
uint16_t purge_event; /* purge events older than this in months */
uint16_t purge_job; /* purge jobs older than this in months */
uint16_t purge_step; /* purge steps older than this in months */
uint16_t purge_suspend; /* purge suspend data older than this
* in months */
} acct_archive_cond_t;
typedef struct {
char *archive_file; /* archive file containing an insert line
of jobs since past */
char *insert; /* an sql statement to be ran containing the
insert of jobs since past */
} acct_archive_rec_t;
extern uint32_t g_qos_max_priority; /* max priority in all qos's */
extern uint32_t g_qos_count; /* count used for generating qos bitstr's */
extern void destroy_acct_user_rec(void *object);
extern void destroy_acct_account_rec(void *object);
extern void destroy_acct_coord_rec(void *object);
extern void destroy_cluster_accounting_rec(void *object);
extern void destroy_acct_cluster_rec(void *object);
extern void destroy_acct_accounting_rec(void *object);
extern void destroy_acct_association_rec(void *object);
extern void destroy_acct_qos_rec(void *object);
extern void destroy_acct_reservation_rec(void *object);
extern void destroy_acct_txn_rec(void *object);
extern void destroy_acct_wckey_rec(void *object);
extern void destroy_acct_archive_rec(void *object);
extern void destroy_acct_user_cond(void *object);
extern void destroy_acct_account_cond(void *object);
extern void destroy_acct_cluster_cond(void *object);
extern void destroy_acct_association_cond(void *object);
extern void destroy_acct_job_cond(void *object);
extern void destroy_acct_qos_cond(void *object);
extern void destroy_acct_reservation_cond(void *object);
extern void destroy_acct_txn_cond(void *object);
extern void destroy_acct_wckey_cond(void *object);
extern void destroy_acct_archive_cond(void *object);
extern void destroy_acct_update_object(void *object);
extern void destroy_acct_used_limits(void *object);
extern void destroy_update_shares_rec(void *object);
extern void destroy_acct_print_tree(void *object);
extern void destroy_acct_hierarchical_rec(void *object);
extern void init_acct_association_rec(acct_association_rec_t *assoc);
extern void init_acct_qos_rec(acct_qos_rec_t *qos);
/* pack functions */
extern void pack_acct_user_rec(void *in, uint16_t rpc_version, Buf buffer);
extern int unpack_acct_user_rec(void **object, uint16_t rpc_version,
Buf buffer);
extern void pack_acct_account_rec(void *in, uint16_t rpc_version, Buf buffer);
extern int unpack_acct_account_rec(void **object, uint16_t rpc_version,
Buf buffer);
extern void pack_acct_coord_rec(void *in, uint16_t rpc_version, Buf buffer);
extern int unpack_acct_coord_rec(void **object, uint16_t rpc_version,
Buf buffer);
extern void pack_cluster_accounting_rec(void *in, uint16_t rpc_version,
Buf buffer);
extern int unpack_cluster_accounting_rec(void **object, uint16_t rpc_version,
Buf buffer);
extern void pack_acct_cluster_rec(void *in, uint16_t rpc_version, Buf buffer);
extern int unpack_acct_cluster_rec(void **object, uint16_t rpc_version,
Buf buffer);
extern void pack_acct_accounting_rec(void *in, uint16_t rpc_version,
Buf buffer);
extern int unpack_acct_accounting_rec(void **object, uint16_t rpc_version,
Buf buffer);
extern void pack_acct_association_rec(void *in, uint16_t rpc_version,
Buf buffer);
extern int unpack_acct_association_rec(void **object, uint16_t rpc_version,
Buf buffer);
extern void pack_acct_qos_rec(void *in, uint16_t rpc_version, Buf buffer);
extern int unpack_acct_qos_rec(void **object, uint16_t rpc_version, Buf buffer);
extern void pack_acct_reservation_rec(void *in, uint16_t rpc_version,
Buf buffer);
extern int unpack_acct_reservation_rec(void **object, uint16_t rpc_version,
Buf buffer);
extern void pack_acct_txn_rec(void *in, uint16_t rpc_version, Buf buffer);
extern int unpack_acct_txn_rec(void **object, uint16_t rpc_version, Buf buffer);
extern void pack_acct_wckey_rec(void *in, uint16_t rpc_version, Buf buffer);
extern int unpack_acct_wckey_rec(void **object, uint16_t rpc_version,
Buf buffer);
extern void pack_acct_archive_rec(void *in, uint16_t rpc_version, Buf buffer);
extern int unpack_acct_archive_rec(void **object, uint16_t rpc_version,
Buf buffer);
extern void pack_acct_user_cond(void *in, uint16_t rpc_version, Buf buffer);
extern int unpack_acct_user_cond(void **object, uint16_t rpc_version,
Buf buffer);
extern void pack_acct_account_cond(void *in, uint16_t rpc_version, Buf buffer);
extern int unpack_acct_account_cond(void **object, uint16_t rpc_version,
Buf buffer);
extern void pack_acct_cluster_cond(void *in, uint16_t rpc_version, Buf buffer);
extern int unpack_acct_cluster_cond(void **object, uint16_t rpc_version,
Buf buffer);
extern void pack_acct_association_cond(void *in, uint16_t rpc_version,
Buf buffer);
extern int unpack_acct_association_cond(void **object, uint16_t rpc_version,
Buf buffer);
extern void pack_acct_job_cond(void *in, uint16_t rpc_version, Buf buffer);
extern int unpack_acct_job_cond(void **object, uint16_t rpc_version,
Buf buffer);
extern void pack_acct_qos_cond(void *in, uint16_t rpc_version, Buf buffer);
extern int unpack_acct_qos_cond(void **object, uint16_t rpc_version,
Buf buffer);
extern void pack_acct_reservation_cond(void *in, uint16_t rpc_version,
Buf buffer);
extern int unpack_acct_reservation_cond(void **object, uint16_t rpc_version,
Buf buffer);
extern void pack_acct_txn_cond(void *in, uint16_t rpc_version, Buf buffer);
extern int unpack_acct_txn_cond(void **object, uint16_t rpc_version,
Buf buffer);
extern void pack_acct_wckey_cond(void *in, uint16_t rpc_version, Buf buffer);
extern int unpack_acct_wckey_cond(void **object, uint16_t rpc_version,
Buf buffer);
extern void pack_acct_archive_cond(void *in, uint16_t rpc_version, Buf buffer);
extern int unpack_acct_archive_cond(void **object, uint16_t rpc_version,
Buf buffer);
extern void pack_acct_update_object(acct_update_object_t *object,
uint16_t rpc_version, Buf buffer);
extern int unpack_acct_update_object(acct_update_object_t **object,
uint16_t rpc_version, Buf buffer);
extern void pack_acct_used_limits(void *in, uint16_t rpc_version, Buf buffer);
extern int unpack_acct_used_limits(void **object,
uint16_t rpc_version, Buf buffer);
extern void pack_update_shares_used(void *in, uint16_t rpc_version,
Buf buffer);
extern int unpack_update_shares_used(void **object, uint16_t rpc_version,
Buf buffer);
extern char *acct_qos_str(List qos_list, uint32_t level);
extern uint32_t str_2_acct_qos(List qos_list, char *level);
extern char *acct_admin_level_str(acct_admin_level_t level);
extern acct_admin_level_t str_2_acct_admin_level(char *level);
/* The next two functions have pointers to assoc_list so do not
* destroy assoc_list before using the list returned from this function.
*/
extern List get_hierarchical_sorted_assoc_list(List assoc_list);
extern List get_acct_hierarchical_rec_list(List assoc_list);
/* IN/OUT: tree_list a list of acct_print_tree_t's */
extern char *get_tree_acct_name(char *name, char *parent, List tree_list);
extern int set_qos_bitstr_from_list(bitstr_t *valid_qos, List qos_list);
extern char *get_qos_complete_str_bitstr(List qos_list, bitstr_t *valid_qos);
extern char *get_qos_complete_str(List qos_list, List num_qos_list);
extern char *get_classification_str(uint16_t class);
extern uint16_t str_2_classification(char *class);
extern char *get_acct_problem_str(uint16_t problem);
extern uint16_t str_2_acct_problem(char *problem);
extern void log_assoc_rec(acct_association_rec_t *assoc_ptr, List qos_list);
extern int slurm_acct_storage_init(char *loc); /* load the plugin */
extern int slurm_acct_storage_fini(void); /* unload the plugin */
/*
* get a new connection to the storage unit
* IN: make_agent - Make an agent to manage queued requests
* IN: conn_num - If running more than one connection to the database
* this can be used to tell which connection is doing what
* IN: rollback - maintain journal of changes to permit rollback
* RET: pointer used to access db
*/
extern void *acct_storage_g_get_connection(bool make_agent, int conn_num,
bool rollback);
/*
* release connection to the storage unit
* IN/OUT: void ** pointer returned from
* acct_storage_g_get_connection() which will be freed.
* RET: SLURM_SUCCESS on success SLURM_ERROR else
*/
extern int acct_storage_g_close_connection(void **db_conn);
/*
* commit or rollback changes made without closing connection
* IN: void * pointer returned from acct_storage_g_get_connection()
* IN: bool - true will commit changes false will rollback
* RET: SLURM_SUCCESS on success SLURM_ERROR else
*/
extern int acct_storage_g_commit(void *db_conn, bool commit);
/*
* add users to accounting system
* IN: user_list List of acct_user_rec_t *
* RET: SLURM_SUCCESS on success SLURM_ERROR else
*/
extern int acct_storage_g_add_users(void *db_conn, uint32_t uid,
List user_list);
/*
* add users as account coordinators
* IN: acct_list list of char *'s of names of accounts
* IN: acct_user_cond_t *user_cond
* RET: SLURM_SUCCESS on success SLURM_ERROR else
*/
extern int acct_storage_g_add_coord(void *db_conn, uint32_t uid,
List acct_list,
acct_user_cond_t *user_cond);
/*
* add accounts to accounting system
* IN: account_list List of acct_account_rec_t *
* RET: SLURM_SUCCESS on success SLURM_ERROR else
*/
extern int acct_storage_g_add_accounts(void *db_conn, uint32_t uid,
List acct_list);
/*
* add clusters to accounting system
* IN: cluster_list List of acct_cluster_rec_t *
* RET: SLURM_SUCCESS on success SLURM_ERROR else
*/
extern int acct_storage_g_add_clusters(void *db_conn, uint32_t uid,
List cluster_list);
/*
* add associations to accounting system
* IN: association_list List of acct_association_rec_t *
* RET: SLURM_SUCCESS on success SLURM_ERROR else
*/
extern int acct_storage_g_add_associations(void *db_conn, uint32_t uid,
List association_list);
/*
* add qos's to accounting system
* IN: qos_list List of char *
* RET: SLURM_SUCCESS on success SLURM_ERROR else
*/
extern int acct_storage_g_add_qos(void *db_conn, uint32_t uid,
List qos_list);
/*
* add wckey's to accounting system
* IN: wckey_list List of acct_wckey_rec_t *
* RET: SLURM_SUCCESS on success SLURM_ERROR else
*/
extern int acct_storage_g_add_wckeys(void *db_conn, uint32_t uid,
List wckey_list);
/*
* add reservation's in accounting system
* IN: acct_reservation_rec_t *resv reservation to be added.
* RET: SLURM_SUCCESS on success SLURM_ERROR else
*/
extern int acct_storage_g_add_reservation(void *db_conn,
acct_reservation_rec_t *resv);
/*
* modify existing users in the accounting system
* IN: acct_user_cond_t *user_cond
* IN: acct_user_rec_t *user
* RET: List containing (char *'s) else NULL on error
*/
extern List acct_storage_g_modify_users(void *db_conn, uint32_t uid,
acct_user_cond_t *user_cond,
acct_user_rec_t *user);
/*
* modify existing accounts in the accounting system
* IN: acct_acct_cond_t *acct_cond
* IN: acct_account_rec_t *acct
* RET: List containing (char *'s) else NULL on error
*/
extern List acct_storage_g_modify_accounts(void *db_conn, uint32_t uid,
acct_account_cond_t *acct_cond,
acct_account_rec_t *acct);
/*
* modify existing clusters in the accounting system
* IN: acct_cluster_cond_t *cluster_cond
* IN: acct_cluster_rec_t *cluster
* RET: List containing (char *'s) else NULL on error
*/
extern List acct_storage_g_modify_clusters(void *db_conn, uint32_t uid,
acct_cluster_cond_t *cluster_cond,
acct_cluster_rec_t *cluster);
/*
* modify existing associations in the accounting system
* IN: acct_association_cond_t *assoc_cond
* IN: acct_association_rec_t *assoc
* RET: List containing (char *'s) else NULL on error
*/
extern List acct_storage_g_modify_associations(
void *db_conn, uint32_t uid,
acct_association_cond_t *assoc_cond,
acct_association_rec_t *assoc);
/*
* modify existing qos in the accounting system
* IN: acct_qos_cond_t *qos_cond
* IN: acct_qos_rec_t *qos
* RET: List containing (char *'s) else NULL on error
*/
extern List acct_storage_g_modify_qos(void *db_conn, uint32_t uid,
acct_qos_cond_t *qos_cond,
acct_qos_rec_t *qos);
/*
* modify existing wckey in the accounting system
* IN: acct_wckey_cond_t *wckey_cond
* IN: acct_wckey_rec_t *wckey
* RET: List containing (char *'s) else NULL on error
*/
extern List acct_storage_g_modify_wckeys(void *db_conn, uint32_t uid,
acct_wckey_cond_t *wckey_cond,
acct_wckey_rec_t *wckey);
/*
* modify reservation's in accounting system
* IN: acct_reservation_rec_t *resv
* RET: SLURM_SUCCESS on success SLURM_ERROR else
*/
extern int acct_storage_g_modify_reservation(void *db_conn,
acct_reservation_rec_t *resv);
/*
* remove users from accounting system
* IN: acct_user_cond_t *user_cond
* RET: List containing (char *'s) else NULL on error
*/
extern List acct_storage_g_remove_users(void *db_conn, uint32_t uid,
acct_user_cond_t *user_cond);
/*
* remove users from being a coordinator of an account
* IN: acct_list list of char *'s of names of accounts
* IN: acct_user_cond_t *user_cond
* RET: List containing (char *'s) else NULL on error
*/
extern List acct_storage_g_remove_coord(void *db_conn, uint32_t uid,
List acct_list,
acct_user_cond_t *user_cond);
/*
* remove accounts from accounting system
* IN: acct_account_cond_t *acct_cond
* RET: List containing (char *'s) else NULL on error
*/
extern List acct_storage_g_remove_accounts(void *db_conn, uint32_t uid,
acct_account_cond_t *acct_cond);
/*
* remove clusters from accounting system
* IN: acct_cluster_cond_t *cluster_cond
* RET: List containing (char *'s) else NULL on error
*/
extern List acct_storage_g_remove_clusters(void *db_conn, uint32_t uid,
acct_cluster_cond_t *cluster_cond);
/*
* remove associations from accounting system
* IN: acct_association_cond_t *assoc_cond
* RET: List containing (char *'s) else NULL on error
*/
extern List acct_storage_g_remove_associations(
void *db_conn, uint32_t uid, acct_association_cond_t *assoc_cond);
/*
* remove qos from accounting system
* IN: acct_qos_cond_t *assoc_qos
* RET: List containing (char *'s) else NULL on error
*/
extern List acct_storage_g_remove_qos(
void *db_conn, uint32_t uid, acct_qos_cond_t *qos_cond);
/*
* remove wckey from accounting system
* IN: acct_wckey_cond_t *assoc_wckey
* RET: List containing (char *'s) else NULL on error
*/
extern List acct_storage_g_remove_wckeys(
void *db_conn, uint32_t uid, acct_wckey_cond_t *wckey_cond);
/*
* remove reservation's in accounting system
* IN: acct_reservation_rec_t *resv
* RET: SLURM_SUCCESS on success SLURM_ERROR else
*/
extern int acct_storage_g_remove_reservation(void *db_conn,
acct_reservation_rec_t *resv);
/*
* get info from the storage
* IN: acct_user_cond_t *
* IN: params void *
* returns List of acct_user_rec_t *
* note List needs to be freed when called
*/
extern List acct_storage_g_get_users(void *db_conn, uint32_t uid,
acct_user_cond_t *user_cond);
/*
* get info from the storage
* IN: acct_account_cond_t *
* IN: params void *
* returns List of acct_account_rec_t *
* note List needs to be freed when called
*/
extern List acct_storage_g_get_accounts(void *db_conn, uint32_t uid,
acct_account_cond_t *acct_cond);
/*
* get info from the storage
* IN: acct_cluster_cond_t *
* IN: params void *
* returns List of acct_cluster_rec_t *
* note List needs to be freed when called
*/
extern List acct_storage_g_get_clusters(
void *db_conn, uint32_t uid, acct_cluster_cond_t *cluster_cond);
/*
* get info from the storage
* RET: List of config_key_pairs_t *
* note List needs to be freed when called
*/
extern List acct_storage_g_get_config(void *db_conn);
/*
* get info from the storage
* IN: acct_association_cond_t *
* RET: List of acct_association_rec_t *
* note List needs to be freed when called
*/
extern List acct_storage_g_get_associations(
void *db_conn, uint32_t uid, acct_association_cond_t *assoc_cond);
/*
* get info from the storage
* IN: acct_association_cond_t *
* RET: List of acct_association_rec_t *
* note List needs to be freed when called
*/
extern List acct_storage_g_get_problems(
void *db_conn, uint32_t uid, acct_association_cond_t *assoc_cond);
/*
* get info from the storage
* IN: acct_qos_cond_t *
* RET: List of acct_qos_rec_t *
* note List needs to be freed when called
*/
extern List acct_storage_g_get_qos(void *db_conn, uint32_t uid,
acct_qos_cond_t *qos_cond);
/*
* get info from the storage
* IN: acct_wckey_cond_t *
* RET: List of acct_wckey_rec_t *
* note List needs to be freed when called
*/
extern List acct_storage_g_get_wckeys(void *db_conn, uint32_t uid,
acct_wckey_cond_t *wckey_cond);
/*
* get info from the storage
* IN: acct_reservation_cond_t *
* RET: List of acct_reservation_rec_t *
* note List needs to be freed when called
*/
extern List acct_storage_g_get_reservations(void *db_conn, uint32_t uid,
acct_reservation_cond_t *resv_cond);
/*
* get info from the storage
* IN: acct_txn_cond_t *
* RET: List of acct_txn_rec_t *
* note List needs to be freed when called
*/
extern List acct_storage_g_get_txn(void *db_conn, uint32_t uid,
acct_txn_cond_t *txn_cond);
/*
* get info from the storage
* IN/OUT: in void * (acct_association_rec_t *) or
* (acct_wckey_rec_t *) with the id set
* IN: type what type is 'in'
* IN: start time stamp for records >=
* IN: end time stamp for records <=
* RET: SLURM_SUCCESS on success SLURM_ERROR else
*/
extern int acct_storage_g_get_usage(
void *db_conn, uint32_t uid, void *in, int type,
time_t start, time_t end);
/*
* roll up data in the storage
* IN: sent_start (option time to do a re-roll or start from this point)
* IN: sent_end (option time to do a re-roll or end at this point)
* IN: archive_data (if 0 old data is not archived in a monthly rollup)
* RET: SLURM_SUCCESS on success SLURM_ERROR else
*/
extern int acct_storage_g_roll_usage(void *db_conn,
time_t sent_start, time_t sent_end,
uint16_t archive_data);
/*
* record shares used information for backup in case slurmctld restarts
* IN: account_list List of shares_used_object_t *
* RET: SLURM_SUCCESS on success SLURM_ERROR else
*/
extern int acct_storage_g_update_shares_used(void *db_conn, List acct_list);
/*
* This should be called when a cluster does a cold start to flush out
* any jobs that were running during the restart so we don't have any
* jobs in the database "running" forever since no endtime will be
* placed in there other wise.
* IN: char * = cluster name
* RET: SLURM_SUCCESS on success SLURM_ERROR else
*/
extern int acct_storage_g_flush_jobs_on_cluster(
void *db_conn, char *cluster, time_t event_time);
/*********************** CLUSTER ACCOUNTING STORAGE **************************/
extern int clusteracct_storage_g_node_down(void *db_conn,
char *cluster,
struct node_record *node_ptr,
time_t event_time,
char *reason);
extern int clusteracct_storage_g_node_up(void *db_conn,
char *cluster,
struct node_record *node_ptr,
time_t event_time);
extern int clusteracct_storage_g_cluster_procs(void *db_conn,
char *cluster,
char *cluster_nodes,
uint32_t procs,
time_t event_time);
extern int clusteracct_storage_g_register_ctld(
void *db_conn, char *cluster, uint16_t port);
/*
* get info from the storage
* IN/OUT: cluster_rec void * (acct_cluster_rec_t *) with the name set
* IN: start time stamp for records >=
* IN: end time stamp for records <
* IN: params void *
* RET: SLURM_SUCCESS on success SLURM_ERROR else
*/
extern int clusteracct_storage_g_get_usage(
void *db_conn, uint32_t uid, void *cluster_rec, int type,
time_t start, time_t end);
/*
* load into the storage the start of a job
*/
extern int jobacct_storage_g_job_start (void *db_conn, char *cluster_name,
struct job_record *job_ptr);
/*
* load into the storage the end of a job
*/
extern int jobacct_storage_g_job_complete (void *db_conn,
struct job_record *job_ptr);
/*
* load into the storage the start of a job step
*/
extern int jobacct_storage_g_step_start (void *db_conn,
struct step_record *step_ptr);
/*
* load into the storage the end of a job step
*/
extern int jobacct_storage_g_step_complete (void *db_conn,
struct step_record *step_ptr);
/*
* load into the storage a suspention of a job
*/
extern int jobacct_storage_g_job_suspend (void *db_conn,
struct job_record *job_ptr);
/*
* get info from the storage
* returns List of jobacct_job_rec_t *
* note List needs to be freed when called
*/
extern List jobacct_storage_g_get_jobs_cond(void *db_conn, uint32_t uid,
acct_job_cond_t *job_cond);
/*
* expire old info from the storage
*/
extern int jobacct_storage_g_archive(void *db_conn,
acct_archive_cond_t *arch_cond);
/*
* expire old info from the storage
*/
extern int jobacct_storage_g_archive_load(void *db_conn,
acct_archive_rec_t *arch_rec);
#endif /*_SLURM_ACCOUNTING_STORAGE_H*/