From c9a2c3d8136a38e9bb066fd6757dc086fb08c700 Mon Sep 17 00:00:00 2001 From: catborise Date: Wed, 4 Nov 2020 13:31:08 +0300 Subject: [PATCH] lint with black python. convert f style strings to old one. --- accounts/utils.py | 14 +- accounts/views.py | 97 +- admin/views.py | 20 +- appsettings/views.py | 20 +- computes/views.py | 83 +- console/views.py | 2 +- datasource/views.py | 32 +- .../templates/instances/snapshots_tab.html | 2 +- instances/views.py | 1004 +++++++++-------- interfaces/views.py | 37 +- networks/views.py | 136 +-- nwfilters/views.py | 80 +- secrets/views.py | 48 +- storages/views.py | 125 +- vrtManager/instance.py | 4 +- vrtManager/network.py | 2 +- vrtManager/util.py | 2 +- webvirtcloud/middleware.py | 2 +- 18 files changed, 956 insertions(+), 754 deletions(-) diff --git a/accounts/utils.py b/accounts/utils.py index d089ecd..af944ee 100644 --- a/accounts/utils.py +++ b/accounts/utils.py @@ -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, diff --git a/accounts/views.py b/accounts/views.py index fa207bf..8ca3ba7 100644 --- a/accounts/views.py +++ b/accounts/views.py @@ -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) diff --git a/admin/views.py b/admin/views.py index b441d85..c920890 100644 --- a/admin/views.py +++ b/admin/views.py @@ -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")) diff --git a/appsettings/views.py b/appsettings/views.py index 5d9a19c..5446c9a 100644 --- a/appsettings/views.py +++ b/appsettings/views.py @@ -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()) diff --git a/computes/views.py b/computes/views.py index 38514ff..a3ce691 100644 --- a/computes/views.py +++ b/computes/views.py @@ -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 diff --git a/console/views.py b/console/views.py index f5ac707..d12df26 100644 --- a/console/views.py +++ b/console/views.py @@ -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) diff --git a/datasource/views.py b/datasource/views.py index b389122..519f625 100644 --- a/datasource/views.py +++ b/datasource/views.py @@ -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) diff --git a/instances/templates/instances/snapshots_tab.html b/instances/templates/instances/snapshots_tab.html index f920f76..46f6049 100644 --- a/instances/templates/instances/snapshots_tab.html +++ b/instances/templates/instances/snapshots_tab.html @@ -19,7 +19,7 @@
{% if instance.status == 5 %} -

{% trans "This may take more than an hour, depending on how much content is on your droplet and how large the disk is." %}

+

{% trans "This may take more than an hour, depending on how much content is on your instance and how large the disk is." %}

