Merge ~smoser/uvtool:ephemeral-disks into uvtool:master

Proposed by Scott Moser
Status: Merged
Approved by: Robie Basak
Approved revision: 696dbf5af112397b56c7e690b5b75f6b6360e9a8
Merged at revision: 696dbf5af112397b56c7e690b5b75f6b6360e9a8
Proposed branch: ~smoser/uvtool:ephemeral-disks
Merge into: uvtool:master
Diff against target: 107 lines (+37/-3)
2 files modified
man/uvt-kvm.1 (+4/-0)
uvtool/libvirt/kvm.py (+33/-3)
Reviewer Review Type Date Requested Status
Robie Basak Approve
Review via email: mp+322217@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Robie Basak (racb) wrote :

Looks great, assuming it works. Thanks!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/man/uvt-kvm.1 b/man/uvt-kvm.1
2index 4e0b2b6..9db5c33 100644
3--- a/man/uvt-kvm.1
4+++ b/man/uvt-kvm.1
5@@ -344,6 +344,10 @@ Amount of system RAM in megabytes. Default: 512 (MiB).
6 Size of the OS disk in gigabytes. Default: 8 (GiB).
7
8 .TP
9+.BI --ephemeral-disk\ size
10+Add an ephemeral disk of Size gigabytes.
11+
12+.TP
13 .B --unsafe-caching
14 Do not flush guest syncs to the host on the OS disk. This can improve
15 guest I/O performance at the cost of losing data on host power failure.
16diff --git a/uvtool/libvirt/kvm.py b/uvtool/libvirt/kvm.py
17index 5c52252..ac24ad3 100755
18--- a/uvtool/libvirt/kvm.py
19+++ b/uvtool/libvirt/kvm.py
20@@ -29,6 +29,7 @@ import itertools
21 import os
22 import shutil
23 import signal
24+import string
25 import StringIO
26 import subprocess
27 import sys
28@@ -228,6 +229,21 @@ def create_ds_volume(new_volume_name, hostname, user_data_fobj, meta_data_fobj):
29 shutil.rmtree(temp_dir)
30
31
32+def create_new_volume(new_volume_name, size=2):
33+ """Create a new libvirt volume with provided name and size."""
34+
35+ temp_dir = tempfile.mkdtemp(prefix='uvt-kvm-')
36+ try:
37+ fname = os.path.join(temp_dir, 'disk.qcow')
38+ output = subprocess.check_output(
39+ ['qemu-img', 'create', '-f', 'qcow2', fname, "%dG" % size])
40+ with open(fname, 'rb') as f:
41+ return uvtool.libvirt.create_volume_from_fobj(
42+ new_volume_name, f, image_type='qcow2', pool_name=POOL_NAME)
43+ finally:
44+ shutil.rmtree(temp_dir)
45+
46+
47 def create_cow_volume(backing_volume_name, new_volume_name, new_volume_size,
48 conn=None):
49
50@@ -291,7 +307,8 @@ def compose_domain_xml(name, volumes, cpu=1, memory=512, unsafe_caching=False,
51 devices = domain.find('devices')
52
53 etree.strip_elements(devices, 'disk')
54- for disk_device, vol in zip(['vda', 'vdb'], volumes):
55+ for num, vol in enumerate(volumes):
56+ disk_device = "vd%s" % string.ascii_letters[num]
57 disk_format_type = (
58 etree.fromstring(vol.XMLDesc(0)).
59 find('target').
60@@ -359,9 +376,11 @@ def get_base_image(filters):
61 def create(hostname, filters, user_data_fobj, meta_data_fobj, memory=512,
62 cpu=1, disk=2, unsafe_caching=False, template_path=DEFAULT_TEMPLATE,
63 log_console_output=False, bridge=None, backing_image_file=None,
64- start=True, ssh_known_hosts=None):
65+ start=True, ssh_known_hosts=None, ephemeral_disks=None):
66 if backing_image_file is None:
67 base_volume_name = get_base_image(filters)
68+ if ephemeral_disks is None:
69+ ephemeral_disks = []
70 undo_volume_creation = []
71 try:
72 # cow image names must end in ".qcow" so that the current Apparmor
73@@ -383,8 +402,15 @@ def create(hostname, filters, user_data_fobj, meta_data_fobj, memory=512,
74 "%s-ds.qcow" % hostname, hostname, user_data_fobj, meta_data_fobj)
75 undo_volume_creation.append(ds_vol)
76
77+ volumes = [main_vol, ds_vol]
78+ for num, ephem_size in enumerate(ephemeral_disks):
79+ vol = create_new_volume(
80+ "%s-ephem-%02d.qcow" % (hostname, num), ephem_size)
81+ undo_volume_creation.append(vol)
82+ volumes.append(vol)
83+
84 xml = compose_domain_xml(
85- hostname, [main_vol, ds_vol],
86+ hostname, volumes=volumes,
87 bridge=bridge,
88 cpu=cpu,
89 log_console_output=log_console_output,
90@@ -597,6 +623,7 @@ def main_create(parser, args):
91 unsafe_caching=args.unsafe_caching,
92 start=not args.no_start,
93 ssh_known_hosts=ssh_known_hosts,
94+ ephemeral_disks=args.ephemeral_disks,
95 )
96
97
98@@ -723,6 +750,9 @@ def main(args):
99 create_subparser.add_argument('--memory', default=512, type=int)
100 create_subparser.add_argument('--cpu', default=1, type=int)
101 create_subparser.add_argument('--disk', default=8, type=int)
102+ create_subparser.add_argument(
103+ '--ephemeral-disk', action='append', type=int, dest='ephemeral_disks',
104+ help='Add an empty disk of SIZE in GB', metavar='SIZE')
105 create_subparser.add_argument('--bridge')
106 create_subparser.add_argument('--unsafe-caching', action='store_true')
107 create_subparser.add_argument(

Subscribers

People subscribed via source and target branches