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" />
