Skip to content

Commit e340289

Browse files
authored
Make set_hostname function available to libazureinit consumers (#247)
1 parent 0b2034f commit e340289

File tree

1 file changed

+80
-14
lines changed
  • libazureinit/src/provision

1 file changed

+80
-14
lines changed

libazureinit/src/provision/mod.rs

Lines changed: 80 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)