[Libguestfs] [PATCH nbdkit v3] tmpdisk: Pass any parameters as shell variables to the command.

Eric Blake eblake at redhat.com
Wed Apr 8 13:47:10 UTC 2020


On 4/8/20 4:19 AM, Richard W.M. Jones wrote:
> This allows us to be much more flexible about what commands can be
> used.  It also means we do not need to encode any special behaviour
> for type or label parameters.
> ---
>   plugins/tmpdisk/nbdkit-tmpdisk-plugin.pod | 115 ++++++++++----
>   tests/Makefile.am                         |   2 +
>   plugins/tmpdisk/tmpdisk.c                 | 184 ++++++++++++++++------
>   plugins/tmpdisk/default-command.sh.in     |   6 +
>   tests/test-tmpdisk-command.sh             |  52 ++++++
>   5 files changed, 278 insertions(+), 81 deletions(-)
> 

> +=head2 Serve a fresh operating system to each client
> +
> + nbdkit tmpdisk 16G os=fedora-31 \
> +     command=' virt-builder -o "$disk" --size ${size}b "$os" '
> +
> +=head2 Serve a throwaway snapshot of a base image to each client
> +
> +You could create a base image using L<virt-builder(1)> or a similar
> +tool, and then serve different throwaway snapshots to each client:
> +
> + virt-builder fedora-31 -o /var/tmp/base.img
> + nbdkit tmpdisk size=0 base=/var/tmp/base.img \
> +     command=' cp --sparse=always "$base" "$disk" '
> +

Nice contrast on how to cache the startup costs.


>   
> +/* For block devices, stat->st_size is not the true size. */
> +static int64_t
> +block_device_size (int fd)
> +{
> +  off_t size;
> +
> +  size = lseek (fd, 0, SEEK_END);
> +  if (size == -1) {
> +    nbdkit_error ("lseek: %m");
> +    return -1;
> +  }
> +
> +  return size;
> +}

As you've mentioned elsewhere, we may want to add something in common/ 
that manages common tasks for disk images (size of a block device, 
handling .zero, ...); but for now the duplication is fine.


> +  /* The command could set $disk to a regular file or a block device
> +   * (or a symlink to either), so we must check that here.
> +   */
> +  if (S_ISBLK (statbuf.st_mode)) {
> +    h->size = block_device_size (h->fd);
> +    if (h->size == -1)
> +      goto error;
> +  }
> +  else                          /* Regular file. */
> +    h->size = statbuf.st_size;
> +  nbdkit_debug ("tmpdisk: requested_size = %" PRIi64 ", size = %" PRIi64,
> +                requested_size, h->size);
> +
>     /* We don't need the disk to appear in the filesystem since we hold
>      * a file descriptor and access it through that, so unlink the disk.
>      * This also ensures it is always cleaned up.
>      */
>     unlink (disk);
> +  rmdir (dir);

If the user creates a symlink, we don't remove the original - but that's 
not our problem. I think this works just fine as written.

> +++ b/tests/test-tmpdisk-command.sh

> +source ./functions.sh
> +set -e
> +set -x
> +
> +requires nbdsh -c 'exit (not h.supports_uri ())'
> +
> +# - If multiple parameters appear, last one is used.
> +# - Test quoting.
> +# - size=0 because we ignore it in the command itself.
> +nbdkit -f -v -U - tmpdisk 0 a=2 a=1 b=1024 c="a ' b ' c" \
> +       command='
> +set -x
> +set -e
> +if [ $a -ne 1 ]; then exit 1; fi
> +if [ "$c" != "a '\'' b '\'' c" ]; then exit 1; fi
> +truncate -s $b "$disk"
> +' \
> +       --run '
> +nbdsh -u "$uri" -c "assert h.get_size() == 1024"
> +'

Nice.  LGTM; the patch is now ready to go.

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3226
Virtualization:  qemu.org | libvirt.org




More information about the Libguestfs mailing list