Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,12 @@
- Do not wrap resource and stonith agent description to preserve existing
formatting ([RHEL-113763])

### Deprecated
- Value `sctp` of the knet link option `transport` is deprecated in
corosync / knet and might be removed in a future release ([RHEL-126842])

[RHEL-113763]: https://issues.redhat.com/browse/RHEL-113763
[RHEL-126842]: https://issues.redhat.com/browse/RHEL-126842


## [0.11.10] - 2025-07-09
Expand Down
2 changes: 2 additions & 0 deletions pcs/lib/corosync/config_validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -840,6 +840,8 @@ def _get_link_options_validators_knet(
validate.ValueNonnegativeInteger("ping_timeout"),
validate.ValueNonnegativeInteger("pong_count"),
validate.ValueIn("transport", ("sctp", "udp")),
# DEPRECATED in knet 1, to be removed in knet 2.0
validate.ValueDeprecated("transport", {"sctp": None}),
]

if including_linknumber:
Expand Down
110 changes: 68 additions & 42 deletions pcs_test/tier0/lib/commands/cluster/test_add_link.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,11 +87,10 @@ def setUp(self):
)

def test_success(self):
(
self.config.corosync_conf.load_content(self.before)
.runner.cib.load()
.env.push_corosync_conf(corosync_conf_text=self.after)
)
self.config.corosync_conf.load_content(self.before)
self.config.runner.cib.load()
self.config.env.push_corosync_conf(corosync_conf_text=self.after)

