Skip to content

Commit

Permalink
property: switch back to legacy text output
Browse files Browse the repository at this point in the history
  • Loading branch information
mirecheck committed Jun 12, 2023
1 parent 0aa8a28 commit 88f57a9
Show file tree
Hide file tree
Showing 6 changed files with 236 additions and 41 deletions.
15 changes: 5 additions & 10 deletions pcs/cli/cluster_property/command.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,7 @@
cluster_property_metadata_to_text,
properties_defaults_to_text,
properties_to_cmd,
properties_to_text,
properties_to_text_with_default_mark,
properties_to_text_legacy,
)
from pcs.cli.common.errors import CmdLineInputError
from pcs.cli.common.output import smart_wrap_text
Expand Down Expand Up @@ -135,19 +134,15 @@ def config(lib: Any, argv: StringSequence, modifiers: InputModifiers) -> None:

if argv:
output = "\n".join(
properties_to_text_with_default_mark(
properties_facade, property_names=argv
)
properties_to_text_legacy(properties_facade, property_names=argv)
)
elif modifiers.get("--all"):
output = "\n".join(
properties_to_text_with_default_mark(properties_facade)
properties_to_text_legacy(properties_facade, include_defaults=True)
)
elif modifiers.get("--defaults"):
output = "\n".join(
properties_defaults_to_text(
properties_facade.get_defaults(include_advanced=True)
)
properties_to_text_legacy(properties_facade, defaults_only=True)
)
elif output_format == "cmd":
output = " \\\n".join(properties_to_cmd(properties_facade))
Expand All @@ -156,7 +151,7 @@ def config(lib: Any, argv: StringSequence, modifiers: InputModifiers) -> None:
dto.to_dict(ListCibNvsetDto(properties_facade.properties[0:1]))
)
else:
output = "\n".join(properties_to_text(properties_facade))
output = "\n".join(properties_to_text_legacy(properties_facade))

if output:
print(output)
Expand Down
55 changes: 55 additions & 0 deletions pcs/cli/cluster_property/output.py
Original file line number Diff line number Diff line change
Expand Up @@ -254,3 +254,58 @@ def cluster_property_metadata_to_text(
for parameter_dto in metadata:
text.extend(resource_agent_parameter_metadata_to_text(parameter_dto))
return text


def properties_to_text_legacy(
properties_facade: PropertyConfigurationFacade,
property_names: Optional[StringSequence] = None,
defaults_only=False,
include_defaults=False,
) -> List[str]:
"""
Return legacy text format of configured properties. If property_names is
specified, then only properties from the list are displayed. If specified
property is missing, then property with its default value is displayed.
Parameters property_names, defaults_only and include_defaults are
mutually_exclusive.
properties_facade -- cluster property configuration and metadata
property_names -- properties to be displayed
defaults_only -- display only properties default values
include_defaults -- display default values for not configured properties
"""
mutual_exclusive = [
bool(param)
for param in [property_names, defaults_only, include_defaults]
]
if mutual_exclusive.count(True) > 1:
raise AssertionError("Mutually exclusive parameters were used.")
text = ["Cluster Properties:"]
configured_properties_dict = {}
if properties_facade.properties:
configured_properties_dict = {
nvpair.name: nvpair.value
for nvpair in properties_facade.properties[0].nvpairs
}
default_properties_dict = properties_facade.get_defaults(
include_advanced=True
)
all_properties_dict = {
**default_properties_dict,
**configured_properties_dict,
}
if defaults_only:
properties_dict = default_properties_dict
elif include_defaults:
properties_dict = all_properties_dict
elif property_names:
properties_dict = {
name: value
for name, value in all_properties_dict.items()
if name in property_names
}
else:
properties_dict = configured_properties_dict
for name, value in sorted(properties_dict.items()):
text.append(f" {name}: {value}")
return text
4 changes: 2 additions & 2 deletions pcs/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@
)
from pcs.cli.cluster_property.output import (
PropertyConfigurationFacade,
properties_to_text,
properties_to_text_legacy,
)
from pcs.cli.common import middleware
from pcs.cli.common.errors import CmdLineInputError
Expand Down Expand Up @@ -242,7 +242,7 @@ def _config_show_cib_lines(lib, properties_facade=None):
properties_facade = PropertyConfigurationFacade.from_properties_config(
lib.cluster_property.get_properties()
)
properties_lines = properties_to_text(properties_facade)
properties_lines = properties_to_text_legacy(properties_facade)
all_lines.append("")
all_lines.extend(properties_lines)

