summaryrefslogtreecommitdiff
path: root/src/cloudinit.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/cloudinit.rs')
-rw-r--r--src/cloudinit.rs33
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));