mirror of
https://github.com/retspen/webvirtcloud
synced 2025-07-31 12:41:08 +00:00
Clean header
This commit is contained in:
parent
7dee5b94ac
commit
2ed6ca6518
18 changed files with 33 additions and 37 deletions
0
create/__init__.py
Normal file
0
create/__init__.py
Normal file
3
create/admin.py
Normal file
3
create/admin.py
Normal file
|
@ -0,0 +1,3 @@
|
|||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
55
create/forms.py
Normal file
55
create/forms.py
Normal file
|
@ -0,0 +1,55 @@
|
|||
import re
|
||||
from django import forms
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
from create.models import Flavor
|
||||
|
||||
|
||||
class FlavorAddForm(forms.Form):
|
||||
label = forms.CharField(label="Name",
|
||||
error_messages={'required': _('No flavor name has been entered')},
|
||||
max_length=20)
|
||||
vcpu = forms.IntegerField(label="VCPU",
|
||||
error_messages={'required': _('No VCPU has been entered')}, )
|
||||
disk = forms.IntegerField(label="HDD",
|
||||
error_messages={'required': _('No HDD image has been entered')}, )
|
||||
memory = forms.IntegerField(label="RAM",
|
||||
error_messages={'required': _('No RAM size has been entered')}, )
|
||||
|
||||
def clean_name(self):
|
||||
label = self.cleaned_data['label']
|
||||
have_symbol = re.match('^[a-zA-Z0-9._-]+$', label)
|
||||
if not have_symbol:
|
||||
raise forms.ValidationError(_('The flavor name must not contain any special characters'))
|
||||
elif len(label) > 20:
|
||||
raise forms.ValidationError(_('The flavor name must not exceed 20 characters'))
|
||||
try:
|
||||
Flavor.objects.get(label=label)
|
||||
except Flavor.DoesNotExist:
|
||||
return label
|
||||
raise forms.ValidationError(_('Flavor name is already use'))
|
||||
|
||||
|
||||
class NewVMForm(forms.Form):
|
||||
name = forms.CharField(error_messages={'required': _('No Virtual Machine name has been entered')},
|
||||
max_length=20)
|
||||
vcpu = forms.IntegerField(error_messages={'required': _('No VCPU has been entered')})
|
||||
host_model = forms.BooleanField(required=False)
|
||||
disk = forms.IntegerField(required=False)
|
||||
memory = forms.IntegerField(error_messages={'required': _('No RAM size has been entered')})
|
||||
networks = forms.CharField(error_messages={'required': _('No Network pool has been choice')})
|
||||
storage = forms.CharField(max_length=20, required=False)
|
||||
template = forms.CharField(required=False)
|
||||
images = forms.CharField(required=False)
|
||||
hdd_size = forms.IntegerField(required=False)
|
||||
meta_prealloc = forms.BooleanField(required=False)
|
||||
virtio = forms.BooleanField(required=False)
|
||||
mac = forms.CharField(required=False)
|
||||
|
||||
def clean_name(self):
|
||||
name = self.cleaned_data['name']
|
||||
have_symbol = re.match('^[a-zA-Z0-9._-]+$', name)
|
||||
if not have_symbol:
|
||||
raise forms.ValidationError(_('The name of the virtual machine must not contain any special characters'))
|
||||
elif len(name) > 20:
|
||||
raise forms.ValidationError(_('The name of the virtual machine must not exceed 20 characters'))
|
||||
return name
|
0
create/migrations/__init__.py
Normal file
0
create/migrations/__init__.py
Normal file
11
create/models.py
Normal file
11
create/models.py
Normal file
|
@ -0,0 +1,11 @@
|
|||
from django.db import models
|
||||
|
||||
|
||||
class Flavor(models.Model):
|
||||
label = models.CharField(max_length=12)
|
||||
memory = models.IntegerField()
|
||||
vcpu = models.IntegerField()
|
||||
disk = models.IntegerField()
|
||||
|
||||
def __unicode__(self):
|
||||
return self.name
|
3
create/tests.py
Normal file
3
create/tests.py
Normal file
|
@ -0,0 +1,3 @@
|
|||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
136
create/views.py
Normal file
136
create/views.py
Normal file
|
@ -0,0 +1,136 @@
|
|||
from django.shortcuts import render
|
||||
from django.http import HttpResponseRedirect
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
from django.core.urlresolvers import reverse
|
||||
from computes.models import Compute
|
||||
from create.models import Flavor
|
||||
from create.forms import FlavorAddForm, NewVMForm
|
||||
from instances.models import Instance
|
||||
from vrtManager.create import wvmCreate
|
||||
from vrtManager import util
|
||||
from libvirt import libvirtError
|
||||
|
||||
|
||||
def create_instance(request, host_id):
|
||||
"""
|
||||
:param request:
|
||||
:return:
|
||||
"""
|
||||
|
||||
if not request.user.is_authenticated():
|
||||
return HttpResponseRedirect(reverse('index'))
|
||||
|
||||
conn = None
|
||||
error_messages = []
|
||||
storages = []
|
||||
networks = []
|
||||
meta_prealloc = False
|
||||
compute = Compute.objects.get(id=host_id)
|
||||
flavors = Flavor.objects.filter().order_by('id')
|
||||
|
||||
try:
|
||||
conn = wvmCreate(compute.hostname,
|
||||
compute.login,
|
||||
compute.password,
|
||||
compute.type)
|
||||
|
||||
storages = sorted(conn.get_storages())
|
||||
networks = sorted(conn.get_networks())
|
||||
instances = conn.get_instances()
|
||||
get_images = sorted(conn.get_storages_images())
|
||||
mac_auto = util.randomMAC()
|
||||
except libvirtError as lib_err:
|
||||
error_messages.append(lib_err)
|
||||
|
||||
if conn:
|
||||
if not storages:
|
||||
msg = _("You haven't defined have any storage pools")
|
||||
error_messages.append(msg)
|
||||
if not networks:
|
||||
msg = _("You haven't defined have any network pools")
|
||||
error_messages.append(msg)
|
||||
|
||||
if request.method == 'POST':
|
||||
if 'create_flavor' in request.POST:
|
||||
form = FlavorAddForm(request.POST)
|
||||
if form.is_valid():
|
||||
data = form.cleaned_data
|
||||
create_flavor = Flavor(label=data['label'],
|
||||
vcpu=data['vcpu'],
|
||||
memory=data['memory'],
|
||||
disk=data['disk'])
|
||||
create_flavor.save()
|
||||
return HttpResponseRedirect(request.get_full_path())
|
||||
if 'delete_flavor' in request.POST:
|
||||
flavor_id = request.POST.get('flavor', '')
|
||||
delete_flavor = Flavor.objects.get(id=flavor_id)
|
||||
delete_flavor.delete()
|
||||
return HttpResponseRedirect(request.get_full_path())
|
||||
if 'create_xml' in request.POST:
|
||||
xml = request.POST.get('from_xml', '')
|
||||
try:
|
||||
name = util.get_xml_path(xml, '/domain/name')
|
||||
except util.libxml2.parserError:
|
||||
name = None
|
||||
if name in instances:
|
||||
error_msg = _("A virtual machine with this name already exists")
|
||||
error_messages.append(error_msg)
|
||||
else:
|
||||
try:
|
||||
conn._defineXML(xml)
|
||||
return HttpResponseRedirect(reverse('instance', args=[host_id, name]))
|
||||
except libvirtError as lib_err:
|
||||
error_messages.append(lib_err.message)
|
||||
if 'create' in request.POST:
|
||||
volumes = {}
|
||||
form = NewVMForm(request.POST)
|
||||
if form.is_valid():
|
||||
data = form.cleaned_data
|
||||
if data['meta_prealloc']:
|
||||
meta_prealloc = True
|
||||
if instances:
|
||||
if data['name'] in instances:
|
||||
msg = _("A virtual machine with this name already exists")
|
||||
error_messages.append(msg)
|
||||
if not error_messages:
|
||||
if data['hdd_size']:
|
||||
if not data['mac']:
|
||||
error_msg = _("No Virtual Machine MAC has been entered")
|
||||
error_messages.append(error_msg)
|
||||
else:
|
||||
try:
|
||||
path = conn.create_volume(data['storage'], data['name'], data['hdd_size'],
|
||||
metadata=meta_prealloc)
|
||||
volumes[path] = conn.get_volume_type(path)
|
||||
except libvirtError as lib_err:
|
||||
error_messages.append(lib_err.message)
|
||||
elif data['template']:
|
||||
templ_path = conn.get_volume_path(data['template'])
|
||||
clone_path = conn.clone_from_template(data['name'], templ_path, metadata=meta_prealloc)
|
||||
volumes[clone_path] = conn.get_volume_type(clone_path)
|
||||
else:
|
||||
if not data['images']:
|
||||
error_msg = _("First you need to create or select an image")
|
||||
error_messages.append(error_msg)
|
||||
else:
|
||||
for vol in data['images'].split(','):
|
||||
try:
|
||||
path = conn.get_volume_path(vol)
|
||||
volumes[path] = conn.get_volume_type(path)
|
||||
except libvirtError as lib_err:
|
||||
error_messages.append(lib_err.message)
|
||||
if not error_messages:
|
||||
uuid = util.randomUUID()
|
||||
try:
|
||||
conn.create_instance(data['name'], data['memory'], data['vcpu'], data['host_model'],
|
||||
uuid, volumes, data['networks'], data['virtio'], data['mac'])
|
||||
create_instance = Instance(compute_id=host_id, name=data['name'], uuid=uuid)
|
||||
create_instance.save()
|
||||
return HttpResponseRedirect(reverse('instance', args=[host_id, data['name']]))
|
||||
except libvirtError as lib_err:
|
||||
if data['hdd_size']:
|
||||
conn.delete_volume(volumes.keys()[0])
|
||||
error_messages.append(lib_err)
|
||||
conn.close()
|
||||
|
||||
return render('create.html', locals())
|
Loading…
Add table
Add a link
Reference in a new issue