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, &params.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, &params.partition_flag, OPT_PARTITION,"show partition information and optionally specify a specific partition", "PARTITION"},
 		{"node", 'n', POPT_ARG_NONE, &params.node_flag, OPT_NODE, "specify a specific node", "NODE"},
 		{"long", 'l', POPT_ARG_NONE, &params.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, &params.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