From d026422d6704ece9fa69a44de3e0f08165351be9 Mon Sep 17 00:00:00 2001
From: Phil Eckert <eckert2@llnl.gov>
Date: Thu, 12 Aug 2010 21:10:03 +0000
Subject: [PATCH] Added to the reservation module, can now do updates, creates
 and deletions.

---
 contribs/perlapi/libslurm/perl/Slurm.xs      | 36 +++++++++++++++
 contribs/perlapi/libslurm/perl/reservation.c | 47 ++++++++++++++++++++
 contribs/perlapi/libslurm/perl/slurm-perl.h  |  2 +
 3 files changed, 85 insertions(+)

diff --git a/contribs/perlapi/libslurm/perl/Slurm.xs b/contribs/perlapi/libslurm/perl/Slurm.xs
index 31ac7b7dafa..f53a75621da 100644
--- a/contribs/perlapi/libslurm/perl/Slurm.xs
+++ b/contribs/perlapi/libslurm/perl/Slurm.xs
@@ -427,6 +427,42 @@ slurm_load_reservations(slurm_t self = NULL)
 	OUTPUT:
 		RETVAL
 
+char *
+slurm_create_reservation(slurm_t self, HV* res_info = NULL)
+	PREINIT:
+		resv_desc_msg_t resv_msg;
+	CODE:
+		if(hv_to_update_reservation_msg(res_info, &resv_msg) < 0) {
+			XSRETURN_UNDEF;
+		}
+                RETVAL = slurm_create_reservation(&resv_msg);
+	OUTPUT:
+		RETVAL
+
+int
+slurm_update_reservation(slurm_t self, HV* res_info = NULL)
+	PREINIT:
+		resv_desc_msg_t resv_msg;
+	CODE:
+		if(hv_to_update_reservation_msg(res_info, &resv_msg) < 0) {
+			XSRETURN_UNDEF;
+		}
+                RETVAL = slurm_update_reservation(&resv_msg);
+	OUTPUT:
+		RETVAL
+
+int
+slurm_delete_reservation(slurm_t self, HV* res_info = NULL)
+	PREINIT:
+		reservation_name_msg_t resv_name;
+	CODE:
+		if(hv_to_delete_reservation_msg(res_info, &resv_name) < 0) {
+			XSRETURN_UNDEF;
+		}
+                RETVAL = slurm_delete_reservation(&resv_name);
+	OUTPUT:
+		RETVAL
+
 # To be implemented in perl code
 # slurm_print_reservation_info_msg
 # slurm_print_reservation_info
diff --git a/contribs/perlapi/libslurm/perl/reservation.c b/contribs/perlapi/libslurm/perl/reservation.c
index 2efd4063895..ab4ded3e5de 100644
--- a/contribs/perlapi/libslurm/perl/reservation.c
+++ b/contribs/perlapi/libslurm/perl/reservation.c
@@ -82,3 +82,50 @@ reserve_info_msg_to_hv(reserve_info_msg_t* reserve_info_msg, HV* hv)
 	return 0;
 }
 
+/*
+ * convert perl HV to resv_desc_msg_t.
+ */
+int
+hv_to_update_reservation_msg(HV* hv, resv_desc_msg_t* resv_msg)
+{
+ 	resv_msg->accounts = NULL;
+	resv_msg->duration = (uint32_t) NO_VAL;
+	resv_msg->end_time = (time_t) NO_VAL;
+	resv_msg->features = NULL;
+	resv_msg->flags = (uint16_t) NO_VAL;
+	resv_msg->licenses = NULL;
+	resv_msg->name = NULL;
+	resv_msg->node_cnt = (uint32_t) NO_VAL;
+	resv_msg->node_list = NULL;
+	resv_msg->partition = NULL;
+	resv_msg->start_time = (time_t) NO_VAL;
+	resv_msg->users = NULL;
+
+ 	FETCH_FIELD(hv, resv_msg, accounts, charp, FALSE);
+	FETCH_FIELD(hv, resv_msg, duration, uint32_t, FALSE);
+	FETCH_FIELD(hv, resv_msg, end_time, time_t, FALSE);
+	FETCH_FIELD(hv, resv_msg, features, charp, FALSE);
+	FETCH_FIELD(hv, resv_msg, flags, uint16_t, FALSE);
+	FETCH_FIELD(hv, resv_msg, licenses, charp, FALSE);
+	FETCH_FIELD(hv, resv_msg, name, charp, FALSE);
+	FETCH_FIELD(hv, resv_msg, node_cnt, uint32_t, FALSE);
+	FETCH_FIELD(hv, resv_msg, node_list, charp, FALSE);
+	FETCH_FIELD(hv, resv_msg, partition, charp, FALSE);
+	FETCH_FIELD(hv, resv_msg, start_time, time_t, FALSE);
+	FETCH_FIELD(hv, resv_msg, users, charp, FALSE);
+
+	return 0;
+}
+
+/*
+ * convert perl HV to reservation_name_msg_t.
+ */
+int
+hv_to_delete_reservation_msg(HV* hv, reservation_name_msg_t* resv_name)
+{
+	resv_name->name = NULL;
+
+	FETCH_FIELD(hv, resv_name, name, charp, FALSE);
+
+	return 0;
+}
diff --git a/contribs/perlapi/libslurm/perl/slurm-perl.h b/contribs/perlapi/libslurm/perl/slurm-perl.h
index 5e6a6d625a7..7aca3ed9d50 100644
--- a/contribs/perlapi/libslurm/perl/slurm-perl.h
+++ b/contribs/perlapi/libslurm/perl/slurm-perl.h
@@ -30,6 +30,8 @@ extern int hv_to_update_part_msg(HV* hv, update_part_msg_t* part_msg);
 extern int slurm_ctl_conf_to_hv(slurm_ctl_conf_t* conf, HV* hv);
 
 extern int reserve_info_msg_to_hv(reserve_info_msg_t* conf, HV* hv);
+extern int hv_to_update_reservation_msg(HV* hv, resv_desc_msg_t* resv_msg);
+extern int hv_to_delete_reservation_msg(HV* hv, reservation_name_msg_t* resv_name);
 
 extern int trigger_info_to_hv(trigger_info_t *info, HV* hv);
 extern int trigger_info_msg_to_hv(trigger_info_msg_t *msg, HV* hv);
-- 
GitLab