Skip to content
Closed
Changes from 1 commit
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
57 changes: 49 additions & 8 deletions crates/cli/src/commands/admin/service_account.rs
Original file line number Diff line number Diff line change
Expand Up @@ -205,14 +205,7 @@ async fn execute_create(args: CreateArgs, formatter: &Formatter) -> ExitCode {
None
};

let request = CreateServiceAccountRequest {
policy,
expiry: args.expiry,
name: args.name,
description: args.description,
access_key: args.access_key.clone(),
secret_key: args.secret_key.clone(),
};
let request = build_create_request(&args, policy);

match client.create_service_account(request).await {
Ok(sa) => {
Expand Down Expand Up @@ -244,6 +237,21 @@ async fn execute_create(args: CreateArgs, formatter: &Formatter) -> ExitCode {
}
}

fn build_create_request(args: &CreateArgs, policy: Option<String>) -> CreateServiceAccountRequest {
// Some RustFS versions require `name` to be non-empty when creating service accounts.
// Default to access_key for backward compatibility when --name is omitted.
let name = args.name.clone().or_else(|| Some(args.access_key.clone()));

CreateServiceAccountRequest {
policy,
expiry: args.expiry.clone(),
name,
description: args.description.clone(),
access_key: args.access_key.clone(),
Comment thread
overtrue marked this conversation as resolved.
Outdated
secret_key: args.secret_key.clone(),
}
}

async fn execute_info(args: InfoArgs, formatter: &Formatter) -> ExitCode {
let client = match get_admin_client(&args.alias, formatter) {
Ok(c) => c,
Expand Down Expand Up @@ -346,4 +354,37 @@ mod tests {
assert!(info.secret_key.is_some());
assert_eq!(info.parent_user, Some("admin".to_string()));
}

#[test]
fn test_build_create_request_uses_access_key_as_default_name() {
let args = CreateArgs {
alias: "local".to_string(),
access_key: "svc-access".to_string(),
secret_key: "svc-secret".to_string(),
name: None,
description: None,
policy: None,
expiry: None,
};

let request = build_create_request(&args, None);
assert_eq!(request.name, Some("svc-access".to_string()));
}

#[test]
fn test_build_create_request_keeps_explicit_name() {
let args = CreateArgs {
alias: "local".to_string(),
access_key: "svc-access".to_string(),
secret_key: "svc-secret".to_string(),
name: Some("custom-name".to_string()),
description: Some("desc".to_string()),
policy: None,
expiry: None,
};

let request = build_create_request(&args, None);
assert_eq!(request.name, Some("custom-name".to_string()));
assert_eq!(request.description, Some("desc".to_string()));
}
}