File bsc#1171372-0006-Fix-fencer-add-port-or-plug-parameter-according-to-m.patch of Package pacemaker.27558

From 187683a8c831dc2836d5064660f244528e2c5169 Mon Sep 17 00:00:00 2001
From: "Gao,Yan" <ygao@suse.com>
Date: Thu, 30 Apr 2020 22:25:01 +0200
Subject: [PATCH 6/6] Fix: fencer: add `port` or `plug` parameter according to
 metadata for RHCS-style fence-agents

According to:
https://github.com/ClusterLabs/fence-agents/commit/de490e059

, `port` parameter is massively deprecated in favor of `plug`:

```
<parameter name="plug" ... obsoletes="port">...
<parameter name="port" ... deprecated="1">...
```

With this commit, according to the metadata, if `port` parameter is not
supported, `plug` parameter is added if supported. By default, `port`
is added.
---
 daemons/fenced/fenced_commands.c | 12 +++++++++++-
 include/crm/fencing/internal.h   |  4 +++-
 lib/fencing/st_client.c          | 20 +++++++++++++++-----
 lib/fencing/st_rhcs.c            |  4 ++--
 4 files changed, 31 insertions(+), 9 deletions(-)

Index: pacemaker-2.0.1+20190417.13d370ca9/daemons/fenced/fenced_commands.c
===================================================================
--- pacemaker-2.0.1+20190417.13d370ca9.orig/daemons/fenced/fenced_commands.c
+++ pacemaker-2.0.1+20190417.13d370ca9/daemons/fenced/fenced_commands.c
@@ -308,6 +308,7 @@ stonith_device_execute(stonith_device_t
 {
     int exec_rc = 0;
     const char *action_str = NULL;
+    const char *host_arg = NULL;
     async_command_t *cmd = NULL;
     stonith_action_t *action = NULL;
     int active_cmds = 0;
@@ -390,11 +391,19 @@ stonith_device_execute(stonith_device_t
         action_str = "off";
     }
 
+    if (is_set(device->flags, st_device_supports_parameter_port)) {
+        host_arg = "port";
+
+    } else if (is_set(device->flags, st_device_supports_parameter_plug)) {
+        host_arg = "plug";
+    }
+
     action = stonith_action_create(device->agent,
                                    action_str,
                                    cmd->victim,
                                    cmd->victim_nodeid,
-                                   cmd->timeout, device->params, device->aliases);
+                                   cmd->timeout, device->params,
+                                   device->aliases, host_arg);
 
     /* for async exec, exec_rc is pid if positive and error code if negative/zero */
     exec_rc = stonith_action_execute_async(action, (void *)cmd, cmd->done_cb);
@@ -958,6 +967,7 @@ build_device_from_xml(xmlNode * msg)
 
     device->agent_metadata = get_agent_metadata(device->agent);
     read_action_metadata(device);
+    set_bit(device->flags, stonith__device_parameter_flags(device->agent_metadata));
 
     value = g_hash_table_lookup(device->params, "nodeid");
     if (!value) {
Index: pacemaker-2.0.1+20190417.13d370ca9/include/crm/fencing/internal.h
===================================================================
--- pacemaker-2.0.1+20190417.13d370ca9.orig/include/crm/fencing/internal.h
+++ pacemaker-2.0.1+20190417.13d370ca9/include/crm/fencing/internal.h
@@ -30,7 +30,9 @@ stonith_action_t *stonith_action_create(
                                         const char *victim,
                                         uint32_t victim_nodeid,
                                         int timeout,
-                                        GHashTable * device_args, GHashTable * port_map);
+                                        GHashTable * device_args,
+                                        GHashTable * port_map,
+                                        const char * host_arg);
 void stonith__destroy_action(stonith_action_t *action);
 void stonith__action_result(stonith_action_t *action, int *rc, char **output,
                             char **error_output);
Index: pacemaker-2.0.1+20190417.13d370ca9/lib/fencing/st_client.c
===================================================================
--- pacemaker-2.0.1+20190417.13d370ca9.orig/lib/fencing/st_client.c
+++ pacemaker-2.0.1+20190417.13d370ca9/lib/fencing/st_client.c
@@ -477,8 +477,9 @@ append_config_arg(gpointer key, gpointer
 }
 
 static char *
-make_args(const char *agent, const char *action, const char *victim, uint32_t victim_nodeid, GHashTable * device_args,
-          GHashTable * port_map)
+make_args(const char *agent, const char *action, const char *victim,
+          uint32_t victim_nodeid, GHashTable * device_args,
+          GHashTable * port_map, const char *host_arg)
 {
     char buffer[512];
     char *arg_list = NULL;
@@ -522,7 +523,14 @@ make_args(const char *agent, const char
             value = agent;
 
         } else if (param == NULL) {
-            param = "port";
+            // By default, `port` is added
+            if (host_arg == NULL) {
+                param = "port";
+
+            } else {
+                param = host_arg;
+            }
+
             value = g_hash_table_lookup(device_args, param);
 
         } else if (safe_str_eq(param, "none")) {
@@ -673,12 +681,14 @@ stonith_action_create(const char *agent,
                       const char *_action,
                       const char *victim,
                       uint32_t victim_nodeid,
-                      int timeout, GHashTable * device_args, GHashTable * port_map)
+                      int timeout, GHashTable * device_args,
+                      GHashTable * port_map, const char *host_arg)
 {
     stonith_action_t *action;
 
     action = calloc(1, sizeof(stonith_action_t));
-    action->args = make_args(agent, _action, victim, victim_nodeid, device_args, port_map);
+    action->args = make_args(agent, _action, victim, victim_nodeid,
+                             device_args, port_map, host_arg);
     crm_debug("Preparing '%s' action for %s using agent %s",
               _action, (victim? victim : "no target"), agent);
     action->agent = strdup(agent);
Index: pacemaker-2.0.1+20190417.13d370ca9/lib/fencing/st_rhcs.c
===================================================================
--- pacemaker-2.0.1+20190417.13d370ca9.orig/lib/fencing/st_rhcs.c
+++ pacemaker-2.0.1+20190417.13d370ca9/lib/fencing/st_rhcs.c
@@ -122,7 +122,7 @@ stonith__rhcs_metadata(const char *agent
     xmlNode *actions = NULL;
     xmlXPathObject *xpathObj = NULL;
     stonith_action_t *action = stonith_action_create(agent, "metadata", NULL, 0,
-                                                     5, NULL, NULL);
+                                                     5, NULL, NULL, NULL);
     int rc = stonith__execute(action);
 
     if (rc < 0) {
@@ -212,7 +212,7 @@ stonith__rhcs_validate(stonith_t *st, in
     int rc = pcmk_ok;
     stonith_action_t *action = stonith_action_create(agent, "validate-all",
                                                      target, 0, timeout, params,
-                                                     NULL);
+                                                     NULL, NULL);
 
     rc = stonith__execute(action);
     if (rc == pcmk_ok) {
openSUSE Build Service is sponsored by