/*****************************************************************************\
 *  sacctmgr.h - definitions for all sacctmgr modules.
 *****************************************************************************
 *  Copyright (C) 2008-2009 Lawrence Livermore National Security.
 *  Copyright (C) 2002-2007 The Regents of the University of California.
 *  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://slurm.schedmd.com/>.
 *  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 __SACCTMGR_H__
#define __SACCTMGR_H__

#include "config.h"

#include <ctype.h>
#include <errno.h>
#include <getopt.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>

#if HAVE_READLINE
#  include <readline/readline.h>
#  include <readline/history.h>
#endif

#include "slurm/slurm.h"

#include "src/interfaces/jobacct_gather.h"
#include "src/common/parse_time.h"
#include "src/interfaces/accounting_storage.h"
#include "src/common/xstring.h"
#include "src/common/print_fields.h"

#define	MAX_INPUT_FIELDS 128
#define FORMAT_STRING_SIZE 34

#define SA_SET_USER  0x0001
#define SA_SET_ASSOC 0x0002
#define SA_SET_CLUST 0x0004
#define SA_SET_WCKEY 0x0008

typedef enum {
	/* COMMON */
	PRINT_ACCT,
	PRINT_CLUSTER,
	PRINT_COORDS,
	PRINT_CPUS,
	PRINT_DESC,
	PRINT_FEDERATION,
	PRINT_FLAGS,
	PRINT_NAME,
	PRINT_PART,
	PRINT_QOS,
	PRINT_QOS_RAW,
	PRINT_USER,
	PRINT_WCKEYS,

	/* LIMITS */
	PRINT_FAIRSHARE = 1000,
	PRINT_GRPCM,
	PRINT_GRPCRM,
	PRINT_GRPC,
	PRINT_GRPTM,
	PRINT_GRPTRM,
	PRINT_GRPT,
	PRINT_GRPJ,
	PRINT_GRPJA,
	PRINT_GRPMEM,
	PRINT_GRPN,
	PRINT_GRPS,
	PRINT_GRPW,
	PRINT_MAXCM,
	PRINT_MAXCRM,
	PRINT_MAXC,
	PRINT_MAXCU,
	PRINT_MAXTM,
	PRINT_MAXTRM,
	PRINT_MAXTRMA,
	PRINT_MAXT,
	PRINT_MAXTA,
	PRINT_MAXTN,
	PRINT_MAXTU,
	PRINT_MAXJ,
	PRINT_MAXJA,
	PRINT_MAXJAA,
	PRINT_MAXJAU,
	PRINT_MAXJPA,
	PRINT_MAXN,
	PRINT_MAXNU,
	PRINT_MAXS,
	PRINT_MAXSA,
	PRINT_MAXW,
	PRINT_MINC,
	PRINT_MINPT,
	PRINT_MINT,

	/* ASSOCIATION */
	PRINT_DQOS = 2000,
	PRINT_ID,
	PRINT_LINEAGE,
	PRINT_PID,
	PRINT_PNAME,
	PRINT_COMMENT,

	/* CLUSTER */
	PRINT_CHOST = 3000,
	PRINT_CPORT,
	PRINT_CLASS,
	PRINT_FEATURES,
	PRINT_FEDSTATE,
	PRINT_FEDSTATERAW,
	PRINT_TRES,
	PRINT_NODECNT,
	PRINT_NODEINX,
	PRINT_CLUSTER_NODES,
	PRINT_RPC_VERSION,

	/* ACCT */
	PRINT_ORG = 4000,

	/* USER */
	PRINT_ADMIN = 5000,
	PRINT_DACCT,
	PRINT_DWCKEY,

	/* QOS */
	PRINT_GRACE = 6000,
	PRINT_PREE,
	PRINT_PREEM,
	PRINT_PRIO,
	PRINT_PRXMPT,
	PRINT_UF,
	PRINT_UT,
	PRINT_LF,

	/* PROBLEM */
	PRINT_PROBLEM = 7000,

	/* TXN */
	PRINT_ACTIONRAW = 8000,
	PRINT_ACTION,
	PRINT_ACTOR,
	PRINT_INFO,
	PRINT_TS,
	PRINT_WHERE,

	/* EVENT */
	PRINT_DURATION,
	PRINT_TIMEEND,
	PRINT_EVENTRAW,
	PRINT_EVENT,
	PRINT_NODENAME,
	PRINT_REASON,
	PRINT_TIMESTART,
	PRINT_STATERAW,
	PRINT_STATE,
	PRINT_TIMESUBMIT,
	PRINT_TIMEELIGIBLE,

	/* INSTANCE */
	PRINT_INSTANCE_ID,
	PRINT_INSTANCE_TYPE,
	PRINT_EXTRA,

	/* RESOURCE */
	PRINT_COUNT = 9000,
	PRINT_TYPE,
	PRINT_SERVERTYPE,
	PRINT_SERVER,
	PRINT_CALLOWED,
	PRINT_ALLOWED,
	PRINT_ALLOCATED,
	PRINT_USED,
	PRINT_LAST_CONSUMED,

	/* RESERVATION */
	PRINT_ASSOC_NAME = 10000,
	PRINT_UNUSED,

} sacctmgr_print_t;


