Hello community, here is the log from the commit of package fence-agents for openSUSE:Factory checked in at 2019-06-19 21:07:04 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/fence-agents (Old) and /work/SRC/openSUSE:Factory/.fence-agents.new.4811 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "fence-agents" Wed Jun 19 21:07:04 2019 rev:45 rq:709349 version:4.4.0+git.1558595666.5f79f9e9 Changes: -------- --- /work/SRC/openSUSE:Factory/fence-agents/fence-agents.changes 2018-09-28 08:52:52.929774101 +0200 +++ /work/SRC/openSUSE:Factory/.fence-agents.new.4811/fence-agents.changes 2019-06-19 21:09:22.178565827 +0200 @@ -1,0 +2,47 @@ +Wed Jun 12 07:57:14 UTC 2019 - kgronl...@suse.com + +- Split fence_amt_ws into separate package due to licence incompatibility: + * Apache-2.0 is not compatible with GPL-2.0 + +- Update to version 4.4.0+git.1558595666.5f79f9e9: + * fence_scsi: detect node ID using new format, and fallback to old format before failing + * fence_rhevm: fix debug encoding issues (bsc#1137314) (CVE-2019-10153) + * fence_mpath: import ctypes to fix watchdog hardreboot + * fence_rhevm: add RHEV v4 API support and auto-detection + * fence_azure_arm: use skip_shutdown feature when available + * fence_ipmilan: Add ipmitool timeout option + * fence_redfish: add headers to HTTP methods + * fence_gce: fix Python 3 encoding issue + * fence_pve: add support for sending reset command to qemu machines (#261) + * fencing: improve stdin parse function + * fence_redfish: backwards compatibility for <ip>:<port> + +------------------------------------------------------------------- +Mon Feb 18 13:22:05 UTC 2019 - dake...@suse.com + +- Update to version 4.2.1+git.1550476590.98767d24: + * fence_redfish: use "ipport" parameter and improve logging (fate#320898) + * Changed Encoding to UTF-8 (bsc#1137314) (CVE-2019-10153) + * fence_redfish: fail when using invalid cert without --ssl-insecure (fate#320898) + * Removed unnecessary variable assignments to simplify code + * fence_scsi: watchdog retries support + * Renamed variable to avoid reusing variable name + * Replaced default port 443 with default ssl enabled option + * Changed reboot type to ForceRestart + * Modify power status check + * Added run_delay() + * Updated fence_redfish.xml with make xml-upload (fate#320898) + * Add new fence agent for Redfish (fate#320898) + * build: fix issues with newer autoconf versions + * build: fix if-redirection to make check_used_options run for the agents as intended + * Fix 'log_expect' in fence_hpblade.py + * fence_scsi: fix incorrect SCSI key when node ID is 10 or higher + * fence_openstack: add detection of keystoneauth1 library + * check_used_options: add Python 3 support, and detect unsupported has_key()-calls + * fence_openstack: Migrate from keystoneclient to keystoneauth1 + * fence_openstack: fix missing version parameter in novaclient.Client() call + * fence_openstack: fix configure library detection and add try/except for imports + * fence_kdump: add validate-all action + * fence_compute/fence_evacuate: domain parameter fixes to avoid regressions + +------------------------------------------------------------------- Old: ---- fence-agents-4.2.1+git.1537269352.7b1fd536.tar.xz New: ---- fence-agents-4.4.0+git.1558595666.5f79f9e9.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ fence-agents.spec ++++++ --- /var/tmp/diff_new_pack.oYIhIn/_old 2019-06-19 21:09:23.314566931 +0200 +++ /var/tmp/diff_new_pack.oYIhIn/_new 2019-06-19 21:09:23.318566935 +0200 @@ -1,7 +1,7 @@ # # spec file for package fence-agents # -# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -12,7 +12,7 @@ # license that conforms to the Open Source Definition (Version 1.9) # published by the Open Source Initiative. -# Please submit bugfixes or comments via http://bugs.opensuse.org/ +# Please submit bugfixes or comments via https://bugs.opensuse.org/ # @@ -23,13 +23,13 @@ %endif %global plugin_dir %{_libdir}/stonith/plugins/rhcs -%define agent_list alom amt amt_ws apc apc_snmp azure_arm bladecenter brocade cisco_mds cisco_ucs compute docker drac5 dummy eaton_snmp emerson eps evacuate gce hds_cb hpblade ibmblade ifmib ilo ilo_moonshot ilo_mp ilo_ssh intelmodular ipdu ipmilan ironic kdump ldom lpar mpath netio openstack powerman pve raritan rcd_serial rhevm rsa rsb sanbox2 sbd scsi vbox virsh vmware vmware_rest wti xenapi zvm +%define agent_list alom amt amt_ws apc apc_snmp azure_arm bladecenter brocade cisco_mds cisco_ucs compute docker drac5 dummy eaton_snmp emerson eps evacuate gce hds_cb hpblade ibmblade ifmib ilo ilo_moonshot ilo_mp ilo_ssh intelmodular ipdu ipmilan ironic kdump ldom lpar mpath netio openstack powerman pve raritan rcd_serial redfish rhevm rsa rsb sanbox2 sbd scsi vbox virsh vmware vmware_rest wti xenapi zvm Name: fence-agents Summary: Fence Agents for High Availability License: GPL-2.0-only AND LGPL-2.1-only Group: Productivity/Clustering/HA -Version: 4.2.1+git.1537269352.7b1fd536 +Version: 4.4.0+git.1558595666.5f79f9e9 Release: 0 Url: https://github.com/ClusterLabs/fence-agents Source0: %{name}-%{version}.tar.xz @@ -109,8 +109,21 @@ configuration. This package provides both a Python API for creating agents as well as a collection of existing agents. +%package amt_ws +Summary: Fence Agent for Intel AMT (WS) +License: Apache-2.0 +Group: Productivity/Clustering/HA +Requires: %{name} = %{version} + +%description amt_ws +Fence agents are device drivers able to prevent computers from +destroying data on shared storage. Their aim is to isolate a +corrupted computer by controlling power, network or storage +configuration. This packages provides an agent for Intel AMT (WS). + %package devel Summary: Fence Agents for High Availability +License: GPL-2.0-only AND LGPL-2.1-only Group: Development/Tools/Other Requires: %{name} = %{version} @@ -170,11 +183,17 @@ %{_datadir}/cluster %{plugin_dir}/fence_cisco_ucs %{_sbindir}/fence_* +%exclude %{_sbindir}/fence_amt_ws +%exclude %{_mandir}/man8/fence_amt_ws* %exclude %{_sbindir}/fence_dummy %exclude %{_mandir}/man8/fence_dummy* %{_mandir}/man8/fence_* %{_libexecdir}/fence_* +%files amt_ws +%{_sbindir}/fence_amt_ws +%{_mandir}/man8/fence_amt_ws* + %files devel %{_sbindir}/fence_dummy %{_mandir}/man8/fence_dummy* ++++++ _service ++++++ --- /var/tmp/diff_new_pack.oYIhIn/_old 2019-06-19 21:09:23.358566973 +0200 +++ /var/tmp/diff_new_pack.oYIhIn/_new 2019-06-19 21:09:23.358566973 +0200 @@ -4,7 +4,7 @@ <param name="scm">git</param> <param name="exclude">.git</param> <param name="filename">fence-agents</param> - <param name="versionformat">4.2.1+git.%ct.%h</param> + <param name="versionformat">4.4.0+git.%ct.%h</param> <param name="revision">master</param> <param name="changesgenerate">enable</param> </service> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.oYIhIn/_old 2019-06-19 21:09:23.382566997 +0200 +++ /var/tmp/diff_new_pack.oYIhIn/_new 2019-06-19 21:09:23.382566997 +0200 @@ -1,4 +1,4 @@ <servicedata> <service name="tar_scm"> <param name="url">git://github.com/ClusterLabs/fence-agents.git</param> - <param name="changesrevision">7b1fd536961421d93a1e960ffc558ce938153f42</param></service></servicedata> \ No newline at end of file + <param name="changesrevision">1c4a64ca803831b44c96c75022abe5bb8713cd1a</param></service></servicedata> \ No newline at end of file ++++++ fence-agents-4.2.1+git.1537269352.7b1fd536.tar.xz -> fence-agents-4.4.0+git.1558595666.5f79f9e9.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1537269352.7b1fd536/agents/azure_arm/fence_azure_arm.py new/fence-agents-4.4.0+git.1558595666.5f79f9e9/agents/azure_arm/fence_azure_arm.py --- old/fence-agents-4.2.1+git.1537269352.7b1fd536/agents/azure_arm/fence_azure_arm.py 2018-09-18 13:15:52.000000000 +0200 +++ new/fence-agents-4.4.0+git.1558595666.5f79f9e9/agents/azure_arm/fence_azure_arm.py 2019-05-23 09:14:26.000000000 +0200 @@ -114,8 +114,8 @@ azure_fence.set_network_state(compute_client, network_client, rgName, vmName, "unblock") if (options["--action"]=="off"): - logging.info("Deallocating " + vmName + " in resource group " + rgName) - compute_client.virtual_machines.deallocate(rgName, vmName) + logging.info("Poweroff " + vmName + " in resource group " + rgName) + compute_client.virtual_machines.power_off(rgName, vmName, skip_shutdown=True) elif (options["--action"]=="on"): logging.info("Starting " + vmName + " in resource group " + rgName) compute_client.virtual_machines.start(rgName, vmName) @@ -199,7 +199,7 @@ docs = {} docs["shortdesc"] = "Fence agent for Azure Resource Manager" - docs["longdesc"] = "Used to deallocate virtual machines and to report power state of virtual machines running in Azure. It uses Azure SDK for Python to connect to Azure.\ + docs["longdesc"] = "fence_azure_arm is an I/O Fencing agent for Azure Resource Manager. It uses Azure SDK for Python to connect to Azure.\ \n.P\n\ For instructions to setup credentials see: https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-create-service-principal-portal\ \n.P\n\ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1537269352.7b1fd536/agents/compute/fence_compute.py new/fence-agents-4.4.0+git.1558595666.5f79f9e9/agents/compute/fence_compute.py --- old/fence-agents-4.2.1+git.1537269352.7b1fd536/agents/compute/fence_compute.py 2018-09-18 13:15:52.000000000 +0200 +++ new/fence-agents-4.4.0+git.1558595666.5f79f9e9/agents/compute/fence_compute.py 2019-05-23 09:14:26.000000000 +0200 @@ -353,7 +353,7 @@ "default" : "", "order": 1, } - all_opt["user_domain"] = { + all_opt["user-domain"] = { "getopt" : "u:", "longopt" : "user-domain", "help" : "-u, --user-domain=[name] Keystone v3 User Domain", @@ -362,7 +362,7 @@ "default" : "Default", "order": 2, } - all_opt["project_domain"] = { + all_opt["project-domain"] = { "getopt" : "P:", "longopt" : "project-domain", "help" : "-d, --project-domain=[name] Keystone v3 Project Domain", @@ -433,6 +433,14 @@ "default" : "False", "order": 5, } + all_opt["compute-domain"] = { + "getopt" : ":", + "longopt" : "compute-domain", + "help" : "--compute-domain=[string] Replaced by --domain", + "required" : "0", + "shortdesc" : "Replaced by domain", + "order": 6, + } def set_multi_power_fn(connection, options, set_power_fn, get_power_fn, retry_attempts=1): for _ in range(retry_attempts): @@ -450,9 +458,10 @@ global override_status atexit.register(atexit_handler) - device_opt = ["login", "passwd", "tenant_name", "auth_url", "fabric_fencing", - "no_login", "no_password", "port", "domain", "project_domain", "user_domain", - "no_shared_storage", "endpoint_type", "record_only", "instance_filtering", "insecure", "region_name"] + device_opt = ["login", "passwd", "tenant_name", "auth_url", "fabric_fencing", "no_login", + "no_password", "port", "domain", "compute-domain", "project-domain", + "user-domain", "no_shared_storage", "endpoint_type", "record_only", + "instance_filtering", "insecure", "region_name"] define_new_opts() all_opt["shell_timeout"]["default"] = "180" @@ -470,6 +479,11 @@ run_delay(options) + # workaround to avoid regressions + if "--compute-domain" in options and options["--compute-domain"]: + options["--domain"] = options["--compute-domain"] + del options["--domain"] + logging.debug("Running "+options["--action"]) connection = create_nova_connection(options) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1537269352.7b1fd536/agents/evacuate/fence_evacuate.py new/fence-agents-4.4.0+git.1558595666.5f79f9e9/agents/evacuate/fence_evacuate.py --- old/fence-agents-4.2.1+git.1537269352.7b1fd536/agents/evacuate/fence_evacuate.py 2018-09-18 13:15:52.000000000 +0200 +++ new/fence-agents-4.4.0+git.1558595666.5f79f9e9/agents/evacuate/fence_evacuate.py 2019-05-23 09:14:26.000000000 +0200 @@ -290,7 +290,7 @@ "default" : "", "order": 1, } - all_opt["user_domain"] = { + all_opt["user-domain"] = { "getopt" : "u:", "longopt" : "user-domain", "help" : "-u, --user-domain=[name] Keystone v3 User Domain", @@ -299,7 +299,7 @@ "default" : "Default", "order": 2, } - all_opt["project_domain"] = { + all_opt["project-domain"] = { "getopt" : "P:", "longopt" : "project-domain", "help" : "-d, --project-domain=[name] Keystone v3 Project Domain", @@ -361,14 +361,22 @@ "default" : "False", "order": 5, } + all_opt["compute-domain"] = { + "getopt" : ":", + "longopt" : "compute-domain", + "help" : "--compute-domain=[string] Replaced by --domain", + "required" : "0", + "shortdesc" : "Replaced by domain", + "order": 6, + } def main(): atexit.register(atexit_handler) device_opt = ["login", "passwd", "tenant_name", "auth_url", - "no_login", "no_password", "port", "domain", "project_domain", - "user_domain", "no_shared_storage", "endpoint_type", - "instance_filtering", "insecure", "region_name"] + "no_login", "no_password", "port", "domain", "compute-domain", + "project-domain", "user-domain", "no_shared_storage", + "endpoint_type", "instance_filtering", "insecure", "region_name"] define_new_opts() all_opt["shell_timeout"]["default"] = "180" @@ -383,6 +391,12 @@ run_delay(options) + # workaround to avoid regressions + if "--compute-domain" in options and options["--compute-domain"]: + options["--domain"] = options["--compute-domain"] + del options["--domain"] + + connection = create_nova_connection(options) # Un-evacuating a server doesn't make sense diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1537269352.7b1fd536/agents/gce/fence_gce.py new/fence-agents-4.4.0+git.1558595666.5f79f9e9/agents/gce/fence_gce.py --- old/fence-agents-4.2.1+git.1537269352.7b1fd536/agents/gce/fence_gce.py 2018-09-18 13:15:52.000000000 +0200 +++ new/fence-agents-4.4.0+git.1558595666.5f79f9e9/agents/gce/fence_gce.py 2019-05-23 09:14:26.000000000 +0200 @@ -146,7 +146,7 @@ url = '%s?%s' % (metadata_url, params) request = urlrequest.Request(url, headers=METADATA_HEADERS) request_opener = urlrequest.build_opener(urlrequest.ProxyHandler({})) - return request_opener.open(request, timeout=timeout * 1.1).read() + return request_opener.open(request, timeout=timeout * 1.1).read().decode("utf-8") def define_new_opts(): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1537269352.7b1fd536/agents/hpblade/fence_hpblade.py new/fence-agents-4.4.0+git.1558595666.5f79f9e9/agents/hpblade/fence_hpblade.py --- old/fence-agents-4.2.1+git.1537269352.7b1fd536/agents/hpblade/fence_hpblade.py 2018-09-18 13:15:52.000000000 +0200 +++ new/fence-agents-4.4.0+git.1558595666.5f79f9e9/agents/hpblade/fence_hpblade.py 2019-05-23 09:14:26.000000000 +0200 @@ -16,7 +16,7 @@ def get_enclosure_type(conn, options): conn.send_eol("show enclosure info") - conn.log_expect(options, options["--command-prompt"], int(options["--shell-timeout"])) + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) type_re=re.compile(r"^\s*Enclosure Type: (\w+)(.*?)\s*$") enclosure="unknown" @@ -39,7 +39,7 @@ powrestr = "^\\s*Power: (.*?)\\s*$" conn.send_eol(cmd_send) - conn.log_expect(options, options["--command-prompt"], int(options["--shell-timeout"])) + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) power_re = re.compile(powrestr) status = "unknown" @@ -72,7 +72,7 @@ conn.send_eol("poweron " + dev + options["--plug"]) elif options["--action"] == "off": conn.send_eol("poweroff " + dev + options["--plug"] + " force") - conn.log_expect(options, options["--command-prompt"], int(options["--shell-timeout"])) + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) def get_instances_list(conn, options): outlets = {} @@ -84,7 +84,7 @@ listrestr = "^\\s*(\\d+)\\s+(.*?)\\s+(.*?)\\s+OK\\s+(.*?)\\s+(.*?)\\s*$" conn.send_eol(cmd_send) - conn.log_expect(options, options["--command-prompt"], int(options["--shell-timeout"])) + conn.log_expect(options["--command-prompt"], int(options["--shell-timeout"])) list_re = re.compile(listrestr) for line in conn.before.splitlines(): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1537269352.7b1fd536/agents/ipmilan/fence_ipmilan.py new/fence-agents-4.4.0+git.1558595666.5f79f9e9/agents/ipmilan/fence_ipmilan.py --- old/fence-agents-4.2.1+git.1537269352.7b1fd536/agents/ipmilan/fence_ipmilan.py 2018-09-18 13:15:52.000000000 +0200 +++ new/fence-agents-4.4.0+git.1558595666.5f79f9e9/agents/ipmilan/fence_ipmilan.py 2019-05-23 09:14:26.000000000 +0200 @@ -86,6 +86,9 @@ if "--hexadecimal-kg" in options: Cmd.append(" -y " + options["--hexadecimal-kg"]) + if "--ipmitool-timeout" in options: + Cmd.append(" -N " + options["--ipmitool-timeout"]) + # --action / -o Cmd.append(" chassis power " + action) @@ -138,6 +141,15 @@ "default" : "@IPMITOOL_PATH@", "order": 200 } + all_opt["ipmitool_timeout"] = { + "getopt" : ":", + "longopt" : "ipmitool-timeout", + "help" : "--ipmitool-timeout=[timeout] Timeout (sec) for IPMI operation", + "required" : "0", + "shortdesc" : "Timeout (sec) for IPMI operation", + "default" : "2", + "order": 201 + } all_opt["target"] = { "getopt" : ":", "longopt" : "target", @@ -160,7 +172,7 @@ device_opt = ["ipaddr", "login", "no_login", "no_password", "passwd", "diag", "lanplus", "auth", "cipher", "privlvl", "sudo", - "ipmitool_path", "method", "target", "hexadecimal_kg"] + "ipmitool_path", "ipmitool_timeout", "method", "target", "hexadecimal_kg"] define_new_opts() all_opt["power_wait"]["default"] = 2 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1537269352.7b1fd536/agents/kdump/fence_kdump.c new/fence-agents-4.4.0+git.1558595666.5f79f9e9/agents/kdump/fence_kdump.c --- old/fence-agents-4.2.1+git.1537269352.7b1fd536/agents/kdump/fence_kdump.c 2018-09-18 13:15:52.000000000 +0200 +++ new/fence-agents-4.4.0+git.1558595666.5f79f9e9/agents/kdump/fence_kdump.c 2019-05-23 09:14:26.000000000 +0200 @@ -295,6 +295,7 @@ fprintf (stdout, "\t<action name=\"off\" />\n"); fprintf (stdout, "\t<action name=\"monitor\" />\n"); fprintf (stdout, "\t<action name=\"metadata\" />\n"); + fprintf (stdout, "\t<action name=\"validate-all\" />\n"); fprintf (stdout, "</actions>\n"); fprintf (stdout, "</resource-agent>\n"); @@ -316,7 +317,7 @@ fprintf (stdout, "%s\n", " -f, --family=FAMILY Network family: ([auto], ipv4, ipv6)"); fprintf (stdout, "%s\n", - " -o, --action=ACTION Fencing action: ([off], monitor, metadata)"); + " -o, --action=ACTION Fencing action: ([off], monitor, metadata, validate-all)"); fprintf (stdout, "%s\n", " -t, --timeout=TIMEOUT Timeout in seconds (default: 60)"); fprintf (stdout, "%s\n", @@ -556,6 +557,9 @@ case FENCE_KDUMP_ACTION_MONITOR: error = do_action_monitor (); break; + case FENCE_KDUMP_ACTION_VALIDATE: + error = 0; + break; default: break; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1537269352.7b1fd536/agents/kdump/options.h new/fence-agents-4.4.0+git.1558595666.5f79f9e9/agents/kdump/options.h --- old/fence-agents-4.2.1+git.1537269352.7b1fd536/agents/kdump/options.h 2018-09-18 13:15:52.000000000 +0200 +++ new/fence-agents-4.4.0+git.1558595666.5f79f9e9/agents/kdump/options.h 2019-05-23 09:14:26.000000000 +0200 @@ -36,6 +36,7 @@ FENCE_KDUMP_ACTION_LIST = 4, FENCE_KDUMP_ACTION_MONITOR = 5, FENCE_KDUMP_ACTION_METADATA = 6, + FENCE_KDUMP_ACTION_VALIDATE = 7, }; enum { @@ -191,6 +192,8 @@ opts->action = FENCE_KDUMP_ACTION_METADATA; } else if (!strcasecmp (arg, "monitor")) { opts->action = FENCE_KDUMP_ACTION_MONITOR; + } else if (!strcasecmp (arg, "validate-all")) { + opts->action = FENCE_KDUMP_ACTION_VALIDATE; } else { fprintf (stderr, "[error]: unsupported action '%s'\n", arg); exit (1); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1537269352.7b1fd536/agents/mpath/fence_mpath.py new/fence-agents-4.4.0+git.1558595666.5f79f9e9/agents/mpath/fence_mpath.py --- old/fence-agents-4.2.1+git.1537269352.7b1fd536/agents/mpath/fence_mpath.py 2018-09-18 13:15:52.000000000 +0200 +++ new/fence-agents-4.4.0+git.1558595666.5f79f9e9/agents/mpath/fence_mpath.py 2019-05-23 09:14:26.000000000 +0200 @@ -6,6 +6,7 @@ import os import logging import atexit +import ctypes sys.path.append("@FENCEAGENTSLIBDIR@") from fencing import fail_usage, run_command, atexit_handler, check_input, process_input, show_docs from fencing import fence_action, all_opt, run_delay diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1537269352.7b1fd536/agents/openstack/fence_openstack.py new/fence-agents-4.4.0+git.1558595666.5f79f9e9/agents/openstack/fence_openstack.py --- old/fence-agents-4.2.1+git.1537269352.7b1fd536/agents/openstack/fence_openstack.py 2018-09-18 13:15:52.000000000 +0200 +++ new/fence-agents-4.4.0+git.1558595666.5f79f9e9/agents/openstack/fence_openstack.py 2019-05-23 09:14:26.000000000 +0200 @@ -9,10 +9,20 @@ sys.path.append("/usr/share/fence") from fencing import * from fencing import fail_usage, is_executable, run_command, run_delay -from keystoneclient.v3 import client as ksclient -from novaclient import client as novaclient -from keystoneclient import session as ksc_session -from keystoneclient.auth.identity import v3 + +try: + from novaclient import client as novaclient + from keystoneauth1 import session as ksc_session + from keystoneauth1 import loading + legacy_import = False +except ImportError: + try: + from novaclient import client as novaclient + from keystoneclient import session as ksc_session + from keystoneclient.auth.identity import v3 + legacy_import = True + except ImportError: + pass def get_name_or_uuid(options): return options["--uuid"] if "--uuid" in options else options["--plug"] @@ -29,10 +39,23 @@ return def nova_login(username,password,projectname,auth_url,user_domain_name,project_domain_name): - auth=v3.Password(username=username,password=password,project_name=projectname,user_domain_name=user_domain_name,project_domain_name=project_domain_name,auth_url=auth_url) + if not legacy_import: + loader = loading.get_plugin_loader('password') + auth = loader.load_from_options(auth_url=auth_url, + username=username, + password=password, + project_name=projectname, + user_domain_name=user_domain_name, + project_domain_name=project_domain_name) + else: + auth = v3.Password(username=username, + password=password, + project_name=projectname, + user_domain_name=user_domain_name, + project_domain_name=project_domain_name, + auth_url=auth_url) session = ksc_session.Session(auth=auth) - keystone = ksclient.Client(session=session) - nova = novaclient.Client(session=session) + nova = novaclient.Client("2", session=session) return nova def nova_run_command(options,action,timeout=None): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1537269352.7b1fd536/agents/pve/fence_pve.py new/fence-agents-4.4.0+git.1558595666.5f79f9e9/agents/pve/fence_pve.py --- old/fence-agents-4.2.1+git.1537269352.7b1fd536/agents/pve/fence_pve.py 2018-09-18 13:15:52.000000000 +0200 +++ new/fence-agents-4.4.0+git.1558595666.5f79f9e9/agents/pve/fence_pve.py 2019-05-23 09:14:26.000000000 +0200 @@ -54,6 +54,13 @@ send_cmd(options, cmd, post={"skiplock":1}) +def reboot_cycle(conn, options): + del conn + cmd = "nodes/" + options["--nodename"] + "/" + options["--vmtype"] + "/" + options["--plug"] + "/status/reset" + result = send_cmd(options, cmd, post={"skiplock":1}) + return type(result) is dict and "data" in result + + def get_outlet_list(conn, options): del conn nodes = send_cmd(options, "nodes") @@ -154,7 +161,7 @@ "order": 2 } - device_opt = ["ipaddr", "login", "passwd", "web", "port", "node_name", "vmtype"] + device_opt = ["ipaddr", "login", "passwd", "web", "port", "node_name", "vmtype", "method"] all_opt["login"]["required"] = "0" all_opt["login"]["default"] = "root@pam" @@ -177,6 +184,10 @@ if "--nodename" not in options or not options["--nodename"]: options["--nodename"] = None + if options["--vmtype"] != "qemu": + # For vmtypes other than qemu, only the onoff method is valid + options["--method"] = "onoff" + options["url"] = "https://" + options["--ip"] + ":" + str(options["--ipport"]) + "/api2/json/" options["auth"] = get_ticket(options) @@ -186,10 +197,10 @@ # Workaround for unsupported API call on some Proxmox hosts outlets = get_outlet_list(None, options) # Unsupported API-Call will result in value: None if outlets is None: - result = fence_action(None, options, set_power_status, get_power_status, None) + result = fence_action(None, options, set_power_status, get_power_status, None, reboot_cycle) sys.exit(result) - result = fence_action(None, options, set_power_status, get_power_status, get_outlet_list) + result = fence_action(None, options, set_power_status, get_power_status, get_outlet_list, reboot_cycle) sys.exit(result) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1537269352.7b1fd536/agents/redfish/fence_redfish.py new/fence-agents-4.4.0+git.1558595666.5f79f9e9/agents/redfish/fence_redfish.py --- old/fence-agents-4.2.1+git.1537269352.7b1fd536/agents/redfish/fence_redfish.py 1970-01-01 01:00:00.000000000 +0100 +++ new/fence-agents-4.4.0+git.1558595666.5f79f9e9/agents/redfish/fence_redfish.py 2019-05-23 09:14:26.000000000 +0200 @@ -0,0 +1,164 @@ +#!@PYTHON@ -tt + +# Copyright (c) 2018 Dell Inc. or its subsidiaries. All Rights Reserved. + +# Fence agent for devices that support the Redfish API Specification. + +import sys +import re +import logging +import json +import requests +import atexit +sys.path.append("@FENCEAGENTSLIBDIR@") + +from requests.packages.urllib3.exceptions import InsecureRequestWarning +from fencing import * +from fencing import fail_usage, run_delay + +GET_HEADERS = {'accept': 'application/json', 'OData-Version': '4.0'} +POST_HEADERS = {'content-type': 'application/json', 'accept': 'application/json', + 'OData-Version': '4.0'} + + +def get_power_status(conn, options): + response = send_get_request(options, options["--systems-uri"]) + if response['ret'] is False: + fail_usage("Couldn't get power information") + data = response['data'] + + try: + logging.debug("PowerState is: " + data[u'PowerState']) + except Exception: + fail_usage("Unable to get PowerState: " + "https://" + options["--ip"] + ":" + str(options["--ipport"]) + options["--systems-uri"]) + + if data[u'PowerState'].strip() == "Off": + return "off" + else: + return "on" + +def set_power_status(conn, options): + action = { + 'on' : "On", + 'off': "ForceOff", + 'reboot': "ForceRestart" + }[options["--action"]] + + payload = {'ResetType': action} + + # Search for 'Actions' key and extract URI from it + response = send_get_request(options, options["--systems-uri"]) + if response['ret'] is False: + return {'ret': False} + data = response['data'] + action_uri = data["Actions"]["#ComputerSystem.Reset"]["target"] + + response = send_post_request(options, action_uri, payload) + if response['ret'] is False: + fail_usage("Error sending power command") + return + +def send_get_request(options, uri): + full_uri = "https://" + options["--ip"] + ":" + str(options["--ipport"]) + uri + try: + resp = requests.get(full_uri, verify=not "--ssl-insecure" in options, + headers=GET_HEADERS, + auth=(options["--username"], options["--password"])) + data = resp.json() + except Exception as e: + fail_usage("Failed: send_get_request: " + str(e)) + return {'ret': True, 'data': data} + +def send_post_request(options, uri, payload): + full_uri = "https://" + options["--ip"] + ":" + str(options["--ipport"]) + uri + try: + requests.post(full_uri, data=json.dumps(payload), + headers=POST_HEADERS, verify=not "--ssl-insecure" in options, + auth=(options["--username"], options["--password"])) + except Exception as e: + fail_usage("Failed: send_post_request: " + str(e)) + return {'ret': True} + +def find_systems_resource(options): + response = send_get_request(options, options["--redfish-uri"]) + if response['ret'] is False: + return {'ret': False} + data = response['data'] + + if 'Systems' not in data: + # Systems resource not found" + return {'ret': False} + else: + response = send_get_request(options, data["Systems"]["@odata.id"]) + if response['ret'] is False: + return {'ret': False} + data = response['data'] + + # need to be able to handle more than one entry + for member in data[u'Members']: + system_uri = member[u'@odata.id'] + return {'ret': True, 'uri': system_uri} + +def define_new_opts(): + all_opt["redfish-uri"] = { + "getopt" : ":", + "longopt" : "redfish-uri", + "help" : "--redfish-uri=[uri] Base or starting Redifsh URI", + "required" : "0", + "default" : "/redfish/v1", + "shortdesc" : "Base or starting Redfish URI", + "order": 1 + } + all_opt["systems-uri"] = { + "getopt" : ":", + "longopt" : "systems-uri", + "help" : "--systems-uri=[uri] Redfish Systems resource URI", + "required" : "0", + "shortdesc" : "Redfish Systems resource URI, i.e. /redfish/v1/Systems/System.Embedded.1", + "order": 1 + } + +def main(): + atexit.register(atexit_handler) + device_opt = ["ipaddr", "login", "passwd", "redfish-uri", "systems-uri", "ssl"] + define_new_opts() + + opt = process_input(device_opt) + + all_opt["ssl"]["default"] = "1" + options = check_input(device_opt, opt) + + docs = {} + docs["shortdesc"] = "I/O Fencing agent for Redfish" + docs["longdesc"] = "fence_redfish is an I/O Fencing agent which can be used with \ +Out-of-Band controllers that support Redfish APIs. These controllers provide remote \ +access to control power on a server." + docs["vendorurl"] = "http://www.dmtf.org" + show_docs(options, docs) + run_delay(options) + + ## + ## Operate the fencing device + #### + + # Disable insecure-certificate-warning message + if "--ssl-insecure" in opt: + requests.packages.urllib3.disable_warnings(InsecureRequestWarning) + + # backwards compatibility for <ip>:<port> + if options["--ip"].count(":") == 1: + (options["--ip"], options["--ipport"]) = options["--ip"].split(":") + + if "--systems-uri" not in opt: + # Systems URI not provided, find it + sysresult = find_systems_resource(options) + if sysresult['ret'] is False: + sys.exit(1) + else: + options["--systems-uri"] = sysresult["uri"] + + result = fence_action(None, options, set_power_status, get_power_status, None) + sys.exit(result) + +if __name__ == "__main__": + main() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1537269352.7b1fd536/agents/rhevm/fence_rhevm.py new/fence-agents-4.4.0+git.1558595666.5f79f9e9/agents/rhevm/fence_rhevm.py --- old/fence-agents-4.2.1+git.1537269352.7b1fd536/agents/rhevm/fence_rhevm.py 2018-09-18 13:15:52.000000000 +0200 +++ new/fence-agents-4.4.0+git.1558595666.5f79f9e9/agents/rhevm/fence_rhevm.py 2019-05-23 09:14:26.000000000 +0200 @@ -9,7 +9,8 @@ from fencing import fail, EC_FETCH_VM_UUID, run_delay RE_GET_ID = re.compile("<vm( .*)? id=\"(.*?)\"", re.IGNORECASE) -RE_STATUS = re.compile("<state>(.*?)</state>", re.IGNORECASE) +RE_STATUS = re.compile("<status>(.*?)</status>", re.IGNORECASE) +RE_STATE = re.compile("<state>(.*?)</state>", re.IGNORECASE) RE_GET_NAME = re.compile("<name>(.*?)</name>", re.IGNORECASE) def get_power_status(conn, options): @@ -25,7 +26,10 @@ options["id"] = result.group(2) - result = RE_STATUS.search(res) + if tuple(map(int, options["--api-version"].split(".")))[0] > 3: + result = RE_STATUS.search(res) + else: + result = RE_STATE.search(res) if result == None: # We were able to parse ID so output is correct # in some cases it is possible that RHEV-M output does not @@ -59,7 +63,10 @@ lines = res.split("<vm ") for i in range(1, len(lines)): name = RE_GET_NAME.search(lines[i]).group(1) - status = RE_STATUS.search(lines[i]).group(1) + if tuple(map(int, options["--api-version"].split(".")))[0] > 3: + status = RE_STATUS.search(lines[i]).group(1) + else: + status = RE_STATE.search(lines[i]).group(1) outlets[name] = ("", status) except AttributeError: return {} @@ -69,6 +76,13 @@ return outlets def send_command(opt, command, method="GET"): + if opt["--api-version"] == "auto": + opt["--api-version"] = "4" + res = send_command(opt, "") + if re.search("<title>Error</title>", res): + opt["--api-version"] = "3" + logging.debug("auto-detected API version: " + opt["--api-version"]) + ## setup correct URL if "--ssl" in opt or "--ssl-secure" in opt or "--ssl-insecure" in opt: url = "https:" @@ -88,9 +102,9 @@ ## send command through pycurl conn = pycurl.Curl() web_buffer = io.BytesIO() - conn.setopt(pycurl.URL, url.encode("ascii")) + conn.setopt(pycurl.URL, url.encode("UTF-8")) conn.setopt(pycurl.HTTPHEADER, [ - "Version: 3", + "Version: {}".format(opt["--api-version"]), "Content-type: application/xml", "Accept: application/xml", "Prefer: persistent-auth", @@ -128,10 +142,11 @@ opt["cookie"] = cookie - result = web_buffer.getvalue().decode() + result = web_buffer.getvalue().decode("UTF-8") - logging.debug("%s\n", command) - logging.debug("%s\n", result) + logging.debug("url: %s\n", url.encode("UTF-8")) + logging.debug("command: %s\n", command.encode("UTF-8")) + logging.debug("result: %s\n", result.encode("UTF-8")) return result @@ -151,6 +166,15 @@ "required" : "0", "shortdesc" : "Reuse cookies for authentication", "order" : 1} + all_opt["api_version"] = { + "getopt" : ":", + "longopt" : "api-version", + "help" : "--api-version " + "Version of RHEV API (default: auto)", + "required" : "0", + "order" : 2, + "default" : "auto", + } all_opt["api_path"] = { "getopt" : ":", "longopt" : "api-path", @@ -158,20 +182,19 @@ "default" : "/ovirt-engine/api", "required" : "0", "shortdesc" : "The path part of the API URL", - "order" : 2} + "order" : 3} all_opt["disable_http_filter"] = { "getopt" : "", "longopt" : "disable-http-filter", "help" : "--disable-http-filter Set HTTP Filter header to false", "required" : "0", "shortdesc" : "Set HTTP Filter header to false", - "order" : 3} + "order" : 4} def main(): device_opt = [ "ipaddr", - "api_path", "login", "passwd", "ssl", @@ -179,6 +202,8 @@ "web", "port", "use_cookies", + "api_version", + "api_path", "disable_http_filter", ] @@ -186,6 +211,7 @@ define_new_opts() all_opt["power_wait"]["default"] = "1" + all_opt["shell_timeout"]["default"] = "5" options = check_input(device_opt, process_input(device_opt)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1537269352.7b1fd536/agents/scsi/fence_scsi.py new/fence-agents-4.4.0+git.1558595666.5f79f9e9/agents/scsi/fence_scsi.py --- old/fence-agents-4.2.1+git.1537269352.7b1fd536/agents/scsi/fence_scsi.py 2018-09-18 13:15:52.000000000 +0200 +++ new/fence-agents-4.4.0+git.1558595666.5f79f9e9/agents/scsi/fence_scsi.py 2019-05-23 09:14:26.000000000 +0200 @@ -158,13 +158,15 @@ return match.group(1) if match else None -def get_registration_keys(options, dev): +def get_registration_keys(options, dev, fail=True): reset_dev(options,dev) keys = [] cmd = options["--sg_persist-path"] + " -n -i -k -d " + dev out = run_cmd(options, cmd) if out["err"]: - fail_usage("Cannot get registration keys") + fail_usage("Cannot get registration keys", fail) + if not fail: + return [] for line in out["out"].split("\n"): match = re.search(r"\s+0x(\S+)\s*", line) if match: @@ -190,8 +192,14 @@ def get_node_id(options): cmd = options["--corosync-cmap-path"] + " nodelist" + out = run_cmd(options, cmd)["out"] + + match = re.search(r".(\d+).name \(str\) = " + options["--plug"] + "\n", out) + + # try old format before failing + if not match: + match = re.search(r".(\d+).ring._addr \(str\) = " + options["--plug"] + "\n", out) - match = re.search(r".(\d).ring._addr \(str\) = " + options["--plug"] + "\n", run_cmd(options, cmd)["out"]) return match.group(1) if match else fail_usage("Failed: unable to parse output of corosync-cmapctl or node does not exist") @@ -218,9 +226,8 @@ try: f = open(file_path, "r") except IOError: - if fail: - fail_usage("Failed: Cannot open file \""+ file_path + "\"") - else: + fail_usage("Failed: Cannot open file \""+ file_path + "\"", fail) + if not fail: return None return f.readline().strip().lower() @@ -244,9 +251,8 @@ try: f = open(file_path, "r") except IOError: - if fail: - fail_usage("Failed: Cannot open file \"" + file_path + "\"") - else: + fail_usage("Failed: Cannot open file \"" + file_path + "\"", fail) + if not fail: return None # get not empty lines from file devs = [line.strip() for line in f if line.strip()] @@ -371,14 +377,20 @@ } -def scsi_check_get_verbose(): +def scsi_check_get_options(options): try: - f = open("/etc/sysconfig/watchdog", "r") + f = open("/etc/sysconfig/stonith", "r") except IOError: - return False - match = re.search(r"^\s*verbose=yes", "".join(f.readlines()), re.MULTILINE) + return options + + match = re.findall(r"^\s*(\S*)\s*=\s*(\S*)\s*", "".join(f.readlines()), re.MULTILINE) + + for m in match: + options[m[0].lower()] = m[1].lower() + f.close() - return bool(match) + + return options def scsi_check(hardreboot=False): @@ -388,7 +400,10 @@ options["--sg_turs-path"] = "@SG_TURS_PATH@" options["--sg_persist-path"] = "@SG_PERSIST_PATH@" options["--power-timeout"] = "5" - if scsi_check_get_verbose(): + options["retry"] = "0" + options["retry-sleep"] = "1" + options = scsi_check_get_options(options) + if "verbose" in options and options["verbose"] == "yes": logging.getLogger().setLevel(logging.DEBUG) devs = dev_read(fail=False) if not devs: @@ -399,11 +414,18 @@ logging.error("Key not found") return 0 for dev in devs: - if key in get_registration_keys(options, dev): - logging.debug("key " + key + " registered with device " + dev) - return 0 - else: - logging.debug("key " + key + " not registered with device " + dev) + for n in range(int(options["retry"]) + 1): + if n > 0: + logging.debug("retry: " + str(n) + " of " + options["retry"]) + if key in get_registration_keys(options, dev, fail=False): + logging.debug("key " + key + " registered with device " + dev) + return 0 + else: + logging.debug("key " + key + " not registered with device " + dev) + + if n < int(options["retry"]): + time.sleep(float(options["retry-sleep"])) + logging.debug("key " + key + " registered with any devices") if hardreboot == True: @@ -452,7 +474,11 @@ device(s). The result is that only registered nodes may write to the \ device(s). When a node failure occurs, the fence_scsi agent will remove the \ key belonging to the failed node from the device(s). The failed node will no \ -longer be able to write to the device(s). A manual reboot is required." +longer be able to write to the device(s). A manual reboot is required.\ +\n.P\n\ +When used as a watchdog device you can define e.g. retry=1, retry-sleep=2 and \ +verbose=yes parameters in /etc/sysconfig/stonith if you have issues with it \ +failing." docs["vendorurl"] = "" show_docs(options, docs) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1537269352.7b1fd536/configure.ac new/fence-agents-4.4.0+git.1558595666.5f79f9e9/configure.ac --- old/fence-agents-4.2.1+git.1537269352.7b1fd536/configure.ac 2018-09-18 13:15:52.000000000 +0200 +++ new/fence-agents-4.4.0+git.1558595666.5f79f9e9/configure.ac 2019-05-23 09:14:26.000000000 +0200 @@ -6,6 +6,8 @@ m4_esyscmd([make/git-version-gen .tarball-version]), [linux-clus...@redhat.com]) +AC_CONFIG_AUX_DIR([.]) + AM_INIT_AUTOMAKE([-Wno-portability dist-bzip2 dist-xz subdir-objects]) LT_PREREQ([2.2.6]) @@ -203,6 +205,9 @@ fi AC_SUBST(XSLTPROC) +dnl Ensure PYTHON is an absolute path +AC_PATH_PROG([PYTHON], [$PYTHON]) + AM_PATH_PYTHON if test -z "$PYTHON"; then echo "*** Essential program python not found" 1>&2 @@ -244,8 +249,11 @@ if echo "$AGENTS_LIST" | grep -q openstack; then AC_PYTHON_MODULE(novaclient) + AC_PYTHON_MODULE(keystoneauth1) AC_PYTHON_MODULE(keystoneclient) - if test "x${HAVE_PYMOD_OPENSTACKCLIENT}" != xyes; then + if test "x${HAVE_PYMOD_NOVACLIENT}" != xyes || \ + (test "x${HAVE_PYMOD_KEYSTONEAUTH1}" != xyes || \ + test "x${HAVE_PYMOD_KEYSTONECLIENT}" != xyes); then AGENTS_LIST=$(echo "$AGENTS_LIST" | sed -E "s#openstack/fence_openstack.py( |$)##") AC_MSG_WARN("Not building fence_openstack") fi diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1537269352.7b1fd536/lib/check_used_options.py new/fence-agents-4.4.0+git.1558595666.5f79f9e9/lib/check_used_options.py --- old/fence-agents-4.2.1+git.1537269352.7b1fd536/lib/check_used_options.py 2018-09-18 13:15:52.000000000 +0200 +++ new/fence-agents-4.4.0+git.1558595666.5f79f9e9/lib/check_used_options.py 2019-05-23 09:14:26.000000000 +0200 @@ -37,6 +37,7 @@ ## check if all options are defined agent_file = open(agent) option_use_re = re.compile(r"options\[\"(-[^\"]*)\"\]") + option_in_re = re.compile(r"\"(-[^\"]*)\" in options") option_has_re = re.compile(r"options.has_key\(\"(-[^\"]*)\"\)") counter = 0 @@ -49,11 +50,15 @@ print("ERROR on line %d in %s: option %s is not defined" % (counter, agent, option_use_re.search(line).group(1))) without_errors = False - for option in option_has_re.findall(line): + for option in option_in_re.findall(line): if option not in available: print("ERROR on line %d in %s: option %s is not defined" % (counter, agent, option_has_re.search(line).group(1))) without_errors = False + for option in option_has_re.findall(line): + print("ERROR on line %d in %s: option %s: has_key() not supported in Python 3" % (counter, agent, option_has_re.search(line).group(1))) + without_errors = False + if without_errors: sys.exit(0) else: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1537269352.7b1fd536/lib/fencing.py.py new/fence-agents-4.4.0+git.1558595666.5f79f9e9/lib/fencing.py.py --- old/fence-agents-4.2.1+git.1537269352.7b1fd536/lib/fencing.py.py 2018-09-18 13:15:52.000000000 +0200 +++ new/fence-agents-4.4.0+git.1558595666.5f79f9e9/lib/fencing.py.py 2019-05-23 09:14:26.000000000 +0200 @@ -1389,6 +1389,7 @@ (name, value) = (line + "=").split("=", 1) value = value[:-1] + value = re.sub("^\"(.*)\"$", "\\1", value) if name.replace("-", "_") in mapping_longopt_names: name = mapping_longopt_names[name.replace("-", "_")] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1537269352.7b1fd536/make/fencebuild.mk new/fence-agents-4.4.0+git.1558595666.5f79f9e9/make/fencebuild.mk --- old/fence-agents-4.2.1+git.1537269352.7b1fd536/make/fencebuild.mk 2018-09-18 13:15:52.000000000 +0200 +++ new/fence-agents-4.4.0+git.1558595666.5f79f9e9/make/fencebuild.mk 2019-05-23 09:14:26.000000000 +0200 @@ -33,7 +33,7 @@ -e 's#@''PING4_CMD@#${PING4_CMD}#g' \ > $@ - if [ 0 -eq `echo "$(@)" | grep fence_ 2>&1 /dev/null; echo $$?` ]; then \ + if [ 0 -eq `echo "$(@)" | grep fence_ > /dev/null 2>&1; echo $$?` ]; then \ PYTHONPATH=$(abs_top_srcdir)/lib:$(abs_top_builddir)/lib $(PYTHON) $(top_srcdir)/lib/check_used_options.py $@; \ else true ; fi diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1537269352.7b1fd536/tests/data/metadata/fence_azure_arm.xml new/fence-agents-4.4.0+git.1558595666.5f79f9e9/tests/data/metadata/fence_azure_arm.xml --- old/fence-agents-4.2.1+git.1537269352.7b1fd536/tests/data/metadata/fence_azure_arm.xml 2018-09-18 13:15:52.000000000 +0200 +++ new/fence-agents-4.4.0+git.1558595666.5f79f9e9/tests/data/metadata/fence_azure_arm.xml 2019-05-23 09:14:26.000000000 +0200 @@ -1,6 +1,6 @@ <?xml version="1.0" ?> <resource-agent name="fence_azure_arm" shortdesc="Fence agent for Azure Resource Manager" > -<longdesc>Used to deallocate virtual machines and to report power state of virtual machines running in Azure. It uses Azure SDK for Python to connect to Azure. +<longdesc>fence_azure_arm is an I/O Fencing agent for Azure Resource Manager. It uses Azure SDK for Python to connect to Azure. For instructions to setup credentials see: https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-create-service-principal-portal diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1537269352.7b1fd536/tests/data/metadata/fence_compute.xml new/fence-agents-4.4.0+git.1558595666.5f79f9e9/tests/data/metadata/fence_compute.xml --- old/fence-agents-4.2.1+git.1537269352.7b1fd536/tests/data/metadata/fence_compute.xml 2018-09-18 13:15:52.000000000 +0200 +++ new/fence-agents-4.4.0+git.1558595666.5f79f9e9/tests/data/metadata/fence_compute.xml 2019-05-23 09:14:26.000000000 +0200 @@ -73,12 +73,22 @@ <content type="boolean" default="False" /> <shortdesc lang="en">Allow Insecure TLS Requests</shortdesc> </parameter> - <parameter name="project_domain" unique="0" required="0"> + <parameter name="project-domain" unique="0" required="0" deprecated="1"> <getopt mixed="-d, --project-domain=[name]" /> <content type="string" default="Default" /> <shortdesc lang="en">Keystone v3 Project Domain</shortdesc> </parameter> - <parameter name="user_domain" unique="0" required="0"> + <parameter name="project_domain" unique="0" required="0" obsoletes="project-domain"> + <getopt mixed="-d, --project-domain=[name]" /> + <content type="string" default="Default" /> + <shortdesc lang="en">Keystone v3 Project Domain</shortdesc> + </parameter> + <parameter name="user-domain" unique="0" required="0" deprecated="1"> + <getopt mixed="-u, --user-domain=[name]" /> + <content type="string" default="Default" /> + <shortdesc lang="en">Keystone v3 User Domain</shortdesc> + </parameter> + <parameter name="user_domain" unique="0" required="0" obsoletes="user-domain"> <getopt mixed="-u, --user-domain=[name]" /> <content type="string" default="Default" /> <shortdesc lang="en">Keystone v3 User Domain</shortdesc> @@ -103,6 +113,16 @@ <content type="string" default="False" /> <shortdesc lang="en">Only record the target as needing evacuation</shortdesc> </parameter> + <parameter name="compute-domain" unique="0" required="0" deprecated="1"> + <getopt mixed="--compute-domain=[string]" /> + <content type="string" /> + <shortdesc lang="en">Replaced by domain</shortdesc> + </parameter> + <parameter name="compute_domain" unique="0" required="0" obsoletes="compute-domain"> + <getopt mixed="--compute-domain=[string]" /> + <content type="string" /> + <shortdesc lang="en">Replaced by domain</shortdesc> + </parameter> <parameter name="quiet" unique="0" required="0"> <getopt mixed="-q, --quiet" /> <content type="boolean" /> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1537269352.7b1fd536/tests/data/metadata/fence_evacuate.xml new/fence-agents-4.4.0+git.1558595666.5f79f9e9/tests/data/metadata/fence_evacuate.xml --- old/fence-agents-4.2.1+git.1537269352.7b1fd536/tests/data/metadata/fence_evacuate.xml 2018-09-18 13:15:52.000000000 +0200 +++ new/fence-agents-4.4.0+git.1558595666.5f79f9e9/tests/data/metadata/fence_evacuate.xml 2019-05-23 09:14:26.000000000 +0200 @@ -73,12 +73,22 @@ <content type="boolean" default="False" /> <shortdesc lang="en">Allow Insecure TLS Requests</shortdesc> </parameter> - <parameter name="project_domain" unique="0" required="0"> + <parameter name="project-domain" unique="0" required="0" deprecated="1"> <getopt mixed="-d, --project-domain=[name]" /> <content type="string" default="Default" /> <shortdesc lang="en">Keystone v3 Project Domain</shortdesc> </parameter> - <parameter name="user_domain" unique="0" required="0"> + <parameter name="project_domain" unique="0" required="0" obsoletes="project-domain"> + <getopt mixed="-d, --project-domain=[name]" /> + <content type="string" default="Default" /> + <shortdesc lang="en">Keystone v3 Project Domain</shortdesc> + </parameter> + <parameter name="user-domain" unique="0" required="0" deprecated="1"> + <getopt mixed="-u, --user-domain=[name]" /> + <content type="string" default="Default" /> + <shortdesc lang="en">Keystone v3 User Domain</shortdesc> + </parameter> + <parameter name="user_domain" unique="0" required="0" obsoletes="user-domain"> <getopt mixed="-u, --user-domain=[name]" /> <content type="string" default="Default" /> <shortdesc lang="en">Keystone v3 User Domain</shortdesc> @@ -98,6 +108,16 @@ <content type="boolean" default="False" /> <shortdesc lang="en">Disable functionality for dealing with shared storage</shortdesc> </parameter> + <parameter name="compute-domain" unique="0" required="0" deprecated="1"> + <getopt mixed="--compute-domain=[string]" /> + <content type="string" /> + <shortdesc lang="en">Replaced by domain</shortdesc> + </parameter> + <parameter name="compute_domain" unique="0" required="0" obsoletes="compute-domain"> + <getopt mixed="--compute-domain=[string]" /> + <content type="string" /> + <shortdesc lang="en">Replaced by domain</shortdesc> + </parameter> <parameter name="quiet" unique="0" required="0"> <getopt mixed="-q, --quiet" /> <content type="boolean" /> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1537269352.7b1fd536/tests/data/metadata/fence_idrac.xml new/fence-agents-4.4.0+git.1558595666.5f79f9e9/tests/data/metadata/fence_idrac.xml --- old/fence-agents-4.2.1+git.1537269352.7b1fd536/tests/data/metadata/fence_idrac.xml 2018-09-18 13:15:52.000000000 +0200 +++ new/fence-agents-4.4.0+git.1558595666.5f79f9e9/tests/data/metadata/fence_idrac.xml 2019-05-23 09:14:26.000000000 +0200 @@ -189,6 +189,11 @@ <content type="second" default="3" /> <shortdesc lang="en">Wait X seconds for cmd prompt after issuing command</shortdesc> </parameter> + <parameter name="ipmitool_timeout" unique="0" required="0"> + <getopt mixed="--ipmitool-timeout=[timeout]" /> + <content type="string" default="2" /> + <shortdesc lang="en">Timeout (sec) for IPMI operation</shortdesc> + </parameter> <parameter name="retry_on" unique="0" required="0"> <getopt mixed="--retry-on=[attempts]" /> <content type="integer" default="1" /> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1537269352.7b1fd536/tests/data/metadata/fence_ilo3.xml new/fence-agents-4.4.0+git.1558595666.5f79f9e9/tests/data/metadata/fence_ilo3.xml --- old/fence-agents-4.2.1+git.1537269352.7b1fd536/tests/data/metadata/fence_ilo3.xml 2018-09-18 13:15:52.000000000 +0200 +++ new/fence-agents-4.4.0+git.1558595666.5f79f9e9/tests/data/metadata/fence_ilo3.xml 2019-05-23 09:14:26.000000000 +0200 @@ -189,6 +189,11 @@ <content type="second" default="3" /> <shortdesc lang="en">Wait X seconds for cmd prompt after issuing command</shortdesc> </parameter> + <parameter name="ipmitool_timeout" unique="0" required="0"> + <getopt mixed="--ipmitool-timeout=[timeout]" /> + <content type="string" default="2" /> + <shortdesc lang="en">Timeout (sec) for IPMI operation</shortdesc> + </parameter> <parameter name="retry_on" unique="0" required="0"> <getopt mixed="--retry-on=[attempts]" /> <content type="integer" default="1" /> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1537269352.7b1fd536/tests/data/metadata/fence_ilo4.xml new/fence-agents-4.4.0+git.1558595666.5f79f9e9/tests/data/metadata/fence_ilo4.xml --- old/fence-agents-4.2.1+git.1537269352.7b1fd536/tests/data/metadata/fence_ilo4.xml 2018-09-18 13:15:52.000000000 +0200 +++ new/fence-agents-4.4.0+git.1558595666.5f79f9e9/tests/data/metadata/fence_ilo4.xml 2019-05-23 09:14:26.000000000 +0200 @@ -189,6 +189,11 @@ <content type="second" default="3" /> <shortdesc lang="en">Wait X seconds for cmd prompt after issuing command</shortdesc> </parameter> + <parameter name="ipmitool_timeout" unique="0" required="0"> + <getopt mixed="--ipmitool-timeout=[timeout]" /> + <content type="string" default="2" /> + <shortdesc lang="en">Timeout (sec) for IPMI operation</shortdesc> + </parameter> <parameter name="retry_on" unique="0" required="0"> <getopt mixed="--retry-on=[attempts]" /> <content type="integer" default="1" /> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1537269352.7b1fd536/tests/data/metadata/fence_ilo5.xml new/fence-agents-4.4.0+git.1558595666.5f79f9e9/tests/data/metadata/fence_ilo5.xml --- old/fence-agents-4.2.1+git.1537269352.7b1fd536/tests/data/metadata/fence_ilo5.xml 2018-09-18 13:15:52.000000000 +0200 +++ new/fence-agents-4.4.0+git.1558595666.5f79f9e9/tests/data/metadata/fence_ilo5.xml 2019-05-23 09:14:26.000000000 +0200 @@ -189,6 +189,11 @@ <content type="second" default="3" /> <shortdesc lang="en">Wait X seconds for cmd prompt after issuing command</shortdesc> </parameter> + <parameter name="ipmitool_timeout" unique="0" required="0"> + <getopt mixed="--ipmitool-timeout=[timeout]" /> + <content type="string" default="2" /> + <shortdesc lang="en">Timeout (sec) for IPMI operation</shortdesc> + </parameter> <parameter name="retry_on" unique="0" required="0"> <getopt mixed="--retry-on=[attempts]" /> <content type="integer" default="1" /> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1537269352.7b1fd536/tests/data/metadata/fence_imm.xml new/fence-agents-4.4.0+git.1558595666.5f79f9e9/tests/data/metadata/fence_imm.xml --- old/fence-agents-4.2.1+git.1537269352.7b1fd536/tests/data/metadata/fence_imm.xml 2018-09-18 13:15:52.000000000 +0200 +++ new/fence-agents-4.4.0+git.1558595666.5f79f9e9/tests/data/metadata/fence_imm.xml 2019-05-23 09:14:26.000000000 +0200 @@ -189,6 +189,11 @@ <content type="second" default="3" /> <shortdesc lang="en">Wait X seconds for cmd prompt after issuing command</shortdesc> </parameter> + <parameter name="ipmitool_timeout" unique="0" required="0"> + <getopt mixed="--ipmitool-timeout=[timeout]" /> + <content type="string" default="2" /> + <shortdesc lang="en">Timeout (sec) for IPMI operation</shortdesc> + </parameter> <parameter name="retry_on" unique="0" required="0"> <getopt mixed="--retry-on=[attempts]" /> <content type="integer" default="1" /> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1537269352.7b1fd536/tests/data/metadata/fence_ipmilan.xml new/fence-agents-4.4.0+git.1558595666.5f79f9e9/tests/data/metadata/fence_ipmilan.xml --- old/fence-agents-4.2.1+git.1537269352.7b1fd536/tests/data/metadata/fence_ipmilan.xml 2018-09-18 13:15:52.000000000 +0200 +++ new/fence-agents-4.4.0+git.1558595666.5f79f9e9/tests/data/metadata/fence_ipmilan.xml 2019-05-23 09:14:26.000000000 +0200 @@ -189,6 +189,11 @@ <content type="second" default="3" /> <shortdesc lang="en">Wait X seconds for cmd prompt after issuing command</shortdesc> </parameter> + <parameter name="ipmitool_timeout" unique="0" required="0"> + <getopt mixed="--ipmitool-timeout=[timeout]" /> + <content type="string" default="2" /> + <shortdesc lang="en">Timeout (sec) for IPMI operation</shortdesc> + </parameter> <parameter name="retry_on" unique="0" required="0"> <getopt mixed="--retry-on=[attempts]" /> <content type="integer" default="1" /> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1537269352.7b1fd536/tests/data/metadata/fence_pve.xml new/fence-agents-4.4.0+git.1558595666.5f79f9e9/tests/data/metadata/fence_pve.xml --- old/fence-agents-4.2.1+git.1537269352.7b1fd536/tests/data/metadata/fence_pve.xml 2018-09-18 13:15:52.000000000 +0200 +++ new/fence-agents-4.4.0+git.1558595666.5f79f9e9/tests/data/metadata/fence_pve.xml 2019-05-23 09:14:26.000000000 +0200 @@ -38,6 +38,14 @@ <content type="string" default="root@pam" /> <shortdesc lang="en">Login name</shortdesc> </parameter> + <parameter name="method" unique="0" required="0"> + <getopt mixed="-m, --method=[method]" /> + <content type="select" default="onoff" > + <option value="onoff" /> + <option value="cycle" /> + </content> + <shortdesc lang="en">Method to fence</shortdesc> + </parameter> <parameter name="passwd" unique="0" required="0" deprecated="1"> <getopt mixed="-p, --password=[password]" /> <content type="string" /> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1537269352.7b1fd536/tests/data/metadata/fence_redfish.xml new/fence-agents-4.4.0+git.1558595666.5f79f9e9/tests/data/metadata/fence_redfish.xml --- old/fence-agents-4.2.1+git.1537269352.7b1fd536/tests/data/metadata/fence_redfish.xml 1970-01-01 01:00:00.000000000 +0100 +++ new/fence-agents-4.4.0+git.1558595666.5f79f9e9/tests/data/metadata/fence_redfish.xml 2019-05-23 09:14:26.000000000 +0200 @@ -0,0 +1,191 @@ +<?xml version="1.0" ?> +<resource-agent name="fence_redfish" shortdesc="I/O Fencing agent for Redfish" > +<longdesc>fence_redfish is an I/O Fencing agent which can be used with Out-of-Band controllers that support Redfish APIs. These controllers provide remote access to control power on a server.</longdesc> +<vendor-url>http://www.dmtf.org</vendor-url> +<parameters> + <parameter name="action" unique="0" required="1"> + <getopt mixed="-o, --action=[action]" /> + <content type="string" default="reboot" /> + <shortdesc lang="en">Fencing action</shortdesc> + </parameter> + <parameter name="inet4_only" unique="0" required="0"> + <getopt mixed="-4, --inet4-only" /> + <content type="boolean" /> + <shortdesc lang="en">Forces agent to use IPv4 addresses only</shortdesc> + </parameter> + <parameter name="inet6_only" unique="0" required="0"> + <getopt mixed="-6, --inet6-only" /> + <content type="boolean" /> + <shortdesc lang="en">Forces agent to use IPv6 addresses only</shortdesc> + </parameter> + <parameter name="ip" unique="0" required="0" obsoletes="ipaddr"> + <getopt mixed="-a, --ip=[ip]" /> + <content type="string" /> + <shortdesc lang="en">IP address or hostname of fencing device</shortdesc> + </parameter> + <parameter name="ipaddr" unique="0" required="0" deprecated="1"> + <getopt mixed="-a, --ip=[ip]" /> + <content type="string" /> + <shortdesc lang="en">IP address or hostname of fencing device</shortdesc> + </parameter> + <parameter name="ipport" unique="0" required="0"> + <getopt mixed="-u, --ipport=[port]" /> + <content type="integer" default="443" /> + <shortdesc lang="en">TCP/UDP port to use for connection with device</shortdesc> + </parameter> + <parameter name="login" unique="0" required="1" deprecated="1"> + <getopt mixed="-l, --username=[name]" /> + <content type="string" /> + <shortdesc lang="en">Login name</shortdesc> + </parameter> + <parameter name="passwd" unique="0" required="0" deprecated="1"> + <getopt mixed="-p, --password=[password]" /> + <content type="string" /> + <shortdesc lang="en">Login password or passphrase</shortdesc> + </parameter> + <parameter name="passwd_script" unique="0" required="0" deprecated="1"> + <getopt mixed="-S, --password-script=[script]" /> + <content type="string" /> + <shortdesc lang="en">Script to run to retrieve password</shortdesc> + </parameter> + <parameter name="password" unique="0" required="0" obsoletes="passwd"> + <getopt mixed="-p, --password=[password]" /> + <content type="string" /> + <shortdesc lang="en">Login password or passphrase</shortdesc> + </parameter> + <parameter name="password_script" unique="0" required="0" obsoletes="passwd_script"> + <getopt mixed="-S, --password-script=[script]" /> + <content type="string" /> + <shortdesc lang="en">Script to run to retrieve password</shortdesc> + </parameter> + <parameter name="plug" unique="0" required="0" obsoletes="port"> + <getopt mixed="-n, --plug=[ip]" /> + <content type="string" /> + <shortdesc lang="en">IP address or hostname of fencing device (together with --port-as-ip)</shortdesc> + </parameter> + <parameter name="port" unique="0" required="0" deprecated="1"> + <getopt mixed="-n, --plug=[ip]" /> + <content type="string" /> + <shortdesc lang="en">IP address or hostname of fencing device (together with --port-as-ip)</shortdesc> + </parameter> + <parameter name="redfish-uri" unique="0" required="0" deprecated="1"> + <getopt mixed="--redfish-uri=[uri]" /> + <content type="string" default="/redfish/v1" /> + <shortdesc lang="en">Base or starting Redfish URI</shortdesc> + </parameter> + <parameter name="redfish_uri" unique="0" required="0" obsoletes="redfish-uri"> + <getopt mixed="--redfish-uri=[uri]" /> + <content type="string" default="/redfish/v1" /> + <shortdesc lang="en">Base or starting Redfish URI</shortdesc> + </parameter> + <parameter name="ssl" unique="0" required="0"> + <getopt mixed="-z, --ssl" /> + <content type="boolean" default="1" /> + <shortdesc lang="en">Use SSL connection with verifying certificate</shortdesc> + </parameter> + <parameter name="ssl_insecure" unique="0" required="0"> + <getopt mixed="--ssl-insecure" /> + <content type="boolean" /> + <shortdesc lang="en">Use SSL connection without verifying certificate</shortdesc> + </parameter> + <parameter name="ssl_secure" unique="0" required="0"> + <getopt mixed="--ssl-secure" /> + <content type="boolean" /> + <shortdesc lang="en">Use SSL connection with verifying certificate</shortdesc> + </parameter> + <parameter name="systems-uri" unique="0" required="0" deprecated="1"> + <getopt mixed="--systems-uri=[uri]" /> + <content type="string" /> + <shortdesc lang="en">Redfish Systems resource URI, i.e. /redfish/v1/Systems/System.Embedded.1</shortdesc> + </parameter> + <parameter name="systems_uri" unique="0" required="0" obsoletes="systems-uri"> + <getopt mixed="--systems-uri=[uri]" /> + <content type="string" /> + <shortdesc lang="en">Redfish Systems resource URI, i.e. /redfish/v1/Systems/System.Embedded.1</shortdesc> + </parameter> + <parameter name="username" unique="0" required="1" obsoletes="login"> + <getopt mixed="-l, --username=[name]" /> + <content type="string" /> + <shortdesc lang="en">Login name</shortdesc> + </parameter> + <parameter name="quiet" unique="0" required="0"> + <getopt mixed="-q, --quiet" /> + <content type="boolean" /> + <shortdesc lang="en">Disable logging to stderr. Does not affect --verbose or --debug-file or logging to syslog.</shortdesc> + </parameter> + <parameter name="verbose" unique="0" required="0"> + <getopt mixed="-v, --verbose" /> + <content type="boolean" /> + <shortdesc lang="en">Verbose mode</shortdesc> + </parameter> + <parameter name="debug" unique="0" required="0" deprecated="1"> + <getopt mixed="-D, --debug-file=[debugfile]" /> + <content type="string" /> + <shortdesc lang="en">Write debug information to given file</shortdesc> + </parameter> + <parameter name="debug_file" unique="0" required="0" obsoletes="debug"> + <getopt mixed="-D, --debug-file=[debugfile]" /> + <content type="string" /> + <shortdesc lang="en">Write debug information to given file</shortdesc> + </parameter> + <parameter name="version" unique="0" required="0"> + <getopt mixed="-V, --version" /> + <content type="boolean" /> + <shortdesc lang="en">Display version information and exit</shortdesc> + </parameter> + <parameter name="help" unique="0" required="0"> + <getopt mixed="-h, --help" /> + <content type="boolean" /> + <shortdesc lang="en">Display help and exit</shortdesc> + </parameter> + <parameter name="delay" unique="0" required="0"> + <getopt mixed="--delay=[seconds]" /> + <content type="second" default="0" /> + <shortdesc lang="en">Wait X seconds before fencing is started</shortdesc> + </parameter> + <parameter name="login_timeout" unique="0" required="0"> + <getopt mixed="--login-timeout=[seconds]" /> + <content type="second" default="5" /> + <shortdesc lang="en">Wait X seconds for cmd prompt after login</shortdesc> + </parameter> + <parameter name="port_as_ip" unique="0" required="0"> + <getopt mixed="--port-as-ip" /> + <content type="boolean" /> + <shortdesc lang="en">Make "port/plug" to be an alias to IP address</shortdesc> + </parameter> + <parameter name="power_timeout" unique="0" required="0"> + <getopt mixed="--power-timeout=[seconds]" /> + <content type="second" default="20" /> + <shortdesc lang="en">Test X seconds for status change after ON/OFF</shortdesc> + </parameter> + <parameter name="power_wait" unique="0" required="0"> + <getopt mixed="--power-wait=[seconds]" /> + <content type="second" default="0" /> + <shortdesc lang="en">Wait X seconds after issuing ON/OFF</shortdesc> + </parameter> + <parameter name="shell_timeout" unique="0" required="0"> + <getopt mixed="--shell-timeout=[seconds]" /> + <content type="second" default="3" /> + <shortdesc lang="en">Wait X seconds for cmd prompt after issuing command</shortdesc> + </parameter> + <parameter name="retry_on" unique="0" required="0"> + <getopt mixed="--retry-on=[attempts]" /> + <content type="integer" default="1" /> + <shortdesc lang="en">Count of attempts to retry power on</shortdesc> + </parameter> + <parameter name="gnutlscli_path" unique="0" required="0"> + <getopt mixed="--gnutlscli-path=[path]" /> + <shortdesc lang="en">Path to gnutls-cli binary</shortdesc> + </parameter> +</parameters> +<actions> + <action name="on" automatic="0"/> + <action name="off" /> + <action name="reboot" /> + <action name="status" /> + <action name="monitor" /> + <action name="metadata" /> + <action name="manpage" /> + <action name="validate-all" /> +</actions> +</resource-agent> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1537269352.7b1fd536/tests/data/metadata/fence_rhevm.xml new/fence-agents-4.4.0+git.1558595666.5f79f9e9/tests/data/metadata/fence_rhevm.xml --- old/fence-agents-4.2.1+git.1537269352.7b1fd536/tests/data/metadata/fence_rhevm.xml 2018-09-18 13:15:52.000000000 +0200 +++ new/fence-agents-4.4.0+git.1558595666.5f79f9e9/tests/data/metadata/fence_rhevm.xml 2019-05-23 09:14:26.000000000 +0200 @@ -98,6 +98,11 @@ <content type="string" /> <shortdesc lang="en">Login name</shortdesc> </parameter> + <parameter name="api_version" unique="0" required="0"> + <getopt mixed="--api-version" /> + <content type="string" default="auto" /> + <shortdesc lang="en">Version of RHEV API (default: auto)</shortdesc> + </parameter> <parameter name="api_path" unique="0" required="0"> <getopt mixed="--api-path=[path]" /> <shortdesc lang="en">The path part of the API URL</shortdesc> @@ -164,7 +169,7 @@ </parameter> <parameter name="shell_timeout" unique="0" required="0"> <getopt mixed="--shell-timeout=[seconds]" /> - <content type="second" default="3" /> + <content type="second" default="5" /> <shortdesc lang="en">Wait X seconds for cmd prompt after issuing command</shortdesc> </parameter> <parameter name="retry_on" unique="0" required="0"> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1537269352.7b1fd536/tests/data/metadata/fence_scsi.xml new/fence-agents-4.4.0+git.1558595666.5f79f9e9/tests/data/metadata/fence_scsi.xml --- old/fence-agents-4.2.1+git.1537269352.7b1fd536/tests/data/metadata/fence_scsi.xml 2018-09-18 13:15:52.000000000 +0200 +++ new/fence-agents-4.4.0+git.1558595666.5f79f9e9/tests/data/metadata/fence_scsi.xml 2019-05-23 09:14:26.000000000 +0200 @@ -1,7 +1,9 @@ <?xml version="1.0" ?> <resource-agent name="fence_scsi" shortdesc="Fence agent for SCSI persistent reservation" > <longdesc>fence_scsi is an I/O fencing agent that uses SCSI-3 persistent reservations to control access to shared storage devices. These devices must support SCSI-3 persistent reservations (SPC-3 or greater) as well as the "preempt-and-abort" subcommand. -The fence_scsi agent works by having each node in the cluster register a unique key with the SCSI device(s). Once registered, a single node will become the reservation holder by creating a "write exclusive, registrants only" reservation on the device(s). The result is that only registered nodes may write to the device(s). When a node failure occurs, the fence_scsi agent will remove the key belonging to the failed node from the device(s). The failed node will no longer be able to write to the device(s). A manual reboot is required.</longdesc> +The fence_scsi agent works by having each node in the cluster register a unique key with the SCSI device(s). Once registered, a single node will become the reservation holder by creating a "write exclusive, registrants only" reservation on the device(s). The result is that only registered nodes may write to the device(s). When a node failure occurs, the fence_scsi agent will remove the key belonging to the failed node from the device(s). The failed node will no longer be able to write to the device(s). A manual reboot is required. + +When used as a watchdog device you can define e.g. retry=1, retry-sleep=2 and verbose=yes parameters in /etc/sysconfig/stonith if you have issues with it failing.</longdesc> <vendor-url></vendor-url> <parameters> <parameter name="action" unique="0" required="1">