Skip to content

Commit b51f0b3

Browse files
committed
Merge branch 'fencing-watchdog-timeout'
2 parents c64416f + 714aacb commit b51f0b3

File tree

10 files changed

+476
-318
lines changed

10 files changed

+476
-318
lines changed

pcs/common/reports/messages.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4784,7 +4784,8 @@ class StonithWatchdogTimeoutCannotBeSet(ReportItemMessage):
47844784
@property
47854785
def message(self) -> str:
47864786
return (
4787-
"stonith-watchdog-timeout can only be unset or set to 0 while "
4787+
"fencing-watchdog-timeout / stonith-watchdog-timeout can only be "
4788+
"unset or set to 0 while "
47884789
+ _stonith_watchdog_timeout_reason_to_str(self.reason)
47894790
)
47904791

@@ -4801,7 +4802,8 @@ class StonithWatchdogTimeoutCannotBeUnset(ReportItemMessage):
48014802
@property
48024803
def message(self) -> str:
48034804
return (
4804-
"stonith-watchdog-timeout cannot be unset or set to 0 while "
4805+
"fencing-watchdog-timeout / stonith-watchdog-timeout cannot be "
4806+
"unset or set to 0 while "
48054807
+ _stonith_watchdog_timeout_reason_to_str(self.reason)
48064808
)
48074809

@@ -4822,7 +4824,8 @@ class StonithWatchdogTimeoutTooSmall(ReportItemMessage):
48224824
@property
48234825
def message(self) -> str:
48244826
return (
4825-
"The stonith-watchdog-timeout must be greater than SBD watchdog "
4827+
"The fencing-watchdog-timeout / stonith-watchdog-timeout must be "
4828+
"greater than SBD watchdog "
48264829
f"timeout '{self.cluster_sbd_watchdog_timeout}', entered "
48274830
f"'{self.entered_watchdog_timeout}'"
48284831
)

pcs/lib/cluster_property.py

Lines changed: 44 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,12 @@
1-
from typing import (
2-
Iterable,
3-
List,
4-
Mapping,
5-
)
1+
from typing import Mapping
62

73
from lxml.etree import _Element
84

