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
1=== modified file 'debian/control'
2--- debian/control 2014-02-19 14:10:50 +0000
3+++ debian/control 2014-05-08 18:34:56 +0000
4@@ -9,6 +9,7 @@
5 python-mock,
6 python-libvirt,
7 python-lxml,
8+ python-progressbar,
9 python-pyinotify,
10 python-simplestreams,
11 python-yaml
12@@ -32,6 +33,7 @@
13 python-libvirt,
14 python-simplestreams,
15 python-lxml,
16+ python-progressbar,
17 python-pyinotify,
18 python-yaml,
19 distro-info,
20
21=== modified file 'uvtool/libvirt/__init__.py'
22--- uvtool/libvirt/__init__.py 2014-01-23 17:21:41 +0000
23+++ uvtool/libvirt/__init__.py 2014-05-08 18:34:56 +0000
24@@ -27,9 +27,12 @@
25 import tempfile
26
27 import libvirt
28+
29 from lxml import etree
30 from lxml.builder import E
31
32+from uvtool.utils import copy_progress
33+
34 LIBVIRT_DNSMASQ_LEASE_FILE = '/var/lib/libvirt/dnsmasq/default.leases'
35
36
37@@ -42,14 +45,18 @@
38
39
40 def create_volume_from_fobj(new_volume_name, fobj, image_type='raw',
41- pool_name='default'):
42+ pool_name='default', **extras):
43 """Create a new libvirt volume and populate it from a file-like object."""
44
45 compressed_fobj = tempfile.NamedTemporaryFile()
46 decompressed_fobj = tempfile.NamedTemporaryFile()
47- with contextlib.closing(compressed_fobj):
48+ with contextlib.closing(compressed_fobj) as compressed:
49 with contextlib.closing(decompressed_fobj):
50- shutil.copyfileobj(fobj, compressed_fobj)
51+ if extras.get('progress', False):
52+ copy_progress(fobj, compressed, **extras)
53+ else:
54+ shutil.copyfileobj(fobj, compressed_fobj)
55+
56 compressed_fobj.flush()
57 compressed_fobj.seek(0) # is this necessary?
58 subprocess.check_call(
59@@ -69,7 +76,7 @@
60
61
62 def _create_volume_from_fobj_with_size(new_volume_name, fobj, fobj_size,
63- image_type, pool_name):
64+ image_type, pool_name):
65 conn = libvirt.open('qemu:///system')
66 pool = get_libvirt_pool_object(conn, pool_name)
67
68
69=== modified file 'uvtool/libvirt/simplestreams.py'
70--- uvtool/libvirt/simplestreams.py 2014-02-19 21:45:13 +0000
71+++ uvtool/libvirt/simplestreams.py 2014-05-08 18:34:56 +0000
72@@ -204,13 +204,15 @@
73 query = LibvirtQuery(simplestreams.filters.get_filters(filter_args))
74 query.sync_products(None, src=_load_products())
75 return (_encode_libvirt_pool_name(product_name, version_name)
76- for product_name, version_name in query.result)
77+ for product_name, version_name in query.result)
78+
79
80 class LibvirtMirror(simplestreams.mirrors.BasicMirrorWriter):
81- def __init__(self, filters, verbose=False):
82+ def __init__(self, filters, verbose=False, progress=False):
83 super(LibvirtMirror, self).__init__({'max_items': 1})
84 self.filters = filters
85 self.verbose = verbose
86+ self.progress = progress
87
88 def load_products(self, path=None, content_id=None):
89 return _load_products(path=path, content_id=content_id, clean=True)
90@@ -233,11 +235,13 @@
91 encoded_libvirt_name, pool_name=LIBVIRT_POOL_NAME):
92 uvtool.libvirt.create_volume_from_fobj(
93 encoded_libvirt_name, contentsource, image_type='qcow2',
94- pool_name=LIBVIRT_POOL_NAME
95+ pool_name=LIBVIRT_POOL_NAME,
96+ product_name=product_name,
97+ version_name=version_name,
98+ progress=self.progress)
99+ pool_metadata[encoded_libvirt_name] = (
100+ simplestreams.util.products_exdata(src, pedigree)
101 )
102- pool_metadata[encoded_libvirt_name] = (
103- simplestreams.util.products_exdata(src, pedigree)
104- )
105
106 def remove_version(self, data, src, target, pedigree):
107 product_name, version_name = pedigree
108@@ -265,7 +269,8 @@
109 filter_list = simplestreams.filters.get_filters(
110 ['datatype=image-downloads', 'ftype=disk1.img'] + args.filters
111 )
112- tmirror = LibvirtMirror(filter_list, verbose=args.verbose)
113+ tmirror = LibvirtMirror(filter_list, verbose=args.verbose,
114+ progress=args.progress)
115 tmirror.sync(smirror, initial_path)
116 clean_extraneous_images()
117
118@@ -295,6 +300,10 @@
119 ['dpkg', '--print-architecture']).decode().strip()
120 parser = argparse.ArgumentParser()
121 parser.add_argument('--verbose', '-v', action='store_true')
122+ parser.add_argument('--progress', '-p',
123+ help="Show the image download progress",
124+ action='store_true')
125+
126 subparsers = parser.add_subparsers()
127
128 sync_subparser = subparsers.add_parser('sync')
129@@ -309,7 +318,7 @@
130 default='/usr/share/keyrings/ubuntu-cloudimage-keyring.gpg'
131 )
132 sync_subparser.add_argument('--source', dest='mirror_url',
133- default='https://cloud-images.ubuntu.com/releases/')
134+ default='https://cloud-images.ubuntu.com/releases/')
135 sync_subparser.add_argument('--no-authentication', action='store_true')
136 sync_subparser.add_argument('filters', nargs='*', metavar='filter',
137 default=["arch=%s" % system_arch])
138
139=== added file 'uvtool/utils.py'
140--- uvtool/utils.py 1970-01-01 00:00:00 +0000
141+++ uvtool/utils.py 2014-05-08 18:34:56 +0000
142@@ -0,0 +1,31 @@
143+#!/usr/bin/env python
144+# -*- coding: utf-8 -*-
145+
146+__author__ = 'Jorge Niedbalski R. <jorge.niedbalski@canonical.com>'
147+
148+DEFAULT_CHUNK_SIZE = 1024
149+
150+from progressbar import (
151+ Percentage,
152+ ETA,
153+ FileTransferSpeed,
154+ ProgressBar)
155+
156+
157+def copy_progress(to_download, destination, **extras):
158+ (version_name, product_name) = (extras.get('version_name', ''),
159+ extras.get('product_name', 'Ubuntu'))
160+
161+ widgets = ['Downloading %s:%s ==>' % (product_name, version_name),
162+ Percentage(), ' ',
163+ ' ', ETA(), ' ', FileTransferSpeed()]
164+
165+ to_download.open()
166+ pbar = ProgressBar(widgets=widgets, maxval=to_download.fd.size).start()
167+
168+ readed = 0
169+ for chunk in to_download.read_iterable(size=DEFAULT_CHUNK_SIZE):
170+ readed += DEFAULT_CHUNK_SIZE
171+ pbar.update(readed)
172+ destination.write(chunk)
173+ pbar.finish()

Subscribers

People subscribed via source and target branches