mirror of
https://github.com/retspen/webvirtcloud
synced 2025-01-12 08:25:18 +00:00
Add possibility to configure HDD cache mode during instance creation
This commit is contained in:
parent
e1d3be17f1
commit
9520282a4b
4 changed files with 43 additions and 6 deletions
|
@ -40,6 +40,7 @@ class NewVMForm(forms.Form):
|
||||||
storage = forms.CharField(max_length=20, required=False)
|
storage = forms.CharField(max_length=20, required=False)
|
||||||
template = forms.CharField(required=False)
|
template = forms.CharField(required=False)
|
||||||
images = forms.CharField(required=False)
|
images = forms.CharField(required=False)
|
||||||
|
cache_mode = forms.CharField(error_messages={'required': _('Please select HDD cache mode')})
|
||||||
hdd_size = forms.IntegerField(required=False)
|
hdd_size = forms.IntegerField(required=False)
|
||||||
meta_prealloc = forms.BooleanField(required=False)
|
meta_prealloc = forms.BooleanField(required=False)
|
||||||
virtio = forms.BooleanField(required=False)
|
virtio = forms.BooleanField(required=False)
|
||||||
|
|
|
@ -77,6 +77,16 @@
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="col-sm-3 control-label">{% trans "HDD cache mode" %}</label>
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<select id="cache_mode" name="cache_mode" class="form-control">
|
||||||
|
{% for mode, name in cache_modes %}
|
||||||
|
<option value="{{ mode }}">{% trans name %}</option>
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="col-sm-3 control-label">{% trans "Network" %}</label>
|
<label class="col-sm-3 control-label">{% trans "Network" %}</label>
|
||||||
<div class="col-sm-6">
|
<div class="col-sm-6">
|
||||||
|
@ -159,6 +169,16 @@
|
||||||
</div>
|
</div>
|
||||||
<label class="col-lg-1 control-label">{% trans "Image" %}</label>
|
<label class="col-lg-1 control-label">{% trans "Image" %}</label>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="col-sm-3 control-label">{% trans "HDD cache mode" %}</label>
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<select id="cache_mode" name="cache_mode" class="form-control">
|
||||||
|
{% for mode, name in cache_modes %}
|
||||||
|
<option value="{{ mode }}">{% trans name %}</option>
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="col-sm-3 control-label">{% trans "Network" %}</label>
|
<label class="col-sm-3 control-label">{% trans "Network" %}</label>
|
||||||
<div class="col-sm-6">
|
<div class="col-sm-6">
|
||||||
|
|
|
@ -42,6 +42,7 @@ def create_instance(request, compute_id):
|
||||||
networks = sorted(conn.get_networks())
|
networks = sorted(conn.get_networks())
|
||||||
instances = conn.get_instances()
|
instances = conn.get_instances()
|
||||||
get_images = sorted(conn.get_storages_images())
|
get_images = sorted(conn.get_storages_images())
|
||||||
|
cache_modes = sorted(conn.get_cache_modes().items())
|
||||||
mac_auto = util.randomMAC()
|
mac_auto = util.randomMAC()
|
||||||
except libvirtError as lib_err:
|
except libvirtError as lib_err:
|
||||||
error_messages.append(lib_err)
|
error_messages.append(lib_err)
|
||||||
|
@ -123,11 +124,15 @@ def create_instance(request, compute_id):
|
||||||
volumes[path] = conn.get_volume_type(path)
|
volumes[path] = conn.get_volume_type(path)
|
||||||
except libvirtError as lib_err:
|
except libvirtError as lib_err:
|
||||||
error_messages.append(lib_err.message)
|
error_messages.append(lib_err.message)
|
||||||
|
if data['cache_mode'] not in conn.get_cache_modes():
|
||||||
|
error_msg = _("Invalid cache mode")
|
||||||
|
error_messages.append(error_msg)
|
||||||
if not error_messages:
|
if not error_messages:
|
||||||
uuid = util.randomUUID()
|
uuid = util.randomUUID()
|
||||||
try:
|
try:
|
||||||
conn.create_instance(data['name'], data['memory'], data['vcpu'], data['host_model'],
|
conn.create_instance(data['name'], data['memory'], data['vcpu'], data['host_model'],
|
||||||
uuid, volumes, data['networks'], data['virtio'], data['mac'])
|
uuid, volumes, data['cache_mode'], data['networks'], data['virtio'],
|
||||||
|
data['mac'])
|
||||||
create_instance = Instance(compute_id=compute_id, name=data['name'], uuid=uuid)
|
create_instance = Instance(compute_id=compute_id, name=data['name'], uuid=uuid)
|
||||||
create_instance.save()
|
create_instance.save()
|
||||||
return HttpResponseRedirect(reverse('instance', args=[compute_id, data['name']]))
|
return HttpResponseRedirect(reverse('instance', args=[compute_id, data['name']]))
|
||||||
|
|
|
@ -48,6 +48,17 @@ class wvmCreate(wvmConnect):
|
||||||
"""Get guest capabilities"""
|
"""Get guest capabilities"""
|
||||||
return util.get_xml_path(self.get_cap_xml(), "/capabilities/host/cpu/arch")
|
return util.get_xml_path(self.get_cap_xml(), "/capabilities/host/cpu/arch")
|
||||||
|
|
||||||
|
def get_cache_modes(self):
|
||||||
|
"""Get cache available modes"""
|
||||||
|
return {
|
||||||
|
'default': 'Default',
|
||||||
|
'none': 'Disabled',
|
||||||
|
'writethrough': 'Write through',
|
||||||
|
'writeback': 'Write back',
|
||||||
|
'directsync': 'Direct sync', # since libvirt 0.9.5
|
||||||
|
'unsafe': 'Unsafe', # since libvirt 0.9.7
|
||||||
|
}
|
||||||
|
|
||||||
def create_volume(self, storage, name, size, format='qcow2', metadata=False):
|
def create_volume(self, storage, name, size, format='qcow2', metadata=False):
|
||||||
size = int(size) * 1073741824
|
size = int(size) * 1073741824
|
||||||
stg = self.get_storage(storage)
|
stg = self.get_storage(storage)
|
||||||
|
@ -129,7 +140,7 @@ class wvmCreate(wvmConnect):
|
||||||
vol = self.get_volume_by_path(path)
|
vol = self.get_volume_by_path(path)
|
||||||
vol.delete()
|
vol.delete()
|
||||||
|
|
||||||
def create_instance(self, name, memory, vcpu, host_model, uuid, images, networks, virtio, mac=None):
|
def create_instance(self, name, memory, vcpu, host_model, uuid, images, cache_mode, networks, virtio, mac=None):
|
||||||
"""
|
"""
|
||||||
Create VM function
|
Create VM function
|
||||||
"""
|
"""
|
||||||
|
@ -172,11 +183,11 @@ class wvmCreate(wvmConnect):
|
||||||
if stg_type == 'rbd':
|
if stg_type == 'rbd':
|
||||||
ceph_user, secret_uuid, ceph_hosts = get_rbd_storage_data(stg)
|
ceph_user, secret_uuid, ceph_hosts = get_rbd_storage_data(stg)
|
||||||
xml += """<disk type='network' device='disk'>
|
xml += """<disk type='network' device='disk'>
|
||||||
<driver name='qemu' type='%s'/>
|
<driver name='qemu' type='%s' cache='%s'/>
|
||||||
<auth username='%s'>
|
<auth username='%s'>
|
||||||
<secret type='ceph' uuid='%s'/>
|
<secret type='ceph' uuid='%s'/>
|
||||||
</auth>
|
</auth>
|
||||||
<source protocol='rbd' name='%s'>""" % (img_type, ceph_user, secret_uuid, image)
|
<source protocol='rbd' name='%s'>""" % (img_type, cache_mode, ceph_user, secret_uuid, image)
|
||||||
if isinstance(ceph_hosts, list):
|
if isinstance(ceph_hosts, list):
|
||||||
for host in ceph_hosts:
|
for host in ceph_hosts:
|
||||||
if host.get('port'):
|
if host.get('port'):
|
||||||
|
@ -189,8 +200,8 @@ class wvmCreate(wvmConnect):
|
||||||
</source>"""
|
</source>"""
|
||||||
else:
|
else:
|
||||||
xml += """<disk type='file' device='disk'>
|
xml += """<disk type='file' device='disk'>
|
||||||
<driver name='qemu' type='%s'/>
|
<driver name='qemu' type='%s' cache='%s'/>
|
||||||
<source file='%s'/>""" % (img_type, image)
|
<source file='%s'/>""" % (img_type, cache_mode, image)
|
||||||
|
|
||||||
if virtio:
|
if virtio:
|
||||||
xml += """<target dev='vd%s' bus='virtio'/>""" % (disk_letters.pop(0),)
|
xml += """<target dev='vd%s' bus='virtio'/>""" % (disk_letters.pop(0),)
|
||||||
|
|
Loading…
Reference in a new issue