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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list