@@ -75,6 +75,34 @@ impl Provision {
7575 . ok_or ( Error :: NoUserProvisioner )
7676 }
7777
78+ /// Sets the system hostname using the configured hostname provisioners.
79+ ///
80+ /// Iterates through the configured hostname provisioner backends and attempts to set
81+ /// the hostname with the first backend that succeeds. Currently supported
82+ /// backends include:
83+ /// - Hostnamectl
84+ ///
85+ /// # Returns
86+ ///
87+ /// Returns `Ok(())` if the hostname was set successfully.
88+ /// Returns [`Error::NoHostnameProvisioner`] if no hostname provisioner backends are
89+ /// configured or if all backends fail to set the hostname.
90+ #[ instrument( skip_all) ]
91+ pub fn set_hostname ( & self ) -> Result < ( ) , Error > {
92+ self . config
93+ . hostname_provisioners
94+ . backends
95+ . iter ( )
96+ . find_map ( |backend| match backend {
97+ HostnameProvisioner :: Hostnamectl => {
98+ HostnameProvisioner :: Hostnamectl . set ( & self . hostname ) . ok ( )
99+ }
100+ #[ cfg( test) ]
101+ HostnameProvisioner :: FakeHostnamectl => Some ( ( ) ) ,
102+ } )
103+ . ok_or ( Error :: NoHostnameProvisioner )
104+ }
105+
78106 /// Provisions the host with all configured settings, including SSH configuration.
79107 ///
80108 /// Provisioning can fail if the host lacks the necessary tools. For example,
@@ -98,18 +126,7 @@ impl Provision {
98126 /// Internal helper to provision core resources.
99127 #[ instrument( skip_all) ]
100128 fn provision_core ( & self ) -> Result < ( ) , Error > {
101- self . config
102- . hostname_provisioners
103- . backends
104- . iter ( )
105- . find_map ( |backend| match backend {
106- HostnameProvisioner :: Hostnamectl => {
107- HostnameProvisioner :: Hostnamectl . set ( & self . hostname ) . ok ( )
108- }
109- #[ cfg( test) ]
110- HostnameProvisioner :: FakeHostnamectl => Some ( ( ) ) ,
111- } )
112- . ok_or ( Error :: NoHostnameProvisioner ) ?;
129+ self . set_hostname ( ) ?;
113130
114131 self . create_user ( ) ?;
115132
@@ -193,7 +210,7 @@ mod tests {
193210 use crate :: config:: {
194211 HostnameProvisioners , PasswordProvisioners , UserProvisioners ,
195212 } ;
196- use crate :: error;
213+ use crate :: error:: Error ;
197214 use crate :: User ;
198215
199216 #[ test]
@@ -338,8 +355,57 @@ mod tests {
338355 "create_user should fail with no user provisioners"
339356 ) ;
340357 assert ! (
341- matches!( result. unwrap_err( ) , error :: Error :: NoUserProvisioner ) ,
358+ matches!( result. unwrap_err( ) , Error :: NoUserProvisioner ) ,
342359 "Should return NoUserProvisioner error"
343360 ) ;
344361 }
362+
363+ #[ test]
364+ fn test_set_hostname_success ( ) {
365+ let mock_config = Config {
366+ hostname_provisioners : HostnameProvisioners {
367+ backends : vec ! [ HostnameProvisioner :: FakeHostnamectl ] ,
368+ } ,
369+ user_provisioners : UserProvisioners {
370+ backends : vec ! [ UserProvisioner :: FakeUseradd ] ,
371+ } ,
372+ password_provisioners : PasswordProvisioners {
373+ backends : vec ! [ PasswordProvisioner :: FakePasswd ] ,
374+ } ,
375+ ..Config :: default ( )
376+ } ;
377+ let p = Provision :: new (
378+ "test-hostname" . to_string ( ) ,
379+ User :: new ( "testuser" , vec ! [ ] ) ,
380+ mock_config,
381+ false ,
382+ ) ;
383+
384+ let result = p. set_hostname ( ) ;
385+ assert ! ( result. is_ok( ) ) ;
386+ }
387+
388+ #[ test]
389+ fn test_set_hostname_failure ( ) {
390+ let mock_config = Config {
391+ hostname_provisioners : HostnameProvisioners { backends : vec ! [ ] } ,
392+ user_provisioners : UserProvisioners {
393+ backends : vec ! [ UserProvisioner :: FakeUseradd ] ,
394+ } ,
395+ password_provisioners : PasswordProvisioners {
396+ backends : vec ! [ PasswordProvisioner :: FakePasswd ] ,
397+ } ,
398+ ..Config :: default ( )
399+ } ;
400+ let p = Provision :: new (
401+ "test-hostname" . to_string ( ) ,
402+ User :: new ( "testuser" , vec ! [ ] ) ,
403+ mock_config,
404+ false ,
405+ ) ;
406+
407+ let result = p. set_hostname ( ) ;
408+ assert ! ( result. is_err( ) ) ;
409+ assert ! ( matches!( result. unwrap_err( ) , Error :: NoHostnameProvisioner ) ) ;
410+ }
345411}
0 commit comments