Expand Down
21 changes: 11 additions & 10 deletions pcs_test/tier0/cli/cluster_property/test_command.py
Original file line number Diff line number Diff line change
Expand Up @@ -230,8 +230,8 @@ def test_default_output_format(self, mock_print):
mock_print.assert_called_once_with(
dedent(
"""\
Cluster Properties: cib-bootstrap-options
property_name=value1"""
Cluster Properties:
property_name: value1"""
)
)

Expand All @@ -242,9 +242,9 @@ def test_specified_properties(self, mock_print):
mock_print.assert_called_once_with(
dedent(
"""\
Cluster Properties: cib-bootstrap-options
property_advanced=default (default)
property_name=value1"""
Cluster Properties:
property_advanced: default
property_name: value1"""
)
)

Expand All @@ -263,9 +263,9 @@ def test_all_option(self, mock_print):
mock_print.assert_called_once_with(
dedent(
"""\
Cluster Properties: cib-bootstrap-options
property_advanced=default (default)
property_name=value1"""
Cluster Properties:
property_advanced: default
property_name: value1"""
)
)

Expand All @@ -276,8 +276,9 @@ def test_defaults_option(self, mock_print):
mock_print.assert_called_once_with(
dedent(
"""\
property_advanced=default
property_name=default"""
Cluster Properties:
property_advanced: default
property_name: default"""
)
)

Expand Down
143 changes: 143 additions & 0 deletions pcs_test/tier0/cli/cluster_property/test_output.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,16 @@
"""
)

FIXTURE_LEGACY_TEXT_OUTPUT_FIRST_SET = dedent(
"""\
Cluster Properties:
property1: val1
property2: val2
readonly1: ro_val1
readonly2: ro_val2
"""
)


def fixture_property_metadata(
name="property-name",
Expand Down Expand Up @@ -85,6 +95,24 @@ def fixture_property_metadata(
),
]

FIXTURE_PROPERTIES_FACADE = PropertyConfigurationFacade(
properties=[
CibNvsetDto(
id="id1",
options={},
rule=None,
nvpairs=[
CibNvpairDto(id="", name="readonly1", value="ro_val1"),
CibNvpairDto(id="", name="readonly2", value="ro_val2"),
CibNvpairDto(id="", name="property2", value="val2"),
CibNvpairDto(id="", name="property1", value="default1"),
],
)
],
properties_metadata=FIXTURE_PROPERTY_METADATA_LIST,
readonly_properties=FIXTURE_READONLY_PROPERTIES_LIST,
)


class TestPropertyConfigurationFacadeCreate(TestCase):
def test_from_properties_dtos(self):
Expand Down Expand Up @@ -655,3 +683,118 @@ def test_advanced_value(self):
"""
)
self.assert_lines(metadata, output)


class TestPropertiesToTextLegacy(TestCase):
def assert_lines(
self,
facade,
output,
property_names=None,
defaults_only=False,
include_defaults=False,
):
self.assertEqual(
"\n".join(
cluster_property.properties_to_text_legacy(
facade, property_names, defaults_only, include_defaults
)
)
+ "\n",
output,
)

def test_no_cluster_properties(self):
facade = PropertyConfigurationFacade(
properties=[], properties_metadata=[], readonly_properties=[]
)
output = "Cluster Properties:\n"
self.assert_lines(facade, output)

def test_empty_cluster_property_set(self):
facade = PropertyConfigurationFacade(
properties=[
CibNvsetDto(id="id1", options={}, rule=None, nvpairs=[])
],
properties_metadata=[],
readonly_properties=[],
)
output = dedent(
"""\
Cluster Properties:
"""
)
self.assert_lines(facade, output)

def test_one_cluster_property_set(self):
facade = PropertyConfigurationFacade(
properties=FIXTURE_TWO_PROPERTY_SETS[0:1],
properties_metadata=[],
readonly_properties=[],
)
output = FIXTURE_LEGACY_TEXT_OUTPUT_FIRST_SET
self.assert_lines(facade, output)

