@@ -10,6 +10,8 @@ use crate::exit_code::ExitCode;
1010use crate :: output:: Formatter ;
1111use rc_core:: admin:: { AdminApi , CreateServiceAccountRequest , ServiceAccount } ;
1212
13+ const DEFAULT_SERVICE_ACCOUNT_EXPIRY : & str = "9999-12-31T23:59:59Z" ;
14+
1315/// Service account management subcommands
1416#[ derive( Subcommand , Debug ) ]
1517pub enum ServiceAccountCommands {
@@ -205,14 +207,7 @@ async fn execute_create(args: CreateArgs, formatter: &Formatter) -> ExitCode {
205207 None
206208 } ;
207209
208- let request = CreateServiceAccountRequest {
209- policy,
210- expiry : args. expiry ,
211- name : args. name ,
212- description : args. description ,
213- access_key : args. access_key . clone ( ) ,
214- secret_key : args. secret_key . clone ( ) ,
215- } ;
210+ let request = build_create_service_account_request ( & args, policy) ;
216211
217212 match client. create_service_account ( request) . await {
218213 Ok ( sa) => {
@@ -244,6 +239,24 @@ async fn execute_create(args: CreateArgs, formatter: &Formatter) -> ExitCode {
244239 }
245240}
246241
242+ fn build_create_service_account_request (
243+ args : & CreateArgs ,
244+ policy : Option < String > ,
245+ ) -> CreateServiceAccountRequest {
246+ CreateServiceAccountRequest {
247+ policy,
248+ expiry : args
249+ . expiry
250+ . clone ( )
251+ . or_else ( || Some ( DEFAULT_SERVICE_ACCOUNT_EXPIRY . to_string ( ) ) ) ,
252+ // Keep existing CLI UX where positional ACCESS_KEY is enough.
253+ name : args. name . clone ( ) . or_else ( || Some ( args. access_key . clone ( ) ) ) ,
254+ description : args. description . clone ( ) ,
255+ access_key : args. access_key . clone ( ) ,
256+ secret_key : args. secret_key . clone ( ) ,
257+ }
258+ }
259+
247260async fn execute_info ( args : InfoArgs , formatter : & Formatter ) -> ExitCode {
248261 let client = match get_admin_client ( & args. alias , formatter) {
249262 Ok ( c) => c,
@@ -346,4 +359,43 @@ mod tests {
346359 assert ! ( info. secret_key. is_some( ) ) ;
347360 assert_eq ! ( info. parent_user, Some ( "admin" . to_string( ) ) ) ;
348361 }
362+
363+ #[ test]
364+ fn test_build_create_request_uses_access_key_as_default_name ( ) {
365+ let args = CreateArgs {
366+ alias : "local" . to_string ( ) ,
367+ access_key : "AKIAIOSFODNN7EXAMPLE" . to_string ( ) ,
368+ secret_key : "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" . to_string ( ) ,
369+ name : None ,
370+ description : None ,
371+ policy : None ,
372+ expiry : None ,
373+ } ;
374+
375+ let request = build_create_service_account_request ( & args, None ) ;
376+ assert_eq ! ( request. name. as_deref( ) , Some ( "AKIAIOSFODNN7EXAMPLE" ) ) ;
377+ assert_eq ! (
378+ request. expiry. as_deref( ) ,
379+ Some ( DEFAULT_SERVICE_ACCOUNT_EXPIRY )
380+ ) ;
381+ }
382+
383+ #[ test]
384+ fn test_build_create_request_keeps_explicit_name ( ) {
385+ let args = CreateArgs {
386+ alias : "local" . to_string ( ) ,
387+ access_key : "AKIAIOSFODNN7EXAMPLE" . to_string ( ) ,
388+ secret_key : "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" . to_string ( ) ,
389+ name : Some ( "manual-name" . to_string ( ) ) ,
390+ description : Some ( "demo" . to_string ( ) ) ,
391+ policy : None ,
392+ expiry : Some ( "2030-01-01T00:00:00Z" . to_string ( ) ) ,
393+ } ;
394+
395+ let request = build_create_service_account_request ( & args, Some ( "{\" x\" :1}" . to_string ( ) ) ) ;
396+ assert_eq ! ( request. name. as_deref( ) , Some ( "manual-name" ) ) ;
397+ assert_eq ! ( request. description. as_deref( ) , Some ( "demo" ) ) ;
398+ assert_eq ! ( request. expiry. as_deref( ) , Some ( "2030-01-01T00:00:00Z" ) ) ;
399+ assert_eq ! ( request. policy. as_deref( ) , Some ( "{\" x\" :1}" ) ) ;
400+ }
349401}
0 commit comments