From cc493f8fc56b13d7de6f7ba0a8c24537da19f27a Mon Sep 17 00:00:00 2001
From: Francois Chevallier <chevallierfrancois@free.fr>
Date: Mon, 25 Aug 2014 13:51:25 -0700
Subject: [PATCH] [PATCH 3/5] Add Layouts= conf pragma support in slurm.conf
 for layouts management

This new pragma will be used to define the list of layouts to load at startup.
It will consist of comma separated values of layouts type and optional names,
respecting the following pattern : Layouts=layout_type[/layout_name][,...]
In case the name would not be defined, "default" would be assumed.

(Adapted for slurm-14.11 by Matthieu Hautreux <matthieu.hautreux@cea.fr>)
---
 slurm/slurm.h.in                 |  1 +
 src/api/config_info.c            |  5 +++++
 src/common/read_config.c         |  6 ++++++
 src/common/slurm_protocol_api.c  | 17 +++++++++++++++++
 src/common/slurm_protocol_api.h  |  5 +++++
 src/common/slurm_protocol_pack.c |  3 +++
 src/slurmctld/proc_req.c         |  1 +
 7 files changed, 38 insertions(+)

diff --git a/slurm/slurm.h.in b/slurm/slurm.h.in
index fd299174f15..ef2f6dad21e 100644
--- a/slurm/slurm.h.in
+++ b/slurm/slurm.h.in
@@ -2215,6 +2215,7 @@ typedef struct slurm_ctl_conf {
 	uint16_t kill_wait;	/* seconds between SIGXCPU to SIGKILL
 				 * on job termination */
 	char *launch_type;	/* type of step launcher to use */
+	char *layouts;		/* comma separted list of layouts plugins */
 	char *licenses;		/* licenses available on this cluster */
 	char *licenses_used;	/* licenses used on this cluster */
 	uint16_t log_fmt;       /* Log file timestamp format */
diff --git a/src/api/config_info.c b/src/api/config_info.c
index 35b902599ca..96abdf87bc1 100644
--- a/src/api/config_info.c
+++ b/src/api/config_info.c
@@ -616,6 +616,11 @@ extern void *slurm_ctl_conf_2_key_pairs (slurm_ctl_conf_t* slurm_ctl_conf_ptr)
 	key_pair->value = xstrdup(slurm_ctl_conf_ptr->launch_type);
 	list_append(ret_list, key_pair);
 
+	key_pair = xmalloc(sizeof(config_key_pair_t));
+	key_pair->name = xstrdup("Layouts");
+	key_pair->value = xstrdup(slurm_ctl_conf_ptr->layouts);
+	list_append(ret_list, key_pair);
+
 	key_pair = xmalloc(sizeof(config_key_pair_t));
 	key_pair->name = xstrdup("Licenses");
 	key_pair->value = xstrdup(slurm_ctl_conf_ptr->licenses);
diff --git a/src/common/read_config.c b/src/common/read_config.c
index 8e684ed950e..27246f4ddc7 100644
--- a/src/common/read_config.c
+++ b/src/common/read_config.c
@@ -350,6 +350,7 @@ s_p_options_t slurm_conf_options[] = {
 	{"PartitionName", S_P_ARRAY, _parse_partitionname,
 	 _destroy_partitionname},
 	{"DownNodes", S_P_ARRAY, _parse_downnodes, _destroy_downnodes},
+	{"Layouts", S_P_STRING},
 
 	{NULL}
 };
@@ -2347,6 +2348,7 @@ free_slurm_conf (slurm_ctl_conf_t *ctl_conf_ptr, bool purge_node_hash)
 	xfree (ctl_conf_ptr->unkillable_program);
 	xfree (ctl_conf_ptr->version);
 	xfree (ctl_conf_ptr->z_char);
+	xfree (ctl_conf_ptr->layouts);
 
 	if (purge_node_hash)
 		_free_name_hashtbl();
@@ -2516,6 +2518,7 @@ init_slurm_conf (slurm_ctl_conf_t *ctl_conf_ptr)
 	ctl_conf_ptr->vsize_factor              = 0;
 	ctl_conf_ptr->wait_time			= (uint16_t) NO_VAL;
 	ctl_conf_ptr->kill_on_bad_exit	= 0;
+	xfree (ctl_conf_ptr->layouts);
 
 	_free_name_hashtbl();
 	_init_name_hashtbl();
@@ -4177,6 +4180,9 @@ _validate_and_set_defaults(slurm_ctl_conf_t *conf, s_p_hashtbl_t *hashtbl)
 	s_p_get_string(&conf->requeue_exit, "RequeueExit", hashtbl);
 	s_p_get_string(&conf->requeue_exit_hold, "RequeueExitHold", hashtbl);
 
+	if (!s_p_get_string(&conf->layouts, "Layouts", hashtbl))
+		conf->layouts = xstrdup("");
+
 	xfree(default_storage_type);
 	xfree(default_storage_loc);
 	xfree(default_storage_host);
diff --git a/src/common/slurm_protocol_api.c b/src/common/slurm_protocol_api.c
index 5a53a58e057..71466df22bf 100644
--- a/src/common/slurm_protocol_api.c
+++ b/src/common/slurm_protocol_api.c
@@ -2349,6 +2349,23 @@ char *slurm_get_slurmd_spooldir(void)
 	return slurmd_spooldir;
 }
 
