Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package fence-agents for openSUSE:Factory 
checked in at 2021-08-10 10:27:29
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/fence-agents (Old)
 and      /work/SRC/openSUSE:Factory/.fence-agents.new.1899 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "fence-agents"

Tue Aug 10 10:27:29 2021 rev:56 rq:910795 version:4.10.0+git.1626946937.8ade08b4

Changes:
--------
--- /work/SRC/openSUSE:Factory/fence-agents/fence-agents.changes        
2021-06-26 21:25:44.947365968 +0200
+++ /work/SRC/openSUSE:Factory/.fence-agents.new.1899/fence-agents.changes      
2021-08-10 10:27:41.261797151 +0200
@@ -1,0 +2,14 @@
+Thu Jul 29 05:53:12 UTC 2021 - [email protected]
+
+- Update to version 4.10.0+git.1626946937.8ade08b4:
+  * fence_kdump: accept message from multiple addresses (useful for RRP 
clusters) (#374)
+  * fence_pve: Replace `nodename` with `pmx-node` in fence_pve.py (matching 
original intent) (#424)
+  * spec: add dependency to new split packages for Fedora 35+
+  * log exceptions to be more detailed when failing
+  * Mid: fence_sbd: A warning message is output when disable-timeout is 
enabled.
+  * spec: export PYTHON to avoid configure ignoring it
+  * build: expose delay-check to be able to skip the other tests when debugging
+  * fence-kubevirt: Add fence-kubevirt declaration for rpm creation
+  * fence_kubevirt: Fix accept header param to openshift client
+
+-------------------------------------------------------------------

Old:
----
  fence-agents-4.9.0+git.1624631789.25ec70f0.tar.xz

New:
----
  fence-agents-4.10.0+git.1626946937.8ade08b4.tar.xz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ fence-agents.spec ++++++
--- /var/tmp/diff_new_pack.7Ap3Pj/_old  2021-08-10 10:27:41.709796632 +0200
+++ /var/tmp/diff_new_pack.7Ap3Pj/_new  2021-08-10 10:27:41.713796627 +0200
@@ -29,7 +29,7 @@
 Summary:        Fence Agents for High Availability
 License:        GPL-2.0-only AND LGPL-2.1-only
 Group:          Productivity/Clustering/HA
-Version:        4.9.0+git.1624631789.25ec70f0
+Version:        4.10.0+git.1626946937.8ade08b4
 Release:        0
 URL:            https://github.com/ClusterLabs/fence-agents
 Source0:        %{name}-%{version}.tar.xz

++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.7Ap3Pj/_old  2021-08-10 10:27:41.749796585 +0200
+++ /var/tmp/diff_new_pack.7Ap3Pj/_new  2021-08-10 10:27:41.753796581 +0200
@@ -1,4 +1,4 @@
 <servicedata>
 <service name="tar_scm">
             <param 
name="url">git://github.com/ClusterLabs/fence-agents.git</param>
-          <param 
name="changesrevision">25ec70f083e66918b3a8356845ca3acec4978248</param></service></servicedata>
\ No newline at end of file
+          <param 
name="changesrevision">8ade08b4d7e250a44ec1f591b9f18dd4a16aa5db</param></service></servicedata>
\ No newline at end of file

++++++ fence-agents-4.9.0+git.1624631789.25ec70f0.tar.xz -> 
fence-agents-4.10.0+git.1626946937.8ade08b4.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fence-agents-4.9.0+git.1624631789.25ec70f0/agents/apc/fence_apc.py 
new/fence-agents-4.10.0+git.1626946937.8ade08b4/agents/apc/fence_apc.py
--- old/fence-agents-4.9.0+git.1624631789.25ec70f0/agents/apc/fence_apc.py      
2021-06-25 16:36:29.000000000 +0200
+++ new/fence-agents-4.10.0+git.1626946937.8ade08b4/agents/apc/fence_apc.py     
2021-07-22 11:42:17.000000000 +0200
@@ -90,7 +90,8 @@
                try:
                        (_, status) = outlets[options["--plug"]]
                        return status.lower().strip()
-               except KeyError:
+               except KeyError as e:
+                       logging.error("Failed: {}".format(str(e)))
                        fail(EC_STATUS)
 
 def set_power_status(conn, options):
@@ -199,7 +200,8 @@
                try:
                        (_, status) = outlets[options["--plug"]]
                        return status.lower().strip()
-               except KeyError:
+               except KeyError as e:
+                       logging.error("Failed: {}".format(str(e)))
                        fail(EC_STATUS)
 
 def set_power_status5(conn, options):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fence-agents-4.9.0+git.1624631789.25ec70f0/agents/cisco_ucs/fence_cisco_ucs.py
 
new/fence-agents-4.10.0+git.1626946937.8ade08b4/agents/cisco_ucs/fence_cisco_ucs.py
--- 
old/fence-agents-4.9.0+git.1624631789.25ec70f0/agents/cisco_ucs/fence_cisco_ucs.py
  2021-06-25 16:36:29.000000000 +0200
+++ 
new/fence-agents-4.10.0+git.1626946937.8ade08b4/agents/cisco_ucs/fence_cisco_ucs.py
 2021-07-22 11:42:17.000000000 +0200
@@ -174,7 +174,8 @@
                if result == None:
                        ## Cookie is absenting in response
                        fail(EC_LOGIN_DENIED)
-       except Exception:
+       except Exception as e:
+               logging.error("Failed: {}".format(str(e)))
                fail(EC_LOGIN_DENIED)
 
        options_global["cookie"] = result.group(1)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fence-agents-4.9.0+git.1624631789.25ec70f0/agents/eps/fence_eps.py 
new/fence-agents-4.10.0+git.1626946937.8ade08b4/agents/eps/fence_eps.py
--- old/fence-agents-4.9.0+git.1624631789.25ec70f0/agents/eps/fence_eps.py      
2021-06-25 16:36:29.000000000 +0200
+++ new/fence-agents-4.10.0+git.1626946937.8ade08b4/agents/eps/fence_eps.py     
2021-07-22 11:42:17.000000000 +0200
@@ -56,7 +56,8 @@
                conn.close()
        except socket.timeout:
                fail(EC_TIMED_OUT)
-       except socket.error:
+       except socket.error as e:
+               logging.error("Failed: {}".format(str(e)))
                fail(EC_LOGIN_DENIED)
 
        return result
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fence-agents-4.9.0+git.1624631789.25ec70f0/agents/ilo_moonshot/fence_ilo_moonshot.py
 
new/fence-agents-4.10.0+git.1626946937.8ade08b4/agents/ilo_moonshot/fence_ilo_moonshot.py
--- 
old/fence-agents-4.9.0+git.1624631789.25ec70f0/agents/ilo_moonshot/fence_ilo_moonshot.py
    2021-06-25 16:36:29.000000000 +0200
+++ 
new/fence-agents-4.10.0+git.1626946937.8ade08b4/agents/ilo_moonshot/fence_ilo_moonshot.py
   2021-07-22 11:42:17.000000000 +0200
@@ -21,7 +21,8 @@
                try:
                        (_, status) = nodes[options["--plug"]]
                        return status.lower()
-               except KeyError:
+               except KeyError as e:
+                       logging.error("Failed: {}".format(str(e)))
                        fail(EC_STATUS)
 
 def set_power_status(conn, options):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fence-agents-4.9.0+git.1624631789.25ec70f0/agents/kdump/fence_kdump.c 
new/fence-agents-4.10.0+git.1626946937.8ade08b4/agents/kdump/fence_kdump.c
--- old/fence-agents-4.9.0+git.1624631789.25ec70f0/agents/kdump/fence_kdump.c   
2021-06-25 16:36:29.000000000 +0200
+++ new/fence-agents-4.10.0+git.1626946937.8ade08b4/agents/kdump/fence_kdump.c  
2021-07-22 11:42:17.000000000 +0200
@@ -82,39 +82,6 @@
 }
 
 static int
-read_message (const fence_kdump_node_t *node, void *msg, int len)
-{
-    int error;
-    char addr[NI_MAXHOST];
-    char port[NI_MAXSERV];
-    struct sockaddr_storage ss;
-    socklen_t size = sizeof (ss);
-
-    error = recvfrom (node->socket, msg, len, 0, (struct sockaddr *) &ss, 
&size);
-    if (error < 0) {
-        log_error (2, "recvfrom (%s)\n", strerror (errno));
-        goto out;
-    }
-
-    error = getnameinfo ((struct sockaddr *) &ss, size,
-                         addr, sizeof (addr),
-                         port, sizeof (port),
-                         NI_NUMERICHOST | NI_NUMERICSERV);
-    if (error != 0) {
-        log_error (2, "getnameinfo (%s)\n", gai_strerror (error));
-        goto out;
-    }
-
-    error = strcasecmp (node->addr, addr);
-    if (error != 0) {
-        log_debug (1, "discard message from '%s'\n", addr);
-    }
-
-out:
-    return (error);
-}
-
-static int
 do_action_monitor (void)
 {
     const char cmdline_path[] = "/proc/cmdline";
@@ -151,6 +118,12 @@
     fence_kdump_msg_t msg;
     fence_kdump_node_t *node;
     struct timeval timeout;
+    struct addrinfo hints;
+    fence_kdump_node_t *check_node;
+    char addr[NI_MAXHOST];
+    char port[NI_MAXSERV];
+    struct sockaddr_storage ss;
+    socklen_t size = sizeof (ss);
 
     if (list_empty (&opts->nodes)) {
         return (1);
@@ -164,7 +137,41 @@
     FD_ZERO (&rfds);
     FD_SET (node->socket, &rfds);
 
-    log_debug (0, "waiting for message from '%s'\n", node->addr);
+    // create listening socket
+    memset (&hints, 0, sizeof (hints));
+
+    hints.ai_family = opts->family;
+    hints.ai_socktype = SOCK_DGRAM;
+    hints.ai_protocol = IPPROTO_UDP;
+    hints.ai_flags = AI_NUMERICSERV;
+
+    hints.ai_family = node->info->ai_family;
+    hints.ai_flags |= AI_PASSIVE;
+
+    freeaddrinfo (node->info);
+
+    node->info = NULL;
+    error = getaddrinfo (NULL, node->port, &hints, &node->info);
+    if (error != 0) {
+        log_error (2, "getaddrinfo (%s)\n", gai_strerror (error));
+        free_node (node);
+        return (1);
+    }
+
+    error = bind (node->socket, node->info->ai_addr, node->info->ai_addrlen);
+    if (error != 0) {
+        log_error (2, "bind (%s)\n", strerror (errno));
+        free_node (node);
+        return (1);
+    }
+
+    list_for_each_entry (check_node, &opts->nodes, list) {
+        log_debug (0, "waiting for message from '%s'\n", check_node->addr);
+       if (node->info->ai_family != check_node->info->ai_family) {
+            log_error (0, "mixing IPv4 and IPv6 nodes is not supported\n");
+            return (1);
+       }
+    }
 
     for (;;) {
         error = select (node->socket + 1, &rfds, NULL, NULL, &timeout);
@@ -177,7 +184,18 @@
             break;
         }
 
-        if (read_message (node, &msg, sizeof (msg)) != 0) {
+        error = recvfrom (node->socket, &msg, sizeof (msg), 0, (struct 
sockaddr *) &ss, &size);
+        if (error < 0) {
+            log_error (2, "recvfrom (%s)\n", strerror (errno));
+            continue;
+        }
+
+        error = getnameinfo ((struct sockaddr *) &ss, size,
+                             addr, sizeof (addr),
+                             port, sizeof (port),
+                             NI_NUMERICHOST | NI_NUMERICSERV);
+        if (error != 0) {
+            log_error (2, "getnameinfo (%s)\n", gai_strerror (error));
             continue;
         }
 
@@ -186,14 +204,22 @@
             continue;
         }
 
-        switch (msg.version) {
-        case FENCE_KDUMP_MSGV1:
-            log_debug (0, "received valid message from '%s'\n", node->addr);
-            return (0);
-        default:
-            log_debug (1, "invalid message version '0x%X'\n", msg.version);
-            continue;
+        // check if we have matched messages from any known node
+        list_for_each_entry (check_node, &opts->nodes, list) {
+            error = strcasecmp (check_node->addr, addr);
+            if (error == 0 ) {
+                switch (msg.version) {
+                case FENCE_KDUMP_MSGV1:
+                    log_debug (0, "received valid message from '%s'\n", addr);
+                    return (0);
+                default:
+                    log_debug (1, "invalid message version '0x%X'\n", 
msg.version);
+                    continue;
+                }
+            }
         }
+    log_debug (1, "discard message from '%s'\n", addr);
+
     }
 
     return (1);
@@ -220,18 +246,21 @@
                      "message is received from the failed node, the node is 
considered to be\n"
                      "fenced and the agent returns success. Failure to receive 
a valid\n"
                      "message from the failed node in the given timeout period 
results in\n"
-                     "fencing failure.");
+                     "fencing failure. When multiple node names/IP addresses 
are specified\n"
+                     "a single valid message is sufficient for success. This 
is useful when\n"
+                     "single node can send message via several different IP 
addresses.\n");
     fprintf (stdout, "</longdesc>\n");
     fprintf (stdout, 
"<vendor-url>http://www.kernel.org/pub/linux/utils/kernel/kexec/</vendor-url>\n");
 
     fprintf (stdout, "<parameters>\n");
 
     fprintf (stdout, "\t<parameter name=\"nodename\" unique=\"0\" 
required=\"0\">\n");
-    fprintf (stdout, "\t\t<getopt mixed=\"-n, --nodename=NODE\" />\n");
+    fprintf (stdout, "\t\t<getopt mixed=\"-n, --nodename=NODE[,NODE...]\" 
/>\n");
     fprintf (stdout, "\t\t<content type=\"string\" />\n");
     fprintf (stdout, "\t\t<shortdesc lang=\"en\">%s</shortdesc>\n",
-             "Name or IP address of node to be fenced. This option is required 
for\n"
-             "the \"off\" action.");
+             "List of names or IP addresses of node to be fenced. This option 
is\n"
+            "required for the \"off\" action. Multiple values separated by 
commas\n"
+            "can be specified. All values must be of same IP network family." 
);
     fprintf (stdout, "\t</parameter>\n");
 
     fprintf (stdout, "\t<parameter name=\"ipport\" unique=\"0\" 
required=\"0\">\n");
@@ -311,7 +340,7 @@
     fprintf (stdout, "Options:\n");
     fprintf (stdout, "\n");
     fprintf (stdout, "%s\n",
-             "  -n, --nodename=NODE          Name or IP address of node to be 
fenced");
+             "  -n, --nodename=NODE[,NODE...]List of names or IP addresses of 
node to be fenced");
     fprintf (stdout, "%s\n",
              "  -p, --ipport=PORT            IP port number (default: 7410)");
     fprintf (stdout, "%s\n",
@@ -373,19 +402,6 @@
         return (1);
     }
 
-    hints.ai_family = node->info->ai_family;
-    hints.ai_flags |= AI_PASSIVE;
-
-    freeaddrinfo (node->info);
-
-    node->info = NULL;
-    error = getaddrinfo (NULL, node->port, &hints, &node->info);
-    if (error != 0) {
-        log_error (2, "getaddrinfo (%s)\n", gai_strerror (error));
-        free_node (node);
-        return (1);
-    }
-
     node->socket = socket (node->info->ai_family,
                            node->info->ai_socktype,
                            node->info->ai_protocol);
@@ -395,13 +411,6 @@
         return (1);
     }
 
-    error = bind (node->socket, node->info->ai_addr, node->info->ai_addrlen);
-    if (error != 0) {
-        log_error (2, "bind (%s)\n", strerror (errno));
-        free_node (node);
-        return (1);
-    }
-
     list_add_tail (&node->list, &opts->nodes);
 
     return (0);
@@ -521,6 +530,8 @@
 {
     int error = 1;
     fence_kdump_opts_t opts;
+    char *ptr;
+    char *node_list;
 
     init_options (&opts);
 
@@ -537,13 +548,24 @@
             log_error (0, "action 'off' requires nodename\n");
             exit (1);
         }
-        if (get_options_node (&opts) != 0) {
-            log_error (0, "failed to get node '%s'\n", opts.nodename);
-            exit (1);
+        node_list = (char *)malloc(strlen(opts.nodename)+1);
+
+        strcpy(node_list, opts.nodename); //make local copy of nodename on 
which we can safely iterate
+        // iterate through node_list
+        for (ptr = strtok(node_list, ","); ptr != NULL; ptr = strtok(NULL, 
",")) {
+            set_option_nodename (&opts, ptr); //overwrite nodename for next 
function
+            if (get_options_node (&opts) != 0) {
+                log_error (0, "failed to get node '%s'\n", opts.nodename);
+                exit (1);
+            }
         }
+        free(node_list);
     }
 
     if (verbose != 0) {
+        //clear nodename to avoid showing just last nodename here
+        free(opts.nodename);
+        opts.nodename = NULL;
         print_options (&opts);
     }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fence-agents-4.9.0+git.1624631789.25ec70f0/agents/kubevirt/fence_kubevirt.py
 
new/fence-agents-4.10.0+git.1626946937.8ade08b4/agents/kubevirt/fence_kubevirt.py
--- 
old/fence-agents-4.9.0+git.1624631789.25ec70f0/agents/kubevirt/fence_kubevirt.py
    2021-06-25 16:36:29.000000000 +0200
+++ 
new/fence-agents-4.10.0+git.1626946937.8ade08b4/agents/kubevirt/fence_kubevirt.py
   2021-07-22 11:42:17.000000000 +0200
@@ -81,7 +81,7 @@
 def virtctl_vm_action(conn, action, namespace, name):
     path = 
'/apis/subresources.{api_version}/namespaces/{namespace}/virtualmachines/{name}/{action}'
     path = path.format(api_version=API_VERSION, namespace=namespace, 
name=name, action=action)
-    return conn.request('put', path, accept_header='*/*')
+    return conn.request('put', path, header_params={'accept': '*/*'})
 
 def validate_options(required_options_list, options):
     for required_option in required_options_list:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fence-agents-4.9.0+git.1624631789.25ec70f0/agents/lpar/fence_lpar.py 
new/fence-agents-4.10.0+git.1626946937.8ade08b4/agents/lpar/fence_lpar.py
--- old/fence-agents-4.9.0+git.1624631789.25ec70f0/agents/lpar/fence_lpar.py    
2021-06-25 16:36:29.000000000 +0200
+++ new/fence-agents-4.10.0+git.1626946937.8ade08b4/agents/lpar/fence_lpar.py   
2021-07-22 11:42:17.000000000 +0200
@@ -37,7 +37,8 @@
                try:
                        status = re.compile("^" + options["--plug"] + 
",(.*?),.*$",
                                        re.IGNORECASE | 
re.MULTILINE).search(conn.before).group(1)
-               except AttributeError:
+               except AttributeError as e:
+                       logging.error("Failed: {}".format(str(e)))
                        fail(EC_STATUS_HMC)
        elif options["--hmc-version"] in ["4", "IVM"]:
                conn.send("lssyscfg -r lpar -m "+ options["--managed"] +
@@ -49,7 +50,8 @@
 
                try:
                        status = re.compile(",state=(.*?),", 
re.IGNORECASE).search(conn.before).group(1)
-               except AttributeError:
+               except AttributeError as e:
+                       logging.error("Failed: {}".format(str(e)))
                        fail(EC_STATUS_HMC)
 
        return _normalize_status(status)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fence-agents-4.9.0+git.1624631789.25ec70f0/agents/ovh/fence_ovh.py 
new/fence-agents-4.10.0+git.1626946937.8ade08b4/agents/ovh/fence_ovh.py
--- old/fence-agents-4.9.0+git.1624631789.25ec70f0/agents/ovh/fence_ovh.py      
2021-06-25 16:36:29.000000000 +0200
+++ new/fence-agents-4.10.0+git.1626946937.8ade08b4/agents/ovh/fence_ovh.py     
2021-07-22 11:42:17.000000000 +0200
@@ -66,7 +66,8 @@
        try:
                soap = Client(url, doctor=d)
                session = soap.service.login(options["--username"], 
options["--password"], 'en', 0)
-       except Exception:
+       except Exception as e:
+               logging.error("Failed: {}".format(str(e)))
                fail(EC_LOGIN_DENIED)
 
        options["session"] = session
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fence-agents-4.9.0+git.1624631789.25ec70f0/agents/pve/fence_pve.py 
new/fence-agents-4.10.0+git.1626946937.8ade08b4/agents/pve/fence_pve.py
--- old/fence-agents-4.9.0+git.1624631789.25ec70f0/agents/pve/fence_pve.py      
2021-06-25 16:36:29.000000000 +0200
+++ new/fence-agents-4.10.0+git.1626946937.8ade08b4/agents/pve/fence_pve.py     
2021-07-22 11:42:17.000000000 +0200
@@ -11,7 +11,7 @@
 import atexit
 import logging
 sys.path.append("@FENCEAGENTSLIBDIR@")
-from fencing import fail, EC_LOGIN_DENIED, atexit_handler, all_opt, 
check_input, process_input, show_docs, fence_action, run_delay
+from fencing import fail, fail_usage, EC_LOGIN_DENIED, atexit_handler, 
all_opt, check_input, process_input, show_docs, fence_action, run_delay
 
 if sys.version_info[0] > 2: import urllib.parse as urllib
 else: import urllib
@@ -19,23 +19,23 @@
 def get_power_status(conn, options):
        del conn
        state = {"running" : "on", "stopped" : "off"}
-       if options["--nodename"] is None:
+       if options["--pve-node"] is None:
                nodes = send_cmd(options, "nodes")
                if type(nodes) is not dict or "data" not in nodes or 
type(nodes["data"]) is not list:
                        return None
                for node in nodes["data"]: # lookup the node holding the vm
                        if type(node) is not dict or "node" not in node:
                                return None
-                       options["--nodename"] = node["node"]
+                       options["--pve-node"] = node["node"]
                        status = get_power_status(None, options)
                        if status is not None:
-                               logging.info("vm found on node: " + 
options["--nodename"])
+                               logging.info("vm found on node: " + 
options["--pve-node"])
                                break
                        else:
-                               options["--nodename"] = None
+                               options["--pve-node"] = None
                return status
        else:
-               cmd = "nodes/" + options["--nodename"] + "/" + 
options["--vmtype"] +"/" + options["--plug"] + "/status/current"
+               cmd = "nodes/" + options["--pve-node"] + "/" + 
options["--vmtype"] +"/" + options["--plug"] + "/status/current"
                result = send_cmd(options, cmd)
                if type(result) is dict and "data" in result:
                        if type(result["data"]) is dict and "status" in 
result["data"]:
@@ -50,13 +50,13 @@
                'on' : "start",
                'off': "stop"
        }[options["--action"]]
-       cmd = "nodes/" + options["--nodename"] + "/" + options["--vmtype"] +"/" 
+ options["--plug"] + "/status/" + action
+       cmd = "nodes/" + options["--pve-node"] + "/" + options["--vmtype"] +"/" 
+ options["--plug"] + "/status/" + action
        send_cmd(options, cmd, post={"skiplock":1})
 
 
 def reboot_cycle(conn, options):
        del conn
-       cmd = "nodes/" + options["--nodename"] + "/" + options["--vmtype"] + 
"/" + options["--plug"] + "/status/reset"
+       cmd = "nodes/" + options["--pve-node"] + "/" + options["--vmtype"] + 
"/" + options["--plug"] + "/status/reset"
        result = send_cmd(options, cmd, post={"skiplock":1})
        return type(result) is dict and "data" in result
 
@@ -139,21 +139,41 @@
 def main():
        atexit.register(atexit_handler)
 
-       all_opt["node_name"] = {
+       all_opt["pve_node_auto"] = {
+               "getopt" : "A",
+               "longopt" : "pve-node-auto",
+               "help" : "-A, --pve-node-auto            "
+                       "Automatically select proxmox node",
+               "required" : "0",
+               "shortdesc" : "Automatically select proxmox node. "
+                       "(This option overrides --pve-node)",
+               "type": "boolean",
+               "order": 2
+       }
+       all_opt["pve_node"] = {
                "getopt" : "N:",
-               "longopt" : "nodename",
-               "help" : "-N, --nodename                 "
-                       "Node on which machine is located",
+               "longopt" : "pve-node",
+               "help" : "-N, --pve-node=[node_name]     "
+                       "Proxmox node name on which machine is located",
                "required" : "0",
-               "shortdesc" : "Node on which machine is located. "
-                       "(Optional, will be automatically determined)",
+               "shortdesc" : "Proxmox node name on which machine is located. "
+                       "(Must be specified if not using --pve-node-auto)",
                "order": 2
        }
+       all_opt["node_name"] = {
+               "getopt" : ":",
+               "longopt" : "nodename",
+               "help" : "--nodename                     "
+                       "Replaced by --pve-node",
+               "required" : "0",
+               "shortdesc" : "Replaced by --pve-node",
+               "order": 3
+       }
        all_opt["vmtype"] = {
                "getopt" : ":",
                "longopt" : "vmtype",
                "default" : "qemu",
-               "help" : "--vmtype                                         "
+               "help" : "--vmtype                       "
                        "Virtual machine type lxc or qemu (default: qemu)",
                "required" : "1",
                "shortdesc" : "Virtual machine type lxc or qemu. "
@@ -161,7 +181,7 @@
                "order": 2
        }
 
-       device_opt = ["ipaddr", "login", "passwd", "web", "port", "node_name", 
"vmtype", "method"]
+       device_opt = ["ipaddr", "login", "passwd", "web", "port", "pve_node", 
"pve_node_auto", "node_name", "vmtype", "method"]
 
        all_opt["login"]["required"] = "0"
        all_opt["login"]["default"] = "root@pam"
@@ -181,8 +201,18 @@
 
        run_delay(options)
 
-       if "--nodename" not in options or not options["--nodename"]:
-               options["--nodename"] = None
+       if "--pve-node-auto" in options:
+               # Force pve-node to None to allow autodiscovery
+               options["--pve-node"] = None
+       elif "--pve-node" in options and options["--pve-node"]:
+               # Leave pve-node alone
+               pass
+       elif "--nodename" in options and options["--nodename"]:
+               # map nodename into pve-node to support legacy implementations
+               options["--pve-node"] = options["--nodename"]
+       else:
+               fail_usage("At least one of pve-node-auto or pve-node must be 
supplied")
+
 
        if options["--vmtype"] != "qemu":
                # For vmtypes other than qemu, only the onoff method is valid
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fence-agents-4.9.0+git.1624631789.25ec70f0/agents/sanbox2/fence_sanbox2.py 
new/fence-agents-4.10.0+git.1626946937.8ade08b4/agents/sanbox2/fence_sanbox2.py
--- 
old/fence-agents-4.9.0+git.1624631789.25ec70f0/agents/sanbox2/fence_sanbox2.py  
    2021-06-25 16:36:29.000000000 +0200
+++ 
new/fence-agents-4.10.0+git.1626946937.8ade08b4/agents/sanbox2/fence_sanbox2.py 
    2021-07-22 11:42:17.000000000 +0200
@@ -28,7 +28,8 @@
                        conn.send_eol("admin end")
                        conn.send_eol("exit")
                        conn.close()
-               except Exception:
+               except Exception as e:
+                       logging.error("Failed: {}".format(str(e)))
                        pass
                fail(EC_TIMED_OUT)
 
@@ -54,7 +55,8 @@
                        conn.send_eol("admin end")
                        conn.send_eol("exit")
                        conn.close()
-               except Exception:
+               except Exception as e:
+                       logging.error("Failed: {}".format(str(e)))
                        pass
                fail(EC_TIMED_OUT)
 
@@ -66,7 +68,8 @@
                        conn.send_eol("admin end")
                        conn.send_eol("exit")
                        conn.close()
-               except Exception:
+               except Exception as e:
+                       logging.error("Failed: {}".format(str(e)))
                        pass
                fail(EC_TIMED_OUT)
 
@@ -91,7 +94,8 @@
                        conn.send_eol("admin end")
                        conn.send_eol("exit")
                        conn.close()
-               except Exception:
+               except Exception as e:
+                       logging.error("Failed: {}".format(str(e)))
                        pass
                fail(EC_TIMED_OUT)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fence-agents-4.9.0+git.1624631789.25ec70f0/agents/sbd/fence_sbd.py 
new/fence-agents-4.10.0+git.1626946937.8ade08b4/agents/sbd/fence_sbd.py
--- old/fence-agents-4.9.0+git.1624631789.25ec70f0/agents/sbd/fence_sbd.py      
2021-06-25 16:36:29.000000000 +0200
+++ new/fence-agents-4.10.0+git.1626946937.8ade08b4/agents/sbd/fence_sbd.py     
2021-07-22 11:42:17.000000000 +0200
@@ -398,7 +398,7 @@
     # then that defined within sbd we should report this.
     power_timeout = int(options["--power-timeout"])
     sbd_msg_timeout = get_msg_timeout(options)
-    if power_timeout <= sbd_msg_timeout:
+    if 0 < power_timeout <= sbd_msg_timeout:
         logging.warn("power timeout needs to be \
                 greater then sbd message timeout")
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fence-agents-4.9.0+git.1624631789.25ec70f0/agents/vmware_soap/fence_vmware_soap.py
 
new/fence-agents-4.10.0+git.1626946937.8ade08b4/agents/vmware_soap/fence_vmware_soap.py
--- 
old/fence-agents-4.9.0+git.1624631789.25ec70f0/agents/vmware_soap/fence_vmware_soap.py
      2021-06-25 16:36:29.000000000 +0200
+++ 
new/fence-agents-4.10.0+git.1626946937.8ade08b4/agents/vmware_soap/fence_vmware_soap.py
     2021-07-22 11:42:17.000000000 +0200
@@ -68,7 +68,8 @@
                conn.service.Login(mo_SessionManager, options["--username"], 
options["--password"])
        except requests.exceptions.SSLError as ex:
                fail_usage("Server side certificate verification failed: %s" % 
ex)
-       except Exception:
+       except Exception as e:
+               logging.error("Server side certificate verification failed: 
{}".format(str(e)))
                fail(EC_LOGIN_DENIED)
 
        options["ServiceContent"] = ServiceContent
@@ -126,7 +127,8 @@
 
        try:
                raw_machines = 
conn.service.RetrievePropertiesEx(mo_PropertyCollector, propFilterSpec)
-       except Exception:
+       except Exception as e:
+               logging.error("Failed: {}".format(str(e)))
                fail(EC_STATUS)
 
        (machines, uuid, mappingToUUID) = process_results(raw_machines, {}, {}, 
{})
@@ -135,7 +137,8 @@
        while hasattr(raw_machines, 'token'):
                try:
                        raw_machines = 
conn.service.ContinueRetrievePropertiesEx(mo_PropertyCollector, 
raw_machines.token)
-               except Exception:
+               except Exception as e:
+                       logging.error("Failed: {}".format(str(e)))
                        fail(EC_STATUS)
                (more_machines, more_uuid, more_mappingToUUID) = 
process_results(raw_machines, {}, {}, {})
                machines.update(more_machines)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fence-agents-4.9.0+git.1624631789.25ec70f0/configure.ac 
new/fence-agents-4.10.0+git.1626946937.8ade08b4/configure.ac
--- old/fence-agents-4.9.0+git.1624631789.25ec70f0/configure.ac 2021-06-25 
16:36:29.000000000 +0200
+++ new/fence-agents-4.10.0+git.1626946937.8ade08b4/configure.ac        
2021-07-22 11:42:17.000000000 +0200
@@ -503,7 +503,7 @@
 CPPFLAGS="-I\$(top_builddir)/make -I\$(top_srcdir)/make -I. $ENV_CPPFLAGS"
 LDFLAGS="$ENV_LDFLAGS"
 
-AM_EXTRA_RECURSIVE_TARGETS([xml-check xml-upload])
+AM_EXTRA_RECURSIVE_TARGETS([delay-check xml-check xml-upload])
 
 AX_PROG_DATE
 AS_IF([test "$ax_cv_prog_date_gnu_date:$ax_cv_prog_date_gnu_utc" = yes:yes],
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fence-agents-4.9.0+git.1624631789.25ec70f0/fence-agents.spec.in 
new/fence-agents-4.10.0+git.1626946937.8ade08b4/fence-agents.spec.in
--- old/fence-agents-4.9.0+git.1624631789.25ec70f0/fence-agents.spec.in 
2021-06-25 16:36:29.000000000 +0200
+++ new/fence-agents-4.10.0+git.1626946937.8ade08b4/fence-agents.spec.in        
2021-07-22 11:42:17.000000000 +0200
@@ -173,7 +173,7 @@
 
 %build
 %if 0%{?fedora} || 0%{?centos} > 7 || 0%{?rhel} > 7 || 0%{?suse_version}
-       PYTHON="%{__python3}"
+       export PYTHON="%{__python3}"
 %endif
 
 ./autogen.sh
@@ -406,7 +406,15 @@
 Summary: Fence agent for Azure Resource Manager
 Requires: fence-agents-common = %{version}-%{release}
 %if 0%{?fedora} || 0%{?centos} > 7 || 0%{?rhel} > 7 || 0%{?suse_version}
+%if 0%{?fedora} > 34
+Requires: python3-azure-common
+Requires: python3-azure-identity
+Requires: python3-azure-mgmt-compute
+Requires: python3-azure-mgmt-network
+Requires: python3-msrestazure
+%else
 Requires: python3-azure-sdk
+%endif
 %else
 Requires: python-azure-sdk
 %endif
@@ -870,6 +878,18 @@
 %{_mandir}/man8/fence_kdump.8*
 %{_mandir}/man8/fence_kdump_send.8*
 
+%package kubevirt
+License: GPLv2+ and LGPLv2+
+Summary: Fence agent for KubeVirt platform
+Requires: python3-openshift >= 0.12.1
+Requires: fence-agents-common = %{version}-%{release}
+BuildArch: noarch
+%description kubevirt
+Fence agent for KubeVirt platform.
+%files kubevirt
+%{_sbindir}/fence_kubevirt
+%{_mandir}/man8/fence_kubevirt.8*
+
 %package ldom
 License: GPLv2+ and LGPLv2+
 Summary: Fence agent for Sun LDom virtual machines
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fence-agents-4.9.0+git.1624631789.25ec70f0/make/agentccheck.mk 
new/fence-agents-4.10.0+git.1626946937.8ade08b4/make/agentccheck.mk
--- old/fence-agents-4.9.0+git.1624631789.25ec70f0/make/agentccheck.mk  
2021-06-25 16:36:29.000000000 +0200
+++ new/fence-agents-4.10.0+git.1626946937.8ade08b4/make/agentccheck.mk 
2021-07-22 11:42:17.000000000 +0200
@@ -2,6 +2,7 @@
 TEST_TARGET=$(filter-out $(TEST_TARGET_SKIP),$(TARGET))
 
 check: $(TEST_TARGET:%=%.xml-check) $(SYMTARGET:%=%.xml-check) 
$(TEST_TARGET:%=%.delay-check) $(TEST_TARGET:%=%.rng-check)
+delay-check: $(TEST_TARGET:%=%.delay-check) $(SYMTARGET:%=%.delay-check)
 xml-check: $(TEST_TARGET:%=%.xml-check) $(SYMTARGET:%=%.xml-check)
 xml-upload: $(TEST_TARGET:%=%.xml-upload) $(SYMTARGET:%=%.xml-upload)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fence-agents-4.9.0+git.1624631789.25ec70f0/make/agentpycheck.mk 
new/fence-agents-4.10.0+git.1626946937.8ade08b4/make/agentpycheck.mk
--- old/fence-agents-4.9.0+git.1624631789.25ec70f0/make/agentpycheck.mk 
2021-06-25 16:36:29.000000000 +0200
+++ new/fence-agents-4.10.0+git.1626946937.8ade08b4/make/agentpycheck.mk        
2021-07-22 11:42:17.000000000 +0200
@@ -4,6 +4,7 @@
 TEST_TARGET=$(filter-out $(TEST_TARGET_SKIP),$(TARGET))
 
 check: $(TEST_TARGET:%=%.xml-check) $(SYMTARGET:%=%.xml-check) 
$(TEST_TARGET:%=%.delay-check) $(TEST_TARGET:%=%.rng-check)
+delay-check: $(TEST_TARGET:%=%.delay-check) $(SYMTARGET:%=%.delay-check)
 xml-check: $(TEST_TARGET:%=%.xml-check) $(SYMTARGET:%=%.xml-check)
 xml-upload: $(TEST_TARGET:%=%.xml-upload) $(SYMTARGET:%=%.xml-upload)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fence-agents-4.9.0+git.1624631789.25ec70f0/tests/data/metadata/fence_kdump.xml
 
new/fence-agents-4.10.0+git.1626946937.8ade08b4/tests/data/metadata/fence_kdump.xml
--- 
old/fence-agents-4.9.0+git.1624631789.25ec70f0/tests/data/metadata/fence_kdump.xml
  2021-06-25 16:36:29.000000000 +0200
+++ 
new/fence-agents-4.10.0+git.1626946937.8ade08b4/tests/data/metadata/fence_kdump.xml
 2021-07-22 11:42:17.000000000 +0200
@@ -15,14 +15,18 @@
 message is received from the failed node, the node is considered to be
 fenced and the agent returns success. Failure to receive a valid
 message from the failed node in the given timeout period results in
-fencing failure.</longdesc>
+fencing failure. When multiple node names/IP addresses are specified
+a single valid message is sufficient for success. This is useful when
+single node can send message via several different IP addresses.
+</longdesc>
 <vendor-url>http://www.kernel.org/pub/linux/utils/kernel/kexec/</vendor-url>
 <parameters>
        <parameter name="nodename" unique="0" required="0">
-               <getopt mixed="-n, --nodename=NODE" />
+               <getopt mixed="-n, --nodename=NODE[,NODE...]" />
                <content type="string" />
-               <shortdesc lang="en">Name or IP address of node to be fenced. 
This option is required for
-the "off" action.</shortdesc>
+               <shortdesc lang="en">List of names or IP addresses of node to 
be fenced. This option is
+required for the "off" action. Multiple values separated by commas
+can be specified. All values must be of same IP network family.</shortdesc>
        </parameter>
        <parameter name="ipport" unique="0" required="0">
                <getopt mixed="-p, --ipport=PORT" />
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fence-agents-4.9.0+git.1624631789.25ec70f0/tests/data/metadata/fence_pve.xml
 
new/fence-agents-4.10.0+git.1626946937.8ade08b4/tests/data/metadata/fence_pve.xml
--- 
old/fence-agents-4.9.0+git.1624631789.25ec70f0/tests/data/metadata/fence_pve.xml
    2021-06-25 16:36:29.000000000 +0200
+++ 
new/fence-agents-4.10.0+git.1626946937.8ade08b4/tests/data/metadata/fence_pve.xml
   2021-07-22 11:42:17.000000000 +0200
@@ -71,21 +71,31 @@
                <content type="string" default="root@pam"  />
                <shortdesc lang="en">Login name</shortdesc>
        </parameter>
-       <parameter name="node_name" unique="0" required="0" deprecated="1">
-               <getopt mixed="-N, --nodename" />
+       <parameter name="pve_node" unique="0" required="0">
+               <getopt mixed="-N, --pve-node=[node_name]" />
                <content type="string"  />
-               <shortdesc lang="en">Node on which machine is located. 
(Optional, will be automatically determined)</shortdesc>
+               <shortdesc lang="en">Proxmox node name on which machine is 
located. (Must be specified if not using --pve-node-auto)</shortdesc>
        </parameter>
-       <parameter name="nodename" unique="0" required="0" 
obsoletes="node_name">
-               <getopt mixed="-N, --nodename" />
-               <content type="string"  />
-               <shortdesc lang="en">Node on which machine is located. 
(Optional, will be automatically determined)</shortdesc>
+       <parameter name="pve_node_auto" unique="0" required="0">
+               <getopt mixed="-A, --pve-node-auto" />
+               <content type="boolean"  />
+               <shortdesc lang="en">Automatically select proxmox node. (This 
option overrides --pve-node)</shortdesc>
        </parameter>
        <parameter name="vmtype" unique="0" required="1">
                <getopt mixed="--vmtype" />
                <content type="string" default="qemu"  />
                <shortdesc lang="en">Virtual machine type lxc or qemu. 
(Default: qemu)</shortdesc>
        </parameter>
+       <parameter name="node_name" unique="0" required="0" deprecated="1">
+               <getopt mixed="--nodename" />
+               <content type="string"  />
+               <shortdesc lang="en">Replaced by --pve-node</shortdesc>
+       </parameter>
+       <parameter name="nodename" unique="0" required="0" 
obsoletes="node_name">
+               <getopt mixed="--nodename" />
+               <content type="string"  />
+               <shortdesc lang="en">Replaced by --pve-node</shortdesc>
+       </parameter>
        <parameter name="quiet" unique="0" required="0">
                <getopt mixed="-q, --quiet" />
                <content type="boolean"  />

Reply via email to