Blob Blame History Raw
From 5c25d7cae4de3d66792d90178c8b1f57a9cddf12 Mon Sep 17 00:00:00 2001
From: Andrew Beekhof <andrew@beekhof.net>
Date: Fri, 31 Mar 2017 11:41:52 +1100
Subject: [PATCH] PE: Containers: Allow custom docker run commands

---
 lib/pengine/container.c | 18 +++++++++++-------
 lib/pengine/variant.h   |  1 +
 xml/resources-2.8.rng   |  2 +-
 3 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/lib/pengine/container.c b/lib/pengine/container.c
index ed63b80..388dd88 100644
--- a/lib/pengine/container.c
+++ b/lib/pengine/container.c
@@ -222,6 +209,12 @@ create_docker_resource(
             offset += snprintf(buffer+offset, max-offset, " --net=%s", data->docker_network);
         }
 
+        if(data->control_port) {
+            offset += snprintf(buffer+offset, max-offset, " -e PCMK_remote_port=%s", data->control_port);
+        } else {
+            offset += snprintf(buffer+offset, max-offset, " -e PCMK_remote_port=%d", DEFAULT_REMOTE_PORT);
+        }
+
         for(GListPtr pIter = data->mounts; pIter != NULL; pIter = pIter->next) {
             container_mount_t *mount = pIter->data;
 
@@ -276,15 +263,11 @@ create_docker_resource(
         free(dbuffer);
 
         if(tuple->child) {
-            char *command = NULL;
-
-            if(data->control_port) {
-                command = crm_strdup_printf(SBIN_DIR"/pacemaker_remoted -p %s", data->control_port);
+            if(data->docker_run_command) {
+                create_nvp(xml_obj, "run_cmd", data->docker_run_command);
             } else {
-                command = crm_strdup_printf(SBIN_DIR"/pacemaker_remoted -p %d", DEFAULT_REMOTE_PORT);
+                create_nvp(xml_obj, "run_cmd", SBIN_DIR"/pacemaker_remoted");
             }
-            create_nvp(xml_obj, "run_cmd", command);
-            free(command);
 
             /* TODO: Allow users to specify their own?
              *
@@ -486,6 +470,7 @@ container_unpack(resource_t * rsc, pe_working_set_t * data_set)
         clear_bit(rsc->flags, pe_rsc_unique);
     }
 
+    container_data->docker_run_command = crm_element_value_copy(xml_obj, "run-command");
     container_data->docker_run_options = crm_element_value_copy(xml_obj, "options");
     container_data->image = crm_element_value_copy(xml_obj, "image");
     container_data->docker_network = crm_element_value_copy(xml_obj, "network");
@@ -886,6 +863,7 @@ container_free(resource_t * rsc)
     free(container_data->ip_range_start);
     free(container_data->docker_network);
     free(container_data->docker_run_options);
+    free(container_data->docker_run_command);
     free(container_data->docker_host_options);
 
     g_list_free_full(container_data->tuples, (GDestroyNotify)tuple_free);
diff --git a/lib/pengine/variant.h b/lib/pengine/variant.h
index aa2a1b7..c8fe159 100644
--- a/lib/pengine/variant.h
+++ b/lib/pengine/variant.h
@@ -99,6 +99,7 @@ typedef struct container_variant_data_s {
         char *ip_range_start;
         char *docker_host_options;
         char *docker_run_options;
+        char *docker_run_command;
 
         resource_t *child;
 
diff --git a/xml/resources-2.8.rng b/xml/resources-2.8.rng
index 870e804..5c83e07 100644
--- a/xml/resources-2.8.rng
+++ b/xml/resources-2.8.rng
@@ -84,6 +84,9 @@
           <optional>
             <attribute name="masters"><data type="integer"/></attribute>
           </optional>
+	      <optional>
+		<attribute name="run-command"> <text/></attribute>
+	      </optional>
           <optional>
             <attribute name="network"><text/></attribute>
           </optional>
-- 
1.8.3.1