From 5c8d79d1fa6a6e6f6174558c2d6484683fa37c77 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Thu, 4 Mar 2021 09:16:06 +0200 Subject: feat: configurable image_directory where VM images go by default Also, specification file doesn't need to specify an image file anymore. Instead the image will be named after the VM and put into the image directory named in the configuration. --- src/config.rs | 1 + src/spec.rs | 15 +++++++++++++-- subplot/vmadm.py | 5 +++-- subplot/vmadm.yaml | 2 +- vmadm.md | 8 ++++++-- 5 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/config.rs b/src/config.rs index 9ba4a7f..dd6c2d7 100644 --- a/src/config.rs +++ b/src/config.rs @@ -7,6 +7,7 @@ use std::path::{Path, PathBuf}; #[derive(Default, Debug, Deserialize)] pub struct Configuration { pub default_base_image: Option, + pub image_directory: Option, } #[derive(Debug, thiserror::Error)] diff --git a/src/spec.rs b/src/spec.rs index 0a3d097..8325d98 100644 --- a/src/spec.rs +++ b/src/spec.rs @@ -23,7 +23,7 @@ struct InputSpecification { pub ed25519_host_cert: Option, pub base: Option, - pub image: PathBuf, + pub image: Option, pub image_size_gib: u64, pub memory_mib: u64, pub cpus: u64, @@ -54,6 +54,9 @@ pub enum SpecificationError { #[error("No base image or default base image specified: {0}")] NoBaseImage(PathBuf), + #[error("No image filename and no image directory specified in configuration")] + NoImage, + #[error("Failed to read SSH public key file {0}")] SshKeyRead(PathBuf, #[source] std::io::Error), @@ -85,6 +88,14 @@ impl Specification { return Err(SpecificationError::NoBaseImage(filename.to_path_buf())); }; + let image = if let Some(image) = input.image { + image.to_path_buf() + } else if let Some(dirname) = &config.image_directory { + dirname.join(format!("{}.qcow2", input.name)) + } else { + return Err(SpecificationError::NoImage.into()); + }; + let spec = Specification { name: input.name.clone(), ssh_keys: ssh_keys(&input.ssh_key_files)?, @@ -97,7 +108,7 @@ impl Specification { ed25519_host_key: input.ed25519_host_key, ed25519_host_cert: input.ed25519_host_cert, base, - image: input.image.clone(), + image, image_size_gib: input.image_size_gib, memory_mib: input.memory_mib, cpus: input.cpus, diff --git a/subplot/vmadm.py b/subplot/vmadm.py index 2daa81c..1ee2914 100644 --- a/subplot/vmadm.py +++ b/subplot/vmadm.py @@ -20,6 +20,7 @@ def install_vmadm(ctx): # directories. os.mkdir(".ssh") os.mkdir("expected") + os.mkdir("images") def ensure_base_image(ctx): @@ -35,11 +36,11 @@ def ensure_base_image(ctx): shutil.copy(base, "base.qcow2") -def invoke_cloud_init(ctx, filename=None, dirname=None): +def invoke_cloud_init(ctx, config=None, filename=None, dirname=None): runcmd_run = globals()["runcmd_run"] runcmd_exit_code_is_zero = globals()["runcmd_exit_code_is_zero"] - runcmd_run(ctx, ["vmadm", "cloud-init", filename, dirname]) + runcmd_run(ctx, ["vmadm", "cloud-init", "--config", config, filename, dirname]) runcmd_exit_code_is_zero(ctx) diff --git a/subplot/vmadm.yaml b/subplot/vmadm.yaml index a8810ae..ec7d424 100644 --- a/subplot/vmadm.yaml +++ b/subplot/vmadm.yaml @@ -4,7 +4,7 @@ - given: "a Debian 10 OpenStack cloud image" function: ensure_base_image -- when: "I invoke vmadm cloud-init {filename} {dirname}" +- when: "I invoke vmadm cloud-init --config {config} {filename} {dirname}" function: invoke_cloud_init - when: "I invoke vmadm new {filename}" diff --git a/vmadm.md b/vmadm.md index 8881a0a..1a056ac 100644 --- a/vmadm.md +++ b/vmadm.md @@ -66,10 +66,14 @@ given file init.yaml given file .ssh/id_rsa.pub from init_ssh_key_pub given file expected/meta-data from init-metadata given file expected/user-data from init-userdata -when I invoke vmadm cloud-init init.yaml actual +when I invoke vmadm cloud-init --config config.yaml init.yaml actual then directories actual and expected are identical ~~~ +~~~{#config.yaml .file. yaml} +image_directory: images +--- + ~~~{#init.yaml .file .yaml} name: init-test ssh_key_files: @@ -83,7 +87,7 @@ ecdsa_host_cert: ecdsa-certificate ed25519_host_key: ed25519-private ed25519_host_cert: ed25519-certificate base: /home/liw/tmp/debian-10-openstack-amd64.qcow2 -image: init.qcow2 +image: images/init.qcow2 image_size_gib: 5 memory_mib: 2048 cpus: 1 -- cgit v1.2.1