Commit aee6dada authored by Clément Barthélemy's avatar Clément Barthélemy Committed by Alberto Miranda
Browse files

plugins/slurm: libslurmadmcli add node list

parent ec3f066f
Loading
Loading
Loading
Loading
+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"
@@ -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;
	}
@@ -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