diff --git a/src/sinfo/opts.c b/src/sinfo/opts.c index 4f906eb9a4749258dab2397e0414c4c8b22a65e2..d36e0870c9faef625dc3a31043849fb909bf8fe4 100644 --- a/src/sinfo/opts.c +++ b/src/sinfo/opts.c @@ -43,6 +43,7 @@ #define OPT_FORMAT 0x05 #define OPT_VERBOSE 0x06 #define OPT_ITERATE 0x07 +#define OPT_EXACT 0x08 static int _parse_state(char *str, enum node_states *states); @@ -63,6 +64,8 @@ int parse_command_line(int argc, char *argv[]) /* Declare the Options */ static const struct poptOption options[] = { + {"exact", 'e', POPT_ARG_NONE, ¶ms.exact_match, OPT_EXACT, + "group node only on exact match of configuration",NULL}, {"iterate", 'i', POPT_ARG_INT, ¶ms.iterate, OPT_ITERATE, "specify an interation period", "seconds"}, {"state", 't', POPT_ARG_STRING, &temp_state, @@ -83,14 +86,15 @@ int parse_command_line(int argc, char *argv[]) NULL}, {"verbose", 'v', POPT_ARG_NONE, ¶ms.verbose, OPT_VERBOSE, "verbosity level", "level"}, - POPT_AUTOHELP {NULL, '\0', 0, NULL, 0, NULL, NULL} /* end */ + POPT_AUTOHELP + {NULL, '\0', 0, NULL, 0, NULL, NULL} /* end */ }; /* Initial the popt contexts */ context = poptGetContext("sinfo", argc, (const char **) argv, options, POPT_CONTEXT_POSIXMEHARDER); - poptSetOtherOptionHelp(context, "[-lns]"); + poptSetOtherOptionHelp(context, "[-elns]"); next_opt = poptGetNextOpt(context); @@ -112,15 +116,13 @@ int parse_command_line(int argc, char *argv[]) } break; case OPT_NODE_STATE: - { - 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); - } + params.state_flag = true; + if (_parse_state(temp_state, ¶ms.state) + == SLURM_ERROR) { + fprintf(stderr, + "%s: %s is invalid node state\n", + argv[0], temp_state); + exit(1); } break; @@ -180,19 +182,20 @@ static int _parse_state(char *str, enum node_states *states) } /* print the parameters specified */ -void print_options() +void print_options( void ) { printf("-----------------------------\n"); printf("partition(%s) = %s\n", (params.partition_flag ? "true" : "false"), params.partition); - printf("node(%s) = %s\n", (params.node_flag ? "true" : "false"), + printf("node(%s) = %s\n", (params.node_flag ? "true" : "false"), params.node); printf("state(%s) = %s\n", (params.state_flag ? "true" : "false"), node_state_string(params.state)); printf("summarize = %s\n", params.summarize ? "true" : "false"); - printf("verbose = %d\n", params.verbose); + printf("exact = %d\n", params.exact_match); + printf("verbose = %d\n", params.verbose); printf("long output = %s\n", params.long_output ? "true" : "false"); printf("-----------------------------\n\n"); -}; +} diff --git a/src/sinfo/sinfo.c b/src/sinfo/sinfo.c index 550e266680162a923832623d12b786a573aa000a..1255f07c80a62fdce07f9e211006e24a5a601160 100644 --- a/src/sinfo/sinfo.c +++ b/src/sinfo/sinfo.c @@ -36,7 +36,7 @@ static char *command_name; 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, iterate:0 + line_wrap:false, verbose:false, iterate:0, exact_match:false }; /************ @@ -76,7 +76,7 @@ static int _print_str(char *number, int width, bool right); /* Display partition functions */ static struct partition_summary *_find_partition_summary(List l, char *name); static struct node_state_summary *_find_node_state_summary( - List l, enum node_states state); + List l, node_info_t *ninfo); static List _setup_partition_summary( partition_info_msg_t * part_ptr, node_info_msg_t * node_ptr); static void _print_partition_header(bool no_name); @@ -397,13 +397,19 @@ static struct partition_summary *_find_partition_summary(List l, char *name) } static struct node_state_summary * -_find_node_state_summary(List l, enum node_states state) +_find_node_state_summary(List l, node_info_t *ninfo) { ListIterator i = list_iterator_create(l); struct node_state_summary *current; while ((current = list_next(i)) != NULL) { - if (state == current->state) + if (ninfo->node_state != current->state) + continue; + if (params.exact_match == 0) + break; + if ((ninfo->cpus == current->cpu_min) && + (ninfo->real_memory == current->ram_min) && + (ninfo->tmp_disk == current->disk_min)) break; } @@ -443,10 +449,8 @@ _setup_partition_summary(partition_info_msg_t * part_ptr, continue; } - if ((node_sum = - _find_node_state_summary(part_sum->states, - (enum node_states) ninfo-> - node_state)) != NULL) { + if ((node_sum = + _find_node_state_summary(part_sum->states, ninfo))) { node_sum->state = (enum node_states) ninfo->node_state; node_sum->cpu_max = @@ -497,11 +501,11 @@ _display_all_partition_summary(partition_info_msg_t * part_ptr, /* Formating for partiton display headers... */ int part_sz_part = 10; -int part_sz_num = 6; -int part_sz_state = 10; +int part_sz_num = 5; +int part_sz_state = 9; int part_sz_cpus = 4; -int part_sz_ram = 8; -int part_sz_disk = 8; +int part_sz_ram = 9; +int part_sz_disk = 11; int part_sz_nodes = 0; static void _print_partition_header(bool no_name) @@ -513,15 +517,16 @@ static void _print_partition_header(bool no_name) printf(" "); } _print_str("NODES", part_sz_num, true); - printf(" "); + printf(" "); _print_str("STATE", part_sz_state, false); printf(" "); _print_str("CPUS", part_sz_cpus, true); printf(" "); - _print_str("MEM", part_sz_ram, true); + _print_str("MEMORY", part_sz_ram, true); printf(" "); - _print_str("DISK", part_sz_disk, true); - _print_str(" NODES", part_sz_nodes, false); + _print_str("TMP_DISK", part_sz_disk, true); + printf(" "); + _print_str("NODES", part_sz_nodes, false); printf("\n"); if (no_name == true) printf @@ -578,7 +583,7 @@ _display_partition_node_info(struct partition_summary *partition, printf("\t"); _print_int(state_sum->node_count, part_sz_num, true); - printf(" "); + printf(" "); _print_str(node_state_string(state_sum->state), part_sz_state, false); printf(" "); @@ -587,7 +592,7 @@ _display_partition_node_info(struct partition_summary *partition, _print_str(ram_buf, part_sz_ram, true); printf(" "); _print_str(disk_buf, part_sz_disk, true); - printf(" "); + printf(" "); _print_str(name_buf, part_sz_nodes, false); printf("\n"); part_name = no_name; diff --git a/src/sinfo/sinfo.h b/src/sinfo/sinfo.h index 43fb05b45e5e61bf16d195a4197afc95eca597b2..dba6fb15a0dc01eb2a8d0161ac4c0d1e45f33bb6 100644 --- a/src/sinfo/sinfo.h +++ b/src/sinfo/sinfo.h @@ -27,7 +27,7 @@ #ifndef __SINFO_H__ #if HAVE_CONFIG_H -# include <config.h> +# include "config.h" #endif #include <ctype.h> @@ -46,13 +46,12 @@ #include <time.h> #include <unistd.h> -#include <src/api/slurm.h> -#include <src/common/hostlist.h> -#include <src/common/log.h> -#include <src/common/slurm_protocol_api.h> -#include <src/common/xmalloc.h> -#include <src/common/list.h> -#include <src/common/hostlist.h> +#include "src/api/slurm.h" +#include "src/common/hostlist.h" +#include "src/common/list.h" +#include "src/common/log.h" +#include "src/common/slurm_protocol_api.h" +#include "src/common/xmalloc.h" #define MIN(x,y) (((x)<(y))?(x):(y)) @@ -69,6 +68,7 @@ struct sinfo_parameters { bool line_wrap; int verbose; int iterate; + bool exact_match; }; struct node_state_summary { @@ -90,6 +90,6 @@ struct partition_summary { int parse_state( char* str, enum job_states* states ); int parse_command_line( int argc, char* argv[] ); -void print_options(); +void print_options( void ); #endif