import OL fence-agents-4.16.0-13.el10_1.1

This commit is contained in:
eabdullin 2025-12-22 06:18:12 +00:00
parent e959db0a47
commit 93c01e67ad
9 changed files with 345 additions and 18 deletions

View File

@ -0,0 +1,69 @@
From 03c599c9d2d5a42b4aea6db66e3a50263fb78440 Mon Sep 17 00:00:00 2001
From: Govindarajan Soundararajan <govindarajan.s@nutanix.com>
Date: Thu, 30 Jan 2025 02:01:28 -0800
Subject: [PATCH] fence_nutanix_ahv: Handle API rate limits (#604)
Nutanix Prism Central has rate limits set on
various API end points. The fence agent should
handle such rate limit errors and retry API requests
appropriately if it encounters any such errors. This
change adds retries for HTTP error 429 (rate limit),
and also for HTTP errors 500, and 503.
---
agents/nutanix_ahv/fence_nutanix_ahv.py | 17 +++++++++++++----
1 file changed, 13 insertions(+), 4 deletions(-)
diff --git a/agents/nutanix_ahv/fence_nutanix_ahv.py b/agents/nutanix_ahv/fence_nutanix_ahv.py
index 1a422ddad..67e6d907c 100644
--- a/agents/nutanix_ahv/fence_nutanix_ahv.py
+++ b/agents/nutanix_ahv/fence_nutanix_ahv.py
@@ -10,6 +10,8 @@
import time
import uuid
import requests
+from requests.adapters import HTTPAdapter
+from requests.packages.urllib3.util.retry import Retry
sys.path.append("@FENCEAGENTSLIBDIR@")
from fencing import *
@@ -20,6 +22,7 @@
MIN_TIMEOUT = 60
PC_PORT = 9440
POWER_STATES = {"ON": "on", "OFF": "off", "PAUSED": "off", "UNKNOWN": "unknown"}
+MAX_RETRIES = 5
class NutanixClientException(Exception):
@@ -44,22 +47,28 @@ def __init__(self, username, password, disable_warnings=False):
self.password = password
self.valid_status_codes = [200, 202]
self.disable_warnings = disable_warnings
+ self.session = requests.Session()
+ self.session.auth = (self.username, self.password)
+
+ retry_strategy = Retry(total=MAX_RETRIES,
+ backoff_factor=1,
+ status_forcelist=[429, 500, 503])
+
+ self.session.mount("https://", HTTPAdapter(max_retries=retry_strategy))
def request(self, url, method='GET', headers=None, **kwargs):
- session = requests.Session()
- session.auth = (self.username, self.password)
if self.disable_warnings:
requests.packages.urllib3.disable_warnings()
if headers:
- session.headers.update(headers)
+ self.session.headers.update(headers)
response = None
try:
logging.debug("Sending %s request to %s", method, url)
- response = session.request(method, url, **kwargs)
+ response = self.session.request(method, url, **kwargs)
response.raise_for_status()
except requests.exceptions.SSLError as err:
logging.error("Secure connection failed, verify SSL certificate")

View File

@ -0,0 +1,39 @@
From 345a609a34ea153e168b15d48eb8f2dd8d017f04 Mon Sep 17 00:00:00 2001
From: Oyvind Albrigtsen <oalbrigt@redhat.com>
Date: Wed, 23 Apr 2025 15:25:13 +0200
Subject: [PATCH] fence_nutanix_ahv: update metadata to fix incorrect agent
name and align with other agents metadata
---
agents/nutanix_ahv/fence_nutanix_ahv.py | 4 ++--
tests/data/metadata/fence_nutanix_ahv.xml | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/agents/nutanix_ahv/fence_nutanix_ahv.py b/agents/nutanix_ahv/fence_nutanix_ahv.py
index 67e6d907c..c18d6a46e 100644
--- a/agents/nutanix_ahv/fence_nutanix_ahv.py
+++ b/agents/nutanix_ahv/fence_nutanix_ahv.py
@@ -563,8 +563,8 @@ def main():
all_opt["power_timeout"]["default"] = str(MIN_TIMEOUT)
options = check_input(device_opt, process_input(device_opt))
docs = {}
- docs["shortdesc"] = "Fencing agent for Nutanix AHV Cluster VMs."
- docs["longdesc"] = """fence_ahv is a power fencing agent for \
+ docs["shortdesc"] = "Fence agent for Nutanix AHV Cluster VMs."
+ docs["longdesc"] = """fence_nutanix_ahv is a Power Fencing agent for \
virtual machines deployed on Nutanix AHV cluster with the AHV cluster \
being managed by Prism Central."""
docs["vendorurl"] = "https://www.nutanix.com"
diff --git a/tests/data/metadata/fence_nutanix_ahv.xml b/tests/data/metadata/fence_nutanix_ahv.xml
index bbc307b1d..2de4b01ad 100644
--- a/tests/data/metadata/fence_nutanix_ahv.xml
+++ b/tests/data/metadata/fence_nutanix_ahv.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" ?>
-<resource-agent name="fence_nutanix_ahv" shortdesc="Fencing agent for Nutanix AHV Cluster VMs." >
-<longdesc>fence_ahv is a power fencing agent for virtual machines deployed on Nutanix AHV cluster with the AHV cluster being managed by Prism Central.</longdesc>
+<resource-agent name="fence_nutanix_ahv" shortdesc="Fence agent for Nutanix AHV Cluster VMs." >
+<longdesc>fence_nutanix_ahv is a Power Fencing agent for virtual machines deployed on Nutanix AHV cluster with the AHV cluster being managed by Prism Central.</longdesc>
<vendor-url>https://www.nutanix.com</vendor-url>
<parameters>
<parameter name="action" unique="0" required="1">

View File

@ -61,7 +61,7 @@ index 5459a06c4..cddca4580 100644
+ "help" : "--skip-os-shutdown=[true|false] Uses SkipOsShutdown flag",
+ "shortdesc" : "Use SkipOsShutdown flag to stop the EC2 instance",
+ "required" : "0",
+ "default" : "false",
+ "default" : "true",
+ "order" : 8
+ }
@ -84,7 +84,7 @@ index ad471c797..c53873bbe 100644
</parameter>
+ <parameter name="skip_os_shutdown" unique="0" required="0">
+ <getopt mixed="--skip-os-shutdown=[true|false]" />
+ <content type="string" default="false" />
+ <content type="string" default="true" />
+ <shortdesc lang="en">Use SkipOsShutdown flag to stop the EC2 instance</shortdesc>
+ </parameter>
<parameter name="quiet" unique="0" required="0">

View File

@ -0,0 +1,160 @@
From f73b6b4465de1bf2b2887efd3b9767d3f36abd24 Mon Sep 17 00:00:00 2001
From: xin liang <xliang@suse.com>
Date: Fri, 26 Jul 2024 10:49:55 +0800
Subject: [PATCH 1/3] fence_sbd: if sbd devices are not specified with option,
read SBD_DEVICE
from environment
---
agents/sbd/fence_sbd.py | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/agents/sbd/fence_sbd.py b/agents/sbd/fence_sbd.py
index bf95bb72e..c36220295 100644
--- a/agents/sbd/fence_sbd.py
+++ b/agents/sbd/fence_sbd.py
@@ -342,7 +342,7 @@ def define_new_opts():
"longopt" : "devices",
"help":"--devices=[device_a,device_b] \
Comma separated list of sbd devices",
- "required" : "1",
+ "required" : "0",
"shortdesc" : "SBD Device",
"order": 1
}
@@ -382,10 +382,14 @@ def main():
docs["vendorurl"] = ""
show_docs(options, docs)
- # We need to check if --devices is given and not empty.
+ # If not specified then read SBD_DEVICE from environment
if "--devices" not in options:
- fail_usage("No SBD devices specified. \
- At least one SBD device is required.")
+ dev_list = os.getenv("SBD_DEVICE")
+ if dev_list:
+ options["--devices"] = ",".join(dev_list.split(";"))
+ else:
+ fail_usage("No SBD devices specified. \
+ At least one SBD device is required.")
run_delay(options)
From 744d534225b51db26058660b753df2991b9356a0 Mon Sep 17 00:00:00 2001
From: xin liang <xliang@suse.com>
Date: Fri, 26 Jul 2024 17:45:07 +0800
Subject: [PATCH 2/3] fence_sbd: Update fence_sbd.xml
---
tests/data/metadata/fence_sbd.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/data/metadata/fence_sbd.xml b/tests/data/metadata/fence_sbd.xml
index 82ded25b9..c2daf0c54 100644
--- a/tests/data/metadata/fence_sbd.xml
+++ b/tests/data/metadata/fence_sbd.xml
@@ -8,7 +8,7 @@
<content type="string" default="reboot" />
<shortdesc lang="en">Fencing action</shortdesc>
</parameter>
- <parameter name="devices" unique="0" required="1">
+ <parameter name="devices" unique="0" required="0">
<getopt mixed="--devices=[device_a,device_b]" />
<content type="string" />
<shortdesc lang="en">SBD Device</shortdesc>
From 06457f95a4d89d4b6a856ae14ccbcda4d357bef6 Mon Sep 17 00:00:00 2001
From: xin liang <xliang@suse.com>
Date: Tue, 10 Dec 2024 10:00:00 +0800
Subject: [PATCH 3/3] fence_sbd: Check if the sbd daemon is running before
using SBD_DEVICE enviroment variable
And add @SBDPID_PATH@ for the sbd daemon pid file path
---
agents/sbd/fence_sbd.py | 31 ++++++++++++++++++++++++++++++-
configure.ac | 2 ++
make/fencebuild.mk | 1 +
3 files changed, 33 insertions(+), 1 deletion(-)
diff --git a/agents/sbd/fence_sbd.py b/agents/sbd/fence_sbd.py
index c36220295..bebc7fae1 100644
--- a/agents/sbd/fence_sbd.py
+++ b/agents/sbd/fence_sbd.py
@@ -14,6 +14,7 @@
DEVICE_NOT_INIT = -3
PATH_NOT_EXISTS = -1
PATH_NOT_BLOCK = -2
+SBD_PID_FILE = "@SBDPID_PATH@"
def is_block_device(filename):
"""Checks if a given path is a valid block device
@@ -356,6 +357,34 @@ def define_new_opts():
"order": 200
}
+
+def sbd_daemon_is_running():
+ """Check if the sbd daemon is running
+ """
+ if not os.path.exists(SBD_PID_FILE):
+ logging.info("SBD PID file %s does not exist", SBD_PID_FILE)
+ return False
+
+ try:
+ with open(SBD_PID_FILE, "r") as pid_file:
+ pid = int(pid_file.read().strip())
+ except Exception as e:
+ logging.error("Failed to read PID file %s: %s", SBD_PID_FILE, e)
+ return False
+
+ try:
+ # send signal 0 to check if the process is running
+ os.kill(pid, 0)
+ except ProcessLookupError:
+ logging.info("SBD daemon is not running")
+ return False
+ except Exception as e:
+ logging.error("Failed to send signal 0 to PID %d: %s", pid, e)
+ return False
+
+ return True
+
+
def main():
"""Main function
"""
@@ -385,7 +414,7 @@ def main():
# If not specified then read SBD_DEVICE from environment
if "--devices" not in options:
dev_list = os.getenv("SBD_DEVICE")
- if dev_list:
+ if dev_list and sbd_daemon_is_running():
options["--devices"] = ",".join(dev_list.split(";"))
else:
fail_usage("No SBD devices specified. \
diff --git a/configure.ac b/configure.ac
index 6b7322419..0425a9d21 100644
--- a/configure.ac
+++ b/configure.ac
@@ -145,6 +145,8 @@ eval FENCETMPDIR="`eval echo ${FENCETMPDIR}`"
AC_DEFINE_UNQUOTED(FENCETMPDIR,"$FENCETMPDIR", Where Fence agents keep state files)
AC_SUBST(FENCETMPDIR)
+SBDPID_PATH=${localstatedir}/run/sbd.pid
+AC_SUBST(SBDPID_PATH)
if test "x$AGENTS_LIST" = x; then
AC_ERROR([No agents selected])
diff --git a/make/fencebuild.mk b/make/fencebuild.mk
index 9a3c6d6dd..bc9259190 100644
--- a/make/fencebuild.mk
+++ b/make/fencebuild.mk
@@ -9,6 +9,7 @@ define gen_agent_from_py
-e 's#@''SBINDIR@#${sbindir}#g' \
-e 's#@''LIBEXECDIR@#${libexecdir}#g' \
-e 's#@''FENCETMPDIR@#${FENCETMPDIR}#g' \
+ -e 's#@''SBDPID_PATH@#${SBDPID_PATH}#g' \
-e 's#@''IPMITOOL_PATH@#${IPMITOOL_PATH}#g' \
-e 's#@''OPENSTACK_PATH@#${OPENSTACK_PATH}#g' \
-e 's#@''AMTTOOL_PATH@#${AMTTOOL_PATH}#g' \

View File

@ -0,0 +1,21 @@
From 988cbd9fb600261106d5da1db6a7bf9cde218eaa Mon Sep 17 00:00:00 2001
From: Oyvind Albrigtsen <oalbrigt@redhat.com>
Date: Fri, 25 Apr 2025 16:38:03 +0200
Subject: [PATCH] fence_ibm_powervs: fix plaintext token file support
---
agents/ibm_powervs/fence_ibm_powervs.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/agents/ibm_powervs/fence_ibm_powervs.py b/agents/ibm_powervs/fence_ibm_powervs.py
index ec9a0c11d..d408e8727 100755
--- a/agents/ibm_powervs/fence_ibm_powervs.py
+++ b/agents/ibm_powervs/fence_ibm_powervs.py
@@ -35,6 +35,7 @@ def get_token(conn, options):
api_key = keys.get("apikey", "")
# data is text, return as is
except ValueError:
+ f.seek(0)
api_key = f.read().strip()
except FileNotFoundError:
logging.debug("Failed: Cannot open file {}".format(key_file))

View File

@ -13,7 +13,7 @@
Name: fence-agents
Summary: Set of unified programs capable of host isolation ("fencing")
Version: 4.16.0
Release: 5%{?alphatag:.%{alphatag}}%{?dist}.6
Release: 13%{?alphatag:.%{alphatag}}%{?dist}.1
License: GPL-2.0-or-later AND LGPL-2.0-or-later
URL: https://github.com/ClusterLabs/fence-agents
Source0: https://fedorahosted.org/releases/f/e/fence-agents/%{name}-%{version}.tar.gz
@ -106,12 +106,16 @@ Patch5: ha-cloud-support-google.patch
Patch6: bundled-kubevirt.patch
Patch7: bundled-pycurl.patch
Patch8: bundled-suds.patch
Patch9: RHEL-83774-fence_ibm_vpc-refresh-bearer-token.patch
Patch10: RHEL-107530-fence_ibm_vpc-add-apikey-file-support.patch
Patch11: RHEL-109922-fence_aws-add-skipshutdown-parameter.patch
Patch12: RHEL-96184-fence_kubevirt-force-off.patch
Patch9: RHEL-83520-fence_ibm_vpc-refresh-bearer-token.patch
Patch10: RHEL-79799-fence_sbd-get-devices-from-SBD_DEVICE-if-devices-parameter-isnt-set.patch
Patch11: RHEL-68322-1-fence_nutanix_ahv-handle-api-rate-limits.patch
Patch12: RHEL-68322-2-fence_nutanix_ahv-update-metadata.patch
Patch13: RHEL-88569-fence_ibm_powervs-fix-plaintext-token-file-support.patch
Patch14: RHEL-95379-fence_kubevirt-force-off.patch
Patch15: RHEL-107504-fence_ibm_vpc-add-apikey-file-support.patch
Patch16: RHEL-78241-fence_aws-add-skipshutdown-parameter.patch
%global supportedagents amt_ws apc apc_snmp bladecenter brocade cisco_mds cisco_ucs drac5 eaton_snmp emerson eps hpblade ibmblade ibm_powervs ibm_vpc ifmib ilo ilo_moonshot ilo_mp ilo_ssh intelmodular ipdu ipmilan kdump kubevirt lpar mpath redfish rhevm rsa rsb sbd scsi vmware_rest vmware_soap wti
%global supportedagents amt_ws apc apc_snmp bladecenter brocade cisco_mds cisco_ucs drac5 eaton_snmp emerson eps hpblade ibmblade ibm_powervs ibm_vpc ifmib ilo ilo_moonshot ilo_mp ilo_ssh intelmodular ipdu ipmilan kdump kubevirt lpar mpath nutanix_ahv redfish rhevm rsa rsb sbd scsi vmware_rest vmware_soap wti
%ifarch x86_64
%global testagents virsh heuristics_ping aliyun aws azure_arm gce openstack virt
%endif
@ -229,8 +233,12 @@ BuildRequires: %{systemd_units}
%patch -p1 -P 8
%patch -p1 -P 9
%patch -p1 -P 10
%patch -p1 -P 11 -F2
%patch -p1 -P 11
%patch -p1 -P 12
%patch -p1 -P 13
%patch -p1 -P 14
%patch -p1 -P 15
%patch -p1 -P 16 -F2
# prevent compilation of something that won't get used anyway
sed -i.orig 's|FENCE_ZVM=1|FENCE_ZVM=0|' configure.ac
@ -946,6 +954,19 @@ Device Mapper Multipath.
%{_datadir}/cluster/fence_mpath_check*
%{_mandir}/man8/fence_mpath.8*
%package nutanix-ahv
License: GPL-2.0-or-later AND LGPL-2.0-or-later
Summary: Fence agent for Nutanix AHV
Requires: python3-requests
Requires: fence-agents-common = %{version}-%{release}
BuildArch: noarch
Obsoletes: fence-agents < 3.1.13
%description nutanix-ahv
Fence agent for Nutanix AHV clusters.
%files nutanix-ahv
%{_sbindir}/fence_nutanix_ahv
%{_mandir}/man8/fence_nutanix_ahv.8*
%ifarch x86_64 ppc64le
%package openstack
License: GPL-2.0-or-later AND LGPL-2.0-or-later
@ -1190,22 +1211,39 @@ are located on corosync cluster nodes.
%endif
%changelog
* Fri Sep 12 2025 Oyvind Albrigtsen <oalbrigt@redhat.com> - 4.16.0-5.6
- fence_kubevirt: use hard poweroff
Resolves: RHEL-96184
* Wed Nov 19 2025 Oyvind Albrigtsen <oalbrigt@redhat.com> - 4.16.0-13.1
- fence_nutanix_ahv: add new fence agent
Resolves: RHEL-128285
* Wed Aug 20 2025 Oyvind Albrigtsen <oalbrigt@redhat.com> - 4.16.0-5.5
* Wed Aug 20 2025 Oyvind Albrigtsen <oalbrigt@redhat.com> - 4.16.0-13
- fence_aws: add "skip_os_shutdown" parameter to allow hard poweroff
Resolves: RHEL-109922
Resolves: RHEL-78241
* Tue Aug 12 2025 Oyvind Albrigtsen <oalbrigt@redhat.com> - 4.16.0-5.4
* Tue Aug 12 2025 Oyvind Albrigtsen <oalbrigt@redhat.com> - 4.16.0-12
- fence_ibm_vpc: add apikey file support
Resolves: RHEL-107530
Resolves: RHEL-107504
* Thu Jul 17 2025 Oyvind Albrigtsen <oalbrigt@redhat.com> - 4.16.0-5.3
* Fri Jun 13 2025 Oyvind Albrigtsen <oalbrigt@redhat.com> - 4.16.0-11
- fence_kubevirt: use hard poweroff
Resolves: RHEL-95379
* Mon Apr 28 2025 Oyvind Albrigtsen <oalbrigt@redhat.com> - 4.16.0-10
- fence_ibm_powervs: fix plaintext token file support
Resolves: RHEL-88569
* Wed Apr 23 2025 Oyvind Albrigtsen <oalbrigt@redhat.com> - 4.16.0-9
- fence_nutanix_ahv: new fence agent
Resolves: RHEL-68322
* Tue Mar 25 2025 Oyvind Albrigtsen <oalbrigt@redhat.com> - 4.16.0-7
- fence_sbd: get devices from SBD_DEVICE env variable if devices
parameter isnt set
Resolves: RHEL-79799
* Mon Mar 17 2025 Oyvind Albrigtsen <oalbrigt@redhat.com> - 4.16.0-6
- fence_ibm_vpc: refresh bearer-token if token data is corrupt, and
avoid edge-case of writing empty token file
Resolves: RHEL-83774
Resolves: RHEL-83520
* Mon Feb 3 2025 Oyvind Albrigtsen <oalbrigt@redhat.com> - 4.16.0-5
- fence_azure_arm: use azure-identity instead of msrestazure, which has