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

2015-09-23 Thread Daniel P. Berrange
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.
> +"""
> +   

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

2015-09-23 Thread Cédric Bosdonnat
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, temp