def test_more_cluster_property_sets_first_is_displayed(self):
facade = PropertyConfigurationFacade(
properties=FIXTURE_TWO_PROPERTY_SETS,
properties_metadata=[],
readonly_properties=[],
)
output = FIXTURE_LEGACY_TEXT_OUTPUT_FIRST_SET
self.assert_lines(facade, output)

def test_specified_properties(self):
facade = FIXTURE_PROPERTIES_FACADE
output = dedent(
"""\
Cluster Properties:
property2: val2
property4: default4
readonly2: ro_val2
"""
)
self.assert_lines(
facade,
output,
property_names=["property2", "readonly2", "property4", "other"],
)

def test_defaults(self):
facade = FIXTURE_PROPERTIES_FACADE
output = dedent(
"""\
Cluster Properties:
property1: default1
property2: default2
property3: default3
property4: default4
"""
)
self.assert_lines(facade, output, defaults_only=True)

def test_all(self):
facade = FIXTURE_PROPERTIES_FACADE
output = dedent(
"""\
Cluster Properties:
property1: default1
property2: val2
property3: default3
property4: default4
readonly1: ro_val1
readonly2: ro_val2
"""
)
self.assert_lines(facade, output, include_defaults=True)

def test_assertion_error(self):
with self.assertRaises(AssertionError) as cm:
cluster_property.properties_to_text_legacy(
FIXTURE_PROPERTIES_FACADE,
property_names=["property_name1"],
include_defaults=True,
)
self.assertEqual(
str(cm.exception), "Mutually exclusive parameters were used."
)
39 changes: 20 additions & 19 deletions pcs_test/tier1/test_cluster_property.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,28 +36,29 @@
)
FIXTURE_CONFIG_OUTPUT = dedent(
"""\
Cluster Properties: cib-bootstrap-options
cluster-name=HACluster
enable-acl=false
have-watchdog=false
maintenance-mode=false
placement-strategy=minimal
Cluster Properties:
cluster-name: HACluster
enable-acl: false
have-watchdog: false
maintenance-mode: false
placement-strategy: minimal
"""
)
_DEFAULT_MARK_REGEXP = r"( .*=.* \(default\)\n)+"
_OTHER_PROPERTIES_REGEXP = r"( .*: .*\n)+"
_CONFIG_PROPERTIES_REGEXP_LIST = [
r"Cluster Properties: cib-bootstrap-options\n",
r" cluster-name=HACluster\n",
r" enable-acl=false\n",
r" have-watchdog=false\n",
r" maintenance-mode=false\n",
r" placement-strategy=minimal\n",
r"Cluster Properties:\n",
r" cluster-name: HACluster\n",
r" enable-acl: false\n",
r" have-watchdog: false\n",
r" maintenance-mode: false\n",
r" placement-strategy: minimal\n",
]
CONFIG_ALL_REGEXP = (
_DEFAULT_MARK_REGEXP.join(_CONFIG_PROPERTIES_REGEXP_LIST)
+ rf"{_DEFAULT_MARK_REGEXP}$"
_OTHER_PROPERTIES_REGEXP.join(_CONFIG_PROPERTIES_REGEXP_LIST)
+ rf"{_OTHER_PROPERTIES_REGEXP}$"
)
DEFAULTS_REGEXP = r"^batch-limit=0\n(.*=.*\n)+$"
DEFAULTS_REGEXP_LEGACY = r"^Cluster Properties:\n batch-limit: 0\n (.*: .*\n)+$"


def get_invalid_option_messages(option_names, error=True, forceable=True):
Expand Down Expand Up @@ -304,7 +305,7 @@ def test_error(self):
def test_defaults_option(self):
self.assert_pcs_success(
self.command + ["--defaults"],
stdout_regexp=DEFAULTS_REGEXP,
stdout_regexp=DEFAULTS_REGEXP_LEGACY,
)

def test_all_option(self):
Expand Down Expand Up @@ -428,9 +429,9 @@ def test_specific_properties(self):
UNCHANGED_CRM_CONFIG,
dedent(
"""\
Cluster Properties: cib-bootstrap-options
batch-limit=0 (default)
maintenance-mode=false
Cluster Properties:
batch-limit: 0
maintenance-mode: false
"""
),
)
Expand Down

0 comments on commit 88f57a9

Please sign in to comment.