+/* slurm_get_layouts
+ * RET comma seperated list of layouts in a string, must be xfreed by caller */
+char *slurm_get_layouts(void)
+{
+	char* layouts = NULL;
+	slurm_ctl_conf_t *conf;
+
+	if (slurmdbd_conf) {
+		layouts = xstrdup("");
+	} else {
+		conf = slurm_conf_lock();
+		layouts = xstrdup(conf->layouts);
+		slurm_conf_unlock();
+	}
+	return layouts;
+}
+
 /* Change general slurm communication errors to slurmctld specific errors */
 static void _remap_slurmctld_errno(void)
 {
diff --git a/src/common/slurm_protocol_api.h b/src/common/slurm_protocol_api.h
index ff8ac8fcb5c..c358eef3703 100644
--- a/src/common/slurm_protocol_api.h
+++ b/src/common/slurm_protocol_api.h
@@ -773,6 +773,11 @@ char *slurm_get_job_container_plugin(void);
  * RET slurmd_spooldir name, must be xfreed by caller */
 char *slurm_get_slurmd_spooldir(void);
 
+/* slurm_get_layouts
+ * RET comma seperated list of layouts in a string, must be xfreed by caller
+ */
+char *slurm_get_layouts(void);
+
 /**********************************************************************\
  * general message management functions used by slurmctld, slurmd
 \**********************************************************************/
diff --git a/src/common/slurm_protocol_pack.c b/src/common/slurm_protocol_pack.c
index 3aaa00ff2cd..97ed29362e9 100644
--- a/src/common/slurm_protocol_pack.c
+++ b/src/common/slurm_protocol_pack.c
@@ -5299,6 +5299,7 @@ _pack_slurm_ctl_conf_msg(slurm_ctl_conf_info_msg_t * build_ptr, Buf buffer,
 		pack16(build_ptr->kill_wait, buffer);
 
 		packstr(build_ptr->launch_type, buffer);
+		packstr(build_ptr->layouts, buffer);
 		packstr(build_ptr->licenses, buffer);
 		packstr(build_ptr->licenses_used, buffer);
 
@@ -6103,6 +6104,8 @@ _unpack_slurm_ctl_conf_msg(slurm_ctl_conf_info_msg_t **build_buffer_ptr,
 
 		safe_unpackstr_xmalloc(&build_ptr->launch_type,
 				       &uint32_tmp, buffer);
+		safe_unpackstr_xmalloc(&build_ptr->layouts,
+				       &uint32_tmp, buffer);
 		safe_unpackstr_xmalloc(&build_ptr->licenses,
 				       &uint32_tmp, buffer);
 		safe_unpackstr_xmalloc(&build_ptr->licenses_used,
diff --git a/src/slurmctld/proc_req.c b/src/slurmctld/proc_req.c
index 4fd1d34d64a..762eee76868 100644
--- a/src/slurmctld/proc_req.c
+++ b/src/slurmctld/proc_req.c
@@ -692,6 +692,7 @@ static void _fill_ctld_conf(slurm_ctl_conf_t * conf_ptr)
 	conf_ptr->kill_on_bad_exit    = conf->kill_on_bad_exit;
 
 	conf_ptr->launch_type         = xstrdup(conf->launch_type);
+	conf_ptr->layouts             = xstrdup(conf->layouts);
 	conf_ptr->licenses            = xstrdup(conf->licenses);
 	conf_ptr->licenses_used       = licenses_used;
 	conf_ptr->log_fmt             = conf->log_fmt;
-- 
GitLab