95
from pcs.common import reports
106
from pcs.common.services.interfaces import ServiceManagerInterface
117
from pcs.common.tools import timeout_to_seconds
128
from pcs.common.types import StringSequence
13-
from pcs.lib import (
14-
sbd,
15-
validate,
16-
)
9+
from pcs.lib import sbd, validate
1710
from pcs.lib.cib import nvpair_multi
1811
from pcs.lib.cib.tools import (
1912
IdProvider,
@@ -23,7 +16,7 @@
2316
from pcs.lib.errors import LibraryError
2417
from pcs.lib.external import CommandRunner
2518
from pcs.lib.pacemaker.values import is_false
26-
from pcs.lib.resource_agent import ResourceAgentParameter
19+
from pcs.lib.resource_agent import ResourceAgentFacade
2720

2821
READONLY_CLUSTER_PROPERTY_LIST = [
2922
"cluster-infrastructure",
@@ -33,6 +26,10 @@
3326
"last-lrm-refresh",
3427
]
3528
_DEFAULT_CLUSTER_PROPERTY_SET_ID = "cib-bootstrap-options"
29+
_STONITH_WATCHDOG_TIMEOUT_PROPERTIES = [
30+
"stonith-watchdog-timeout",
31+
"fencing-watchdog-timeout",
32+
]
3633

3734

3835
def _validate_stonith_watchdog_timeout_property(
@@ -69,7 +66,7 @@ def _validate_stonith_watchdog_timeout_property(
6966

7067
def _validate_not_disabling_fencing(
7168
to_be_set_properties: Mapping[str, str],
72-
) -> List[reports.ReportItem]:
69+
) -> reports.ReportItemList:
7370
problematic_properties_setting = {
7471
key: to_be_set_properties[key]
7572
for key in ["stonith-enabled", "fencing-enabled"]
@@ -90,7 +87,7 @@ def _validate_not_disabling_fencing(
9087

9188
def validate_set_cluster_properties( # noqa: PLR0912
9289
runner: CommandRunner,
93-
params_spec: Iterable[ResourceAgentParameter],
90+
cluster_properties_facade: ResourceAgentFacade,
9491
properties_set_id: str,
9592
configured_properties: StringSequence,
9693
new_properties: Mapping[str, str],
@@ -100,7 +97,7 @@ def validate_set_cluster_properties( # noqa: PLR0912
10097
"""
10198
Validate that cluster properties and their values can be set.
10299
103-
params_spec -- params specified by agent "cluster-options"
100+
cluster_properties_facade -- facade for cluster properties metadata
104101
properties_set_id -- id of the properties set to be updated
105102
configured_properties -- names of currently configured cluster properties
106103
new_properties -- dictionary of properties and their values to be set
@@ -111,7 +108,7 @@ def validate_set_cluster_properties( # noqa: PLR0912
111108
# pylint: disable=too-many-locals
112109
possible_properties_dict = {
113110
parameter.name: parameter
114-
for parameter in params_spec
111+
for parameter in cluster_properties_facade.metadata.parameters
115112
if parameter.name not in READONLY_CLUSTER_PROPERTY_LIST
116113
}
117114
severity = reports.get_severity(reports.codes.FORCE, force)
@@ -124,33 +121,37 @@ def validate_set_cluster_properties( # noqa: PLR0912
124121
else:
125122
to_be_removed_properties.append(name)
126123

127-
report_list = validate.validate_set_unset_items(
128-
to_be_set_properties.keys(),
129-
to_be_removed_properties,
130-
configured_properties,
131-
reports.const.ADD_REMOVE_CONTAINER_TYPE_PROPERTY_SET,
132-
reports.const.ADD_REMOVE_ITEM_TYPE_PROPERTY,
133-
properties_set_id,
134-
severity=severity,
135-
)
124+
report_list = []
136125

137126
report_list.extend(
138-
validate.NamesIn(
139-
possible_properties_dict.keys(),
140-
option_type="cluster property",
141-
banned_name_list=READONLY_CLUSTER_PROPERTY_LIST,
127+
validate.ValidatorAll(
128+
cluster_properties_facade.get_validators_deprecated_parameters()
129+
).validate(new_properties)
130+
)
131+
report_list.extend(
132+
validate.validate_set_unset_items(
133+
to_be_set_properties.keys(),
134+
to_be_removed_properties,
135+
configured_properties,
136+
reports.const.ADD_REMOVE_CONTAINER_TYPE_PROPERTY_SET,
137+
reports.const.ADD_REMOVE_ITEM_TYPE_PROPERTY,
138+
properties_set_id,
142139
severity=severity,
140+
)
141+
)
142+
report_list.extend(
143+
validate.ValidatorAll(
144+
cluster_properties_facade.get_validators_allowed_parameters(
145+
force=force,
146+
banned_parameter_list=READONLY_CLUSTER_PROPERTY_LIST,
147+
)
143148
).validate(
144149
# Allow removing properties unknown to pacemaker while preventing
145150
# setting them. Prevent removing read-only properties.
146151
{
147152
name: value
148153
for name, value in new_properties.items()
149-
if not (
150-
value == ""
151-
and name not in READONLY_CLUSTER_PROPERTY_LIST
152-
and name not in possible_properties_dict
153-
)
154+
if value != "" or name in READONLY_CLUSTER_PROPERTY_LIST
154155
}
155156
)
156157
)
@@ -213,7 +214,7 @@ def validate_set_cluster_properties( # noqa: PLR0912
213214
)
214215
elif property_metadata.type in ["time", "timeout"]:
215216
# make stonith-watchdog-timeout value not forcable
216-
if property_metadata.name == "stonith-watchdog-timeout":
217+
if property_metadata.name in _STONITH_WATCHDOG_TIMEOUT_PROPERTIES:
217218
validators.append(
218219
validate.ValueTimeInterval(
219220
property_metadata.name,
@@ -239,17 +240,17 @@ def validate_set_cluster_properties( # noqa: PLR0912
239240

240241
# Only validate SWT if it is being set, or if it is being removed and it
241242
# actually exists in the current configuration.
242-
if "stonith-watchdog-timeout" in new_properties and (
243-
new_properties["stonith-watchdog-timeout"]
244-
or "stonith-watchdog-timeout" in configured_properties
245-
):
246-
report_list.extend(
247-
_validate_stonith_watchdog_timeout_property(
248-
service_manager,
249-
new_properties["stonith-watchdog-timeout"],
250-
force=force,
243+
for prop_name in _STONITH_WATCHDOG_TIMEOUT_PROPERTIES:
244+
if prop_name in new_properties and (
245+
new_properties[prop_name] or prop_name in configured_properties
246+
):
247+
report_list.extend(
248+
_validate_stonith_watchdog_timeout_property(
249+
service_manager,
250+
new_properties[prop_name],
251+
force=force,
252+
)
251253
)
252-
)
253254

254255
report_list.extend(_validate_not_disabling_fencing(to_be_set_properties))
255256

pcs/lib/commands/cluster_property.py

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,9 @@
77
from pcs.common.str_tools import join_multilines
88
from pcs.common.types import StringSequence
99
from pcs.lib import cluster_property
10-
from pcs.lib.cib import (
11-
nvpair_multi,
12-
rule,
13-
)
10+
from pcs.lib.cib import nvpair_multi, rule
1411
from pcs.lib.cib.rule.in_effect import get_rule_evaluator
15-
from pcs.lib.cib.tools import (
16-
IdProvider,
17-
get_crm_config,
18-
)
12+
from pcs.lib.cib.tools import IdProvider, get_crm_config
1913
from pcs.lib.env import LibraryEnvironment
2014
from pcs.lib.errors import LibraryError
2115
from pcs.lib.external import CommandRunner
@@ -26,17 +20,18 @@
2620
)
2721
from pcs.lib.resource_agent import (
2822
ResourceAgentError,
23+
ResourceAgentFacade,
24+
ResourceAgentFacadeFactory,
2925
ResourceAgentMetadata,
3026
resource_agent_error_to_report_item,
3127
)
3228
from pcs.lib.resource_agent import const as ra_const
33-
from pcs.lib.resource_agent.facade import ResourceAgentFacadeFactory
3429

3530

36-
def _get_properties_metadata(
31+
def _get_properties_facade(
3732
report_processor: reports.ReportProcessor,
3833
runner: CommandRunner,
39-
) -> ResourceAgentMetadata:
34+
) -> ResourceAgentFacade:
4035
if not is_crm_attribute_list_options_supported(runner):
4136
report_processor.report(
4237
reports.ReportItem.error(
@@ -47,9 +42,7 @@ def _get_properties_metadata(
4742

4843
try:
4944
factory = ResourceAgentFacadeFactory(runner, report_processor)
50-
return factory.facade_from_crm_attribute(
51-
ra_const.CLUSTER_OPTIONS
52-
).metadata
45+
return factory.facade_from_crm_attribute(ra_const.CLUSTER_OPTIONS)
5346
except ResourceAgentError as e:
5447
report_processor.report_list(
5548
[
@@ -113,7 +106,7 @@ def get_cluster_properties_definition_legacy(
113106
env -- provides communication with externals
114107
"""
115108
return _cluster_property_metadata_to_dict(
116-
_get_properties_metadata(env.report_processor, env.cmd_runner())
109+
_get_properties_facade(env.report_processor, env.cmd_runner()).metadata
117110
)
118111

119112

@@ -151,7 +144,7 @@ def set_properties(
151144
env.report_processor.report_list(
152145
cluster_property.validate_set_cluster_properties(
153146
runner,
154-
_get_properties_metadata(env.report_processor, runner).parameters,
147+
_get_properties_facade(env.report_processor, runner),
155148
set_id,
156149
configured_properties,
157150
cluster_properties,
@@ -206,11 +199,11 @@ def get_properties_metadata(
206199
207200
env -- provides communication with externals
208201
"""
209-
metadata = _get_properties_metadata(env.report_processor, env.cmd_runner())
202+
facade = _get_properties_facade(env.report_processor, env.cmd_runner())
210203
return ClusterPropertyMetadataDto(
211204
properties_metadata=[
212205
property_definition.to_dto()
213-
for property_definition in metadata.parameters
206+
for property_definition in facade.metadata.parameters
214207
],
215208
readonly_properties=cluster_property.READONLY_CLUSTER_PROPERTY_LIST,
216209
)

0 commit comments

Comments
 (0)