Exemple #1
0
/*
 * scontrol_parse_res_options   parse options for creating or updating a
 reservation
 * IN argc - count of arguments
 * IN argv - list of arguments
 * IN msg  - a string to append to any error message
 * OUT resv_msg_ptr - struct holding reservation parameters
 * OUT free_user_str - bool indicating that resv_msg_ptr->users should be freed
 * OUT free_acct_str - bool indicating that resv_msg_ptr->accounts should be
 *		       freed
 * RET 0 on success, -1 on err and prints message
 */
extern int
scontrol_parse_res_options(int argc, char *argv[], const char *msg,
                           resv_desc_msg_t  *resv_msg_ptr,
                           int *free_user_str, int *free_acct_str,
                           int *free_tres_license, int *free_tres_bb,
                           int *free_tres_corecnt, int *free_tres_nodecnt)
{
    int i;
    int duration = -3;   /* -1 == INFINITE, -2 == error, -3 == not set */

    *free_user_str = 0;
    *free_acct_str = 0;
    *free_tres_license = 0;
    *free_tres_bb = 0;
    *free_tres_corecnt = 0;
    *free_tres_nodecnt = 0;

    for (i=0; i<argc; i++) {
        char *tag = argv[i];
        int taglen = 0;
        char plus_minus = '\0';

        char *val = strchr(argv[i], '=');
        taglen = val - argv[i];

        if (!val && strncasecmp(argv[i], "res", 3) == 0) {
            continue;
        } else if (!val || taglen == 0) {
            exit_code = 1;
            error("Unknown parameter %s.  %s", argv[i], msg);
            return SLURM_ERROR;
        }
        if (val[-1] == '+' || val[-1] == '-') {
            plus_minus = val[-1];
            taglen--;
        }
        val++;

        if (strncasecmp(tag, "ReservationName", MAX(taglen, 1)) == 0) {
            resv_msg_ptr->name = val;

        } else if (strncasecmp(tag, "Accounts", MAX(taglen, 1)) == 0) {
            if (plus_minus) {
                resv_msg_ptr->accounts =
                    _process_plus_minus(plus_minus, val);
                *free_acct_str = 1;
            } else {
                resv_msg_ptr->accounts = val;
            }
        } else if (strncasecmp(tag, "BurstBuffer", MAX(taglen, 2))
                   == 0) {
            resv_msg_ptr->burst_buffer = val;
        } else if (strncasecmp(tag, "StartTime", MAX(taglen, 1)) == 0) {
            time_t  t = parse_time(val, 0);
            if (errno == ESLURM_INVALID_TIME_VALUE) {
                exit_code = 1;
                error("Invalid start time %s.  %s",
                      argv[i], msg);
                return SLURM_ERROR;
            }
            resv_msg_ptr->start_time = t;

        } else if (strncasecmp(tag, "EndTime", MAX(taglen, 1)) == 0) {
            time_t  t = parse_time(val, 0);
            if (errno == ESLURM_INVALID_TIME_VALUE) {
                exit_code = 1;
                error("Invalid end time %s.  %s", argv[i],msg);
                return SLURM_ERROR;
            }
            resv_msg_ptr->end_time = t;

        } else if (strncasecmp(tag, "Duration", MAX(taglen, 1)) == 0) {
            /* -1 == INFINITE, -2 == error, -3 == not set */
            duration = time_str2mins(val);
            if (duration < 0 && duration != INFINITE) {
                exit_code = 1;
                error("Invalid duration %s.  %s", argv[i],msg);
                return SLURM_ERROR;
            }
            resv_msg_ptr->duration = (uint32_t)duration;

        } else if (strncasecmp(tag, "Flags", MAX(taglen, 2)) == 0) {
            uint32_t f;
            if (plus_minus) {
                char *tmp =
                    _process_plus_minus(plus_minus, val);
                f = parse_resv_flags(tmp, msg);
                xfree(tmp);
            } else {
                f = parse_resv_flags(val, msg);
            }
            if (f == 0xffffffff) {
                return SLURM_ERROR;
            } else {
                resv_msg_ptr->flags = f;
            }
        } else if (strncasecmp(tag, "NodeCnt", MAX(taglen,5)) == 0 ||
                   strncasecmp(tag, "NodeCount", MAX(taglen,5)) == 0) {

            if (_parse_resv_node_cnt(resv_msg_ptr, val, false)
                    == SLURM_ERROR)
                return SLURM_ERROR;

        } else if (strncasecmp(tag, "CoreCnt",   MAX(taglen,5)) == 0 ||
                   strncasecmp(tag, "CoreCount", MAX(taglen,5)) == 0 ||
                   strncasecmp(tag, "CPUCnt",    MAX(taglen,5)) == 0 ||
                   strncasecmp(tag, "CPUCount",  MAX(taglen,5)) == 0) {

            if (_parse_resv_core_cnt(resv_msg_ptr, val, false)
                    == SLURM_ERROR)
                return SLURM_ERROR;

        } else if (strncasecmp(tag, "Nodes", MAX(taglen, 5)) == 0) {
            resv_msg_ptr->node_list = val;

        } else if (strncasecmp(tag, "Features", MAX(taglen, 2)) == 0) {
            resv_msg_ptr->features = val;

        } else if (strncasecmp(tag, "Licenses", MAX(taglen, 2)) == 0) {
            resv_msg_ptr->licenses = val;

        } else if (strncasecmp(tag, "PartitionName", MAX(taglen, 1))
                   == 0) {
            resv_msg_ptr->partition = val;

        } else if (strncasecmp(tag, "TRES", MAX(taglen, 1)) == 0) {
            if (_parse_resv_tres(val, resv_msg_ptr,
                                 free_tres_license, free_tres_bb,
                                 free_tres_corecnt,
                                 free_tres_nodecnt) == SLURM_ERROR)
                return SLURM_ERROR;

        } else if (strncasecmp(tag, "Users", MAX(taglen, 1)) == 0) {
            if (plus_minus) {
                resv_msg_ptr->users =
                    _process_plus_minus(plus_minus, val);
                *free_user_str = 1;
            } else {
                resv_msg_ptr->users = val;
            }
        } else if (strncasecmp(tag, "Watts", MAX(taglen, 1)) == 0) {
            if (parse_uint32(val, &(resv_msg_ptr->resv_watts))) {
                error("Invalid Watts value: %s", val);
                return SLURM_ERROR;
            }
        } else if (strncasecmp(tag, "res", 3) == 0) {
            continue;
        } else {
            exit_code = 1;
            error("Unknown parameter %s.  %s", argv[i], msg);
            return SLURM_ERROR;
        }
    }

    return SLURM_SUCCESS;
}
Exemple #2
0
/*
 * scontrol_parse_res_options   parse options for creating or updating a
                                reservation
 * IN argc - count of arguments
 * IN argv - list of arguments
 * IN msg  - a string to append to any error message
 * OUT resv_msg_ptr - struct holding reservation parameters
 * OUT free_user_str - bool indicating that resv_msg_ptr->users should be freed
 * OUT free_acct_str - bool indicating that resv_msg_ptr->accounts should be
 *		       freed
 * RET 0 on success, -1 on err and prints message
 */