cluster.add_link(
self.env_assist.get_env(),
self.node_addr_map,
Expand All @@ -101,8 +100,35 @@ def test_success(self):
# hidden in self.config.env.push_corosync_conf.
self.env_assist.assert_reports([])

def test_success_deprecated_sctp(self):
after = self.after.replace(
"knet_transport: udp", "knet_transport: sctp"
)
self.config.corosync_conf.load_content(self.before)
self.config.runner.cib.load()
self.config.env.push_corosync_conf(corosync_conf_text=after)

cluster.add_link(
self.env_assist.get_env(),
self.node_addr_map,
{"transport": "sctp"},
)
# Reports from pushing corosync.conf are produced in env. That code is
# hidden in self.config.env.push_corosync_conf.
self.env_assist.assert_reports(
[
fixture.deprecation(
report_codes.DEPRECATED_OPTION_VALUE,
option_name="transport",
deprecated_value="sctp",
replaced_by=None,
)
]
)

def test_not_live(self):
(self.config.env.set_corosync_conf_data(self.before))
self.config.env.set_corosync_conf_data(self.before)

self.env_assist.assert_raise_library_error(
lambda: cluster.add_link(
self.env_assist.get_env(),
Expand All @@ -120,7 +146,9 @@ def test_not_live(self):

def test_validation(self):
patch_getaddrinfo(self, ["node2-addr0"])
(self.config.corosync_conf.load_content(self.before).runner.cib.load())
self.config.corosync_conf.load_content(self.before)
self.config.runner.cib.load()

self.env_assist.assert_raise_library_error(
lambda: cluster.add_link(
self.env_assist.get_env(),
Expand Down Expand Up @@ -182,7 +210,9 @@ def test_validation(self):
)

def test_missing_input_data(self):
(self.config.corosync_conf.load_content(self.before).runner.cib.load())
self.config.corosync_conf.load_content(self.before)
self.config.runner.cib.load()

self.env_assist.assert_raise_library_error(
lambda: cluster.add_link(self.env_assist.get_env(), {}, {}), []
)
Expand Down Expand Up @@ -223,7 +253,9 @@ def test_missing_node_names(self):
}
"""
)
self.config.corosync_conf.load_content(before).runner.cib.load()
self.config.corosync_conf.load_content(before)
self.config.runner.cib.load()

self.env_assist.assert_raise_library_error(
lambda: cluster.add_link(
self.env_assist.get_env(),
Expand Down Expand Up @@ -259,11 +291,10 @@ def test_cib_guest_node(self):
</primitive>
</resources>
"""
(
self.config.corosync_conf.load_content(self.before).runner.cib.load(
resources=resources
)
)

self.config.corosync_conf.load_content(self.before)
self.config.runner.cib.load(resources=resources)

self.env_assist.assert_raise_library_error(
lambda: cluster.add_link(
self.env_assist.get_env(),
Expand Down Expand Up @@ -295,11 +326,9 @@ def test_cib_remote_node(self):
</primitive>
</resources>
"""
(
self.config.corosync_conf.load_content(self.before).runner.cib.load(
resources=resources
)
)
self.config.corosync_conf.load_content(self.before)
self.config.runner.cib.load(resources=resources)

self.env_assist.assert_raise_library_error(
lambda: cluster.add_link(
self.env_assist.get_env(),
Expand All @@ -318,11 +347,9 @@ def test_cib_remote_node(self):
)

def test_cib_not_available(self):
(
self.config.corosync_conf.load_content(self.before).runner.cib.load(
stderr="an error", returncode=1
)
)
self.config.corosync_conf.load_content(self.before)
self.config.runner.cib.load(stderr="an error", returncode=1)

self.env_assist.assert_raise_library_error(
lambda: cluster.add_link(
self.env_assist.get_env(),
Expand All @@ -341,11 +368,10 @@ def test_cib_not_available(self):
)

def test_cib_not_available_forced(self):
(
self.config.corosync_conf.load_content(self.before)
.runner.cib.load(stderr="an error", returncode=1)
.env.push_corosync_conf(corosync_conf_text=self.after)
)
self.config.corosync_conf.load_content(self.before)
self.config.runner.cib.load(stderr="an error", returncode=1)
self.config.env.push_corosync_conf(corosync_conf_text=self.after)

cluster.add_link(
self.env_assist.get_env(),
self.node_addr_map,
Expand All @@ -361,14 +387,13 @@ def test_cib_not_available_forced(self):
)

def test_offline_nodes(self):
(
self.config.corosync_conf.load_content(self.before)
.runner.cib.load()
.env.push_corosync_conf(
corosync_conf_text=self.after,
skip_offline_targets=True,
)
self.config.corosync_conf.load_content(self.before)
self.config.runner.cib.load()
self.config.env.push_corosync_conf(
corosync_conf_text=self.after,
skip_offline_targets=True,
)

cluster.add_link(
self.env_assist.get_env(),
self.node_addr_map,
Expand All @@ -378,7 +403,9 @@ def test_offline_nodes(self):

def test_unresolvable_addresses(self):
patch_getaddrinfo(self, [])
(self.config.corosync_conf.load_content(self.before).runner.cib.load())
self.config.corosync_conf.load_content(self.before)
self.config.runner.cib.load()

self.env_assist.assert_raise_library_error(
lambda: cluster.add_link(
self.env_assist.get_env(),
Expand All @@ -399,11 +426,10 @@ def test_unresolvable_addresses(self):

def test_unresolvable_addresses_forced(self):
patch_getaddrinfo(self, [])
(
self.config.corosync_conf.load_content(self.before)
.runner.cib.load()
.env.push_corosync_conf(corosync_conf_text=self.after)
)
self.config.corosync_conf.load_content(self.before)
self.config.runner.cib.load()
self.config.env.push_corosync_conf(corosync_conf_text=self.after)

cluster.add_link(
self.env_assist.get_env(),
self.node_addr_map,
Expand Down
16 changes: 15 additions & 1 deletion pcs_test/tier0/lib/commands/cluster/test_setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -2088,7 +2088,21 @@ def test_all_options(self):
quorum_options=QUORUM_OPTIONS,
)
self.env_assist.assert_reports(
reports_success_minimal_fixture(using_known_hosts_addresses=False)
[
fixture.deprecation(
reports.codes.DEPRECATED_OPTION_VALUE,
option_name="transport",
deprecated_value="sctp",
replaced_by=None,
),
fixture.deprecation(
reports.codes.DEPRECATED_OPTION_VALUE,
option_name="transport",
deprecated_value="sctp",
replaced_by=None,
),
]
+ reports_success_minimal_fixture(using_known_hosts_addresses=False)
)

def test_disable_crypto(self):
Expand Down
82 changes: 82 additions & 0 deletions pcs_test/tier0/lib/commands/cluster/test_update_link.py
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,88 @@ def test_success(self):
# hidden in self.config.env.push_corosync_conf.
self.env_assist.assert_reports([])

def test_success_deprecated_sctp(self):
before = dedent(
"""\
totem {
transport: knet

interface {
linknumber: 2
knet_transport: udp
}
}

nodelist {
node {
ring0_addr: node1-addr0
ring2_addr: node1-addr2
name: node1
nodeid: 1
}

node {
ring0_addr: node2-addr0
ring2_addr: node2-addr2a
name: node2
nodeid: 2
}
}
"""
)
after = dedent(
"""\
totem {
transport: knet

interface {
linknumber: 2
knet_transport: sctp
}
}

nodelist {
node {
ring0_addr: node1-addr0
ring2_addr: node1-addr2
name: node1
nodeid: 1
}

node {
ring0_addr: node2-addr0
ring2_addr: node2-addr2a
name: node2
nodeid: 2
}
}
"""
)
patch_getaddrinfo(self, self.existing_addrs + ["node2-addr2a"])
self.config.corosync_conf.load_content(before)
self.config.env.push_corosync_conf(
corosync_conf_text=after, need_stopped_cluster=True
)

cluster.update_link(
self.env_assist.get_env(),
"2",
{"node2": "node2-addr2a"},
{"transport": "sctp"},
)
# Reports from pushing corosync.conf are produced in env. That code is
# hidden in self.config.env.push_corosync_conf.
self.env_assist.assert_reports(
[
fixture.deprecation(
report_codes.DEPRECATED_OPTION_VALUE,
option_name="transport",
deprecated_value="sctp",
replaced_by=None,
)
]
)

def test_validation(self):
patch_getaddrinfo(self, self.existing_addrs + ["node2-addr0"])
self.config.corosync_conf.load_content(self.before)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1204,7 +1204,14 @@ def test_all_valid(self):
],
2,
),
[],
[
fixture.deprecation(
report_codes.DEPRECATED_OPTION_VALUE,
option_name="transport",
deprecated_value="sctp",
replaced_by=None,
)
],
)

def test_invalid_all_values(self):
Expand Down
Loading