From: "Michael Köppl" <m.koeppl@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [PATCH manager 1/1] migrations: cephx: rename 'consumer' to 'client' in output
Date: Tue, 15 Sep 2026 15:16:51 +0200 [thread overview]
Message-ID: <20260915131651.515520-1-m.koeppl@proxmox.com> (raw)
To match the renaming of 'consumer' to 'client' in the cephx migration
docs, adapt the outputs of the migration script itself as well. To avoid
confusion, comments are updated as well to mention clients instead of
consumers.
Instances where the renaming would have produced tautological or
nonsensical statements have been rephrased.
Signed-off-by: Michael Köppl <m.koeppl@proxmox.com>
---
PVE/Ceph/KeyMigration.pm | 52 +++++++--------
bin/pve-cephx-rotate-service-keys | 98 ++++++++++++++---------------
test/CephKeyMigrationScript_test.pl | 34 +++++-----
test/CephKeyMigration_test.pl | 52 +++++++--------
4 files changed, 118 insertions(+), 118 deletions(-)
diff --git a/PVE/Ceph/KeyMigration.pm b/PVE/Ceph/KeyMigration.pm
index ae69ba02b..89fb2bea0 100644
--- a/PVE/Ceph/KeyMigration.pm
+++ b/PVE/Ceph/KeyMigration.pm
@@ -244,7 +244,7 @@ sub migration_unfinished($state, $entity) {
# Rotated but not written everywhere. An OSD left stopped stays in 'osd metadata', so the recovery
# walk alone misses some. A lockbox key with a journal entry is finished from that journal before
# any plan is built, so it is not listed as something the plan has to pick up. A staged client key
-# is open on purpose until its consumers are confirmed, and reported through its own record.
+# is open on purpose until its clients are confirmed, and reported through its own record.
sub unfinished_entities($state) {
my $started = {
%{ $state->{rotated} // {} },
@@ -455,7 +455,7 @@ sub session_hosts($live) {
return join(', ', map { "$_: $hosts->{$_}" } sort keys %$hosts);
}
-# The same with node names and host-wide consumer hints when known. A hint describes every
+# The same with node names and host-wide client hints when known. A hint describes every
# monitor connection on that node, not the particular cephx session being reported.
sub describe_sessions($live, $hints = {}) {
my ($hosts, $possible) = ({}, {});
@@ -472,7 +472,7 @@ sub describe_sessions($live, $hints = {}) {
map {
my $line = "$_: $hosts->{$_}";
my @possible = sort keys %{ $possible->{$_} // {} };
- $line .= " (possible consumers: " . join('; ', @possible) . ")"
+ $line .= " (possible clients: " . join('; ', @possible) . ")"
if scalar(@possible);
$line;
} sort keys %$hosts,
@@ -583,7 +583,7 @@ sub merge_refresh_record(
# A recorded ID names the same client instance across reconnects and monitor restarts. Numeric
# order says nothing because monitors allocate IDs in independent rank-strided sequences.
-# The key each entity's consumers should be on, by fingerprint: the pending key while one is
+# The key each entity's clients should be on, by fingerprint: the pending key while one is
# staged, the active key otherwise. A session a monitor names by its key fingerprint is judged
# against that; one without the fingerprint falls back to the IDs recorded around the rotation.
sub session_key_targets($exported) {
@@ -662,7 +662,7 @@ sub session_key_support_hint() {
return
"Session-key identification requires Ceph 19.2.6-pve4, 20.2.4-pve4, or newer"
. " and a restart of each monitor. Upgrade older monitors, or disconnect this user's"
- . " consumers before confirming.";
+ . " clients before confirming.";
}
sub mount_refresh_hint($state, $entity, $files = []) {
@@ -684,7 +684,7 @@ sub mount_refresh_hint($state, $entity, $files = []) {
}
# The CephFS storages whose mount reads a rotated key. The kernel holds the key a mount was
-# made with and cannot take a new one, so such a mount is a consumer of its own.
+# made with and cannot take a new one, so such a mount is a client of its own.
sub cephfs_mount_storages($item) {
my $stores = {};
for my $file ($item->{files}->@*) {
@@ -757,7 +757,7 @@ sub finish_after_acks($info, $state, $ready) {
# What a requested confirmation can do, from the records and the session picture alone. Only
# 'accept' closes a record; everything else names what stands in the way, and 'measure' first
-# turns the clients visible right now into named consumers.
+# records the clients visible right now by name.
sub ack_decision($entity, $state, $sessions, $stale) {
my $mark = ($state->{client_refresh} // {})->{$entity};
return { verdict => 'unknown' } if !$mark;
@@ -779,13 +779,13 @@ sub ack_decision($entity, $state, $sessions, $stale) {
return { verdict => 'accept' };
}
-# what must be resolved before the old cipher can be disallowed without stopping a consumer
+# what must be resolved before the old cipher can be disallowed without stopping a client
sub restrict_blockers($info, $state, $describe = undef, $files = {}) {
$describe //= \&session_hosts;
my $blockers = [];
my $sessions = $info->{sessions} // {};
push @$blockers,
- "not every monitor answered the session query, so live consumers cannot be verified"
+ "not every monitor answered the session query, so live clients cannot be verified"
if !$sessions->{complete};
push @$blockers,
"the service tickets still use the '" . ($info->{service_cipher} // 'unknown') . "' cipher"
@@ -810,8 +810,8 @@ sub restrict_blockers($info, $state, $describe = undef, $files = {}) {
$describe,
);
return $readiness->{waiting_details}->{$entity}
- // "consumer refresh awaits your confirmation with '--confirm-clients-refreshed"
- . " $entity --apply'. Confirm only after refreshing every consumer, including"
+ // "client refresh awaits your confirmation with '--confirm-clients-refreshed"
+ . " $entity --apply'. Confirm only after refreshing every client, including"
. " disconnected ones and external key copies.";
};
@@ -893,19 +893,19 @@ sub restrict_blockers($info, $state, $describe = undef, $files = {}) {
push @open_tools, $entity;
next;
}
- # a consumer can keep its IO on established connections without any monitor session,
+ # a client can keep its IO on established connections without any monitor session,
# so its absence from the sweep proves nothing; only the operator closes a record
push @$blockers, "'$entity': " . $refresh_detail->($entity);
}
if (scalar(@open_tools) == 1) {
push @$blockers,
"the rotation of the tool key '$open_tools[0]' awaits '--confirm-clients-refreshed"
- . " $open_tools[0]'; only Ceph's own tools read it, so it needs no consumer refresh";
+ . " $open_tools[0]'; only Ceph's own tools read it, so it needs no client refresh";
} elsif (scalar(@open_tools)) {
push @$blockers,
"the rotations of "
. scalar(@open_tools)
- . " bootstrap and crash keys await their confirmation, which needs no consumer"
+ . " bootstrap and crash keys await their confirmation, which needs no client"
. " refresh; '--confirm-all-clients-refreshed' closes them once every open record is"
. " ready, or '--confirm-clients-refreshed USER' each";
}
@@ -1172,7 +1172,7 @@ sub open_options(
"rollback is prepared.$both "
. join('; ', @problems) . ' ('
. $describe->(\@held) . ').';
- $detail .= ' Refresh consumers using another key to the restored key.'
+ $detail .= ' Refresh clients using another key to the restored key.'
if $reverse->{pending}->@* || $reverse->{other}->@*;
$detail .= ' ' . session_key_support_hint() if $reverse->{unknown}->@*;
} else {
@@ -1182,7 +1182,7 @@ sub open_options(
? 'All visible sessions use the restored key.'
: 'No session is currently visible.'
)
- . " After refreshing disconnected consumers and external copies, use"
+ . " After refreshing disconnected clients and external copies, use"
. " '--confirm-abort-clients-refreshed $entity --apply'.";
}
$waiting_details->{$entity} = $detail;
@@ -1199,7 +1199,7 @@ sub open_options(
length($which)
? "Monitors that did not answer: $which."
: "Not every monitor answered.";
- $waiting_details->{$entity} = "consumer verification is incomplete. $reason$both"
+ $waiting_details->{$entity} = "client verification is incomplete. $reason$both"
. " Retry after every monitor answers.";
} elsif ($verdict eq 'unidentified') {
$waiting_sessions->{$entity} = $decision->{held};
@@ -1209,8 +1209,8 @@ sub open_options(
. session_key_support_hint();
} elsif ($verdict eq 'measure') {
$waiting_details->{$entity} =
- "the first complete consumer measurement is"
- . " pending.$both After refreshing every consumer, run"
+ "the first complete client measurement is"
+ . " pending.$both After refreshing every client, run"
. " '--confirm-clients-refreshed $entity --apply'; the first attempt records"
. " the measurement without committing the key.";
} elsif ($verdict eq 'connected') {
@@ -1224,10 +1224,10 @@ sub open_options(
$waiting_details->{$entity} =
"$count session(s) $why ("
. $describe->($held)
- . ").$both Refresh these consumers, then rerun without options.";
+ . ").$both Refresh these clients, then rerun without options.";
} else {
- $waiting_details->{$entity} = "consumer refresh is not confirmed.$both Refresh"
- . " every consumer, then rerun without options.";
+ $waiting_details->{$entity} = "client refresh is not confirmed.$both Refresh"
+ . " every client, then rerun without options.";
}
}
}
@@ -1250,7 +1250,7 @@ sub open_options(
# The cluster-owned keys can be rotated together without a client decision. The aggregate
# option also safely selects categories that are already done. Keep client.admin, Ceph storage
- # users, and the ticket wipe out; their consumers can sit outside this cluster.
+ # users, and the ticket wipe out; their clients can sit outside this cluster.
my $cluster_keys = grep {
my $entry = $_;
grep { $entry =~ m/^\Q$_\E[: ]/ }
@@ -1312,7 +1312,7 @@ sub open_actions(
if ($finish && !scalar($open->{ready}->@*) && !scalar($open->{next}->@*)) {
push $open->{next}->@*,
"--restrict-ciphers: allow only the '$CIPHER' cipher for authentication, once every"
- . " running consumer holds its rotated key";
+ . " running client holds its rotated key";
push $open->{together}->@*, '--restrict-ciphers';
}
@@ -1330,7 +1330,7 @@ sub open_actions(
}
# A missing next action is not completion: current auth, settings, and recovery state must
- # agree, and no invisible-consumer confirmation may still be outstanding.
+ # agree, and no invisible-client confirmation may still be outstanding.
my @unfinished = unfinished_entities($state);
my $visible = ($info // {})->{sessions}->{clients} // {};
my @unmatched = grep {
@@ -1426,7 +1426,7 @@ sub plan_client_keys($info, $state, $opts, $files) {
next;
}
# a key staged by an earlier run with every copy written stays open on purpose until its
- # consumers are confirmed; one whose copies are not all written is planned again, and the
+ # clients are confirmed; one whose copies are not all written is planned again, and the
# staging reuses the pending key rather than staging a second one over it. An aborting key
# only follows the explicit rollback path.
my $existing = $state->{staged}->{$entity};
diff --git a/bin/pve-cephx-rotate-service-keys b/bin/pve-cephx-rotate-service-keys
index 00e9c3cea..f3a8c2a16 100755
--- a/bin/pve-cephx-rotate-service-keys
+++ b/bin/pve-cephx-rotate-service-keys
@@ -279,7 +279,7 @@ my sub print_possible_consumers($live, $opts) {
my $lines = possible_consumer_hints($live, consumer_hints($opts->{verbose}));
return 0 if !scalar(@$lines);
- log_text("Possible consumers (host-wide hints, not session attribution):");
+ log_text("Possible clients (host-wide hints, not session attribution):");
log_text("Kernel hints mean sockets without an owning process.")
if !$opts->{verbose} && grep { /possible kernel client/ } @$lines;
log_steps($lines);
@@ -696,7 +696,7 @@ my sub manual_promotion_with_retries($collect, $attempts = 10) {
return $collected;
}
-# Keep observations from failed sweeps as well as the final complete sweep. Otherwise a consumer
+# Keep observations from failed sweeps as well as the final complete sweep. Otherwise a client
# seen before an election could disappear during the retry and escape the rotation's baseline.
my sub session_snapshot_with_retries($collect, $attempts = 10) {
my $observations = [];
@@ -1348,7 +1348,7 @@ my sub probe_nodes($info, $plan, $opts = {}) {
return;
}
-# A client key rotated outside this script leaves consumers behind the same way as one this
+# A client key rotated outside this script leaves clients behind the same way as one this
# script rotates, and only the key fingerprints recorded at earlier apply runs make that
# visible. Shared by the preflight and by the destructive actions, which reconcile again right
# before acting: a long run does not serialize other 'ceph auth' commands.
@@ -1465,7 +1465,7 @@ my sub release_manual_promotion($rados, $state) {
}
# Confirmed by the operator: promote the staged key and drop the previous one. From then on a
-# consumer still holding the previous key fails at its next authentication, which is exactly what
+# client still holding the previous key fails at its next authentication, which is exactly what
# the confirmation vouches against. Returns whether a key was committed.
my sub commit_staged_key($rados, $state, $entity) {
my $record = $state->{staged}->{$entity} or return 0;
@@ -1503,7 +1503,7 @@ my sub commit_staged_key($rados, $state, $entity) {
}
# Polled fresh at the moment of the action: this very run may have rotated a client key after
-# the preflight gate ran, and a stale consumer cannot follow the wipe.
+# the preflight gate ran, and a stale client cannot follow the wipe.
my sub assert_consumers_current($rados, $state, $opts, $action, $collect = undef) {
$collect //= sub { collect_current_monitor_state($rados) };
my $monitor = $collect->();
@@ -1546,7 +1546,7 @@ my sub assert_consumers_current($rados, $state, $opts, $action, $collect = undef
if (!$opts->{force}) {
die "refusing to $action: "
. join('; ', @$blockers)
- . ". Refresh the consumers, close each record with '--confirm-clients-refreshed', or pass"
+ . ". Refresh the clients, close each record with '--confirm-clients-refreshed', or pass"
. " '--force' to continue anyway.\n";
}
log_warn("Continuing to $action although a client may be stopped, as '--force' was"
@@ -1565,11 +1565,11 @@ my sub restrict_wanted($info, $opts) {
# monitors-only checks: 1 go ahead, 0 nothing to migrate, -1 fix something first
my sub confirm_hint($entity) {
return
- "confirm with '--confirm-clients-refreshed $entity' once every consumer of it was refreshed";
+ "confirm with '--confirm-clients-refreshed $entity' once every client of it was refreshed";
}
# Only Ceph's own tools read the bootstrap and crash keys, and they load the key afresh for
-# every call, so there is no consumer to refresh and nothing an operator could confirm beyond
+# every call, so there is no client to refresh and nothing an operator could confirm beyond
# what this script wrote. Their records close on their own; '--verbose' names them.
my sub tool_key($entity) {
return scalar(grep { $_ eq $entity } $TOOL_CLIENT_KEYS->@*) ? 1 : 0;
@@ -1662,7 +1662,7 @@ my sub preflight_cluster(
# Without a fingerprint baseline nothing proves what key a live session's instance loaded:
# the state file may be from an earlier version, or was deleted after a finished rotation.
- # An entity still on the old cipher is unambiguous, its consumers hold the current key;
+ # An entity still on the old cipher is unambiguous, its clients hold the current key;
# every other client entity remains unresolved. A cluster without any trace of a migration
# is left alone. The sessions visible now may predate a rotation, so record their exact IDs.
my $seeded_now = {};
@@ -1683,7 +1683,7 @@ my sub preflight_cluster(
if (tool_key($entity)) {
push @seeded_tools, $entity;
} else {
- log_warn("the consumers of '$entity' predate this script's tracking; "
+ log_warn("the clients of '$entity' predate this script's tracking; "
. confirm_hint($entity));
}
$seeded_now->{$entity} = 1;
@@ -1712,7 +1712,7 @@ my sub preflight_cluster(
my $stale_clients = reopen_returning_clients($state, $info->{sessions}, $info->{exported});
# a record of a tool key left open by an earlier version closes here, unless a recorded
- # session of it is back, which then reads like any other consumer
+ # session of it is back, which then reads like any other client
my @closed_tools;
for my $entity (sort keys %{ $state->{client_refresh} // {} }) {
next if !tool_key($entity) || $stale_clients->{$entity};
@@ -1756,7 +1756,7 @@ my sub preflight_cluster(
update_cluster_info($info, $fresh);
}
- # The fresh snapshot can reopen a record whose consumer returned. Include it in the aggregate
+ # The fresh snapshot can reopen a record whose client returned. Include it in the aggregate
# gate before committing any key rather than using the selection made from the startup state.
if ($confirm_all) {
@confirm = sort {
@@ -1838,7 +1838,7 @@ my sub preflight_cluster(
# every record passed the checks above, so the aggregate option is accepted as a whole
log_warn("accepting '--confirm-all-clients-refreshed' for "
. join(', ', @confirm)
- . ": every consumer of them that this run can see is refreshed, and you confirm"
+ . ": every client of them that this run can see is refreshed, and you confirm"
. " the same for those it cannot see")
if $confirm_all && scalar(@confirm);
for my $entity (@confirm) {
@@ -1873,7 +1873,7 @@ my sub preflight_cluster(
}
if ($verdict eq 'incomplete') {
log_fail("not accepting '$option': not every monitor answered the session query,"
- . " so a consumer of it could be connected unseen");
+ . " so a client of it could be connected unseen");
$confirmation_refused = 1;
next;
}
@@ -1886,7 +1886,7 @@ my sub preflight_cluster(
next;
}
# An interrupted or externally performed rotation may lack a complete baseline. Record
- # old-key and unidentified sessions before accepting attestations for unseen consumers.
+ # old-key and unidentified sessions before accepting attestations for unseen clients.
if ($verdict eq 'measure') {
my $live = complete_client_measurement($state, $info, $entity);
save_state($state);
@@ -1901,7 +1901,7 @@ my sub preflight_cluster(
. " is now recorded";
log_fail("not accepting '$option' yet: its rotation needed a first complete"
. " measurement; $measurement. Repeat the confirmation after refreshing any"
- . " recorded clients; it then covers only consumers this run cannot see.");
+ . " recorded clients; it then covers only clients this run cannot see.");
$confirmation_refused = 1;
next;
}
@@ -1920,13 +1920,13 @@ my sub preflight_cluster(
die "cannot commit the staged key of '$entity' without a cluster connection\n"
if $staged && !$info->{rados};
- # What is left are consumers no run can see: disconnected ones, and copies of the key
+ # What is left are clients no run can see: disconnected ones, and copies of the key
# on hosts Proxmox VE does not manage. The aggregate option said so once, above.
- log_warn("accepting '$option': every consumer of '$entity' that this run can see"
+ log_warn("accepting '$option': every client of '$entity' that this run can see"
. " is refreshed, and you confirm the same for those it cannot see")
if !$confirm_all;
# The aggregate was checked as a whole on a fresh snapshot above. Recheck at the
- # mutation boundary so a consumer that appears while the batch runs preserves this
+ # mutation boundary so a client that appears while the batch runs preserves this
# key and its open record.
if ($staged && $collect_clients) {
my $fresh = collect_client_snapshot($info->{rados}, $collect_clients);
@@ -1939,8 +1939,8 @@ my sub preflight_cluster(
my $action = ack_decision($entity, $state, $fresh->{sessions}, $action_stale);
if ($action->{verdict} ne 'accept') {
log_fail(
- "not accepting '$option' at the commit boundary: a fresh consumer"
- . " check no longer proves that every visible consumer is refreshed"
+ "not accepting '$option' at the commit boundary: a fresh client"
+ . " check no longer proves that every visible client is refreshed"
. (
$action->{verdict} eq 'unidentified'
? '. ' . session_key_support_hint()
@@ -1998,7 +1998,7 @@ my sub preflight_cluster(
: "not every monitor answered the session query, so it cannot be verified that no"
. " client would be stopped";
if (!$opts->{force}) {
- log_fail("Refusing '--wipe-rotating-keys': $why. Refresh the consumers first, or"
+ log_fail("Refusing '--wipe-rotating-keys': $why. Refresh the clients first, or"
. " pass '--force' to wipe anyway.");
return -1;
}
@@ -2623,9 +2623,9 @@ my sub print_plan($info, $plan, $state, $opts, $storage_entities) {
if $opts->{verbose};
}
if ($replaced_count) {
- log_step("For each Ceph user marked 'replaced at once', stop every consumer before"
+ log_step("For each Ceph user marked 'replaced at once', stop every client before"
. " applying. Apply the replacement only after all are stopped, update every key"
- . " copy outside Proxmox VE, and then restart the consumers. Immediate replacement"
+ . " copy outside Proxmox VE, and then restart the clients. Immediate replacement"
. " removes the active key immediately, so reconnect can fail as soon as the key"
. " changes; monitor-ticket expiry is only an upper bound on continued access."
);
@@ -2659,8 +2659,8 @@ my sub print_plan($info, $plan, $state, $opts, $storage_entities) {
}
print_possible_consumers($live_for_hints, $opts);
if ($staged_count) {
- log_step("For staged keys, refresh their consumers after applying: live-migrate every"
- . " VM, remount every kernel CephFS or RBD mount, and restart other consumers; a"
+ log_step("For staged keys, refresh their clients after applying: live-migrate every"
+ . " VM, remount every kernel CephFS or RBD mount, and restart other clients; a"
. " dry run then reports who is left.");
}
}
@@ -3202,7 +3202,7 @@ my sub check_client_kernels($plan, $opts, $kernels = undef) {
log_fail("These nodes run kernels that do not support '$CIPHER': $detail. The affected"
. " keys are: $keys. Reboot the nodes into kernel 7.0 or newer first.");
}
- log_text("Pass '--force' only after checking every external and future consumer. Affected"
+ log_text("Pass '--force' only after checking every external and future client. Affected"
. " nodes may lose access to these storages.");
return 0;
}
@@ -3659,7 +3659,7 @@ my sub write_client_key_copies($item, $entry, $verbose = 0) {
}
# The new key becomes the entity's pending key, which the monitors accept next to the active one
-# while automatic promotion is disabled, so every copy can be rewritten and every consumer
+# while automatic promotion is disabled, so every copy can be rewritten and every client
# refreshed at its own pace. The rotation ends with '--confirm-clients-refreshed', which commits
# the key.
my sub stage_client_key(
@@ -3708,7 +3708,7 @@ my sub stage_client_key(
. " 'ceph auth commit-pending $entity' or 'ceph auth clear-pending $entity'.\n";
} else {
# Record intent before the auth change. A failure after it then leaves an open,
- # deliberately incomplete record instead of losing every consumer seen just before.
+ # deliberately incomplete record instead of losing every client seen just before.
my $before = $snapshot->();
my $started = time();
$state->{client_refresh}->{$entity} = merge_refresh_record(
@@ -3803,13 +3803,13 @@ my sub stage_client_key(
save_state($state);
log_pass("'$entity' has a new '$CIPHER' key staged next to its current one; both authenticate"
- . " until you commit the new one, once every consumer of it is refreshed.");
+ . " until you commit the new one, once every client of it is refreshed.");
return;
}
# Prepare a rollback by restoring the active key to managed copies while both keys remain valid.
-# Retiring the pending key is a separate, freshly checked action after consumers refresh back.
+# Retiring the pending key is a separate, freshly checked action after clients refresh back.
my sub abort_staged_key($rados, $state, $entity, $files, $verbose = 0, $resuming = 0) {
my $record = $state->{staged}->{$entity}
or die "no key is staged for '$entity' by this script\n";
@@ -3957,8 +3957,8 @@ my sub retire_aborted_keys($rados, $state, $entities, $collect = undef) {
assert_abort_retirement_ready($state, $initial, $_) for @entities;
log_warn("accepting reverse-refresh confirmation for "
. join(', ', @entities)
- . ": every visible consumer uses the restored key, and you confirm the same for"
- . " disconnected consumers and external key copies");
+ . ": every visible client uses the restored key, and you confirm the same for"
+ . " disconnected clients and external key copies");
for my $entity (@entities) {
my $fresh = collect_client_snapshot($rados, $collect);
@@ -4008,7 +4008,7 @@ my sub migrate_client_key($rados, $state, $item, $snapshot = undef, $verbose = 0
$snapshot //= sub { collect_current_monitor_state($rados)->{sessions} };
# Record intent before the auth change. A failure after the rotation then leaves an open,
- # deliberately incomplete record instead of losing every consumer seen immediately before it.
+ # deliberately incomplete record instead of losing every client seen immediately before it.
my $before_cipher = key_cipher(auth_entry($rados, $entity)->{key}) // -1;
my ($before, $started);
if ($before_cipher != $CIPHER_ID) {
@@ -4073,13 +4073,13 @@ my sub migrate_client_key($rados, $state, $item, $snapshot = undef, $verbose = 0
{ $entity => key_fingerprint($entry->{key}) },
)->{$entity} // [];
if (scalar(@$held)) {
- log_warn("Consumers that remained connected through the immediate replacement may"
+ log_warn("Clients that remained connected through the immediate replacement may"
. " still hold the previous '$entity' key in memory: "
. scalar(@$held)
. ". Their next reconnect fails, as the active key changed; one that stays"
. " connected keeps its tickets, the monitor one for three days at most by"
. " default, and open data connections can outlast that. Live-migrate every VM,"
- . " remount the kernel mounts, and restart the other consumers, then run a dry run"
+ . " remount the kernel mounts, and restart the other clients, then run a dry run"
. " to confirm none remain.");
}
}
@@ -4335,7 +4335,7 @@ my sub print_open_options(
' ',
'Ready for confirmation: ' . join(', ', $open->{ready}->@*),
));
- log_text("Confirm only after refreshing every consumer, including disconnected ones"
+ log_text("Confirm only after refreshing every client, including disconnected ones"
. " and external key copies:");
log_step($open->{command});
}
@@ -4353,7 +4353,7 @@ my sub print_open_options(
push @live, @{ $open->{waiting_sessions}->{$entity} // [] };
}
print_possible_consumers(\@live, $opts) if @live;
- log_text("Session absence does not prove that disconnected consumers or external key copies"
+ log_text("Session absence does not prove that disconnected clients or external key copies"
. " were refreshed.")
if $opts->{verbose};
}
@@ -4388,7 +4388,7 @@ my sub print_open_options(
log_step("$PROGRAM --apply " . join(' ', $open->{together}->@*));
}
if ($open->{hedge}) {
- log_text("Rotate only when every consumer supports aes256k. Check 'pveceph auth status'"
+ log_text("Rotate only when every client supports aes256k. Check 'pveceph auth status'"
. " before applying.");
}
}
@@ -4427,7 +4427,7 @@ my sub print_closing_notes(
$snapshot //= collect_restriction_snapshot($rados);
my $checks = $snapshot->{health_checks};
my $exported = $snapshot->{exported};
- # This check concerns active client keys, independently of pending keys and consumer refresh.
+ # This check concerns active client keys, independently of pending keys and client refresh.
my @client_ciphers = ref($exported) eq 'HASH'
? map {
ref($exported->{$_}) eq 'HASH' ? key_cipher($exported->{$_}->{key}) : undef;
@@ -4581,7 +4581,7 @@ my sub settle_staged_records($rados, $info, $state, $opts, $files, $collect = un
}
if ($verdict eq 'committed') {
log_warn("the key staged for '$entity' was promoted outside this script, so its"
- . " rotation counts as done; confirm its consumers as before");
+ . " rotation counts as done; confirm its clients as before");
my $item = { entity => $entity, files => $files->{$entity} // [] };
if (
!$record->{written}
@@ -4669,7 +4669,7 @@ and client keys require their rotation options. Without '--apply', this only pri
--verbose include full inventories, paths, and equivalent Ceph commands
--timeout SECONDS how long to wait for a daemon to come back (default 600)
--force continue past blocking HEALTH_WARN checks, kernel
- compatibility checks, and consumer or incomplete-session
+ compatibility checks, and client or incomplete-session
blockers for a wipe. With '--restrict-ciphers', also override
every blocker for the switch, including old-cipher
'client.admin' and stored 'mon.' keys and clients using them.
@@ -4699,11 +4699,11 @@ and client keys require their rotation options. Without '--apply', this only pri
clusters. Requires Ceph 19.2.6-pve3, 20.2.4-pve3, or newer
installed on every monitor, followed by a restart of every
monitor. Each key is staged rather than replaced at once.
- Refresh every consumer and external key copy, then confirm it
+ Refresh every client and external key copy, then confirm it
in a later run
--rotate-storage-key NAME also stage a new key for one Ceph storage that has its own user.
May be given more than once. Requires every monitor to support
- keeping both keys valid while consumers are refreshed one by one.
+ keeping both keys valid while clients are refreshed one by one.
Commit with '--confirm-clients-refreshed' or, once every open
record is ready, '--confirm-all-clients-refreshed'
--abort-staged-key USER needs '--apply'. Prepare rollback of a staged client key by
@@ -4711,24 +4711,24 @@ and client keys require their rotation options. Without '--apply', this only pri
refreshing idle CephFS mounts. Both keys remain valid
--confirm-abort-clients-refreshed USER
needs '--apply'. After rollback preparation, confirm that every
- disconnected consumer and external copy uses the restored key.
+ disconnected client and external copy uses the restored key.
Refused while a visible session uses the staged key or does not
report a key fingerprint. Retires the staged key when accepted
--confirm-clients-refreshed USER
- needs '--apply'. Confirm that all disconnected consumers of one
+ needs '--apply'. Confirm that all disconnected clients of one
rotated Ceph user key were refreshed and all key copies outside
- Proxmox VE were updated. Refused while a recorded consumer is
+ Proxmox VE were updated. Refused while a recorded client is
connected; a returning one reopens the record. For a staged key,
this commits the new key
--confirm-all-clients-refreshed
needs '--apply'. For every open Ceph user key refresh record, the
- operator confirms that all disconnected consumers were refreshed
+ operator confirms that all disconnected clients were refreshed
and all key copies outside Proxmox VE were updated. Refused as a
whole unless every record has a complete measurement, no recorded
connected client, and every staged key in it is written to all
managed copies
--restrict-ciphers allow only the 'aes256k' cipher for authentication, the final
- step; refused while any key or live consumer still depends on
+ step; refused while any key or live client still depends on
the old cipher
--wipe-rotating-keys NOT RECOMMENDED: invalidate every service ticket instead of
waiting a few hours for the rotating keys to expire. Use only
diff --git a/test/CephKeyMigrationScript_test.pl b/test/CephKeyMigrationScript_test.pl
index d2d85d7f5..a52fe4521 100755
--- a/test/CephKeyMigrationScript_test.pl
+++ b/test/CephKeyMigrationScript_test.pl
@@ -592,7 +592,7 @@ sub migrated_info {
is_deeply(
$state->{client_refresh}->{'client.app'}->{session_ids},
[40],
- 'the one request measures the visible consumer',
+ 'the one request measures the visible client',
);
ok(
!defined($state->{client_refresh}->{'client.app'}->{cleared}),
@@ -2405,7 +2405,7 @@ sub run_aggregate_confirmation {
is_deeply(
$state->{client_refresh}->{'client.cp'}->{session_ids},
[1, 2],
- 'the consumers around the staging are recorded like around a replacement',
+ 'the clients around the staging are recorded like around a replacement',
);
ok(exists($state->{client_grace}), 'the run remembers that it disabled automatic promotion');
ok(!defined($state->{client_grace}->{previous}), 'with nothing explicit to put back');
@@ -2448,7 +2448,7 @@ sub run_aggregate_confirmation {
is($state->{client_keys_seen}->{'client.cp'}, key_fingerprint($NEW), 'the fingerprint follows');
is($rados->issued('config rm'), 1, 'the option is removed again once nothing is staged');
ok(!exists($state->{client_grace}), 'and the run forgets it set it');
- ok(defined($mark->{cleared}), 'the consumer record is closed like after a replacement');
+ ok(defined($mark->{cleared}), 'the client record is closed like after a replacement');
}
{
@@ -3177,7 +3177,7 @@ sub run_aggregate_confirmation {
$help =~ m/(--confirm-clients-refreshed USER.*?)(?=\n --confirm-all-clients-refreshed)/s;
like(
$per_user_help // '',
- qr/disconnected consumers.*key copies.*outside\s+Proxmox VE/s,
+ qr/disconnected clients.*key copies.*outside\s+Proxmox VE/s,
'per-user help states the trust boundary outside Proxmox VE',
);
like(
@@ -3195,7 +3195,7 @@ sub run_aggregate_confirmation {
$help =~ m/(--confirm-all-clients-refreshed.*?)(?=\n --restrict-ciphers)/s;
like(
$aggregate_help // '',
- qr/every open Ceph user key refresh record.*operator confirms.*disconnected consumers.*key copies.*outside\s+Proxmox VE/s,
+ qr/every open Ceph user key refresh record.*operator confirms.*disconnected clients.*key copies.*outside\s+Proxmox VE/s,
'aggregate help names open refresh records and the operator trust boundary',
);
like(
@@ -3649,7 +3649,7 @@ sub run_aggregate_confirmation {
my $help = $HOOKS->{usage}->();
like(
$help,
- qr/--rotate-all-storage-keys\s+rotate all dedicated users of managed local RBD and CephFS\s+storages\. Excludes 'client\.admin' and storages for external\s+clusters\. Requires Ceph 19\.2\.6-pve3, 20\.2\.4-pve3, or newer\s+installed on every monitor, followed by a restart of every\s+monitor\. Each key is staged rather than replaced at once\.\s+Refresh every consumer and external key copy, then confirm it\s+in a later run/,
+ qr/--rotate-all-storage-keys\s+rotate all dedicated users of managed local RBD and CephFS\s+storages\. Excludes 'client\.admin' and storages for external\s+clusters\. Requires Ceph 19\.2\.6-pve3, 20\.2\.4-pve3, or newer\s+installed on every monitor, followed by a restart of every\s+monitor\. Each key is staged rather than replaced at once\.\s+Refresh every client and external key copy, then confirm it\s+in a later run/,
'help states scope, exclusions, the monitor requirement, staging, and the later'
. ' confirmation',
);
@@ -3921,7 +3921,7 @@ sub run_aggregate_confirmation {
my $output = $print->(0);
like(
$output,
- qr/Ready for confirmation: client\.store\nConfirm only after refreshing every consumer, including disconnected ones and external key copies:\n\s+\S+ --apply --confirm-all-clients-refreshed/,
+ qr/Ready for confirmation: client\.store\nConfirm only after refreshing every client, including disconnected ones and external key copies:\n\s+\S+ --apply --confirm-all-clients-refreshed/,
'a ready record gets the direct heading and the exact confirmation command',
);
unlike($output, qr/only you can vouch for/, 'without the old phrase');
@@ -3984,7 +3984,7 @@ sub run_aggregate_confirmation {
);
like(
$one,
- qr/Rotate only when every consumer supports aes256k/,
+ qr/Rotate only when every client supports aes256k/,
'and the kernel caveat stays',
);
}
@@ -4098,12 +4098,12 @@ sub run_aggregate_confirmation {
like(
$mixed,
qr/Ceph user 'client\.vm': resume writing its current key to every copy.*the tool key 'client\.crash': replaced at once; only Ceph's own tools read it, so there is nothing to stop/s,
- 'a replaced tool key is one line without a consumer to stop, a resumed bulk user its own',
+ 'a replaced tool key is one line without a client to stop, a resumed bulk user its own',
);
unlike(
$mixed,
qr/For each Ceph user marked 'replaced at once'/,
- 'a tool key alone does not trigger the stop-consumers instruction',
+ 'a tool key alone does not trigger the stop-clients instruction',
);
unlike(
$mixed,
@@ -4119,7 +4119,7 @@ sub run_aggregate_confirmation {
};
like(
$render->([$other, $resume], { 'rotate-storage-key' => ['rbd-other'] }),
- qr/Ceph user 'client\.other': replaced at once.*For each Ceph user marked 'replaced at once'.*stop every consumer/s,
+ qr/Ceph user 'client\.other': replaced at once.*For each Ceph user marked 'replaced at once'.*stop every client/s,
'a real user replaced at once keeps the safety block, whatever else the plan holds',
);
@@ -4300,7 +4300,7 @@ sub run_aggregate_confirmation {
!defined($returning->{client_refresh}->{'client.crash'}->{cleared}),
'a returning recorded session keeps a tool record open',
);
- like($seen, qr/may still hold the previous key/, 'and is reported as a consumer');
+ like($seen, qr/may still hold the previous key/, 'and is reported as a client');
}
# --- the scope names only categories with work left; the closing line only what the run did -----
@@ -4369,7 +4369,7 @@ sub run_aggregate_confirmation {
}
like(
$output,
- qr/Client keys awaiting action:.*'client\.app': consumer verification is incomplete\. Monitors that did not answer: mon-b\. Both keys\s+remain valid\. Retry after every monitor answers\./s,
+ qr/Client keys awaiting action:.*'client\.app': client verification is incomplete\. Monitors that did not answer: mon-b\. Both keys\s+remain valid\. Retry after every monitor answers\./s,
'a plain dry run explains a staged key hidden by an incomplete session picture',
);
}
@@ -4964,7 +4964,7 @@ sub run_aggregate_confirmation {
{
no warnings qw(once redefine);
local *main::file_set_contents = sub { };
- local *main::run_command = sub { die "unexpected host-wide consumer probe\n"; };
+ local *main::run_command = sub { die "unexpected host-wide client probe\n"; };
local *STDOUT;
open(STDOUT, '>', \$output) or die $!;
$result = $HOOKS->{preflight}->(
@@ -4975,7 +4975,7 @@ sub run_aggregate_confirmation {
like(
$output,
qr/FAIL: Cannot restrict the allowed ciphers to 'aes256k' yet:/,
- 'the refusal does not assert that it found a consumer that would stop',
+ 'the refusal does not assert that it found a client that would stop',
);
like(
$output,
@@ -4984,7 +4984,7 @@ sub run_aggregate_confirmation {
);
unlike(
$output,
- qr/64 live|Possible consumers|a client would be stopped|--confirm-clients-refreshed/,
+ qr/64 live|Possible clients|a client would be stopped|--confirm-clients-refreshed/,
'no broad guest inventory or premature confirmation obscures the required inspection',
);
ok(!(grep { length($_) > 100 } split(/\n/, $output)), 'the refusal wraps at 100 columns');
@@ -5116,7 +5116,7 @@ for my $case ([0, 0], [1, 0], [0, 1], [1, 1]) {
0,
$recorded_mounts
? 'finishing accepts the recorded target-key mounts without another remount'
- : 'the same finishing command passes after only the stale consumer refreshes',
+ : 'the same finishing command passes after only the stale client refreshes',
);
is_deeply(
$rados->{committed},
diff --git a/test/CephKeyMigration_test.pl b/test/CephKeyMigration_test.pl
index 200f5b27b..a78b0fb72 100755
--- a/test/CephKeyMigration_test.pl
+++ b/test/CephKeyMigration_test.pl
@@ -514,7 +514,7 @@ is(
sessions => [{ con_type => 'client', entity_name => '', global_id => [] }],
}]);
ok(!$bad_client->{complete}, 'a client without a usable entity or ID is incomplete');
- is_deeply($bad_client->{clients}, {}, 'a malformed client contributes no consumer evidence');
+ is_deeply($bad_client->{clients}, {}, 'a malformed client contributes no session evidence');
my $non_client = summarize_sessions([{
mon => 'a',
@@ -554,7 +554,7 @@ is(
);
}
-# --- consumers a rotation left behind ---------------------------------------------------------
+# --- clients a rotation left behind ---------------------------------------------------------
{
my $sessions = {
complete => 1,
@@ -636,13 +636,13 @@ is(
my $stale = stale_consumers($complete, $measured->{client_refresh});
my $connected = ack_decision('client.admin', $measured, $complete, $stale);
- is($connected->{verdict}, 'connected', 'a recorded consumer that is connected refuses it');
+ is($connected->{verdict}, 'connected', 'a recorded client that is connected refuses it');
is(scalar(@{ $connected->{held} }), 1, 'and is named, so the operator knows what to refresh');
is(
ack_decision('client.admin', $measured, { complete => 0, clients => {} }, {})->{verdict},
'incomplete',
- 'an unanswered monitor refuses it, a consumer could be connected unseen',
+ 'an unanswered monitor refuses it, a client could be connected unseen',
);
my $measure = ack_decision('client.admin', $unmeasured, $complete, {});
@@ -677,7 +677,7 @@ is(
is(
ack_decision('client.admin', $measured, { complete => 1, clients => {} }, {})->{verdict},
'accept',
- 'a measured record whose recorded consumers are gone can be confirmed',
+ 'a measured record whose recorded clients are gone can be confirmed',
);
}
@@ -698,7 +698,7 @@ is(
my $waiting = { client_refresh => { 'client.admin' => { session_ids => [7] } } };
my $open = open_options($checks, {}, {}, $CIPHER, $waiting, $sessions);
- is_deeply($open->{waiting}, ['client.admin'], 'a record with a connected consumer waits');
+ is_deeply($open->{waiting}, ['client.admin'], 'a record with a connected client waits');
ok(
!(grep { m/restrict-ciphers|confirm-clients-refreshed/ } $open->{next}->@*),
'neither the confirmation nor the restriction is offered while it does',
@@ -711,7 +711,7 @@ is(
is_deeply(
$open->{waiting},
['client.admin'],
- 'a record that would first measure its live consumer remains an explicit waiter',
+ 'a record that would first measure its live client remains an explicit waiter',
);
is_deeply($open->{ready}, [], 'a measure verdict is never presented as ready');
ok(!defined($open->{command}), 'no acknowledgment command is generated for a measurement');
@@ -766,7 +766,7 @@ is(
client_refresh => { 'client.admin' => { session_ids => [7], cleared => 5 } },
};
$open = open_options($checks, {}, {}, $CIPHER, $returned, $sessions);
- is_deeply($open->{waiting}, ['client.admin'], 'a recorded consumer that returns waits again');
+ is_deeply($open->{waiting}, ['client.admin'], 'a recorded client that returns waits again');
ok(
!(grep { m/restrict-ciphers/ } $open->{next}->@*),
'and the restriction is off the table until it is gone',
@@ -782,11 +782,11 @@ is(
);
ok(
!(grep { m/restrict-ciphers/ } $open->{next}->@*),
- 'nor the restriction, as a consumer could be connected unseen',
+ 'nor the restriction, as a client could be connected unseen',
);
like(
$open->{waiting_details}->{'client.admin'},
- qr/consumer verification is incomplete\. Not every monitor answered\./,
+ qr/client verification is incomplete\. Not every monitor answered\./,
'an incomplete session picture explains the waiter',
);
ok(
@@ -1166,7 +1166,7 @@ is(
like(
$blockers->[0],
qr/recorded live client\(s\) may still hold the previous key of 'client.admin' \(a: 1\)/,
- 'a recorded consumer that may predate the rotation blocks it',
+ 'a recorded client that may predate the rotation blocks it',
);
my $old_key = { %$clean, exported => { 'client.admin' => { key => $OLD } } };
@@ -1179,7 +1179,7 @@ is(
like(
$blockers->[1],
qr/1 live client\(s\) authenticate as 'client.admin'/,
- 'and so does its live consumer, named separately',
+ 'and so does its live client, named separately',
);
my $old_pending = {
@@ -1213,7 +1213,7 @@ is(
like(
$blockers->[0],
qr/awaits '--confirm-clients-refreshed client.crash'/,
- 'a rotation record asks for the acknowledgment, a consumer may be invisible',
+ 'a rotation record asks for the acknowledgment, a client may be invisible',
);
$blockers = restrict_blockers(
@@ -1784,7 +1784,7 @@ my sub cluster {
};
# Enable the display prerequisite so each refusal exercises its safety condition.
for my $case (
- ['a recorded consumer', $refresh, $connected],
+ ['a recorded client', $refresh, $connected],
['an unconfirmed refresh', $refresh, { complete => 1, clients => {} }],
['an incomplete session query', {}, { complete => 0, clients => {} }],
) {
@@ -2518,7 +2518,7 @@ my sub cluster {
};
is(
describe_sessions($live, $hints),
- '198.51.100.8: 1, due: 2 (possible consumers: VM 102)',
+ '198.51.100.8: 1, due: 2 (possible clients: VM 102)',
'known IPs become node names while unknown hosts remain visible',
);
is(describe_sessions($live), session_hosts($live), 'without hints the plain host list stays');
@@ -2549,8 +2549,8 @@ my sub cluster {
)->@*;
like(
$blocker,
- qr/1 live client\(s\) authenticate as 'client\.vm' \(due: 1 \(possible consumers: VM 102\)\)/,
- 'the restriction blocker labels host-wide hints as possible consumers',
+ qr/1 live client\(s\) authenticate as 'client\.vm' \(due: 1 \(possible clients: VM 102\)\)/,
+ 'the restriction blocker labels host-wide hints as possible clients',
);
}
@@ -2588,7 +2588,7 @@ my sub cluster {
is(scalar(@admin), 1, 'a user with live and recorded sessions gets one line');
like(
$admin[0],
- qr/^'client\.admin': 4 session\(s\) may still hold the previous key \(due: 4\).*Refresh these consumers, then rerun without options\.$/,
+ qr/^'client\.admin': 4 session\(s\) may still hold the previous key \(due: 4\).*Refresh these clients, then rerun without options\.$/,
'only the recorded subset is reported as needing refresh',
);
my $unrecorded = { %$state, client_refresh => { %{ $state->{client_refresh} } } };
@@ -2605,7 +2605,7 @@ my sub cluster {
is(scalar(@tools), 1, 'the open bootstrap and crash records are one line');
like(
$tools[0],
- qr/the rotations of 7 bootstrap and crash keys await their confirmation, which needs no consumer refresh; '--confirm-all-clients-refreshed' closes them/,
+ qr/the rotations of 7 bootstrap and crash keys await their confirmation, which needs no client refresh; '--confirm-all-clients-refreshed' closes them/,
'saying why no refresh is needed and how to close them',
);
ok(!(grep { m/bootstrap-mds' awaits/ } @$blockers), 'and no line per tool key');
@@ -2877,7 +2877,7 @@ my sub cluster {
like($text, $expected, "$name rollback sessions have direction-specific guidance");
unlike(
$text,
- qr/Refresh consumers/,
+ qr/Refresh clients/,
'unknown sessions need identification, not another refresh',
) if $name eq 'unknown';
unlike(
@@ -2889,7 +2889,7 @@ my sub cluster {
is(
scalar(@{ $open->{waiting_sessions}->{$user} // [] }),
$name eq 'restored' ? 0 : 1,
- 'only unresolved reverse sessions contribute consumer hints',
+ 'only unresolved reverse sessions contribute client hints',
);
}
my $changed = open_options(
@@ -3063,7 +3063,7 @@ my sub cluster {
'unperformed inspection is not an observed busy mount or a confirmation opportunity',
);
is_deeply($state, $unchanged, 'deriving the explanation does not change the journal');
- is(scalar(@described), 0, 'current-key sessions do not trigger possible-consumer inventories');
+ is(scalar(@described), 0, 'current-key sessions do not trigger possible-client inventories');
$state->{mount_refresh}->{$entity} = {
target => $target,
@@ -3096,9 +3096,9 @@ my sub cluster {
like(
$blockers->[0],
qr/1 session\(s\) still authenticate with a previous key/,
- 'positive stale evidence is reported as one stale session, not 64 consumers',
+ 'positive stale evidence is reported as one stale session, not 64 clients',
);
- is(scalar(@described), 1, 'only the stale subset supplies consumer hints');
+ is(scalar(@described), 1, 'only the stale subset supplies client hints');
$info->{sessions}->{clients}->{$entity}->[0]->{key_fingerprint} = $target;
$info->{sessions}->{complete} = 0;
@@ -3106,7 +3106,7 @@ my sub cluster {
$blockers = restrict_blockers($info, $state, $describe, $files);
like(
join(' ', @$blockers),
- qr/consumer verification is incomplete.*mon-b/,
+ qr/client verification is incomplete.*mon-b/,
'restriction distinguishes incomplete observation from missing confirmation',
);
$info->{sessions}->{complete} = 1;
@@ -3114,7 +3114,7 @@ my sub cluster {
$blockers = restrict_blockers($info, $state, $describe, $files);
like(
$blockers->[0],
- qr/first complete consumer measurement.*first attempt records/,
+ qr/first complete client measurement.*first attempt records/,
'a missing measurement does not look ready for retirement',
);
}
--
2.47.3
reply other threads:[~2026-09-15 13:17 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260915131651.515520-1-m.koeppl@proxmox.com \
--to=m.koeppl@proxmox.com \
--cc=pve-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox