Merge lp:~niedbalski/uvtool/trunk into lp:~uvtool-dev/uvtool/trunk

Proposed by Jorge Niedbalski
Status: Needs review
Proposed branch: lp:~niedbalski/uvtool/trunk
Merge into: lp:~uvtool-dev/uvtool/trunk
Diff against target: 173 lines (+61/-12)
4 files modified
debian/control (+2/-0)
uvtool/libvirt/__init__.py (+11/-4)
uvtool/libvirt/simplestreams.py (+17/-8)
uvtool/utils.py (+31/-0)
To merge this branch: bzr merge lp:~niedbalski/uvtool/trunk
Reviewer Review Type Date Requested Status
uvtool development Pending
Review via email: mp+218861@code.launchpad.net

Description of the change

Added the --progress ( -p ) option to the uvt-simplestreams-libvirt sync command

Displays:

Downloading com.ubuntu.cloud:server:14.04:amd64:20140416.1 ==> 0% ETA: 0:43:58 95.68 kB/s

To post a comment you must log in.

Unmerged revisions

93. By Jorge Niedbalski

- Added the --progress ( -p ) option to the uvt-simplestreams-libvirt sync command

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'debian/control'
--- debian/control 2014-02-19 14:10:50 +0000
+++ debian/control 2014-05-08 18:34:56 +0000
@@ -9,6 +9,7 @@
9 python-mock,9 python-mock,
10 python-libvirt,10 python-libvirt,
11 python-lxml,11 python-lxml,
12 python-progressbar,
12 python-pyinotify,13 python-pyinotify,
13 python-simplestreams,14 python-simplestreams,
14 python-yaml15 python-yaml
@@ -32,6 +33,7 @@
32 python-libvirt,33 python-libvirt,
33 python-simplestreams,34 python-simplestreams,
34 python-lxml,35 python-lxml,
36 python-progressbar,
35 python-pyinotify,37 python-pyinotify,
36 python-yaml,38 python-yaml,
37 distro-info,39 distro-info,
3840
=== modified file 'uvtool/libvirt/__init__.py'
--- uvtool/libvirt/__init__.py 2014-01-23 17:21:41 +0000
+++ uvtool/libvirt/__init__.py 2014-05-08 18:34:56 +0000
@@ -27,9 +27,12 @@
27import tempfile27import tempfile
2828
29import libvirt29import libvirt
30
30from lxml import etree31from lxml import etree
31from lxml.builder import E32from lxml.builder import E
3233
34from uvtool.utils import copy_progress
35
33LIBVIRT_DNSMASQ_LEASE_FILE = '/var/lib/libvirt/dnsmasq/default.leases'36LIBVIRT_DNSMASQ_LEASE_FILE = '/var/lib/libvirt/dnsmasq/default.leases'
3437
3538
@@ -42,14 +45,18 @@
4245
4346
44def create_volume_from_fobj(new_volume_name, fobj, image_type='raw',47def create_volume_from_fobj(new_volume_name, fobj, image_type='raw',
45 pool_name='default'):48 pool_name='default', **extras):
46 """Create a new libvirt volume and populate it from a file-like object."""49 """Create a new libvirt volume and populate it from a file-like object."""
4750
48 compressed_fobj = tempfile.NamedTemporaryFile()51 compressed_fobj = tempfile.NamedTemporaryFile()
49 decompressed_fobj = tempfile.NamedTemporaryFile()52 decompressed_fobj = tempfile.NamedTemporaryFile()
50 with contextlib.closing(compressed_fobj):53 with contextlib.closing(compressed_fobj) as compressed:
51 with contextlib.closing(decompressed_fobj):54 with contextlib.closing(decompressed_fobj):
52 shutil.copyfileobj(fobj, compressed_fobj)55 if extras.get('progress', False):
56 copy_progress(fobj, compressed, **extras)
57 else:
58 shutil.copyfileobj(fobj, compressed_fobj)
59
53 compressed_fobj.flush()60 compressed_fobj.flush()
54 compressed_fobj.seek(0) # is this necessary?61 compressed_fobj.seek(0) # is this necessary?
55 subprocess.check_call(62 subprocess.check_call(
@@ -69,7 +76,7 @@
6976
7077
71def _create_volume_from_fobj_with_size(new_volume_name, fobj, fobj_size,78def _create_volume_from_fobj_with_size(new_volume_name, fobj, fobj_size,
72 image_type, pool_name):79 image_type, pool_name):
73 conn = libvirt.open('qemu:///system')80 conn = libvirt.open('qemu:///system')
74 pool = get_libvirt_pool_object(conn, pool_name)81 pool = get_libvirt_pool_object(conn, pool_name)
7582
7683
=== modified file 'uvtool/libvirt/simplestreams.py'
--- uvtool/libvirt/simplestreams.py 2014-02-19 21:45:13 +0000
+++ uvtool/libvirt/simplestreams.py 2014-05-08 18:34:56 +0000
@@ -204,13 +204,15 @@
204 query = LibvirtQuery(simplestreams.filters.get_filters(filter_args))204 query = LibvirtQuery(simplestreams.filters.get_filters(filter_args))
205 query.sync_products(None, src=_load_products())205 query.sync_products(None, src=_load_products())
206 return (_encode_libvirt_pool_name(product_name, version_name)206 return (_encode_libvirt_pool_name(product_name, version_name)
207 for product_name, version_name in query.result)207 for product_name, version_name in query.result)
208
208209
209class LibvirtMirror(simplestreams.mirrors.BasicMirrorWriter):210class LibvirtMirror(simplestreams.mirrors.BasicMirrorWriter):
210 def __init__(self, filters, verbose=False):211 def __init__(self, filters, verbose=False, progress=False):
211 super(LibvirtMirror, self).__init__({'max_items': 1})212 super(LibvirtMirror, self).__init__({'max_items': 1})
212 self.filters = filters213 self.filters = filters
213 self.verbose = verbose214 self.verbose = verbose
215 self.progress = progress
214216
215 def load_products(self, path=None, content_id=None):217 def load_products(self, path=None, content_id=None):
216 return _load_products(path=path, content_id=content_id, clean=True)218 return _load_products(path=path, content_id=content_id, clean=True)
@@ -233,11 +235,13 @@
233 encoded_libvirt_name, pool_name=LIBVIRT_POOL_NAME):235 encoded_libvirt_name, pool_name=LIBVIRT_POOL_NAME):
234 uvtool.libvirt.create_volume_from_fobj(236 uvtool.libvirt.create_volume_from_fobj(
235 encoded_libvirt_name, contentsource, image_type='qcow2',237 encoded_libvirt_name, contentsource, image_type='qcow2',
236 pool_name=LIBVIRT_POOL_NAME238 pool_name=LIBVIRT_POOL_NAME,
239 product_name=product_name,
240 version_name=version_name,
241 progress=self.progress)
242 pool_metadata[encoded_libvirt_name] = (
243 simplestreams.util.products_exdata(src, pedigree)
237 )244 )
238 pool_metadata[encoded_libvirt_name] = (
239 simplestreams.util.products_exdata(src, pedigree)
240 )
241245
242 def remove_version(self, data, src, target, pedigree):246 def remove_version(self, data, src, target, pedigree):
243 product_name, version_name = pedigree247 product_name, version_name = pedigree
@@ -265,7 +269,8 @@
265 filter_list = simplestreams.filters.get_filters(269 filter_list = simplestreams.filters.get_filters(
266 ['datatype=image-downloads', 'ftype=disk1.img'] + args.filters270 ['datatype=image-downloads', 'ftype=disk1.img'] + args.filters
267 )271 )
268 tmirror = LibvirtMirror(filter_list, verbose=args.verbose)272 tmirror = LibvirtMirror(filter_list, verbose=args.verbose,
273 progress=args.progress)
269 tmirror.sync(smirror, initial_path)274 tmirror.sync(smirror, initial_path)
270 clean_extraneous_images()275 clean_extraneous_images()
271276
@@ -295,6 +300,10 @@
295 ['dpkg', '--print-architecture']).decode().strip()300 ['dpkg', '--print-architecture']).decode().strip()
296 parser = argparse.ArgumentParser()301 parser = argparse.ArgumentParser()
297 parser.add_argument('--verbose', '-v', action='store_true')302 parser.add_argument('--verbose', '-v', action='store_true')
303 parser.add_argument('--progress', '-p',
304 help="Show the image download progress",
305 action='store_true')
306
298 subparsers = parser.add_subparsers()307 subparsers = parser.add_subparsers()
299308
300 sync_subparser = subparsers.add_parser('sync')309 sync_subparser = subparsers.add_parser('sync')
@@ -309,7 +318,7 @@
309 default='/usr/share/keyrings/ubuntu-cloudimage-keyring.gpg'318 default='/usr/share/keyrings/ubuntu-cloudimage-keyring.gpg'
310 )319 )
311 sync_subparser.add_argument('--source', dest='mirror_url',320 sync_subparser.add_argument('--source', dest='mirror_url',
312 default='https://cloud-images.ubuntu.com/releases/')321 default='https://cloud-images.ubuntu.com/releases/')
313 sync_subparser.add_argument('--no-authentication', action='store_true')322 sync_subparser.add_argument('--no-authentication', action='store_true')
314 sync_subparser.add_argument('filters', nargs='*', metavar='filter',323 sync_subparser.add_argument('filters', nargs='*', metavar='filter',
315 default=["arch=%s" % system_arch])324 default=["arch=%s" % system_arch])
316325
=== added file 'uvtool/utils.py'
--- uvtool/utils.py 1970-01-01 00:00:00 +0000
+++ uvtool/utils.py 2014-05-08 18:34:56 +0000
@@ -0,0 +1,31 @@
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3
4__author__ = 'Jorge Niedbalski R. <jorge.niedbalski@canonical.com>'
5
6DEFAULT_CHUNK_SIZE = 1024
7
8from progressbar import (
9 Percentage,
10 ETA,
11 FileTransferSpeed,
12 ProgressBar)
13
14
15def copy_progress(to_download, destination, **extras):
16 (version_name, product_name) = (extras.get('version_name', ''),
17 extras.get('product_name', 'Ubuntu'))
18
19 widgets = ['Downloading %s:%s ==>' % (product_name, version_name),
20 Percentage(), ' ',
21 ' ', ETA(), ' ', FileTransferSpeed()]
22
23 to_download.open()
24 pbar = ProgressBar(widgets=widgets, maxval=to_download.fd.size).start()
25
26 readed = 0
27 for chunk in to_download.read_iterable(size=DEFAULT_CHUNK_SIZE):
28 readed += DEFAULT_CHUNK_SIZE
29 pbar.update(readed)
30 destination.write(chunk)
31 pbar.finish()

Subscribers

People subscribed via source and target branches