extern char *command_name;
extern int exit_code;	/* sacctmgr's exit code, =1 on any error at any time */
extern int exit_flag;	/* program to terminate if =1 */
extern int one_liner;	/* one record per line if =1 */
extern int quiet_flag;	/* quiet=1, verbose=-1, normal=0 */
extern int rollback_flag;/* immediate execute=0, else = 1 */
extern int with_assoc_flag;/* show acct/user associations flag */
extern int readonly_flag; /* make it so you can only run list commands */
extern void *db_conn;
extern uint32_t my_uid;
extern char *my_user_name;
extern list_t *g_qos_list;
extern list_t *g_res_list;
extern list_t *g_tres_list;
extern const char *mime_type; /* user requested JSON or YAML */
extern const char *data_parser; /* data_parser args */

extern bool user_case_norm;
extern bool tree_display;
extern bool have_db_conn;

extern int sacctmgr_set_assoc_cond(slurmdb_assoc_cond_t *assoc_cond,
				   char *type, char *value,
				   int command_len);
extern int sacctmgr_set_assoc_rec(slurmdb_assoc_rec_t *assoc_rec,
				  char *type, char *value,
				  int command_len, int option,
				  bool *allow_option);
extern void sacctmgr_print_default_qos(uint32_t def_qos_id,
				       print_field_t *field, bool last);
extern void sacctmgr_print_assoc_rec(slurmdb_assoc_rec_t *assoc,
				     print_field_t *field, list_t *tree_list,
				     bool last);
extern int sacctmgr_set_qos_rec(slurmdb_qos_rec_t *qos,
				char *type, char *value,
				int command_len, int option,
				bool *allow_option);
extern void sacctmgr_print_qos_rec(slurmdb_qos_rec_t *qos,
				   print_field_t *field,
				   bool last);

extern int sacctmgr_add_assoc(int argc, char **argv);
extern int sacctmgr_add_user(int argc, char **argv);
extern int sacctmgr_add_account(int argc, char **argv);
extern int sacctmgr_add_cluster(int argc, char **argv);
extern int sacctmgr_add_federation(int argc, char **argv);
extern int sacctmgr_add_coord(int argc, char **argv);
extern int sacctmgr_add_qos(int argc, char **argv);
extern int sacctmgr_add_res(int argc, char **argv);

extern int sacctmgr_list_assoc(int argc, char **argv);
extern int sacctmgr_list_user(int argc, char **argv);
extern int sacctmgr_list_account(int argc, char **argv);
extern int sacctmgr_list_cluster(int argc, char **argv);
extern int sacctmgr_list_config(void);
extern int sacctmgr_list_event(int argc, char **argv);
extern int sacctmgr_list_federation(int argc, char **argv);
extern int sacctmgr_list_instance(int argc, char **argv);
extern int sacctmgr_list_problem(int argc, char **argv);
extern int sacctmgr_list_qos(int argc, char **argv);
extern int sacctmgr_list_res(int argc, char **argv);
extern int sacctmgr_list_reservation(int argc, char **argv);
extern int sacctmgr_list_stats(int argc, char **argv);
extern int sacctmgr_list_tres(int, char **);
extern int sacctmgr_list_wckey(int argc, char **argv);

extern int sacctmgr_modify_user(int argc, char **argv);
extern int sacctmgr_modify_account(int argc, char **argv);
extern int sacctmgr_modify_cluster(int argc, char **argv);
extern int sacctmgr_modify_federation(int argc, char **argv);
extern int sacctmgr_modify_job(int argc, char **argv);
extern int sacctmgr_modify_qos(int argc, char **argv);
extern int sacctmgr_modify_res(int argc, char **argv);

extern int sacctmgr_delete_user(int argc, char **argv);
extern int sacctmgr_delete_account(int argc, char **argv);
extern int sacctmgr_delete_cluster(int argc, char **argv);
extern int sacctmgr_delete_coord(int argc, char **argv);
extern int sacctmgr_delete_federation(int argc, char **argv);
extern int sacctmgr_delete_qos(int argc, char **argv);
extern int sacctmgr_delete_res(int argc, char **argv);

