2015-04-02 12:39:40 +00:00
|
|
|
from django.shortcuts import render, get_object_or_404
|
2015-02-27 12:25:41 +00:00
|
|
|
from django.http import HttpResponseRedirect
|
|
|
|
from django.utils.translation import ugettext_lazy as _
|
|
|
|
from django.core.urlresolvers import reverse
|
2015-12-22 14:09:02 +00:00
|
|
|
from django.contrib.auth.decorators import login_required
|
2015-02-27 12:25:41 +00:00
|
|
|
from computes.models import Compute
|
2015-02-27 12:44:44 +00:00
|
|
|
from create.models import Flavor
|
|
|
|
from create.forms import FlavorAddForm, NewVMForm
|
2015-02-27 12:25:41 +00:00
|
|
|
from instances.models import Instance
|
|
|
|
from vrtManager.create import wvmCreate
|
|
|
|
from vrtManager import util
|
|
|
|
from libvirt import libvirtError
|
2018-09-14 13:23:25 +00:00
|
|
|
from webvirtcloud.settings import QEMU_CONSOLE_LISTEN_ADDRESSES
|
|
|
|
from django.contrib import messages
|
2015-02-27 12:25:41 +00:00
|
|
|
|
2015-12-22 14:09:02 +00:00
|
|
|
@login_required
|
2015-03-02 08:52:07 +00:00
|
|
|
def create_instance(request, compute_id):
|
2015-02-27 12:25:41 +00:00
|
|
|
"""
|
|
|
|
:param request:
|
|
|
|
:return:
|
|
|
|
"""
|
|
|
|
|
2015-03-03 09:34:09 +00:00
|
|
|
if not request.user.is_superuser:
|
|
|
|
return HttpResponseRedirect(reverse('index'))
|
|
|
|
|
2015-02-27 12:25:41 +00:00
|
|
|
conn = None
|
|
|
|
error_messages = []
|
|
|
|
storages = []
|
|
|
|
networks = []
|
|
|
|
meta_prealloc = False
|
2018-09-14 13:23:25 +00:00
|
|
|
#computes = Compute.objects.all()
|
2015-04-02 12:39:40 +00:00
|
|
|
compute = get_object_or_404(Compute, pk=compute_id)
|
2015-02-27 12:25:41 +00:00
|
|
|
flavors = Flavor.objects.filter().order_by('id')
|
|
|
|
|
|
|
|
try:
|
|
|
|
conn = wvmCreate(compute.hostname,
|
|
|
|
compute.login,
|
|
|
|
compute.password,
|
|
|
|
compute.type)
|
|
|
|
|
2018-07-20 11:04:13 +00:00
|
|
|
storages = sorted(conn.get_storages(only_actives=True))
|
2015-02-27 12:25:41 +00:00
|
|
|
networks = sorted(conn.get_networks())
|
|
|
|
instances = conn.get_instances()
|
2018-09-14 13:23:25 +00:00
|
|
|
videos = conn.get_video()
|
2016-04-17 21:41:40 +00:00
|
|
|
cache_modes = sorted(conn.get_cache_modes().items())
|
2018-09-14 13:23:25 +00:00
|
|
|
listener_addr = QEMU_CONSOLE_LISTEN_ADDRESSES
|
2015-02-27 12:25:41 +00:00
|
|
|
mac_auto = util.randomMAC()
|
2018-07-20 08:03:01 +00:00
|
|
|
get_images = sorted(conn.get_storages_images())
|
2015-02-27 12:25:41 +00:00
|
|
|
except libvirtError as lib_err:
|
|
|
|
error_messages.append(lib_err)
|
|
|
|
|
|
|
|
if conn:
|
|
|
|
if not storages:
|
2015-05-15 17:54:55 +00:00
|
|
|
msg = _("You haven't defined any storage pools")
|
2015-02-27 12:25:41 +00:00
|
|
|
error_messages.append(msg)
|
|
|
|
if not networks:
|
2015-05-15 17:54:55 +00:00
|
|
|
msg = _("You haven't defined any network pools")
|
2015-02-27 12:25:41 +00:00
|
|
|
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')
|
2018-07-20 11:58:22 +00:00
|
|
|
except util.etree.ParserError:
|
2015-02-27 12:25:41 +00:00
|
|
|
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)
|
2015-03-02 08:52:07 +00:00
|
|
|
return HttpResponseRedirect(reverse('instance', args=[compute_id, name]))
|
2015-02-27 12:25:41 +00:00
|
|
|
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'])
|
2018-09-14 13:23:25 +00:00
|
|
|
dest_vol = conn.get_volume_path(data["name"] + ".img")
|
|
|
|
if dest_vol:
|
|
|
|
error_msg = _("Image has already exist. Please check volumes or change instance name")
|
|
|
|
error_messages.append(error_msg)
|
|
|
|
else:
|
|
|
|
clone_path = conn.clone_from_template(data['name'], templ_path, metadata=meta_prealloc)
|
|
|
|
volumes[clone_path] = conn.get_volume_type(clone_path)
|
2015-02-27 12:25:41 +00:00
|
|
|
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)
|
2016-04-17 21:41:40 +00:00
|
|
|
if data['cache_mode'] not in conn.get_cache_modes():
|
|
|
|
error_msg = _("Invalid cache mode")
|
|
|
|
error_messages.append(error_msg)
|
2015-02-27 12:25:41 +00:00
|
|
|
if not error_messages:
|
|
|
|
uuid = util.randomUUID()
|
|
|
|
try:
|
|
|
|
conn.create_instance(data['name'], data['memory'], data['vcpu'], data['host_model'],
|
2016-04-17 21:41:40 +00:00
|
|
|
uuid, volumes, data['cache_mode'], data['networks'], data['virtio'],
|
2018-09-14 13:23:25 +00:00
|
|
|
data["console_pass"], data["listener_addr"], None, data["video"],
|
2016-04-17 21:41:40 +00:00
|
|
|
data['mac'])
|
2015-03-10 09:15:36 +00:00
|
|
|
create_instance = Instance(compute_id=compute_id, name=data['name'], uuid=uuid)
|
2015-02-27 12:25:41 +00:00
|
|
|
create_instance.save()
|
2018-09-14 13:23:25 +00:00
|
|
|
messages.success(request,"Instance is created.")
|
2015-03-10 09:15:36 +00:00
|
|
|
return HttpResponseRedirect(reverse('instance', args=[compute_id, data['name']]))
|
2015-02-27 12:25:41 +00:00
|
|
|
except libvirtError as lib_err:
|
2018-09-14 13:23:25 +00:00
|
|
|
if data['hdd_size'] or volumes[clone_path]:
|
2015-02-27 12:25:41 +00:00
|
|
|
conn.delete_volume(volumes.keys()[0])
|
|
|
|
error_messages.append(lib_err)
|
|
|
|
conn.close()
|
|
|
|
|
2015-04-02 13:20:46 +00:00
|
|
|
return render(request, 'create_instance.html', locals())
|