diff --git a/contribs/lua/job_submit.lua b/contribs/lua/job_submit.lua index 70c8567e00e3873ceac7b1b2c7c8edee0e5003dd..f5e9a6adc2df5d3a567c4e327e818ea4a31dd937 100644 --- a/contribs/lua/job_submit.lua +++ b/contribs/lua/job_submit.lua @@ -16,10 +16,13 @@ require "posix" --########################################################################-- -function slurm_job_submit ( job_desc_addr ) +function slurm_job_submit ( job_desc_addr, part_rec_addr ) local job_desc = { job_desc_ptr=job_desc_addr } + local part_rec = { part_rec_ptr=part_rec_addr } setmetatable (job_desc, job_req_meta) + setmetatable (part_rec, part_rec_meta) +log_info("part name:%s, nodes:%s", part_rec.name, part_rec.nodes) if job_desc.account == nil then local account = "***TEST_ACCOUNT***" log_info("slurm_job_submit: job from uid %d, setting default account value: %s", @@ -30,12 +33,15 @@ function slurm_job_submit ( job_desc_addr ) return end -function slurm_job_modify ( job_desc_addr, job_rec_addr ) +function slurm_job_modify ( job_desc_addr, job_rec_addr, part_rec_addr ) local job_desc = { job_desc_ptr=job_desc_addr } local job_rec = { job_rec_ptr=job_rec_addr } + local part_rec = { part_rec_ptr=part_rec_addr } setmetatable (job_desc, job_req_meta) setmetatable (job_rec, job_rec_meta) + setmetatable (part_rec, part_rec_meta) +log_info("part name:%s, nodes:%s", part_rec.name, part_rec.nodes) if job_desc.comment == nil then local comment = "***TEST_COMMENT***" log_info("slurm_job_modify: for job %u, setting default comment value: %s", @@ -50,6 +56,8 @@ end -- -- Initialization code: -- +-- Define functions for logging and accessing slurmctld structures +-- --########################################################################-- @@ -71,6 +79,11 @@ job_req_meta = { return _set_job_req_field(table.job_desc_ptr, key, value) end } +part_rec_meta = { + __index = function (table, key) + return _get_part_rec_field(table.part_rec_ptr, key) + end +} log_info("initialized") diff --git a/src/plugins/job_submit/lua/job_submit_lua.c b/src/plugins/job_submit/lua/job_submit_lua.c index 90c780aab1f6f73feca8a6db55c668f9046fb044..72a173660572a10805ecde4d270a3ef0ece01260 100644 --- a/src/plugins/job_submit/lua/job_submit_lua.c +++ b/src/plugins/job_submit/lua/job_submit_lua.c @@ -213,8 +213,9 @@ static void _register_lua_slurm_output_functions (void) lua_setglobal (L, "slurm"); } -/* Get fields in an existing job record - * NOTE: This is an incomplete list of job record fields, add more as needed */ +/* Get fields in an existing slurmctld job record + * NOTE: This is an incomplete list of job record fields. + * Add more as needed and send patches to slurm-dev@llnl.gov */ static int _get_job_rec_field (lua_State *L) { const struct job_record *job_ptr = lua_touserdata(L, 1); @@ -360,7 +361,7 @@ static int _get_job_req_field (lua_State *L) return 1; } -/* Set fields in the job request record on job submit or modify */ +/* Set fields in the job request structure on job submit or modify */ static int _set_job_req_field (lua_State *L) { struct job_descriptor *job_desc = lua_touserdata(L, 1); @@ -485,7 +486,48 @@ static int _set_job_req_field (lua_State *L) return 0; } -static void _register_lua_slurm_job_functions (void) +/* Get fields in an existing slurmctld partition record + * NOTE: This is an incomplete list of partition record fields. + * Add more as needed and send patches to slurm-dev@llnl.gov */ +static int _get_part_rec_field (lua_State *L) +{ + const struct part_record *part_ptr = lua_touserdata(L, 1); + const char *name = luaL_checkstring(L, 2); + + if (part_ptr == NULL) { + error("_get_part_field: part_ptr is NULL"); + lua_pushnil (L); + } else if (!strcmp(name, "max_nodes")) { + lua_pushnumber (L, part_ptr->max_nodes); + } else if (!strcmp(name, "max_nodes_orig")) { + lua_pushnumber (L, part_ptr->max_nodes_orig); + } else if (!strcmp(name, "max_time")) { + lua_pushnumber (L, part_ptr->max_time); + } else if (!strcmp(name, "min_nodes")) { + lua_pushnumber (L, part_ptr->min_nodes); + } else if (!strcmp(name, "min_nodes_orig")) { + lua_pushnumber (L, part_ptr->min_nodes_orig); + } else if (!strcmp(name, "name")) { + lua_pushstring (L, part_ptr->name); + } else if (!strcmp(name, "nodes")) { + lua_pushstring (L, part_ptr->nodes); + } else if (!strcmp(name, "priority")) { + lua_pushnumber (L, part_ptr->priority); + } else if (!strcmp(name, "state_up")) { + lua_pushnumber (L, part_ptr->state_up); + } else { + lua_pushnil (L); + } + + return 1; +} +#if 0 +/* Filter before packing list of partitions */ + char *allow_groups; /* comma delimited list of groups */ + uid_t *allow_uids; /* zero terminated list of allowed users */ +#endif + +static void _register_lua_slurm_struct_functions (void) { lua_pushcfunction(L, _get_job_rec_field); lua_setglobal(L, "_get_job_rec_field"); @@ -493,6 +535,8 @@ static void _register_lua_slurm_job_functions (void) lua_setglobal(L, "_get_job_req_field"); lua_pushcfunction(L, _set_job_req_field); lua_setglobal(L, "_set_job_req_field"); + lua_pushcfunction(L, _get_part_rec_field); + lua_setglobal(L, "_get_part_rec_field"); } /* @@ -567,10 +611,10 @@ int init (void) /* * Register SLURM functions in lua state: - * logging and job state read/write + * logging and slurm structure read/write functions */ _register_lua_slurm_output_functions(); - _register_lua_slurm_job_functions(); + _register_lua_slurm_struct_functions(); /* * Run the user script: @@ -616,7 +660,8 @@ extern int job_submit(struct job_descriptor *job_desc) goto out; lua_pushlightuserdata (L, job_desc); - if (lua_pcall (L, 1, 0, 0) != 0) { + lua_pushlightuserdata (L, default_part_loc); + if (lua_pcall (L, 2, 0, 0) != 0) { error("%s/lua: %s: %s", __func__, lua_script_path, lua_tostring (L, -1)); } else @@ -643,7 +688,8 @@ extern int job_modify(struct job_descriptor *job_desc, lua_pushlightuserdata (L, job_desc); lua_pushlightuserdata (L, job_ptr); - if (lua_pcall (L, 2, 0, 0) != 0) { + lua_pushlightuserdata (L, default_part_loc); + if (lua_pcall (L, 3, 0, 0) != 0) { error("%s/lua: %s: %s", __func__, lua_script_path, lua_tostring (L, -1)); } else