extern int sacctmgr_dump_cluster(int argc, char **argv);

extern int sacctmgr_archive_dump(int argc, char **argv);
extern int sacctmgr_archive_load(int argc, char **argv);

/* common.c */
extern int parse_option_end(char *option, int *op_type, int *command_end);
extern bool common_verify_option_syntax(char *option, int op_type,
					bool allow_op);
extern char *strip_quotes(char *option, int *increased, bool make_lower);
extern void notice_thread_init(void);
extern void notice_thread_fini(void);
extern int commit_check(char *warning);
extern int get_uint(char *in_value, uint32_t *out_value, char *type);
extern int get_uint16(char *in_value, uint16_t *out_value, char *type);
extern int get_uint64(char *in_value, uint64_t *out_value, char *type);
extern int get_double(char *in_value, double *out_value, char *type);
extern int addto_qos_char_list(list_t *char_list, list_t *qos_list, char *names,
			       int option);
extern int addto_action_char_list(list_t *char_list, char *names);
extern void sacctmgr_print_coord_list(
	print_field_t *field, void *input, int last);

extern void sacctmgr_print_tres(print_field_t *field, void *input, int last);
extern void sacctmgr_print_assoc_limits(slurmdb_assoc_rec_t *assoc);
extern void sacctmgr_print_cluster(slurmdb_cluster_rec_t *cluster);
extern void sacctmgr_print_federation(slurmdb_federation_rec_t *fed);
extern void sacctmgr_print_qos_limits(slurmdb_qos_rec_t *qos);
extern int sacctmgr_remove_assoc_usage(slurmdb_assoc_cond_t *assoc_cond);
extern int sacctmgr_update_qos_usage(slurmdb_qos_cond_t *qos_cond,
				     long double new_raw_usage);
extern int sort_coord_list(void *, void *);
extern list_t *sacctmgr_process_format_list(list_t *format_list);
extern int sacctmgr_validate_cluster_list(list_t *cluster_list);

/* you need to free the objects returned from these functions */
extern slurmdb_assoc_rec_t *sacctmgr_find_account_base_assoc(
	char *account, char *cluster);
extern slurmdb_assoc_rec_t *sacctmgr_find_root_assoc(char *cluster);
extern slurmdb_user_rec_t *sacctmgr_find_user(char *name);
extern slurmdb_account_rec_t *sacctmgr_find_account(char *name);
extern slurmdb_cluster_rec_t *sacctmgr_find_cluster(char *name);

/* do not free any of the object returned from these functions since
 * they are pointing to an object in the list given
 */

extern slurmdb_assoc_rec_t *sacctmgr_find_assoc_from_list(
	list_t *assoc_list, char *user, char *account,
	char *cluster, char *partition);
extern slurmdb_assoc_rec_t *sacctmgr_find_account_base_assoc_from_list(
	list_t *assoc_list, char *account, char *cluster);
extern slurmdb_res_rec_t *sacctmgr_find_res_from_list(
	list_t *res_list, uint32_t id, char *name, char *server);
extern slurmdb_qos_rec_t *sacctmgr_find_qos_from_list(
	list_t *qos_list, char *name);
extern slurmdb_user_rec_t *sacctmgr_find_user_from_list(
	list_t *user_list, char *name);
extern slurmdb_account_rec_t *sacctmgr_find_account_from_list(
	list_t *acct_list, char *name);
extern slurmdb_cluster_rec_t *sacctmgr_find_cluster_from_list(
	list_t *cluster_list, char *name);
extern slurmdb_wckey_rec_t *sacctmgr_find_wckey_from_list(
	list_t *wckey_list, char *user, char *name, char *cluster);

extern void sacctmgr_initialize_g_tres_list(void);

/* file_functions.c */
extern int print_file_add_limits_to_line(char **line,
					 slurmdb_assoc_rec_t *assoc);

extern int file_print_qos(void *x, void *arg);

extern int print_file_slurmdb_hierarchical_rec_list(
	FILE *fd, list_t *slurmdb_hierarchical_rec_list,
	list_t *user_list, list_t *acct_list);

extern void load_sacctmgr_cfg_file (int argc, char **argv);

/* txn_functions.c */
extern int sacctmgr_list_txn(int argc, char **argv);

/* runaway_jobs_functions.c */
extern int sacctmgr_list_runaway_jobs(int argc, char **argv);

/* federation_functions.c */
extern int verify_federations_exist(list_t *name_list);
extern int verify_fed_clusters(list_t *cluster_list, const char *fed_name,
			       bool *existing_fed);

#endif
