From 24d49111108c22d8d3ad8124cf71c7e46c9d90d7 Mon Sep 17 00:00:00 2001 From: Danny Auble <da@llnl.gov> Date: Tue, 31 Oct 2006 18:40:34 +0000 Subject: [PATCH] starting on job editting and ground work laid for others. --- src/sview/admin_info.c | 4 +- src/sview/block_info.c | 41 +- src/sview/common.c | 116 ++- src/sview/job_info.c | 1633 +++++++++++++++++++++++++++++++-------- src/sview/node_info.c | 55 +- src/sview/part_info.c | 208 ++--- src/sview/submit_info.c | 2 +- src/sview/sview.h | 12 +- 8 files changed, 1584 insertions(+), 487 deletions(-) diff --git a/src/sview/admin_info.c b/src/sview/admin_info.c index 3ff76f10290..f7a9a17b6f6 100644 --- a/src/sview/admin_info.c +++ b/src/sview/admin_info.c @@ -37,7 +37,7 @@ enum { SORTID_TIMELIMIT, SORTID_NODES, SORTID_NODELIST, - SORTID_PARTITION_CNT + SORTID_CNT }; static display_data_t display_data_admin[] = { @@ -76,7 +76,7 @@ extern void set_menus_admin(void *arg, GtkTreePath *path, popup_info_t *popup_win = (popup_info_t *)arg; switch(type) { case TAB_CLICKED: - make_fields_menu(menu, display_data_admin); + make_fields_menu(menu, display_data_admin, SORTID_CNT); break; case ROW_CLICKED: make_options_menu(tree_view, path, menu, options_data_admin); diff --git a/src/sview/block_info.c b/src/sview/block_info.c index 36c9e5b85b2..d5fd67381f0 100644 --- a/src/sview/block_info.c +++ b/src/sview/block_info.c @@ -54,15 +54,15 @@ typedef struct { enum { SORTID_POS = POS_LOC, SORTID_BLOCK, + SORTID_CONN, SORTID_NODES, SORTID_NODELIST, - SORTID_STATE, - SORTID_USER, - SORTID_CONN, - SORTID_USE, SORTID_PARTITION, SORTID_POINTER, + SORTID_STATE, SORTID_UPDATED, + SORTID_USE, + SORTID_USER, SORTID_CNT }; @@ -98,6 +98,7 @@ static display_data_t display_data_block[] = { static display_data_t options_data_block[] = { {G_TYPE_INT, SORTID_POS, NULL, FALSE, -1}, {G_TYPE_STRING, INFO_PAGE, "Full Info", TRUE, BLOCK_PAGE}, + {G_TYPE_STRING, BLOCK_PAGE, "Edit Block", TRUE, ADMIN_PAGE}, {G_TYPE_STRING, JOB_PAGE, "Jobs", TRUE, BLOCK_PAGE}, {G_TYPE_STRING, PART_PAGE, "Partition", TRUE, BLOCK_PAGE}, {G_TYPE_STRING, NODE_PAGE, "Base Partitions", TRUE, BLOCK_PAGE}, @@ -192,32 +193,40 @@ static void _layout_block_record(GtkTreeView *treeview, GTK_TREE_STORE(gtk_tree_view_get_model(treeview)); add_display_treestore_line(update, treestore, &iter, - display_data_block[SORTID_BLOCK].name, + find_col_name(display_data_block, + SORTID_BLOCK), block_ptr->bg_block_name); add_display_treestore_line(update, treestore, &iter, - display_data_block[SORTID_PARTITION].name, + find_col_name(display_data_block, + SORTID_PARTITION), block_ptr->slurm_part_name); add_display_treestore_line(update, treestore, &iter, - display_data_block[SORTID_STATE].name, + find_col_name(display_data_block, + SORTID_STATE), bg_block_state_string(block_ptr->state)); add_display_treestore_line(update, treestore, &iter, - display_data_block[SORTID_USER].name, + find_col_name(display_data_block, + SORTID_USER), block_ptr->bg_user_name); add_display_treestore_line(update, treestore, &iter, - display_data_block[SORTID_CONN].name, + find_col_name(display_data_block, + SORTID_CONN), _convert_conn_type( block_ptr->bg_conn_type)); add_display_treestore_line(update, treestore, &iter, - display_data_block[SORTID_USE].name, + find_col_name(display_data_block, + SORTID_USE), _convert_node_use(block_ptr->bg_node_use)); convert_num_unit((float)block_ptr->node_cnt, tmp_cnt, UNIT_NONE); add_display_treestore_line(update, treestore, &iter, - display_data_block[SORTID_NODES].name, + find_col_name(display_data_block, + SORTID_NODES), tmp_cnt); add_display_treestore_line(update, treestore, &iter, - display_data_block[SORTID_NODELIST].name, + find_col_name(display_data_block, + SORTID_NODELIST), block_ptr->nodes); } @@ -917,7 +926,7 @@ extern void set_menus_block(void *arg, GtkTreePath *path, popup_info_t *popup_win = (popup_info_t *)arg; switch(type) { case TAB_CLICKED: - make_fields_menu(menu, display_data_block); + make_fields_menu(menu, display_data_block, SORTID_CNT); break; case ROW_CLICKED: make_options_menu(tree_view, path, menu, options_data_block); @@ -1016,3 +1025,9 @@ extern void popup_all_block(GtkTreeModel *model, GtkTreeIter *iter, int id) return; } } + +extern void admin_block(GtkTreeModel *model, GtkTreeIter *iter, char *type) +{ + return; +} + diff --git a/src/sview/common.c b/src/sview/common.c index 579dd5a85b1..903bc9a460f 100644 --- a/src/sview/common.c +++ b/src/sview/common.c @@ -193,7 +193,7 @@ static void _add_col_to_treeview(GtkTreeView *tree_view, gtk_tree_view_column_set_reorderable(col, true); gtk_tree_view_column_set_resizable(col, true); gtk_tree_view_column_set_expand(col, true); - gtk_tree_view_append_column(tree_view, col); + gtk_tree_view_insert_column(tree_view, col, display_data->id); gtk_tree_view_column_set_sort_column_id(col, display_data->id); } @@ -243,6 +243,30 @@ static void _selected_page(GtkMenuItem *menuitem, popup_all_block(treedata->model, &treedata->iter, display_data->id); break; + case ADMIN_PAGE: + switch(display_data->id) { + case JOB_PAGE: + admin_job(treedata->model, &treedata->iter, + display_data->name); + break; + case PART_PAGE: + admin_part(treedata->model, &treedata->iter, + display_data->name); + break; + case BLOCK_PAGE: + admin_block(treedata->model, &treedata->iter, + display_data->name); + break; + case NODE_PAGE: + admin_node(treedata->model, &treedata->iter, + display_data->name); + break; + default: + g_print("common admin got %d %d\n", + display_data->extra, + display_data->id); + } + break; default: g_print("common got %d %d\n", display_data->extra, display_data->id); @@ -294,6 +318,34 @@ extern int get_row_number(GtkTreeView *tree_view, GtkTreePath *path) return line; } +extern int find_col(display_data_t *display_data, int type) +{ + int i = 0; + + while(display_data++) { + if(display_data->id == -1) + break; + if(display_data->id == type) + return i; + i++; + } + return -1; +} + +extern const char *find_col_name(display_data_t *display_data, int type) +{ + int i = 0; + + while(display_data++) { + if(display_data->id == -1) + break; + if(display_data->id == type) + return display_data->name; + i++; + } + return NULL; +} + extern void *get_pointer(GtkTreeView *tree_view, GtkTreePath *path, int loc) { GtkTreeModel *model = gtk_tree_view_get_model(tree_view); @@ -313,24 +365,33 @@ extern void *get_pointer(GtkTreeView *tree_view, GtkTreePath *path, int loc) return ptr; } -extern void make_fields_menu(GtkMenu *menu, display_data_t *display_data) +extern void make_fields_menu(GtkMenu *menu, display_data_t *display_data, + int count) { GtkWidget *menuitem = NULL; - - while(display_data++) { - if(display_data->id == -1) + display_data_t *first_display_data = display_data; + int i = 0; + for(i=0; i<count; i++) { + while(display_data++) { + if(display_data->id == -1) + break; + if(!display_data->name) + continue; + if(display_data->id != i) + continue; + menuitem = gtk_check_menu_item_new_with_label( + display_data->name); + + gtk_check_menu_item_set_active( + GTK_CHECK_MENU_ITEM(menuitem), + display_data->show); + g_signal_connect(menuitem, "toggled", + G_CALLBACK(_toggle_state_changed), + display_data); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); break; - if(!display_data->name) - continue; - menuitem = gtk_check_menu_item_new_with_label( - display_data->name); - - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), - display_data->show); - g_signal_connect(menuitem, "toggled", - G_CALLBACK(_toggle_state_changed), - display_data); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); + } + display_data = first_display_data; } } @@ -496,8 +557,10 @@ extern GtkTreeStore *create_treestore(GtkTreeView *tree_view, int i=0; /*set up the types defined in the display_data_t */ - for(i=0; i<count; i++) - types[i] = display_data[i].type; + for(i=0; i<count; i++) { + types[display_data[i].id] = display_data[i].type; + } + treestore = gtk_tree_store_newv(count, types); if(!treestore) { g_error("Can't great treestore.\n"); @@ -514,18 +577,18 @@ extern GtkTreeStore *create_treestore(GtkTreeView *tree_view, case G_TYPE_INT: gtk_tree_sortable_set_sort_func( GTK_TREE_SORTABLE(treestore), - i, + display_data[i].id, _sort_iter_compare_func_int, - GINT_TO_POINTER(i), + GINT_TO_POINTER(display_data[i].id), NULL); break; case G_TYPE_STRING: gtk_tree_sortable_set_sort_func( GTK_TREE_SORTABLE(treestore), - i, + display_data[i].id, _sort_iter_compare_func_char, - GINT_TO_POINTER(i), + GINT_TO_POINTER(display_data[i].id), NULL); break; default: @@ -561,7 +624,7 @@ extern void right_button_pressed(GtkTreeView *tree_view, } extern gboolean row_clicked(GtkTreeView *tree_view, GdkEventButton *event, - const display_data_t *display_data) + const display_data_t *display_data) { GtkTreePath *path = NULL; GtkTreeSelection *selection = NULL; @@ -1003,8 +1066,13 @@ extern void display_edit_note(char *edit_note) extern void add_display_treestore_line(int update, GtkTreeStore *treestore, GtkTreeIter *iter, - char *name, char *value) + const char *name, char *value) { + if(!name) { + g_print("error, name = %s and value = %s\n", + name, value); + return; + } if(update) { char *display_name = NULL; GtkTreePath *path = gtk_tree_path_new_first(); diff --git a/src/sview/job_info.c b/src/sview/job_info.c index 34fefc2581c..6d52cd19806 100644 --- a/src/sview/job_info.c +++ b/src/sview/job_info.c @@ -30,8 +30,12 @@ #include "src/common/node_select.h" #include "src/sview/sview.h" #include "src/common/parse_time.h" - +#include <grp.h> + #define _DEBUG 0 +#define DEFAULT_ENTRY_LENGTH 500 +#define MAX_CANCEL_RETRY 10 +#define SIZE(a) (sizeof(a)/sizeof(a[0])) /* Collection of data for printing reports. Like data is combined here */ typedef struct { @@ -42,64 +46,88 @@ typedef struct { List step_list; } sview_job_info_t; +enum { + EDIT_SIGNAL = 1, + EDIT_SIGNAL_USER = 1, + EDIT_CANCEL, + EDIT_CANCEL_USER, + EDIT_SUSPEND, + EDIT_EDIT +}; + +/* These need to be in alpha order (except POS and CNT) */ enum { SORTID_POS = POS_LOC, - SORTID_JOBID, + SORTID_ACCOUNT, SORTID_ACTION, SORTID_ALLOC, - SORTID_PARTITION, + SORTID_ALLOC_NODE, + SORTID_BATCH, #ifdef HAVE_BG SORTID_BLOCK, #endif - SORTID_USER, - SORTID_NAME, - SORTID_STATE, - SORTID_TIME, - SORTID_SUBMIT_TIME, - SORTID_START_TIME, - SORTID_END_TIME, - SORTID_SUSPEND_TIME, - SORTID_TIMELIMIT, - SORTID_NODES, - SORTID_NODELIST, - SORTID_REQ_NODELIST, - SORTID_EXC_NODELIST, + SORTID_COMMENT, +#ifdef HAVE_BG + SORTID_CONNECTION, +#endif SORTID_CONTIGUOUS, - SORTID_PRIORITY, - SORTID_NUM_PROCS, - SORTID_TASKS, - SORTID_SHARED, + SORTID_DEPENDENCY, SORTID_CPUS_PER_TASK, - SORTID_REQ_PROCS, - SORTID_MIN_NODES, + SORTID_END_TIME, + SORTID_EXC_NODELIST, + SORTID_FEATURES, + SORTID_EXIT_CODE, +#ifdef HAVE_BG + SORTID_GEOMETRY, +#endif + SORTID_GROUP, + SORTID_JOBID, + SORTID_MAX_CORES, + SORTID_MAX_MEM, SORTID_MAX_NODES, - SORTID_MIN_SOCKETS, SORTID_MAX_SOCKETS, - SORTID_MIN_CORES, - SORTID_MAX_CORES, - SORTID_MIN_THREADS, +#ifdef HAVE_BG + SORTID_MAX_PROCS, +#endif SORTID_MAX_THREADS, - SORTID_MIN_PROCS, + SORTID_MIN_CORES, SORTID_MIN_MEM, - SORTID_MAX_MEM, - SORTID_TMP_DISK, + SORTID_MIN_NODES, + SORTID_MIN_PROCS, + SORTID_MIN_SOCKETS, + SORTID_MIN_THREADS, + SORTID_NAME, + SORTID_NETWORK, SORTID_NICE, - SORTID_ACCOUNT, - SORTID_REASON, - SORTID_FEATURES, - SORTID_DEPENDENCY, - - SORTID_ALLOC_NODE, + SORTID_NODELIST, + SORTID_NODES, + SORTID_NTASKS_PER_CORE, SORTID_NTASKS_PER_NODE, SORTID_NTASKS_PER_SOCKET, - SORTID_NTASKS_PER_CORE, - SORTID_COMMENT, + SORTID_NUM_PROCS, + SORTID_PARTITION, + SORTID_PRIORITY, + SORTID_REASON, + SORTID_REQ_NODELIST, + SORTID_REQ_PROCS, #ifdef HAVE_BG - SORTID_GEOMETRY, SORTID_ROTATE, - SORTID_CONNECTION, #endif + SORTID_SHARED, +#ifdef HAVE_BG + SORTID_START, +#endif + SORTID_START_TIME, + SORTID_STATE, + SORTID_STATE_NUM, + SORTID_SUBMIT_TIME, + SORTID_SUSPEND_TIME, + SORTID_TASKS, + SORTID_TIME, + SORTID_TIMELIMIT, + SORTID_TMP_DISK, SORTID_UPDATED, + SORTID_USER, SORTID_CNT }; @@ -120,20 +148,25 @@ static display_data_t display_data_job[] = { #endif {G_TYPE_STRING, SORTID_USER, "User", TRUE, -1, refresh_job, create_model_job, admin_edit_job}, + {G_TYPE_STRING, SORTID_GROUP, "Group", FALSE, -1, refresh_job, + create_model_job, admin_edit_job}, {G_TYPE_STRING, SORTID_NAME, "Name", TRUE, 1, refresh_job, create_model_job, admin_edit_job}, - {G_TYPE_STRING, SORTID_STATE, "State", TRUE, 0, refresh_job, + {G_TYPE_STRING, SORTID_STATE, "State", TRUE, -1, refresh_job, + create_model_job, admin_edit_job}, + {G_TYPE_INT, SORTID_STATE_NUM, NULL, FALSE, -1, refresh_job, create_model_job, admin_edit_job}, {G_TYPE_STRING, SORTID_TIME, "Running Time", TRUE, -1, refresh_job, create_model_job, admin_edit_job}, - {G_TYPE_STRING, SORTID_SUBMIT_TIME, "Submit Time", TRUE, + {G_TYPE_STRING, SORTID_SUBMIT_TIME, "Submit Time", FALSE, -1, refresh_job, create_model_job, admin_edit_job}, - {G_TYPE_STRING, SORTID_START_TIME, "Start Time", TRUE, -1, refresh_job, + {G_TYPE_STRING, SORTID_START_TIME, "Start Time", FALSE, + -1, refresh_job, create_model_job, admin_edit_job}, - {G_TYPE_STRING, SORTID_END_TIME, "End Time", TRUE, -1, refresh_job, + {G_TYPE_STRING, SORTID_END_TIME, "End Time", FALSE, -1, refresh_job, create_model_job, admin_edit_job}, - {G_TYPE_STRING, SORTID_SUSPEND_TIME, "Suspended Time", TRUE, + {G_TYPE_STRING, SORTID_SUSPEND_TIME, "Suspended Time", FALSE, -1, refresh_job, create_model_job, admin_edit_job}, {G_TYPE_STRING, SORTID_TIMELIMIT, "Time limit", FALSE, 1, refresh_job, @@ -157,13 +190,17 @@ static display_data_t display_data_job[] = { #endif {G_TYPE_STRING, SORTID_CONTIGUOUS, "Contiguous", FALSE, 0, refresh_job, create_model_job, admin_edit_job}, - {G_TYPE_INT, SORTID_PRIORITY, "Priority", FALSE, 1, refresh_job, + {G_TYPE_STRING, SORTID_PRIORITY, "Priority", FALSE, 1, refresh_job, + create_model_job, admin_edit_job}, + {G_TYPE_STRING, SORTID_EXIT_CODE, "Exit Code", FALSE, -1, refresh_job, + create_model_job, admin_edit_job}, + {G_TYPE_STRING, SORTID_BATCH, "Batch Flag", FALSE, -1, refresh_job, create_model_job, admin_edit_job}, {G_TYPE_STRING, SORTID_NUM_PROCS, "Num Processors", FALSE, -1, refresh_job, create_model_job, admin_edit_job}, {G_TYPE_STRING, SORTID_TASKS, "Num Tasks", FALSE, -1, refresh_job, create_model_job, admin_edit_job}, - {G_TYPE_INT, SORTID_SHARED, "Shared", FALSE, -1, refresh_job, + {G_TYPE_STRING, SORTID_SHARED, "Shared", FALSE, 0, refresh_job, create_model_job, admin_edit_job}, {G_TYPE_STRING, SORTID_CPUS_PER_TASK, "Cpus per Task", FALSE, -1, refresh_job, create_model_job, admin_edit_job}, @@ -172,54 +209,62 @@ static display_data_t display_data_job[] = { {G_TYPE_STRING, SORTID_MIN_NODES, "Min Nodes", FALSE, 1, refresh_job, create_model_job, admin_edit_job}, {G_TYPE_STRING, SORTID_MAX_NODES, "Max Nodes", - FALSE, 1, refresh_job, create_model_job, admin_edit_job}, + FALSE, -1, refresh_job, create_model_job, admin_edit_job}, {G_TYPE_STRING, SORTID_MIN_PROCS, "Min Procs", FALSE, 1, refresh_job, create_model_job, admin_edit_job}, +#ifdef HAVE_BG + {G_TYPE_STRING, SORTID_MAX_PROCS, "Max Procs", + FALSE, -1, refresh_job, create_model_job, admin_edit_job}, +#endif {G_TYPE_STRING, SORTID_MIN_SOCKETS, "Min Sockets", FALSE, 1, refresh_job, create_model_job, admin_edit_job}, {G_TYPE_STRING, SORTID_MAX_SOCKETS, "Max Sockets", - FALSE, 1, refresh_job, create_model_job, admin_edit_job}, + FALSE, -1, refresh_job, create_model_job, admin_edit_job}, {G_TYPE_STRING, SORTID_MIN_CORES, "Min Cores", FALSE, 1, refresh_job, create_model_job, admin_edit_job}, {G_TYPE_STRING, SORTID_MAX_CORES, "Max Cores", - FALSE, 1, refresh_job, create_model_job, admin_edit_job}, + FALSE, -1, refresh_job, create_model_job, admin_edit_job}, {G_TYPE_STRING, SORTID_MIN_THREADS, "Min Threads", FALSE, 1, refresh_job, create_model_job, admin_edit_job}, {G_TYPE_STRING, SORTID_MAX_THREADS, "Max Threads", - FALSE, 1, refresh_job, create_model_job, admin_edit_job}, + FALSE, -1, refresh_job, create_model_job, admin_edit_job}, {G_TYPE_STRING, SORTID_MIN_MEM, "Min Memory", FALSE, 1, refresh_job, create_model_job, admin_edit_job}, {G_TYPE_STRING, SORTID_MAX_MEM, "Max Memory", - FALSE, 1, refresh_job, create_model_job, admin_edit_job}, + FALSE, -1, refresh_job, create_model_job, admin_edit_job}, {G_TYPE_STRING, SORTID_TMP_DISK, "Tmp Disk", FALSE, 1, refresh_job, create_model_job, admin_edit_job}, {G_TYPE_STRING, SORTID_NICE, "Nice", - FALSE, 1, refresh_job, create_model_job, admin_edit_job}, + FALSE, -1, refresh_job, create_model_job, admin_edit_job}, {G_TYPE_STRING, SORTID_ACCOUNT, "Account Charged", - FALSE, 1, refresh_job, create_model_job, admin_edit_job}, + FALSE, -1, refresh_job, create_model_job, admin_edit_job}, {G_TYPE_STRING, SORTID_REASON, "Wait Reason", - FALSE, 1, refresh_job, create_model_job, admin_edit_job}, + FALSE, -1, refresh_job, create_model_job, admin_edit_job}, {G_TYPE_STRING, SORTID_FEATURES, "Features", FALSE, 1, refresh_job, create_model_job, admin_edit_job}, {G_TYPE_STRING, SORTID_DEPENDENCY, "Dependency", FALSE, 1, refresh_job, create_model_job, admin_edit_job}, - {G_TYPE_STRING, SORTID_ALLOC_NODE, "Node job was allocated from", - FALSE, 1, refresh_job, create_model_job, admin_edit_job}, + {G_TYPE_STRING, SORTID_ALLOC_NODE, "Alloc Node : Sid", + FALSE, -1, refresh_job, create_model_job, admin_edit_job}, {G_TYPE_STRING, SORTID_NTASKS_PER_NODE, "Num tasks per Node", - FALSE, 1, refresh_job, create_model_job, admin_edit_job}, + FALSE, -1, refresh_job, create_model_job, admin_edit_job}, {G_TYPE_STRING, SORTID_NTASKS_PER_SOCKET, "Num tasks per Socket", - FALSE, 1, refresh_job, create_model_job, admin_edit_job}, + FALSE, -1, refresh_job, create_model_job, admin_edit_job}, {G_TYPE_STRING, SORTID_NTASKS_PER_CORE, "Num tasks per Core", - FALSE, 1, refresh_job, create_model_job, admin_edit_job}, + FALSE, -1, refresh_job, create_model_job, admin_edit_job}, + {G_TYPE_STRING, SORTID_NETWORK, "Network", + FALSE, -1, refresh_job, create_model_job, admin_edit_job}, {G_TYPE_STRING, SORTID_COMMENT, "Comment", - FALSE, 1, refresh_job, create_model_job, admin_edit_job}, + FALSE, -1, refresh_job, create_model_job, admin_edit_job}, #ifdef HAVE_BG {G_TYPE_STRING, SORTID_GEOMETRY, "Geometry", - FALSE, 1, refresh_job, create_model_job, admin_edit_job}, + FALSE, -1, refresh_job, create_model_job, admin_edit_job}, + {G_TYPE_STRING, SORTID_START, "Start", + FALSE, -1, refresh_job, create_model_job, admin_edit_job}, {G_TYPE_STRING, SORTID_ROTATE, "Rotate", - FALSE, 0, refresh_job, create_model_job, admin_edit_job}, + FALSE, -1, refresh_job, create_model_job, admin_edit_job}, {G_TYPE_STRING, SORTID_CONNECTION, "Connection", - FALSE, 0, refresh_job, create_model_job, admin_edit_job}, + FALSE, -1, refresh_job, create_model_job, admin_edit_job}, #endif {G_TYPE_INT, SORTID_UPDATED, NULL, FALSE, -1, refresh_job, create_model_job, admin_edit_job}, @@ -229,6 +274,10 @@ static display_data_t display_data_job[] = { static display_data_t options_data_job[] = { {G_TYPE_INT, SORTID_POS, NULL, FALSE, -1}, {G_TYPE_STRING, INFO_PAGE, "Full Info", TRUE, JOB_PAGE}, + {G_TYPE_STRING, JOB_PAGE, "Signal", TRUE, ADMIN_PAGE}, + {G_TYPE_STRING, JOB_PAGE, "Cancel", TRUE, ADMIN_PAGE}, + {G_TYPE_STRING, JOB_PAGE, "Suspend/Resume", TRUE, ADMIN_PAGE}, + {G_TYPE_STRING, JOB_PAGE, "Edit Job", TRUE, ADMIN_PAGE}, {G_TYPE_STRING, PART_PAGE, "Partition", TRUE, JOB_PAGE}, #ifdef HAVE_BG {G_TYPE_STRING, BLOCK_PAGE, "Block", TRUE, JOB_PAGE}, @@ -239,6 +288,40 @@ static display_data_t options_data_job[] = { {G_TYPE_NONE, -1, NULL, FALSE, -1} }; +struct signv { + char *name; + uint16_t val; +} sig_name_num[ ] = { + { "HUP", SIGHUP }, + { "INT", SIGINT }, + { "QUIT", SIGQUIT }, + { "ABRT", SIGABRT }, + { "KILL", SIGKILL }, + { "ALRM", SIGALRM }, + { "TERM", SIGTERM }, + { "USR1", SIGUSR1 }, + { "USR2", SIGUSR2 }, + { "CONT", SIGCONT }, + { "STOP", SIGSTOP }, + { "TSTP", SIGTSTP }, + { "TTIN", SIGTTIN }, + { "TTOU", SIGTTOU }, + { "SIGHUP", SIGHUP }, + { "SIGINT", SIGINT }, + { "SIGQUIT", SIGQUIT }, + { "SIGABRT", SIGABRT }, + { "SIGKILL", SIGKILL }, + { "SIGALRM", SIGALRM }, + { "SIGTERM", SIGTERM }, + { "SIGUSR1", SIGUSR1 }, + { "SIGUSR2", SIGUSR2 }, + { "SIGCONT", SIGCONT }, + { "SIGSTOP", SIGSTOP }, + { "SIGTSTP", SIGTSTP }, + { "SIGTTIN", SIGTTIN }, + { "SIGTTOU", SIGTTOU } +}; + static display_data_t *local_display_data = NULL; static void _update_info_step(sview_job_info_t *sview_job_info_ptr, @@ -247,6 +330,538 @@ static void _update_info_step(sview_job_info_t *sview_job_info_ptr, GtkTreeIter *iter); +/* translate name name to number */ +static uint16_t _xlate_signal_name(const char *signal_name) +{ + uint16_t sig_num; + char *end_ptr, *sig_names = NULL; + int i; + + sig_num = (uint16_t) strtol(signal_name, &end_ptr, 10); + if ((*end_ptr == '\0') || (sig_num != 0)) + return sig_num; + + for (i=0; i<SIZE(sig_name_num); i++) { + if (strcasecmp(sig_name_num[i].name, signal_name) == 0) { + xfree(sig_names); + return sig_name_num[i].val; + } + if (i == 0) + sig_names = xstrdup(sig_name_num[i].name); + else { + xstrcat(sig_names, ","); + xstrcat(sig_names, sig_name_num[i].name); + } + } + xfree(sig_names); + return (uint16_t)NO_VAL; +} + +static void _cancel_job_id (uint32_t job_id, uint16_t signal) +{ + int error_code = SLURM_SUCCESS, i; + char *temp = NULL; + + for (i=0; i<MAX_CANCEL_RETRY; i++) { + if ((signal == (uint16_t)-1) || (signal == SIGKILL)) { + signal = 9; + error_code = slurm_kill_job(job_id, SIGKILL, + false); + } else { + error_code = slurm_signal_job(job_id, signal); + } + if (error_code == 0 + || (errno != ESLURM_TRANSITION_STATE_NO_UPDATE + && errno != ESLURM_JOB_PENDING)) + break; + temp = g_strdup_printf("Sending signal %u to job %u", + signal, job_id); + display_edit_note(temp); + g_free(temp); + sleep ( 5 + i ); + } + if (error_code) { + error_code = slurm_get_errno(); + if ((error_code != ESLURM_ALREADY_DONE) && + (error_code != ESLURM_INVALID_JOB_ID)) { + temp = g_strdup_printf( + "Kill job error on job id %u: %s", + job_id, slurm_strerror(slurm_get_errno())); + display_edit_note(temp); + g_free(temp); + } else { + display_edit_note(slurm_strerror(slurm_get_errno())); + } + } else { + temp = g_strdup_printf("Signal successfully sent to job %u", + job_id); + display_edit_note(temp); + g_free(temp); + } +} + +static void _cancel_step_id(uint32_t job_id, uint32_t step_id, + uint16_t signal) +{ + int error_code = SLURM_SUCCESS, i; + char *temp = NULL; + + for (i=0; i<MAX_CANCEL_RETRY; i++) { + if (signal == (uint16_t)-1 || (signal == SIGKILL)) { + signal = 9; + error_code = slurm_terminate_job_step(job_id, step_id); + } else { + error_code = slurm_signal_job_step(job_id, step_id, + signal); + } + if (error_code == 0 + || (errno != ESLURM_TRANSITION_STATE_NO_UPDATE + && errno != ESLURM_JOB_PENDING)) + break; + temp = g_strdup_printf("Sending signal %u to job step %u.%u", + signal, job_id, step_id); + display_edit_note(temp); + g_free(temp); + sleep ( 5 + i ); + } + g_print("error is %d %d\n", error_code, errno); + if (error_code) { + error_code = slurm_get_errno(); + if (error_code != ESLURM_ALREADY_DONE) { + temp = g_strdup_printf( + "Kill job error on job step id %u.%u: %s", + job_id, step_id, + slurm_strerror(slurm_get_errno())); + display_edit_note(temp); + g_free(temp); + } else { + display_edit_note(slurm_strerror(slurm_get_errno())); + } + } else { + temp = g_strdup_printf( + "Signal successfully sent to job step %u.%u", + job_id, step_id); + display_edit_note(temp); + g_free(temp); + } +} + +static void _set_active_combo_job(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, "cancel")) + action = 1; + else if(!strcmp(temp_char, "suspend")) + action = 2; + else if(!strcmp(temp_char, "resume")) + action = 3; + else if(!strcmp(temp_char, "checkpoint")) + action = 4; + else if(!strcmp(temp_char, "requeue")) + action = 5; + else + action = 0; + + break; + case SORTID_SHARED: + if(!strcmp(temp_char, "yes")) + action = 0; + else if(!strcmp(temp_char, "no")) + action = 1; + else + action = 0; + + break; + case SORTID_CONTIGUOUS: + if(!strcmp(temp_char, "yes")) + action = 0; + else if(!strcmp(temp_char, "no")) + action = 1; + else + action = 0; + break; +#ifdef HAVE_BG + case SORTID_ROTATE: + if(!strcmp(temp_char, "yes")) + action = 0; + else if(!strcmp(temp_char, "no")) + action = 1; + else + action = 0; + break; + case SORTID_CONNECTION: + if(!strcmp(temp_char, "torus")) + action = 0; + else if(!strcmp(temp_char, "mesh")) + action = 1; + else if(!strcmp(temp_char, "nav")) + action = 2; + else + action = 0; + break; +#endif + default: + break; + } + g_free(temp_char); +end_it: + gtk_combo_box_set_active(combo, action); + +} + + +/* don't free this char */ +static const char *_set_job_msg(job_desc_msg_t *job_msg, const char *new_text, + int column) +{ + char *type = NULL; + int temp_int = 0; +#ifdef HAVE_BG + uint16_t rotate; + uint16_t conn_type; + char* token, *delimiter = ",x", *next_ptr; + int j; + uint16_t geo[SYSTEM_DIMENSIONS]; + char* geometry_tmp = xstrdup(new_text); + char* original_ptr = geometry_tmp; +#endif + if(!job_msg) + return NULL; + switch(column) { + case SORTID_TIMELIMIT: + if ((strcasecmp(new_text,"infinite") == 0)) + temp_int = INFINITE; + else + temp_int = strtol(new_text, (char **)NULL, 10); + + type = "timelimit"; + if(temp_int <= 0 && temp_int != INFINITE) + goto end_it; + job_msg->time_limit = (uint32_t)temp_int; + break; + case SORTID_PRIORITY: + temp_int = strtol(new_text, (char **)NULL, 10); + + type = "priority"; + if(temp_int < 0) + goto end_it; + job_msg->priority = (uint32_t)temp_int; + break; + case SORTID_NICE: + temp_int = strtol(new_text, (char **)NULL, 10); + type = "nice"; + if (abs(temp_int) > NICE_OFFSET) { + //error("Invalid nice value, must be between " + // "-%d and %d", NICE_OFFSET, NICE_OFFSET); + goto end_it; + } + job_msg->nice = NICE_OFFSET + temp_int; + + break; + case SORTID_REQ_PROCS: + temp_int = strtol(new_text, (char **)NULL, 10); + + type = "requested procs"; + if(temp_int <= 0) + goto end_it; + job_msg->num_procs = (uint32_t)temp_int; + break; + case SORTID_MIN_NODES: + temp_int = strtol(new_text, (char **)NULL, 10); + + type = "min nodes"; + if(temp_int <= 0) + goto end_it; + job_msg->min_nodes = (uint32_t)temp_int; + break; + case SORTID_MIN_PROCS: + temp_int = strtol(new_text, (char **)NULL, 10); + + type = "min procs"; + if(temp_int <= 0) + goto end_it; + job_msg->job_min_procs = (uint32_t)temp_int; + break; + case SORTID_MIN_MEM: + temp_int = strtol(new_text, (char **)NULL, 10); + + type = "min memory"; + if(temp_int <= 0) + goto end_it; + job_msg->job_min_memory = (uint32_t)temp_int; + break; + case SORTID_TMP_DISK: + temp_int = strtol(new_text, (char **)NULL, 10); + + type = "min tmp disk"; + if(temp_int <= 0) + goto end_it; + job_msg->job_min_tmp_disk = (uint32_t)temp_int; + break; + case SORTID_PARTITION: + job_msg->partition = xstrdup(new_text); + type = "partition"; + break; + case SORTID_NAME: + job_msg->name = xstrdup(new_text); + type = "name"; + break; + case SORTID_SHARED: + if (!strcasecmp(new_text, "yes")) { + job_msg->shared = 1; + + } else { + job_msg->shared = 0; + + } + type = "shared"; + break; + case SORTID_CONTIGUOUS: + if (!strcasecmp(new_text, "yes")) { + job_msg->contiguous = 1; + + } else { + job_msg->contiguous = 0; + + } + type = "contiguous"; + break; + case SORTID_REQ_NODELIST: + job_msg->req_nodes = xstrdup(new_text); + type = "requested nodelist"; + break; + case SORTID_FEATURES: + job_msg->features = xstrdup(new_text); + type = "features"; + break; + case SORTID_ACCOUNT: + job_msg->account = xstrdup(new_text); + type = "account"; + break; + case SORTID_DEPENDENCY: + temp_int = strtol(new_text, (char **)NULL, 10); + + type = "dependency"; + if(temp_int <= 0) + goto end_it; + job_msg->dependency = (uint32_t)temp_int; + break; +#ifdef HAVE_BG + case SORTID_GEOMETRY: + type = "geometry"; + token = strtok_r(geometry_tmp, delimiter, &next_ptr); + for (j=0; j<SYSTEM_DIMENSIONS; j++) + geo[j] = (uint16_t) NO_VAL; + for (j=0; j<SYSTEM_DIMENSIONS; j++) { + if (token == NULL) { + //error("insufficient dimensions in " + // "Geometry"); + goto end_it; + } + geo[j] = (uint16_t) atoi(token); + if (geo[j] <= 0) { + //error("invalid --geometry argument"); + xfree(original_ptr); + goto end_it; + break; + } + geometry_tmp = next_ptr; + token = strtok_r(geometry_tmp, delimiter, + &next_ptr); + } + if (token != NULL) { + //error("too many dimensions in Geometry"); + xfree(original_ptr); + goto end_it; + } + + select_g_set_jobinfo(job_msg->select_jobinfo, + SELECT_DATA_GEOMETRY, + (void *) &geo); + + break; + case SORTID_ROTATE: + type = "rotate"; + if (!strcasecmp(new_text, "yes")) { + rotate = 1; + + } else { + rotate = 0; + + } + if(!job_msg->select_jobinfo) + select_g_alloc_jobinfo(&job_msg->select_jobinfo); + select_g_set_jobinfo(job_msg->select_jobinfo, + SELECT_DATA_ROTATE, + (void *) &rotate); + break; + case SORTID_CONNECTION: + type = "connection"; + if (!strcasecmp(new_text, "torus")) { + conn_type = SELECT_TORUS; + } else if (!strcasecmp(new_text, "mesh")) { + conn_type = SELECT_MESH; + } else { + conn_type = SELECT_NAV; + } + if(!job_msg->select_jobinfo) + select_g_alloc_jobinfo(&job_msg->select_jobinfo); + select_g_set_jobinfo(job_msg->select_jobinfo, + SELECT_DATA_CONN_TYPE, + (void *) &conn_type); + + break; +#endif + case SORTID_START_TIME: + job_msg->begin_time = parse_time((char *)new_text); + type = "start time"; + break; + default: + type = "unknown"; + break; + } +end_it: + return type; +} + +static void _admin_edit_combo_box(GtkComboBox *combo, + job_desc_msg_t *job_msg) +{ + GtkTreeModel *model = NULL; + GtkTreeIter iter; + int column = 0; + char *name = NULL; + + if(!job_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_job_msg(job_msg, name, column); + + g_print("got here %d %s\n", column, name); + g_free(name); +} + +static gboolean _admin_focus_out_job(GtkEntry *entry, + GdkEventFocus *event, + job_desc_msg_t *job_msg) +{ + int type = gtk_entry_get_max_length(entry); + const char *name = gtk_entry_get_text(entry); + type -= DEFAULT_ENTRY_LENGTH; + _set_job_msg(job_msg, name, type); + g_print("got here %d %s\n", type, name); + + return false; +} + +static GtkWidget *_admin_full_edit_job(job_desc_msg_t *job_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_job[i].extra == 0) { + /* edittable items that can only be known + values */ + model2 = GTK_TREE_MODEL( + create_model_job(display_data_job[i].id)); + if(!model2) { + g_print("no model set up for %d(%s)\n", + display_data_job[i].id, + display_data_job[i].name); + continue; + } + entry = gtk_combo_box_new_with_model(model2); + g_object_unref(model2); + + _set_active_combo_job(GTK_COMBO_BOX(entry), model, + iter, display_data_job[i].id); + + g_signal_connect(entry, "changed", + G_CALLBACK(_admin_edit_combo_box), + job_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_job[i].extra == 1) { + /* other edittable items that are unknown */ + entry = gtk_entry_new(); + gtk_tree_model_get(model, iter, display_data_job[i].id, + &temp_char, -1); + gtk_entry_set_max_length(GTK_ENTRY(entry), + (DEFAULT_ENTRY_LENGTH+i)); + + 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_job), + job_msg); + } else /* others can't be altered by the user */ + continue; + label = gtk_label_new(display_data_job[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 int _nodes_in_list(char *node_list) { hostset_t host_set = hostset_create(node_list); @@ -300,6 +915,9 @@ static void _layout_job_record(GtkTreeView *treeview, 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)); @@ -326,17 +944,20 @@ static void _layout_job_record(GtkTreeView *treeview, nodes = sview_job_info_ptr->nodes; } add_display_treestore_line(update, treestore, &iter, - display_data_job[SORTID_TIME].name, + find_col_name(display_data_job, + SORTID_TIME), tmp_char); slurm_make_time_str((time_t *)&job_ptr->submit_time, tmp_char, sizeof(tmp_char)); add_display_treestore_line(update, treestore, &iter, - display_data_job[SORTID_SUBMIT_TIME].name, + find_col_name(display_data_job, + SORTID_SUBMIT_TIME), tmp_char); slurm_make_time_str((time_t *)&job_ptr->start_time, tmp_char, sizeof(tmp_char)); add_display_treestore_line(update, treestore, &iter, - display_data_job[SORTID_START_TIME].name, + find_col_name(display_data_job, + SORTID_START_TIME), tmp_char); if ((job_ptr->time_limit == INFINITE) && (job_ptr->end_time > time(NULL))) @@ -345,27 +966,39 @@ static void _layout_job_record(GtkTreeView *treeview, slurm_make_time_str((time_t *)&job_ptr->end_time, tmp_char, sizeof(tmp_char)); add_display_treestore_line(update, treestore, &iter, - display_data_job[SORTID_END_TIME].name, + find_col_name(display_data_job, + SORTID_END_TIME), tmp_char); snprint_time(tmp_char, sizeof(tmp_char), job_ptr->suspend_time); add_display_treestore_line(update, treestore, &iter, - display_data_job[SORTID_SUSPEND_TIME].name, + find_col_name(display_data_job, + SORTID_SUSPEND_TIME), tmp_char); - snprint_time(tmp_char, sizeof(tmp_char), job_ptr->time_limit); + + if (job_ptr->time_limit == INFINITE) + sprintf(tmp_char, "UNLIMITED"); + else if (job_ptr->time_limit == NO_VAL) + sprintf(tmp_char, "Partition Limit"); + else + snprint_time(tmp_char, sizeof(tmp_char), job_ptr->time_limit); add_display_treestore_line(update, treestore, &iter, - display_data_job[SORTID_TIMELIMIT].name, + find_col_name(display_data_job, + SORTID_TIMELIMIT), tmp_char); snprintf(tmp_char, sizeof(tmp_char), "%u", job_ptr->job_id); add_display_treestore_line(update, treestore, &iter, - display_data_job[SORTID_JOBID].name, + find_col_name(display_data_job, + SORTID_JOBID), tmp_char); add_display_treestore_line(update, treestore, &iter, - display_data_job[SORTID_PARTITION].name, + find_col_name(display_data_job, + SORTID_PARTITION), job_ptr->partition); #ifdef HAVE_BG add_display_treestore_line(update, treestore, &iter, - display_data_job[SORTID_BLOCK].name, + find_col_name(display_data_job, + SORTID_BLOCK), select_g_sprint_jobinfo( job_ptr->select_jobinfo, tmp_char, @@ -373,13 +1006,54 @@ static void _layout_job_record(GtkTreeView *treeview, SELECT_PRINT_BG_ID)); #endif add_display_treestore_line(update, treestore, &iter, - display_data_job[SORTID_USER].name, + find_col_name(display_data_job, + SORTID_USER), uid_to_string((uid_t)job_ptr->user_id)); + group_info = getgrgid((gid_t) job_ptr->group_id ); + if ( group_info && group_info->gr_name[ 0 ] ) { + snprintf(tmp_char, sizeof(tmp_char), "%s", + group_info->gr_name); + } else { + snprintf(tmp_char, sizeof(tmp_char), "%u", + job_ptr->group_id ); + } add_display_treestore_line(update, treestore, &iter, - display_data_job[SORTID_NAME].name, + find_col_name(display_data_job, + SORTID_GROUP), + tmp_char); + + add_display_treestore_line(update, treestore, &iter, + find_col_name(display_data_job, + SORTID_NAME), job_ptr->name); + + sprintf(tmp_char, "%u", job_ptr->priority); add_display_treestore_line(update, treestore, &iter, - display_data_job[SORTID_STATE].name, + find_col_name(display_data_job, + SORTID_PRIORITY), + tmp_char); + + if(job_ptr->batch_flag) + sprintf(tmp_char, "yes"); + else + sprintf(tmp_char, "no"); + add_display_treestore_line(update, treestore, &iter, + find_col_name(display_data_job, + SORTID_BATCH), + tmp_char); + + if (WIFSIGNALED(job_ptr->exit_code)) + term_sig = WTERMSIG(job_ptr->exit_code); + snprintf(tmp_char, sizeof(tmp_char), "%u:%u", + WEXITSTATUS(job_ptr->exit_code), term_sig); + add_display_treestore_line(update, treestore, &iter, + find_col_name(display_data_job, + SORTID_EXIT_CODE), + tmp_char); + + add_display_treestore_line(update, treestore, &iter, + find_col_name(display_data_job, + SORTID_STATE), job_state_string(job_ptr->job_state)); #ifdef HAVE_BG @@ -389,43 +1063,125 @@ static void _layout_job_record(GtkTreeView *treeview, sprintf(tmp_char, "%u", sview_job_info_ptr->node_cnt); #endif add_display_treestore_line(update, treestore, &iter, - display_data_job[SORTID_NODES].name, + find_col_name(display_data_job, + SORTID_NODES), tmp_char); convert_num_unit((float)job_ptr->num_procs, tmp_char, UNIT_NONE); add_display_treestore_line(update, treestore, &iter, - display_data_job[SORTID_NUM_PROCS].name, + find_col_name(display_data_job, + SORTID_NUM_PROCS), tmp_char); add_display_treestore_line(update, treestore, &iter, - display_data_job[SORTID_NODES].name, + find_col_name(display_data_job, + SORTID_NODES), tmp_char); + snprintf(tmp_char, sizeof(tmp_char), "%s:%u", + job_ptr->alloc_node, job_ptr->alloc_sid); add_display_treestore_line(update, treestore, &iter, - display_data_job[SORTID_ALLOC_NODE]. - name, job_ptr->alloc_node); + find_col_name(display_data_job, + SORTID_ALLOC_NODE), + tmp_char); add_display_treestore_line(update, treestore, &iter, - display_data_job[SORTID_REQ_NODELIST]. - name, job_ptr->req_nodes); + find_col_name(display_data_job, + SORTID_REQ_NODELIST), + job_ptr->req_nodes); add_display_treestore_line(update, treestore, &iter, - display_data_job[SORTID_EXC_NODELIST]. - name, job_ptr->exc_nodes); + find_col_name(display_data_job, + SORTID_EXC_NODELIST), + job_ptr->exc_nodes); if(job_ptr->contiguous) sprintf(tmp_char, "yes"); else sprintf(tmp_char, "no"); add_display_treestore_line(update, treestore, &iter, - display_data_job[SORTID_CONTIGUOUS]. - name, tmp_char); + find_col_name(display_data_job, + SORTID_CONTIGUOUS), + tmp_char); + if(job_ptr->shared) + sprintf(tmp_char, "yes"); + else + sprintf(tmp_char, "no"); + add_display_treestore_line(update, treestore, &iter, + find_col_name(display_data_job, + SORTID_SHARED), + tmp_char); + + convert_num_unit((float)job_ptr->cpus_per_task, tmp_char, UNIT_NONE); + add_display_treestore_line(update, treestore, &iter, + find_col_name(display_data_job, + SORTID_CPUS_PER_TASK), + tmp_char); - sprintf(tmp_char, "%u", job_ptr->priority); + convert_num_unit((float)job_ptr->job_min_procs, tmp_char, UNIT_NONE); + add_display_treestore_line(update, treestore, &iter, + find_col_name(display_data_job, + SORTID_MIN_PROCS), + tmp_char); + + convert_num_unit((float)job_ptr->job_min_sockets, tmp_char, UNIT_NONE); + add_display_treestore_line(update, treestore, &iter, + find_col_name(display_data_job, + SORTID_MIN_SOCKETS), + tmp_char); + + convert_num_unit((float)job_ptr->job_min_cores, tmp_char, UNIT_NONE); + add_display_treestore_line(update, treestore, &iter, + find_col_name(display_data_job, + SORTID_MIN_CORES), + tmp_char); + + convert_num_unit((float)job_ptr->job_min_threads, tmp_char, UNIT_NONE); + add_display_treestore_line(update, treestore, &iter, + find_col_name(display_data_job, + SORTID_MIN_THREADS), + tmp_char); + + convert_num_unit((float)job_ptr->job_min_memory, tmp_char, UNIT_NONE); + add_display_treestore_line(update, treestore, &iter, + find_col_name(display_data_job, + SORTID_MIN_MEM), + tmp_char); + + convert_num_unit((float)job_ptr->job_min_tmp_disk, + tmp_char, UNIT_NONE); + add_display_treestore_line(update, treestore, &iter, + find_col_name(display_data_job, + SORTID_TMP_DISK), + tmp_char); + add_display_treestore_line(update, treestore, &iter, - display_data_job[SORTID_PRIORITY]. - name, tmp_char); + find_col_name(display_data_job, + SORTID_FEATURES), + job_ptr->features); + + sprintf(tmp_char, "%u", job_ptr->dependency); + add_display_treestore_line(update, treestore, &iter, + find_col_name(display_data_job, + SORTID_DEPENDENCY), + tmp_char); + + add_display_treestore_line(update, treestore, &iter, + find_col_name(display_data_job, + SORTID_ACCOUNT), + job_ptr->account); + + add_display_treestore_line(update, treestore, &iter, + find_col_name(display_data_job, + SORTID_REASON), + job_reason_string(job_ptr->wait_reason)); add_display_treestore_line(update, treestore, &iter, - display_data_job[SORTID_COMMENT]. - name, job_ptr->comment); + find_col_name(display_data_job, + SORTID_NETWORK), + job_ptr->network); + + add_display_treestore_line(update, treestore, &iter, + find_col_name(display_data_job, + SORTID_COMMENT), + job_ptr->comment); } static void _update_job_record(sview_job_info_t *sview_job_info_ptr, @@ -438,7 +1194,9 @@ static void _update_job_record(sview_job_info_t *sview_job_info_ptr, GtkTreeIter step_iter; int childern = 0; job_info_t *job_ptr = sview_job_info_ptr->job_ptr; - + struct group *group_info = NULL; + uint16_t term_sig = 0; + gtk_tree_store_set(treestore, iter, SORTID_UPDATED, 1, -1); if(!job_ptr->nodes || !strcasecmp(job_ptr->nodes,"waiting...")) { sprintf(tmp_char,"0:00:00"); @@ -461,29 +1219,115 @@ static void _update_job_record(sview_job_info_t *sview_job_info_ptr, } gtk_tree_store_set(treestore, iter, SORTID_TIME, tmp_char, -1); + slurm_make_time_str((time_t *)&job_ptr->submit_time, tmp_char, + sizeof(tmp_char)); + gtk_tree_store_set(treestore, iter, + SORTID_SUBMIT_TIME, tmp_char, -1); + slurm_make_time_str((time_t *)&job_ptr->start_time, tmp_char, + sizeof(tmp_char)); + gtk_tree_store_set(treestore, iter, + SORTID_START_TIME, tmp_char, -1); + if ((job_ptr->time_limit == INFINITE) && + (job_ptr->end_time > time(NULL))) + sprintf(tmp_char, "NONE"); + else + slurm_make_time_str((time_t *)&job_ptr->end_time, tmp_char, + sizeof(tmp_char)); + gtk_tree_store_set(treestore, iter, + SORTID_END_TIME, tmp_char, -1); + slurm_make_time_str((time_t *)&job_ptr->suspend_time, tmp_char, + sizeof(tmp_char)); + gtk_tree_store_set(treestore, iter, + SORTID_SUSPEND_TIME, tmp_char, -1); + + if (job_ptr->time_limit == INFINITE) + sprintf(tmp_char, "UNLIMITED"); + else if (job_ptr->time_limit == NO_VAL) + sprintf(tmp_char, "Partition Limit"); + else + snprint_time(tmp_char, sizeof(tmp_char), job_ptr->time_limit); + gtk_tree_store_set(treestore, iter, + SORTID_TIMELIMIT, tmp_char, -1); gtk_tree_store_set(treestore, iter, SORTID_ALLOC, 1, -1); gtk_tree_store_set(treestore, iter, SORTID_JOBID, job_ptr->job_id, -1); gtk_tree_store_set(treestore, iter, - SORTID_PARTITION, job_ptr->partition, -1); -#ifdef HAVE_BG + SORTID_PARTITION, job_ptr->partition, -1); + snprintf(tmp_char, sizeof(tmp_char), "%s:%u", + job_ptr->alloc_node, job_ptr->alloc_sid); + gtk_tree_store_set(treestore, iter, + SORTID_ALLOC_NODE, tmp_char, -1); + +#ifdef HAVE_BG + gtk_tree_store_set(treestore, iter, + SORTID_BLOCK, + select_g_sprint_jobinfo( + job_ptr->select_jobinfo, + tmp_char, + sizeof(tmp_char), + SELECT_PRINT_BG_ID), -1); + + gtk_tree_store_set(treestore, iter, + SORTID_CONNECTION, + select_g_sprint_jobinfo( + job_ptr->select_jobinfo, + tmp_char, + sizeof(tmp_char), + SELECT_PRINT_CONNECTION), -1); + gtk_tree_store_set(treestore, iter, + SORTID_ROTATE, + select_g_sprint_jobinfo( + job_ptr->select_jobinfo, + tmp_char, + sizeof(tmp_char), + SELECT_PRINT_ROTATE), -1); + gtk_tree_store_set(treestore, iter, + SORTID_GEOMETRY, + select_g_sprint_jobinfo( + job_ptr->select_jobinfo, + tmp_char, + sizeof(tmp_char), + SELECT_PRINT_GEOMETRY), -1); + gtk_tree_store_set(treestore, iter, + SORTID_START, + select_g_sprint_jobinfo( + job_ptr->select_jobinfo, + tmp_char, + sizeof(tmp_char), + SELECT_PRINT_START), -1); gtk_tree_store_set(treestore, iter, - SORTID_BLOCK, + SORTID_MAX_PROCS, select_g_sprint_jobinfo( job_ptr->select_jobinfo, tmp_char, sizeof(tmp_char), - SELECT_PRINT_BG_ID), -1); + SELECT_PRINT_MAX_PROCS), -1); + #endif gtk_tree_store_set(treestore, iter, SORTID_USER, uid_to_string((uid_t)job_ptr->user_id), -1); + group_info = getgrgid((gid_t) job_ptr->group_id ); + if ( group_info && group_info->gr_name[ 0 ] ) { + snprintf(tmp_char, sizeof(tmp_char), "%s", + group_info->gr_name); + } else { + snprintf(tmp_char, sizeof(tmp_char), "%u", + job_ptr->group_id ); + } + gtk_tree_store_set(treestore, iter, + SORTID_GROUP, + tmp_char, -1); + gtk_tree_store_set(treestore, iter, SORTID_NAME, job_ptr->name, -1); gtk_tree_store_set(treestore, iter, SORTID_STATE, job_state_string(job_ptr->job_state), -1); + gtk_tree_store_set(treestore, iter, + SORTID_STATE_NUM, + job_ptr->job_state, -1); #ifdef HAVE_BG convert_num_unit((float)sview_job_info_ptr->node_cnt, @@ -499,6 +1343,102 @@ static void _update_job_record(sview_job_info_t *sview_job_info_ptr, SORTID_NUM_PROCS, tmp_char, -1); gtk_tree_store_set(treestore, iter, SORTID_NODELIST, nodes, -1); + gtk_tree_store_set(treestore, iter, SORTID_REQ_NODELIST, + job_ptr->req_nodes, -1); + gtk_tree_store_set(treestore, iter, SORTID_EXC_NODELIST, + job_ptr->exc_nodes, -1); + + if(job_ptr->contiguous) + sprintf(tmp_char, "yes"); + else + sprintf(tmp_char, "no"); + + gtk_tree_store_set(treestore, iter, + SORTID_CONTIGUOUS, tmp_char, -1); + if(job_ptr->shared) + sprintf(tmp_char, "yes"); + else + sprintf(tmp_char, "no"); + gtk_tree_store_set(treestore, iter, + SORTID_SHARED, tmp_char, -1); + + if(job_ptr->batch_flag) + sprintf(tmp_char, "yes"); + else + sprintf(tmp_char, "no"); + gtk_tree_store_set(treestore, iter, + SORTID_BATCH, tmp_char, -1); + + convert_num_unit((float)job_ptr->cpus_per_task, tmp_char, UNIT_NONE); + gtk_tree_store_set(treestore, iter, + SORTID_CPUS_PER_TASK, tmp_char, -1); + + convert_num_unit((float)job_ptr->job_min_procs, tmp_char, UNIT_NONE); + gtk_tree_store_set(treestore, iter, + SORTID_REQ_PROCS, tmp_char, -1); + + convert_num_unit((float)job_ptr->min_sockets, tmp_char, UNIT_NONE); + gtk_tree_store_set(treestore, iter, + SORTID_MIN_SOCKETS, tmp_char, -1); + convert_num_unit((float)job_ptr->max_sockets, tmp_char, UNIT_NONE); + gtk_tree_store_set(treestore, iter, + SORTID_MAX_SOCKETS, tmp_char, -1); + + convert_num_unit((float)job_ptr->min_cores, tmp_char, UNIT_NONE); + gtk_tree_store_set(treestore, iter, + SORTID_MIN_CORES, tmp_char, -1); + convert_num_unit((float)job_ptr->max_cores, tmp_char, UNIT_NONE); + gtk_tree_store_set(treestore, iter, + SORTID_MAX_CORES, tmp_char, -1); + + convert_num_unit((float)job_ptr->min_threads, tmp_char, UNIT_NONE); + gtk_tree_store_set(treestore, iter, + SORTID_MIN_THREADS, tmp_char, -1); + convert_num_unit((float)job_ptr->max_threads, tmp_char, UNIT_NONE); + gtk_tree_store_set(treestore, iter, + SORTID_MAX_THREADS, tmp_char, -1); + + convert_num_unit((float)job_ptr->job_min_memory, tmp_char, UNIT_NONE); + gtk_tree_store_set(treestore, iter, + SORTID_MIN_MEM, tmp_char, -1); + convert_num_unit((float)job_ptr->job_max_memory, tmp_char, UNIT_NONE); + gtk_tree_store_set(treestore, iter, + SORTID_MAX_MEM, tmp_char, -1); + + convert_num_unit((float)job_ptr->job_min_tmp_disk, + tmp_char, UNIT_NONE); + gtk_tree_store_set(treestore, iter, + SORTID_TMP_DISK, tmp_char, -1); + + gtk_tree_store_set(treestore, iter, + SORTID_ACCOUNT, job_ptr->account, -1); + + sprintf(tmp_char, "%u", job_ptr->dependency); + gtk_tree_store_set(treestore, iter, + SORTID_DEPENDENCY, tmp_char, -1); + + sprintf(tmp_char, "%u", job_ptr->priority); + gtk_tree_store_set(treestore, iter, + SORTID_PRIORITY, tmp_char, -1); + + if(WIFSIGNALED(job_ptr->exit_code)) + term_sig = WTERMSIG(job_ptr->exit_code); + snprintf(tmp_char, sizeof(tmp_char), "%u:%u", + WEXITSTATUS(job_ptr->exit_code), term_sig); + gtk_tree_store_set(treestore, iter, + SORTID_EXIT_CODE, tmp_char, -1); + + + gtk_tree_store_set(treestore, iter, + SORTID_FEATURES, job_ptr->features, -1); + gtk_tree_store_set(treestore, iter, + SORTID_REASON, + job_reason_string(job_ptr->wait_reason), -1); + gtk_tree_store_set(treestore, iter, + SORTID_NETWORK, job_ptr->network, -1); + gtk_tree_store_set(treestore, iter, + SORTID_COMMENT, job_ptr->comment, -1); + childern = gtk_tree_model_iter_children(GTK_TREE_MODEL(treestore), &step_iter, iter); @@ -545,31 +1485,36 @@ static void _layout_step_record(GtkTreeView *treeview, tmp_char, UNIT_NONE); #endif add_display_treestore_line(update, treestore, &iter, - display_data_job[SORTID_NODES]. - name, tmp_char); + find_col_name(display_data_job, + SORTID_NODES), + tmp_char); state = JOB_RUNNING; } add_display_treestore_line(update, treestore, &iter, - display_data_job[SORTID_STATE].name, + find_col_name(display_data_job, + SORTID_STATE), job_state_string(state)); add_display_treestore_line(update, treestore, &iter, - display_data_job[SORTID_TIME].name, + find_col_name(display_data_job, + SORTID_TIME), tmp_time); - + snprintf(tmp_char, sizeof(tmp_char), "%u.%u", step_ptr->job_id, step_ptr->step_id); add_display_treestore_line(update, treestore, &iter, - display_data_job[SORTID_JOBID].name, + find_col_name(display_data_job, + SORTID_JOBID), tmp_char); add_display_treestore_line(update, treestore, &iter, - display_data_job[SORTID_PARTITION].name, + find_col_name(display_data_job, + SORTID_PARTITION), step_ptr->partition); /* #ifdef HAVE_BG */ /* add_display_treestore_line(update, treestore, &iter, */ -/* display_data_job[SORTID_BLOCK].name, */ +/* find_col_name(display_data_job, SORTID_BLOCK), */ /* select_g_sprint_jobinfo( */ /* step_ptr->select_jobinfo, */ /* tmp_char, */ @@ -577,24 +1522,29 @@ static void _layout_step_record(GtkTreeView *treeview, /* SELECT_PRINT_BG_ID)); */ /* #endif */ add_display_treestore_line(update, treestore, &iter, - display_data_job[SORTID_USER].name, + find_col_name(display_data_job, + SORTID_USER), uid_to_string((uid_t)step_ptr->user_id)); add_display_treestore_line(update, treestore, &iter, - display_data_job[SORTID_NAME].name, + find_col_name(display_data_job, + SORTID_NAME), step_ptr->name); convert_num_unit((float)step_ptr->num_tasks, tmp_char, UNIT_NONE); add_display_treestore_line(update, treestore, &iter, - display_data_job[SORTID_TASKS].name, + find_col_name(display_data_job, + SORTID_TASKS), tmp_char); add_display_treestore_line(update, treestore, &iter, - display_data_job[SORTID_NUM_PROCS].name, + find_col_name(display_data_job, + SORTID_NUM_PROCS), tmp_char); add_display_treestore_line(update, treestore, &iter, - display_data_job[SORTID_NODELIST]. - name, nodes); + find_col_name(display_data_job, + SORTID_NODELIST), + nodes); } static void _update_step_record(job_step_info_t *step_ptr, @@ -870,7 +1820,10 @@ static List _create_job_info_list(job_info_msg_t *job_info_ptr, uint16_t nodecard = (uint16_t) NO_VAL; char tmp_char[50]; #endif - + +#ifdef HAVE_FRONT_END + int count = 0; +#endif if(!changed && info_list) { goto update_color; } @@ -920,15 +1873,36 @@ static List _create_job_info_list(job_info_msg_t *job_info_ptr, if(!sview_job_info_ptr->node_cnt) sview_job_info_ptr->node_cnt = _get_node_cnt(job_ptr); - + +#ifdef HAVE_FRONT_END + /* set this up to copy it if we are on a front end + system */ + count = 0; + while(job_ptr->node_inx[count] != -1) + count++; +#endif + for(j = 0; j < step_info_ptr->job_step_count; j++) { step_ptr = &(step_info_ptr->job_steps[j]); -#ifdef HAVE_BG - xfree(step_ptr->nodes); - step_ptr->nodes = xstrdup(sview_job_info_ptr->nodes); - step_ptr->num_tasks = sview_job_info_ptr->node_cnt; -#endif if(step_ptr->job_id == job_ptr->job_id) { +#ifdef HAVE_FRONT_END + /* On front end systems the steps are only + * given the first node to run off of + * so we need to make them appear like + * they are running on the entire + * space (which they really are). + */ + xfree(step_ptr->nodes); + step_ptr->nodes = + xstrdup(sview_job_info_ptr->nodes); + step_ptr->num_tasks = + sview_job_info_ptr->node_cnt; + xfree(step_ptr->node_inx); + step_ptr->node_inx = + xmalloc(sizeof(int) * count); + memcpy(step_ptr->node_inx, job_ptr->node_inx, + sizeof(int) * count); +#endif list_push(sview_job_info_ptr->step_list, step_ptr); } @@ -1066,7 +2040,8 @@ need_refresh: 1, GTK_TREE_STORE(model), &iter, - display_data_job[SORTID_STATE].name, + find_col_name(display_data_job, + SORTID_STATE), job_state_string(JOB_COMPLETE)); } popup_win->not_found = true; @@ -1172,25 +2147,35 @@ extern GtkListStore *create_model_job(int type) switch(type) { case SORTID_ACTION: - model = gtk_list_store_new(1, G_TYPE_STRING); + 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, "cancel", -1); gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, + 1, SORTID_ACTION, 0, "suspend", -1); gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, + 1, SORTID_ACTION, 0, "resume", -1); gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, + 1, SORTID_ACTION, 0, "checkpoint", -1); gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, + 1, SORTID_ACTION, 0, "requeue", -1); break; @@ -1215,25 +2200,29 @@ extern GtkListStore *create_model_job(int type) case SORTID_NAME: break; case SORTID_SHARED: - model = gtk_list_store_new(1, G_TYPE_STRING); + model = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_INT); gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, "yes", + 1, SORTID_SHARED, -1); gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, "no", + 1, SORTID_SHARED, -1); break; case SORTID_CONTIGUOUS: - model = gtk_list_store_new(1, G_TYPE_STRING); + model = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_INT); gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, "yes", + 1, SORTID_CONTIGUOUS, -1); gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, "no", + 1, SORTID_CONTIGUOUS, -1); break; case SORTID_REQ_NODELIST: @@ -1248,29 +2237,36 @@ extern GtkListStore *create_model_job(int type) case SORTID_GEOMETRY: break; case SORTID_ROTATE: - model = gtk_list_store_new(1, G_TYPE_STRING); + g_print("got here rotate\n"); + model = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_INT); gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, "yes", + 1, SORTID_ROTATE, -1); gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, "no", + 1, SORTID_ROTATE, -1); break; case SORTID_CONNECTION: - model = gtk_list_store_new(1, G_TYPE_STRING); + g_print("got here connection\n"); + model = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_INT); gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, "torus", + 1, SORTID_CONNECTION, -1); gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, "mesh", + 1, SORTID_CONNECTION, -1); gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, "nav", + 1, SORTID_CONNECTION, -1); break; #endif @@ -1291,32 +2287,23 @@ extern void admin_edit_job(GtkCellRendererText *cell, GtkTreeStore *treestore = GTK_TREE_STORE(data); GtkTreePath *path = gtk_tree_path_new_from_string(path_string); GtkTreeIter iter; - job_desc_msg_t job_msg; + job_desc_msg_t *job_msg = xmalloc(sizeof(job_desc_msg_t)); char *temp = NULL; char *old_text = NULL; - char *type = NULL; + const char *type = NULL; int stepid = NO_VAL; int column = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(cell), "column")); -#ifdef HAVE_BG - uint16_t rotate; - uint16_t conn_type; - char* token, *delimiter = ",x", *next_ptr; - int j; - uint16_t geo[SYSTEM_DIMENSIONS]; - char* geometry_tmp = xstrdup(new_text); - char* original_ptr = geometry_tmp; -#endif if(!new_text || !strcmp(new_text, "")) goto no_input; gtk_tree_model_get_iter(GTK_TREE_MODEL(treestore), &iter, path); - slurm_init_job_desc_msg (&job_msg); + slurm_init_job_desc_msg(job_msg); gtk_tree_model_get(GTK_TREE_MODEL(treestore), &iter, - SORTID_JOBID, &job_msg.job_id, + SORTID_JOBID, &job_msg->job_id, column, &old_text, -1); gtk_tree_model_get(GTK_TREE_MODEL(treestore), &iter, @@ -1324,215 +2311,24 @@ extern void admin_edit_job(GtkCellRendererText *cell, if(stepid) stepid = NO_VAL; else { - stepid = job_msg.job_id; + stepid = job_msg->job_id; gtk_tree_model_get(GTK_TREE_MODEL(treestore), &iter, - SORTID_POS, &job_msg.job_id, -1); + SORTID_POS, &job_msg->job_id, -1); } - switch(column) { - case SORTID_TIMELIMIT: - if ((strcasecmp(new_text,"infinite") == 0)) - job_msg.time_limit = INFINITE; - else - job_msg.time_limit = - (uint32_t)strtol(new_text, (char **)NULL, 10); - temp = (char *)new_text; - type = "timelimit"; - if((int32_t)job_msg.time_limit <= 0 - && job_msg.time_limit != INFINITE) - goto print_error; - break; - case SORTID_PRIORITY: - job_msg.priority = - (uint32_t)strtol(new_text, (char **)NULL, 10); - temp = (char *)new_text; - type = "priority"; - if((int32_t)job_msg.priority < 0) - goto print_error; - break; - case SORTID_NICE: - job_msg.nice = (uint32_t)strtol(new_text, (char **)NULL, 10); - if (abs(job_msg.nice) > NICE_OFFSET) { - //error("Invalid nice value, must be between " - // "-%d and %d", NICE_OFFSET, NICE_OFFSET); - goto print_error; - } - job_msg.nice += NICE_OFFSET; - temp = (char *)new_text; - type = "nice"; - break; - case SORTID_REQ_PROCS: - job_msg.num_procs = - (uint32_t)strtol(new_text, (char **)NULL, 10); - temp = (char *)new_text; - type = "requested procs"; - if((int32_t)job_msg.num_procs <= 0) - goto print_error; - break; - case SORTID_MIN_NODES: - job_msg.min_nodes = - (uint32_t)strtol(new_text, (char **)NULL, 10); - temp = (char *)new_text; - type = "min nodes"; - if((int32_t)job_msg.min_nodes <= 0) - goto print_error; - break; - case SORTID_MIN_PROCS: - job_msg.job_min_procs = - (uint32_t)strtol(new_text, (char **)NULL, 10); - temp = (char *)new_text; - type = "min procs"; - if((int32_t)job_msg.job_min_procs <= 0) - goto print_error; - break; - case SORTID_MIN_MEM: - job_msg.job_min_memory = - (uint32_t)strtol(new_text, (char **)NULL, 10); - temp = (char *)new_text; - type = "min memory"; - if((int32_t)job_msg.job_min_memory <= 0) - goto print_error; - break; - case SORTID_TMP_DISK: - job_msg.job_min_tmp_disk = - (uint32_t)strtol(new_text, (char **)NULL, 10); - temp = (char *)new_text; - type = "min tmp disk"; - if((int32_t)job_msg.job_min_tmp_disk <= 0) - goto print_error; - break; - case SORTID_PARTITION: - temp = (char *)new_text; - job_msg.partition = temp; - type = "partition"; - break; - case SORTID_NAME: - temp = (char *)new_text; - job_msg.name = temp; - type = "name"; - break; - case SORTID_SHARED: - if (!strcasecmp(new_text, "yes")) { - job_msg.shared = 1; - temp = "*"; - } else { - job_msg.shared = 0; - temp = ""; - } - type = "shared"; - break; - case SORTID_CONTIGUOUS: - if (!strcasecmp(new_text, "yes")) { - job_msg.contiguous = 1; - temp = "*"; - } else { - job_msg.contiguous = 0; - temp = ""; - } - type = "contiguous"; - break; - case SORTID_REQ_NODELIST: - temp = (char *)new_text; - job_msg.req_nodes = temp; - type = "requested nodelist"; - break; - case SORTID_FEATURES: - temp = (char *)new_text; - job_msg.features = temp; - type = "features"; - break; - case SORTID_ACCOUNT: - temp = (char *)new_text; - job_msg.account = temp; - type = "account"; - break; - case SORTID_DEPENDENCY: - job_msg.dependency = - (uint32_t)strtol(new_text, (char **)NULL, 10); - temp = (char *)new_text; - type = "dependency"; - if((int32_t)job_msg.dependency <= 0) - goto print_error; - break; -#ifdef HAVE_BG - case SORTID_GEOMETRY: - token = strtok_r(geometry_tmp, delimiter, &next_ptr); - for (j=0; j<SYSTEM_DIMENSIONS; j++) - geo[j] = (uint16_t) NO_VAL; - for (j=0; j<SYSTEM_DIMENSIONS; j++) { - if (token == NULL) { - //error("insufficient dimensions in " - // "Geometry"); - goto print_error; - } - geo[j] = (uint16_t) atoi(token); - if (geo[j] <= 0) { - //error("invalid --geometry argument"); - xfree(original_ptr); - goto print_error; - break; - } - geometry_tmp = next_ptr; - token = strtok_r(geometry_tmp, delimiter, - &next_ptr); - } - if (token != NULL) { - //error("too many dimensions in Geometry"); - xfree(original_ptr); - goto print_error; - } - - select_g_set_jobinfo(job_msg.select_jobinfo, - SELECT_DATA_GEOMETRY, - (void *) &geo); - temp = (char *)new_text; - type = "geometry"; - break; - case SORTID_ROTATE: - if (!strcasecmp(new_text, "yes")) { - rotate = 1; - temp = "*"; - } else { - rotate = 0; - temp = ""; - } - select_g_set_jobinfo(job_msg.select_jobinfo, - SELECT_DATA_ROTATE, - (void *) &rotate); - temp = (char *)new_text; - type = "rotate"; - break; - case SORTID_CONNECTION: - if (!strcasecmp(new_text, "torus")) { - conn_type = SELECT_TORUS; - } else if (!strcasecmp(new_text, "mesh")) { - conn_type = SELECT_MESH; - } else { - conn_type = SELECT_NAV; - } - select_g_set_jobinfo(job_msg.select_jobinfo, - SELECT_DATA_CONN_TYPE, - (void *) &conn_type); - temp = (char *)new_text; - type = "connection"; - break; -#endif - case SORTID_START_TIME: - temp = (char *)new_text; - job_msg.begin_time = parse_time(temp); - type = "start time"; - break; - default: - break; - } + type = _set_job_msg(job_msg, new_text, column); + if(errno) + goto print_error; + temp = (char *)new_text; + if(old_text && !strcmp(old_text, new_text)) { temp = g_strdup_printf("No change in value."); display_edit_note(temp); g_free(temp); - } else if(slurm_update_job(&job_msg) == SLURM_SUCCESS) { + } else if(slurm_update_job(job_msg) == SLURM_SUCCESS) { gtk_tree_store_set(treestore, &iter, column, temp, -1); temp = g_strdup_printf("Job %d %s changed to %s", - job_msg.job_id, + job_msg->job_id, type, new_text); display_edit_note(temp); @@ -1541,7 +2337,7 @@ extern void admin_edit_job(GtkCellRendererText *cell, print_error: temp = g_strdup_printf("Job %d %s can't be " "set to %s", - job_msg.job_id, + job_msg->job_id, type, new_text); display_edit_note(temp); @@ -1549,6 +2345,8 @@ extern void admin_edit_job(GtkCellRendererText *cell, } no_input: + slurm_free_job_desc_msg(job_msg); + gtk_tree_path_free (path); g_free(old_text); g_static_mutex_unlock(&sview_mutex); @@ -1940,7 +2738,7 @@ extern void set_menus_job(void *arg, GtkTreePath *path, popup_info_t *popup_win = (popup_info_t *)arg; switch(type) { case TAB_CLICKED: - make_fields_menu(menu, display_data_job); + make_fields_menu(menu, display_data_job, SORTID_CNT); break; case ROW_CLICKED: make_options_menu(tree_view, path, menu, options_data_job); @@ -2076,3 +2874,160 @@ extern void popup_all_job(GtkTreeModel *model, GtkTreeIter *iter, int id) return; } } + +extern void admin_job(GtkTreeModel *model, GtkTreeIter *iter, char *type) +{ + int jobid = NO_VAL; + int stepid = NO_VAL; + int state = 0; + int response = 0; + char tmp_char[255]; + char *tmp_char_ptr = NULL; + int edit_type = 0; + uint16_t signal = SIGKILL; + job_desc_msg_t *job_msg = xmalloc(sizeof(job_desc_msg_t)); + + 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, + GTK_STOCK_OK, + GTK_RESPONSE_OK, + GTK_STOCK_CANCEL, + GTK_RESPONSE_CANCEL, + NULL); + gtk_window_set_transient_for(GTK_WINDOW(popup), NULL); + + gtk_tree_model_get(model, iter, SORTID_JOBID, &jobid, -1); + gtk_tree_model_get(model, iter, SORTID_ALLOC, &stepid, -1); + if(stepid) + stepid = NO_VAL; + else { + stepid = jobid; + gtk_tree_model_get(model, iter, SORTID_POS, &jobid, -1); + } + + if(!strcmp("Signal", type)) { + entry = gtk_entry_new(); + label = gtk_label_new("Signal?"); + edit_type = EDIT_SIGNAL; + } else if(!strcmp("Cancel", type)) { + if(stepid != NO_VAL) + snprintf(tmp_char, sizeof(tmp_char), + "Are you sure you want to cancel job %u.%u?", + jobid, stepid); + else + snprintf(tmp_char, sizeof(tmp_char), + "Are you sure you want to cancel job %u?", + jobid); + label = gtk_label_new(tmp_char); + edit_type = EDIT_CANCEL; + } else if(!strcmp("Suspend/Resume", type)) { + gtk_tree_model_get(model, iter, SORTID_STATE_NUM, &state, -1); + if(state == JOB_SUSPENDED) + tmp_char_ptr = "resume"; + else + tmp_char_ptr = "suspend"; + + if(stepid != NO_VAL) + snprintf(tmp_char, sizeof(tmp_char), + "Are you sure you want to %s job %u.%u?", + tmp_char_ptr, jobid, stepid); + else + snprintf(tmp_char, sizeof(tmp_char), + "Are you sure you want to %s job %u?", + tmp_char_ptr, jobid); + label = gtk_label_new(tmp_char); + edit_type = EDIT_SUSPEND; + } else { + gtk_window_set_default_size(GTK_WINDOW(popup), 200, 400); + snprintf(tmp_char, sizeof(tmp_char), + "Editing job %u think before you type", + jobid); + label = gtk_label_new(tmp_char); + edit_type = EDIT_EDIT; + slurm_init_job_desc_msg(job_msg); + job_msg->job_id = jobid; + entry = _admin_full_edit_job(job_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)); + if (response == GTK_RESPONSE_OK) { + switch(edit_type) { + case EDIT_SIGNAL: + signal = _xlate_signal_name( + gtk_entry_get_text(GTK_ENTRY(entry))); + if(signal == (uint16_t)NO_VAL) { + tmp_char_ptr = g_strdup_printf( + "%s is not a valid signal.", + gtk_entry_get_text(GTK_ENTRY(entry))); + display_edit_note(tmp_char_ptr); + g_free(tmp_char_ptr); + break; + } + + /* fall through to the cancel now the signal + * is set (Default is SIGKILL from above for + * just a regular cancel). + */ + case EDIT_CANCEL: + if(stepid == NO_VAL) + _cancel_job_id(jobid, signal); + else + _cancel_step_id(jobid, stepid, signal); + + break; + case EDIT_SUSPEND: + if(state == JOB_SUSPENDED) + response = slurm_resume(jobid); + else + response = slurm_suspend(jobid); + if(response) { + tmp_char_ptr = g_strdup_printf( + "Error happened trying to %s job %u.", + tmp_char_ptr, jobid); + display_edit_note(tmp_char_ptr); + g_free(tmp_char_ptr); + + } else { + if(state == JOB_SUSPENDED) + tmp_char_ptr = "resumed"; + else + tmp_char_ptr = "suspended"; + tmp_char_ptr = g_strdup_printf( + "Job %s %u successfully.", + tmp_char_ptr, jobid); + display_edit_note(tmp_char_ptr); + g_free(tmp_char_ptr); + } + break; + case EDIT_EDIT: + if(slurm_update_job(job_msg) == SLURM_SUCCESS) { + tmp_char_ptr = g_strdup_printf( + "Job %u editted successfully", + jobid); + } else { + tmp_char_ptr = g_strdup_printf( + "Problem editting Job %u.", + jobid); + } + display_edit_note(tmp_char_ptr); + g_free(tmp_char_ptr); + break; + default: + break; + } + } + slurm_free_job_desc_msg(job_msg); + gtk_widget_destroy(popup); + return; +} + diff --git a/src/sview/node_info.c b/src/sview/node_info.c index 1b828869de3..fc818102140 100644 --- a/src/sview/node_info.c +++ b/src/sview/node_info.c @@ -30,18 +30,19 @@ #define _DEBUG 0 +/* These need to be in alpha order (except POS and CNT) */ enum { SORTID_POS = POS_LOC, - SORTID_NAME, - SORTID_STATE, - SORTID_STATE_NUM, SORTID_CPUS, - SORTID_MEMORY, SORTID_DISK, - SORTID_WEIGHT, SORTID_FEATURES, + SORTID_MEMORY, + SORTID_NAME, SORTID_REASON, + SORTID_STATE, + SORTID_STATE_NUM, SORTID_UPDATED, + SORTID_WEIGHT, SORTID_CNT }; @@ -74,6 +75,7 @@ static display_data_t display_data_node[] = { static display_data_t options_data_node[] = { {G_TYPE_INT, SORTID_POS, NULL, FALSE, -1}, {G_TYPE_STRING, INFO_PAGE, "Full Info", TRUE, NODE_PAGE}, + {G_TYPE_STRING, NODE_PAGE, "Edit Node", TRUE, ADMIN_PAGE}, {G_TYPE_STRING, JOB_PAGE, "Jobs", TRUE, NODE_PAGE}, #ifdef HAVE_BG {G_TYPE_STRING, BLOCK_PAGE, "Blocks", TRUE, NODE_PAGE}, @@ -98,39 +100,47 @@ static void _layout_node_record(GtkTreeView *treeview, return; add_display_treestore_line(update, treestore, &iter, - display_data_node[SORTID_NAME].name, + find_col_name(display_data_node, + SORTID_NAME), node_ptr->name); upper = node_state_string(node_ptr->node_state); lower = str_tolower(upper); add_display_treestore_line(update, treestore, &iter, - display_data_node[SORTID_STATE].name, + find_col_name(display_data_node, + SORTID_STATE), lower); xfree(lower); convert_num_unit((float)node_ptr->cpus, tmp_cnt, UNIT_MEGA); add_display_treestore_line(update, treestore, &iter, - display_data_node[SORTID_CPUS].name, + find_col_name(display_data_node, + SORTID_CPUS), tmp_cnt); convert_num_unit((float)node_ptr->real_memory, tmp_cnt, UNIT_MEGA); add_display_treestore_line(update, treestore, &iter, - display_data_node[SORTID_MEMORY].name, + find_col_name(display_data_node, + SORTID_MEMORY), tmp_cnt); convert_num_unit((float)node_ptr->tmp_disk, tmp_cnt, UNIT_MEGA); add_display_treestore_line(update, treestore, &iter, - display_data_node[SORTID_DISK].name, + find_col_name(display_data_node, + SORTID_DISK), tmp_cnt); snprintf(tmp_cnt, sizeof(tmp_cnt), "%u", node_ptr->weight); add_display_treestore_line(update, treestore, &iter, - display_data_node[SORTID_WEIGHT].name, + find_col_name(display_data_node, + SORTID_WEIGHT), tmp_cnt); add_display_treestore_line(update, treestore, &iter, - display_data_node[SORTID_FEATURES].name, + find_col_name(display_data_node, + SORTID_FEATURES), node_ptr->features); add_display_treestore_line(update, treestore, &iter, - display_data_node[SORTID_REASON].name, + find_col_name(display_data_node, + SORTID_REASON), node_ptr->reason); return; } @@ -740,9 +750,9 @@ display_it: while ((sview_node_info_ptr = list_next(itr))) { int found = 0; char *host = NULL; - i++; node_ptr = sview_node_info_ptr->node_ptr; + switch(search_info->search_type) { case SEARCH_NODE_STATE: if(search_info->int_data == NO_VAL) @@ -766,6 +776,7 @@ display_it: continue; /* no break here we want to continue to look for the name */ + case SEARCH_NODE_NAME: default: if(!search_info->gchar_data) continue; @@ -783,16 +794,14 @@ display_it: continue; break; } - - - + list_push(send_info_list, sview_node_info_ptr); #ifdef HAVE_BG change_grid_color(popup_win->grid_button_list, - i, i, i); + i, i, 0); #else get_button_list_from_main(&popup_win->grid_button_list, - i, i, i); + i, i, 0); #endif } list_iterator_destroy(itr); @@ -824,7 +833,7 @@ extern void set_menus_node(void *arg, GtkTreePath *path, popup_info_t *popup_win = (popup_info_t *)arg; switch(type) { case TAB_CLICKED: - make_fields_menu(menu, display_data_node); + make_fields_menu(menu, display_data_node, SORTID_CNT); break; case ROW_CLICKED: make_options_menu(tree_view, path, menu, options_data_node); @@ -899,3 +908,9 @@ extern void popup_all_node(GtkTreeModel *model, GtkTreeIter *iter, int id) gtk_window_present(GTK_WINDOW(popup_win->popup)); } } + +extern void admin_node(GtkTreeModel *model, GtkTreeIter *iter, char *type) +{ + return; +} + diff --git a/src/sview/part_info.c b/src/sview/part_info.c index 6d5ac4021d5..70276277241 100644 --- a/src/sview/part_info.c +++ b/src/sview/part_info.c @@ -63,26 +63,26 @@ typedef struct { enum { SORTID_POS = POS_LOC, - SORTID_NAME, + SORTID_AVAIL, + SORTID_CPUS, SORTID_DEFAULT, + SORTID_GROUPS, SORTID_HIDDEN, - SORTID_AVAIL, - SORTID_TIMELIMIT, - SORTID_NODES, - SORTID_STATE, - SORTID_NODELIST, SORTID_JOB_SIZE, - SORTID_MIN_NODES, SORTID_MAX_NODES, + SORTID_MEM, + SORTID_MIN_NODES, + SORTID_NAME, + SORTID_NODELIST, + SORTID_NODES, SORTID_ROOT, SORTID_SHARE, - SORTID_GROUPS, - SORTID_CPUS, - SORTID_DISK, - SORTID_MEM, - SORTID_WEIGHT, + SORTID_STATE, SORTID_STATE_NUM, + SORTID_TMP_DISK, + SORTID_TIMELIMIT, SORTID_UPDATED, + SORTID_WEIGHT, SORTID_CNT }; @@ -123,9 +123,9 @@ static display_data_t display_data_part[] = { create_model_part, admin_edit_part}, {G_TYPE_STRING, SORTID_CPUS, "CPUs", FALSE, -1, refresh_part, create_model_part, admin_edit_part}, - {G_TYPE_STRING, SORTID_DISK, "Temp Disk", FALSE, -1, refresh_part, + {G_TYPE_STRING, SORTID_TMP_DISK, "Temp Disk", FALSE, -1, refresh_part, create_model_part, admin_edit_part}, - {G_TYPE_STRING, SORTID_MEM, "MEM", FALSE, -1, refresh_part, + {G_TYPE_STRING, SORTID_MEM, "Memory", FALSE, -1, refresh_part, create_model_part, admin_edit_part}, {G_TYPE_STRING, SORTID_WEIGHT, "Weight", FALSE, -1, refresh_part, create_model_part, admin_edit_part}, @@ -140,6 +140,8 @@ static display_data_t display_data_part[] = { static display_data_t options_data_part[] = { {G_TYPE_INT, SORTID_POS, NULL, FALSE, -1}, {G_TYPE_STRING, INFO_PAGE, "Full Info", TRUE, PART_PAGE}, + {G_TYPE_STRING, PART_PAGE, "Drain", TRUE, ADMIN_PAGE}, + {G_TYPE_STRING, PART_PAGE, "Edit Part", TRUE, ADMIN_PAGE}, {G_TYPE_STRING, JOB_PAGE, "Jobs", TRUE, PART_PAGE}, #ifdef HAVE_BG {G_TYPE_STRING, BLOCK_PAGE, "Blocks", TRUE, PART_PAGE}, @@ -166,7 +168,8 @@ _build_min_max_string(char *buffer, int buf_size, int min, int max, bool range) char tmp_min[7]; char tmp_max[7]; convert_num_unit((float)min, tmp_min, UNIT_NONE); - convert_num_unit((float)max, tmp_max, UNIT_NONE); + if(max != INFINITE) + convert_num_unit((float)max, tmp_max, UNIT_NONE); if (max == min) return snprintf(buffer, buf_size, "%s", tmp_max); @@ -292,6 +295,8 @@ static void _layout_part_record(GtkTreeView *treeview, ListIterator itr = NULL; char time_buf[20]; char tmp_cnt[7]; + char tmp_cnt1[7]; + char tmp_cnt2[7]; partition_info_t *part_ptr = sview_part_info->part_ptr; sview_part_sub_t *sview_part_sub = NULL; sview_part_sub_t *temp_part_sub = NULL; @@ -299,6 +304,7 @@ static void _layout_part_record(GtkTreeView *treeview, sview_part_sub_t idle_part_sub; sview_part_sub_t other_part_sub; char tmp[1024]; + char *temp_char = NULL; GtkTreeStore *treestore = GTK_TREE_STORE(gtk_tree_view_get_model(treeview)); @@ -308,28 +314,37 @@ static void _layout_part_record(GtkTreeView *treeview, memset(&other_part_sub, 0, sizeof(sview_part_sub_t)); add_display_treestore_line(update, treestore, &iter, - display_data_part[SORTID_NAME].name, + find_col_name(display_data_part, + SORTID_NAME), part_ptr->name); if(part_ptr->default_part) - add_display_treestore_line(update, treestore, &iter, - display_data_part[SORTID_DEFAULT]. - name, "*"); + temp_char = "yes"; + else + temp_char = "no"; + add_display_treestore_line(update, treestore, &iter, + find_col_name(display_data_part, + SORTID_DEFAULT), + temp_char); if(part_ptr->hidden) - add_display_treestore_line(update, treestore, &iter, - display_data_part[SORTID_HIDDEN]. - name, "*"); + temp_char = "yes"; + else + temp_char = "no"; + add_display_treestore_line(update, treestore, &iter, + find_col_name(display_data_part, + SORTID_HIDDEN), + temp_char); if (part_ptr->state_up) - add_display_treestore_line(update, treestore, &iter, - display_data_part[SORTID_AVAIL]. - name, "up"); - else - add_display_treestore_line(update, treestore, &iter, - display_data_part[SORTID_AVAIL]. - name, "down"); - + temp_char = "up"; + else + temp_char = "down"; + add_display_treestore_line(update, treestore, &iter, + find_col_name(display_data_part, + SORTID_AVAIL), + temp_char); + if (part_ptr->max_time == INFINITE) snprintf(time_buf, sizeof(time_buf), "infinite"); else { @@ -338,14 +353,16 @@ static void _layout_part_record(GtkTreeView *treeview, } add_display_treestore_line(update, treestore, &iter, - display_data_part[SORTID_TIMELIMIT].name, + find_col_name(display_data_part, + SORTID_TIMELIMIT), time_buf); _build_min_max_string(time_buf, sizeof(time_buf), part_ptr->min_nodes, part_ptr->max_nodes, true); add_display_treestore_line(update, treestore, &iter, - display_data_part[SORTID_JOB_SIZE].name, + find_col_name(display_data_part, + SORTID_JOB_SIZE), time_buf); if (part_ptr->min_nodes == INFINITE) @@ -355,8 +372,9 @@ static void _layout_part_record(GtkTreeView *treeview, time_buf, UNIT_NONE); } add_display_treestore_line(update, treestore, &iter, - display_data_part[SORTID_MIN_NODES].name, - time_buf); + find_col_name(display_data_part, + SORTID_MIN_NODES), + time_buf); if (part_ptr->max_nodes == INFINITE) snprintf(time_buf, sizeof(time_buf), "infinite"); else { @@ -364,57 +382,58 @@ static void _layout_part_record(GtkTreeView *treeview, time_buf, UNIT_NONE); } add_display_treestore_line(update, treestore, &iter, - display_data_part[SORTID_MAX_NODES].name, + find_col_name(display_data_part, + SORTID_MAX_NODES), time_buf); if(part_ptr->root_only) - add_display_treestore_line(update, treestore, &iter, - display_data_part[SORTID_ROOT]. - name, "yes"); - else - add_display_treestore_line(update, treestore, &iter, - display_data_part[SORTID_ROOT]. - name, "no"); - + temp_char = "yes"; + else + temp_char = "no"; + add_display_treestore_line(update, treestore, &iter, + find_col_name(display_data_part, + SORTID_ROOT), + temp_char); + if(part_ptr->shared > 1) - add_display_treestore_line(update, treestore, &iter, - display_data_part[SORTID_SHARE]. - name, "force"); + temp_char = "force"; else if(part_ptr->shared) - add_display_treestore_line(update, treestore, &iter, - display_data_part[SORTID_SHARE]. - name, "yes"); - else - add_display_treestore_line(update, treestore, &iter, - display_data_part[SORTID_SHARE]. - name, "no"); - + temp_char = "yes"; + else + temp_char = "no"; + add_display_treestore_line(update, treestore, &iter, + find_col_name(display_data_part, + SORTID_SHARE), + temp_char); + if(part_ptr->allow_groups) - add_display_treestore_line(update, treestore, &iter, - display_data_part[SORTID_GROUPS]. - name, - part_ptr->allow_groups); + temp_char = part_ptr->allow_groups; else - add_display_treestore_line(update, treestore, &iter, - display_data_part[SORTID_GROUPS]. - name, "all"); - + temp_char = "all"; + add_display_treestore_line(update, treestore, &iter, + find_col_name(display_data_part, + SORTID_GROUPS), + temp_char); + #ifdef HAVE_BG convert_num_unit((float)part_ptr->total_nodes, tmp_cnt, UNIT_NONE); #else sprintf(tmp_cnt, "%u", part_ptr->total_nodes); #endif add_display_treestore_line(update, treestore, &iter, - display_data_part[SORTID_NODES].name, + find_col_name(display_data_part, + SORTID_NODES), tmp_cnt); convert_num_unit((float)part_ptr->total_cpus, tmp_cnt, UNIT_NONE); add_display_treestore_line(update, treestore, &iter, - display_data_part[SORTID_CPUS].name, + find_col_name(display_data_part, + SORTID_CPUS), tmp_cnt); add_display_treestore_line(update, treestore, &iter, - display_data_part[SORTID_NODELIST].name, + find_col_name(display_data_part, + SORTID_NODELIST), part_ptr->nodes); itr = list_iterator_create(sview_part_info->sub_list); while((sview_part_sub = list_next(itr))) { @@ -437,10 +456,11 @@ static void _layout_part_record(GtkTreeView *treeview, temp_part_sub->min_weight += sview_part_sub->min_weight; temp_part_sub->max_weight += sview_part_sub->max_weight; } - snprintf(tmp, sizeof(tmp), "%u/%u/%u", - alloc_part_sub.node_cnt, - idle_part_sub.node_cnt, - other_part_sub.node_cnt); + convert_num_unit((float)alloc_part_sub.node_cnt, tmp_cnt, UNIT_NONE); + convert_num_unit((float)idle_part_sub.node_cnt, tmp_cnt1, UNIT_NONE); + convert_num_unit((float)other_part_sub.node_cnt, tmp_cnt2, UNIT_NONE); + snprintf(tmp, sizeof(tmp), "%s/%s/%s", + tmp_cnt, tmp_cnt1, tmp_cnt2); add_display_treestore_line(update, treestore, &iter, "Nodes (Allocated/Idle/Other)", tmp); @@ -452,6 +472,7 @@ static void _update_part_record(sview_part_info_t *sview_part_info, { char time_buf[20]; char tmp_cnt[7]; + char *temp_char = NULL; partition_info_t *part_ptr = sview_part_info->part_ptr; GtkTreeIter sub_iter; int childern = 0; @@ -459,15 +480,22 @@ static void _update_part_record(sview_part_info_t *sview_part_info, gtk_tree_store_set(treestore, iter, SORTID_NAME, part_ptr->name, -1); if(part_ptr->default_part) - gtk_tree_store_set(treestore, iter, SORTID_DEFAULT, "*", -1); + temp_char = "yes"; + else + temp_char = "no"; + gtk_tree_store_set(treestore, iter, SORTID_DEFAULT, temp_char, -1); if(part_ptr->hidden) - gtk_tree_store_set(treestore, iter, SORTID_HIDDEN, "*", -1); + temp_char = "yes"; + else + temp_char = "no"; + gtk_tree_store_set(treestore, iter, SORTID_HIDDEN, temp_char, -1); if (part_ptr->state_up) - gtk_tree_store_set(treestore, iter, SORTID_AVAIL, "up", -1); + temp_char = "up"; else - gtk_tree_store_set(treestore, iter, SORTID_AVAIL, "down", -1); + temp_char = "down"; + gtk_tree_store_set(treestore, iter, SORTID_AVAIL, temp_char, -1); if (part_ptr->max_time == INFINITE) snprintf(time_buf, sizeof(time_buf), "infinite"); @@ -501,23 +529,25 @@ static void _update_part_record(sview_part_info_t *sview_part_info, time_buf, -1); if(part_ptr->root_only) - gtk_tree_store_set(treestore, iter, SORTID_ROOT, "yes", -1); + temp_char = "yes"; else - gtk_tree_store_set(treestore, iter, SORTID_ROOT, "no", -1); + temp_char = "no"; + gtk_tree_store_set(treestore, iter, SORTID_ROOT, temp_char, -1); if(part_ptr->shared > 1) - gtk_tree_store_set(treestore, iter, SORTID_SHARE, "force", -1); + temp_char = "force"; else if(part_ptr->shared) - gtk_tree_store_set(treestore, iter, SORTID_SHARE, "yes", -1); - else - gtk_tree_store_set(treestore, iter, SORTID_SHARE, "no", -1); + temp_char = "yes"; + else + temp_char = "no"; + gtk_tree_store_set(treestore, iter, SORTID_SHARE, temp_char, -1); if(part_ptr->allow_groups) - gtk_tree_store_set(treestore, iter, SORTID_GROUPS, - part_ptr->allow_groups, -1); + temp_char = part_ptr->allow_groups; else - gtk_tree_store_set(treestore, iter, SORTID_GROUPS, "all", -1); - + temp_char = "all"; + gtk_tree_store_set(treestore, iter, SORTID_GROUPS, temp_char, -1); + #ifdef HAVE_BG convert_num_unit((float)part_ptr->total_nodes, tmp_cnt, UNIT_NONE); #else @@ -532,7 +562,7 @@ static void _update_part_record(sview_part_info_t *sview_part_info, gtk_tree_store_set(treestore, iter, SORTID_STATE, "", -1); gtk_tree_store_set(treestore, iter, SORTID_STATE_NUM, -1, -1); gtk_tree_store_set(treestore, iter, SORTID_CPUS, "", -1); - gtk_tree_store_set(treestore, iter, SORTID_DISK, "", -1); + gtk_tree_store_set(treestore, iter, SORTID_TMP_DISK, "", -1); gtk_tree_store_set(treestore, iter, SORTID_MEM, "", -1); gtk_tree_store_set(treestore, iter, SORTID_WEIGHT, "", -1); gtk_tree_store_set(treestore, iter, SORTID_UPDATED, 1, -1); @@ -577,7 +607,7 @@ static void _update_part_sub_record(sview_part_sub_t *sview_part_sub, _build_min_max_string(time_buf, sizeof(time_buf), sview_part_sub->min_disk, sview_part_sub->max_disk, false); - gtk_tree_store_set(treestore, iter, SORTID_DISK, time_buf, -1); + gtk_tree_store_set(treestore, iter, SORTID_TMP_DISK, time_buf, -1); _build_min_max_string(time_buf, sizeof(time_buf), sview_part_sub->min_mem, @@ -1678,7 +1708,7 @@ extern void set_menus_part(void *arg, GtkTreePath *path, switch(type) { case TAB_CLICKED: - make_fields_menu(menu, display_data_part); + make_fields_menu(menu, display_data_part, SORTID_CNT); break; case ROW_CLICKED: make_options_menu(tree_view, path, menu, options_data_part); @@ -1800,3 +1830,9 @@ extern void popup_all_part(GtkTreeModel *model, GtkTreeIter *iter, int id) return; } } + +extern void admin_part(GtkTreeModel *model, GtkTreeIter *iter, char *type) +{ + return; +} + diff --git a/src/sview/submit_info.c b/src/sview/submit_info.c index 43d49d32778..4637a120635 100644 --- a/src/sview/submit_info.c +++ b/src/sview/submit_info.c @@ -76,7 +76,7 @@ extern void set_menus_submit(void *arg, GtkTreePath *path, popup_info_t *popup_win = (popup_info_t *)arg; switch(type) { case TAB_CLICKED: - make_fields_menu(menu, display_data_submit); + make_fields_menu(menu, display_data_submit, SORTID_CNT); break; case ROW_CLICKED: make_options_menu(tree_view, path, menu, options_data_submit); diff --git a/src/sview/sview.h b/src/sview/sview.h index eb5761ed83c..9884f64e0c7 100644 --- a/src/sview/sview.h +++ b/src/sview/sview.h @@ -79,6 +79,7 @@ enum { JOB_PAGE, NODE_PAGE, BLOCK_PAGE, SUBMIT_PAGE, + ADMIN_PAGE, INFO_PAGE, PAGE_CNT }; @@ -281,6 +282,7 @@ extern void specific_info_part(popup_info_t *popup_win); extern void set_menus_part(void *arg, GtkTreePath *path, GtkMenu *menu, int type); extern void popup_all_part(GtkTreeModel *model, GtkTreeIter *iter, int id); +extern void admin_part(GtkTreeModel *model, GtkTreeIter *iter, char *type); // block_info.c extern void refresh_block(GtkAction *action, gpointer user_data); @@ -296,6 +298,7 @@ extern void specific_info_block(popup_info_t *popup_win); extern void set_menus_block(void *arg, GtkTreePath *path, GtkMenu *menu, int type); extern void popup_all_block(GtkTreeModel *model, GtkTreeIter *iter, int id); +extern void admin_block(GtkTreeModel *model, GtkTreeIter *iter, char *type); // job_info.c extern void refresh_job(GtkAction *action, gpointer user_data); @@ -312,6 +315,7 @@ extern void specific_info_job(popup_info_t *popup_win); extern void set_menus_job(void *arg, GtkTreePath *path, GtkMenu *menu, int type); extern void popup_all_job(GtkTreeModel *model, GtkTreeIter *iter, int id); +extern void admin_job(GtkTreeModel *model, GtkTreeIter *iter, char *type); // node_info.c extern void refresh_node(GtkAction *action, gpointer user_data); @@ -332,6 +336,7 @@ extern void specific_info_node(popup_info_t *popup_win); extern void set_menus_node(void *arg, GtkTreePath *path, GtkMenu *menu, int type); extern void popup_all_node(GtkTreeModel *model, GtkTreeIter *iter, int id); +extern void admin_node(GtkTreeModel *model, GtkTreeIter *iter, char *type); // submit_info.c extern void get_info_submit(GtkTable *table, display_data_t *display_data); @@ -340,8 +345,11 @@ extern void set_menus_submit(void *arg, GtkTreePath *path, // common.c extern void snprint_time(char *buf, size_t buf_size, time_t time); extern int get_row_number(GtkTreeView *tree_view, GtkTreePath *path); +extern int find_col(display_data_t *display_data, int type); +extern const char *find_col_name(display_data_t *display_data, int type); extern void load_header(GtkTreeView *tree_view, display_data_t *display_data); -extern void make_fields_menu(GtkMenu *menu, display_data_t *display_data); +extern void make_fields_menu(GtkMenu *menu, display_data_t *display_data, + int count); extern void make_popup_fields_menu(popup_info_t *popup_win, GtkMenu *men); extern void make_options_menu(GtkTreeView *tree_view, GtkTreePath *path, GtkMenu *menu, display_data_t *display_data); @@ -378,5 +386,5 @@ extern void display_edit_note(char *edit_note); extern void add_display_treestore_line(int update, GtkTreeStore *treestore, GtkTreeIter *iter, - char *name, char *value); + const char *name, char *value); #endif -- GitLab