| /*****************************************************************************\ |
| * openapi.h - OpenAPI definitions |
| ***************************************************************************** |
| * Copyright (C) SchedMD LLC. |
| * |
| * 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 SLURM_OPENAPI_H |
| #define SLURM_OPENAPI_H |
| |
| #include "slurm/slurmdb.h" |
| #include "src/common/data.h" |
| #include "src/common/macros.h" |
| |
| typedef enum { |
| OPENAPI_TYPE_INVALID = 0, |
| OPENAPI_TYPE_INTEGER, |
| OPENAPI_TYPE_NUMBER, |
| OPENAPI_TYPE_STRING, |
| OPENAPI_TYPE_BOOL, |
| OPENAPI_TYPE_OBJECT, /* map/dictionary */ |
| OPENAPI_TYPE_ARRAY, /* list */ |
| OPENAPI_TYPE_MAX /* place holder */ |
| } openapi_type_t; |
| |
| extern const char *openapi_type_to_string(openapi_type_t type); |
| extern openapi_type_t openapi_string_to_type(const char *str); |
| |
| typedef enum { |
| OPENAPI_FORMAT_INVALID = 0, |
| OPENAPI_FORMAT_INT, /* unbounded integer */ |
| OPENAPI_FORMAT_INT32, |
| OPENAPI_FORMAT_INT64, |
| OPENAPI_FORMAT_NUMBER, /* unbounded floating point number */ |
| OPENAPI_FORMAT_FLOAT, |
| OPENAPI_FORMAT_DOUBLE, |
| OPENAPI_FORMAT_STRING, |
| OPENAPI_FORMAT_PASSWORD, |
| OPENAPI_FORMAT_BOOL, |
| OPENAPI_FORMAT_OBJECT, /* map/dictionary */ |
| OPENAPI_FORMAT_ARRAY, /* list */ |
| OPENAPI_FORMAT_MAX /* place holder */ |
| } openapi_type_format_t; |
| |
| extern const char *openapi_type_format_to_format_string( |
| openapi_type_format_t format); |
| extern const char *openapi_type_format_to_type_string( |
| openapi_type_format_t format); |
| extern data_type_t openapi_type_format_to_data_type( |
| openapi_type_format_t format); |
| extern openapi_type_format_t openapi_string_to_type_format(const char *str); |
| extern openapi_type_format_t openapi_data_type_to_type_format(data_type_t type); |
| extern openapi_type_t openapi_type_format_to_type(openapi_type_format_t format); |
| |
| /* |
| * Separator used to split up a relative path. |
| * OpenAPI specification 3.1.0 explicitly requires $ref paths must be compliant |
| * with RFC3986 URIs. It is expected that inside of "$ref" path that the |
| * relative path use "/" to delimit components and that the relative paths start |
| * with "#". |
| */ |
| #define OPENAPI_PATH_SEP "/" |
| #define OPENAPI_PATH_REL "#" |
| |
| /* |
| * Path to where all schemas are held in openapi.json |
| */ |
| #define OPENAPI_SCHEMAS_PATH \ |
| OPENAPI_PATH_SEP"components"OPENAPI_PATH_SEP"schemas"OPENAPI_PATH_SEP |
| |
| /* |
| * Path to where all URL paths are held in openapi.json. |
| */ |
| #define OPENAPI_PATHS_PATH OPENAPI_PATH_SEP"paths" |
| |
| /* |
| * Common parameter name for substitution of data_parser plugin in #/paths/ |
| */ |
| #define OPENAPI_DATA_PARSER_PARAM "{data_parser}" |
| |
| /* |
| * Field name of parameters in a given path |
| */ |
| #define OPENAPI_PATH_PARAMS_FIELD "parameters" |
| |
| /* |
| * OpenAPI reference tag |
| */ |
| #define OPENAPI_REF_TAG "$ref" |
| |
| /* |
| * Generate formatted path string from relative path |
| * IN/OUT str_ptr - ptr to path string to set/replace |
| * IN relative_path - data list with each component of relative path |
| * RET ptr to path string (to allow jit generation for logging) |
| */ |
| extern char *openapi_fmt_rel_path_str(char **str_ptr, data_t *relative_path); |
| |
| /* |
| * Fork parent_path and append list index to last component |
| * IN parent_path - data list with each each component of relative path |
| * IN index - index of entry in list |
| * RET new relative path (caller must release with FREE_NULL_DATA()) |
| */ |
| extern data_t *openapi_fork_rel_path_list(data_t *relative_path, int index); |
| |
| /* |
| * Append split up sub_path to existing relative path list |
| * IN/OUT relative_path - data list with each component of relative path |
| * IN sub_path - additional sub path components to append. |
| * May start with #/ or have the components delimited by / |
| * RET SLURM_SUCCESS or error |
| */ |
| extern int openapi_append_rel_path(data_t *relative_path, const char *sub_path); |
| |
| /* For list_for_each() to emit error() message for openapi_resp_error_t */ |
| extern int openapi_error_log_foreach(void *x, void *arg); |
| |
| /* For list_for_each() to emit warning() message for openapi_resp_warning_t */ |
| extern int openapi_warn_log_foreach(void *x, void *arg); |
| |
| typedef struct { |
| struct { |
| char *type; |
| char *name; |
| char *data_parser; |
| char *accounting_storage; |
| } plugin; |
| char **command; /* only array ptr is xfree()d - not the strings */ |
| struct { |
| char *source; |
| uid_t uid; |
| gid_t gid; |
| } client; |
| struct { |
| struct { |
| char *major; |
| char *micro; |
| char *minor; |
| } version; |
| char *release; |
| char *cluster; |
| } slurm; |
| } openapi_resp_meta_t; |
| |
| extern void free_openapi_resp_meta(void *obj); |
| |
| typedef struct { |
| char *description; |
| int num; |
| char *source; |
| } openapi_resp_error_t; |
| |
| extern void free_openapi_resp_error(void *obj); |
| |
| typedef struct { |
| char *description; |
| char *source; |
| } openapi_resp_warning_t; |
| |
| extern void free_openapi_resp_warning(void *obj); |
| |
| /* Macros to declare each of the common response fields */ |
| #define OPENAPI_RESP_STRUCT_META_FIELD openapi_resp_meta_t *meta |
| #define OPENAPI_RESP_STRUCT_META_FIELD_NAME meta |
| #define OPENAPI_RESP_STRUCT_ERRORS_FIELD list_t *errors |
| #define OPENAPI_RESP_STRUCT_ERRORS_FIELD_NAME errors |
| #define OPENAPI_RESP_STRUCT_WARNINGS_FIELD list_t *warnings |
| #define OPENAPI_RESP_STRUCT_WARNINGS_FIELD_NAME warnings |
| |
| /* macro to declare a single entry OpenAPI response struct */ |
| typedef struct { |
| OPENAPI_RESP_STRUCT_META_FIELD; |
| OPENAPI_RESP_STRUCT_ERRORS_FIELD; |
| OPENAPI_RESP_STRUCT_WARNINGS_FIELD; |
| void *response; |
| } openapi_resp_single_t; |
| |
| /* release meta, errors, warnings - not response or other fields */ |
| #define FREE_OPENAPI_RESP_COMMON_CONTENTS(resp) \ |
| do { \ |
| if (resp) { \ |
| FREE_NULL_LIST(resp->warnings); \ |
| FREE_NULL_LIST(resp->errors); \ |
| free_openapi_resp_meta(resp->meta); \ |
| resp->meta = NULL; \ |
| } \ |
| } while(false) |
| |
| typedef struct { |
| OPENAPI_RESP_STRUCT_META_FIELD; |
| OPENAPI_RESP_STRUCT_ERRORS_FIELD; |
| OPENAPI_RESP_STRUCT_WARNINGS_FIELD; |
| list_t *clusters; |
| list_t *instances; |
| list_t *tres; |
| list_t *accounts; |
| list_t *users; |
| list_t *qos; |
| list_t *wckeys; |
| list_t *associations; |
| } openapi_resp_slurmdbd_config_t; |
| |
| typedef struct { |
| slurm_selected_step_t *id; |
| } openapi_job_param_t; |
| |
| typedef struct { |
| char *name; |
| } openapi_user_param_t; |
| |
| typedef struct { |
| bool with_deleted; |
| bool with_assocs; |
| bool with_coords; |
| bool with_wckeys; |
| } openapi_user_query_t; |
| |
| typedef struct { |
| char *wckey; |
| } openapi_wckey_param_t; |
| |
| typedef struct { |
| char *name; |
| } openapi_account_param_t; |
| |
| typedef struct { |
| bool with_assocs; |
| bool with_coords; |
| bool with_deleted; |
| } openapi_account_query_t; |
| |
| typedef struct { |
| char *name; |
| } openapi_cluster_param_t; |
| |
| typedef struct { |
| char *name; |
| } openapi_qos_param_t; |
| |
| typedef struct { |
| bool with_deleted; |
| } openapi_qos_query_t; |
| |
| typedef struct { |
| OPENAPI_RESP_STRUCT_META_FIELD; |
| OPENAPI_RESP_STRUCT_ERRORS_FIELD; |
| OPENAPI_RESP_STRUCT_WARNINGS_FIELD; |
| job_array_resp_msg_t *results; |
| char *job_id; |
| char *step_id; |
| char *job_submit_user_msg; |
| } openapi_job_post_response_t; |
| |
| typedef struct { |
| OPENAPI_RESP_STRUCT_META_FIELD; |
| OPENAPI_RESP_STRUCT_ERRORS_FIELD; |
| OPENAPI_RESP_STRUCT_WARNINGS_FIELD; |
| submit_response_msg_t resp; |
| } openapi_job_submit_response_t; |
| |
| typedef struct { |
| char *script; |
| job_desc_msg_t *job; |
| list_t *jobs; /* list of job_desc_msg_t* */ |
| } openapi_job_submit_request_t; |
| |
| typedef struct { |
| OPENAPI_RESP_STRUCT_META_FIELD; |
| OPENAPI_RESP_STRUCT_ERRORS_FIELD; |
| OPENAPI_RESP_STRUCT_WARNINGS_FIELD; |
| uint32_t job_id; |
| char *job_submit_user_msg; |
| } openapi_job_alloc_response_t; |
| |
| typedef struct { |
| job_desc_msg_t *job; |
| list_t *hetjob; /* list of job_desc_msg_t* */ |
| } openapi_job_alloc_request_t; |
| |
| /* mirrors job_step_info_response_msg_t */ |
| typedef struct { |
| OPENAPI_RESP_STRUCT_META_FIELD; |
| OPENAPI_RESP_STRUCT_ERRORS_FIELD; |
| OPENAPI_RESP_STRUCT_WARNINGS_FIELD; |
| job_step_info_response_msg_t *steps; |
| time_t last_update; |
| } openapi_resp_job_step_info_msg_t; |
| |
| /* mirrors job_info_msg_t */ |
| typedef struct { |
| OPENAPI_RESP_STRUCT_META_FIELD; |
| OPENAPI_RESP_STRUCT_ERRORS_FIELD; |
| OPENAPI_RESP_STRUCT_WARNINGS_FIELD; |
| job_info_msg_t *jobs; |
| time_t last_backfill; |
| time_t last_update; |
| } openapi_resp_job_info_msg_t; |
| |
| typedef struct { |
| slurm_selected_step_t job_id; |
| } openapi_job_info_param_t; |
| |
| typedef struct { |
| uint16_t signal; |
| uint16_t flags; |
| } openapi_job_info_delete_query_t; |
| |
| typedef struct { |
| time_t update_time; |
| uint16_t show_flags; |
| } openapi_job_info_query_t; |
| |
| typedef struct { |
| OPENAPI_RESP_STRUCT_META_FIELD; |
| OPENAPI_RESP_STRUCT_ERRORS_FIELD; |
| OPENAPI_RESP_STRUCT_WARNINGS_FIELD; |
| list_t *listjobs_list; |
| } openapi_resp_listjobs_info_t; |
| |
| typedef struct { |
| OPENAPI_RESP_STRUCT_META_FIELD; |
| OPENAPI_RESP_STRUCT_ERRORS_FIELD; |
| OPENAPI_RESP_STRUCT_WARNINGS_FIELD; |
| list_t *listpids_list; |
| } openapi_resp_listpids_info_t; |
| |
| typedef struct { |
| OPENAPI_RESP_STRUCT_META_FIELD; |
| OPENAPI_RESP_STRUCT_ERRORS_FIELD; |
| OPENAPI_RESP_STRUCT_WARNINGS_FIELD; |
| list_t *liststeps_list; |
| } openapi_resp_liststeps_info_t; |
| |
| typedef struct { |
| char *node_name; |
| } openapi_node_param_t; |
| |
| typedef struct { |
| time_t update_time; |
| uint16_t show_flags; |
| } openapi_nodes_query_t; |
| |
| typedef struct { |
| char *partition_name; |
| } openapi_partition_param_t; |
| |
| typedef struct { |
| time_t update_time; |
| uint16_t show_flags; |
| } openapi_partitions_query_t; |
| |
| typedef struct { |
| char *reservation_name; |
| } openapi_reservation_param_t; |
| |
| typedef struct { |
| time_t update_time; |
| } openapi_reservation_query_t; |
| |
| /* mirrors node_info_msg_t */ |
| typedef struct { |
| OPENAPI_RESP_STRUCT_META_FIELD; |
| OPENAPI_RESP_STRUCT_ERRORS_FIELD; |
| OPENAPI_RESP_STRUCT_WARNINGS_FIELD; |
| node_info_msg_t *nodes; |
| time_t last_update; |
| } openapi_resp_node_info_msg_t; |
| |
| /* mirrors partition_info_msg_t */ |
| typedef struct { |
| OPENAPI_RESP_STRUCT_META_FIELD; |
| OPENAPI_RESP_STRUCT_ERRORS_FIELD; |
| OPENAPI_RESP_STRUCT_WARNINGS_FIELD; |
| partition_info_msg_t *partitions; |
| time_t last_update; |
| } openapi_resp_partitions_info_msg_t; |
| |
| /* mirrors reserve_info_msg_t */ |
| typedef struct { |
| OPENAPI_RESP_STRUCT_META_FIELD; |
| OPENAPI_RESP_STRUCT_ERRORS_FIELD; |
| OPENAPI_RESP_STRUCT_WARNINGS_FIELD; |
| reserve_info_msg_t *reservations; |
| time_t last_update; |
| } openapi_resp_reserve_info_msg_t; |
| |
| /* Struct required to wrap list in an object */ |
| typedef struct { |
| list_t *reservations; |
| } openapi_reservation_mod_request_t; |
| |
| /* mirrors license_info_msg_t */ |
| typedef struct { |
| OPENAPI_RESP_STRUCT_META_FIELD; |
| OPENAPI_RESP_STRUCT_ERRORS_FIELD; |
| OPENAPI_RESP_STRUCT_WARNINGS_FIELD; |
| license_info_msg_t *licenses; |
| time_t last_update; |
| } openapi_resp_license_info_msg_t; |
| |
| typedef struct { |
| OPENAPI_RESP_STRUCT_META_FIELD; |
| OPENAPI_RESP_STRUCT_ERRORS_FIELD; |
| OPENAPI_RESP_STRUCT_WARNINGS_FIELD; |
| slurmdb_add_assoc_cond_t *add_assoc; |
| slurmdb_account_rec_t *acct; |
| } openapi_resp_accounts_add_cond_t; |
| |
| typedef struct { |
| OPENAPI_RESP_STRUCT_META_FIELD; |
| OPENAPI_RESP_STRUCT_ERRORS_FIELD; |
| OPENAPI_RESP_STRUCT_WARNINGS_FIELD; |
| slurmdb_add_assoc_cond_t *add_assoc; |
| slurmdb_user_rec_t *user; |
| } openapi_resp_users_add_cond_t; |
| |
| typedef struct { |
| OPENAPI_RESP_STRUCT_META_FIELD; |
| OPENAPI_RESP_STRUCT_ERRORS_FIELD; |
| OPENAPI_RESP_STRUCT_WARNINGS_FIELD; |
| time_t last_update; |
| job_state_response_msg_t *jobs; |
| } openapi_resp_job_state_t; |
| |
| typedef struct { |
| list_t *job_id_list; /* list of slurm_selected_step_t* */ |
| } openapi_job_state_query_t; |
| |
| #endif /* SLURM_OPENAPI_H */ |