[libvirt] [sandbox 09/11] virt-sandbox-image: automatically call download and create if needed

Daniel P. Berrange berrange at redhat.com
Wed Sep 23 08:29:29 UTC 2015


On Wed, Sep 23, 2015 at 09:53:39AM +0200, Cédric Bosdonnat wrote:
> To provide a smooth user experience, run automatically calls create if
> needed and create automatically calls download if needed.
> ---
>  libvirt-sandbox/image/cli.py                       | 18 +++++++++++++++---
>  libvirt-sandbox/image/sources/DockerSource.py      | 16 ++++++++++++++++
>  libvirt-sandbox/image/sources/Source.py            | 22 ++++++++++++++++++++++
>  libvirt-sandbox/image/sources/VirtBuilderSource.py |  7 +++++++
>  4 files changed, 60 insertions(+), 3 deletions(-)

This makes sense, though see my previous suggestion about us merging
downkoad+create into a single prepare step, which would simplify this
even more.

> diff --git a/libvirt-sandbox/image/cli.py b/libvirt-sandbox/image/cli.py
> index fb1104a..f4472d9 100755
> --- a/libvirt-sandbox/image/cli.py
> +++ b/libvirt-sandbox/image/cli.py
> @@ -42,6 +42,7 @@ if os.geteuid() == 0:
>  else:
>      default_template_dir = os.environ['HOME'] + "/.local/share/libvirt/templates"
>      default_image_dir = os.environ['HOME'] + "/.local/share/libvirt/images"
> +default_format = "qcow2"
>  
>  debug = False
>  verbose = False
> @@ -86,10 +87,18 @@ def create(args):
>      try:
>          tmpl = template.Template.from_uri(args.template)
>          source = tmpl.get_source_impl()
> +
> +        if not source.was_downloaded(tmpl, args.template_dir):
> +            download(args)
> +
> +        fmt = default_format
> +        if "format" in vars(args):
> +            fmt = args.format

Lets just kill format from the arguments for now and hardcode
qcow2. We can re-think it later when we actually want to
consider using different storage backends.

> +
>          source.create_template(template=tmpl,
>                                 templatedir=args.template_dir,
>                                 connect=args.connect,
> -                               format=args.format)
> +                               format=fmt)
>      except Exception,e:
>          print "Create Error %s" % str(e)
>  
> @@ -97,10 +106,13 @@ def run(args):
>      try:
>          if args.connect is not None:
>              check_connect(args.connect)
> -
>          tmpl = template.Template.from_uri(args.template)
>          source = tmpl.get_source_impl()
>  
> +        # Create the template image if needed
> +        if not source.has_template(tmpl, args.template_dir):
> +            create(args)
> +
>          name = args.name
>          if name is None:
>              randomid = ''.join(random.choice(string.lowercase) for i in range(10))
> @@ -213,7 +225,7 @@ def gen_create_args(subparser):
>      requires_connect(parser)
>      requires_template_dir(parser)
>      parser.add_argument("-f","--format",
> -                        default="qcow2",
> +                        default=default_format,
>                          help=_("format format for image"))
>      parser.set_defaults(func=create)
>  
> diff --git a/libvirt-sandbox/image/sources/DockerSource.py b/libvirt-sandbox/image/sources/DockerSource.py
> index 41df7a7..be9063d 100644
> --- a/libvirt-sandbox/image/sources/DockerSource.py
> +++ b/libvirt-sandbox/image/sources/DockerSource.py
> @@ -59,6 +59,22 @@ class DockerSource(Source):
>          if  (major == 2 and sys.hexversion < py2_7_9_hexversion) or (major == 3 and sys.hexversion < py3_4_3_hexversion):
>              sys.stderr.write(SSL_WARNING)
>  
> +    def was_downloaded(self, template, templatedir):
> +        try:
> +            self._get_image_list(template, templatedir)
> +            return True
> +        except Exception:
> +            return False
> +
> +
> +    def has_template(self, template, templatedir):
> +        try:
> +            configfile, diskfile = self._get_template_data(template, templatedir)
> +            return os.path.exists(diskfile)
> +        except Exception:
> +            return False
> +
> +
>      def download_template(self, template, templatedir):
>          self._check_cert_validate()
>  
> diff --git a/libvirt-sandbox/image/sources/Source.py b/libvirt-sandbox/image/sources/Source.py
> index 444baa3..e647448 100644
> --- a/libvirt-sandbox/image/sources/Source.py
> +++ b/libvirt-sandbox/image/sources/Source.py
> @@ -35,6 +35,28 @@ class Source():
>          pass
>  
>      @abstractmethod
> +    def was_downloaded(self, template, templatedir):
> +        """
> +        :param template: libvirt_sandbox.template.Template object
> +        :param templatedir: local directory path in which to store the template
> +
> +        Check if a template has already been downloaded.
> +        """
> +        pass
> +
> +
> +    @abstractmethod
> +    def has_template(self, template, templatedir):
> +        """
> +        :param template: libvirt_sandbox.template.Template object
> +        :param templatedir: local directory path in which to store the template
> +
> +        Check if a template has already been created.
> +        """
> +        pass
> +
> +
> +    @abstractmethod
>      def download_template(self, template, templatedir):
>          """
>          :param template: libvirt_sandbox.template.Template object
> diff --git a/libvirt-sandbox/image/sources/VirtBuilderSource.py b/libvirt-sandbox/image/sources/VirtBuilderSource.py
> index 4a7e383..2dde715 100644
> --- a/libvirt-sandbox/image/sources/VirtBuilderSource.py
> +++ b/libvirt-sandbox/image/sources/VirtBuilderSource.py
> @@ -31,6 +31,13 @@ class VirtBuilderSource(Source):
>          # nobody can try to alter the folders structure later.
>          return template.path[1:].replace('/', '_')
>  
> +    def was_downloaded(self, template, templatedir):
> +        return True
> +
> +    def has_template(self, template, templatedir):
> +        imagepath = "%s/%s.qcow2" % (templatedir, template.path)
> +        return os.path.exists(imagepath)
> +
>      def download_template(self, template, templatedir):
>          # We don't do anything here: virt-builder will do it for us in
>          # the create action
> -- 
> 2.1.4
> 
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list

Regards,
Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list