From 2f4b6fafcb265c81072d072f4fac489f24c647dd Mon Sep 17 00:00:00 2001 From: Michele Baldessari Date: Mon, 30 Nov 2020 11:54:26 +0100 Subject: [PATCH] Add fence_crosslink support This adds support for the newly introduced fence_crosslink two-node fence agents pushed upstream: https://github.com/ClusterLabs/fence-agents/pull/360 Change-Id: I3a9b852da78426ae45d99987022b630d833a84dc --- agent_generator/src_xml/fence_crosslink.xml | 109 +++++++++ agent_generator/variables.sh | 1 + manifests/stonith/fence_crosslink.pp | 234 ++++++++++++++++++++ 3 files changed, 344 insertions(+) create mode 100644 agent_generator/src_xml/fence_crosslink.xml create mode 100644 manifests/stonith/fence_crosslink.pp diff --git a/agent_generator/src_xml/fence_crosslink.xml b/agent_generator/src_xml/fence_crosslink.xml new file mode 100644 index 00000000..e2669ed4 --- /dev/null +++ b/agent_generator/src_xml/fence_crosslink.xml @@ -0,0 +1,109 @@ + + +This agent helps two-node clusters to tackle the situation where one node lost power, cannot be fenced by telling pacemaker that if the node is not reachable over the crosslink cable, we can assume it is dead + + + + + + Fencing action + + + + + Cross-cable IP + + + + + Physical plug number on device, UUID or identification of machine + + + + + Physical plug number on device, UUID or identification of machine + + + + + No ICMP reply in 5 seconds -> Node is considered dead + + + + + Disable logging to stderr. Does not affect --verbose or --debug-file or logging to syslog. + + + + + Verbose mode + + + + + Write debug information to given file + + + + + Write debug information to given file + + + + + Display version information and exit + + + + + Display help and exit + + + + + Separator for CSV created by 'list' operation + + + + + Wait X seconds before fencing is started + + + + + Wait X seconds for cmd prompt after login + + + + + Test X seconds for status change after ON/OFF + + + + + Wait X seconds after issuing ON/OFF + + + + + Wait X seconds for cmd prompt after issuing command + + + + + Count of attempts to retry power on + + + + + + + + + + + + + + + diff --git a/agent_generator/variables.sh b/agent_generator/variables.sh index 3a340ba5..01f4c174 100644 --- a/agent_generator/variables.sh +++ b/agent_generator/variables.sh @@ -9,6 +9,7 @@ cmd_pkg_map=( "fence_cisco_mds:fence-agents-cisco-mds" "fence_cisco_ucs:fence-agents-cisco-ucs" "fence_compute:fence-agents-compute" + "fence_crosslink:None" "fence_drac5:fence-agents-drac5" "fence_eaton_snmp:fence-agents-eaton-snmp" "fence_eps:fence-agents-eps" diff --git a/manifests/stonith/fence_crosslink.pp b/manifests/stonith/fence_crosslink.pp new file mode 100644 index 00000000..6d2a2f06 --- /dev/null +++ b/manifests/stonith/fence_crosslink.pp @@ -0,0 +1,234 @@ +# == Define: pacemaker::stonith::fence_crosslink +# +# Module for managing Stonith for fence_crosslink. +# +# WARNING: Generated by "rake generate_stonith", manual changes will +# be lost. +# +# === Parameters +# +# [*action*] +# Fencing action +# +# [*crosscableip*] +# Cross-cable IP +# +# [*plug*] +# Physical plug number on device, UUID or identification of machine +# +# [*port*] +# Physical plug number on device, UUID or identification of machine +# +# [*timeout*] +# No ICMP reply in 5 seconds -> Node is considered dead +# +# [*quiet*] +# Disable logging to stderr. Does not affect --verbose or --debug-file or logging to syslog. +# +# [*verbose*] +# Verbose mode +# +# [*debug*] +# Write debug information to given file +# +# [*debug_file*] +# Write debug information to given file +# +# [*separator*] +# Separator for CSV created by 'list' operation +# +# [*delay*] +# Wait X seconds before fencing is started +# +# [*login_timeout*] +# Wait X seconds for cmd prompt after login +# +# [*power_timeout*] +# Test X seconds for status change after ON/OFF +# +# [*power_wait*] +# Wait X seconds after issuing ON/OFF +# +# [*shell_timeout*] +# Wait X seconds for cmd prompt after issuing command +# +# [*retry_on*] +# Count of attempts to retry power on +# +# [*interval*] +# Interval between tries. +# +# [*ensure*] +# The desired state of the resource. +# +# [*tries*] +# The number of tries. +# +# [*try_sleep*] +# Time to sleep between tries. +# +# [*pcmk_host_list*] +# List of Pacemaker hosts. +# +# [*meta_attr*] +# (optional) String of meta attributes +# Defaults to undef +# +# [*deep_compare*] +# Enable deep comparing of resources and bundles +# When set to true a resource will be compared in full (options, meta parameters,..) +# to the existing one and in case of difference it will be repushed to the CIB +# Defaults to false +# +# [*update_settle_secs*] +# When deep_compare is enabled and puppet updates a resource, this +# parameter represents the number (in seconds) to wait for the cluster to settle +# after the resource update. +# Defaults to 600 (seconds) +# +# === Dependencies +# None +# +# === Authors +# +# Generated by rake generate_stonith task. +# +# === Copyright +# +# Copyright (C) 2016 Red Hat Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +define pacemaker::stonith::fence_crosslink ( + $action = undef, + $crosscableip = undef, + $plug = undef, + $port = undef, + $timeout = undef, + $quiet = undef, + $verbose = undef, + $debug = undef, + $debug_file = undef, + $separator = undef, + $delay = undef, + $login_timeout = undef, + $power_timeout = undef, + $power_wait = undef, + $shell_timeout = undef, + $retry_on = undef, + + $meta_attr = undef, + $interval = '60s', + $ensure = present, + $pcmk_host_list = undef, + + $tries = undef, + $try_sleep = undef, + + $deep_compare = false, + $update_settle_secs = 600, +) { + $action_chunk = $action ? { + undef => '', + default => "action=\"${action}\"", + } + $crosscableip_chunk = $crosscableip ? { + undef => '', + default => "crosscableip=\"${crosscableip}\"", + } + $plug_chunk = $plug ? { + undef => '', + default => "plug=\"${plug}\"", + } + $port_chunk = $port ? { + undef => '', + default => "port=\"${port}\"", + } + $timeout_chunk = $timeout ? { + undef => '', + default => "timeout=\"${timeout}\"", + } + $quiet_chunk = $quiet ? { + undef => '', + default => "quiet=\"${quiet}\"", + } + $verbose_chunk = $verbose ? { + undef => '', + default => "verbose=\"${verbose}\"", + } + $debug_chunk = $debug ? { + undef => '', + default => "debug=\"${debug}\"", + } + $debug_file_chunk = $debug_file ? { + undef => '', + default => "debug_file=\"${debug_file}\"", + } + $separator_chunk = $separator ? { + undef => '', + default => "separator=\"${separator}\"", + } + $delay_chunk = $delay ? { + undef => '', + default => "delay=\"${delay}\"", + } + $login_timeout_chunk = $login_timeout ? { + undef => '', + default => "login_timeout=\"${login_timeout}\"", + } + $power_timeout_chunk = $power_timeout ? { + undef => '', + default => "power_timeout=\"${power_timeout}\"", + } + $power_wait_chunk = $power_wait ? { + undef => '', + default => "power_wait=\"${power_wait}\"", + } + $shell_timeout_chunk = $shell_timeout ? { + undef => '', + default => "shell_timeout=\"${shell_timeout}\"", + } + $retry_on_chunk = $retry_on ? { + undef => '', + default => "retry_on=\"${retry_on}\"", + } + + $pcmk_host_value_chunk = $pcmk_host_list ? { + undef => '$(/usr/sbin/crm_node -n)', + default => $pcmk_host_list, + } + + $meta_attr_value_chunk = $meta_attr ? { + undef => '', + default => "meta ${meta_attr}", + } + + # $title can be a mac address, remove the colons for pcmk resource name + $safe_title = regsubst($title, ':', '', 'G') + + Exec<| title == 'wait-for-settle' |> -> Pcmk_stonith<||> + + $param_string = "${action_chunk} ${crosscableip_chunk} ${plug_chunk} ${port_chunk} ${timeout_chunk} ${quiet_chunk} ${verbose_chunk} ${debug_chunk} ${debug_file_chunk} ${separator_chunk} ${delay_chunk} ${login_timeout_chunk} ${power_timeout_chunk} ${power_wait_chunk} ${shell_timeout_chunk} ${retry_on_chunk} op monitor interval=${interval} ${meta_attr_value_chunk}" + + + pcmk_stonith { "stonith-fence_crosslink-${safe_title}": + ensure => $ensure, + stonith_type => 'fence_crosslink', + pcmk_host_list => $pcmk_host_value_chunk, + pcs_param_string => $param_string, + tries => $tries, + try_sleep => $try_sleep, + deep_compare => $deep_compare, + update_settle_secs => $update_settle_secs, + } +}