mirror of
https://github.com/retspen/webvirtcloud
synced 2026-03-22 02:24:56 +00:00
lint with black python. convert f style strings to old one.
This commit is contained in:
parent
c20c353a40
commit
c9a2c3d813
18 changed files with 956 additions and 754 deletions
|
|
@ -35,11 +35,11 @@ def validate_ssh_key(key):
|
|||
return False
|
||||
# unpack the contents of data, from data[:4] , property of ssh key .
|
||||
try:
|
||||
str_len = struct.unpack('>I', data[:4])[0]
|
||||
str_len = struct.unpack(">I", data[:4])[0]
|
||||
except struct.error:
|
||||
return False
|
||||
# data[4:str_len] must have string which matches with the typeofkey, another ssh key property.
|
||||
if data[4:4 + str_len] == typeofkey:
|
||||
if data[4 : 4 + str_len] == typeofkey:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
|
@ -47,15 +47,15 @@ def validate_ssh_key(key):
|
|||
|
||||
def send_email_with_otp(user, device):
|
||||
send_mail(
|
||||
_('OTP QR Code'),
|
||||
_('Please view HTML version of this message.'),
|
||||
_("OTP QR Code"),
|
||||
_("Please view HTML version of this message."),
|
||||
None,
|
||||
[user.email],
|
||||
html_message=render_to_string(
|
||||
'accounts/email/otp.html',
|
||||
"accounts/email/otp.html",
|
||||
{
|
||||
'totp_url': device.config_url,
|
||||
'user': user,
|
||||
"totp_url": device.config_url,
|
||||
"user": user,
|
||||
},
|
||||
),
|
||||
fail_silently=False,
|
||||
|
|
|
|||
|
|
@ -23,40 +23,52 @@ def profile(request):
|
|||
|
||||
if profile_form.is_valid():
|
||||
profile_form.save()
|
||||
messages.success(request, _('Profile updated'))
|
||||
return redirect('accounts:profile')
|
||||
messages.success(request, _("Profile updated"))
|
||||
return redirect("accounts:profile")
|
||||
|
||||
return render(request, "profile.html", {
|
||||
'publickeys': publickeys,
|
||||
'profile_form': profile_form,
|
||||
'ssh_key_form': ssh_key_form,
|
||||
})
|
||||
return render(
|
||||
request,
|
||||
"profile.html",
|
||||
{
|
||||
"publickeys": publickeys,
|
||||
"profile_form": profile_form,
|
||||
"ssh_key_form": ssh_key_form,
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
def ssh_key_create(request):
|
||||
key_form = UserSSHKeyForm(request.POST or None, user=request.user)
|
||||
if key_form.is_valid():
|
||||
key_form.save()
|
||||
messages.success(request, _('SSH key added'))
|
||||
return redirect('accounts:profile')
|
||||
messages.success(request, _("SSH key added"))
|
||||
return redirect("accounts:profile")
|
||||
|
||||
return render(request, 'common/form.html', {
|
||||
'form': key_form,
|
||||
'title': _('Add SSH key'),
|
||||
})
|
||||
return render(
|
||||
request,
|
||||
"common/form.html",
|
||||
{
|
||||
"form": key_form,
|
||||
"title": _("Add SSH key"),
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
def ssh_key_delete(request, pk):
|
||||
ssh_key = get_object_or_404(UserSSHKey, pk=pk, user=request.user)
|
||||
if request.method == 'POST':
|
||||
if request.method == "POST":
|
||||
ssh_key.delete()
|
||||
messages.success(request, _('SSH key deleted'))
|
||||
return redirect('accounts:profile')
|
||||
messages.success(request, _("SSH key deleted"))
|
||||
return redirect("accounts:profile")
|
||||
|
||||
return render(request, 'common/confirm_delete.html', {
|
||||
'object': ssh_key,
|
||||
'title': _('Delete SSH key'),
|
||||
})
|
||||
return render(
|
||||
request,
|
||||
"common/confirm_delete.html",
|
||||
{
|
||||
"object": ssh_key,
|
||||
"title": _("Delete SSH key"),
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
@superuser_only
|
||||
|
|
@ -67,13 +79,16 @@ def account(request, user_id):
|
|||
publickeys = UserSSHKey.objects.filter(user_id=user_id)
|
||||
|
||||
return render(
|
||||
request, "account.html", {
|
||||
'user': user,
|
||||
'user_insts': user_insts,
|
||||
'instances': instances,
|
||||
'publickeys': publickeys,
|
||||
'otp_enabled': settings.OTP_ENABLED,
|
||||
})
|
||||
request,
|
||||
"account.html",
|
||||
{
|
||||
"user": user,
|
||||
"user_insts": user_insts,
|
||||
"instances": instances,
|
||||
"publickeys": publickeys,
|
||||
"otp_enabled": settings.OTP_ENABLED,
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
@permission_required("accounts.change_password", raise_exception=True)
|
||||
|
|
@ -118,7 +133,7 @@ def user_instance_update(request, pk):
|
|||
|
||||
return render(
|
||||
request,
|
||||
'common/form.html',
|
||||
"common/form.html",
|
||||
{
|
||||
"form": form,
|
||||
"title": _("Update User Instance"),
|
||||
|
|
@ -150,29 +165,33 @@ def email_otp(request):
|
|||
if form.is_valid():
|
||||
UserModel = get_user_model()
|
||||
try:
|
||||
user = UserModel.objects.get(email=form.cleaned_data['email'])
|
||||
user = UserModel.objects.get(email=form.cleaned_data["email"])
|
||||
except UserModel.DoesNotExist:
|
||||
pass
|
||||
else:
|
||||
device = get_user_totp_device(user)
|
||||
send_email_with_otp(user, device)
|
||||
|
||||
messages.success(request, _('OTP Sent to %s') % form.cleaned_data['email'])
|
||||
return redirect('accounts:login')
|
||||
messages.success(request, _("OTP Sent to %(email)s") % {"email": form.cleaned_data["email"]})
|
||||
return redirect("accounts:login")
|
||||
|
||||
return render(request, 'accounts/email_otp_form.html', {
|
||||
'form': form,
|
||||
'title': _('Email OTP'),
|
||||
})
|
||||
return render(
|
||||
request,
|
||||
"accounts/email_otp_form.html",
|
||||
{
|
||||
"form": form,
|
||||
"title": _("Email OTP"),
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
@superuser_only
|
||||
def admin_email_otp(request, user_id):
|
||||
user = get_object_or_404(get_user_model(), pk=user_id)
|
||||
device = get_user_totp_device(user)
|
||||
if user.email != '':
|
||||
if user.email != "":
|
||||
send_email_with_otp(user, device)
|
||||
messages.success(request, _('OTP QR code was emailed to user %s') % user)
|
||||
messages.success(request, _("OTP QR code was emailed to user %(user)s") % {"user": user})
|
||||
else:
|
||||
messages.error(request, _('User email not set, failed to send QR code'))
|
||||
return redirect('accounts:account', user.id)
|
||||
messages.error(request, _("User email not set, failed to send QR code"))
|
||||
return redirect("accounts:account", user.id)
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@ def group_update(request, pk):
|
|||
form = forms.GroupForm(request.POST or None, instance=group)
|
||||
if form.is_valid():
|
||||
form.save()
|
||||
return redirect('admin:group_list')
|
||||
return redirect("admin:group_list")
|
||||
|
||||
return render(
|
||||
request,
|
||||
|
|
@ -107,11 +107,7 @@ def user_create(request):
|
|||
return render(
|
||||
request,
|
||||
"admin/user_form.html",
|
||||
{
|
||||
"user_form": user_form,
|
||||
"attributes_form": attributes_form,
|
||||
"title": _("Create User")
|
||||
},
|
||||
{"user_form": user_form, "attributes_form": attributes_form, "title": _("Create User")},
|
||||
)
|
||||
|
||||
|
||||
|
|
@ -124,29 +120,25 @@ def user_update(request, pk):
|
|||
if user_form.is_valid() and attributes_form.is_valid():
|
||||
user_form.save()
|
||||
attributes_form.save()
|
||||
next = request.GET.get('next')
|
||||
next = request.GET.get("next")
|
||||
return redirect(next or "admin:user_list")
|
||||
|
||||
return render(
|
||||
request,
|
||||
"admin/user_form.html",
|
||||
{
|
||||
"user_form": user_form,
|
||||
"attributes_form": attributes_form,
|
||||
"title": _("Update User")
|
||||
},
|
||||
{"user_form": user_form, "attributes_form": attributes_form, "title": _("Update User")},
|
||||
)
|
||||
|
||||
|
||||
@superuser_only
|
||||
def user_update_password(request, pk):
|
||||
user = get_object_or_404(User, pk=pk)
|
||||
if request.method == 'POST':
|
||||
if request.method == "POST":
|
||||
form = AdminPasswordChangeForm(user, request.POST)
|
||||
if form.is_valid():
|
||||
user = form.save()
|
||||
update_session_auth_hash(request, user) # Important!
|
||||
messages.success(request, _("User password changed: {}".format(user.username)))
|
||||
messages.success(request, _("Password changed for %(user)s") % {"user": user.username})
|
||||
return redirect("admin:user_list")
|
||||
else:
|
||||
messages.error(request, _("Wrong Data Provided"))
|
||||
|
|
|
|||
|
|
@ -29,13 +29,13 @@ def appsettings(request):
|
|||
# Bootstrap settings related with filesystems, because of that they are excluded from other settings
|
||||
appsettings = AppSettings.objects.exclude(description__startswith="Bootstrap").order_by("name")
|
||||
|
||||
if request.method == 'POST':
|
||||
if 'SASS_DIR' in request.POST:
|
||||
if request.method == "POST":
|
||||
if "SASS_DIR" in request.POST:
|
||||
try:
|
||||
sass_dir.value = request.POST.get("SASS_DIR", "")
|
||||
sass_dir.save()
|
||||
|
||||
msg = _(f"SASS directory path is changed. Now: {sass_dir.value}")
|
||||
msg = _("SASS directory path is changed. Now: %(dir)s") % {"dir": sass_dir.value}
|
||||
messages.success(request, msg)
|
||||
except Exception as err:
|
||||
msg = err
|
||||
|
|
@ -44,7 +44,7 @@ def appsettings(request):
|
|||
addlogmsg(request.user.username, "", msg)
|
||||
return HttpResponseRedirect(request.get_full_path())
|
||||
|
||||
if 'BOOTSTRAP_THEME' in request.POST:
|
||||
if "BOOTSTRAP_THEME" in request.POST:
|
||||
theme = request.POST.get("BOOTSTRAP_THEME", "")
|
||||
scss_var = f"@import '{sass_dir.value}/wvc-theme/{theme}/variables';"
|
||||
scss_bootswatch = f"@import '{sass_dir.value}/wvc-theme/{theme}/bootswatch';"
|
||||
|
|
@ -54,15 +54,17 @@ def appsettings(request):
|
|||
with open(sass_dir.value + "/wvc-main.scss", "w") as main:
|
||||
main.write(scss_var + "\n" + scss_boot + "\n" + scss_bootswatch + "\n")
|
||||
|
||||
css_compressed = sass.compile(string=scss_var + "\n" + scss_boot + "\n" + scss_bootswatch,
|
||||
output_style='compressed')
|
||||
css_compressed = sass.compile(
|
||||
string=scss_var + "\n" + scss_boot + "\n" + scss_bootswatch,
|
||||
output_style="compressed",
|
||||
)
|
||||
with open("static/css/" + main_css, "w") as css:
|
||||
css.write(css_compressed)
|
||||
|
||||
bootstrap_theme.value = theme
|
||||
bootstrap_theme.save()
|
||||
|
||||
msg = _(f"Theme changed. Now: {theme}")
|
||||
msg = _("Theme is changed. Now: %(theme)s") % {"theme": theme}
|
||||
messages.success(request, msg)
|
||||
except Exception as err:
|
||||
msg = err
|
||||
|
|
@ -77,7 +79,7 @@ def appsettings(request):
|
|||
setting.value = request.POST.get(setting.key, "")
|
||||
setting.save()
|
||||
|
||||
msg = _(f"{setting.name} is changed. Now: {setting.value}")
|
||||
msg = _("%(setting)s is changed. Now: %(value)s") % {"setting": setting.name, "value": setting.value}
|
||||
messages.success(request, msg)
|
||||
except Exception as err:
|
||||
msg = err
|
||||
|
|
@ -86,4 +88,4 @@ def appsettings(request):
|
|||
addlogmsg(request.user.username, "", msg)
|
||||
return HttpResponseRedirect(request.get_full_path())
|
||||
|
||||
return render(request, 'appsettings.html', locals())
|
||||
return render(request, "appsettings.html", locals())
|
||||
|
|
|
|||
|
|
@ -9,10 +9,17 @@ from libvirt import libvirtError
|
|||
|
||||
from accounts.models import UserInstance
|
||||
from admin.decorators import superuser_only
|
||||
from computes.forms import (SocketComputeForm, SshComputeForm, TcpComputeForm, TlsComputeForm)
|
||||
from computes.forms import SocketComputeForm, SshComputeForm, TcpComputeForm, TlsComputeForm
|
||||
from computes.models import Compute
|
||||
from instances.models import Instance
|
||||
from vrtManager.connection import (CONN_SOCKET, CONN_SSH, CONN_TCP, CONN_TLS, connection_manager, wvmConnect)
|
||||
from vrtManager.connection import (
|
||||
CONN_SOCKET,
|
||||
CONN_SSH,
|
||||
CONN_TCP,
|
||||
CONN_TLS,
|
||||
connection_manager,
|
||||
wvmConnect,
|
||||
)
|
||||
from vrtManager.hostdetails import wvmHostDetails
|
||||
|
||||
from . import utils
|
||||
|
|
@ -25,15 +32,17 @@ def computes(request):
|
|||
:return:
|
||||
"""
|
||||
|
||||
computes = Compute.objects.filter().order_by('name')
|
||||
computes = Compute.objects.filter().order_by("name")
|
||||
|
||||
return render(request, 'computes/list.html', {'computes': computes})
|
||||
return render(request, "computes/list.html", {"computes": computes})
|
||||
|
||||
|
||||
@superuser_only
|
||||
def overview(request, compute_id):
|
||||
compute = get_object_or_404(Compute, pk=compute_id)
|
||||
status = 'true' if connection_manager.host_is_up(compute.type, compute.hostname) is True else 'false'
|
||||
status = (
|
||||
"true" if connection_manager.host_is_up(compute.type, compute.hostname) is True else "false"
|
||||
)
|
||||
|
||||
conn = wvmHostDetails(
|
||||
compute.hostname,
|
||||
|
|
@ -49,7 +58,7 @@ def overview(request, compute_id):
|
|||
lib_version = conn.get_lib_version()
|
||||
conn.close()
|
||||
|
||||
return render(request, 'overview.html', locals())
|
||||
return render(request, "overview.html", locals())
|
||||
|
||||
|
||||
@superuser_only
|
||||
|
|
@ -57,9 +66,9 @@ def instances(request, compute_id):
|
|||
compute = get_object_or_404(Compute, pk=compute_id)
|
||||
|
||||
utils.refresh_instance_database(compute)
|
||||
instances = Instance.objects.filter(compute=compute).prefetch_related('userinstance_set')
|
||||
instances = Instance.objects.filter(compute=compute).prefetch_related("userinstance_set")
|
||||
|
||||
return render(request, 'computes/instances.html', {'compute': compute, 'instances': instances})
|
||||
return render(request, "computes/instances.html", {"compute": compute, "instances": instances})
|
||||
|
||||
|
||||
@superuser_only
|
||||
|
|
@ -67,9 +76,9 @@ def compute_create(request, FormClass):
|
|||
form = FormClass(request.POST or None)
|
||||
if form.is_valid():
|
||||
form.save()
|
||||
return redirect(reverse('computes'))
|
||||
return redirect(reverse("computes"))
|
||||
|
||||
return render(request, 'computes/form.html', {'form': form})
|
||||
return render(request, "computes/form.html", {"form": form})
|
||||
|
||||
|
||||
@superuser_only
|
||||
|
|
@ -88,22 +97,22 @@ def compute_update(request, compute_id):
|
|||
form = FormClass(request.POST or None, instance=compute)
|
||||
if form.is_valid():
|
||||
form.save()
|
||||
return redirect(reverse('computes'))
|
||||
return redirect(reverse("computes"))
|
||||
|
||||
return render(request, 'computes/form.html', {'form': form})
|
||||
return render(request, "computes/form.html", {"form": form})
|
||||
|
||||
|
||||
@superuser_only
|
||||
def compute_delete(request, compute_id):
|
||||
compute = get_object_or_404(Compute, pk=compute_id)
|
||||
if request.method == 'POST':
|
||||
if request.method == "POST":
|
||||
compute.delete()
|
||||
return redirect('computes')
|
||||
return redirect("computes")
|
||||
|
||||
return render(
|
||||
request,
|
||||
'common/confirm_delete.html',
|
||||
{'object': compute},
|
||||
"common/confirm_delete.html",
|
||||
{"object": compute},
|
||||
)
|
||||
|
||||
|
||||
|
|
@ -126,17 +135,19 @@ def compute_graph(request, compute_id):
|
|||
mem_usage = conn.get_memory_usage()
|
||||
conn.close()
|
||||
except libvirtError:
|
||||
cpu_usage = {'usage': 0}
|
||||
mem_usage = {'usage': 0}
|
||||
cpu_usage = {"usage": 0}
|
||||
mem_usage = {"usage": 0}
|
||||
current_time = 0
|
||||
|
||||
data = json.dumps({
|
||||
'cpudata': cpu_usage['usage'],
|
||||
'memdata': mem_usage,
|
||||
'timeline': current_time,
|
||||
})
|
||||
data = json.dumps(
|
||||
{
|
||||
"cpudata": cpu_usage["usage"],
|
||||
"memdata": mem_usage,
|
||||
"timeline": current_time,
|
||||
}
|
||||
)
|
||||
response = HttpResponse()
|
||||
response['Content-Type'] = "text/javascript"
|
||||
response["Content-Type"] = "text/javascript"
|
||||
response.write(data)
|
||||
return response
|
||||
|
||||
|
|
@ -163,14 +174,14 @@ def get_compute_disk_buses(request, compute_id, arch, machine, disk):
|
|||
disk_device_types = conn.get_disk_device_types(arch, machine)
|
||||
|
||||
if disk in disk_device_types:
|
||||
if disk == 'disk':
|
||||
data['bus'] = sorted(disk_device_types)
|
||||
elif disk == 'cdrom':
|
||||
data['bus'] = ['ide', 'sata', 'scsi']
|
||||
elif disk == 'floppy':
|
||||
data['bus'] = ['fdc']
|
||||
elif disk == 'lun':
|
||||
data['bus'] = ['scsi']
|
||||
if disk == "disk":
|
||||
data["bus"] = sorted(disk_device_types)
|
||||
elif disk == "cdrom":
|
||||
data["bus"] = ["ide", "sata", "scsi"]
|
||||
elif disk == "floppy":
|
||||
data["bus"] = ["fdc"]
|
||||
elif disk == "lun":
|
||||
data["bus"] = ["scsi"]
|
||||
except libvirtError:
|
||||
pass
|
||||
|
||||
|
|
@ -193,7 +204,7 @@ def get_compute_machine_types(request, compute_id, arch):
|
|||
compute.password,
|
||||
compute.type,
|
||||
)
|
||||
data['machines'] = conn.get_machine_types(arch)
|
||||
data["machines"] = conn.get_machine_types(arch)
|
||||
except libvirtError:
|
||||
pass
|
||||
|
||||
|
|
@ -217,7 +228,7 @@ def get_compute_video_models(request, compute_id, arch, machine):
|
|||
compute.password,
|
||||
compute.type,
|
||||
)
|
||||
data['videos'] = conn.get_video_models(arch, machine)
|
||||
data["videos"] = conn.get_video_models(arch, machine)
|
||||
except libvirtError:
|
||||
pass
|
||||
|
||||
|
|
@ -241,8 +252,8 @@ def get_dom_capabilities(request, compute_id, arch, machine):
|
|||
compute.password,
|
||||
compute.type,
|
||||
)
|
||||
data['videos'] = conn.get_disk_device_types(arch, machine)
|
||||
data['bus'] = conn.get_disk_device_types(arch, machine)
|
||||
data["videos"] = conn.get_disk_device_types(arch, machine)
|
||||
data["bus"] = conn.get_disk_device_types(arch, machine)
|
||||
except libvirtError:
|
||||
pass
|
||||
|
||||
|
|
|
|||
|
|
@ -61,7 +61,7 @@ def console(request):
|
|||
if console_type is None:
|
||||
console_error = "Fail to get console. Please check the console configuration of your VM."
|
||||
else:
|
||||
console_error = f"Console type: {console_type} no support"
|
||||
console_error = "Console type '%(type)s' has not support" % {"type": console_type}
|
||||
response = render(request, "console-vnc-lite.html", locals())
|
||||
|
||||
response.set_cookie("token", token)
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ from computes.models import Compute
|
|||
from vrtManager.instance import wvmInstance
|
||||
|
||||
|
||||
OS_VERSIONS = ['latest', '']
|
||||
OS_VERSIONS = ["latest", ""]
|
||||
OS_UUID = "iid-dswebvirtcloud"
|
||||
|
||||
|
||||
|
|
@ -17,7 +17,7 @@ def os_index(request):
|
|||
:param request:
|
||||
:return:
|
||||
"""
|
||||
response = '\n'.join(OS_VERSIONS)
|
||||
response = "\n".join(OS_VERSIONS)
|
||||
return HttpResponse(response)
|
||||
|
||||
|
||||
|
|
@ -28,13 +28,13 @@ def os_metadata_json(request, version):
|
|||
:return:
|
||||
"""
|
||||
|
||||
if version == 'latest':
|
||||
if version == "latest":
|
||||
ip = get_client_ip(request)
|
||||
hostname = get_hostname_by_ip(ip)
|
||||
response = {'uuid': OS_UUID, 'hostname': hostname}
|
||||
response = {"uuid": OS_UUID, "hostname": hostname}
|
||||
return HttpResponse(json.dumps(response))
|
||||
else:
|
||||
err = f"Invalid version: {version}"
|
||||
err = "Invalid version: %(version)s" % {"version": version}
|
||||
raise Http404(err)
|
||||
|
||||
|
||||
|
|
@ -44,10 +44,10 @@ def os_userdata(request, version):
|
|||
:param version:
|
||||
:return:
|
||||
"""
|
||||
if version == 'latest':
|
||||
if version == "latest":
|
||||
ip = get_client_ip(request)
|
||||
hostname = get_hostname_by_ip(ip)
|
||||
vname = hostname.split('.')[0]
|
||||
vname = hostname.split(".")[0]
|
||||
|
||||
instance_keys = []
|
||||
userinstances = UserInstance.objects.filter(instance__name=vname)
|
||||
|
|
@ -57,9 +57,9 @@ def os_userdata(request, version):
|
|||
for k in keys:
|
||||
instance_keys.append(k.keypublic)
|
||||
|
||||
return render(request, 'user_data', locals())
|
||||
return render(request, "user_data", locals())
|
||||
else:
|
||||
err = f"Invalid version: {version}"
|
||||
err = "Invalid version: %(version)s" % {"version": version}
|
||||
raise Http404(err)
|
||||
|
||||
|
||||
|
|
@ -68,11 +68,11 @@ def get_client_ip(request):
|
|||
:param request:
|
||||
:return:
|
||||
"""
|
||||
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
|
||||
x_forwarded_for = request.META.get("HTTP_X_FORWARDED_FOR")
|
||||
if x_forwarded_for:
|
||||
ip = x_forwarded_for.split(',')[-1].strip()
|
||||
ip = x_forwarded_for.split(",")[-1].strip()
|
||||
else:
|
||||
ip = request.META.get('REMOTE_ADDR')
|
||||
ip = request.META.get("REMOTE_ADDR")
|
||||
return ip
|
||||
|
||||
|
||||
|
|
@ -97,16 +97,12 @@ def get_vdi_url(request, compute_id, vname):
|
|||
compute = get_object_or_404(Compute, pk=compute_id)
|
||||
|
||||
try:
|
||||
conn = wvmInstance(compute.hostname,
|
||||
compute.login,
|
||||
compute.password,
|
||||
compute.type,
|
||||
vname)
|
||||
conn = wvmInstance(compute.hostname, compute.login, compute.password, compute.type, vname)
|
||||
|
||||
fqdn = get_hostname_by_ip(compute.hostname)
|
||||
url = f"{conn.get_console_type()}://{fqdn}:{conn.get_console_port()}"
|
||||
response = url
|
||||
return HttpResponse(response)
|
||||
except libvirtError:
|
||||
err = f"Error getting VDI URL for {vname}"
|
||||
err = "Error getting VDI URL for %(name)s" % {"name": vname}
|
||||
raise Http404(err)
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@
|
|||
<div class="tab-content">
|
||||
<div role="tabpanel" class="tab-pane tab-pane-bordered active" id="takesnapshot">
|
||||
{% if instance.status == 5 %}
|
||||
<p>{% trans "This may take more than an hour, depending on how much content is on your droplet and how large the disk is." %}</p>
|
||||
<p>{% trans "This may take more than an hour, depending on how much content is on your instance and how large the disk is." %}</p>
|
||||
<form action="{% url 'instances:snapshot' instance.id %}" class="form-inline" method="post" role="form" aria-label="Create snapshot form">
|
||||
{% csrf_token %}
|
||||
<div class="form-group row">
|
||||
|
|
|
|||
1004
instances/views.py
1004
instances/views.py
File diff suppressed because it is too large
Load diff
|
|
@ -26,19 +26,30 @@ def interfaces(request, compute_id):
|
|||
try:
|
||||
netdevs = conn.get_net_devices()
|
||||
except:
|
||||
netdevs = ['eth0', 'eth1']
|
||||
netdevs = ["eth0", "eth1"]
|
||||
|
||||
for iface in ifaces:
|
||||
ifaces_all.append(conn.get_iface_info(iface))
|
||||
|
||||
if request.method == 'POST':
|
||||
if 'create' in request.POST:
|
||||
if request.method == "POST":
|
||||
if "create" in request.POST:
|
||||
form = AddInterface(request.POST)
|
||||
if form.is_valid():
|
||||
data = form.cleaned_data
|
||||
conn.create_iface(data['name'], data['itype'], data['start_mode'], data['netdev'], data['ipv4_type'],
|
||||
data['ipv4_addr'], data['ipv4_gw'], data['ipv6_type'], data['ipv6_addr'],
|
||||
data['ipv6_gw'], data['stp'], data['delay'])
|
||||
conn.create_iface(
|
||||
data["name"],
|
||||
data["itype"],
|
||||
data["start_mode"],
|
||||
data["netdev"],
|
||||
data["ipv4_type"],
|
||||
data["ipv4_addr"],
|
||||
data["ipv4_gw"],
|
||||
data["ipv6_type"],
|
||||
data["ipv6_addr"],
|
||||
data["ipv6_gw"],
|
||||
data["stp"],
|
||||
data["delay"],
|
||||
)
|
||||
return HttpResponseRedirect(request.get_full_path())
|
||||
else:
|
||||
for msg_err in form.errors.values():
|
||||
|
|
@ -47,7 +58,7 @@ def interfaces(request, compute_id):
|
|||
except libvirtError as lib_err:
|
||||
messages.error(request, lib_err)
|
||||
|
||||
return render(request, 'interfaces.html', locals())
|
||||
return render(request, "interfaces.html", locals())
|
||||
|
||||
|
||||
@superuser_only
|
||||
|
|
@ -75,18 +86,18 @@ def interface(request, compute_id, iface):
|
|||
bridge = conn.get_bridge()
|
||||
slave_ifaces = conn.get_bridge_slave_ifaces()
|
||||
|
||||
if request.method == 'POST':
|
||||
if 'stop' in request.POST:
|
||||
if request.method == "POST":
|
||||
if "stop" in request.POST:
|
||||
conn.stop_iface()
|
||||
return HttpResponseRedirect(request.get_full_path())
|
||||
if 'start' in request.POST:
|
||||
if "start" in request.POST:
|
||||
conn.start_iface()
|
||||
return HttpResponseRedirect(request.get_full_path())
|
||||
if 'delete' in request.POST:
|
||||
if "delete" in request.POST:
|
||||
conn.delete_iface()
|
||||
return HttpResponseRedirect(reverse('interfaces', args=[compute_id]))
|
||||
return HttpResponseRedirect(reverse("interfaces", args=[compute_id]))
|
||||
conn.close()
|
||||
except libvirtError as lib_err:
|
||||
messages.error(request, lib_err)
|
||||
|
||||
return render(request, 'interface.html', locals())
|
||||
return render(request, "interface.html", locals())
|
||||
|
|
|
|||
|
|
@ -30,35 +30,37 @@ def networks(request, compute_id):
|
|||
compute.type,
|
||||
)
|
||||
networks = conn.get_networks_info()
|
||||
dhcp4 = netmask4 = gateway4 = ''
|
||||
dhcp6 = prefix6 = gateway6 = ''
|
||||
dhcp4 = netmask4 = gateway4 = ""
|
||||
dhcp6 = prefix6 = gateway6 = ""
|
||||
ipv4 = ipv6 = False
|
||||
|
||||
if request.method == 'POST':
|
||||
if 'create' in request.POST:
|
||||
if request.method == "POST":
|
||||
if "create" in request.POST:
|
||||
form = AddNetPool(request.POST)
|
||||
if form.is_valid():
|
||||
data = form.cleaned_data
|
||||
if data['name'] in networks:
|
||||
if data["name"] in networks:
|
||||
msg = _("Network pool name already in use")
|
||||
messages.error(request, msg)
|
||||
errors = True
|
||||
if data['forward'] in ['bridge', 'macvtap'] and data['bridge_name'] == '':
|
||||
messages.error(request, _('Please enter bridge/dev name'))
|
||||
if data["forward"] in ["bridge", "macvtap"] and data["bridge_name"] == "":
|
||||
messages.error(request, _("Please enter bridge/dev name"))
|
||||
errors = True
|
||||
if data['subnet']:
|
||||
if data["subnet"]:
|
||||
ipv4 = True
|
||||
gateway4, netmask4, dhcp4 = network_size(data['subnet'], data['dhcp4'])
|
||||
if data['subnet6']:
|
||||
gateway4, netmask4, dhcp4 = network_size(data["subnet"], data["dhcp4"])
|
||||
if data["subnet6"]:
|
||||
ipv6 = True
|
||||
gateway6, prefix6, dhcp6 = network_size(data['subnet6'], data['dhcp6'])
|
||||
if prefix6 != '64':
|
||||
messages.error(request, _('For libvirt, the IPv6 network prefix must be /64'))
|
||||
gateway6, prefix6, dhcp6 = network_size(data["subnet6"], data["dhcp6"])
|
||||
if prefix6 != "64":
|
||||
messages.error(
|
||||
request, _("For libvirt, the IPv6 network prefix must be /64")
|
||||
)
|
||||
errors = True
|
||||
if not errors:
|
||||
conn.create_network(
|
||||
data['name'],
|
||||
data['forward'],
|
||||
data["name"],
|
||||
data["forward"],
|
||||
ipv4,
|
||||
gateway4,
|
||||
netmask4,
|
||||
|
|
@ -67,11 +69,13 @@ def networks(request, compute_id):
|
|||
gateway6,
|
||||
prefix6,
|
||||
dhcp6,
|
||||
data['bridge_name'],
|
||||
data['openvswitch'],
|
||||
data['fixed'],
|
||||
data["bridge_name"],
|
||||
data["openvswitch"],
|
||||
data["fixed"],
|
||||
)
|
||||
return HttpResponseRedirect(
|
||||
reverse("network", args=[compute_id, data["name"]])
|
||||
)
|
||||
return HttpResponseRedirect(reverse('network', args=[compute_id, data['name']]))
|
||||
else:
|
||||
for msg_err in form.errors.values():
|
||||
messages.error(request, msg_err.as_text())
|
||||
|
|
@ -79,7 +83,7 @@ def networks(request, compute_id):
|
|||
except libvirtError as lib_err:
|
||||
messages.error(request, lib_err)
|
||||
|
||||
return render(request, 'networks.html', locals())
|
||||
return render(request, "networks.html", locals())
|
||||
|
||||
|
||||
@superuser_only
|
||||
|
|
@ -128,112 +132,118 @@ def network(request, compute_id, pool):
|
|||
xml = conn._XMLDesc(0)
|
||||
except libvirtError as lib_err:
|
||||
messages.error(request, lib_err)
|
||||
return HttpResponseRedirect(reverse('networks', args=compute_id))
|
||||
return HttpResponseRedirect(reverse("networks", args=compute_id))
|
||||
|
||||
if request.method == 'POST':
|
||||
if 'start' in request.POST:
|
||||
if request.method == "POST":
|
||||
if "start" in request.POST:
|
||||
try:
|
||||
conn.start()
|
||||
return HttpResponseRedirect(request.get_full_path())
|
||||
except libvirtError as lib_err:
|
||||
messages.error(request, lib_err)
|
||||
if 'stop' in request.POST:
|
||||
if "stop" in request.POST:
|
||||
try:
|
||||
conn.stop()
|
||||
return HttpResponseRedirect(request.get_full_path())
|
||||
except libvirtError as lib_err:
|
||||
messages.error(request, lib_err)
|
||||
if 'delete' in request.POST:
|
||||
if "delete" in request.POST:
|
||||
try:
|
||||
conn.delete()
|
||||
return HttpResponseRedirect(reverse('networks', args=[compute_id]))
|
||||
return HttpResponseRedirect(reverse("networks", args=[compute_id]))
|
||||
except libvirtError as lib_err:
|
||||
messages.error(request, lib_err)
|
||||
if 'set_autostart' in request.POST:
|
||||
if "set_autostart" in request.POST:
|
||||
try:
|
||||
conn.set_autostart(1)
|
||||
return HttpResponseRedirect(request.get_full_path())
|
||||
except libvirtError as lib_err:
|
||||
messages.error(request, lib_err)
|
||||
if 'unset_autostart' in request.POST:
|
||||
if "unset_autostart" in request.POST:
|
||||
try:
|
||||
conn.set_autostart(0)
|
||||
return HttpResponseRedirect(request.get_full_path())
|
||||
except libvirtError as lib_err:
|
||||
messages.error(request, lib_err)
|
||||
if 'modify_fixed_address' in request.POST:
|
||||
name = request.POST.get('name', '')
|
||||
address = request.POST.get('address', '')
|
||||
family = request.POST.get('family', 'ipv4')
|
||||
if "modify_fixed_address" in request.POST:
|
||||
name = request.POST.get("name", "")
|
||||
address = request.POST.get("address", "")
|
||||
family = request.POST.get("family", "ipv4")
|
||||
|
||||
if family == 'ipv4':
|
||||
mac_duid = request.POST.get('mac', '')
|
||||
if family == 'ipv6':
|
||||
mac_duid = request.POST.get('id', '')
|
||||
if family == "ipv4":
|
||||
mac_duid = request.POST.get("mac", "")
|
||||
if family == "ipv6":
|
||||
mac_duid = request.POST.get("id", "")
|
||||
|
||||
try:
|
||||
ret_val = conn.modify_fixed_address(name, address, mac_duid, family)
|
||||
messages.success(request, _(f"{family.upper()} Fixed Address Operation Completed."))
|
||||
messages.success(request, _("Fixed address operation completed for %(family)s") % {"family": family.upper()})
|
||||
return HttpResponseRedirect(request.get_full_path())
|
||||
except libvirtError as lib_err:
|
||||
messages.error(request, lib_err)
|
||||
except ValueError as val_err:
|
||||
messages.error(request, val_err)
|
||||
if 'delete_fixed_address' in request.POST:
|
||||
ip = request.POST.get('address', '')
|
||||
family = request.POST.get('family', 'ipv4')
|
||||
if "delete_fixed_address" in request.POST:
|
||||
ip = request.POST.get("address", "")
|
||||
family = request.POST.get("family", "ipv4")
|
||||
conn.delete_fixed_address(ip, family)
|
||||
messages.success(request, _(f"{family.upper()} Fixed Address is Deleted."))
|
||||
messages.success(request, _("%(family)s Fixed Address is Deleted.") % {"family": family.upper()})
|
||||
return HttpResponseRedirect(request.get_full_path())
|
||||
if 'modify_dhcp_range' in request.POST:
|
||||
range_start = request.POST.get('range_start', '')
|
||||
range_end = request.POST.get('range_end', '')
|
||||
family = request.POST.get('family', 'ipv4')
|
||||
if "modify_dhcp_range" in request.POST:
|
||||
range_start = request.POST.get("range_start", "")
|
||||
range_end = request.POST.get("range_end", "")
|
||||
family = request.POST.get("family", "ipv4")
|
||||
try:
|
||||
conn.modify_dhcp_range(range_start, range_end, family)
|
||||
messages.success(request, _(f"{family.upper()} DHCP Range is Changed."))
|
||||
messages.success(request, _("%(family)s DHCP Range is Changed.") % {"family": family.upper()})
|
||||
return HttpResponseRedirect(request.get_full_path())
|
||||
except libvirtError as lib_err:
|
||||
messages.error(request, lib_err)
|
||||
if 'edit_network' in request.POST:
|
||||
edit_xml = request.POST.get('edit_xml', '')
|
||||
if "edit_network" in request.POST:
|
||||
edit_xml = request.POST.get("edit_xml", "")
|
||||
if edit_xml:
|
||||
conn.edit_network(edit_xml)
|
||||
if conn.is_active():
|
||||
messages.success(request, _("Network XML is changed. \\" "Stop and start network to activate new config."))
|
||||
messages.success(
|
||||
request,
|
||||
_(
|
||||
"Network XML is changed. \\"
|
||||
"Stop and start network to activate new config."
|
||||
),
|
||||
)
|
||||
else:
|
||||
messages.success(request, _("Network XML is changed."))
|
||||
return HttpResponseRedirect(request.get_full_path())
|
||||
if 'set_qos' in request.POST:
|
||||
qos_dir = request.POST.get('qos_direction', '')
|
||||
average = request.POST.get('qos_average') or 0
|
||||
peak = request.POST.get('qos_peak') or 0
|
||||
burst = request.POST.get('qos_burst') or 0
|
||||
if "set_qos" in request.POST:
|
||||
qos_dir = request.POST.get("qos_direction", "")
|
||||
average = request.POST.get("qos_average") or 0
|
||||
peak = request.POST.get("qos_peak") or 0
|
||||
burst = request.POST.get("qos_burst") or 0
|
||||
|
||||
try:
|
||||
conn.set_qos(qos_dir, average, peak, burst)
|
||||
if conn.is_active():
|
||||
messages.success(
|
||||
request,
|
||||
_(f"{qos_dir.capitalize()} QoS is set. Network XML is changed.") +
|
||||
_("Stop and start network to activate new config"))
|
||||
_("%(qos_dir)s QoS is updated. Network XML is changed. Stop and start network to activate new config") % {"qos_dir": qos_dir.capitalize()}
|
||||
)
|
||||
else:
|
||||
messages.success(request, _("{} QoS is set").format(qos_dir.capitalize()))
|
||||
messages.success(request, _("%(qos_dir)s QoS is set") % {"qos_dir": qos_dir.capitalize()})
|
||||
except libvirtError as lib_err:
|
||||
messages.error(request, lib_err)
|
||||
return HttpResponseRedirect(request.get_full_path())
|
||||
if 'unset_qos' in request.POST:
|
||||
qos_dir = request.POST.get('qos_direction', '')
|
||||
if "unset_qos" in request.POST:
|
||||
qos_dir = request.POST.get("qos_direction", "")
|
||||
conn.unset_qos(qos_dir)
|
||||
|
||||
if conn.is_active():
|
||||
messages.success(
|
||||
request,
|
||||
_(f"{qos_dir.capitalize()} QoS is deleted. Network XML is changed. ") +
|
||||
_("Stop and start network to activate new config."))
|
||||
_("%(qos_dir)s QoS is deleted. Network XML is changed. Stop and start network to activate new config") % {"qos_dir": qos_dir.capitalize()}
|
||||
)
|
||||
else:
|
||||
messages.success(request, _(f"{qos_dir.capitalize()} QoS is deleted"))
|
||||
messages.success(request, _("%(qos_dir)s QoS is deleted") % {"qos_dir": qos_dir.capitalize()})
|
||||
return HttpResponseRedirect(request.get_full_path())
|
||||
conn.close()
|
||||
|
||||
return render(request, 'network.html', locals())
|
||||
return render(request, "network.html", locals())
|
||||
|
|
|
|||
|
|
@ -25,14 +25,14 @@ def nwfilters(request, compute_id):
|
|||
try:
|
||||
conn = wvmNWFilters(compute.hostname, compute.login, compute.password, compute.type)
|
||||
|
||||
if request.method == 'POST':
|
||||
if 'create_nwfilter' in request.POST:
|
||||
xml = request.POST.get('nwfilter_xml', '')
|
||||
if request.method == "POST":
|
||||
if "create_nwfilter" in request.POST:
|
||||
xml = request.POST.get("nwfilter_xml", "")
|
||||
if xml:
|
||||
try:
|
||||
util.etree.fromstring(xml)
|
||||
name = util.get_xml_path(xml, '/filter/@name')
|
||||
uuid = util.get_xml_path(xml, '/filter/uuid')
|
||||
name = util.get_xml_path(xml, "/filter/@name")
|
||||
uuid = util.get_xml_path(xml, "/filter/uuid")
|
||||
except util.etree.ParseError:
|
||||
name = None
|
||||
|
||||
|
|
@ -45,28 +45,32 @@ def nwfilters(request, compute_id):
|
|||
raise Exception(error_msg)
|
||||
else:
|
||||
try:
|
||||
msg = _("Creating NWFilter: %s" % name)
|
||||
msg = _("%(filter)s network filter is created") % {"filter": name}
|
||||
conn.create_nwfilter(xml)
|
||||
addlogmsg(request.user.username, compute.hostname, msg)
|
||||
except libvirtError as lib_err:
|
||||
messages.error(request, lib_err)
|
||||
addlogmsg(request.user.username, compute.hostname, lib_err)
|
||||
|
||||
if 'del_nwfilter' in request.POST:
|
||||
name = request.POST.get('nwfiltername', '')
|
||||
msg = _(f"Deleting NWFilter: {name}")
|
||||
if "del_nwfilter" in request.POST:
|
||||
name = request.POST.get("nwfiltername", "")
|
||||
msg = _("%(filter)s network filter is deleted") % {"filter": name}
|
||||
in_use = False
|
||||
nwfilter = conn.get_nwfilter(name)
|
||||
|
||||
is_conn = wvmInstances(compute.hostname, compute.login, compute.password, compute.type)
|
||||
is_conn = wvmInstances(
|
||||
compute.hostname, compute.login, compute.password, compute.type
|
||||
)
|
||||
instances = is_conn.get_instances()
|
||||
for inst in instances:
|
||||
i_conn = wvmInstance(compute.hostname, compute.login, compute.password, compute.type, inst)
|
||||
i_conn = wvmInstance(
|
||||
compute.hostname, compute.login, compute.password, compute.type, inst
|
||||
)
|
||||
dom_filterrefs = i_conn.get_filterrefs()
|
||||
|
||||
if name in dom_filterrefs:
|
||||
in_use = True
|
||||
msg = _(f"NWFilter is in use by {inst}. Cannot be deleted.")
|
||||
msg = _("NWFilter is in use by %(instance)s. Cannot be deleted.") % {"instance": inst}
|
||||
messages.error(request, msg)
|
||||
addlogmsg(request.user.username, compute.hostname, msg)
|
||||
i_conn.close()
|
||||
|
|
@ -77,13 +81,13 @@ def nwfilters(request, compute_id):
|
|||
nwfilter.undefine()
|
||||
addlogmsg(request.user.username, compute.hostname, msg)
|
||||
|
||||
if 'cln_nwfilter' in request.POST:
|
||||
if "cln_nwfilter" in request.POST:
|
||||
|
||||
name = request.POST.get('nwfiltername', '')
|
||||
cln_name = request.POST.get('cln_name', name + '-clone')
|
||||
name = request.POST.get("nwfiltername", "")
|
||||
cln_name = request.POST.get("cln_name", name + "-clone")
|
||||
|
||||
conn.clone_nwfilter(name, cln_name)
|
||||
msg = _(f"Cloning NWFilter {name} as {cln_name}")
|
||||
msg = _("Cloning NWFilter %(name)s as %(clone)s") % {"name":name, "clone": cln_name}
|
||||
addlogmsg(request.user.username, compute.hostname, msg)
|
||||
|
||||
for nwf in conn.get_nwfilters():
|
||||
|
|
@ -97,10 +101,14 @@ def nwfilters(request, compute_id):
|
|||
messages.error(request, err)
|
||||
addlogmsg(request.user.username, compute.hostname, err)
|
||||
|
||||
return render(request, 'nwfilters.html', {
|
||||
'nwfilters': nwfilters_all,
|
||||
'compute': compute,
|
||||
})
|
||||
return render(
|
||||
request,
|
||||
"nwfilters.html",
|
||||
{
|
||||
"nwfilters": nwfilters_all,
|
||||
"compute": compute,
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
def nwfilter(request, compute_id, nwfltr):
|
||||
|
|
@ -114,7 +122,9 @@ def nwfilter(request, compute_id, nwfltr):
|
|||
compute = get_object_or_404(Compute, pk=compute_id)
|
||||
|
||||
try:
|
||||
nwfilter = wvmNWFilter(compute.hostname, compute.login, compute.password, compute.type, nwfltr)
|
||||
nwfilter = wvmNWFilter(
|
||||
compute.hostname, compute.login, compute.password, compute.type, nwfltr
|
||||
)
|
||||
conn = wvmNWFilters(compute.hostname, compute.login, compute.password, compute.type)
|
||||
|
||||
for nwf in conn.get_nwfilters():
|
||||
|
|
@ -126,10 +136,10 @@ def nwfilter(request, compute_id, nwfltr):
|
|||
rules = nwfilter.get_rules()
|
||||
refs = nwfilter.get_filter_refs()
|
||||
|
||||
if request.method == 'POST':
|
||||
if request.method == "POST":
|
||||
|
||||
if 'edit_nwfilter' in request.POST:
|
||||
new_xml = request.POST.get('edit_xml', '')
|
||||
if "edit_nwfilter" in request.POST:
|
||||
new_xml = request.POST.get("edit_xml", "")
|
||||
|
||||
if new_xml:
|
||||
nwfilter.delete()
|
||||
|
|
@ -139,10 +149,10 @@ def nwfilter(request, compute_id, nwfltr):
|
|||
conn.create_nwfilter(xml)
|
||||
raise libvirtError(lib_err)
|
||||
|
||||
if 'del_nwfilter_rule' in request.POST:
|
||||
action = request.POST.get('action', '')
|
||||
direction = request.POST.get('direction', '')
|
||||
priority = request.POST.get('priority', '')
|
||||
if "del_nwfilter_rule" in request.POST:
|
||||
action = request.POST.get("action", "")
|
||||
direction = request.POST.get("direction", "")
|
||||
priority = request.POST.get("priority", "")
|
||||
|
||||
new_xml = nwfilter.delete_rule(action, direction, priority)
|
||||
nwfilter.delete()
|
||||
|
|
@ -152,8 +162,8 @@ def nwfilter(request, compute_id, nwfltr):
|
|||
conn.create_nwfilter(xml)
|
||||
raise libvirtError(lib_err)
|
||||
|
||||
if 'del_nwfilter_ref' in request.POST:
|
||||
ref_name = request.POST.get('ref')
|
||||
if "del_nwfilter_ref" in request.POST:
|
||||
ref_name = request.POST.get("ref")
|
||||
new_xml = nwfilter.delete_ref(ref_name)
|
||||
nwfilter.delete()
|
||||
try:
|
||||
|
|
@ -162,8 +172,8 @@ def nwfilter(request, compute_id, nwfltr):
|
|||
conn.create_nwfilter(xml)
|
||||
raise libvirtError(lib_err)
|
||||
|
||||
if 'add_nwfilter_rule' in request.POST:
|
||||
rule_xml = request.POST.get('nwfilterrule_xml', '')
|
||||
if "add_nwfilter_rule" in request.POST:
|
||||
rule_xml = request.POST.get("nwfilterrule_xml", "")
|
||||
if not rule_xml:
|
||||
return HttpResponseRedirect(request.get_full_path())
|
||||
new_xml = nwfilter.add_rule(rule_xml)
|
||||
|
|
@ -174,8 +184,8 @@ def nwfilter(request, compute_id, nwfltr):
|
|||
conn.create_nwfilter(xml)
|
||||
raise libvirtError(lib_err)
|
||||
|
||||
if 'add_nwfilter_ref' in request.POST:
|
||||
ref_name = request.POST.get('nwfilters_select', '')
|
||||
if "add_nwfilter_ref" in request.POST:
|
||||
ref_name = request.POST.get("nwfilters_select", "")
|
||||
if not ref_name:
|
||||
return HttpResponseRedirect(request.get_full_path())
|
||||
new_xml = nwfilter.add_ref(ref_name)
|
||||
|
|
@ -194,4 +204,4 @@ def nwfilter(request, compute_id, nwfltr):
|
|||
except Exception as error_msg:
|
||||
messages.error(request, error_msg)
|
||||
|
||||
return render(request, 'nwfilter.html', locals())
|
||||
return render(request, "nwfilter.html", locals())
|
||||
|
|
|
|||
|
|
@ -5,8 +5,14 @@ from computes.models import Compute
|
|||
from django.contrib import messages
|
||||
from django.http import HttpResponseRedirect
|
||||
from django.shortcuts import get_object_or_404, render
|
||||
from libvirt import (VIR_SECRET_USAGE_TYPE_CEPH, VIR_SECRET_USAGE_TYPE_ISCSI, VIR_SECRET_USAGE_TYPE_NONE,
|
||||
VIR_SECRET_USAGE_TYPE_TLS, VIR_SECRET_USAGE_TYPE_VOLUME, libvirtError)
|
||||
from libvirt import (
|
||||
VIR_SECRET_USAGE_TYPE_CEPH,
|
||||
VIR_SECRET_USAGE_TYPE_ISCSI,
|
||||
VIR_SECRET_USAGE_TYPE_NONE,
|
||||
VIR_SECRET_USAGE_TYPE_TLS,
|
||||
VIR_SECRET_USAGE_TYPE_VOLUME,
|
||||
libvirtError,
|
||||
)
|
||||
from vrtManager.secrets import wvmSecrets
|
||||
|
||||
|
||||
|
|
@ -38,34 +44,36 @@ def secrets(request, compute_id):
|
|||
secrt_value = conn.get_secret_value(uuid)
|
||||
except libvirtError as lib_err:
|
||||
secrt_value = None
|
||||
secrets_all.append({
|
||||
'usage': secrt.usageID(),
|
||||
'uuid': secrt.UUIDString(),
|
||||
'usageType': secret_usage_types[secrt.usageType()],
|
||||
'value': secrt_value
|
||||
})
|
||||
if request.method == 'POST':
|
||||
if 'create' in request.POST:
|
||||
secrets_all.append(
|
||||
{
|
||||
"usage": secrt.usageID(),
|
||||
"uuid": secrt.UUIDString(),
|
||||
"usageType": secret_usage_types[secrt.usageType()],
|
||||
"value": secrt_value,
|
||||
}
|
||||
)
|
||||
if request.method == "POST":
|
||||
if "create" in request.POST:
|
||||
form = AddSecret(request.POST)
|
||||
if form.is_valid():
|
||||
data = form.cleaned_data
|
||||
conn.create_secret(
|
||||
data['ephemeral'],
|
||||
data['private'],
|
||||
data['usage_type'],
|
||||
data['data'],
|
||||
data["ephemeral"],
|
||||
data["private"],
|
||||
data["usage_type"],
|
||||
data["data"],
|
||||
)
|
||||
return HttpResponseRedirect(request.get_full_path())
|
||||
else:
|
||||
for msg_err in form.errors.values():
|
||||
messages.error(request, msg_err.as_text())
|
||||
if 'delete' in request.POST:
|
||||
uuid = request.POST.get('uuid', '')
|
||||
if "delete" in request.POST:
|
||||
uuid = request.POST.get("uuid", "")
|
||||
conn.delete_secret(uuid)
|
||||
return HttpResponseRedirect(request.get_full_path())
|
||||
if 'set_value' in request.POST:
|
||||
uuid = request.POST.get('uuid', '')
|
||||
value = request.POST.get('value', '')
|
||||
if "set_value" in request.POST:
|
||||
uuid = request.POST.get("uuid", "")
|
||||
value = request.POST.get("value", "")
|
||||
try:
|
||||
conn.set_secret_value(uuid, value)
|
||||
except Exception as err:
|
||||
|
|
@ -74,4 +82,4 @@ def secrets(request, compute_id):
|
|||
except libvirtError as err:
|
||||
messages.error(request, err)
|
||||
|
||||
return render(request, 'secrets.html', locals())
|
||||
return render(request, "secrets.html", locals())
|
||||
|
|
|
|||
|
|
@ -31,34 +31,54 @@ def storages(request, compute_id):
|
|||
storages = conn.get_storages_info()
|
||||
secrets = conn.get_secrets()
|
||||
|
||||
if request.method == 'POST':
|
||||
if 'create' in request.POST:
|
||||
if request.method == "POST":
|
||||
if "create" in request.POST:
|
||||
form = AddStgPool(request.POST)
|
||||
if form.is_valid():
|
||||
data = form.cleaned_data
|
||||
if data['name'] in storages:
|
||||
if data["name"] in storages:
|
||||
msg = _("Pool name already use")
|
||||
messages.error(request, msg)
|
||||
errors = True
|
||||
if data['stg_type'] == 'rbd':
|
||||
if not data['secret']:
|
||||
if data["stg_type"] == "rbd":
|
||||
if not data["secret"]:
|
||||
msg = _("You need create secret for pool")
|
||||
messages.error(request, msg)
|
||||
errors = True
|
||||
if not data['ceph_pool'] and not data['ceph_host'] and not data['ceph_user']:
|
||||
if (
|
||||
not data["ceph_pool"]
|
||||
and not data["ceph_host"]
|
||||
and not data["ceph_user"]
|
||||
):
|
||||
msg = _("You need input all fields for creating ceph pool")
|
||||
messages.error(request, msg)
|
||||
errors = True
|
||||
if not errors:
|
||||
if data['stg_type'] == 'rbd':
|
||||
conn.create_storage_ceph(data['stg_type'], data['name'], data['ceph_pool'], data['ceph_host'],
|
||||
data['ceph_user'], data['secret'])
|
||||
elif data['stg_type'] == 'netfs':
|
||||
conn.create_storage_netfs(data['stg_type'], data['name'], data['netfs_host'], data['source'],
|
||||
data['source_format'], data['target'])
|
||||
if data["stg_type"] == "rbd":
|
||||
conn.create_storage_ceph(
|
||||
data["stg_type"],
|
||||
data["name"],
|
||||
data["ceph_pool"],
|
||||
data["ceph_host"],
|
||||
data["ceph_user"],
|
||||
data["secret"],
|
||||
)
|
||||
elif data["stg_type"] == "netfs":
|
||||
conn.create_storage_netfs(
|
||||
data["stg_type"],
|
||||
data["name"],
|
||||
data["netfs_host"],
|
||||
data["source"],
|
||||
data["source_format"],
|
||||
data["target"],
|
||||
)
|
||||
else:
|
||||
conn.create_storage(data['stg_type'], data['name'], data['source'], data['target'])
|
||||
return HttpResponseRedirect(reverse('storage', args=[compute_id, data['name']]))
|
||||
conn.create_storage(
|
||||
data["stg_type"], data["name"], data["source"], data["target"]
|
||||
)
|
||||
return HttpResponseRedirect(
|
||||
reverse("storage", args=[compute_id, data["name"]])
|
||||
)
|
||||
else:
|
||||
for msg_err in form.errors.values():
|
||||
messages.error(request, msg_err.as_text())
|
||||
|
|
@ -66,7 +86,7 @@ def storages(request, compute_id):
|
|||
except libvirtError as lib_err:
|
||||
messages.error(request, lib_err)
|
||||
|
||||
return render(request, 'storages.html', locals())
|
||||
return render(request, "storages.html", locals())
|
||||
|
||||
|
||||
@superuser_only
|
||||
|
|
@ -77,9 +97,10 @@ def storage(request, compute_id, pool):
|
|||
:param pool:
|
||||
:return:
|
||||
"""
|
||||
|
||||
def handle_uploaded_file(path, f_name):
|
||||
target = path + '/' + str(f_name)
|
||||
destination = open(target, 'wb+')
|
||||
target = path + "/" + str(f_name)
|
||||
destination = open(target, "wb+")
|
||||
for chunk in f_name.chunks():
|
||||
destination.write(chunk)
|
||||
destination.close()
|
||||
|
|
@ -93,7 +114,7 @@ def storage(request, compute_id, pool):
|
|||
storages = conn.get_storages()
|
||||
state = conn.is_active()
|
||||
size, free = conn.get_size()
|
||||
used = (size - free)
|
||||
used = size - free
|
||||
if state:
|
||||
percent = (used * 100) // size
|
||||
else:
|
||||
|
|
@ -109,55 +130,57 @@ def storage(request, compute_id, pool):
|
|||
else:
|
||||
volumes = None
|
||||
|
||||
if request.method == 'POST':
|
||||
if 'start' in request.POST:
|
||||
if request.method == "POST":
|
||||
if "start" in request.POST:
|
||||
conn.start()
|
||||
return HttpResponseRedirect(request.get_full_path())
|
||||
if 'stop' in request.POST:
|
||||
if "stop" in request.POST:
|
||||
conn.stop()
|
||||
return HttpResponseRedirect(request.get_full_path())
|
||||
if 'delete' in request.POST:
|
||||
if "delete" in request.POST:
|
||||
conn.delete()
|
||||
return HttpResponseRedirect(reverse('storages', args=[compute_id]))
|
||||
if 'set_autostart' in request.POST:
|
||||
return HttpResponseRedirect(reverse("storages", args=[compute_id]))
|
||||
if "set_autostart" in request.POST:
|
||||
conn.set_autostart(1)
|
||||
return HttpResponseRedirect(request.get_full_path())
|
||||
if 'unset_autostart' in request.POST:
|
||||
if "unset_autostart" in request.POST:
|
||||
conn.set_autostart(0)
|
||||
return HttpResponseRedirect(request.get_full_path())
|
||||
if 'del_volume' in request.POST:
|
||||
volname = request.POST.get('volname', '')
|
||||
if "del_volume" in request.POST:
|
||||
volname = request.POST.get("volname", "")
|
||||
vol = conn.get_volume(volname)
|
||||
vol.delete(0)
|
||||
messages.success(request, _(f"Volume: {volname} is deleted."))
|
||||
return redirect(reverse('storage', args=[compute.id, pool]))
|
||||
messages.success(request, _("Volume: %(volume)s is deleted.") % {"vol": volname})
|
||||
return redirect(reverse("storage", args=[compute.id, pool]))
|
||||
# return HttpResponseRedirect(request.get_full_path())
|
||||
if 'iso_upload' in request.POST:
|
||||
if str(request.FILES['file']) in conn.update_volumes():
|
||||
if "iso_upload" in request.POST:
|
||||
if str(request.FILES["file"]) in conn.update_volumes():
|
||||
error_msg = _("ISO image already exist")
|
||||
messages.error(request, error_msg)
|
||||
else:
|
||||
handle_uploaded_file(path, request.FILES['file'])
|
||||
messages.success(request, _(f"ISO: {request.FILES['file']} is uploaded."))
|
||||
handle_uploaded_file(path, request.FILES["file"])
|
||||
messages.success(request, _("ISO: %(file)s is uploaded.") % {"file": request.FILES['file']})
|
||||
return HttpResponseRedirect(request.get_full_path())
|
||||
if 'cln_volume' in request.POST:
|
||||
if "cln_volume" in request.POST:
|
||||
form = CloneImage(request.POST)
|
||||
if form.is_valid():
|
||||
data = form.cleaned_data
|
||||
img_name = data['name']
|
||||
img_name = data["name"]
|
||||
meta_prealloc = 0
|
||||
if img_name in conn.update_volumes():
|
||||
msg = _("Name of volume already in use")
|
||||
messages.error(request, msg)
|
||||
if data['convert']:
|
||||
format = data['format']
|
||||
if data['meta_prealloc'] and data['format'] == 'qcow2':
|
||||
if data["convert"]:
|
||||
format = data["format"]
|
||||
if data["meta_prealloc"] and data["format"] == "qcow2":
|
||||
meta_prealloc = True
|
||||
else:
|
||||
format = None
|
||||
try:
|
||||
name = conn.clone_volume(data['image'], data['name'], format, meta_prealloc)
|
||||
messages.success(request, _(f"{data['image']} image cloned as {name} successfully"))
|
||||
name = conn.clone_volume(data["image"], data["name"], format, meta_prealloc)
|
||||
messages.success(
|
||||
request, _("%(image)s image cloned as %(clone)s successfully") % {"image": data['image'], "name": name}
|
||||
)
|
||||
return HttpResponseRedirect(request.get_full_path())
|
||||
except libvirtError as lib_err:
|
||||
messages.error(request, lib_err)
|
||||
|
|
@ -167,11 +190,17 @@ def storage(request, compute_id, pool):
|
|||
|
||||
conn.close()
|
||||
|
||||
return render(request, 'storage.html', locals())
|
||||
return render(request, "storage.html", locals())
|
||||
|
||||
|
||||
@superuser_only
|
||||
def create_volume(request, compute_id, pool):
|
||||
"""
|
||||
:param request:
|
||||
:param compute_id: compute id
|
||||
:param pool: pool name
|
||||
:return:
|
||||
"""
|
||||
compute = get_object_or_404(Compute, pk=compute_id)
|
||||
meta_prealloc = False
|
||||
|
||||
|
|
@ -182,26 +211,26 @@ def create_volume(request, compute_id, pool):
|
|||
form = CreateVolumeForm(request.POST or None)
|
||||
if form.is_valid():
|
||||
data = form.cleaned_data
|
||||
if data['meta_prealloc'] and data['format'] == 'qcow2':
|
||||
if data["meta_prealloc"] and data["format"] == "qcow2":
|
||||
meta_prealloc = True
|
||||
|
||||
disk_owner_uid = int(app_settings.INSTANCE_VOLUME_DEFAULT_OWNER_UID)
|
||||
disk_owner_gid = int(app_settings.INSTANCE_VOLUME_DEFAULT_OWNER_GID)
|
||||
|
||||
name = conn.create_volume(
|
||||
data['name'],
|
||||
data['size'],
|
||||
data['format'],
|
||||
data["name"],
|
||||
data["size"],
|
||||
data["format"],
|
||||
meta_prealloc,
|
||||
disk_owner_uid,
|
||||
disk_owner_gid,
|
||||
)
|
||||
messages.success(request, _(f"Image file {name} is created successfully"))
|
||||
messages.success(request, _("Image file %(name)s is created successfully") % {"name":name})
|
||||
else:
|
||||
for msg_err in form.errors.values():
|
||||
messages.error(request, msg_err.as_text())
|
||||
|
||||
return redirect(reverse('storage', args=[compute.id, pool]))
|
||||
return redirect(reverse("storage", args=[compute.id, pool]))
|
||||
|
||||
|
||||
def get_volumes(request, compute_id, pool):
|
||||
|
|
@ -216,7 +245,7 @@ def get_volumes(request, compute_id, pool):
|
|||
try:
|
||||
conn = wvmStorage(compute.hostname, compute.login, compute.password, compute.type, pool)
|
||||
conn.refresh()
|
||||
data['vols'] = sorted(conn.get_volumes())
|
||||
data["vols"] = sorted(conn.get_volumes())
|
||||
except libvirtError:
|
||||
pass
|
||||
return HttpResponse(json.dumps(data))
|
||||
|
|
|
|||
|
|
@ -1380,9 +1380,9 @@ class wvmInstance(wvmConnect):
|
|||
elif net_source_type == 'iface':
|
||||
source.set('dev', net_source)
|
||||
else:
|
||||
raise libvirtError(f"Unknown network type: {net_source_type}")
|
||||
raise libvirtError("Unknown network type: {}".format(net_source_type))
|
||||
else:
|
||||
raise libvirtError(f"Unknown network type: {interface.get('type')}")
|
||||
raise libvirtError("Unknown network type: {}".format(interface.get('type')))
|
||||
|
||||
source = interface.find('model')
|
||||
if net_model != 'default':
|
||||
|
|
|
|||
|
|
@ -363,7 +363,7 @@ class wvmNetwork(wvmConnect):
|
|||
self.leases = self.net.DHCPLeases()
|
||||
except Exception as e:
|
||||
self.leases = []
|
||||
raise f"Error getting {self} DHCP leases: {e}"
|
||||
raise "Error getting {} DHCP leases: {}".format(self, e)
|
||||
|
||||
def get_dhcp_leases(self):
|
||||
if self.leases is None:
|
||||
|
|
|
|||
|
|
@ -163,7 +163,7 @@ def validate_macaddr(val):
|
|||
|
||||
form = re.match("^([0-9a-fA-F]{1,2}:){5}[0-9a-fA-F]{1,2}$", val)
|
||||
if form is None:
|
||||
raise ValueError(f"MAC address must be of the format AA:BB:CC:DD:EE:FF, was {val}")
|
||||
raise ValueError("MAC address must be of the format AA:BB:CC:DD:EE:FF, was {}".format(val))
|
||||
|
||||
|
||||
# Mapping of UEFI binary names to their associated architectures. We
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ class ExceptionMiddleware:
|
|||
if isinstance(exception, libvirtError):
|
||||
messages.error(
|
||||
request,
|
||||
_('libvirt Error - %(exception)s') % {'exception': exception},
|
||||
_("libvirt Error - %(exception)s") % {"exception": exception},
|
||||
)
|
||||
return render(request, '500.html', status=500)
|
||||
# TODO: check connecting to host via VPN
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue