From bc8f0ccc739e195f4cfb4fc947e75127ef584089 Mon Sep 17 00:00:00 2001 From: jce <jce@unknown> Date: Thu, 22 Aug 2002 15:30:16 +0000 Subject: [PATCH] changes --- src/sinfo/opts.c | 28 ++++++--- src/sinfo/sinfo.c | 143 +++++++++++++++++++++++++++++++++------------- src/sinfo/sinfo.h | 3 +- 3 files changed, 126 insertions(+), 48 deletions(-) diff --git a/src/sinfo/opts.c b/src/sinfo/opts.c index 0bbc9382b09..8fb5cf7cbfa 100644 --- a/src/sinfo/opts.c +++ b/src/sinfo/opts.c @@ -34,7 +34,10 @@ #define OPT_FORMAT 0x05 #define OPT_VERBOSE 0x06 +int parse_state( char* str, enum node_states* states ); + extern struct sinfo_parameters params; +char *temp_state; /* * parse_command_line @@ -51,7 +54,7 @@ parse_command_line( int argc, char* argv[] ) /* Declare the Options */ static const struct poptOption options[] = { - {"state", 't', POPT_ARG_STRING, ¶ms.state, OPT_NODE_STATE, "specify the what state of nodes to view", "NODE_STATE"}, + {"state", 't', POPT_ARG_STRING, &temp_state, OPT_NODE_STATE, "specify the what state of nodes to view", "NODE_STATE"}, {"partition", 'p', POPT_ARG_NONE, ¶ms.partition_flag, OPT_PARTITION,"show partition information and optionally specify a specific partition", "PARTITION"}, {"node", 'n', POPT_ARG_NONE, ¶ms.node_flag, OPT_NODE, "specify a specific node", "NODE"}, {"long", 'l', POPT_ARG_NONE, ¶ms.long_output, OPT_FORMAT, "long output - displays more information", NULL}, @@ -88,10 +91,13 @@ parse_command_line( int argc, char* argv[] ) } break; case OPT_NODE_STATE: - if ( params.state[0] == '-' ) { - fprintf(stderr, "%s: %s\n", argv[0], poptStrerror(POPT_ERROR_NOARG)); - exit (1); + params.state_flag = true; + if ( parse_state( temp_state, ¶ms.state ) == SLURM_ERROR ) + { + fprintf(stderr, "%s: %s is an invalid node state\n", argv[0], temp_state); + exit (1); + } } break; @@ -130,6 +136,14 @@ parse_state( char* str, enum node_states* states ) { /* FIXME - this will eventually return an array of enums */ + printf("parse_state: str = %s\n", str ); + + printf("%s\n", node_state_string( NODE_STATE_DOWN ) ); + printf("%s\n", node_state_string( NODE_STATE_UNKNOWN ) ); + printf("%s\n", node_state_string( NODE_STATE_IDLE ) ); + printf("%s\n", node_state_string( NODE_STATE_ALLOCATED ) ); + printf("%s\n", node_state_string( NODE_STATE_DRAINED ) ); + printf("%s\n", node_state_string( NODE_STATE_DRAINING ) ); if ( strcasecmp( str, node_state_string( NODE_STATE_DOWN )) == 0 ) *states = NODE_STATE_DOWN; @@ -152,13 +166,13 @@ void print_options() { printf( "-----------------------------\n" ); - printf( "partition(%s) = %s\n", (params.partition_flag ? "true" : "false"), params.partition ) ; + printf( "partition(%s) = %s\n", (params.partition_flag ? "true" : "false"), params.partition ); printf( "node(%s) = %s\n", (params.node_flag ? "true" : "false"),params.node ); - printf( "state = %s\n", params.state ); + printf( "state = %s\n", node_state_string( params.state ) ); printf( "summarize = %s\n", params.summarize ? "true" : "false" ); printf( "verbose = %d\n", params.verbose ); printf( "long output = %s\n", params.long_output ? "true" : "false" ); - printf( "-----------------------------\n\n\n" ); + printf( "-----------------------------\n\n" ); } ; diff --git a/src/sinfo/sinfo.c b/src/sinfo/sinfo.c index 2aa7039dadb..5a955008007 100644 --- a/src/sinfo/sinfo.c +++ b/src/sinfo/sinfo.c @@ -32,8 +32,7 @@ * Global Variables * ********************/ static char *command_name; -struct sinfo_parameters params; -int quiet_flag=0; +struct sinfo_parameters params = { partition_flag:false, partition:NULL, state_flag:false, node_flag:false, node:NULL, summarize:false, long_output:false, line_wrap:false, verbose:false }; /************ * Funtions * @@ -45,10 +44,8 @@ int query_server( partition_info_msg_t ** part_pptr, node_info_msg_t ** node_ppt int build_min_max_string( char* buffer, int max, int min ); -void display_partition_info_long( List partitions ); -void display_partition_info( List partitions ); -void display_all_partition_summary( partition_info_msg_t* part_ptr, node_info_msg_t* node_ptr ); -void display_partition_summarys ( List partitions ); +/* Node Functions */ +void display_all_nodes( node_info_msg_t* node_msg ); void display_nodes_list( List nodes ); void display_nodes_list_long( List nodes ); int get_node_index( char* name ); @@ -56,8 +53,14 @@ char* get_node_prefix( char* name, char* buffer ); char* node_name_string_from_list( List nodes, char* buffer ); List group_node_list( node_info_msg_t* msg ); -void display_all_nodes( node_info_msg_t* node_msg ); +/* Partition Functions */ +void display_all_partition_summary( partition_info_msg_t* part_ptr, node_info_msg_t* node_ptr ); +void display_partition_info_long( struct partition_summary* partition ); +void display_partition_node_info( struct partition_summary* partition, bool print_name ); +void display_all_partition_summary( partition_info_msg_t* part_ptr, node_info_msg_t* node_ptr ); +void display_all_partition_info_long( List partitions ); +void display_partition_summarys ( List partitions ); int main (int argc, char *argv[]) @@ -67,7 +70,6 @@ main (int argc, char *argv[]) node_info_msg_t* node_msg = NULL; command_name = argv[0]; - quiet_flag = 0; log_init(argv[0], opts, SYSLOG_FACILITY_DAEMON, NULL); parse_command_line( argc, argv ); @@ -79,10 +81,12 @@ main (int argc, char *argv[]) if ( params.node_flag ) display_all_nodes( node_msg ); - if ( params.partition_flag ) + else if ( params.partition_flag ) + display_all_partition_summary( partition_msg, node_msg ); +/* display_all_partition_info_long( partition_msg, node_msg ); +*/ + else display_all_partition_summary( partition_msg, node_msg ); - - exit (0); } @@ -121,13 +125,15 @@ void display_all_nodes( node_info_msg_t* node_msg ) printf( display_line ); - if ( params.long_output == true ) + if ( params.long_output == true || params.node != NULL ) { List nodes = list_create( NULL ); int i = 0; for ( ; i < node_msg->record_count; i++ ) - list_append( nodes, &node_msg->node_array[i] ); + if ( ( params.node == NULL || strcmp( node_msg->node_array[i].name, params.node) == 0 ) + && ( params.state_flag == false || node_msg->node_array[i].node_state == params.state ) ) + list_append( nodes, &node_msg->node_array[i] ); display_nodes_list_long( nodes ); @@ -184,6 +190,7 @@ display_nodes_list_long( List nodes ) { /*int console_width = atoi( getenv( "COLUMNS" ) );*/ int console_width = 80; + int count = 0; char line[BUFSIZ]; char format[32]; ListIterator i = list_iterator_create( nodes ); @@ -191,6 +198,8 @@ display_nodes_list_long( List nodes ) while ( ( curr = list_next( i ) ) != NULL ) { + if ( params.partition != NULL && strcmp( params.partition, curr-> partition) ) + continue; snprintf(line, BUFSIZ, display_node_format, curr->name, @@ -209,10 +218,10 @@ display_nodes_list_long( List nodes ) snprintf(format, 32, "%%.%ds\n", MAX(80,console_width) ); printf( format, line ); } - + count++; } printf( "-- %.8s NODES LISTED --\n\n", - int_to_str( list_count( nodes ) ) ); + int_to_str( count )); } @@ -228,6 +237,11 @@ group_node_list( node_info_msg_t* msg ) ListIterator list_i = list_iterator_create( node_lists ); List curr_list = NULL; + if ( params.partition != NULL && strcmp( params.partition, nodes[i].partition ) ) + continue; + if ( params.state_flag == true && nodes[i].node_state != params.state ) + continue; + while ( (curr_list = list_next(list_i)) != NULL ) { node_info_t* curr = list_peek( curr_list ); @@ -299,8 +313,8 @@ find_node_state_summary( List l, enum node_states state ) return NULL; } -void -display_all_partition_summary( partition_info_msg_t* part_ptr, node_info_msg_t* node_ptr ) +List +setup_partition_summary( partition_info_msg_t* part_ptr, node_info_msg_t* node_ptr ) { int i=0; List partitions = list_create( NULL ); @@ -351,20 +365,24 @@ display_all_partition_summary( partition_info_msg_t* part_ptr, node_info_msg_t* list_append( part_sum->states, node_sum ); } } + + return partitions; +} - display_partition_summarys( partitions ); +void +display_all_partition_summary( partition_info_msg_t* part_ptr, node_info_msg_t* node_ptr ) +{ + List partitions = setup_partition_summary( part_ptr, node_ptr ); + if ( params.long_output ) + display_all_partition_info_long( partitions ); + else display_partition_summarys( partitions ); + list_destroy( partitions ); } void display_partition_summarys ( List partitions ) { const char* format_header = "%10s %8s %10s %8s %15s %15s\n"; - const char* format = "%10s %8d %10s %8s %15s %15s\n"; - char cpu_buf[64]; - char ram_buf[64]; - char disk_buf[64]; - char* no_name = ""; - struct partition_summary* partition ; ListIterator part_i = list_iterator_create( partitions ); @@ -373,35 +391,80 @@ display_partition_summarys ( List partitions ) while ( (partition = list_next( part_i ) ) != NULL ) { - ListIterator node_i = list_iterator_create( partition->states ); - struct node_state_summary* state_sum = NULL; - char* part_name = partition->info->name; - while ( ( state_sum = list_next(node_i) ) != NULL ) - { - build_min_max_string( cpu_buf, state_sum->cpu_min, state_sum->cpu_max ); - build_min_max_string( ram_buf, state_sum->ram_min, state_sum->ram_max ); - build_min_max_string( disk_buf, state_sum->disk_min, state_sum->disk_max ); - printf( format, part_name, state_sum->node_count, node_state_string( state_sum->state), cpu_buf, ram_buf, disk_buf ); - part_name = no_name; - } - printf("\n"); + if ( params.partition == NULL || strcmp( partition->info->name, params.partition ) == 0 ) + display_partition_node_info( partition, true ); } } - void -display_partition_info( List partitions ) +display_partition_node_info( struct partition_summary* partition, bool print_name ) { + char* no_name = ""; + char cpu_buf[64]; + char ram_buf[64]; + char disk_buf[64]; -} + const char* format_name = "%10s %8d %10s %8s %15s %15s\n"; + const char* format = "\t%8d %10s %8s %15s %15s\n"; + ListIterator node_i = list_iterator_create( partition->states ); + struct node_state_summary* state_sum = NULL; + char* part_name = partition->info->name ; + + while ( ( state_sum = list_next(node_i) ) != NULL ) + { + build_min_max_string( cpu_buf, state_sum->cpu_min, state_sum->cpu_max ); + build_min_max_string( ram_buf, state_sum->ram_min, state_sum->ram_max ); + build_min_max_string( disk_buf, state_sum->disk_min, state_sum->disk_max ); + if ( print_name == true ) + printf( format_name, part_name, state_sum->node_count, node_state_string( state_sum->state), cpu_buf, ram_buf, disk_buf ); + else printf( format, state_sum->node_count, node_state_string( state_sum->state), cpu_buf, ram_buf, disk_buf ); + part_name = no_name; + } +} void -display_partition_info_long( List partitions ) +display_all_partition_info_long( List partitions ) { + struct partition_summary* partition ; + ListIterator part_i = list_iterator_create( partitions ); + while ( (partition = list_next( part_i ) ) != NULL ) + { + if ( params.partition == NULL || strcmp( partition->info->name, params.partition ) == 0 ) + display_partition_info_long( partition ); + printf("\n"); + } +} + +void +display_partition_info_long( struct partition_summary* partition ) +{ + const char* format_header = "\t%8s %10s %8s %15s %15s\n"; +/* const char* format = "\t%8d %10s %8s %15s %15s\n"; +*/ + partition_info_t* part = partition->info ; + + printf( "================================================================================\n" ); + printf("%s\n", part->name ); + printf("\tcurrent state = %s\n", part->state_up ? "UP" : "DOWN" ); + printf("\tdefault partition = %s\n", part->default_part ? "YES" : "NO" ); + printf("\ttotal nodes = %d\n", part->total_nodes ); + printf("\ttotal cpus = %d\n", part->total_cpus ); + if ( part->max_time == -1 ) + printf("\tmax jobtime = NONE\n" ); + else printf("\tmax jobtime = %d\n", part->max_time ); + printf("\tmax nodes/job = %d\n", part->max_nodes ); + printf("\troot only = %s\n", part->root_only ? "YES" : "NO" ); + printf("\tshare nodes = %s\n", part->shared == 2 ? "ALWAYS" : part->shared ? "YES" : "NO" ); + + printf("\n"); + printf( format_header, "#Nodes", "Node State", "CPUs", "Memory", "TmpDisk" ); + printf( "\t------------------------------------------------------------------------\n"); + display_partition_node_info( partition, false ); + } /* node_name_string_from_list - analyzes a list of node_info_t* and diff --git a/src/sinfo/sinfo.h b/src/sinfo/sinfo.h index 3c45bf784de..31833603160 100644 --- a/src/sinfo/sinfo.h +++ b/src/sinfo/sinfo.h @@ -59,7 +59,8 @@ struct sinfo_parameters { bool partition_flag; const char* partition; - const char* state; + bool state_flag; + enum node_states state; bool node_flag; const char* node; bool summarize; -- GitLab