diff --git a/src/smap/configure_functions.c b/src/smap/configure_functions.c index 2bb738982285e90ddfd837173ac59fb5d2288f5a..517216432b2c7e1c54cf9a3af79569ee80821780 100644 --- a/src/smap/configure_functions.c +++ b/src/smap/configure_functions.c @@ -46,6 +46,8 @@ static int _remove_allocation(char *com, List allocated_blocks); static int _alter_allocation(char *com, List allocated_blocks); static int _copy_allocation(char *com, List allocated_blocks); static int _save_allocation(char *com, List allocated_blocks); +static void _strip_13_10(char *line); +static int _load_configuration(char *com, List allocated_blocks); static void _print_header_command(void); static void _print_text_command(allocated_block_t *allocated_block); @@ -147,9 +149,7 @@ static int _create_allocation(char *com, List allocated_blocks) i++; } - } - - + } if(geoi<0) { memset(error_string,0,255); @@ -166,21 +166,21 @@ static int _create_allocation(char *com, List allocated_blocks) if(com[i2]=='x') { /* for geometery */ - request->geometry[0] = atoi(&com[geoi]); + request->geometry[X] = atoi(&com[geoi]); geoi++; while(com[geoi-1]!='x' && geoi<len) geoi++; if(geoi==len) goto geo_error_message; - request->geometry[1] = atoi(&com[geoi]); + request->geometry[Y] = atoi(&com[geoi]); geoi++; while(com[geoi-1]!='x' && geoi<len) geoi++; if(geoi==len) goto geo_error_message; - request->geometry[2] = atoi(&com[geoi]); + request->geometry[Z] = atoi(&com[geoi]); request->size = -1; break; } @@ -189,19 +189,19 @@ static int _create_allocation(char *com, List allocated_blocks) if(request->start_req) { /* for size */ - request->start[0] = atoi(&com[starti]); + request->start[X] = atoi(&com[starti]); starti++; while(com[starti-1]!='x' && starti<len) starti++; if(starti==len) goto start_request; - request->start[1] = atoi(&com[starti]); + request->start[Y] = atoi(&com[starti]); starti++; while(com[starti-1]!='x' && starti<len) starti++; if(starti==len) goto start_request; - request->start[2] = atoi(&com[starti]); + request->start[Z] = atoi(&com[starti]); } start_request: /* @@ -712,6 +712,211 @@ static int _save_allocation(char *com, List allocated_blocks) return 1; } +/* Explicitly strip out new-line and carriage-return */ +static void _strip_13_10(char *line) +{ + int len = strlen(line); + int i; + + for(i=0;i<len;i++) { + if(line[i]==13 || line[i]==10) { + line[i] = '\0'; + return; + } + } +} + +static int _parse_bg_spec(char *in_line, List allocated_blocks) +{ +#ifdef HAVE_BG + int error_code = SLURM_SUCCESS; + char *nodes = NULL, *conn_type = NULL; + int bp_count = 0; + int start[BA_SYSTEM_DIMENSIONS]; + int end[BA_SYSTEM_DIMENSIONS]; + int start1[BA_SYSTEM_DIMENSIONS]; + int end1[BA_SYSTEM_DIMENSIONS]; + int geo[BA_SYSTEM_DIMENSIONS]; + char com[255]; + int j = 0, number; + int len = 0; + int x,y,z; + + geo[X] = 0; + geo[Y] = 0; + geo[Z] = 0; + + end1[X] = -1; + end1[Y] = -1; + end1[Z] = -1; + + error_code = slurm_parser(in_line, + "Nodes=", 's', &nodes, + "Type=", 's', &conn_type, + "END"); + if(!nodes) + return SLURM_SUCCESS; + len = strlen(nodes); + while (nodes[j] != '\0') { + if(j > len) + break; + else if ((nodes[j] == '[' || nodes[j] == ',') + && (nodes[j+8] == ']' || nodes[j+8] == ',') + && (nodes[j+4] == 'x' || nodes[j+4] == '-')) { + j++; + number = atoi(nodes + j); + start[X] = number / 100; + start[Y] = (number % 100) / 10; + start[Z] = (number % 10); + j += 4; + number = atoi(nodes + j); + end[X] = number / 100; + end[Y] = (number % 100) / 10; + end[Z] = (number % 10); + j += 3; + if(!bp_count) { + start1[X] = start[X]; + start1[Y] = start[Y]; + start1[Z] = start[Z]; + } + for (x = start[X]; x <= end[X]; x++) + for (y = start[Y]; y <= end[Y]; y++) + for (z = start[Z]; z <= end[Z]; z++) { + if(x>end1[X]) { + geo[X]++; + end1[X] = x; + } + if(y>end1[Y]) { + geo[Y]++; + end1[Y] = y; + } + if(z>end1[Z]) { + geo[Z]++; + end1[Z] = z; + } + bp_count++; + } + if(nodes[j] != ',') + break; + j--; + } else if((nodes[j] < 58 && nodes[j] > 47)) { + number = atoi(nodes + j); + start[X] = number / 100; + start[Y] = (number % 100) / 10; + start[Z] = (number % 10); + j+=3; + if(!bp_count) { + start1[X] = start[X]; + start1[Y] = start[Y]; + start1[Z] = start[Z]; + } + if(start[X]>end1[X]) { + geo[X]++; + end1[X] = start[X]; + } + if(start[Y]>end1[Y]) { + geo[Y]++; + end1[Y] = start[Y]; + } + if(start[Z]>end1[Z]) { + geo[Z]++; + end1[Z] = start[Z]; + } + bp_count++; + if(nodes[j] != ',') + break; + } + j++; + } + memset(com,0,255); + sprintf(com,"create %dx%dx%d %s start %dx%dx%d", + geo[X], geo[Y], geo[Z], conn_type, + start1[X], start1[Y], start1[Z]); + _create_allocation(com, allocated_blocks); +#endif + return SLURM_SUCCESS; +} +static int _load_configuration(char *com, List allocated_blocks) +{ + int len = strlen(com); + int i=5, j=0; + char filename[100]; + FILE *file_ptr = NULL; + char in_line[BUFSIZE]; /* input line */ + int line_num = 0; /* line number in input file */ + + ListIterator results_i; + _delete_allocated_blocks(allocated_blocks); + allocated_blocks = list_create(NULL); + + memset(filename,0,100); + if(len>5) + while(i<len) { + while(com[i-1]!=' ' && i<len) { + i++; + } + while(i<len && com[i]!=' ') { + filename[j] = com[i]; + i++; + j++; + if(j>100) { + memset(error_string,0,255); + sprintf(error_string, + "filename is too long needs " + "to be under 100 chars"); + return 0; + } + } + } + if(filename[0]=='\0') { + sprintf(filename,"bluegene.conf"); + } + file_ptr = fopen(filename,"r"); + if (file_ptr==NULL) { + memset(error_string,0,255); + sprintf(error_string, "problem reading file %s", filename); + return 0; + } + + while (fgets(in_line, BUFSIZE, file_ptr) != NULL) { + line_num++; + _strip_13_10(in_line); + if (strlen(in_line) >= (BUFSIZE - 1)) { + memset(error_string,0,255); + sprintf(error_string, + "_read_bg_config line %d, of input file %s " + "too long", line_num, filename); + fclose(file_ptr); + return 0; + } + + /* everything after a non-escaped "#" is a comment */ + /* replace comment flag "#" with an end of string (NULL) */ + /* escape sequence "\#" translated to "#" */ + for (i = 0; i < BUFSIZE; i++) { + if (in_line[i] == (char) NULL) + break; + if (in_line[i] != '#') + continue; + if ((i > 0) && (in_line[i - 1] == '\\')) { + for (j = i; j < BUFSIZE; j++) { + in_line[j - 1] = in_line[j]; + } + continue; + } + in_line[i] = (char) NULL; + break; + } + + /* parse what is left, non-comments */ + /* block configuration parameters */ + _parse_bg_spec(in_line, allocated_blocks); + } + fclose(file_ptr); + + return 1; +} + static void _print_header_command(void) { ba_system_ptr->ycord=2; @@ -918,6 +1123,8 @@ void get_command(void) _copy_allocation(com, allocated_blocks); } else if (!strncasecmp(com, "save", 4)) { _save_allocation(com, allocated_blocks); + } else if (!strncasecmp(com, "load", 4)) { + _load_configuration(com, allocated_blocks); } else if (!strncasecmp(com, "clear all", 9) || !strncasecmp(com, "clear", 5)) { _delete_allocated_blocks(allocated_blocks);