Loading plugins/slurm/slurmadmcli.c +98 −52 Original line number Diff line number Diff line #include <errno.h> #include <stdint.h> /* uint32_t, etc. */ #include <stdlib.h> /* strtoul */ #include <stdlib.h> /* strtoul, getenv */ #include <string.h> /* strchr, strncmp, strncpy */ #include <slurm/slurm.h> #include <slurm/spank.h> #include "admire.h" Loading Loading @@ -147,75 +148,68 @@ process_opts(int tag, const char *optarg, int remote) } int slurm_spank_init(spank_t sp, int ac, char **av) scord_register_job(const char *scord_proto, const char *scord_addr, const char *nodelist) { (void)ac; (void)av; spank_err_t rc = ESPANK_SUCCESS; int rc = 0; spank_context_t sctx = spank_context(); if (sctx == S_CTX_LOCAL || sctx == S_CTX_ALLOCATOR) { /* register adm/scord options */ struct spank_option *opt = &spank_opts[0]; while(opt->name) { rc = spank_option_register(sp, opt++); } ADM_server_t scord_server; scord_server = ADM_server_create(scord_proto, scord_addr); if (!scord_server) { slurm_error("slurmadmcli: scord server creation failed"); rc = -1; goto end; } return rc == ESPANK_SUCCESS ? 0 : -1; /* create list of nodes */ hostlist_t hl = slurm_hostlist_create(nodelist); if (!hl) { slurm_error("slurmadmcli: slurm_hostlist creation failed"); rc = -1; goto end; } /** * Called locally in srun, after jobid & stepid are available. **/ int slurm_spank_init_post_opt(spank_t sp, int ac, char **av) { (void)sp; (void)ac; (void)av; int rc = 0; if (!scord_flag) return 0; int nnodes = slurm_hostlist_count(hl); const char *scord_addr = SCORD_SERVER_DEFAULT; const char *scord_proto = SCORD_PROTO_DEFAULT; ADM_node_t *nodes = reallocarray(NULL, nnodes, sizeof(ADM_node_t)); if (!nodes) { slurm_error("slurmadmcli: out of memory"); rc = -1; goto end; } for (int i = 0; i < ac; i++) { if (!strncmp ("scord_addr=", av[i], 11)) { scord_addr = av[i] + 11; } else if (!strncmp ("scord_proto=", av[i], 12)) { scord_proto = av[i] + 12; } else { slurm_error("slurmadmcli: invalid option: %s", av[i]); return -1; size_t i = 0; char *nodename; while((nodename = slurm_hostlist_shift(hl))) { nodes[i] = ADM_node_create(nodename); if (!nodes[i]) { slurm_error("slurmadmcli: scord node creation failed"); rc = -1; goto end; } i++; } ADM_server_t scord_server; scord_server = ADM_server_create(scord_proto, scord_addr); if (!scord_server) { slurm_error("failed scord server creation"); ADM_adhoc_resources_t adhoc_resources; adhoc_resources = ADM_adhoc_resources_create(nodes, nnodes); if (!adhoc_resources) { slurm_error("slurmadmcli: adhoc_resources creation failed"); rc = -1; goto end; } ADM_adhoc_context_t adhoc_ctx; ADM_storage_t adhoc_storage; adhoc_ctx = ADM_adhoc_context_create(adhoc_mode,ADM_ADHOC_ACCESS_RDWR, adhoc_nnodes, adhoc_walltime, false); adhoc_resources, adhoc_walltime, false); if (!adhoc_ctx) { slurm_error("failed adhoc context creation"); slurm_error("slurmadmcli: adhoc_context creation failed"); rc = -1; goto end; } ADM_storage_t adhoc_storage; adhoc_storage = ADM_storage_create(adhoc_context_id, ADM_STORAGE_GEKKOFS, adhoc_ctx); if (!adhoc_storage) { slurm_error("failed adhoc storage options setting"); slurm_error("slurmadmcli: adhoc_storage creation failed"); rc = -1; goto end; } Loading @@ -224,23 +218,75 @@ slurm_spank_init_post_opt(spank_t sp, int ac, char **av) ADM_job_requirements_t scord_reqs; scord_reqs = ADM_job_requirements_create(NULL, 0, NULL, 0, adhoc_storage); if (!scord_reqs) { slurm_error("failed scord job requirements creation"); slurm_error("slurmadmcli: scord job_requirements creation"); rc = -1; goto end; } ADM_job_t scord_job; if (ADM_register_job(scord_server, scord_reqs, &scord_job) != ADM_SUCCESS) { slurm_error("failed to register scord job"); if (ADM_register_job(scord_server, adhoc_resources, scord_reqs, &scord_job) != ADM_SUCCESS) { slurm_error("slurmadmcli: scord job registration failed"); rc = -1; goto end; } end: slurm_hostlist_destroy(hl); ADM_adhoc_resources_destroy(adhoc_resources); ADM_remove_job(scord_server, scord_job); ADM_job_requirements_destroy(scord_reqs); ADM_storage_destroy(adhoc_storage); ADM_server_destroy(scord_server); return rc; } int slurm_spank_init(spank_t sp, int ac, char **av) { (void)ac; (void)av; spank_err_t rc = ESPANK_SUCCESS; spank_context_t sctx = spank_context(); if (sctx == S_CTX_LOCAL || sctx == S_CTX_ALLOCATOR) { /* register adm/scord options */ struct spank_option *opt = &spank_opts[0]; while(opt->name) { rc = spank_option_register(sp, opt++); } } return rc == ESPANK_SUCCESS ? 0 : -1; } int slurm_spank_local_user_init(spank_t sp, int ac, char **av) { (void)sp; const char *scord_addr = SCORD_SERVER_DEFAULT; const char *scord_proto = SCORD_PROTO_DEFAULT; for (int i = 0; i < ac; i++) { if (!strncmp ("scord_addr=", av[i], 11)) { scord_addr = av[i] + 11; } else if (!strncmp ("scord_proto=", av[i], 12)) { scord_proto = av[i] + 12; } else { slurm_error("slurmadmcli: invalid option: %s", av[i]); return -1; } } /* get list of nodes. /!\ at this point env SLURM_NODELIST is set, but not SLURM_JOB_NODELIST! */ const char *nodelist = getenv("SLURM_NODELIST"); if (!nodelist) { slurm_error("slurmadmcli: failed to get node list"); return -1; } return scord_register_job(scord_proto, scord_addr, nodelist); } No newline at end of file Loading
plugins/slurm/slurmadmcli.c +98 −52 Original line number Diff line number Diff line #include <errno.h> #include <stdint.h> /* uint32_t, etc. */ #include <stdlib.h> /* strtoul */ #include <stdlib.h> /* strtoul, getenv */ #include <string.h> /* strchr, strncmp, strncpy */ #include <slurm/slurm.h> #include <slurm/spank.h> #include "admire.h" Loading Loading @@ -147,75 +148,68 @@ process_opts(int tag, const char *optarg, int remote) } int slurm_spank_init(spank_t sp, int ac, char **av) scord_register_job(const char *scord_proto, const char *scord_addr, const char *nodelist) { (void)ac; (void)av; spank_err_t rc = ESPANK_SUCCESS; int rc = 0; spank_context_t sctx = spank_context(); if (sctx == S_CTX_LOCAL || sctx == S_CTX_ALLOCATOR) { /* register adm/scord options */ struct spank_option *opt = &spank_opts[0]; while(opt->name) { rc = spank_option_register(sp, opt++); } ADM_server_t scord_server; scord_server = ADM_server_create(scord_proto, scord_addr); if (!scord_server) { slurm_error("slurmadmcli: scord server creation failed"); rc = -1; goto end; } return rc == ESPANK_SUCCESS ? 0 : -1; /* create list of nodes */ hostlist_t hl = slurm_hostlist_create(nodelist); if (!hl) { slurm_error("slurmadmcli: slurm_hostlist creation failed"); rc = -1; goto end; } /** * Called locally in srun, after jobid & stepid are available. **/ int slurm_spank_init_post_opt(spank_t sp, int ac, char **av) { (void)sp; (void)ac; (void)av; int rc = 0; if (!scord_flag) return 0; int nnodes = slurm_hostlist_count(hl); const char *scord_addr = SCORD_SERVER_DEFAULT; const char *scord_proto = SCORD_PROTO_DEFAULT; ADM_node_t *nodes = reallocarray(NULL, nnodes, sizeof(ADM_node_t)); if (!nodes) { slurm_error("slurmadmcli: out of memory"); rc = -1; goto end; } for (int i = 0; i < ac; i++) { if (!strncmp ("scord_addr=", av[i], 11)) { scord_addr = av[i] + 11; } else if (!strncmp ("scord_proto=", av[i], 12)) { scord_proto = av[i] + 12; } else { slurm_error("slurmadmcli: invalid option: %s", av[i]); return -1; size_t i = 0; char *nodename; while((nodename = slurm_hostlist_shift(hl))) { nodes[i] = ADM_node_create(nodename); if (!nodes[i]) { slurm_error("slurmadmcli: scord node creation failed"); rc = -1; goto end; } i++; } ADM_server_t scord_server; scord_server = ADM_server_create(scord_proto, scord_addr); if (!scord_server) { slurm_error("failed scord server creation"); ADM_adhoc_resources_t adhoc_resources; adhoc_resources = ADM_adhoc_resources_create(nodes, nnodes); if (!adhoc_resources) { slurm_error("slurmadmcli: adhoc_resources creation failed"); rc = -1; goto end; } ADM_adhoc_context_t adhoc_ctx; ADM_storage_t adhoc_storage; adhoc_ctx = ADM_adhoc_context_create(adhoc_mode,ADM_ADHOC_ACCESS_RDWR, adhoc_nnodes, adhoc_walltime, false); adhoc_resources, adhoc_walltime, false); if (!adhoc_ctx) { slurm_error("failed adhoc context creation"); slurm_error("slurmadmcli: adhoc_context creation failed"); rc = -1; goto end; } ADM_storage_t adhoc_storage; adhoc_storage = ADM_storage_create(adhoc_context_id, ADM_STORAGE_GEKKOFS, adhoc_ctx); if (!adhoc_storage) { slurm_error("failed adhoc storage options setting"); slurm_error("slurmadmcli: adhoc_storage creation failed"); rc = -1; goto end; } Loading @@ -224,23 +218,75 @@ slurm_spank_init_post_opt(spank_t sp, int ac, char **av) ADM_job_requirements_t scord_reqs; scord_reqs = ADM_job_requirements_create(NULL, 0, NULL, 0, adhoc_storage); if (!scord_reqs) { slurm_error("failed scord job requirements creation"); slurm_error("slurmadmcli: scord job_requirements creation"); rc = -1; goto end; } ADM_job_t scord_job; if (ADM_register_job(scord_server, scord_reqs, &scord_job) != ADM_SUCCESS) { slurm_error("failed to register scord job"); if (ADM_register_job(scord_server, adhoc_resources, scord_reqs, &scord_job) != ADM_SUCCESS) { slurm_error("slurmadmcli: scord job registration failed"); rc = -1; goto end; } end: slurm_hostlist_destroy(hl); ADM_adhoc_resources_destroy(adhoc_resources); ADM_remove_job(scord_server, scord_job); ADM_job_requirements_destroy(scord_reqs); ADM_storage_destroy(adhoc_storage); ADM_server_destroy(scord_server); return rc; } int slurm_spank_init(spank_t sp, int ac, char **av) { (void)ac; (void)av; spank_err_t rc = ESPANK_SUCCESS; spank_context_t sctx = spank_context(); if (sctx == S_CTX_LOCAL || sctx == S_CTX_ALLOCATOR) { /* register adm/scord options */ struct spank_option *opt = &spank_opts[0]; while(opt->name) { rc = spank_option_register(sp, opt++); } } return rc == ESPANK_SUCCESS ? 0 : -1; } int slurm_spank_local_user_init(spank_t sp, int ac, char **av) { (void)sp; const char *scord_addr = SCORD_SERVER_DEFAULT; const char *scord_proto = SCORD_PROTO_DEFAULT; for (int i = 0; i < ac; i++) { if (!strncmp ("scord_addr=", av[i], 11)) { scord_addr = av[i] + 11; } else if (!strncmp ("scord_proto=", av[i], 12)) { scord_proto = av[i] + 12; } else { slurm_error("slurmadmcli: invalid option: %s", av[i]); return -1; } } /* get list of nodes. /!\ at this point env SLURM_NODELIST is set, but not SLURM_JOB_NODELIST! */ const char *nodelist = getenv("SLURM_NODELIST"); if (!nodelist) { slurm_error("slurmadmcli: failed to get node list"); return -1; } return scord_register_job(scord_proto, scord_addr, nodelist); } No newline at end of file