diff options
Diffstat (limited to 'src/cloudinit.rs')
-rw-r--r-- | src/cloudinit.rs | 33 |
1 files changed, 25 insertions, 8 deletions
diff --git a/src/cloudinit.rs b/src/cloudinit.rs index 169b13f..e6d2587 100644 --- a/src/cloudinit.rs +++ b/src/cloudinit.rs @@ -13,7 +13,7 @@ use shell_words::quote; use std::default::Default; use std::fs::write; // use std::os::unix::fs::PermissionsExt; -use std::path::Path; +use std::path::{Path, PathBuf}; use std::process::Command; use tempfile::tempdir; @@ -119,8 +119,8 @@ pub enum CloudInitError { KeyError(#[from] KeyError), /// Something went wrong doing I/O. - #[error(transparent)] - IoError(#[from] std::io::Error), + #[error("could not write to {0}: {1}")] + WriteError(PathBuf, #[source] std::io::Error), /// Something went wrong parsing a string as UTF8. #[error(transparent)] @@ -129,6 +129,14 @@ pub enum CloudInitError { /// Something went wrong parsing or serializing to YAML. #[error(transparent)] SerdeError(#[from] serde_yaml::Error), + + /// Could not create a temporary directory. + #[error("couldn't create a temporary directory: {0}")] + TempDirError(#[source] std::io::Error), + + /// Could not execute command. + #[error("couldn't execute {0}: {1}")] + CommandError(String, #[source] std::io::Error), } #[derive(Clone, Debug, Serialize)] @@ -304,11 +312,13 @@ impl CloudInitConfig { pub fn create_dir(&self, path: &Path) -> Result<(), CloudInitError> { let metadata = path.join("meta-data"); debug!("writing metadata to {}", metadata.display()); - write(&metadata, self.metadata()?)?; + write(&metadata, self.metadata()?) + .map_err(|err| CloudInitError::WriteError(metadata, err))?; let userdata = path.join("user-data"); debug!("writing userdata to {}", userdata.display()); - write(&userdata, self.userdata()?)?; + write(&userdata, self.userdata()?) + .map_err(|err| CloudInitError::WriteError(userdata, err))?; // let scriptsdir = path.join("scripts/per-once"); // let script = scriptsdir.join("vmadm-configure-sshd"); @@ -328,10 +338,13 @@ impl CloudInitConfig { /// The image will be attached to the VM when it starts. /// cloud-init finds it via the volume ID (file system label). pub fn create_iso(&self, filename: &Path) -> Result<(), CloudInitError> { - let dir = tempdir()?; + let dir = match tempdir() { + Ok(path) => path, + Err(err) => return Err(CloudInitError::TempDirError(err)), + }; self.create_dir(dir.path())?; - let r = Command::new("genisoimage") + let r = match Command::new("genisoimage") .arg("-quiet") .arg("-volid") .arg("cidata") @@ -340,7 +353,11 @@ impl CloudInitConfig { .arg("-output") .arg(filename) .arg(dir.path()) - .output()?; + .output() + { + Ok(r) => r, + Err(err) => return Err(CloudInitError::CommandError("genisoimage".to_string(), err)), + }; if !r.status.success() { let stderr = String::from_utf8(r.stderr)?; return Err(CloudInitError::IsoFailed(stderr)); |