extern int
scontrol_parse_res_options(int argc, char *argv[], const char *msg,
			   resv_desc_msg_t  *resv_msg_ptr,
			   int *free_user_str, int *free_acct_str)
{
	int i;
	int duration = -3;   /* -1 == INFINITE, -2 == error, -3 == not set */

	*free_user_str = 0;
	*free_acct_str = 0;

	for (i=0; i<argc; i++) {
		char *tag = argv[i];
		int taglen = 0;
		char plus_minus = '\0';

		char *val = strchr(argv[i], '=');
		taglen = val - argv[i];

		if (!val && strncasecmp(argv[i], "res", 3) == 0) {
			continue;
		} else if (!val || taglen == 0) {
			exit_code = 1;
			error("Unknown parameter %s.  %s", argv[i], msg);
			return -1;
		}
		if (val[-1] == '+' || val[-1] == '-') {
			plus_minus = val[-1];
			taglen--;
		}
		val++;

		if (strncasecmp(tag, "ReservationName", MAX(taglen, 1)) == 0) {
			resv_msg_ptr->name = val;

		} else if (strncasecmp(tag, "StartTime", MAX(taglen, 1)) == 0){
			time_t  t = parse_time(val, 0);
			if (errno == ESLURM_INVALID_TIME_VALUE) {
				exit_code = 1;
				error("Invalid start time %s.  %s",
				      argv[i], msg);
				return -1;
			}
			resv_msg_ptr->start_time = t;

		} else if (strncasecmp(tag, "EndTime", MAX(taglen, 1)) == 0) {
			time_t  t = parse_time(val, 0);
			if (errno == ESLURM_INVALID_TIME_VALUE) {
				exit_code = 1;
				error("Invalid end time %s.  %s", argv[i],msg);
				return -1;
			}
			resv_msg_ptr->end_time = t;

		} else if (strncasecmp(tag, "Duration", MAX(taglen, 1)) == 0) {
			/* -1 == INFINITE, -2 == error, -3 == not set */
			duration = time_str2mins(val);
			if (duration < 0 && duration != INFINITE) {
				exit_code = 1;
				error("Invalid duration %s.  %s", argv[i],msg);
				return -1;
			}
			resv_msg_ptr->duration = (uint32_t)duration;

		} else if (strncasecmp(tag, "Flags", MAX(taglen, 2)) == 0) {
			uint32_t f;
			if (plus_minus) {
				char *tmp =
					_process_plus_minus(plus_minus, val);
				f = _parse_flags(tmp, msg);
				xfree(tmp);
			} else {
				f = _parse_flags(val, msg);
			}
			if (f == 0xffffffff) {
				return -1;
			} else {
				resv_msg_ptr->flags = f;
			}
		} else if (strncasecmp(tag, "NodeCnt", MAX(taglen,5)) == 0 ||
			   strncasecmp(tag, "NodeCount", MAX(taglen,5)) == 0) {
			char *endptr = NULL, *node_cnt, *tok, *ptrptr = NULL;
			int node_inx = 0;
			node_cnt = xstrdup(val);
			tok = strtok_r(node_cnt, ",", &ptrptr);
			while (tok) {
				xrealloc(resv_msg_ptr->node_cnt,
					 sizeof(uint32_t) * (node_inx + 2));
				resv_msg_ptr->node_cnt[node_inx] =
					strtol(tok, &endptr, 10);
				if ((endptr != NULL) &&
				    ((endptr[0] == 'k') ||
				     (endptr[0] == 'K'))) {
					resv_msg_ptr->node_cnt[node_inx] *=
						1024;
				} else if ((endptr != NULL) &&
					   ((endptr[0] == 'm') ||
					    (endptr[0] == 'M'))) {
					resv_msg_ptr->node_cnt[node_inx] *=
						1024 * 1024;
				} else if ((endptr == NULL) ||
					   (endptr[0] != '\0') ||
					   (tok[0] == '\0')) {
					exit_code = 1;
					error("Invalid node count %s.  %s",
					      argv[i], msg);
					xfree(node_cnt);
					return -1;
				}
				node_inx++;
				tok = strtok_r(NULL, ",", &ptrptr);
			}
			xfree(node_cnt);

		} else if (strncasecmp(tag, "CoreCnt",   MAX(taglen,5)) == 0 ||
		           strncasecmp(tag, "CoreCount", MAX(taglen,5)) == 0 ||
		           strncasecmp(tag, "CPUCnt",    MAX(taglen,5)) == 0 ||
			   strncasecmp(tag, "CPUCount",  MAX(taglen,5)) == 0) {

			char *endptr = NULL, *core_cnt, *tok, *ptrptr = NULL;
			int node_inx = 0;

			core_cnt = xstrdup(val);
			tok = strtok_r(core_cnt, ",", &ptrptr);
			while (tok) {
				xrealloc(resv_msg_ptr->core_cnt,
					 sizeof(uint32_t) * (node_inx + 2));
				resv_msg_ptr->core_cnt[node_inx] =
					strtol(tok, &endptr, 10);
				if ((endptr == NULL) ||
				   (endptr[0] != '\0') ||
				   (tok[0] == '\0')) {
					exit_code = 1;
					error("Invalid core count %s. %s",
					      argv[i], msg);
					xfree(core_cnt);
					return -1;
				}
				node_inx++;
				tok = strtok_r(NULL, ",", &ptrptr);
			}
			xfree(core_cnt);

		} else if (strncasecmp(tag, "Nodes", MAX(taglen, 5)) == 0) {
			resv_msg_ptr->node_list = val;

		} else if (strncasecmp(tag, "Features", MAX(taglen, 2)) == 0) {
			resv_msg_ptr->features = val;

		} else if (strncasecmp(tag, "Licenses", MAX(taglen, 2)) == 0) {
			resv_msg_ptr->licenses = val;

		} else if (strncasecmp(tag, "PartitionName", MAX(taglen, 1))
			   == 0) {
			resv_msg_ptr->partition = val;

		} else if (strncasecmp(tag, "Users", MAX(taglen, 1)) == 0) {
			if (plus_minus) {
				resv_msg_ptr->users =
					_process_plus_minus(plus_minus, val);
				*free_user_str = 1;
			} else {
				resv_msg_ptr->users = val;
			}
		} else if (strncasecmp(tag, "Accounts", MAX(taglen, 1)) == 0) {
			if (plus_minus) {
				resv_msg_ptr->accounts =
					_process_plus_minus(plus_minus, val);
				*free_acct_str = 1;
			} else {
				resv_msg_ptr->accounts = val;
			}
		} else if (strncasecmp(tag, "res", 3) == 0) {
			continue;
		} else {
			exit_code = 1;
			error("Unknown parameter %s.  %s", argv[i], msg);
			return -1;
		}
	}
	return 0;
}