| /*****************************************************************************\ |
| * update_part.c - partition update function for scontrol. |
| ***************************************************************************** |
| * Copyright (C) 2002-2007 The Regents of the University of California. |
| * Copyright (C) 2008-2010 Lawrence Livermore National Security. |
| * Copyright (C) SchedMD LLC. |
| * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). |
| * Written by Morris Jette <jette1@llnl.gov> |
| * CODE-OCEC-09-009. All rights reserved. |
| * |
| * This file is part of Slurm, a resource management program. |
| * For details, see <https://slurm.schedmd.com/>. |
| * Please also read the included file: DISCLAIMER. |
| * |
| * Slurm is free software; you can redistribute it and/or modify it under |
| * the terms of the GNU General Public License as published by the Free |
| * Software Foundation; either version 2 of the License, or (at your option) |
| * any later version. |
| * |
| * In addition, as a special exception, the copyright holders give permission |
| * to link the code of portions of this program with the OpenSSL library under |
| * certain conditions as described in each individual source file, and |
| * distribute linked combinations including the two. You must obey the GNU |
| * General Public License in all respects for all of the code used other than |
| * OpenSSL. If you modify file(s) with this exception, you may extend this |
| * exception to your version of the file(s), but you are not obligated to do |
| * so. If you do not wish to do so, delete this exception statement from your |
| * version. If you delete this exception statement from all source files in |
| * the program, then also delete it here. |
| * |
| * Slurm is distributed in the hope that it will be useful, but WITHOUT ANY |
| * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
| * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more |
| * details. |
| * |
| * You should have received a copy of the GNU General Public License along |
| * with Slurm; if not, write to the Free Software Foundation, Inc., |
| * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
| \*****************************************************************************/ |
| |
| #include "slurm/slurm.h" |
| #include "src/common/proc_args.h" |
| #include "src/common/slurm_resource_info.h" |
| #include "src/scontrol/scontrol.h" |
| |
| extern int |
| scontrol_parse_part_options (int argc, char **argv, int *update_cnt_ptr, |
| update_part_msg_t *part_msg_ptr) |
| { |
| int i, min, max; |
| char *tag, *val; |
| int taglen, vallen; |
| |
| if (!update_cnt_ptr) { |
| error("scontrol_parse_part_options internal error, " |
| "update_cnt_ptr == NULL"); |
| exit_code = 1; |
| return SLURM_ERROR; |
| } |
| if (!part_msg_ptr) { |
| error("scontrol_parse_part_options internal error, " |
| "part_msg_ptr == NULL"); |
| exit_code = 1; |
| return SLURM_ERROR; |
| } |
| |
| for (i = 0; i < argc; i++) { |
| char plus_minus = '\0'; |
| tag = argv[i]; |
| val = strchr(argv[i], '='); |
| if (val) { |
| taglen = val - argv[i]; |
| if ((val[-1] == '+') || (val[-1] == '-')) { |
| plus_minus = val[-1]; |
| taglen--; |
| } |
| val++; |
| vallen = strlen(val); |
| } else { |
| exit_code = 1; |
| error("Invalid input: %s Request aborted", argv[i]); |
| return SLURM_ERROR; |
| } |
| |
| if (xstrncasecmp(tag, "PartitionName", MAX(taglen, 2)) == 0) { |
| part_msg_ptr->name = val; |
| (*update_cnt_ptr)++; |
| } else if (xstrncasecmp(tag, "MaxTime", MAX(taglen, 4)) == 0) { |
| int max_time = time_str2mins(val); |
| if ((max_time < 0) && (max_time != INFINITE)) { |
| exit_code = 1; |
| error("Invalid input %s", argv[i]); |
| return SLURM_ERROR; |
| } |
| part_msg_ptr->max_time = max_time; |
| (*update_cnt_ptr)++; |
| } |
| else if (xstrncasecmp(tag, "CpuBind", MAX(taglen, 7)) == 0) { |
| if (xlate_cpu_bind_str(val, &part_msg_ptr->cpu_bind) != |
| SLURM_SUCCESS) { |
| exit_code = 1; |
| error("Invalid input %s", argv[i]); |
| return SLURM_ERROR; |
| } |
| (*update_cnt_ptr)++; |
| } |
| else if (xstrncasecmp(tag, "DefaultTime", MAX(taglen, 8)) == 0){ |
| int default_time = time_str2mins(val); |
| if ((default_time < 0) && (default_time != INFINITE)) { |
| exit_code = 1; |
| error("Invalid input %s", argv[i]); |
| return SLURM_ERROR; |
| } |
| part_msg_ptr->default_time = default_time; |
| (*update_cnt_ptr)++; |
| } |
| else if (xstrncasecmp(tag, "MaxCPUsPerNode", |
| MAX(taglen, 4)) == 0) { |
| if ((xstrcasecmp(val,"UNLIMITED") == 0) || |
| (xstrcasecmp(val,"INFINITE") == 0)) { |
| part_msg_ptr->max_cpus_per_node = INFINITE; |
| } else if (parse_uint32(val, &part_msg_ptr-> |
| max_cpus_per_node)) { |
| error("Invalid MaxCPUsPerNode value: %s", val); |
| return SLURM_ERROR; |
| } |
| (*update_cnt_ptr)++; |
| } else if (!xstrncasecmp(tag, "MaxCPUsPerSocket", |
| MAX(taglen, 4))) { |
| if (!xstrcasecmp(val, "UNLIMITED") || |
| !xstrcasecmp(val, "INFINITE")) { |
| part_msg_ptr->max_cpus_per_socket = INFINITE; |
| } else if (parse_uint32(val, &part_msg_ptr-> |
| max_cpus_per_socket)) { |
| error("Invalid MaxCPUsPerSocket value: %s", |
| val); |
| return SLURM_ERROR; |
| } |
| (*update_cnt_ptr)++; |
| } else if (xstrncasecmp(tag, "MaxNodes", MAX(taglen, 4)) == 0) { |
| min = 1; |
| if ((xstrcasecmp(val,"UNLIMITED") == 0) || |
| (xstrcasecmp(val,"INFINITE") == 0)) { |
| part_msg_ptr->max_nodes = INFINITE; |
| } else if (!get_resource_arg_range(val, "MaxNodes", |
| &min, &max, false)) { |
| exit_code = 1; |
| } else { |
| part_msg_ptr->max_nodes = min; |
| } |
| (*update_cnt_ptr)++; |
| } |
| else if (xstrncasecmp(tag, "MinNodes", MAX(taglen, 2)) == 0) { |
| min = 1; |
| verify_node_count(val, &min, &max, NULL); |
| part_msg_ptr->min_nodes = min; |
| (*update_cnt_ptr)++; |
| } |
| else if (xstrncasecmp(tag, "Default", MAX(taglen, 7)) == 0) { |
| if (xstrncasecmp(val, "NO", MAX(vallen, 1)) == 0) |
| part_msg_ptr->flags |= PART_FLAG_DEFAULT_CLR; |
| else if (xstrncasecmp(val, "YES", MAX(vallen, 1)) == 0) |
| part_msg_ptr->flags |= PART_FLAG_DEFAULT; |
| else { |
| exit_code = 1; |
| error("Invalid input: %s", argv[i]); |
| error("Acceptable Default values are YES and NO"); |
| return SLURM_ERROR; |
| } |
| (*update_cnt_ptr)++; |
| } |
| else if (!xstrncasecmp(tag, "DisableRootJobs", MAX(taglen, 1))) { |
| if (xstrncasecmp(val, "NO", MAX(vallen, 1)) == 0) |
| part_msg_ptr->flags |= PART_FLAG_NO_ROOT_CLR; |
| else if (xstrncasecmp(val, "YES", MAX(vallen, 1)) == 0) |
| part_msg_ptr->flags |= PART_FLAG_NO_ROOT; |
| else { |
| exit_code = 1; |
| error("Invalid input: %s", argv[i]); |
| error("Acceptable DisableRootJobs values are YES and NO"); |
| return SLURM_ERROR; |
| } |
| (*update_cnt_ptr)++; |
| } |
| else if (!xstrncasecmp(tag, "ExclusiveUser", MAX(taglen, 1))) { |
| if (xstrncasecmp(val, "NO", MAX(vallen, 1)) == 0) |
| part_msg_ptr->flags |= PART_FLAG_EXC_USER_CLR; |
| else if (xstrncasecmp(val, "YES", MAX(vallen, 1)) == 0) |
| part_msg_ptr->flags |= PART_FLAG_EXCLUSIVE_USER; |
| else { |
| exit_code = 1; |
| error("Invalid input: %s", argv[i]); |
| error("Acceptable ExclusiveUser values are YES and NO"); |
| return SLURM_ERROR; |
| } |
| (*update_cnt_ptr)++; |
| } |
| else if (!xstrncasecmp(tag, "ExclusiveTopo", MAX(taglen, 1))) { |
| if (xstrncasecmp(val, "NO", MAX(vallen, 1)) == 0) |
| part_msg_ptr->flags |= PART_FLAG_EXC_TOPO_CLR; |
| else if (xstrncasecmp(val, "YES", MAX(vallen, 1)) == 0) |
| part_msg_ptr->flags |= PART_FLAG_EXCLUSIVE_TOPO; |
| else { |
| exit_code = 1; |
| error("Invalid input: %s", argv[i]); |
| error("Acceptable ExclusiveTopo values are YES and NO"); |
| return SLURM_ERROR; |
| } |
| (*update_cnt_ptr)++; |
| } |
| else if (xstrncasecmp(tag, "Hidden", MAX(taglen, 1)) == 0) { |
| if (xstrncasecmp(val, "NO", MAX(vallen, 1)) == 0) |
| part_msg_ptr->flags |= PART_FLAG_HIDDEN_CLR; |
| else if (xstrncasecmp(val, "YES", MAX(vallen, 1)) == 0) |
| part_msg_ptr->flags |= PART_FLAG_HIDDEN; |
| else { |
| exit_code = 1; |
| error("Invalid input: %s", argv[i]); |
| error("Acceptable Hidden values are YES and NO"); |
| return SLURM_ERROR; |
| } |
| (*update_cnt_ptr)++; |
| } |
| else if (xstrncasecmp(tag, "LLN", MAX(taglen, 1)) == 0) { |
| if (xstrncasecmp(val, "NO", MAX(vallen, 1)) == 0) |
| part_msg_ptr->flags |= PART_FLAG_LLN_CLR; |
| else if (xstrncasecmp(val, "YES", MAX(vallen, 1)) == 0) |
| part_msg_ptr->flags |= PART_FLAG_LLN; |
| else { |
| exit_code = 1; |
| error("Invalid input: %s", argv[i]); |
| error("Acceptable LLN values are YES and NO"); |
| return SLURM_ERROR; |
| } |
| (*update_cnt_ptr)++; |
| } |
| else if (xstrncasecmp(tag, "RootOnly", MAX(taglen, 3)) == 0) { |
| if (xstrncasecmp(val, "NO", MAX(vallen, 1)) == 0) |
| part_msg_ptr->flags |= PART_FLAG_ROOT_ONLY_CLR; |
| else if (xstrncasecmp(val, "YES", MAX(vallen, 1)) == 0) |
| part_msg_ptr->flags |= PART_FLAG_ROOT_ONLY; |
| else { |
| exit_code = 1; |
| error("Invalid input: %s", argv[i]); |
| error("Acceptable RootOnly values are YES and NO"); |
| return SLURM_ERROR; |
| } |
| (*update_cnt_ptr)++; |
| } |
| else if (xstrncasecmp(tag, "ReqResv", MAX(taglen, 3)) == 0) { |
| if (xstrncasecmp(val, "NO", MAX(vallen, 1)) == 0) |
| part_msg_ptr->flags |= PART_FLAG_REQ_RESV_CLR; |
| else if (xstrncasecmp(val, "YES", MAX(vallen, 1)) == 0) |
| part_msg_ptr->flags |= PART_FLAG_REQ_RESV; |
| else { |
| exit_code = 1; |
| error("Invalid input: %s", argv[i]); |
| error("Acceptable ReqResv values are YES and NO"); |
| return SLURM_ERROR; |
| } |
| (*update_cnt_ptr)++; |
| } |
| else if (!xstrncasecmp(tag, "OverSubscribe", MAX(taglen, 5)) || |
| !xstrncasecmp(tag, "Shared", MAX(taglen, 2))) { |
| char *colon_pos = strchr(val, ':'); |
| if (colon_pos) { |
| *colon_pos = '\0'; |
| vallen = strlen(val); |
| } |
| if (xstrncasecmp(val, "NO", MAX(vallen, 1)) == 0) { |
| part_msg_ptr->max_share = 1; |
| |
| } else if (xstrncasecmp(val, "EXCLUSIVE", |
| MAX(vallen, 1)) == 0) { |
| part_msg_ptr->max_share = 0; |
| |
| } else if (xstrncasecmp(val, "YES", MAX(vallen, 1)) |
| == 0) { |
| if (colon_pos) { |
| part_msg_ptr->max_share = |
| (uint16_t) strtol(colon_pos+1, |
| (char **) NULL, 10); |
| } else { |
| part_msg_ptr->max_share = (uint16_t) 4; |
| } |
| } else if (xstrncasecmp(val, "FORCE", MAX(vallen, 1)) |
| == 0) { |
| if (colon_pos) { |
| part_msg_ptr->max_share = |
| (uint16_t) strtol(colon_pos+1, |
| (char **) NULL, 10) | |
| SHARED_FORCE; |
| } else { |
| part_msg_ptr->max_share = |
| (uint16_t) 4 |SHARED_FORCE; |
| } |
| } else { |
| exit_code = 1; |
| error("Invalid input: %s", argv[i]); |
| error("Acceptable OverSubscribe values are NO, EXCLUSIVE, YES:#, and FORCE:#"); |
| return SLURM_ERROR; |
| } |
| (*update_cnt_ptr)++; |
| } |
| else if (xstrncasecmp(tag, "OverTimeLimit", MAX(taglen, 5)) |
| == 0) { |
| if ((xstrcasecmp(val,"UNLIMITED") == 0) || |
| (xstrcasecmp(val,"INFINITE") == 0)) { |
| part_msg_ptr->over_time_limit = |
| INFINITE16; |
| } else if (parse_uint16(val, &part_msg_ptr-> |
| over_time_limit)) { |
| error("Invalid OverTimeLimit value: %s", val); |
| return SLURM_ERROR; |
| } |
| (*update_cnt_ptr)++; |
| } |
| else if (!xstrncasecmp(tag, "PowerDownOnIdle", MAX(taglen, 1))) { |
| if (!xstrncasecmp(val, "NO", MAX(vallen, 1))) |
| part_msg_ptr->flags |= PART_FLAG_PDOI_CLR; |
| else if (!xstrncasecmp(val, "YES", MAX(vallen, 1))) |
| part_msg_ptr->flags |= PART_FLAG_PDOI; |
| else { |
| exit_code = 1; |
| error("Invalid input: %s", argv[i]); |
| error("Acceptable PowerDownOnIdle values are YES and NO"); |
| return SLURM_ERROR; |
| } |
| (*update_cnt_ptr)++; |
| } |
| else if (xstrncasecmp(tag, "PreemptMode", MAX(taglen, 3)) == 0) { |
| uint16_t new_mode = preempt_mode_num(val); |
| if (new_mode != NO_VAL16) { |
| if (new_mode & PREEMPT_MODE_GANG) { |
| error("PreemptMode=GANG is a cluster-wide option and cannot be set at partition level"); |
| return SLURM_ERROR; |
| } |
| part_msg_ptr->preempt_mode = new_mode; |
| } else { |
| error("Invalid input: %s", argv[i]); |
| return SLURM_ERROR; |
| } |
| (*update_cnt_ptr)++; |
| } |
| else if (!xstrncasecmp(tag, "Priority", MAX(taglen, 3))) { |
| if (parse_uint16(val, &part_msg_ptr->priority_tier)) { |
| error("Invalid Priority value: %s", val); |
| return SLURM_ERROR; |
| } |
| part_msg_ptr->priority_job_factor = |
| part_msg_ptr->priority_tier; |
| (*update_cnt_ptr)++; |
| } |
| else if (!xstrncasecmp(tag,"PriorityJobFactor",MAX(taglen, 3))) { |
| if (parse_uint16(val, |
| &part_msg_ptr->priority_job_factor)) { |
| error("Invalid PriorityJobFactor value: %s", |
| val); |
| return SLURM_ERROR; |
| } |
| (*update_cnt_ptr)++; |
| } |
| else if (!xstrncasecmp(tag, "PriorityTier", MAX(taglen, 3))) { |
| if (parse_uint16(val, &part_msg_ptr->priority_tier)) { |
| error("Invalid PriorityTier value: %s", val); |
| return SLURM_ERROR; |
| } |
| (*update_cnt_ptr)++; |
| } |
| else if (!xstrncasecmp(tag, "State", MAX(taglen, 2))) { |
| if (!xstrncasecmp(val, "INACTIVE", MAX(vallen, 1))) |
| part_msg_ptr->state_up = PARTITION_INACTIVE; |
| else if (!xstrncasecmp(val, "DOWN", MAX(vallen, 1))) |
| part_msg_ptr->state_up = PARTITION_DOWN; |
| else if (!xstrncasecmp(val, "UP", MAX(vallen, 1))) |
| part_msg_ptr->state_up = PARTITION_UP; |
| else if (!xstrncasecmp(val, "DRAIN", MAX(vallen, 1))) |
| part_msg_ptr->state_up = PARTITION_DRAIN; |
| else { |
| exit_code = 1; |
| error("Invalid input: %s", argv[i]); |
| error("Acceptable State values are UP, DOWN, DRAIN and INACTIVE"); |
| return SLURM_ERROR; |
| } |
| (*update_cnt_ptr)++; |
| } |
| else if (!xstrncasecmp(tag, "Nodes", MAX(taglen, 1))) { |
| if (plus_minus) |
| part_msg_ptr->nodes = |
| scontrol_process_plus_minus(plus_minus, |
| val, true); |
| else |
| part_msg_ptr->nodes = val; |
| (*update_cnt_ptr)++; |
| } |
| else if (!xstrncasecmp(tag, "AllowGroups", MAX(taglen, 6))) { |
| part_msg_ptr->allow_groups = val; |
| (*update_cnt_ptr)++; |
| } |
| else if (!xstrncasecmp(tag, "AllowAccounts", MAX(taglen, 6))) { |
| part_msg_ptr->allow_accounts = val; |
| (*update_cnt_ptr)++; |
| } |
| else if (!xstrncasecmp(tag, "AllowQos", MAX(taglen, 6))) { |
| part_msg_ptr->allow_qos = val; |
| (*update_cnt_ptr)++; |
| } |
| else if (!xstrncasecmp(tag, "DenyAccounts", MAX(taglen, 5))) { |
| part_msg_ptr->deny_accounts = val; |
| (*update_cnt_ptr)++; |
| } |
| else if (!xstrncasecmp(tag, "DenyQos", MAX(taglen, 5))) { |
| part_msg_ptr->deny_qos = val; |
| (*update_cnt_ptr)++; |
| } |
| else if (!xstrncasecmp(tag, "AllocNodes", MAX(taglen, 6))) { |
| part_msg_ptr->allow_alloc_nodes = val; |
| (*update_cnt_ptr)++; |
| } |
| else if (!xstrncasecmp(tag, "Alternate", MAX(taglen, 3))) { |
| part_msg_ptr->alternate = val; |
| (*update_cnt_ptr)++; |
| } |
| else if (!xstrncasecmp(tag, "GraceTime", MAX(taglen, 5))) { |
| if (parse_uint32(val, &part_msg_ptr->grace_time)) { |
| error ("Invalid GraceTime value: %s", val); |
| return SLURM_ERROR; |
| } |
| (*update_cnt_ptr)++; |
| } |
| else if (!xstrncasecmp(tag, "DefMemPerCPU", MAX(taglen, 10))) { |
| if (parse_uint64(val, &part_msg_ptr->def_mem_per_cpu)) { |
| error ("Invalid DefMemPerCPU value: %s", val); |
| return SLURM_ERROR; |
| } |
| part_msg_ptr->def_mem_per_cpu |= MEM_PER_CPU; |
| (*update_cnt_ptr)++; |
| } |
| else if (!xstrncasecmp(tag, "DefMemPerNode", MAX(taglen, 10))) { |
| if (parse_uint64(val, &part_msg_ptr->def_mem_per_cpu)) { |
| error ("Invalid DefMemPerNode value: %s", val); |
| return SLURM_ERROR; |
| } |
| (*update_cnt_ptr)++; |
| } |
| else if (!xstrncasecmp(tag, "MaxMemPerCPU", MAX(taglen, 10))) { |
| if (parse_uint64(val, &part_msg_ptr->max_mem_per_cpu)) { |
| error ("Invalid MaxMemPerCPU value: %s", val); |
| return SLURM_ERROR; |
| } |
| part_msg_ptr->max_mem_per_cpu |= MEM_PER_CPU; |
| (*update_cnt_ptr)++; |
| } |
| else if (!xstrncasecmp(tag, "MaxMemPerNode", MAX(taglen, 10))) { |
| if (parse_uint64(val, &part_msg_ptr->max_mem_per_cpu)) { |
| error ("Invalid MaxMemPerNode value: %s", val); |
| return SLURM_ERROR; |
| } |
| (*update_cnt_ptr)++; |
| } |
| else if (!xstrncasecmp(tag, "QoS", MAX(taglen, 3))) { |
| part_msg_ptr->qos_char = val; |
| (*update_cnt_ptr)++; |
| } |
| else if (!xstrncasecmp(tag, "JobDefaults", MAX(taglen, 4))) { |
| part_msg_ptr->job_defaults_str = val; |
| (*update_cnt_ptr)++; |
| } else if (!xstrncasecmp(tag, "Topology", MAX(taglen, 4))) { |
| part_msg_ptr->topology_name = val; |
| (*update_cnt_ptr)++; |
| } |
| else if (!xstrncasecmp(tag, "TresBillingWeights", |
| MAX(taglen, 1))) { |
| part_msg_ptr->billing_weights_str = val; |
| (*update_cnt_ptr)++; |
| } |
| else { |
| exit_code = 1; |
| error("Update of this parameter is not supported: %s\n", |
| argv[i]); |
| error("Request aborted"); |
| return SLURM_ERROR; |
| } |
| } |
| return SLURM_SUCCESS; |
| } |
| |
| |
| |
| /* |
| * scontrol_update_part - update the slurm partition configuration per the |
| * supplied arguments |
| * IN argc - count of arguments |
| * IN argv - list of arguments |
| * RET SLURM_SUCCESS if no slurm error, errno otherwise. parsing error prints |
| * error message and returns SLURM_SUCCESS |
| */ |
| extern int |
| scontrol_update_part (int argc, char **argv) |
| { |
| int update_cnt = 0; |
| update_part_msg_t part_msg; |
| int err; |
| |
| slurm_init_part_desc_msg ( &part_msg ); |
| err = scontrol_parse_part_options (argc, argv, &update_cnt, &part_msg); |
| if (err) |
| return err; |
| |
| if (part_msg.name == NULL) { |
| exit_code = 1; |
| error("PartitionName must be given."); |
| return SLURM_SUCCESS; |
| } |
| if (update_cnt <= 1) { |
| exit_code = 1; |
| error("No changes specified"); |
| return SLURM_SUCCESS; |
| } |
| |
| if (slurm_update_partition(&part_msg)) { |
| exit_code = 1; |
| return errno; |
| } else |
| return SLURM_SUCCESS; |
| } |
| |
| |
| |
| /* |
| * scontrol_create_part - create a slurm partition configuration per the |
| * supplied arguments |
| * IN argc - count of arguments |
| * IN argv - list of arguments |
| * RET SLURM_SUCCESS if no slurm error, errno otherwise. parsing error prints |
| * error message and returns SLURM_SUCCESS |
| */ |
| extern int |
| scontrol_create_part (int argc, char **argv) |
| { |
| int update_cnt = 0; |
| update_part_msg_t part_msg; |
| int err; |
| |
| slurm_init_part_desc_msg ( &part_msg ); |
| err = scontrol_parse_part_options (argc, argv, &update_cnt, &part_msg); |
| if (err) |
| return err; |
| |
| if (part_msg.name == NULL) { |
| exit_code = 1; |
| error("PartitionName must be given."); |
| return SLURM_SUCCESS; |
| } else if (xstrcasecmp(part_msg.name, "default") == 0) { |
| exit_code = 1; |
| error("PartitionName cannot be \"DEFAULT\"."); |
| return SLURM_SUCCESS; |
| } |
| |
| if (update_cnt == 0) { |
| exit_code = 1; |
| error("No parameters specified"); |
| return SLURM_SUCCESS; |
| } |
| |
| if (slurm_create_partition(&part_msg)) { |
| exit_code = 1; |
| slurm_perror("Error creating the partition"); |
| return errno; |
| } else |
| return SLURM_SUCCESS; |
| } |