{% csrf_token %}
diff --git a/instances/views.py b/instances/views.py index f1a2221..6b9dbe1 100644 --- a/instances/views.py +++ b/instances/views.py @@ -19,7 +19,7 @@ from django.http import Http404, HttpResponse, JsonResponse from django.shortcuts import get_object_or_404, redirect, render from django.urls import reverse from django.utils.translation import gettext_lazy as _ -from libvirt import (VIR_DOMAIN_UNDEFINE_KEEP_NVRAM, VIR_DOMAIN_UNDEFINE_NVRAM, libvirtError) +from libvirt import VIR_DOMAIN_UNDEFINE_KEEP_NVRAM, VIR_DOMAIN_UNDEFINE_NVRAM, libvirtError from logs.views import addlogmsg from vrtManager import util from vrtManager.create import wvmCreate @@ -37,42 +37,51 @@ from .models import Flavor def index(request): instances = None - computes = Compute.objects.all().order_by("name").prefetch_related('instance_set').prefetch_related( - 'instance_set__userinstance_set') + computes = ( + Compute.objects.all() + .order_by("name") + .prefetch_related("instance_set") + .prefetch_related("instance_set__userinstance_set") + ) for compute in computes: utils.refr(compute) if request.user.is_superuser: - instances = Instance.objects.all().prefetch_related('userinstance_set') + instances = Instance.objects.all().prefetch_related("userinstance_set") else: - instances = Instance.objects.filter(userinstance__user=request.user).prefetch_related('userinstance_set') + instances = Instance.objects.filter(userinstance__user=request.user).prefetch_related( + "userinstance_set" + ) - return render(request, 'allinstances.html', {'computes': computes, 'instances': instances}) + return render(request, "allinstances.html", {"computes": computes, "instances": instances}) def instance(request, pk): instance: Instance = get_instance(request.user, pk) compute: Compute = instance.compute - computes = Compute.objects.all().order_by('name') + computes = Compute.objects.all().order_by("name") computes_count = computes.count() - users = User.objects.all().order_by('username') + users = User.objects.all().order_by("username") publickeys = UserSSHKey.objects.filter(user_id=request.user.id) keymaps = settings.QEMU_KEYMAPS console_types = AppSettings.objects.get(key="QEMU_CONSOLE_DEFAULT_TYPE").choices_as_list() console_form = ConsoleForm( initial={ - 'type': instance.console_type, - 'listen_on': instance.console_listen_address, - 'password': instance.console_passwd, - 'keymap': instance.console_keymap, - }) + "type": instance.console_type, + "listen_on": instance.console_listen_address, + "password": instance.console_passwd, + "keymap": instance.console_keymap, + } + ) console_listen_addresses = settings.QEMU_CONSOLE_LISTEN_ADDRESSES bottom_bar = app_settings.VIEW_INSTANCE_DETAIL_BOTTOM_BAR - allow_admin_or_not_template = request.user.is_superuser or request.user.is_staff or not instance.is_template + allow_admin_or_not_template = ( + request.user.is_superuser or request.user.is_staff or not instance.is_template + ) try: - userinstance = UserInstance.objects.get(instance__compute_id=compute.id, - instance__name=instance.name, - user__id=request.user.id) + userinstance = UserInstance.objects.get( + instance__compute_id=compute.id, instance__name=instance.name, user__id=request.user.id + ) except UserInstance.DoesNotExist: userinstance = None @@ -109,8 +118,10 @@ def instance(request, pk): # addlogmsg(request.user.username, instance.name, msg) # userinstances = UserInstance.objects.filter(instance=instance).order_by('user__username') - userinstances = instance.userinstance_set.order_by('user__username') - allow_admin_or_not_template = request.user.is_superuser or request.user.is_staff or not instance.is_template + userinstances = instance.userinstance_set.order_by("user__username") + allow_admin_or_not_template = ( + request.user.is_superuser or request.user.is_staff or not instance.is_template + ) # Host resources vcpu_host = len(instance.vcpu_range) @@ -121,12 +132,12 @@ def instance(request, pk): storages_host = sorted(instance.proxy.get_storages(True)) net_models_host = instance.proxy.get_network_models() - return render(request, 'instance.html', locals()) + return render(request, "instance.html", locals()) def status(request, pk): instance = get_instance(request.user, pk) - return JsonResponse({'status': instance.proxy.get_status()}) + return JsonResponse({"status": instance.proxy.get_status()}) def stats(request, pk): @@ -142,56 +153,62 @@ def stats(request, pk): current_time = time.strftime("%H:%M:%S") for blk in blk_usage: - json_blk.append({'dev': blk['dev'], 'data': [int(blk['rd']) / 1048576, int(blk['wr']) / 1048576]}) + json_blk.append( + {"dev": blk["dev"], "data": [int(blk["rd"]) / 1048576, int(blk["wr"]) / 1048576]} + ) for net in net_usage: - json_net.append({'dev': net['dev'], 'data': [int(net['rx']) / 1048576, int(net['tx']) / 1048576]}) + json_net.append( + {"dev": net["dev"], "data": [int(net["rx"]) / 1048576, int(net["tx"]) / 1048576]} + ) - return JsonResponse({ - 'cpudata': int(cpu_usage['cpu']), - 'memdata': mem_usage, - 'blkdata': json_blk, - 'netdata': json_net, - 'timeline': current_time, - }) + return JsonResponse( + { + "cpudata": int(cpu_usage["cpu"]), + "memdata": mem_usage, + "blkdata": json_blk, + "netdata": json_net, + "timeline": current_time, + } + ) def guess_mac_address(request, vname): - data = {'vname': vname} + data = {"vname": vname} mac = utils.get_dhcp_mac_address(vname) if not mac: mac = utils.get_random_mac_address() - data['mac'] = mac + data["mac"] = mac return HttpResponse(json.dumps(data)) def random_mac_address(request): data = dict() - data['mac'] = utils.get_random_mac_address() + data["mac"] = utils.get_random_mac_address() return HttpResponse(json.dumps(data)) def guess_clone_name(request): - dhcp_file = '/srv/webvirtcloud/dhcpd.conf' + dhcp_file = "/srv/webvirtcloud/dhcpd.conf" prefix = app_settings.CLONE_INSTANCE_DEFAULT_PREFIX if os.path.isfile(dhcp_file): instance_names = [i.name for i in Instance.objects.filter(name__startswith=prefix)] - with open(dhcp_file, 'r') as f: + with open(dhcp_file, "r") as f: for line in f: line = line.strip() if f"host {prefix}" in line: - fqdn = line.split(' ')[1] - hostname = fqdn.split('.')[0] + fqdn = line.split(" ")[1] + hostname = fqdn.split(".")[0] if hostname.startswith(prefix) and hostname not in instance_names: - return HttpResponse(json.dumps({'name': hostname})) + return HttpResponse(json.dumps({"name": hostname})) return HttpResponse(json.dumps({})) def check_instance(request, vname): instance = Instance.objects.filter(name=vname) - data = {'vname': vname, 'exists': False} + data = {"vname": vname, "exists": False} if instance: - data['exists'] = True + data["exists"] = True return JsonResponse(data) @@ -209,20 +226,20 @@ def sshkeys(request, pk): keys = UserSSHKey.objects.filter(user=ui.user) for k in keys: instance_keys.append(k.keypublic) - if request.GET.get('plain', ''): - response = '\n'.join(instance_keys) - response += '\n' + if request.GET.get("plain", ""): + response = "\n".join(instance_keys) + response += "\n" else: response = json.dumps(instance_keys) return HttpResponse(response) def get_instance(user, pk): - ''' + """ Check that instance is available for user, if not raise 404 - ''' + """ instance = get_object_or_404(Instance, pk=pk) - user_instances = user.userinstance_set.all().values_list('instance', flat=True) + user_instances = user.userinstance_set.all().values_list("instance", flat=True) if user.is_superuser or instance.id in user_instances: return instance @@ -238,7 +255,7 @@ def poweron(request, pk): instance.proxy.start() addlogmsg(request.user.username, instance.name, _("Power On")) - return redirect(request.META.get('HTTP_REFERER')) + return redirect(request.META.get("HTTP_REFERER")) def powercycle(request, pk): @@ -246,7 +263,7 @@ def powercycle(request, pk): instance.proxy.force_shutdown() instance.proxy.start() addlogmsg(request.user.username, instance.name, _("Power Cycle")) - return redirect(request.META.get('HTTP_REFERER')) + return redirect(request.META.get("HTTP_REFERER")) def poweroff(request, pk): @@ -254,7 +271,7 @@ def poweroff(request, pk): instance.proxy.shutdown() addlogmsg(request.user.username, instance.name, _("Power Off")) - return redirect(request.META.get('HTTP_REFERER')) + return redirect(request.META.get("HTTP_REFERER")) @superuser_only @@ -262,7 +279,7 @@ def suspend(request, pk): instance = get_instance(request.user, pk) instance.proxy.suspend() addlogmsg(request.user.username, instance.name, _("Suspend")) - return redirect(request.META.get('HTTP_REFERER')) + return redirect(request.META.get("HTTP_REFERER")) @superuser_only @@ -270,14 +287,14 @@ def resume(request, pk): instance = get_instance(request.user, pk) instance.proxy.resume() addlogmsg(request.user.username, instance.name, _("Resume")) - return redirect(request.META.get('HTTP_REFERER')) + return redirect(request.META.get("HTTP_REFERER")) def force_off(request, pk): instance = get_instance(request.user, pk) instance.proxy.force_shutdown() addlogmsg(request.user.username, instance.name, _("Force Off")) - return redirect(request.META.get('HTTP_REFERER')) + return redirect(request.META.get("HTTP_REFERER")) def destroy(request, pk): @@ -287,31 +304,31 @@ def destroy(request, pk): except: userinstance = UserInstance(is_delete=request.user.is_superuser) - if request.method == 'POST' and userinstance.is_delete: + if request.method == "POST" and userinstance.is_delete: if instance.proxy.get_status() == 1: instance.proxy.force_shutdown() - if request.POST.get('delete_disk', ''): - snapshots = sorted(instance.proxy.get_snapshot(), reverse=True, key=lambda k: k['date']) + if request.POST.get("delete_disk", ""): + snapshots = sorted(instance.proxy.get_snapshot(), reverse=True, key=lambda k: k["date"]) for snapshot in snapshots: - instance.proxy.snapshot_delete(snapshot['name']) + instance.proxy.snapshot_delete(snapshot["name"]) instance.proxy.delete_all_disks() - if request.POST.get('delete_nvram', ''): + if request.POST.get("delete_nvram", ""): instance.proxy.delete(VIR_DOMAIN_UNDEFINE_NVRAM) else: instance.proxy.delete(VIR_DOMAIN_UNDEFINE_KEEP_NVRAM) instance.delete() addlogmsg(request.user, instance.name, _("Destroy")) - return redirect(reverse('instances:index')) + return redirect(reverse("instances:index")) return render( request, - 'instances/destroy_instance_form.html', + "instances/destroy_instance_form.html", { - 'instance': instance, - 'userinstance': userinstance, + "instance": instance, + "userinstance": userinstance, }, ) @@ -320,14 +337,14 @@ def destroy(request, pk): def migrate(request, pk): instance = get_instance(request.user, pk) - compute_id = request.POST.get('compute_id', '') - live = request.POST.get('live_migrate', False) - unsafe = request.POST.get('unsafe_migrate', False) - xml_del = request.POST.get('xml_delete', False) - offline = request.POST.get('offline_migrate', False) - autoconverge = request.POST.get('autoconverge', False) - compress = request.POST.get('compress', False) - postcopy = request.POST.get('postcopy', False) + compute_id = request.POST.get("compute_id", "") + live = request.POST.get("live_migrate", False) + unsafe = request.POST.get("unsafe_migrate", False) + xml_del = request.POST.get("xml_delete", False) + offline = request.POST.get("offline_migrate", False) + autoconverge = request.POST.get("autoconverge", False) + compress = request.POST.get("compress", False) + postcopy = request.POST.get("postcopy", False) new_compute = Compute.objects.get(id=compute_id) @@ -336,20 +353,20 @@ def migrate(request, pk): except libvirtError as err: messages.error(request, err) - msg = _("Migrate to %(hostname)%") % {'hostname': new_compute.hostname} + msg = _("Instance is migrated to %(hostname)s") % {"hostname": new_compute.hostname} addlogmsg(request.user, instance.name, msg) - return redirect(request.META.get('HTTP_REFERER')) + return redirect(request.META.get("HTTP_REFERER")) def set_root_pass(request, pk): instance = get_instance(request.user, pk) - if request.method == 'POST': - passwd = request.POST.get('passwd', None) + if request.method == "POST": + passwd = request.POST.get("passwd", None) if passwd: - passwd_hash = crypt.crypt(passwd, '$6$kgPoiREy') - data = {'action': 'password', 'passwd': passwd_hash, 'vname': instance.name} + passwd_hash = crypt.crypt(passwd, "$6$kgPoiREy") + data = {"action": "password", "passwd": passwd_hash, "vname": instance.name} if instance.proxy.get_status() == 5: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) @@ -358,24 +375,24 @@ def set_root_pass(request, pk): d = s.recv(1024).strip() result = json.loads(d) s.close() - if result['return'] == 'success': + if result["return"] == "success": msg = _("Reset root password") addlogmsg(request.user.username, instance.name, msg) messages.success(request, msg) else: - messages.error(request, result['message']) + messages.error(request, result["message"]) else: msg = _("Please shutdown down your instance and then try again") messages.error(request, msg) - return redirect(reverse('instances:instance', args=[instance.id]) + '#access') + return redirect(reverse("instances:instance", args=[instance.id]) + "#access") def add_public_key(request, pk): instance = get_instance(request.user, pk) - if request.method == 'POST': - sshkeyid = request.POST.get('sshkeyid', '') + if request.method == "POST": + sshkeyid = request.POST.get("sshkeyid", "") publickey = UserSSHKey.objects.get(id=sshkeyid) - data = {'action': 'publickey', 'key': publickey.keypublic, 'vname': instance.name} + data = {"action": "publickey", "key": publickey.keypublic, "vname": instance.name} if instance.proxy.get_status() == 5: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) @@ -383,20 +400,20 @@ def add_public_key(request, pk): s.send(json.dumps(data).encode()) result = json.loads(s.recv(1024)) s.close() - if result['return'] == 'error': - msg = result['message'] + if result["return"] == "error": + msg = result["message"] else: - msg = _("Installed new SSH public key %(keyname)s") % {'keyname': publickey.keyname} + msg = _("Installed new SSH public key %(keyname)s") % {"keyname": publickey.keyname} addlogmsg(request.user.username, instance.name, msg) - if result['return'] == 'success': + if result["return"] == "success": messages.success(request, msg) else: messages.error(request, msg) else: msg = _("Please shutdown down your instance and then try again") messages.error(request, msg) - return redirect(reverse('instances:instance', args=[instance.id]) + '#access') + return redirect(reverse("instances:instance", args=[instance.id]) + "#access") def resizevm_cpu(request, pk): @@ -406,26 +423,25 @@ def resizevm_cpu(request, pk): except: userinstance = UserInstance(is_change=False) vcpu = instance.proxy.get_vcpu() - if request.method == 'POST': + if request.method == "POST": if request.user.is_superuser or request.user.is_staff or userinstance.is_change: - new_vcpu = request.POST.get('vcpu', '') - new_cur_vcpu = request.POST.get('cur_vcpu', '') + new_vcpu = request.POST.get("vcpu", "") + new_cur_vcpu = request.POST.get("cur_vcpu", "") quota_msg = utils.check_user_quota(request.user, 0, int(new_vcpu) - vcpu, 0, 0) if not request.user.is_superuser and quota_msg: - msg = _("User %(quota_msg)s quota reached, cannot resize CPU of '%(instance_name)s'!") % { - 'quota_msg': quota_msg, - 'instance_name': instance.name - } + msg = _( + "User %(quota_msg)s quota reached, cannot resize CPU of '%(instance_name)s'!" + ) % {"quota_msg": quota_msg, "instance_name": instance.name} messages.error(request, msg) else: cur_vcpu = new_cur_vcpu vcpu = new_vcpu instance.proxy.resize_cpu(cur_vcpu, vcpu) - msg = _("Resize CPU") + msg = _("CPU is resized: %(old)s to %(new)s") % {"old": cur_vcpu,"new": vcpu} addlogmsg(request.user.username, instance.name, msg) messages.success(request, msg) - return redirect(reverse('instances:instance', args=[instance.id]) + '#resize') + return redirect(reverse("instances:instance", args=[instance.id]) + "#resize") def resize_memory(request, pk): @@ -438,32 +454,30 @@ def resize_memory(request, pk): memory = instance.proxy.get_memory() cur_memory = instance.proxy.get_cur_memory() - if request.method == 'POST': + if request.method == "POST": if request.user.is_superuser or request.user.is_staff or userinstance.is_change: - new_memory = request.POST.get('memory', '') - new_memory_custom = request.POST.get('memory_custom', '') + new_memory = request.POST.get("memory", "") + new_memory_custom = request.POST.get("memory_custom", "") if new_memory_custom: new_memory = new_memory_custom - new_cur_memory = request.POST.get('cur_memory', '') - new_cur_memory_custom = request.POST.get('cur_memory_custom', '') + new_cur_memory = request.POST.get("cur_memory", "") + new_cur_memory_custom = request.POST.get("cur_memory_custom", "") if new_cur_memory_custom: new_cur_memory = new_cur_memory_custom quota_msg = utils.check_user_quota(request.user, 0, 0, int(new_memory) - memory, 0) if not request.user.is_superuser and quota_msg: - msg = _("User %(quota_msg)s quota reached, cannot resize memory of '%(instance_name)s'!") % { - 'quota_msg': quota_msg, - 'instance_name': instance.name - } + msg = _( + "User %(quota_msg)s quota reached, cannot resize memory of '%(instance_name)s'!" + ) % {"quota_msg": quota_msg, "instance_name": instance.name} messages.error(request, msg) else: cur_memory = new_cur_memory - memory = new_memory - instance.proxy.resize_mem(cur_memory, memory) - msg = _("Resize Memory") + instance.proxy.resize_mem(cur_memory, new_memory) + msg = _("Memory is resized: %(old)s to %(new)s") % {"old": cur_memory, "new": new_memory} addlogmsg(request.user.username, instance.name, msg) messages.success(request, msg) - return redirect(reverse('instances:instance', args=[instance.id]) + '#resize') + return redirect(reverse("instances:instance", args=[instance.id]) + "#resize") def resize_disk(request, pk): @@ -476,35 +490,38 @@ def resize_disk(request, pk): disks = instance.proxy.get_disk_devices() - if request.method == 'POST': + if request.method == "POST": if request.user.is_superuser or request.user.is_staff or userinstance.is_change: disks_new = list() for disk in disks: - input_disk_size = int(request.POST.get('disk_size_' + disk['dev'], '0')) * 1073741824 - if input_disk_size > disk['size'] + (64 << 20): - disk['size_new'] = input_disk_size + input_disk_size = ( + int(request.POST.get("disk_size_" + disk["dev"], "0")) * 1073741824 + ) + if input_disk_size > disk["size"] + (64 << 20): + disk["size_new"] = input_disk_size disks_new.append(disk) - disk_sum = sum([disk['size'] >> 30 for disk in disks_new]) - disk_new_sum = sum([disk['size_new'] >> 30 for disk in disks_new]) + disk_sum = sum([disk["size"] >> 30 for disk in disks_new]) + disk_new_sum = sum([disk["size_new"] >> 30 for disk in disks_new]) quota_msg = utils.check_user_quota(request.user, 0, 0, 0, disk_new_sum - disk_sum) if not request.user.is_superuser and quota_msg: - msg = _("User %(quota_msg)s quota reached, cannot resize disks of '%(instance_name)s'!") % { - 'quota_msg': quota_msg, - 'instance_name': instance.name - } + msg = _( + "User %(quota_msg)s quota reached, cannot resize disks of '%(instance_name)s'!" + ) % {"quota_msg": quota_msg, "instance_name": instance.name} messages.error(request, msg) else: instance.proxy.resize_disk(disks_new) - msg = _("Disk resize") + msg = _("Disk is resized: %(dev)s") % {"dev": disk["dev"]} addlogmsg(request.user.username, instance.name, msg) messages.success(request, msg) - return redirect(reverse('instances:instance', args=[instance.id]) + '#resize') + return redirect(reverse("instances:instance", args=[instance.id]) + "#resize") def add_new_vol(request, pk): instance = get_instance(request.user, pk) - allow_admin_or_not_template = request.user.is_superuser or request.user.is_staff or not instance.is_template + allow_admin_or_not_template = ( + request.user.is_superuser or request.user.is_staff or not instance.is_template + ) if allow_admin_or_not_template: media = instance.proxy.get_media_devices() @@ -515,13 +532,13 @@ def add_new_vol(request, pk): instance.compute.password, instance.compute.type, ) - storage = request.POST.get('storage', '') - name = request.POST.get('name', '') - format = request.POST.get('format', app_settings.INSTANCE_VOLUME_DEFAULT_FORMAT) - size = request.POST.get('size', 0) - meta_prealloc = True if request.POST.get('meta_prealloc', False) else False - bus = request.POST.get('bus', app_settings.INSTANCE_VOLUME_DEFAULT_BUS) - cache = request.POST.get('cache', app_settings.INSTANCE_VOLUME_DEFAULT_CACHE) + storage = request.POST.get("storage", "") + name = request.POST.get("name", "") + format = request.POST.get("format", app_settings.INSTANCE_VOLUME_DEFAULT_FORMAT) + size = request.POST.get("size", 0) + meta_prealloc = True if request.POST.get("meta_prealloc", False) else False + bus = request.POST.get("bus", app_settings.INSTANCE_VOLUME_DEFAULT_BUS) + cache = request.POST.get("cache", app_settings.INSTANCE_VOLUME_DEFAULT_CACHE) target_dev = utils.get_new_disk_dev(media, disks, bus) source = conn_create.create_volume( @@ -533,20 +550,24 @@ def add_new_vol(request, pk): int(app_settings.INSTANCE_VOLUME_DEFAULT_OWNER_UID), int(app_settings.INSTANCE_VOLUME_DEFAULT_OWNER_GID), ) - instance.proxy.attach_disk(target_dev, source, target_bus=bus, driver_type=format, cache_mode=cache) - msg = _("Attach new disk %(name)s (%(format)s)") % {'name': name, 'format': format} + instance.proxy.attach_disk( + target_dev, source, target_bus=bus, driver_type=format, cache_mode=cache + ) + msg = _("Attach new disk: %(name)s (%(format)s)") % {"name": name, "format": format} addlogmsg(request.user.username, instance.name, msg) - return redirect(request.META.get('HTTP_REFERER') + '#disks') + return redirect(request.META.get("HTTP_REFERER") + "#disks") def add_existing_vol(request, pk): instance = get_instance(request.user, pk) - allow_admin_or_not_template = request.user.is_superuser or request.user.is_staff or not instance.is_template + allow_admin_or_not_template = ( + request.user.is_superuser or request.user.is_staff or not instance.is_template + ) if allow_admin_or_not_template: - storage = request.POST.get('selected_storage', '') - name = request.POST.get('vols', '') - bus = request.POST.get('bus', app_settings.INSTANCE_VOLUME_DEFAULT_BUS) - cache = request.POST.get('cache', app_settings.INSTANCE_VOLUME_DEFAULT_CACHE) + storage = request.POST.get("selected_storage", "") + name = request.POST.get("vols", "") + bus = request.POST.get("bus", app_settings.INSTANCE_VOLUME_DEFAULT_BUS) + cache = request.POST.get("cache", app_settings.INSTANCE_VOLUME_DEFAULT_CACHE) media = instance.proxy.get_media_devices() disks = instance.proxy.get_disk_devices() @@ -564,30 +585,36 @@ def add_existing_vol(request, pk): target_dev = utils.get_new_disk_dev(media, disks, bus) source = f"{path}/{name}" - instance.proxy.attach_disk(target_dev, source, target_bus=bus, driver_type=driver_type, cache_mode=cache) - msg = _("Attach Existing disk: %(target_dev)s") % {'target_dev': target_dev} + instance.proxy.attach_disk( + target_dev, source, target_bus=bus, driver_type=driver_type, cache_mode=cache + ) + msg = _("Attach Existing disk: %(target_dev)s") % {"target_dev": target_dev} addlogmsg(request.user.username, instance.name, msg) - return redirect(request.META.get('HTTP_REFERER') + '#disks') + return redirect(request.META.get("HTTP_REFERER") + "#disks") def edit_volume(request, pk): instance = get_instance(request.user, pk) - allow_admin_or_not_template = request.user.is_superuser or request.user.is_staff or not instance.is_template - if 'edit_volume' in request.POST and allow_admin_or_not_template: - target_dev = request.POST.get('dev', '') + allow_admin_or_not_template = ( + request.user.is_superuser or request.user.is_staff or not instance.is_template + ) + if "edit_volume" in request.POST and allow_admin_or_not_template: + target_dev = request.POST.get("dev", "") - new_path = request.POST.get('vol_path', '') - shareable = bool(request.POST.get('vol_shareable', False)) - readonly = bool(request.POST.get('vol_readonly', False)) - disk_type = request.POST.get('vol_type', '') - new_bus = request.POST.get('vol_bus', '') - bus = request.POST.get('vol_bus_old', '') - serial = request.POST.get('vol_serial', '') - format = request.POST.get('vol_format', '') - cache = request.POST.get('vol_cache', app_settings.INSTANCE_VOLUME_DEFAULT_CACHE) - io = request.POST.get('vol_io_mode', app_settings.INSTANCE_VOLUME_DEFAULT_IO) - discard = request.POST.get('vol_discard_mode', app_settings.INSTANCE_VOLUME_DEFAULT_DISCARD) - zeroes = request.POST.get('vol_detect_zeroes', app_settings.INSTANCE_VOLUME_DEFAULT_DETECT_ZEROES) + new_path = request.POST.get("vol_path", "") + shareable = bool(request.POST.get("vol_shareable", False)) + readonly = bool(request.POST.get("vol_readonly", False)) + disk_type = request.POST.get("vol_type", "") + new_bus = request.POST.get("vol_bus", "") + bus = request.POST.get("vol_bus_old", "") + serial = request.POST.get("vol_serial", "") + format = request.POST.get("vol_format", "") + cache = request.POST.get("vol_cache", app_settings.INSTANCE_VOLUME_DEFAULT_CACHE) + io = request.POST.get("vol_io_mode", app_settings.INSTANCE_VOLUME_DEFAULT_IO) + discard = request.POST.get("vol_discard_mode", app_settings.INSTANCE_VOLUME_DEFAULT_DISCARD) + zeroes = request.POST.get( + "vol_detect_zeroes", app_settings.INSTANCE_VOLUME_DEFAULT_DETECT_ZEROES + ) new_target_dev = utils.get_new_disk_dev(instance.media, instance.disks, new_bus) if new_bus != bus: @@ -621,20 +648,25 @@ def edit_volume(request, pk): ) if not instance.proxy.get_status() == 5: - messages.success(request, _("Volume changes are applied. " + "But it will be activated after shutdown")) + messages.success( + request, + _("Volume changes are applied. " + "But it will be activated after shutdown"), + ) else: messages.success(request, _("Volume is changed successfully.")) - msg = _("Edit disk: %(target_dev)s") % {'target_dev': target_dev} + msg = _("Edit disk: %(target_dev)s") % {"target_dev": target_dev} addlogmsg(request.user.username, instance.name, msg) - return redirect(request.META.get('HTTP_REFERER') + '#disks') + return redirect(request.META.get("HTTP_REFERER") + "#disks") def delete_vol(request, pk): instance = get_instance(request.user, pk) - allow_admin_or_not_template = request.user.is_superuser or request.user.is_staff or not instance.is_template + allow_admin_or_not_template = ( + request.user.is_superuser or request.user.is_staff or not instance.is_template + ) if allow_admin_or_not_template: - storage = request.POST.get('storage', '') + storage = request.POST.get("storage", "") conn_delete = wvmStorage( instance.compute.hostname, instance.compute.login, @@ -642,146 +674,161 @@ def delete_vol(request, pk): instance.compute.type, storage, ) - dev = request.POST.get('dev', '') - path = request.POST.get('path', '') - name = request.POST.get('name', '') + dev = request.POST.get("dev", "") + path = request.POST.get("path", "") + name = request.POST.get("name", "") - msg = _("Delete disk: %(dev)s") % {'dev': dev} + msg = _("Delete disk: %(dev)s") % {"dev": dev} instance.proxy.detach_disk(dev) conn_delete.del_volume(name) addlogmsg(request.user.username, instance.name, msg) - return redirect(request.META.get('HTTP_REFERER') + '#disks') + return redirect(request.META.get("HTTP_REFERER") + "#disks") def detach_vol(request, pk): instance = get_instance(request.user, pk) - allow_admin_or_not_template = request.user.is_superuser or request.user.is_staff or not instance.is_template + allow_admin_or_not_template = ( + request.user.is_superuser or request.user.is_staff or not instance.is_template + ) if allow_admin_or_not_template: - dev = request.POST.get('dev', '') - path = request.POST.get('path', '') + dev = request.POST.get("dev", "") + path = request.POST.get("path", "") instance.proxy.detach_disk(dev) - msg = _("Detach disk: %(dev)s") % {'dev': dev} + msg = _("Detach disk: %(dev)s") % {"dev": dev} addlogmsg(request.user.username, instance.name, msg) - return redirect(request.META.get('HTTP_REFERER') + '#disks') + return redirect(request.META.get("HTTP_REFERER") + "#disks") def add_cdrom(request, pk): instance = get_instance(request.user, pk) - allow_admin_or_not_template = request.user.is_superuser or request.user.is_staff or not instance.is_template + allow_admin_or_not_template = ( + request.user.is_superuser or request.user.is_staff or not instance.is_template + ) if allow_admin_or_not_template: - bus = request.POST.get('bus', 'ide' if instance.machine == 'pc' else 'sata') + bus = request.POST.get("bus", "ide" if instance.machine == "pc" else "sata") target = utils.get_new_disk_dev(instance.media, instance.disks, bus) - instance.proxy.attach_disk(target, "", disk_device='cdrom', cache_mode='none', target_bus=bus, readonly=True) - msg = _("Add CD-ROM: %(target)s") % {'target': target} + instance.proxy.attach_disk( + target, "", disk_device="cdrom", cache_mode="none", target_bus=bus, readonly=True + ) + msg = _("Add CD-ROM: %(target)s") % {"target": target} addlogmsg(request.user.username, instance.name, msg) - return redirect(request.META.get('HTTP_REFERER') + '#disks') + return redirect(request.META.get("HTTP_REFERER") + "#disks") def detach_cdrom(request, pk, dev): instance = get_instance(request.user, pk) - allow_admin_or_not_template = request.user.is_superuser or request.user.is_staff or not instance.is_template + allow_admin_or_not_template = ( + request.user.is_superuser or request.user.is_staff or not instance.is_template + ) if allow_admin_or_not_template: # dev = request.POST.get('detach_cdrom', '') instance.proxy.detach_disk(dev) - msg = _('Detach CD-ROM: %(dev)s') % {'dev': dev} + msg = _("Detach CD-ROM: %(dev)s") % {"dev": dev} addlogmsg(request.user.username, instance.name, msg) - return redirect(request.META.get('HTTP_REFERER') + '#disks') + return redirect(request.META.get("HTTP_REFERER") + "#disks") def unmount_iso(request, pk): instance = get_instance(request.user, pk) - allow_admin_or_not_template = request.user.is_superuser or request.user.is_staff or not instance.is_template + allow_admin_or_not_template = ( + request.user.is_superuser or request.user.is_staff or not instance.is_template + ) if allow_admin_or_not_template: - image = request.POST.get('path', '') - dev = request.POST.get('umount_iso', '') + image = request.POST.get("path", "") + dev = request.POST.get("umount_iso", "") instance.proxy.umount_iso(dev, image) - msg = _("Mount media: %(dev)s") % {'dev': dev} + msg = _("Mount media: %(dev)s") % {"dev": dev} addlogmsg(request.user.username, instance.name, msg) - return redirect(request.META.get('HTTP_REFERER') + '#disks') + return redirect(request.META.get("HTTP_REFERER") + "#disks") def mount_iso(request, pk): instance = get_instance(request.user, pk) - allow_admin_or_not_template = request.user.is_superuser or request.user.is_staff or not instance.is_template + allow_admin_or_not_template = ( + request.user.is_superuser or request.user.is_staff or not instance.is_template + ) if allow_admin_or_not_template: - image = request.POST.get('media', '') - dev = request.POST.get('mount_iso', '') + image = request.POST.get("media", "") + dev = request.POST.get("mount_iso", "") instance.proxy.mount_iso(dev, image) - msg = _("Unmount media: %(dev)s") % {'dev': dev} + msg = _("Unmount media: %(dev)s") % {"dev": dev} addlogmsg(request.user.username, instance.name, msg) - return redirect(request.META.get('HTTP_REFERER') + '#disks') + return redirect(request.META.get("HTTP_REFERER") + "#disks") def snapshot(request, pk): instance = get_instance(request.user, pk) - allow_admin_or_not_template = request.user.is_superuser or request.user.is_staff or not instance.is_template + allow_admin_or_not_template = ( + request.user.is_superuser or request.user.is_staff or not instance.is_template + ) if allow_admin_or_not_template: - name = request.POST.get('name', '') + name = request.POST.get("name", "") instance.proxy.create_snapshot(name) - msg = _("New snapshot: %(name)s") % {'name': name} + msg = _("Create snapshot: %(snap)s") % {"snap": name} addlogmsg(request.user.username, instance.name, msg) - return redirect(request.META.get('HTTP_REFERER') + '#managesnapshot') + return redirect(request.META.get("HTTP_REFERER") + "#managesnapshot") def delete_snapshot(request, pk): instance = get_instance(request.user, pk) - allow_admin_or_not_template = request.user.is_superuser or request.user.is_staff or not instance.is_template + allow_admin_or_not_template = ( + request.user.is_superuser or request.user.is_staff or not instance.is_template + ) if allow_admin_or_not_template: - snap_name = request.POST.get('name', '') + snap_name = request.POST.get("name", "") instance.proxy.snapshot_delete(snap_name) - msg = _("Delete snapshot: %(snap_name)s") % {'snap_name': snap_name} + msg = _("Delete snapshot: %(snap)s") % {"snap": snap_name} addlogmsg(request.user.username, instance.name, msg) - return redirect(request.META.get('HTTP_REFERER') + '#managesnapshot') + return redirect(request.META.get("HTTP_REFERER") + "#managesnapshot") def revert_snapshot(request, pk): instance = get_instance(request.user, pk) - allow_admin_or_not_template = request.user.is_superuser or request.user.is_staff or not instance.is_template + allow_admin_or_not_template = ( + request.user.is_superuser or request.user.is_staff or not instance.is_template + ) if allow_admin_or_not_template: - snap_name = request.POST.get('name', '') + snap_name = request.POST.get("name", "") instance.proxy.snapshot_revert(snap_name) msg = _("Successful revert snapshot: ") msg += snap_name messages.success(request, msg) - msg = _("Revert snapshot") + msg = _("Revert snapshot: %(snap)") % {"snap": snap_name} addlogmsg(request.user.username, instance.name, msg) - return redirect(request.META.get('HTTP_REFERER') + '#managesnapshot') + return redirect(request.META.get("HTTP_REFERER") + "#managesnapshot") @superuser_only def set_vcpu(request, pk): instance = get_instance(request.user, pk) - id = request.POST.get('id', '') - enabled = request.POST.get('set_vcpu', '') - if enabled == 'True': + id = request.POST.get("id", "") + enabled = request.POST.get("set_vcpu", "") + if enabled == "True": instance.proxy.set_vcpu(id, 1) else: instance.proxy.set_vcpu(id, 0) - msg = _("VCPU %(id)s is enabled=%(enabled)s") % {'id': id, 'enabled': enabled} - messages.success(request, msg) + msg = _("VCPU %(id)s is enabled=%(enabled)s") % {"id": id, "enabled": enabled} addlogmsg(request.user.username, instance.name, msg) - return redirect(request.META.get('HTTP_REFERER') + '#resize') + return redirect(request.META.get("HTTP_REFERER") + "#resize") @superuser_only def set_vcpu_hotplug(request, pk): instance = get_instance(request.user, pk) - status = request.POST.get('vcpu_hotplug', '') - # TODO: f strings are not translatable https://code.djangoproject.com/ticket/29174 - msg = _("VCPU Hot-plug is enabled=%(status)s") % {'status': status} + status = request.POST.get("vcpu_hotplug", "") + msg = _("VCPU Hot-plug is enabled=%(status)s") % {"status": status} instance.proxy.set_vcpu_hotplug(eval(status)) - messages.success(request, msg) addlogmsg(request.user.username, instance.name, msg) - return redirect(request.META.get('HTTP_REFERER') + '#resize') + return redirect(request.META.get("HTTP_REFERER") + "#resize") @superuser_only @@ -790,7 +837,7 @@ def set_autostart(request, pk): instance.proxy.set_autostart(1) msg = _("Set autostart") addlogmsg(request.user.username, instance.name, msg) - return redirect(request.META.get('HTTP_REFERER') + '#boot_opt') + return redirect(request.META.get("HTTP_REFERER") + "#boot_opt") @superuser_only @@ -799,7 +846,7 @@ def unset_autostart(request, pk): instance.proxy.set_autostart(0) msg = _("Unset autostart") addlogmsg(request.user.username, instance.name, msg) - return redirect(request.META.get('HTTP_REFERER') + '#boot_opt') + return redirect(request.META.get("HTTP_REFERER") + "#boot_opt") @superuser_only @@ -808,7 +855,7 @@ def set_bootmenu(request, pk): instance.proxy.set_bootmenu(1) msg = _("Enable boot menu") addlogmsg(request.user.username, instance.name, msg) - return redirect(request.META.get('HTTP_REFERER') + '#boot_opt') + return redirect(request.META.get("HTTP_REFERER") + "#boot_opt") @superuser_only @@ -817,62 +864,65 @@ def unset_bootmenu(request, pk): instance.proxy.set_bootmenu(0) msg = _("Disable boot menu") addlogmsg(request.user.username, instance.name, msg) - return redirect(request.META.get('HTTP_REFERER') + '#boot_opt') + return redirect(request.META.get("HTTP_REFERER") + "#boot_opt") @superuser_only def set_bootorder(request, pk): instance = get_instance(request.user, pk) - bootorder = request.POST.get('bootorder', '') + bootorder = request.POST.get("bootorder", "") if bootorder: order_list = {} - for idx, val in enumerate(bootorder.split(',')): - dev_type, dev = val.split(':', 1) + for idx, val in enumerate(bootorder.split(",")): + dev_type, dev = val.split(":", 1) order_list[idx] = {"type": dev_type, "dev": dev} instance.proxy.set_bootorder(order_list) msg = _("Set boot order") if not instance.proxy.get_status() == 5: - messages.success(request, _("Boot menu changes applied. " + "But it will be activated after shutdown")) + messages.success( + request, + _("Boot menu changes applied. " + "But it will be activated after shutdown"), + ) else: messages.success(request, _("Boot order changed successfully.")) addlogmsg(request.user.username, instance.name, msg) - return redirect(request.META.get('HTTP_REFERER') + '#boot_opt') + return redirect(request.META.get("HTTP_REFERER") + "#boot_opt") @superuser_only def change_xml(request, pk): instance = get_instance(request.user, pk) - exit_xml = request.POST.get('inst_xml', '') - if exit_xml: - instance.proxy._defineXML(exit_xml) - msg = _("Edit XML") + new_xml = request.POST.get("inst_xml", "") + if new_xml: + instance.proxy._defineXML(new_xml) + msg = _("Change instance XML") addlogmsg(request.user.username, instance.name, msg) - return redirect(request.META.get('HTTP_REFERER') + '#xmledit') + return redirect(request.META.get("HTTP_REFERER") + "#xmledit") @superuser_only def set_guest_agent(request, pk): instance = get_instance(request.user, pk) - status = request.POST.get('guest_agent') - if status == 'True': + status = request.POST.get("guest_agent") + if status == "True": instance.proxy.add_guest_agent() - if status == 'False': + if status == "False": instance.proxy.remove_guest_agent() - msg = _("Set Guest Agent %(status)s") % {'status': status} + msg = _("Set Guest Agent: %(status)s") % {"status": status} addlogmsg(request.user.username, instance.name, msg) - return redirect(request.META.get('HTTP_REFERER') + '#options') + return redirect(request.META.get("HTTP_REFERER") + "#options") @superuser_only def set_video_model(request, pk): instance = get_instance(request.user, pk) - video_model = request.POST.get('video_model', 'vga') + video_model = request.POST.get("video_model", "vga") instance.proxy.set_video_model(video_model) - msg = _("Set Video Model") + msg = _("Set Video Model: %(model)") % {"model": video_model} addlogmsg(request.user.username, instance.name, msg) - return redirect(request.META.get('HTTP_REFERER') + '#options') + return redirect(request.META.get("HTTP_REFERER") + "#options") @superuser_only @@ -883,107 +933,119 @@ def change_network(request, pk): network_data = {} for post in request.POST: - if post.startswith('net-source-'): + if post.startswith("net-source-"): (source, source_type) = utils.get_network_tuple(request.POST.get(post)) network_data[post] = source - network_data[post + '-type'] = source_type - elif post.startswith('net-'): - network_data[post] = request.POST.get(post, '') + network_data[post + "-type"] = source_type + elif post.startswith("net-"): + network_data[post] = request.POST.get(post, "") instance.proxy.change_network(network_data) addlogmsg(request.user.username, instance.name, msg) msg = _("Network Device Config is changed. Please shutdown instance to activate.") - if instance.proxy.get_status() != 5: messages.success(request, msg) - return redirect(request.META.get('HTTP_REFERER') + '#network') + if instance.proxy.get_status() != 5: + messages.success(request, msg) + return redirect(request.META.get("HTTP_REFERER") + "#network") @superuser_only def add_network(request, pk): instance = get_instance(request.user, pk) - msg = _("Add network") - mac = request.POST.get('add-net-mac') - nwfilter = request.POST.get('add-net-nwfilter') - (source, source_type) = utils.get_network_tuple(request.POST.get('add-net-network')) + + mac = request.POST.get("add-net-mac") + nwfilter = request.POST.get("add-net-nwfilter") + (source, source_type) = utils.get_network_tuple(request.POST.get("add-net-network")) instance.proxy.add_network(mac, source, source_type, nwfilter=nwfilter) + msg = _("Add network: %(mac)s") % {"mac": mac} addlogmsg(request.user.username, instance.name, msg) - return redirect(request.META.get('HTTP_REFERER') + '#network') + return redirect(request.META.get("HTTP_REFERER") + "#network") @superuser_only def delete_network(request, pk): instance = get_instance(request.user, pk) - - msg = _("Delete network") - mac_address = request.POST.get('delete_network', '') + mac_address = request.POST.get("delete_network", "") instance.proxy.delete_network(mac_address) + msg = _("Delete Network: %(mac)s") % {"mac": mac_address} addlogmsg(request.user.username, instance.name, msg) - return redirect(request.META.get('HTTP_REFERER') + '#network') + return redirect(request.META.get("HTTP_REFERER") + "#network") @superuser_only def set_link_state(request, pk): instance = get_instance(request.user, pk) - mac_address = request.POST.get('mac', '') - state = request.POST.get('set_link_state') - state = 'down' if state == 'up' else 'up' + mac_address = request.POST.get("mac", "") + state = request.POST.get("set_link_state") + state = "down" if state == "up" else "up" instance.proxy.set_link_state(mac_address, state) - msg = _("Set Link State: %(state)s") % {'state': state} + msg = _("Set Link State: %(state)s") % {"state": state} addlogmsg(request.user.username, instance.name, msg) - return redirect(request.META.get('HTTP_REFERER') + '#network') + return redirect(request.META.get("HTTP_REFERER") + "#network") @superuser_only def set_qos(request, pk): instance = get_instance(request.user, pk) - 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 + 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 keys = request.POST.keys() - mac_key = [key for key in keys if 'mac' in key] - if mac_key: mac = request.POST.get(mac_key[0]) + mac_key = [key for key in keys if "mac" in key] + if mac_key: + mac = request.POST.get(mac_key[0]) instance.proxy.set_qos(mac, qos_dir, average, peak, burst) if instance.proxy.get_status() == 5: - messages.success(request, _("%(qos_dir)s QoS is set") % {'qos_dir': qos_dir.capitalize()}) + messages.success(request, _("%(qos_dir)s QoS is set") % {"qos_dir": qos_dir.capitalize()}) else: messages.success( request, - _("%(qos_dir)s QoS is set. Network XML is changed. \ - Stop and start network to activate new config.") % {'qos_dir': qos_dir.capitalize()}) + _( + "%(qos_dir)s QoS is set. Network XML is changed. \ + Stop and start network to activate new config." + ) + % {"qos_dir": qos_dir.capitalize()}, + ) - return redirect(request.META.get('HTTP_REFERER') + '#network') + return redirect(request.META.get("HTTP_REFERER") + "#network") @superuser_only def unset_qos(request, pk): instance = get_instance(request.user, pk) - qos_dir = request.POST.get('qos_direction', '') - mac = request.POST.get('net-mac') + qos_dir = request.POST.get("qos_direction", "") + mac = request.POST.get("net-mac") instance.proxy.unset_qos(mac, qos_dir) if instance.proxy.get_status() == 5: - messages.success(request, _("%(qos_dir)s QoS is deleted") % {'qos_dir': qos_dir.capitalize()}) + messages.success( + request, _("%(qos_dir)s QoS is deleted") % {"qos_dir": qos_dir.capitalize()} + ) else: messages.success( request, - _("%(qos_dir)s QoS is deleted. Network XML is changed. \ - Stop and start network to activate new config.") % {'qos_dir': qos_dir.capitalize()}) - return redirect(request.META.get('HTTP_REFERER') + '#network') + _( + "%(qos_dir)s QoS is deleted. Network XML is changed. \ + Stop and start network to activate new config." + ) + % {"qos_dir": qos_dir.capitalize()}, + ) + return redirect(request.META.get("HTTP_REFERER") + "#network") @superuser_only def add_owner(request, pk): instance = get_instance(request.user, pk) - user_id = request.POST.get('user_id') + user_id = request.POST.get("user_id") check_inst = 0 - if app_settings.ALLOW_INSTANCE_MULTIPLE_OWNER == 'False': + if app_settings.ALLOW_INSTANCE_MULTIPLE_OWNER == "False": check_inst = UserInstance.objects.filter(instance=instance).count() if check_inst > 0: @@ -992,43 +1054,43 @@ def add_owner(request, pk): add_user_inst = UserInstance(instance=instance, user_id=user_id) add_user_inst.save() user = User.objects.get(id=user_id) - msg = _("Added owner %(user)s") % {'user': user} + msg = _("Add owner: %(user)s") % {"user": user} addlogmsg(request.user.username, instance.name, msg) - return redirect(request.META.get('HTTP_REFERER') + '#users') + return redirect(request.META.get("HTTP_REFERER") + "#users") @superuser_only def del_owner(request, pk): instance = get_instance(request.user, pk) - userinstance_id = int(request.POST.get('userinstance', '')) + userinstance_id = int(request.POST.get("userinstance", "")) userinstance = UserInstance.objects.get(pk=userinstance_id) userinstance.delete() - msg = _("Deleted owner %(userinstance_id)s") % {'userinstance_id': userinstance_id} + msg = _("Delete owner: %(userinstance_id)s ") % {"userinstance_id": userinstance_id} addlogmsg(request.user.username, instance.name, msg) - return redirect(request.META.get('HTTP_REFERER') + '#users') + return redirect(request.META.get("HTTP_REFERER") + "#users") -@permission_required('instances.clone_instances', raise_exception=True) +@permission_required("instances.clone_instances", raise_exception=True) def clone(request, pk): instance = get_instance(request.user, pk) clone_data = dict() - clone_data['name'] = request.POST.get('name', '') + clone_data["name"] = request.POST.get("name", "") - disk_sum = sum([disk['size'] >> 30 for disk in instance.disks]) + disk_sum = sum([disk["size"] >> 30 for disk in instance.disks]) quota_msg = utils.check_user_quota(request.user, 1, instance.vcpu, instance.memory, disk_sum) - check_instance = Instance.objects.filter(name=clone_data['name']) + check_instance = Instance.objects.filter(name=clone_data["name"]) - clone_data['disk_owner_uid'] = int(app_settings.INSTANCE_VOLUME_DEFAULT_OWNER_UID) - clone_data['disk_owner_gid'] = int(app_settings.INSTANCE_VOLUME_DEFAULT_OWNER_GID) + clone_data["disk_owner_uid"] = int(app_settings.INSTANCE_VOLUME_DEFAULT_OWNER_UID) + clone_data["disk_owner_gid"] = int(app_settings.INSTANCE_VOLUME_DEFAULT_OWNER_GID) for post in request.POST: - clone_data[post] = request.POST.get(post, '').strip() + clone_data[post] = request.POST.get(post, "").strip() - if app_settings.CLONE_INSTANCE_AUTO_NAME == 'True' and not clone_data['name']: + if app_settings.CLONE_INSTANCE_AUTO_NAME == "True" and not clone_data["name"]: auto_vname = utils.get_clone_free_names()[0] - clone_data['name'] = auto_vname - clone_data['clone-net-mac-0'] = utils.get_dhcp_mac_address(auto_vname) + clone_data["name"] = auto_vname + clone_data["clone-net-mac-0"] = utils.get_dhcp_mac_address(auto_vname) for disk in instance.disks: disk_dev = f"disk-{disk['dev']}" disk_name = utils.get_clone_disk_name(disk, instance.name, auto_vname) @@ -1036,39 +1098,50 @@ def clone(request, pk): if not request.user.is_superuser and quota_msg: msg = _("User '%(quota_msg)s' quota reached, cannot create '%(clone_name)s'!") % { - 'quota_msg': quota_msg, - 'clone_name': clone_data['name'], + "quota_msg": quota_msg, + "clone_name": clone_data["name"], } messages.error(request, msg) elif check_instance: - msg = _("Instance '%(clone_name)s' already exists!") % {'clone_name': clone_data['name']} + msg = _("Instance '%(clone_name)s' already exists!") % {"clone_name": clone_data["name"]} messages.error(request, msg) - elif not re.match(r'^[a-zA-Z0-9-]+$', clone_data['name']): - msg = _("Instance name '%(clone_name)s' contains invalid characters!") % {'clone_name': clone_data['name']} + elif not re.match(r"^[a-zA-Z0-9-]+$", clone_data["name"]): + msg = _("Instance name '%(clone_name)s' contains invalid characters!") % { + "clone_name": clone_data["name"] + } messages.error(request, msg) - elif not re.match(r'^([0-9A-F]{2})(:?[0-9A-F]{2}){5}$', clone_data['clone-net-mac-0'], re.IGNORECASE): - msg = _("Instance MAC '%(clone_mac)s' invalid format!") % {'clone_mac': clone_data['clone-net-mac-0']} + elif not re.match( + r"^([0-9A-F]{2})(:?[0-9A-F]{2}){5}$", clone_data["clone-net-mac-0"], re.IGNORECASE + ): + msg = _("Instance MAC '%(clone_mac)s' invalid format!") % { + "clone_mac": clone_data["clone-net-mac-0"] + } messages.error(request, msg) else: - new_instance = Instance(compute=instance.compute, name=clone_data['name']) + new_instance = Instance(compute=instance.compute, name=clone_data["name"]) try: new_uuid = instance.proxy.clone_instance(clone_data) new_instance.uuid = new_uuid new_instance.save() - user_instance = UserInstance(instance_id=new_instance.id, user_id=request.user.id, is_delete=True) + user_instance = UserInstance( + instance_id=new_instance.id, user_id=request.user.id, is_delete=True + ) user_instance.save() - msg = _("Clone of '%(instance_name)s'") % {'instance_name': instance.name} + msg = _("Create a clone of '%(instance_name)s'") % {"instance_name": instance.name} + messages.success(request, msg) addlogmsg(request.user.username, new_instance.name, msg) - if app_settings.CLONE_INSTANCE_AUTO_MIGRATE == 'True': - new_compute = Compute.objects.order_by('?').first() - utils.migrate_instance(new_compute, new_instance, request.user, xml_del=True, offline=True) + if app_settings.CLONE_INSTANCE_AUTO_MIGRATE == "True": + new_compute = Compute.objects.order_by("?").first() + utils.migrate_instance( + new_compute, new_instance, request.user, xml_del=True, offline=True + ) - return redirect(reverse('instances:instance', args=[new_instance.id])) + return redirect(reverse("instances:instance", args=[new_instance.id])) except Exception as e: messages.error(request, e) - return redirect(request.META.get('HTTP_REFERER') + '#clone') + return redirect(request.META.get("HTTP_REFERER") + "#clone") def update_console(request, pk): @@ -1081,40 +1154,48 @@ def update_console(request, pk): if request.user.is_superuser or request.user.is_staff or userinstance.is_vnc: form = ConsoleForm(request.POST or None) if form.is_valid(): - if 'generate_password' in form.changed_data or 'clear_password' in form.changed_data or 'password' in form.changed_data: - if form.cleaned_data['generate_password']: + if ( + "generate_password" in form.changed_data + or "clear_password" in form.changed_data + or "password" in form.changed_data + ): + if form.cleaned_data["generate_password"]: password = randomPasswd() - elif form.cleaned_data['clear_password']: - password = '' + elif form.cleaned_data["clear_password"]: + password = "" else: - password = form.cleaned_data['password'] + password = form.cleaned_data["password"] if not instance.proxy.set_console_passwd(password): - msg = _("Error setting console password. " + "You should check that your instance have an graphic device.") + msg = _( + "Error setting console password. " + + "You should check that your instance have an graphic device." + ) messages.error(request, msg) else: msg = _("Set VNC password") addlogmsg(request.user.username, instance.name, msg) - if 'keymap' in form.changed_data or 'clear_keymap' in form.changed_data: - if form.cleaned_data['clear_keymap']: - instance.proxy.set_console_keymap('') + if "keymap" in form.changed_data or "clear_keymap" in form.changed_data: + if form.cleaned_data["clear_keymap"]: + instance.proxy.set_console_keymap("") else: - instance.proxy.set_console_keymap(form.cleaned_data['keymap']) + instance.proxy.set_console_keymap(form.cleaned_data["keymap"]) msg = _("Set VNC keymap") + addlogmsg(request.user.username, instance.name, msg) - if 'type' in form.changed_data: - instance.proxy.set_console_type(form.cleaned_data['type']) + if "type" in form.changed_data: + instance.proxy.set_console_type(form.cleaned_data["type"]) msg = _("Set VNC type") addlogmsg(request.user.username, instance.name, msg) - if 'listen_on' in form.changed_data: - instance.proxy.set_console_listen_addr(form.cleaned_data['listen_on']) + if "listen_on" in form.changed_data: + instance.proxy.set_console_listen_addr(form.cleaned_data["listen_on"]) msg = _("Set VNC listen address") addlogmsg(request.user.username, instance.name, msg) - return redirect(request.META.get('HTTP_REFERER') + '#vncsettings') + return redirect(request.META.get("HTTP_REFERER") + "#vncsettings") def change_options(request, pk): @@ -1125,18 +1206,18 @@ def change_options(request, pk): userinstance = UserInstance(is_change=False) if request.user.is_superuser or request.user.is_staff or userinstance.is_change: - instance.is_template = request.POST.get('is_template', False) + instance.is_template = request.POST.get("is_template", False) instance.save() options = {} for post in request.POST: - if post in ['title', 'description']: - options[post] = request.POST.get(post, '') + if post in ["title", "description"]: + options[post] = request.POST.get(post, "") instance.proxy.set_options(options) msg = _("Edit options") addlogmsg(request.user.username, instance.name, msg) - return redirect(request.META.get('HTTP_REFERER') + '#options') + return redirect(request.META.get("HTTP_REFERER") + "#options") def getvvfile(request, pk): @@ -1150,23 +1231,29 @@ def getvvfile(request, pk): msg = _("Send console.vv file") addlogmsg(request.user.username, instance.name, msg) - response = HttpResponse(content='', content_type='application/x-virt-viewer', status=200, reason=None, charset='utf-8') - response.writelines('[virt-viewer]\n') - response.writelines('type=' + conn.graphics_type(instance.name) + '\n') - if conn.graphics_listen(instance.name) == '0.0.0.0': - response.writelines('host=' + conn.host + '\n') + response = HttpResponse( + content="", + content_type="application/x-virt-viewer", + status=200, + reason=None, + charset="utf-8", + ) + response.writelines("[virt-viewer]\n") + response.writelines("type=" + conn.graphics_type(instance.name) + "\n") + if conn.graphics_listen(instance.name) == "0.0.0.0": + response.writelines("host=" + conn.host + "\n") else: - response.writelines('host=' + conn.graphics_listen(instance.name) + '\n') - response.writelines('port=' + conn.graphics_port(instance.name) + '\n') - response.writelines('title=' + conn.domain_name(instance.name) + '\n') - response.writelines('password=' + conn.graphics_passwd(instance.name) + '\n') - response.writelines('enable-usbredir=1\n') - response.writelines('disable-effects=all\n') - response.writelines('secure-attention=ctrl+alt+ins\n') - response.writelines('release-cursor=ctrl+alt\n') - response.writelines('fullscreen=1\n') - response.writelines('delete-this-file=1\n') - response['Content-Disposition'] = 'attachment; filename="console.vv"' + response.writelines("host=" + conn.graphics_listen(instance.name) + "\n") + response.writelines("port=" + conn.graphics_port(instance.name) + "\n") + response.writelines("title=" + conn.domain_name(instance.name) + "\n") + response.writelines("password=" + conn.graphics_passwd(instance.name) + "\n") + response.writelines("enable-usbredir=1\n") + response.writelines("disable-effects=all\n") + response.writelines("secure-attention=ctrl+alt+ins\n") + response.writelines("release-cursor=ctrl+alt\n") + response.writelines("fullscreen=1\n") + response.writelines("delete-this-file=1\n") + response["Content-Disposition"] = 'attachment; filename="console.vv"' return response @@ -1195,11 +1282,11 @@ def create_instance_select_type(request, compute_id): default_machine = app_settings.INSTANCE_MACHINE_DEFAULT_TYPE default_arch = app_settings.INSTANCE_ARCH_DEFAULT_TYPE - if request.method == 'POST': - if 'create_xml' in request.POST: - xml = request.POST.get('dom_xml', '') + if request.method == "POST": + if "create_xml" in request.POST: + xml = request.POST.get("dom_xml", "") try: - name = util.get_xml_path(xml, '/domain/name') + name = util.get_xml_path(xml, "/domain/name") except util.etree.Error as err: name = None if name in instances: @@ -1209,9 +1296,9 @@ def create_instance_select_type(request, compute_id): conn._defineXML(xml) utils.refr(compute) instance = compute.instance_set.get(name=name) - return redirect(reverse('instances:instance', args=[instance.id])) + return redirect(reverse("instances:instance", args=[instance.id])) - return render(request, 'create_instance_w1.html', locals()) + return render(request, "create_instance_w1.html", locals()) @superuser_only @@ -1231,7 +1318,7 @@ def create_instance(request, compute_id, arch, machine): firmwares = list() meta_prealloc = False compute = get_object_or_404(Compute, pk=compute_id) - flavors = Flavor.objects.filter().order_by('id') + flavors = Flavor.objects.filter().order_by("id") appsettings = AppSettings.objects.all() try: @@ -1267,11 +1354,13 @@ def create_instance(request, compute_id, arch, machine): hv_supports_uefi = conn.supports_uefi_xml(dom_caps["loader_enums"]) # Add BIOS label = conn.label_for_firmware_path(arch, None) - if label: firmwares.append(label) + if label: + firmwares.append(label) # Add UEFI loader_path = conn.find_uefi_path_for_arch(arch, dom_caps["loaders"]) label = conn.label_for_firmware_path(arch, loader_path) - if label: firmwares.append(label) + if label: + firmwares.append(label) firmwares = list(set(firmwares)) flavor_form = FlavorForm() @@ -1282,8 +1371,8 @@ def create_instance(request, compute_id, arch, machine): if not networks: raise libvirtError(_("You haven't defined any network pools")) - if request.method == 'POST': - if 'create' in request.POST: + if request.method == "POST": + if "create" in request.POST: firmware = dict() volume_list = list() is_disk_created = False @@ -1291,128 +1380,159 @@ def create_instance(request, compute_id, arch, machine): form = NewVMForm(request.POST) if form.is_valid(): data = form.cleaned_data - if data['meta_prealloc']: + if data["meta_prealloc"]: meta_prealloc = True if instances: - if data['name'] in instances: - raise libvirtError(_("A virtual machine with this name already exists")) - if Instance.objects.filter(name__exact=data['name']): - raise libvirtError(_("There is an instance with same name. Remove it and try again!")) + if data["name"] in instances: + raise libvirtError( + _("A virtual machine with this name already exists") + ) + if Instance.objects.filter(name__exact=data["name"]): + raise libvirtError( + _( + "There is an instance with same name. Remove it and try again!" + ) + ) - if data['hdd_size']: - if not data['mac']: + if data["hdd_size"]: + if not data["mac"]: raise libvirtError(_("No Virtual Machine MAC has been entered")) else: - path = conn.create_volume(data['storage'], data['name'], data['hdd_size'], default_disk_format, - meta_prealloc, default_disk_owner_uid, default_disk_owner_gid) + path = conn.create_volume( + data["storage"], + data["name"], + data["hdd_size"], + default_disk_format, + meta_prealloc, + default_disk_owner_uid, + default_disk_owner_gid, + ) volume = dict() - volume['device'] = 'disk' - volume['path'] = path - volume['type'] = conn.get_volume_type(path) - volume['cache_mode'] = data['cache_mode'] - volume['bus'] = default_bus - if volume['bus'] == 'scsi': - volume['scsi_model'] = default_scsi_disk_model - volume['discard_mode'] = default_discard - volume['detect_zeroes_mode'] = default_zeroes - volume['io_mode'] = default_io + volume["device"] = "disk" + volume["path"] = path + volume["type"] = conn.get_volume_type(path) + volume["cache_mode"] = data["cache_mode"] + volume["bus"] = default_bus + if volume["bus"] == "scsi": + volume["scsi_model"] = default_scsi_disk_model + volume["discard_mode"] = default_discard + volume["detect_zeroes_mode"] = default_zeroes + volume["io_mode"] = default_io volume_list.append(volume) is_disk_created = True - elif data['template']: - templ_path = conn.get_volume_path(data['template']) - dest_vol = conn.get_volume_path(data["name"] + ".img", data['storage']) + elif data["template"]: + templ_path = conn.get_volume_path(data["template"]) + dest_vol = conn.get_volume_path(data["name"] + ".img", data["storage"]) if dest_vol: - raise libvirtError(_("Image has already exist. Please check volumes or change instance name")) + raise libvirtError( + _( + "Image has already exist. Please check volumes or change instance name" + ) + ) else: - clone_path = conn.clone_from_template(data['name'], templ_path, data['storage'], meta_prealloc, - default_disk_owner_uid, default_disk_owner_gid) + clone_path = conn.clone_from_template( + data["name"], + templ_path, + data["storage"], + meta_prealloc, + default_disk_owner_uid, + default_disk_owner_gid, + ) volume = dict() - volume['path'] = clone_path - volume['type'] = conn.get_volume_type(clone_path) - volume['device'] = 'disk' - volume['cache_mode'] = data['cache_mode'] - volume['bus'] = default_bus - if volume['bus'] == 'scsi': - volume['scsi_model'] = default_scsi_disk_model - volume['discard_mode'] = default_discard - volume['detect_zeroes_mode'] = default_zeroes - volume['io_mode'] = default_io + volume["path"] = clone_path + volume["type"] = conn.get_volume_type(clone_path) + volume["device"] = "disk" + volume["cache_mode"] = data["cache_mode"] + volume["bus"] = default_bus + if volume["bus"] == "scsi": + volume["scsi_model"] = default_scsi_disk_model + volume["discard_mode"] = default_discard + volume["detect_zeroes_mode"] = default_zeroes + volume["io_mode"] = default_io volume_list.append(volume) is_disk_created = True else: - if not data['images']: + if not data["images"]: raise libvirtError(_("First you need to create or select an image")) else: - for idx, vol in enumerate(data['images'].split(',')): + for idx, vol in enumerate(data["images"].split(",")): path = conn.get_volume_path(vol) volume = dict() - volume['path'] = path - volume['type'] = conn.get_volume_type(path) - volume['device'] = request.POST.get('device' + str(idx), '') - volume['bus'] = request.POST.get('bus' + str(idx), '') - if volume['bus'] == 'scsi': - volume['scsi_model'] = default_scsi_disk_model - volume['cache_mode'] = data['cache_mode'] - volume['discard_mode'] = default_discard - volume['detect_zeroes_mode'] = default_zeroes - volume['io_mode'] = default_io + volume["path"] = path + volume["type"] = conn.get_volume_type(path) + volume["device"] = request.POST.get("device" + str(idx), "") + volume["bus"] = request.POST.get("bus" + str(idx), "") + if volume["bus"] == "scsi": + volume["scsi_model"] = default_scsi_disk_model + volume["cache_mode"] = data["cache_mode"] + volume["discard_mode"] = default_discard + volume["detect_zeroes_mode"] = default_zeroes + volume["io_mode"] = default_io volume_list.append(volume) - if data['cache_mode'] not in conn.get_cache_modes(): + if data["cache_mode"] not in conn.get_cache_modes(): error_msg = _("Invalid cache mode") raise libvirtError - if 'UEFI' in data["firmware"]: + if "UEFI" in data["firmware"]: firmware["loader"] = data["firmware"].split(":")[1].strip() - firmware["secure"] = 'no' - firmware["readonly"] = 'yes' - firmware["type"] = 'pflash' - if 'secboot' in firmware["loader"] and machine != 'q35': + firmware["secure"] = "no" + firmware["readonly"] = "yes" + firmware["type"] = "pflash" + if "secboot" in firmware["loader"] and machine != "q35": messages.warning( - request, "Changing machine type from '%s' to 'q35' " - "which is required for UEFI secure boot." % machine) - machine = 'q35' - firmware["secure"] = 'yes' + request, + "Changing machine type from '%s' to 'q35' " + "which is required for UEFI secure boot." % machine, + ) + machine = "q35" + firmware["secure"] = "yes" uuid = util.randomUUID() try: - conn.create_instance(name=data['name'], - memory=data['memory'], - vcpu=data['vcpu'], - vcpu_mode=data['vcpu_mode'], - uuid=uuid, - arch=arch, - machine=machine, - firmware=firmware, - volumes=volume_list, - networks=data['networks'], - virtio=data['virtio'], - listen_addr=data["listener_addr"], - nwfilter=data["nwfilter"], - graphics=data["graphics"], - video=data["video"], - console_pass=data["console_pass"], - mac=data['mac'], - qemu_ga=data['qemu_ga']) - create_instance = Instance(compute_id=compute_id, name=data['name'], uuid=uuid) + conn.create_instance( + name=data["name"], + memory=data["memory"], + vcpu=data["vcpu"], + vcpu_mode=data["vcpu_mode"], + uuid=uuid, + arch=arch, + machine=machine, + firmware=firmware, + volumes=volume_list, + networks=data["networks"], + virtio=data["virtio"], + listen_addr=data["listener_addr"], + nwfilter=data["nwfilter"], + graphics=data["graphics"], + video=data["video"], + console_pass=data["console_pass"], + mac=data["mac"], + qemu_ga=data["qemu_ga"], + ) + create_instance = Instance( + compute_id=compute_id, name=data["name"], uuid=uuid + ) create_instance.save() msg = _("Instance is created") messages.success(request, msg) addlogmsg(request.user.username, create_instance.name, msg) - return redirect(reverse('instances:instance', args=[create_instance.id])) + return redirect( + reverse("instances:instance", args=[create_instance.id]) + ) except libvirtError as lib_err: - if data['hdd_size'] or len(volume_list) > 0: + if data["hdd_size"] or len(volume_list) > 0: if is_disk_created: for vol in volume_list: - conn.delete_volume(vol['path']) + conn.delete_volume(vol["path"]) messages.error(request, lib_err) conn.close() except libvirtError as lib_err: messages.error(request, lib_err) - return render(request, 'create_instance_w2.html', locals()) + return render(request, "create_instance_w2.html", locals()) @superuser_only @@ -1420,16 +1540,13 @@ def flavor_create(request): form = FlavorForm(request.POST or None) if form.is_valid(): form.save() - messages.success(request, _('Flavor Created')) - return redirect(request.META.get('HTTP_REFERER')) + messages.success(request, _("Flavor Created")) + return redirect(request.META.get("HTTP_REFERER")) return render( request, - 'common/form.html', - { - 'form': form, - 'title': _('Create Flavor') - }, + "common/form.html", + {"form": form, "title": _("Create Flavor")}, ) @@ -1439,29 +1556,26 @@ def flavor_update(request, pk): form = FlavorForm(request.POST or None, instance=flavor) if form.is_valid(): form.save() - messages.success(request, _('Flavor Updated')) - return redirect(request.META.get('HTTP_REFERER')) + messages.success(request, _("Flavor Updated")) + return redirect(request.META.get("HTTP_REFERER")) return render( request, - 'common/form.html', - { - 'form': form, - 'title': _('Update Flavor') - }, + "common/form.html", + {"form": form, "title": _("Update Flavor")}, ) @superuser_only def flavor_delete(request, pk): flavor = get_object_or_404(Flavor, pk=pk) - if request.method == 'POST': + if request.method == "POST": flavor.delete() - messages.success(request, _('Flavor Deleted')) - return redirect(request.META.get('HTTP_REFERER')) + messages.success(request, _("Flavor Deleted")) + return redirect(request.META.get("HTTP_REFERER")) return render( request, - 'common/confirm_delete.html', - {'object': flavor}, + "common/confirm_delete.html", + {"object": flavor}, ) diff --git a/interfaces/views.py b/interfaces/views.py index 7a12a38..a6f8c0b 100644 --- a/interfaces/views.py +++ b/interfaces/views.py @@ -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()) diff --git a/networks/views.py b/networks/views.py index aade157..6f48662 100644 --- a/networks/views.py +++ b/networks/views.py @@ -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()) diff --git a/nwfilters/views.py b/nwfilters/views.py index 3ac9407..52f6fc6 100644 --- a/nwfilters/views.py +++ b/nwfilters/views.py @@ -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()) diff --git a/secrets/views.py b/secrets/views.py index 3788d87..1746af5 100644 --- a/secrets/views.py +++ b/secrets/views.py @@ -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()) diff --git a/storages/views.py b/storages/views.py index b3ee0b1..732e332 100644 --- a/storages/views.py +++ b/storages/views.py @@ -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)) diff --git a/vrtManager/instance.py b/vrtManager/instance.py index e78b314..a456ec6 100644 --- a/vrtManager/instance.py +++ b/vrtManager/instance.py @@ -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': diff --git a/vrtManager/network.py b/vrtManager/network.py index dec2362..8ab2fc5 100644 --- a/vrtManager/network.py +++ b/vrtManager/network.py @@ -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: diff --git a/vrtManager/util.py b/vrtManager/util.py index 7c9a08e..88403f5 100644 --- a/vrtManager/util.py +++ b/vrtManager/util.py @@ -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 diff --git a/webvirtcloud/middleware.py b/webvirtcloud/middleware.py index 6759ff1..902edd1 100644 --- a/webvirtcloud/middleware.py +++ b/webvirtcloud/middleware.py @@ -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