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

Cédric Bosdonnat cbosdonnat at suse.com
Wed Sep 23 07:53:39 UTC 2015


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(-)

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
+
         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




More information about the libvir-list mailing list