diff --git a/slurm/slurm.h.in b/slurm/slurm.h.in index 705fec551e6d79c564eabc7d20563aedaec5019d..fa99f8b5818eda80c56bf7e45fa38449bdc8138c 100644 --- a/slurm/slurm.h.in +++ b/slurm/slurm.h.in @@ -1034,7 +1034,7 @@ typedef struct reserve_info_msg { reserve_info_t *reservation_array; /* the reservation records */ } reserve_info_msg_t; -typedef struct reserve_request_msg { +typedef struct resv_desc_msg { char *accounts; /* names of accounts permitted to use */ uint32_t duration; /* duration of reservation in seconds */ time_t end_time; /* end time of reservation */ @@ -1046,7 +1046,7 @@ typedef struct reserve_request_msg { char *partition; /* name of partition to be used */ time_t start_time; /* start time of reservation */ char *users; /* names of users permitted to use */ -} reserve_request_msg_t; +} resv_desc_msg_t; typedef struct reserve_response_msg { char *name; /* name of reservation */ @@ -2127,7 +2127,7 @@ extern int slurm_delete_partition PARAMS(( delete_part_msg_t * part_msg )); * OUT job_desc_msg - user defined partition descriptor */ extern void slurm_init_resv_desc_msg PARAMS(( - reserve_request_msg_t * update_resv_msg )); + resv_desc_msg_t * update_resv_msg )); /* * slurm_create_reservation - create a new reservation, only usable by user root * IN resv_msg - description of reservation @@ -2135,7 +2135,7 @@ extern void slurm_init_resv_desc_msg PARAMS(( * otherwise return NULL and set errno to indicate the error */ extern char * slurm_create_reservation PARAMS(( - reserve_request_msg_t * resv_msg )); + resv_desc_msg_t * resv_msg )); /* * slurm_update_reservation - modify an existing reservation, only usable by @@ -2143,7 +2143,7 @@ extern char * slurm_create_reservation PARAMS(( * IN resv_msg - description of reservation * RET 0 on success, otherwise return -1 and set errno to indicate the error */ -extern int slurm_update_reservation PARAMS((reserve_request_msg_t * resv_msg)); +extern int slurm_update_reservation PARAMS((resv_desc_msg_t * resv_msg)); /* * slurm_delete_reservation - issue RPC to delete a reservation, only usable diff --git a/src/api/init_msg.c b/src/api/init_msg.c index 854186ccde16daf26afe2b476dd5f71a33ba5f48..f62e7e9b6fc292069bfdca3bcd53b7bc8775f0b0 100644 --- a/src/api/init_msg.c +++ b/src/api/init_msg.c @@ -172,19 +172,19 @@ void slurm_init_part_desc_msg (update_part_msg_t * update_part_msg) * default values * OUT job_desc_msg - user defined partition descriptor */ -void slurm_init_resv_desc_msg (reserve_request_msg_t * update_resv_msg) +void slurm_init_resv_desc_msg (resv_desc_msg_t * resv_msg) { - update_resv_msg->name = NULL; - update_resv_msg->start_time = (time_t) NO_VAL; - update_resv_msg->end_time = (time_t) NO_VAL; - update_resv_msg->duration = NO_VAL; - update_resv_msg->flags = (uint16_t) NO_VAL; - update_resv_msg->node_cnt = NO_VAL; - update_resv_msg->node_list = NULL; - update_resv_msg->features = NULL; - update_resv_msg->partition = NULL; - update_resv_msg->users = NULL; - update_resv_msg->accounts = NULL; + resv_msg->name = NULL; + resv_msg->start_time = (time_t) NO_VAL; + resv_msg->end_time = (time_t) NO_VAL; + resv_msg->duration = NO_VAL; + resv_msg->flags = (uint16_t) NO_VAL; + resv_msg->node_cnt = NO_VAL; + resv_msg->node_list = NULL; + resv_msg->features = NULL; + resv_msg->partition = NULL; + resv_msg->users = NULL; + resv_msg->accounts = NULL; } /* diff --git a/src/api/update_config.c b/src/api/update_config.c index 70797b85f40bef58edb1c24d220ef17e3aac71c4..a1ac4fe53dde09b0953d04b08c8361e903404fc5 100644 --- a/src/api/update_config.c +++ b/src/api/update_config.c @@ -119,7 +119,7 @@ slurm_delete_partition ( delete_part_msg_t * part_msg ) * otherwise return NULL and set errno to indicate the error */ char * -slurm_create_reservation (reserve_request_msg_t * resv_msg ) +slurm_create_reservation (resv_desc_msg_t * resv_msg ) { int rc; char *resv_name = NULL; @@ -157,7 +157,7 @@ slurm_create_reservation (reserve_request_msg_t * resv_msg ) * IN resv_msg - description of reservation * RET 0 on success, otherwise return -1 and set errno to indicate the error */ -extern int slurm_update_reservation ( reserve_request_msg_t * resv_msg ) +extern int slurm_update_reservation ( resv_desc_msg_t * resv_msg ) { return _slurm_update ((void *) resv_msg, REQUEST_UPDATE_RESERVATION); } diff --git a/src/common/slurm_protocol_defs.c b/src/common/slurm_protocol_defs.c index f5c8acc2c8e377c314a6195d4cb716f792f34d90..2db2c6b6443d21c682f3b2e9c0b8d4d93701c69d 100644 --- a/src/common/slurm_protocol_defs.c +++ b/src/common/slurm_protocol_defs.c @@ -449,7 +449,7 @@ void slurm_free_delete_part_msg(delete_part_msg_t * msg) } } -void slurm_free_update_resv_msg(reserve_request_msg_t * msg) +void slurm_free_resv_desc_msg(resv_desc_msg_t * msg) { if (msg) { xfree(msg->accounts); @@ -1657,7 +1657,7 @@ extern int slurm_free_msg_data(slurm_msg_type_t type, void *data) break; case REQUEST_CREATE_RESERVATION: case REQUEST_UPDATE_RESERVATION: - slurm_free_update_resv_msg(data); + slurm_free_resv_desc_msg(data); break; case REQUEST_DELETE_RESERVATION: case RESPONSE_CREATE_RESERVATION: diff --git a/src/common/slurm_protocol_defs.h b/src/common/slurm_protocol_defs.h index b1ffd598aa9444caa591e59ec5779cd3e21ad74e..08f1dcc841b359e1b4da9f4076c5b9b9c7fd8e7a 100644 --- a/src/common/slurm_protocol_defs.h +++ b/src/common/slurm_protocol_defs.h @@ -883,7 +883,7 @@ void inline slurm_free_job_launch_msg(batch_job_launch_msg_t * msg); void inline slurm_free_update_node_msg(update_node_msg_t * msg); void inline slurm_free_update_part_msg(update_part_msg_t * msg); void inline slurm_free_delete_part_msg(delete_part_msg_t * msg); -void inline slurm_free_update_resv_msg(reserve_request_msg_t * msg); +void inline slurm_free_resv_desc_msg(resv_desc_msg_t * msg); void inline slurm_free_resv_name_msg(reservation_name_msg_t * msg); void inline slurm_free_resv_info_request_msg(resv_info_request_msg_t * msg); void inline diff --git a/src/common/slurm_protocol_pack.c b/src/common/slurm_protocol_pack.c index de720ad35d91a65e7d83482c3599e8a57c4720b5..1d1d3ba870ce92c38e5981d19a4e71a90c1b1caa 100644 --- a/src/common/slurm_protocol_pack.c +++ b/src/common/slurm_protocol_pack.c @@ -384,8 +384,8 @@ static void _pack_accounting_update_msg(accounting_update_msg_t *msg, static int _unpack_accounting_update_msg(accounting_update_msg_t **msg, Buf buffer); -static void _pack_update_resv_msg(reserve_request_msg_t * msg, Buf buffer); -static int _unpack_update_resv_msg(reserve_request_msg_t ** msg, Buf buffer); +static void _pack_update_resv_msg(resv_desc_msg_t * msg, Buf buffer); +static int _unpack_update_resv_msg(resv_desc_msg_t ** msg, Buf buffer); static void _pack_resv_name_msg(reservation_name_msg_t * msg, Buf buffer); static int _unpack_resv_name_msg(reservation_name_msg_t ** msg, Buf buffer); @@ -573,7 +573,7 @@ pack_msg(slurm_msg_t const *msg, Buf buffer) break; case REQUEST_CREATE_RESERVATION: case REQUEST_UPDATE_RESERVATION: - _pack_update_resv_msg((reserve_request_msg_t *) msg-> + _pack_update_resv_msg((resv_desc_msg_t *) msg-> data, buffer); break; case RESPONSE_RESERVATION_INFO: @@ -950,7 +950,7 @@ unpack_msg(slurm_msg_t * msg, Buf buffer) break; case REQUEST_CREATE_RESERVATION: case REQUEST_UPDATE_RESERVATION: - rc = _unpack_update_resv_msg((reserve_request_msg_t **) + rc = _unpack_update_resv_msg((resv_desc_msg_t **) &(msg->data), buffer); break; case REQUEST_DELETE_RESERVATION: @@ -2059,7 +2059,7 @@ unpack_error: } static void -_pack_update_resv_msg(reserve_request_msg_t * msg, Buf buffer) +_pack_update_resv_msg(resv_desc_msg_t * msg, Buf buffer) { xassert(msg != NULL); @@ -2078,15 +2078,15 @@ _pack_update_resv_msg(reserve_request_msg_t * msg, Buf buffer) } static int -_unpack_update_resv_msg(reserve_request_msg_t ** msg, Buf buffer) +_unpack_update_resv_msg(resv_desc_msg_t ** msg, Buf buffer) { uint32_t uint32_tmp; - reserve_request_msg_t *tmp_ptr; + resv_desc_msg_t *tmp_ptr; xassert(msg != NULL); /* alloc memory for structure */ - tmp_ptr = xmalloc(sizeof(reserve_request_msg_t)); + tmp_ptr = xmalloc(sizeof(resv_desc_msg_t)); *msg = tmp_ptr; safe_unpackstr_xmalloc(&tmp_ptr->name, &uint32_tmp, buffer); @@ -2104,7 +2104,7 @@ _unpack_update_resv_msg(reserve_request_msg_t ** msg, Buf buffer) return SLURM_SUCCESS; unpack_error: - slurm_free_update_resv_msg(tmp_ptr); + slurm_free_resv_desc_msg(tmp_ptr); *msg = NULL; return SLURM_ERROR; } diff --git a/src/scontrol/create_res.c b/src/scontrol/create_res.c index 63d2db4fcf0db90e1d9ff2706a86119d9f1ff355..4e1df350f6c29a3a9bf1d3942004077126e597b6 100644 --- a/src/scontrol/create_res.c +++ b/src/scontrol/create_res.c @@ -41,13 +41,12 @@ /* - * process_plus_minus is used to convert a string like + * _process_plus_minus is used to convert a string like * Users+=a,b,c * to Users=+a,+b,+c */ -static char * -process_plus_minus(char plus_or_minus, char *src) +static char * _process_plus_minus(char plus_or_minus, char *src) { int num_commas = 0; int ii; @@ -76,12 +75,11 @@ process_plus_minus(char plus_or_minus, char *src) /* - * parse_flags is used to parse the Flags= option. It handles + * _parse_flags is used to parse the Flags= option. It handles * daily, weekly, and maint, optionally preceded by + or -, * separated by a comma but no spaces. */ -static uint32_t -parse_flags(const char *flagstr, const char *msg) +static uint32_t _parse_flags(const char *flagstr, const char *msg) { int flip; uint32_t outflags = 0; @@ -145,7 +143,7 @@ parse_flags(const char *flagstr, const char *msg) */ extern int scontrol_parse_res_options(int argc, char *argv[], const char *msg, - reserve_request_msg_t *resv_msg_ptr, + resv_desc_msg_t *resv_msg_ptr, int *free_user_str, int *free_acct_str) { int i; @@ -210,11 +208,12 @@ scontrol_parse_res_options(int argc, char *argv[], const char *msg, } else if (strncasecmp(tag, "Flags", MAX(taglen, 2)) == 0) { uint32_t f; if (plus_minus) { - char *tmp = process_plus_minus(plus_minus, val); - f = parse_flags(tmp, msg); + char *tmp = + _process_plus_minus(plus_minus, val); + f = _parse_flags(tmp, msg); xfree(tmp); } else { - f = parse_flags(val, msg); + f = _parse_flags(val, msg); } if (f == 0xffffffff) { return -1; @@ -245,7 +244,7 @@ scontrol_parse_res_options(int argc, char *argv[], const char *msg, } else if (strncasecmp(tag, "Users", MAX(taglen, 1)) == 0) { if (plus_minus) { resv_msg_ptr->users = - process_plus_minus(plus_minus, val); + _process_plus_minus(plus_minus, val); *free_user_str = 1; } else { resv_msg_ptr->users = val; @@ -253,7 +252,7 @@ scontrol_parse_res_options(int argc, char *argv[], const char *msg, } else if (strncasecmp(tag, "Accounts", MAX(taglen, 1)) == 0) { if (plus_minus) { resv_msg_ptr->accounts = - process_plus_minus(plus_minus, val); + _process_plus_minus(plus_minus, val); *free_acct_str = 1; } else { resv_msg_ptr->accounts = val; @@ -282,7 +281,7 @@ scontrol_parse_res_options(int argc, char *argv[], const char *msg, extern int scontrol_update_res(int argc, char *argv[]) { - reserve_request_msg_t resv_msg; + resv_desc_msg_t resv_msg; int err, ret = 0; int free_user_str = 0, free_acct_str = 0; @@ -329,7 +328,7 @@ SCONTROL_UPDATE_RES_CLEANUP: extern int scontrol_create_res(int argc, char *argv[]) { - reserve_request_msg_t resv_msg; + resv_desc_msg_t resv_msg; char *new_res_name = NULL; int free_user_str = 0, free_acct_str = 0; int err, ret = 0; diff --git a/src/slurmctld/proc_req.c b/src/slurmctld/proc_req.c index 47f02dbbbc5785c7aa7cbd2288f4cd20defebd8c..18d7b4431120a3208544034fac4402d8aac2a7fc 100644 --- a/src/slurmctld/proc_req.c +++ b/src/slurmctld/proc_req.c @@ -276,11 +276,11 @@ void slurmctld_req (slurm_msg_t * msg) break; case REQUEST_CREATE_RESERVATION: _slurm_rpc_resv_create(msg); - slurm_free_update_resv_msg(msg->data); + slurm_free_resv_desc_msg(msg->data); break; case REQUEST_UPDATE_RESERVATION: _slurm_rpc_resv_update(msg); - slurm_free_update_resv_msg(msg->data); + slurm_free_resv_desc_msg(msg->data); break; case REQUEST_DELETE_RESERVATION: _slurm_rpc_resv_delete(msg); @@ -2405,7 +2405,7 @@ static void _slurm_rpc_resv_create(slurm_msg_t * msg) { int error_code = SLURM_SUCCESS; DEF_TIMERS; - reserve_request_msg_t *resv_desc_ptr = (reserve_request_msg_t *) + resv_desc_msg_t *resv_desc_ptr = (resv_desc_msg_t *) msg->data; /* Locks: write node, read partition */ slurmctld_lock_t node_write_lock = { @@ -2461,7 +2461,7 @@ static void _slurm_rpc_resv_update(slurm_msg_t * msg) { int error_code = SLURM_SUCCESS; DEF_TIMERS; - reserve_request_msg_t *resv_desc_ptr = (reserve_request_msg_t *) + resv_desc_msg_t *resv_desc_ptr = (resv_desc_msg_t *) msg->data; /* Locks: write node, read partition */ slurmctld_lock_t node_write_lock = { diff --git a/src/slurmctld/reservation.c b/src/slurmctld/reservation.c index d6a4d65cd2965576ab575aa1c6c93be509fb3501..7e29e2050fc29ba98e74e8cade3b60c1e6096fa0 100644 --- a/src/slurmctld/reservation.c +++ b/src/slurmctld/reservation.c @@ -91,11 +91,11 @@ static int _build_uid_list(char *users, int *user_cnt, uid_t **user_list); static void _clear_job_resv(slurmctld_resv_t *resv_ptr); static slurmctld_resv_t *_copy_resv(slurmctld_resv_t *resv_orig_ptr); static void _del_resv_rec(void *x); -static void _dump_resv_req(reserve_request_msg_t *resv_ptr, char *mode); +static void _dump_resv_req(resv_desc_msg_t *resv_ptr, char *mode); static int _find_resv_id(void *x, void *key); static int _find_resv_name(void *x, void *key); static void _generate_resv_id(void); -static void _generate_resv_name(reserve_request_msg_t *resv_ptr); +static void _generate_resv_name(resv_desc_msg_t *resv_ptr); static bool _is_account_valid(char *account); static bool _is_resv_used(slurmctld_resv_t *resv_ptr); static void _pack_resv(slurmctld_resv_t *resv_ptr, Buf buffer, @@ -105,12 +105,12 @@ static int _post_resv_delete(slurmctld_resv_t *resv_ptr); static int _post_resv_update(slurmctld_resv_t *resv_ptr, slurmctld_resv_t *old_resv_ptr); static bitstr_t *_pick_idle_nodes(bitstr_t *avail_nodes, - reserve_request_msg_t *resv_desc_ptr); + resv_desc_msg_t *resv_desc_ptr); static int _resize_resv(slurmctld_resv_t *resv_ptr, uint32_t node_cnt); static bool _resv_overlap(time_t start_time, time_t end_time, uint16_t flags, bitstr_t *node_bitmap, slurmctld_resv_t *this_resv_ptr); -static int _select_nodes(reserve_request_msg_t *resv_desc_ptr, +static int _select_nodes(resv_desc_msg_t *resv_desc_ptr, struct part_record **part_ptr, bitstr_t **resv_bitmap); static int _set_assoc_list(slurmctld_resv_t *resv_ptr); @@ -172,7 +172,7 @@ static slurmctld_resv_t *_copy_resv(slurmctld_resv_t *resv_orig_ptr) static void _swap_resv(slurmctld_resv_t *resv_backup, slurmctld_resv_t *resv_ptr) { - reserve_request_msg_t *resv_copy_ptr; + resv_desc_msg_t *resv_copy_ptr; xassert(resv_backup->magic == RESV_MAGIC); xassert(resv_ptr->magic == RESV_MAGIC); @@ -233,7 +233,7 @@ static int _find_resv_name(void *x, void *key) return 1; /* match */ } -static void _dump_resv_req(reserve_request_msg_t *resv_ptr, char *mode) +static void _dump_resv_req(resv_desc_msg_t *resv_ptr, char *mode) { #if _RESV_DEBUG @@ -274,7 +274,7 @@ static void _generate_resv_id(void) } } -static void _generate_resv_name(reserve_request_msg_t *resv_ptr) +static void _generate_resv_name(resv_desc_msg_t *resv_ptr) { char *key, *name, *sep; int len; @@ -1016,7 +1016,7 @@ static void _set_cpu_cnt(slurmctld_resv_t *resv_ptr) } /* Create a resource reservation */ -extern int create_resv(reserve_request_msg_t *resv_desc_ptr) +extern int create_resv(resv_desc_msg_t *resv_desc_ptr) { int i, rc = SLURM_SUCCESS; time_t now = time(NULL); @@ -1206,7 +1206,7 @@ extern void resv_fini(void) } /* Update an exiting resource reservation */ -extern int update_resv(reserve_request_msg_t *resv_desc_ptr) +extern int update_resv(resv_desc_msg_t *resv_desc_ptr) { time_t now = time(NULL); slurmctld_resv_t *resv_backup, *resv_ptr; @@ -1743,7 +1743,7 @@ static void _validate_node_choice(slurmctld_resv_t *resv_ptr) { bitstr_t *tmp_bitmap = NULL; int i; - reserve_request_msg_t resv_desc; + resv_desc_msg_t resv_desc; if (resv_ptr->flags & RESERVE_FLAG_SPEC_NODES) return; @@ -1755,7 +1755,7 @@ static void _validate_node_choice(slurmctld_resv_t *resv_ptr) /* Reservation includes DOWN, DRAINED/DRAINING, FAILING or * NO_RESPOND nodes. Generate new request using _select_nodes() * in attempt to replace this nodes */ - memset(&resv_desc, 0, sizeof(reserve_request_msg_t)); + memset(&resv_desc, 0, sizeof(resv_desc_msg_t)); resv_desc.start_time = resv_ptr->start_time; resv_desc.end_time = resv_ptr->end_time; resv_desc.features = resv_ptr->features; @@ -1948,7 +1948,7 @@ static int _resize_resv(slurmctld_resv_t *resv_ptr, uint32_t node_cnt) { bitstr_t *tmp1_bitmap = NULL, *tmp2_bitmap = NULL; int delta_node_cnt, i; - reserve_request_msg_t resv_desc; + resv_desc_msg_t resv_desc; delta_node_cnt = resv_ptr->node_cnt - node_cnt; if (delta_node_cnt == 0) /* Already correct node count */ @@ -1995,7 +1995,7 @@ static int _resize_resv(slurmctld_resv_t *resv_ptr, uint32_t node_cnt) /* Must increase node count. Make this look like new request so * we can use _select_nodes() for selecting the nodes */ - memset(&resv_desc, 0, sizeof(reserve_request_msg_t)); + memset(&resv_desc, 0, sizeof(resv_desc_msg_t)); resv_desc.start_time = resv_ptr->start_time; resv_desc.end_time = resv_ptr->end_time; resv_desc.features = resv_ptr->features; @@ -2014,7 +2014,7 @@ static int _resize_resv(slurmctld_resv_t *resv_ptr, uint32_t node_cnt) } /* Given a reservation create request, select appropriate nodes for use */ -static int _select_nodes(reserve_request_msg_t *resv_desc_ptr, +static int _select_nodes(resv_desc_msg_t *resv_desc_ptr, struct part_record **part_ptr, bitstr_t **resv_bitmap) { @@ -2110,7 +2110,7 @@ static int _select_nodes(reserve_request_msg_t *resv_desc_ptr, * RET bitmap of selected nodes or NULL if request can not be satisfied */ static bitstr_t *_pick_idle_nodes(bitstr_t *avail_nodes, - reserve_request_msg_t *resv_desc_ptr) + resv_desc_msg_t *resv_desc_ptr) { ListIterator job_iterator; struct job_record *job_ptr; diff --git a/src/slurmctld/reservation.h b/src/slurmctld/reservation.h index d91ec7590b49e9106476e76a79d3bcdb8cc1da22..bc4e0df9e6e613fb475e20d253624b6487f1b7e4 100644 --- a/src/slurmctld/reservation.h +++ b/src/slurmctld/reservation.h @@ -48,10 +48,10 @@ extern time_t last_resv_update; /* Create a resource reservation */ -extern int create_resv(reserve_request_msg_t *resv_desc_ptr); +extern int create_resv(resv_desc_msg_t *resv_desc_ptr); /* Update an exiting resource reservation */ -extern int update_resv(reserve_request_msg_t *resv_desc_ptr); +extern int update_resv(resv_desc_msg_t *resv_desc_ptr); /* Delete an exiting resource reservation */ extern int delete_resv(reservation_name_msg_t *resv_desc_ptr); diff --git a/src/sview/block_info.c b/src/sview/block_info.c index c43af429055714e2403360324dbbd2db0e3cae0f..3c9e98a912ea6f4500f97af1809862b98466b8c2 100644 --- a/src/sview/block_info.c +++ b/src/sview/block_info.c @@ -134,6 +134,7 @@ static display_data_t options_data_block[] = { {G_TYPE_STRING, PART_PAGE, "Partition", TRUE, BLOCK_PAGE}, {G_TYPE_STRING, NODE_PAGE, "Base Partitions", TRUE, BLOCK_PAGE}, {G_TYPE_STRING, SUBMIT_PAGE, "Job Submit", FALSE, BLOCK_PAGE}, + {G_TYPE_STRING, RESV_PAGE, "Reservation", TRUE, BLOCK_PAGE}, {G_TYPE_NONE, -1, NULL, FALSE, EDIT_NONE} }; diff --git a/src/sview/common.c b/src/sview/common.c index 524b9b99fdae401ce0faa358aafef992088507a2..b45555f92e37efd3490b14f16964c5bb6187b41c 100644 --- a/src/sview/common.c +++ b/src/sview/common.c @@ -288,6 +288,10 @@ static void _selected_page(GtkMenuItem *menuitem, popup_all_block(treedata->model, &treedata->iter, display_data->id); break; + case RESV_PAGE: + popup_all_resv(treedata->model, &treedata->iter, + display_data->id); + break; case ADMIN_PAGE: switch(display_data->id) { case JOB_PAGE: @@ -302,6 +306,10 @@ static void _selected_page(GtkMenuItem *menuitem, admin_block(treedata->model, &treedata->iter, display_data->name); break; + case RESV_PAGE: + admin_resv(treedata->model, &treedata->iter, + display_data->name); + break; case NODE_PAGE: admin_node(treedata->model, &treedata->iter, display_data->name); @@ -936,6 +944,9 @@ extern void *popup_thr(popup_info_t *popup_win) case BLOCK_PAGE: specifc_info = specific_info_block; break; + case RESV_PAGE: + specifc_info = specific_info_resv; + break; case SUBMIT_PAGE: default: g_print("thread got unknown type %d\n", popup_win->type); diff --git a/src/sview/job_info.c b/src/sview/job_info.c index 0161cdde41b25e22eab5051c02849440a85c0b9d..a1c94b22fe61d2d87fa8f19323f112b3a9ca3735 100644 --- a/src/sview/job_info.c +++ b/src/sview/job_info.c @@ -320,6 +320,7 @@ static display_data_t options_data_job[] = { #else {G_TYPE_STRING, NODE_PAGE, "Nodes", TRUE, JOB_PAGE}, #endif + {G_TYPE_STRING, RESV_PAGE, "Reservation", TRUE, JOB_PAGE}, {G_TYPE_NONE, -1, NULL, FALSE, EDIT_NONE} }; @@ -3072,6 +3073,13 @@ extern void popup_all_job(GtkTreeModel *model, GtkTreeIter *iter, int id) snprintf(title, 100, "Partition with job %d.%d", jobid, stepid); break; + case RESV_PAGE: + if(stepid == NO_VAL) + snprintf(title, 100, "Reservation with job %d", jobid); + else + snprintf(title, 100, "Reservation with job %d.%d", + jobid, stepid); + break; case NODE_PAGE: if(stepid == NO_VAL) { #ifdef HAVE_BG @@ -3145,6 +3153,10 @@ extern void popup_all_job(GtkTreeModel *model, GtkTreeIter *iter, int id) gtk_tree_model_get(model, iter, SORTID_PARTITION, &name, -1); popup_win->spec_info->search_info->gchar_data = name; break; + case RESV_PAGE: + gtk_tree_model_get(model, iter, SORTID_RESV_NAME, &name, -1); + popup_win->spec_info->search_info->gchar_data = name; + break; #ifdef HAVE_BG case BLOCK_PAGE: gtk_tree_model_get(model, iter, SORTID_BLOCK, &name, -1); diff --git a/src/sview/node_info.c b/src/sview/node_info.c index 8f3118c9d0a01cab5069d966142401c496cf8141..1a90c21a5f892b493c94ec37cf98d42d04af9088 100644 --- a/src/sview/node_info.c +++ b/src/sview/node_info.c @@ -107,6 +107,7 @@ static display_data_t options_data_node[] = { {G_TYPE_STRING, BLOCK_PAGE, "Blocks", TRUE, NODE_PAGE}, #endif {G_TYPE_STRING, PART_PAGE, "Partition", TRUE, NODE_PAGE}, + {G_TYPE_STRING, RESV_PAGE, "Reservation", TRUE, NODE_PAGE}, {G_TYPE_STRING, SUBMIT_PAGE, "Job Submit", FALSE, NODE_PAGE}, {G_TYPE_NONE, -1, NULL, FALSE, EDIT_NONE} }; diff --git a/src/sview/part_info.c b/src/sview/part_info.c index f9b48020337fee2f8a31c5f6ac2697e887735d5d..2aeef4b847bf732590663216267f9bc83d696d0c 100644 --- a/src/sview/part_info.c +++ b/src/sview/part_info.c @@ -191,6 +191,7 @@ static display_data_t options_data_part[] = { {G_TYPE_STRING, NODE_PAGE, "Nodes", TRUE, PART_PAGE}, #endif {G_TYPE_STRING, SUBMIT_PAGE, "Job Submit", FALSE, PART_PAGE}, + {G_TYPE_STRING, RESV_PAGE, "Reservation", TRUE, PART_PAGE}, {G_TYPE_NONE, -1, NULL, FALSE, EDIT_NONE} }; diff --git a/src/sview/resv_info.c b/src/sview/resv_info.c index 1147c9bb38b5e3a470f7e0d38e66bc1319157760..768974154467c7bc3461c67be0148c55dcb74bd5 100644 --- a/src/sview/resv_info.c +++ b/src/sview/resv_info.c @@ -32,10 +32,22 @@ #define _DEBUG 0 +/* Collection of data for printing reports. Like data is combined here */ +typedef struct { + reserve_info_t *resv_ptr; + char *color; +} sview_resv_info_t; + +enum { + EDIT_REMOVE = 1, + EDIT_EDIT +}; + /* These need to be in alpha order (except POS and CNT) */ enum { SORTID_POS = POS_LOC, SORTID_ACCOUNTS, + SORTID_ACTION, SORTID_END_TIME, SORTID_FEATURES, SORTID_FLAGS, @@ -44,6 +56,7 @@ enum { SORTID_NODE_LIST, SORTID_PARTITION, SORTID_START_TIME, + SORTID_UPDATED, SORTID_USERS, SORTID_CNT }; @@ -56,31 +69,682 @@ enum { static display_data_t display_data_resv[] = { {G_TYPE_INT, SORTID_POS, NULL, FALSE, EDIT_NONE, refresh_resv, create_model_resv, admin_edit_resv}, - {G_TYPE_STRING, SORTID_ACCOUNTS, "Accounts", FALSE, EDIT_TEXTBOX, + {G_TYPE_STRING, SORTID_NAME, "Name", TRUE, EDIT_NONE, refresh_resv, create_model_resv, admin_edit_resv}, - {G_TYPE_STRING, SORTID_END_TIME, "EndTime", FALSE, EDIT_TEXTBOX, + {G_TYPE_STRING, SORTID_ACTION, "Action", FALSE, EDIT_MODEL, refresh_resv, create_model_resv, admin_edit_resv}, - {G_TYPE_STRING, SORTID_FEATURES, "Features", FALSE, EDIT_TEXTBOX, + {G_TYPE_STRING, SORTID_NODE_CNT, "Nodes", TRUE, EDIT_TEXTBOX, refresh_resv, create_model_resv, admin_edit_resv}, - {G_TYPE_STRING, SORTID_FLAGS, "Flags", FALSE, EDIT_NONE, + {G_TYPE_STRING, SORTID_NODE_LIST, "NodeList", TRUE, EDIT_TEXTBOX, refresh_resv, create_model_resv, admin_edit_resv}, - {G_TYPE_STRING, SORTID_NAME, "Name", TRUE, EDIT_NONE, + {G_TYPE_STRING, SORTID_START_TIME, "StartTime", FALSE, EDIT_TEXTBOX, refresh_resv, create_model_resv, admin_edit_resv}, - {G_TYPE_INT, SORTID_NODE_CNT, "Nodes", TRUE, EDIT_TEXTBOX, + {G_TYPE_STRING, SORTID_END_TIME, "EndTime", FALSE, EDIT_TEXTBOX, refresh_resv, create_model_resv, admin_edit_resv}, - {G_TYPE_STRING, SORTID_NODE_LIST, "NodeList", TRUE, EDIT_TEXTBOX, + {G_TYPE_STRING, SORTID_ACCOUNTS, "Accounts", FALSE, EDIT_TEXTBOX, + refresh_resv, create_model_resv, admin_edit_resv}, + {G_TYPE_STRING, SORTID_USERS, "Users", FALSE, EDIT_TEXTBOX, refresh_resv, create_model_resv, admin_edit_resv}, {G_TYPE_STRING, SORTID_PARTITION, "Partition", FALSE, EDIT_TEXTBOX, refresh_resv, create_model_resv, admin_edit_resv}, - {G_TYPE_STRING, SORTID_START_TIME, "StartTime", FALSE, EDIT_TEXTBOX, + {G_TYPE_STRING, SORTID_FEATURES, "Features", FALSE, EDIT_TEXTBOX, refresh_resv, create_model_resv, admin_edit_resv}, - {G_TYPE_STRING, SORTID_USERS, "Users", FALSE, EDIT_TEXTBOX, + {G_TYPE_STRING, SORTID_FLAGS, "Flags", FALSE, EDIT_NONE, + refresh_resv, create_model_resv, admin_edit_resv}, + {G_TYPE_INT, SORTID_UPDATED, NULL, FALSE, EDIT_NONE, refresh_resv, create_model_resv, admin_edit_resv}, {G_TYPE_NONE, -1, NULL, FALSE, EDIT_NONE} }; +static display_data_t options_data_resv[] = { + {G_TYPE_INT, SORTID_POS, NULL, FALSE, EDIT_NONE}, + {G_TYPE_STRING, INFO_PAGE, "Full Info", TRUE, RESV_PAGE}, + {G_TYPE_STRING, RESV_PAGE, "Remove", TRUE, ADMIN_PAGE}, + {G_TYPE_STRING, RESV_PAGE, "Edit Reservation", TRUE, ADMIN_PAGE}, + {G_TYPE_STRING, JOB_PAGE, "Jobs", TRUE, RESV_PAGE}, + {G_TYPE_STRING, PART_PAGE, "Partition", TRUE, RESV_PAGE}, +#ifdef HAVE_BG + {G_TYPE_STRING, BLOCK_PAGE, "Block", TRUE, RESV_PAGE}, + {G_TYPE_STRING, NODE_PAGE, "Base Partitions", TRUE, RESV_PAGE}, +#else + {G_TYPE_STRING, NODE_PAGE, "Nodes", TRUE, RESV_PAGE}, +#endif + {G_TYPE_NONE, -1, NULL, FALSE, EDIT_NONE} +}; + + static display_data_t *local_display_data = NULL; +static char *got_edit_signal = NULL; + +/* + * _parse_flags is used to parse the Flags= option. It handles + * daily, weekly, and maint, optionally preceded by + or -, + * separated by a comma but no spaces. + */ +static uint32_t _parse_flags(const char *flagstr) +{ + int flip; + uint32_t outflags = 0; + const char *curr = flagstr; + int taglen = 0; + + while (*curr != '\0') { + flip = 0; + if (*curr == '+') { + curr++; + } else if (*curr == '-') { + flip = 1; + curr++; + } + taglen = 0; + while (curr[taglen] != ',' && curr[taglen] != '\0') + taglen++; + + if (strncasecmp(curr, "Maintenance", MAX(taglen,1)) == 0) { + curr += taglen; + if (flip) + outflags |= RESERVE_FLAG_NO_MAINT; + else + outflags |= RESERVE_FLAG_MAINT; + } else if (strncasecmp(curr, "Daily", MAX(taglen,1)) == 0) { + curr += taglen; + if (flip) + outflags |= RESERVE_FLAG_NO_DAILY; + else + outflags |= RESERVE_FLAG_DAILY; + } else if (strncasecmp(curr, "Weekly", MAX(taglen,1)) == 0) { + curr += taglen; + if (flip) + outflags |= RESERVE_FLAG_NO_WEEKLY; + else + outflags |= RESERVE_FLAG_WEEKLY; + } else { + char *temp = g_strdup_printf("Error parsing flags %s.", + flagstr); + display_edit_note(temp); + g_free(temp); + outflags = (uint32_t)NO_VAL; + break; + } + + if (*curr == ',') + curr++; + } + return outflags; +} + +static void _set_active_combo_resv(GtkComboBox *combo, + GtkTreeModel *model, GtkTreeIter *iter, + int type) +{ + char *temp_char = NULL; + int action = 0; + + gtk_tree_model_get(model, iter, type, &temp_char, -1); + if(!temp_char) + goto end_it; + switch(type) { + case SORTID_ACTION: + if(!strcmp(temp_char, "none")) + action = 0; + else if(!strcmp(temp_char, "remove")) + action = 1; + else + action = 0; + + break; + default: + break; + } + g_free(temp_char); +end_it: + gtk_combo_box_set_active(combo, action); + +} + +/* don't free this char */ +static const char *_set_resv_msg(resv_desc_msg_t *resv_msg, + const char *new_text, + int column) +{ + char *type = NULL; + int temp_int = 0; + uint32_t f; + + /* need to clear errno here (just in case) */ + errno = 0; + + if(!resv_msg) + return NULL; + + switch(column) { + case SORTID_ACCOUNTS: + resv_msg->accounts = xstrdup(new_text); + type = "accounts"; + break; + case SORTID_ACTION: + xfree(got_edit_signal); + if(!strcasecmp(new_text, "None")) + got_edit_signal = NULL; + else + got_edit_signal = xstrdup(new_text); + break; + case SORTID_END_TIME: + resv_msg->end_time = parse_time((char *)new_text, 0); + type = "end time"; + break; + case SORTID_FEATURES: + resv_msg->features = xstrdup(new_text); + type = "features"; + break; + case SORTID_FLAGS: + f = _parse_flags(new_text); + type = "flags"; + if(f == (uint32_t)NO_VAL) + goto return_error; + resv_msg->flags = f; + break; + case SORTID_NAME: + resv_msg->name = xstrdup(new_text); + type = "name"; + break; + case SORTID_NODE_CNT: + temp_int = strtol(new_text, (char **)NULL, 10); + + type = "Node Count"; + if(temp_int <= 0) + goto return_error; + resv_msg->node_cnt = temp_int; + break; + case SORTID_NODE_LIST: + resv_msg->node_list = xstrdup(new_text); + type = "node list"; + break; + case SORTID_PARTITION: + resv_msg->partition = xstrdup(new_text); + type = "partition"; + break; + case SORTID_START_TIME: + resv_msg->start_time = parse_time((char *)new_text, 0); + type = "start time"; + break; + case SORTID_USERS: + resv_msg->users = xstrdup(new_text); + type = "users"; + break; + default: + type = "unknown"; + break; + } + + return type; + +return_error: + errno = 1; + return type; +} + +static void _resv_info_list_del(void *object) +{ + sview_resv_info_t *sview_resv_info = (sview_resv_info_t *)object; + + if (sview_resv_info) { + xfree(sview_resv_info); + } +} + +static void _admin_edit_combo_box_resv(GtkComboBox *combo, + resv_desc_msg_t *resv_msg) +{ + GtkTreeModel *model = NULL; + GtkTreeIter iter; + int column = 0; + char *name = NULL; + + if(!resv_msg) + return; + + if(!gtk_combo_box_get_active_iter(combo, &iter)) { + g_print("nothing selected\n"); + return; + } + model = gtk_combo_box_get_model(combo); + if(!model) { + g_print("nothing selected\n"); + return; + } + + gtk_tree_model_get(model, &iter, 0, &name, -1); + gtk_tree_model_get(model, &iter, 1, &column, -1); + + _set_resv_msg(resv_msg, name, column); + + g_free(name); +} + + + +static gboolean _admin_focus_out_resv(GtkEntry *entry, + GdkEventFocus *event, + resv_desc_msg_t *resv_msg) +{ + int type = gtk_entry_get_max_length(entry); + const char *name = gtk_entry_get_text(entry); + type -= DEFAULT_ENTRY_LENGTH; + _set_resv_msg(resv_msg, name, type); + + return false; +} + +static GtkWidget *_admin_full_edit_resv(resv_desc_msg_t *resv_msg, + GtkTreeModel *model, GtkTreeIter *iter) +{ + GtkScrolledWindow *window = create_scrolled_window(); + GtkBin *bin = NULL; + GtkViewport *view = NULL; + GtkTable *table = NULL; + GtkWidget *label = NULL; + GtkWidget *entry = NULL; + GtkTreeModel *model2 = NULL; + GtkCellRenderer *renderer = NULL; + int i = 0, row = 0; + char *temp_char = NULL; + + gtk_scrolled_window_set_policy(window, + GTK_POLICY_NEVER, + GTK_POLICY_AUTOMATIC); + bin = GTK_BIN(&window->container); + view = GTK_VIEWPORT(bin->child); + bin = GTK_BIN(&view->bin); + table = GTK_TABLE(bin->child); + gtk_table_resize(table, SORTID_CNT, 2); + + gtk_table_set_homogeneous(table, FALSE); + + for(i = 0; i < SORTID_CNT; i++) { + if(display_data_resv[i].extra == EDIT_MODEL) { + /* edittable items that can only be known + values */ + model2 = GTK_TREE_MODEL( + create_model_resv(display_data_resv[i].id)); + if(!model2) { + g_print("no model set up for %d(%s)\n", + display_data_resv[i].id, + display_data_resv[i].name); + continue; + } + entry = gtk_combo_box_new_with_model(model2); + g_object_unref(model2); + + _set_active_combo_resv(GTK_COMBO_BOX(entry), model, + iter, display_data_resv[i].id); + + g_signal_connect(entry, "changed", + G_CALLBACK( + _admin_edit_combo_box_resv), + resv_msg); + + renderer = gtk_cell_renderer_text_new(); + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(entry), + renderer, TRUE); + gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(entry), + renderer, "text", 0); + } else if(display_data_resv[i].extra == EDIT_TEXTBOX) { + /* other edittable items that are unknown */ + entry = create_entry(); + gtk_tree_model_get(model, iter, + display_data_resv[i].id, + &temp_char, -1); + gtk_entry_set_max_length(GTK_ENTRY(entry), + (DEFAULT_ENTRY_LENGTH + + display_data_resv[i].id)); + + if(temp_char) { + gtk_entry_set_text(GTK_ENTRY(entry), + temp_char); + g_free(temp_char); + } + g_signal_connect(entry, "focus-out-event", + G_CALLBACK(_admin_focus_out_resv), + resv_msg); + } else /* others can't be altered by the user */ + continue; + label = gtk_label_new(display_data_resv[i].name); + gtk_table_attach(table, label, 0, 1, row, row+1, + GTK_FILL | GTK_EXPAND, GTK_SHRINK, + 0, 0); + gtk_table_attach(table, entry, 1, 2, row, row+1, + GTK_FILL, GTK_SHRINK, + 0, 0); + row++; + } + gtk_table_resize(table, row, 2); + + return GTK_WIDGET(window); +} + +static void _layout_resv_record(GtkTreeView *treeview, + sview_resv_info_t *sview_resv_info, + int update) +{ + GtkTreeIter iter; + char time_buf[20]; + reserve_info_t *resv_ptr = sview_resv_info->resv_ptr; + char *temp_char = NULL; + + GtkTreeStore *treestore = + GTK_TREE_STORE(gtk_tree_view_get_model(treeview)); + + + add_display_treestore_line(update, treestore, &iter, + find_col_name(display_data_resv, + SORTID_NAME), + resv_ptr->name); + + convert_num_unit((float)resv_ptr->node_cnt, + time_buf, sizeof(time_buf), UNIT_NONE); + add_display_treestore_line(update, treestore, &iter, + find_col_name(display_data_resv, + SORTID_NODE_CNT), + time_buf); + + add_display_treestore_line(update, treestore, &iter, + find_col_name(display_data_resv, + SORTID_NODE_LIST), + resv_ptr->node_list); + + slurm_make_time_str((time_t *)&resv_ptr->start_time, time_buf, + sizeof(time_buf)); + add_display_treestore_line(update, treestore, &iter, + find_col_name(display_data_resv, + SORTID_START_TIME), + time_buf); + slurm_make_time_str((time_t *)&resv_ptr->end_time, time_buf, + sizeof(time_buf)); + add_display_treestore_line(update, treestore, &iter, + find_col_name(display_data_resv, + SORTID_END_TIME), + time_buf); + + add_display_treestore_line(update, treestore, &iter, + find_col_name(display_data_resv, + SORTID_ACCOUNTS), + resv_ptr->accounts); + + add_display_treestore_line(update, treestore, &iter, + find_col_name(display_data_resv, + SORTID_USERS), + resv_ptr->users); + + add_display_treestore_line(update, treestore, &iter, + find_col_name(display_data_resv, + SORTID_PARTITION), + resv_ptr->partition); + + add_display_treestore_line(update, treestore, &iter, + find_col_name(display_data_resv, + SORTID_FEATURES), + resv_ptr->features); + + temp_char = reservation_flags_string(resv_ptr->flags); + add_display_treestore_line(update, treestore, &iter, + find_col_name(display_data_resv, + SORTID_FLAGS), + temp_char); + xfree(temp_char); +} + +static void _update_resv_record(sview_resv_info_t *sview_resv_info_ptr, + GtkTreeStore *treestore, + GtkTreeIter *iter) +{ + char *tmp_ptr = NULL; + char tmp_char[50]; + reserve_info_t *resv_ptr = sview_resv_info_ptr->resv_ptr; + + gtk_tree_store_set(treestore, iter, SORTID_UPDATED, 1, -1); + + gtk_tree_store_set(treestore, iter, + SORTID_ACCOUNTS, resv_ptr->accounts, -1); + + slurm_make_time_str((time_t *)&resv_ptr->end_time, tmp_char, + sizeof(tmp_char)); + gtk_tree_store_set(treestore, iter, SORTID_END_TIME, tmp_char, -1); + + gtk_tree_store_set(treestore, iter, SORTID_FEATURES, + resv_ptr->features, -1); + + tmp_ptr = reservation_flags_string(resv_ptr->flags); + gtk_tree_store_set(treestore, iter, SORTID_FLAGS, + tmp_ptr, -1); + xfree(tmp_ptr); + + gtk_tree_store_set(treestore, iter, SORTID_NAME, resv_ptr->name, -1); + + convert_num_unit((float)resv_ptr->node_cnt, + tmp_char, sizeof(tmp_char), UNIT_NONE); + gtk_tree_store_set(treestore, iter, + SORTID_NODE_CNT, tmp_char, -1); + + gtk_tree_store_set(treestore, iter, + SORTID_NODE_LIST, resv_ptr->node_list, -1); + + gtk_tree_store_set(treestore, iter, + SORTID_PARTITION, resv_ptr->partition, -1); + + slurm_make_time_str((time_t *)&resv_ptr->start_time, tmp_char, + sizeof(tmp_char)); + gtk_tree_store_set(treestore, iter, SORTID_START_TIME, tmp_char, -1); + + gtk_tree_store_set(treestore, iter, + SORTID_USERS, resv_ptr->users, -1); + + return; +} + +static void _append_resv_record(sview_resv_info_t *sview_resv_info_ptr, + GtkTreeStore *treestore, GtkTreeIter *iter, + int line) +{ + gtk_tree_store_append(treestore, iter, NULL); + gtk_tree_store_set(treestore, iter, SORTID_POS, line, -1); + _update_resv_record(sview_resv_info_ptr, treestore, iter); +} + +static void _update_info_resv(List info_list, + GtkTreeView *tree_view) +{ + GtkTreePath *path = gtk_tree_path_new_first(); + GtkTreeModel *model = gtk_tree_view_get_model(tree_view); + GtkTreeIter iter; + reserve_info_t *resv_ptr = NULL; + int line = 0; + char *host = NULL, *resv_name = NULL; + ListIterator itr = NULL; + sview_resv_info_t *sview_resv_info = NULL; + + /* get the iter, or find out the list is empty goto add */ + if (gtk_tree_model_get_iter(model, &iter, path)) { + /* make sure all the reserves are still here */ + while(1) { + gtk_tree_store_set(GTK_TREE_STORE(model), &iter, + SORTID_UPDATED, 0, -1); + if(!gtk_tree_model_iter_next(model, &iter)) { + break; + } + } + } + + itr = list_iterator_create(info_list); + while ((sview_resv_info = (sview_resv_info_t*) list_next(itr))) { + resv_ptr = sview_resv_info->resv_ptr; + /* get the iter, or find out the list is empty goto add */ + if (!gtk_tree_model_get_iter(model, &iter, path)) { + goto adding; + } + while(1) { + /* search for the jobid and check to see if + it is in the list */ + gtk_tree_model_get(model, &iter, SORTID_NAME, + &resv_name, -1); + if(!strcmp(resv_name, resv_ptr->name)) { + /* update with new info */ + g_free(resv_name); + _update_resv_record(sview_resv_info, + GTK_TREE_STORE(model), + &iter); + goto found; + } + g_free(resv_name); + + /* see what line we were on to add the next one + to the list */ + gtk_tree_model_get(model, &iter, SORTID_POS, + &line, -1); + if(!gtk_tree_model_iter_next(model, &iter)) { + line++; + break; + } + } + adding: + _append_resv_record(sview_resv_info, GTK_TREE_STORE(model), + &iter, line); + found: + ; + } + list_iterator_destroy(itr); + if(host) + free(host); + + gtk_tree_path_free(path); + /* remove all old reservations */ + remove_old(model, SORTID_UPDATED); + return; +} + +static List _create_resv_info_list(reserve_info_msg_t *resv_info_ptr, + int changed) +{ + static List info_list = NULL; + int i = 0; + sview_resv_info_t *sview_resv_info_ptr = NULL; + reserve_info_t *resv_ptr = NULL; + + if(!changed && info_list) + goto update_color; + + if(info_list) + list_flush(info_list); + else + info_list = list_create(_resv_info_list_del); + + if (!info_list) { + g_print("malloc error\n"); + return NULL; + } + + for(i=0; i<resv_info_ptr->record_count; i++) { + resv_ptr = &(resv_info_ptr->reservation_array[i]); + sview_resv_info_ptr = xmalloc(sizeof(sview_resv_info_t)); + sview_resv_info_ptr->resv_ptr = resv_ptr; + list_append(info_list, sview_resv_info_ptr); + } + +update_color: + return info_list; +} + +void _display_info_resv(List info_list, popup_info_t *popup_win) +{ + specific_info_t *spec_info = popup_win->spec_info; + char *name = (char *)spec_info->search_info->gchar_data; + int found = 0; + reserve_info_t *resv_ptr = NULL; + GtkTreeView *treeview = NULL; + ListIterator itr = NULL; + sview_resv_info_t *sview_resv_info = NULL; + int update = 0; + int i = -1, j = 0; + int first_time = 0; + + if(!spec_info->search_info->gchar_data) { + //info = xstrdup("No pointer given!"); + goto finished; + } + if(!list_count(popup_win->grid_button_list)) + first_time = 1; + +need_refresh: + if(!spec_info->display_widget) { + treeview = create_treeview_2cols_attach_to_table( + popup_win->table); + spec_info->display_widget = + gtk_widget_ref(GTK_WIDGET(treeview)); + } else { + treeview = GTK_TREE_VIEW(spec_info->display_widget); + update = 1; + } + + itr = list_iterator_create(info_list); + while ((sview_resv_info = (sview_resv_info_t*) list_next(itr))) { + resv_ptr = sview_resv_info->resv_ptr; + i++; + if(!strcmp(resv_ptr->name, name)) { + j=0; + while(resv_ptr->node_inx[j] >= 0) { + if(!first_time) + change_grid_color( + popup_win->grid_button_list, + resv_ptr->node_inx[j], + resv_ptr->node_inx[j+1], i); + else + get_button_list_from_main( + &popup_win->grid_button_list, + resv_ptr->node_inx[j], + resv_ptr->node_inx[j+1], + i); + j += 2; + } + _layout_resv_record(treeview, sview_resv_info, update); + found = 1; + break; + } + } + list_iterator_destroy(itr); + + if(!found) { + if(!popup_win->not_found) { + char *temp = "RESERVATION DOESN'T EXSIST\n"; + GtkTreeIter iter; + GtkTreeModel *model = NULL; + + /* only time this will be run so no update */ + model = gtk_tree_view_get_model(treeview); + add_display_treestore_line(0, + GTK_TREE_STORE(model), + &iter, + temp, ""); + } + popup_win->not_found = true; + } else { + if(popup_win->not_found) { + popup_win->not_found = false; + gtk_widget_destroy(spec_info->display_widget); + + goto need_refresh; + } + put_buttons_in_table(popup_win->grid_table, + popup_win->grid_button_list); + + } + gtk_widget_show(spec_info->display_widget); + +finished: + + return; +} + extern void refresh_resv(GtkAction *action, gpointer user_data) { popup_info_t *popup_win = (popup_info_t *)user_data; @@ -91,9 +755,67 @@ extern void refresh_resv(GtkAction *action, gpointer user_data) specific_info_resv(popup_win); } +extern int get_new_info_resv(reserve_info_msg_t **info_ptr, + int force) +{ + static reserve_info_msg_t *resv_info_ptr = NULL, *new_resv_ptr = NULL; + int error_code = SLURM_NO_CHANGE_IN_DATA; + time_t now = time(NULL); + static time_t last; + static bool changed = 0; + + if(!force && ((now - last) < global_sleep_time)) { + error_code = SLURM_NO_CHANGE_IN_DATA; + *info_ptr = resv_info_ptr; + if(changed) + return SLURM_SUCCESS; + return error_code; + } + last = now; + if (resv_info_ptr) { + error_code = slurm_load_reservations(resv_info_ptr->last_update, + &new_resv_ptr); + if (error_code == SLURM_SUCCESS) { + slurm_free_reservation_info_msg(resv_info_ptr); + changed = 1; + } else if (slurm_get_errno() == SLURM_NO_CHANGE_IN_DATA) { + error_code = SLURM_NO_CHANGE_IN_DATA; + new_resv_ptr = resv_info_ptr; + changed = 0; + } + } else { + error_code = slurm_load_reservations((time_t) NULL, + &new_resv_ptr); + changed = 1; + } + resv_info_ptr = new_resv_ptr; + *info_ptr = new_resv_ptr; + return error_code; +} + extern GtkListStore *create_model_resv(int type) { - return (GtkListStore *) NULL; + GtkListStore *model = NULL; + GtkTreeIter iter; + + switch(type) { + case SORTID_ACTION: + model = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_INT); + gtk_list_store_append(model, &iter); + gtk_list_store_set(model, &iter, + 1, SORTID_ACTION, + 0, "None", + -1); + gtk_list_store_append(model, &iter); + gtk_list_store_set(model, &iter, + 1, SORTID_ACTION, + 0, "Remove", + -1); + break; + default: + break; + } + return model; } extern void admin_edit_resv(GtkCellRendererText *cell, @@ -101,19 +823,90 @@ extern void admin_edit_resv(GtkCellRendererText *cell, const char *new_text, gpointer data) { + GtkTreeStore *treestore = GTK_TREE_STORE(data); + GtkTreePath *path = gtk_tree_path_new_from_string(path_string); + GtkTreeIter iter; + resv_desc_msg_t *resv_msg = xmalloc(sizeof(resv_desc_msg_t)); + + char *temp = NULL; + char *old_text = NULL; + const char *type = NULL; + + int column = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(cell), + "column")); + + if(!new_text || !strcmp(new_text, "")) + goto no_input; + + slurm_init_resv_desc_msg(resv_msg); + + gtk_tree_model_get_iter(GTK_TREE_MODEL(treestore), &iter, path); + + slurm_init_resv_desc_msg(resv_msg); + gtk_tree_model_get(GTK_TREE_MODEL(treestore), &iter, + SORTID_NAME, &resv_msg->name, + column, &old_text, + -1); + + type = _set_resv_msg(resv_msg, new_text, column); + if(errno) + goto print_error; + + if(got_edit_signal) { + temp = got_edit_signal; + got_edit_signal = NULL; + admin_resv(GTK_TREE_MODEL(treestore), &iter, temp); + xfree(temp); + goto no_input; + } + + if(old_text && !strcmp(old_text, new_text)) { + temp = g_strdup_printf("No change in value."); + } else if(slurm_update_reservation(resv_msg) == SLURM_SUCCESS) { + gtk_tree_store_set(treestore, &iter, column, new_text, -1); + temp = g_strdup_printf("Reservation %s %s changed to %s", + resv_msg->name, + type, + new_text); + } else if(errno == ESLURM_DISABLED) { + temp = g_strdup_printf( + "Can only edit %s on reservations not yet started.", + type); + } else { + print_error: + temp = g_strdup_printf("Reservation %s %s can't be " + "set to %s", + resv_msg->name, + type, + new_text); + } + + display_edit_note(temp); + g_free(temp); + +no_input: + slurm_free_resv_desc_msg(resv_msg); + + gtk_tree_path_free (path); + g_free(old_text); + g_static_mutex_unlock(&sview_mutex); } extern void get_info_resv(GtkTable *table, display_data_t *display_data) { int error_code = SLURM_SUCCESS; + List info_list = NULL; static int view = -1; static reserve_info_msg_t *resv_info_ptr = NULL; - reserve_info_t *resv; char error_char[100]; GtkWidget *label = NULL; GtkTreeView *tree_view = NULL; static GtkWidget *display_widget = NULL; int i = 0, j = 0; + int changed = 1; + ListIterator itr = NULL; + sview_resv_info_t *sview_resv_info_ptr = NULL; + reserve_info_t *resv_ptr = NULL; if(display_data) local_display_data = display_data; @@ -128,8 +921,9 @@ extern void get_info_resv(GtkTable *table, display_data_t *display_data) } error_code = get_new_info_resv(&resv_info_ptr, force_refresh); - if ((error_code != SLURM_SUCCESS) && - (error_code != SLURM_NO_CHANGE_IN_DATA)) { + if(error_code == SLURM_NO_CHANGE_IN_DATA) { + changed = 0; + } else if (error_code != SLURM_SUCCESS) { if(view == ERROR_VIEW) goto end_it; if(display_widget) @@ -145,40 +939,44 @@ extern void get_info_resv(GtkTable *table, display_data_t *display_data) } display_it: - for (i=0; i<resv_info_ptr->record_count; i++) { - resv = &resv_info_ptr->reservation_array[i]; - j = 0; - while (resv->node_inx[j] >= 0) { -//FIXME: Need to capure the color here? - (void) change_grid_color(grid_button_list, - resv->node_inx[j], - resv->node_inx[j+1], - i); + info_list = _create_resv_info_list(resv_info_ptr, changed); + if(!info_list) + return; + /* set up the grid */ + itr = list_iterator_create(info_list); + while ((sview_resv_info_ptr = list_next(itr))) { + resv_ptr = sview_resv_info_ptr->resv_ptr; + j=0; + while(resv_ptr->node_inx[j] >= 0) { + sview_resv_info_ptr->color = + change_grid_color(grid_button_list, + resv_ptr->node_inx[j], + resv_ptr->node_inx[j+1], + i); j += 2; } + i++; } - + list_iterator_destroy(itr); + if(view == ERROR_VIEW && display_widget) { gtk_widget_destroy(display_widget); display_widget = NULL; } - if(!display_widget) { tree_view = create_treeview(local_display_data); - + display_widget = gtk_widget_ref(GTK_WIDGET(tree_view)); - gtk_table_attach_defaults(GTK_TABLE(table), + gtk_table_attach_defaults(table, GTK_WIDGET(tree_view), - 0, 1, 0, 1); + 0, 1, 0, 1); /* since this function sets the model of the tree_view - * to the treestore we don't really care about - * the return value */ + to the treestore we don't really care about + the return value */ create_treestore(tree_view, display_data_resv, SORTID_CNT); } - view = INFO_VIEW; -// _update_info_job(info_list, GTK_TREE_VIEW(display_widget)); - + _update_info_resv(info_list, GTK_TREE_VIEW(display_widget)); end_it: toggled = FALSE; force_refresh = FALSE; @@ -186,84 +984,397 @@ end_it: return; } -extern int get_new_info_resv(reserve_info_msg_t **info_ptr, - int force) +extern void specific_info_resv(popup_info_t *popup_win) { - static reserve_info_msg_t *resv_info_ptr = NULL, *new_resv_ptr = NULL; - int error_code = SLURM_NO_CHANGE_IN_DATA; - time_t now = time(NULL); - static time_t last; - static bool changed = 0; - - if(!force && ((now - last) < global_sleep_time)) { - error_code = SLURM_NO_CHANGE_IN_DATA; - *info_ptr = resv_info_ptr; - if(changed) - return SLURM_SUCCESS; - return error_code; + int resv_error_code = SLURM_SUCCESS; + static reserve_info_msg_t *resv_info_ptr = NULL; + static reserve_info_t *resv_ptr = NULL; + specific_info_t *spec_info = popup_win->spec_info; + sview_search_info_t *search_info = spec_info->search_info; + char error_char[100]; + GtkWidget *label = NULL; + GtkTreeView *tree_view = NULL; + List resv_list = NULL; + List send_resv_list = NULL; + int changed = 1; + sview_resv_info_t *sview_resv_info_ptr = NULL; + int j=0, i=-1; + char *host = NULL, *host2 = NULL; + hostlist_t hostlist = NULL; + int found = 0; + ListIterator itr = NULL; + + if(!spec_info->display_widget) { + setup_popup_info(popup_win, display_data_resv, SORTID_CNT); } - last = now; - if (resv_info_ptr) { - error_code = slurm_load_reservations(resv_info_ptr->last_update, - &new_resv_ptr); - if (error_code == SLURM_SUCCESS) { - slurm_free_reservation_info_msg(resv_info_ptr); - changed = 1; - } else if (slurm_get_errno() == SLURM_NO_CHANGE_IN_DATA) { - error_code = SLURM_NO_CHANGE_IN_DATA; - new_resv_ptr = resv_info_ptr; - changed = 0; + + if(spec_info->display_widget && popup_win->toggled) { + gtk_widget_destroy(spec_info->display_widget); + spec_info->display_widget = NULL; + goto display_it; + } + + if((resv_error_code = + get_new_info_resv(&resv_info_ptr, popup_win->force_refresh)) + == SLURM_NO_CHANGE_IN_DATA) { + if(!spec_info->display_widget + || spec_info->view == ERROR_VIEW) { + goto display_it; } - } else { - error_code = slurm_load_reservations((time_t) NULL, - &new_resv_ptr); - changed = 1; + changed = 0; + + } else if (resv_error_code != SLURM_SUCCESS) { + if(spec_info->view == ERROR_VIEW) + goto end_it; + spec_info->view = ERROR_VIEW; + if(spec_info->display_widget) + gtk_widget_destroy(spec_info->display_widget); + sprintf(error_char, "slurm_load_node_select: %s", + slurm_strerror(slurm_get_errno())); + label = gtk_label_new(error_char); + gtk_table_attach_defaults(popup_win->table, + label, + 0, 1, 0, 1); + gtk_widget_show(label); + spec_info->display_widget = gtk_widget_ref(label); + goto end_it; } - resv_info_ptr = new_resv_ptr; - *info_ptr = new_resv_ptr; - return error_code; -} + +display_it: + + resv_list = _create_resv_info_list(resv_info_ptr, changed); -extern void specific_info_resv(popup_info_t *popup_win) -{ + if(!resv_list) + return; + + if(spec_info->view == ERROR_VIEW && spec_info->display_widget) { + gtk_widget_destroy(spec_info->display_widget); + spec_info->display_widget = NULL; + } + if(spec_info->type != INFO_PAGE && !spec_info->display_widget) { + tree_view = create_treeview(local_display_data); + spec_info->display_widget = + gtk_widget_ref(GTK_WIDGET(tree_view)); + gtk_table_attach_defaults(popup_win->table, + GTK_WIDGET(tree_view), + 0, 1, 0, 1); + /* since this function sets the model of the tree_view + to the treestore we don't really care about + the return value */ + create_treestore(tree_view, + popup_win->display_data, SORTID_CNT); + } + + if(popup_win->grid_button_list) { + list_destroy(popup_win->grid_button_list); + } + +#ifdef HAVE_3D + popup_win->grid_button_list = copy_main_button_list(); +#else + popup_win->grid_button_list = list_create(destroy_grid_button); +#endif + + spec_info->view = INFO_VIEW; + if(spec_info->type == INFO_PAGE) { + _display_info_resv(resv_list, popup_win); + goto end_it; + } + + /* just linking to another list, don't free the inside, just + the list */ + send_resv_list = list_create(NULL); + itr = list_iterator_create(resv_list); + i = -1; + while ((sview_resv_info_ptr = list_next(itr))) { + i++; + resv_ptr = sview_resv_info_ptr->resv_ptr; + switch(spec_info->type) { + case PART_PAGE: + if(strcmp(resv_ptr->partition, + search_info->gchar_data)) + continue; + break; + case BLOCK_PAGE: + case NODE_PAGE: + if(!resv_ptr->node_list) + continue; + + hostlist = hostlist_create(search_info->gchar_data); + host = hostlist_shift(hostlist); + hostlist_destroy(hostlist); + if(!host) + continue; + + hostlist = hostlist_create(resv_ptr->node_list); + found = 0; + while((host2 = hostlist_shift(hostlist))) { + if(!strcmp(host, host2)) { + free(host2); + found = 1; + break; + } + free(host2); + } + hostlist_destroy(hostlist); + if(!found) + continue; + break; + case JOB_PAGE: + if(strcmp(resv_ptr->name, + search_info->gchar_data)) + continue; + break; + default: + g_print("Unknown type %d\n", spec_info->type); + continue; + } + list_push(send_resv_list, resv_ptr); + j=0; + while(resv_ptr->node_inx[j] >= 0) { + change_grid_color( + popup_win->grid_button_list, + resv_ptr->node_inx[j], + resv_ptr->node_inx[j+1], i); + j += 2; + } + } + list_iterator_destroy(itr); + + _update_info_resv(send_resv_list, + GTK_TREE_VIEW(spec_info->display_widget)); + list_destroy(send_resv_list); +end_it: + popup_win->toggled = 0; + popup_win->force_refresh = 0; + + return; } extern void set_menus_resv(void *arg, GtkTreePath *path, GtkMenu *menu, int type) { + GtkTreeView *tree_view = (GtkTreeView *)arg; + popup_info_t *popup_win = (popup_info_t *)arg; + switch(type) { + case TAB_CLICKED: + make_fields_menu(menu, display_data_resv, SORTID_CNT); + break; + case ROW_CLICKED: + make_options_menu(tree_view, path, menu, options_data_resv); + break; + case POPUP_CLICKED: + make_popup_fields_menu(popup_win, menu); + break; + default: + g_error("UNKNOWN type %d given to set_fields\n", type); + } } -#if 0 -static void _layout_job_record(GtkTreeView *treeview, - sview_job_info_t *sview_job_info_ptr, - int update) +extern void popup_all_resv(GtkTreeModel *model, GtkTreeIter *iter, int id) { - char *nodes = NULL, *reason = NULL, *uname = NULL; - char tmp_char[50]; - time_t now_time = time(NULL); - job_info_t *job_ptr = sview_job_info_ptr->job_ptr; - struct group *group_info = NULL; - uint16_t term_sig = 0; - - GtkTreeIter iter; - GtkTreeStore *treestore = - GTK_TREE_STORE(gtk_tree_view_get_model(treeview)); + char *name = NULL; + char *state = NULL; + char title[100]; + ListIterator itr = NULL; + popup_info_t *popup_win = NULL; + GError *error = NULL; + + gtk_tree_model_get(model, iter, SORTID_NAME, &name, -1); + + switch(id) { + case PART_PAGE: + snprintf(title, 100, "Partition with reservation %s", name); + break; + case JOB_PAGE: + snprintf(title, 100, "Job(s) in reservation %s", name); + break; + case NODE_PAGE: +#ifdef HAVE_BG + snprintf(title, 100, + "Base partitions(s) in reservation %s", + name); +#else + snprintf(title, 100, "Node(s) in reservation %s ", + name); +#endif + break; + case BLOCK_PAGE: + snprintf(title, 100, "Block(s) in reservation %s", name); + break; + case SUBMIT_PAGE: + snprintf(title, 100, "Submit job in reservation %s", name); + break; + case INFO_PAGE: + snprintf(title, 100, "Full info for reservation %s", name); + break; + default: + g_print("resv got %d\n", id); + } + + itr = list_iterator_create(popup_list); + while((popup_win = list_next(itr))) { + if(popup_win->spec_info) + if(!strcmp(popup_win->spec_info->title, title)) { + break; + } + } + list_iterator_destroy(itr); - if(!treestore) + if(!popup_win) { + if(id == INFO_PAGE) + popup_win = create_popup_info(id, RESV_PAGE, title); + else + popup_win = create_popup_info(RESV_PAGE, id, title); + } else { + g_free(name); + g_free(state); + gtk_window_present(GTK_WINDOW(popup_win->popup)); return; + } - add_display_treestore_line(update, treestore, &iter, - find_col_name(display_data_job, - SORTID_NAME), - job_ptr->name); + switch(id) { + case JOB_PAGE: + case BLOCK_PAGE: + case INFO_PAGE: + popup_win->spec_info->search_info->gchar_data = name; + //specific_info_job(popup_win); + break; + case NODE_PAGE: + g_free(name); + gtk_tree_model_get(model, iter, SORTID_NODE_LIST, &name, -1); + popup_win->spec_info->search_info->gchar_data = name; + popup_win->spec_info->search_info->search_type = + SEARCH_NODE_NAME; + + g_free(state); + + //specific_info_node(popup_win); + break; + case SUBMIT_PAGE: + break; + default: + g_print("resv got unknown type %d\n", id); + } + if (!g_thread_create((gpointer)popup_thr, popup_win, FALSE, &error)) + { + g_printerr ("Failed to create resv popup thread: %s\n", + error->message); + return; + } } -static void _update_job_record(sview_job_info_t *sview_job_info_ptr, - GtkTreeStore *treestore, - GtkTreeIter *iter) +extern void admin_resv(GtkTreeModel *model, GtkTreeIter *iter, char *type) { + resv_desc_msg_t *resv_msg = xmalloc(sizeof(resv_desc_msg_t)); + reservation_name_msg_t resv_name_msg; + char *resvid = NULL; + char tmp_char[100]; + char *temp = NULL; + int edit_type = 0; + int response = 0; + GtkWidget *label = NULL; + GtkWidget *entry = NULL; + GtkWidget *popup = gtk_dialog_new_with_buttons( + type, + GTK_WINDOW(main_window), + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + NULL); + gtk_window_set_transient_for(GTK_WINDOW(popup), NULL); + + gtk_tree_model_get(model, iter, SORTID_NAME, &resvid, -1); + + slurm_init_resv_desc_msg(resv_msg); + memset(&resv_name_msg, 0, sizeof(reservation_name_msg_t)); + + resv_msg->name = xstrdup(resvid); + + if(!strcasecmp("Remove", type)) { + resv_name_msg.name = resvid; + + label = gtk_dialog_add_button(GTK_DIALOG(popup), + GTK_STOCK_YES, GTK_RESPONSE_OK); + gtk_window_set_default(GTK_WINDOW(popup), label); + gtk_dialog_add_button(GTK_DIALOG(popup), + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); + + snprintf(tmp_char, sizeof(tmp_char), + "Are you sure you want to remove " + "reservation %s?", + resvid); + label = gtk_label_new(tmp_char); + edit_type = EDIT_REMOVE; + } else { + label = gtk_dialog_add_button(GTK_DIALOG(popup), + GTK_STOCK_OK, GTK_RESPONSE_OK); + gtk_window_set_default(GTK_WINDOW(popup), label); + gtk_dialog_add_button(GTK_DIALOG(popup), + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); + + gtk_window_set_default_size(GTK_WINDOW(popup), 200, 400); + snprintf(tmp_char, sizeof(tmp_char), + "Editing reservation %s think before you type", + resvid); + label = gtk_label_new(tmp_char); + edit_type = EDIT_EDIT; + entry = _admin_full_edit_resv(resv_msg, model, iter); + } + + gtk_box_pack_start(GTK_BOX(GTK_DIALOG(popup)->vbox), + label, FALSE, FALSE, 0); + if(entry) + gtk_box_pack_start(GTK_BOX(GTK_DIALOG(popup)->vbox), + entry, TRUE, TRUE, 0); + gtk_widget_show_all(popup); + response = gtk_dialog_run (GTK_DIALOG(popup)); - gtk_tree_store_set(treestore, iter, SORTID_NAME, job_ptr->name, -1); + if (response == GTK_RESPONSE_OK) { + switch(edit_type) { + case EDIT_REMOVE: + if(slurm_delete_reservation(&resv_name_msg) + == SLURM_SUCCESS) { + temp = g_strdup_printf( + "Reservation %s removed successfully", + resvid); + } else { + temp = g_strdup_printf( + "Problem removing reservation %s.", + resvid); + } + display_edit_note(temp); + g_free(temp); + break; + case EDIT_EDIT: + if(got_edit_signal) + goto end_it; + if(slurm_update_reservation(resv_msg) + == SLURM_SUCCESS) { + temp = g_strdup_printf( + "Reservation %s updated successfully", + resvid); + } else { + temp = g_strdup_printf( + "Problem updating reservation %s.", + resvid); + } + display_edit_note(temp); + g_free(temp); + break; + default: + break; + } + } +end_it: + + g_free(resvid); + slurm_free_resv_desc_msg(resv_msg); + gtk_widget_destroy(popup); + if(got_edit_signal) { + type = got_edit_signal; + got_edit_signal = NULL; + admin_resv(model, iter, type); + xfree(type); + } + return; } -#endif diff --git a/src/sview/sview.c b/src/sview/sview.c index c44669ca14903e761ea324a164520acbb1e9822d..4b12840624787b8f466efa42dd6b8b27db91cb8a 100644 --- a/src/sview/sview.c +++ b/src/sview/sview.c @@ -83,8 +83,6 @@ display_data_t main_display_data[] = { refresh_main, create_model_resv, admin_edit_resv, get_info_resv, specific_info_resv, set_menus_resv, NULL}, - - #ifdef HAVE_BG {G_TYPE_NONE, BLOCK_PAGE, "BG Blocks", TRUE, -1, refresh_main, NULL, NULL, diff --git a/src/sview/sview.h b/src/sview/sview.h index e275d7dbcfb83adb1c582d359db385598e2e6a74..e516a7ce5cd14e3de8af04b25350b11b2f49ed95 100644 --- a/src/sview/sview.h +++ b/src/sview/sview.h @@ -356,18 +356,20 @@ extern void popup_all_node(GtkTreeModel *model, GtkTreeIter *iter, int id); extern void admin_node(GtkTreeModel *model, GtkTreeIter *iter, char *type); // resv_info.c +extern void refresh_resv(GtkAction *action, gpointer user_data); +extern GtkListStore *create_model_resv(int type); extern void admin_edit_resv(GtkCellRendererText *cell, const char *path_string, const char *new_text, gpointer data); -extern GtkListStore *create_model_resv(int type); +extern int get_new_info_resv(reserve_info_msg_t **info_ptr, int force); extern void get_info_resv(GtkTable *table, display_data_t *display_data); -extern int get_new_info_resv(reserve_info_msg_t **info_ptr, - int force); +extern void specific_info_resv(popup_info_t *popup_win); extern void set_menus_resv(void *arg, GtkTreePath *path, GtkMenu *menu, int type); -extern void specific_info_resv(popup_info_t *popup_win); -extern void refresh_resv(GtkAction *action, gpointer user_data); +extern void popup_all_resv(GtkTreeModel *model, GtkTreeIter *iter, int id); +extern void admin_resv(GtkTreeModel *model, GtkTreeIter *iter, char *type); + // submit_info.c extern void get_info_submit(GtkTable *table, display_data_t *display_data);