1
0
Fork 0
mirror of https://github.com/retspen/webvirtcloud synced 2026-03-22 02:24:56 +00:00

lint with black python. convert f style strings to old one.

This commit is contained in:
catborise 2020-11-04 13:31:08 +03:00
parent c20c353a40
commit c9a2c3d813
18 changed files with 956 additions and 754 deletions

View file

@ -35,11 +35,11 @@ def validate_ssh_key(key):
return False return False
# unpack the contents of data, from data[:4] , property of ssh key . # unpack the contents of data, from data[:4] , property of ssh key .
try: try:
str_len = struct.unpack('>I', data[:4])[0] str_len = struct.unpack(">I", data[:4])[0]
except struct.error: except struct.error:
return False return False
# data[4:str_len] must have string which matches with the typeofkey, another ssh key property. # 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 return True
else: else:
return False return False
@ -47,15 +47,15 @@ def validate_ssh_key(key):
def send_email_with_otp(user, device): def send_email_with_otp(user, device):
send_mail( send_mail(
_('OTP QR Code'), _("OTP QR Code"),
_('Please view HTML version of this message.'), _("Please view HTML version of this message."),
None, None,
[user.email], [user.email],
html_message=render_to_string( html_message=render_to_string(
'accounts/email/otp.html', "accounts/email/otp.html",
{ {
'totp_url': device.config_url, "totp_url": device.config_url,
'user': user, "user": user,
}, },
), ),
fail_silently=False, fail_silently=False,

View file

@ -23,40 +23,52 @@ def profile(request):
if profile_form.is_valid(): if profile_form.is_valid():
profile_form.save() profile_form.save()
messages.success(request, _('Profile updated')) messages.success(request, _("Profile updated"))
return redirect('accounts:profile') return redirect("accounts:profile")
return render(request, "profile.html", { return render(
'publickeys': publickeys, request,
'profile_form': profile_form, "profile.html",
'ssh_key_form': ssh_key_form, {
}) "publickeys": publickeys,
"profile_form": profile_form,
"ssh_key_form": ssh_key_form,
},
)
def ssh_key_create(request): def ssh_key_create(request):
key_form = UserSSHKeyForm(request.POST or None, user=request.user) key_form = UserSSHKeyForm(request.POST or None, user=request.user)
if key_form.is_valid(): if key_form.is_valid():
key_form.save() key_form.save()
messages.success(request, _('SSH key added')) messages.success(request, _("SSH key added"))
return redirect('accounts:profile') return redirect("accounts:profile")
return render(request, 'common/form.html', { return render(
'form': key_form, request,
'title': _('Add SSH key'), "common/form.html",
}) {
"form": key_form,
"title": _("Add SSH key"),
},
)
def ssh_key_delete(request, pk): def ssh_key_delete(request, pk):
ssh_key = get_object_or_404(UserSSHKey, pk=pk, user=request.user) ssh_key = get_object_or_404(UserSSHKey, pk=pk, user=request.user)
if request.method == 'POST': if request.method == "POST":
ssh_key.delete() ssh_key.delete()
messages.success(request, _('SSH key deleted')) messages.success(request, _("SSH key deleted"))
return redirect('accounts:profile') return redirect("accounts:profile")
return render(request, 'common/confirm_delete.html', { return render(
'object': ssh_key, request,
'title': _('Delete SSH key'), "common/confirm_delete.html",
}) {
"object": ssh_key,
"title": _("Delete SSH key"),
},
)
@superuser_only @superuser_only
@ -67,13 +79,16 @@ def account(request, user_id):
publickeys = UserSSHKey.objects.filter(user_id=user_id) publickeys = UserSSHKey.objects.filter(user_id=user_id)
return render( return render(
request, "account.html", { request,
'user': user, "account.html",
'user_insts': user_insts, {
'instances': instances, "user": user,
'publickeys': publickeys, "user_insts": user_insts,
'otp_enabled': settings.OTP_ENABLED, "instances": instances,
}) "publickeys": publickeys,
"otp_enabled": settings.OTP_ENABLED,
},
)
@permission_required("accounts.change_password", raise_exception=True) @permission_required("accounts.change_password", raise_exception=True)
@ -118,7 +133,7 @@ def user_instance_update(request, pk):
return render( return render(
request, request,
'common/form.html', "common/form.html",
{ {
"form": form, "form": form,
"title": _("Update User Instance"), "title": _("Update User Instance"),
@ -150,29 +165,33 @@ def email_otp(request):
if form.is_valid(): if form.is_valid():
UserModel = get_user_model() UserModel = get_user_model()
try: try:
user = UserModel.objects.get(email=form.cleaned_data['email']) user = UserModel.objects.get(email=form.cleaned_data["email"])
except UserModel.DoesNotExist: except UserModel.DoesNotExist:
pass pass
else: else:
device = get_user_totp_device(user) device = get_user_totp_device(user)
send_email_with_otp(user, device) send_email_with_otp(user, device)
messages.success(request, _('OTP Sent to %s') % form.cleaned_data['email']) messages.success(request, _("OTP Sent to %(email)s") % {"email": form.cleaned_data["email"]})
return redirect('accounts:login') return redirect("accounts:login")
return render(request, 'accounts/email_otp_form.html', { return render(
'form': form, request,
'title': _('Email OTP'), "accounts/email_otp_form.html",
}) {
"form": form,
"title": _("Email OTP"),
},
)
@superuser_only @superuser_only
def admin_email_otp(request, user_id): def admin_email_otp(request, user_id):
user = get_object_or_404(get_user_model(), pk=user_id) user = get_object_or_404(get_user_model(), pk=user_id)
device = get_user_totp_device(user) device = get_user_totp_device(user)
if user.email != '': if user.email != "":
send_email_with_otp(user, device) 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: else:
messages.error(request, _('User email not set, failed to send QR code')) messages.error(request, _("User email not set, failed to send QR code"))
return redirect('accounts:account', user.id) return redirect("accounts:account", user.id)

View file

@ -50,7 +50,7 @@ def group_update(request, pk):
form = forms.GroupForm(request.POST or None, instance=group) form = forms.GroupForm(request.POST or None, instance=group)
if form.is_valid(): if form.is_valid():
form.save() form.save()
return redirect('admin:group_list') return redirect("admin:group_list")
return render( return render(
request, request,
@ -107,11 +107,7 @@ def user_create(request):
return render( return render(
request, request,
"admin/user_form.html", "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(): if user_form.is_valid() and attributes_form.is_valid():
user_form.save() user_form.save()
attributes_form.save() attributes_form.save()
next = request.GET.get('next') next = request.GET.get("next")
return redirect(next or "admin:user_list") return redirect(next or "admin:user_list")
return render( return render(
request, request,
"admin/user_form.html", "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 @superuser_only
def user_update_password(request, pk): def user_update_password(request, pk):
user = get_object_or_404(User, pk=pk) user = get_object_or_404(User, pk=pk)
if request.method == 'POST': if request.method == "POST":
form = AdminPasswordChangeForm(user, request.POST) form = AdminPasswordChangeForm(user, request.POST)
if form.is_valid(): if form.is_valid():
user = form.save() user = form.save()
update_session_auth_hash(request, user) # Important! 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") return redirect("admin:user_list")
else: else:
messages.error(request, _("Wrong Data Provided")) messages.error(request, _("Wrong Data Provided"))

View file

@ -29,13 +29,13 @@ def appsettings(request):
# Bootstrap settings related with filesystems, because of that they are excluded from other settings # Bootstrap settings related with filesystems, because of that they are excluded from other settings
appsettings = AppSettings.objects.exclude(description__startswith="Bootstrap").order_by("name") appsettings = AppSettings.objects.exclude(description__startswith="Bootstrap").order_by("name")
if request.method == 'POST': if request.method == "POST":
if 'SASS_DIR' in request.POST: if "SASS_DIR" in request.POST:
try: try:
sass_dir.value = request.POST.get("SASS_DIR", "") sass_dir.value = request.POST.get("SASS_DIR", "")
sass_dir.save() 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) messages.success(request, msg)
except Exception as err: except Exception as err:
msg = err msg = err
@ -44,7 +44,7 @@ def appsettings(request):
addlogmsg(request.user.username, "", msg) addlogmsg(request.user.username, "", msg)
return HttpResponseRedirect(request.get_full_path()) return HttpResponseRedirect(request.get_full_path())
if 'BOOTSTRAP_THEME' in request.POST: if "BOOTSTRAP_THEME" in request.POST:
theme = request.POST.get("BOOTSTRAP_THEME", "") theme = request.POST.get("BOOTSTRAP_THEME", "")
scss_var = f"@import '{sass_dir.value}/wvc-theme/{theme}/variables';" scss_var = f"@import '{sass_dir.value}/wvc-theme/{theme}/variables';"
scss_bootswatch = f"@import '{sass_dir.value}/wvc-theme/{theme}/bootswatch';" 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: with open(sass_dir.value + "/wvc-main.scss", "w") as main:
main.write(scss_var + "\n" + scss_boot + "\n" + scss_bootswatch + "\n") main.write(scss_var + "\n" + scss_boot + "\n" + scss_bootswatch + "\n")
css_compressed = sass.compile(string=scss_var + "\n" + scss_boot + "\n" + scss_bootswatch, css_compressed = sass.compile(
output_style='compressed') string=scss_var + "\n" + scss_boot + "\n" + scss_bootswatch,
output_style="compressed",
)
with open("static/css/" + main_css, "w") as css: with open("static/css/" + main_css, "w") as css:
css.write(css_compressed) css.write(css_compressed)
bootstrap_theme.value = theme bootstrap_theme.value = theme
bootstrap_theme.save() bootstrap_theme.save()
msg = _(f"Theme changed. Now: {theme}") msg = _("Theme is changed. Now: %(theme)s") % {"theme": theme}
messages.success(request, msg) messages.success(request, msg)
except Exception as err: except Exception as err:
msg = err msg = err
@ -77,7 +79,7 @@ def appsettings(request):
setting.value = request.POST.get(setting.key, "") setting.value = request.POST.get(setting.key, "")
setting.save() 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) messages.success(request, msg)
except Exception as err: except Exception as err:
msg = err msg = err
@ -86,4 +88,4 @@ def appsettings(request):
addlogmsg(request.user.username, "", msg) addlogmsg(request.user.username, "", msg)
return HttpResponseRedirect(request.get_full_path()) return HttpResponseRedirect(request.get_full_path())
return render(request, 'appsettings.html', locals()) return render(request, "appsettings.html", locals())

View file

@ -9,10 +9,17 @@ from libvirt import libvirtError
from accounts.models import UserInstance from accounts.models import UserInstance
from admin.decorators import superuser_only 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 computes.models import Compute
from instances.models import Instance 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 vrtManager.hostdetails import wvmHostDetails
from . import utils from . import utils
@ -25,15 +32,17 @@ def computes(request):
:return: :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 @superuser_only
def overview(request, compute_id): def overview(request, compute_id):
compute = get_object_or_404(Compute, pk=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( conn = wvmHostDetails(
compute.hostname, compute.hostname,
@ -49,7 +58,7 @@ def overview(request, compute_id):
lib_version = conn.get_lib_version() lib_version = conn.get_lib_version()
conn.close() conn.close()
return render(request, 'overview.html', locals()) return render(request, "overview.html", locals())
@superuser_only @superuser_only
@ -57,9 +66,9 @@ def instances(request, compute_id):
compute = get_object_or_404(Compute, pk=compute_id) compute = get_object_or_404(Compute, pk=compute_id)
utils.refresh_instance_database(compute) 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 @superuser_only
@ -67,9 +76,9 @@ def compute_create(request, FormClass):
form = FormClass(request.POST or None) form = FormClass(request.POST or None)
if form.is_valid(): if form.is_valid():
form.save() 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 @superuser_only
@ -88,22 +97,22 @@ def compute_update(request, compute_id):
form = FormClass(request.POST or None, instance=compute) form = FormClass(request.POST or None, instance=compute)
if form.is_valid(): if form.is_valid():
form.save() 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 @superuser_only
def compute_delete(request, compute_id): def compute_delete(request, compute_id):
compute = get_object_or_404(Compute, pk=compute_id) compute = get_object_or_404(Compute, pk=compute_id)
if request.method == 'POST': if request.method == "POST":
compute.delete() compute.delete()
return redirect('computes') return redirect("computes")
return render( return render(
request, request,
'common/confirm_delete.html', "common/confirm_delete.html",
{'object': compute}, {"object": compute},
) )
@ -126,17 +135,19 @@ def compute_graph(request, compute_id):
mem_usage = conn.get_memory_usage() mem_usage = conn.get_memory_usage()
conn.close() conn.close()
except libvirtError: except libvirtError:
cpu_usage = {'usage': 0} cpu_usage = {"usage": 0}
mem_usage = {'usage': 0} mem_usage = {"usage": 0}
current_time = 0 current_time = 0
data = json.dumps({ data = json.dumps(
'cpudata': cpu_usage['usage'], {
'memdata': mem_usage, "cpudata": cpu_usage["usage"],
'timeline': current_time, "memdata": mem_usage,
}) "timeline": current_time,
}
)
response = HttpResponse() response = HttpResponse()
response['Content-Type'] = "text/javascript" response["Content-Type"] = "text/javascript"
response.write(data) response.write(data)
return response 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) disk_device_types = conn.get_disk_device_types(arch, machine)
if disk in disk_device_types: if disk in disk_device_types:
if disk == 'disk': if disk == "disk":
data['bus'] = sorted(disk_device_types) data["bus"] = sorted(disk_device_types)
elif disk == 'cdrom': elif disk == "cdrom":
data['bus'] = ['ide', 'sata', 'scsi'] data["bus"] = ["ide", "sata", "scsi"]
elif disk == 'floppy': elif disk == "floppy":
data['bus'] = ['fdc'] data["bus"] = ["fdc"]
elif disk == 'lun': elif disk == "lun":
data['bus'] = ['scsi'] data["bus"] = ["scsi"]
except libvirtError: except libvirtError:
pass pass
@ -193,7 +204,7 @@ def get_compute_machine_types(request, compute_id, arch):
compute.password, compute.password,
compute.type, compute.type,
) )
data['machines'] = conn.get_machine_types(arch) data["machines"] = conn.get_machine_types(arch)
except libvirtError: except libvirtError:
pass pass
@ -217,7 +228,7 @@ def get_compute_video_models(request, compute_id, arch, machine):
compute.password, compute.password,
compute.type, compute.type,
) )
data['videos'] = conn.get_video_models(arch, machine) data["videos"] = conn.get_video_models(arch, machine)
except libvirtError: except libvirtError:
pass pass
@ -241,8 +252,8 @@ def get_dom_capabilities(request, compute_id, arch, machine):
compute.password, compute.password,
compute.type, compute.type,
) )
data['videos'] = 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) data["bus"] = conn.get_disk_device_types(arch, machine)
except libvirtError: except libvirtError:
pass pass

View file

@ -61,7 +61,7 @@ def console(request):
if console_type is None: if console_type is None:
console_error = "Fail to get console. Please check the console configuration of your VM." console_error = "Fail to get console. Please check the console configuration of your VM."
else: 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 = render(request, "console-vnc-lite.html", locals())
response.set_cookie("token", token) response.set_cookie("token", token)

View file

@ -8,7 +8,7 @@ from computes.models import Compute
from vrtManager.instance import wvmInstance from vrtManager.instance import wvmInstance
OS_VERSIONS = ['latest', ''] OS_VERSIONS = ["latest", ""]
OS_UUID = "iid-dswebvirtcloud" OS_UUID = "iid-dswebvirtcloud"
@ -17,7 +17,7 @@ def os_index(request):
:param request: :param request:
:return: :return:
""" """
response = '\n'.join(OS_VERSIONS) response = "\n".join(OS_VERSIONS)
return HttpResponse(response) return HttpResponse(response)
@ -28,13 +28,13 @@ def os_metadata_json(request, version):
:return: :return:
""" """
if version == 'latest': if version == "latest":
ip = get_client_ip(request) ip = get_client_ip(request)
hostname = get_hostname_by_ip(ip) hostname = get_hostname_by_ip(ip)
response = {'uuid': OS_UUID, 'hostname': hostname} response = {"uuid": OS_UUID, "hostname": hostname}
return HttpResponse(json.dumps(response)) return HttpResponse(json.dumps(response))
else: else:
err = f"Invalid version: {version}" err = "Invalid version: %(version)s" % {"version": version}
raise Http404(err) raise Http404(err)
@ -44,10 +44,10 @@ def os_userdata(request, version):
:param version: :param version:
:return: :return:
""" """
if version == 'latest': if version == "latest":
ip = get_client_ip(request) ip = get_client_ip(request)
hostname = get_hostname_by_ip(ip) hostname = get_hostname_by_ip(ip)
vname = hostname.split('.')[0] vname = hostname.split(".")[0]
instance_keys = [] instance_keys = []
userinstances = UserInstance.objects.filter(instance__name=vname) userinstances = UserInstance.objects.filter(instance__name=vname)
@ -57,9 +57,9 @@ def os_userdata(request, version):
for k in keys: for k in keys:
instance_keys.append(k.keypublic) instance_keys.append(k.keypublic)
return render(request, 'user_data', locals()) return render(request, "user_data", locals())
else: else:
err = f"Invalid version: {version}" err = "Invalid version: %(version)s" % {"version": version}
raise Http404(err) raise Http404(err)
@ -68,11 +68,11 @@ def get_client_ip(request):
:param request: :param request:
:return: :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: if x_forwarded_for:
ip = x_forwarded_for.split(',')[-1].strip() ip = x_forwarded_for.split(",")[-1].strip()
else: else:
ip = request.META.get('REMOTE_ADDR') ip = request.META.get("REMOTE_ADDR")
return ip return ip
@ -97,16 +97,12 @@ def get_vdi_url(request, compute_id, vname):
compute = get_object_or_404(Compute, pk=compute_id) compute = get_object_or_404(Compute, pk=compute_id)
try: try:
conn = wvmInstance(compute.hostname, conn = wvmInstance(compute.hostname, compute.login, compute.password, compute.type, vname)
compute.login,
compute.password,
compute.type,
vname)
fqdn = get_hostname_by_ip(compute.hostname) fqdn = get_hostname_by_ip(compute.hostname)
url = f"{conn.get_console_type()}://{fqdn}:{conn.get_console_port()}" url = f"{conn.get_console_type()}://{fqdn}:{conn.get_console_port()}"
response = url response = url
return HttpResponse(response) return HttpResponse(response)
except libvirtError: except libvirtError:
err = f"Error getting VDI URL for {vname}" err = "Error getting VDI URL for %(name)s" % {"name": vname}
raise Http404(err) raise Http404(err)

View file

@ -19,7 +19,7 @@
<div class="tab-content"> <div class="tab-content">
<div role="tabpanel" class="tab-pane tab-pane-bordered active" id="takesnapshot"> <div role="tabpanel" class="tab-pane tab-pane-bordered active" id="takesnapshot">
{% if instance.status == 5 %} {% if instance.status == 5 %}
<p>{% trans "This may take more than an hour, depending on how much content is on your droplet and how large the disk is." %}</p> <p>{% trans "This may take more than an hour, depending on how much content is on your instance and how large the disk is." %}</p>
<form action="{% url 'instances:snapshot' instance.id %}" class="form-inline" method="post" role="form" aria-label="Create snapshot form"> <form action="{% url 'instances:snapshot' instance.id %}" class="form-inline" method="post" role="form" aria-label="Create snapshot form">
{% csrf_token %} {% csrf_token %}
<div class="form-group row"> <div class="form-group row">

File diff suppressed because it is too large Load diff

View file

@ -26,19 +26,30 @@ def interfaces(request, compute_id):
try: try:
netdevs = conn.get_net_devices() netdevs = conn.get_net_devices()
except: except:
netdevs = ['eth0', 'eth1'] netdevs = ["eth0", "eth1"]
for iface in ifaces: for iface in ifaces:
ifaces_all.append(conn.get_iface_info(iface)) ifaces_all.append(conn.get_iface_info(iface))
if request.method == 'POST': if request.method == "POST":
if 'create' in request.POST: if "create" in request.POST:
form = AddInterface(request.POST) form = AddInterface(request.POST)
if form.is_valid(): if form.is_valid():
data = form.cleaned_data data = form.cleaned_data
conn.create_iface(data['name'], data['itype'], data['start_mode'], data['netdev'], data['ipv4_type'], conn.create_iface(
data['ipv4_addr'], data['ipv4_gw'], data['ipv6_type'], data['ipv6_addr'], data["name"],
data['ipv6_gw'], data['stp'], data['delay']) 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()) return HttpResponseRedirect(request.get_full_path())
else: else:
for msg_err in form.errors.values(): for msg_err in form.errors.values():
@ -47,7 +58,7 @@ def interfaces(request, compute_id):
except libvirtError as lib_err: except libvirtError as lib_err:
messages.error(request, lib_err) messages.error(request, lib_err)
return render(request, 'interfaces.html', locals()) return render(request, "interfaces.html", locals())
@superuser_only @superuser_only
@ -75,18 +86,18 @@ def interface(request, compute_id, iface):
bridge = conn.get_bridge() bridge = conn.get_bridge()
slave_ifaces = conn.get_bridge_slave_ifaces() slave_ifaces = conn.get_bridge_slave_ifaces()
if request.method == 'POST': if request.method == "POST":
if 'stop' in request.POST: if "stop" in request.POST:
conn.stop_iface() conn.stop_iface()
return HttpResponseRedirect(request.get_full_path()) return HttpResponseRedirect(request.get_full_path())
if 'start' in request.POST: if "start" in request.POST:
conn.start_iface() conn.start_iface()
return HttpResponseRedirect(request.get_full_path()) return HttpResponseRedirect(request.get_full_path())
if 'delete' in request.POST: if "delete" in request.POST:
conn.delete_iface() conn.delete_iface()
return HttpResponseRedirect(reverse('interfaces', args=[compute_id])) return HttpResponseRedirect(reverse("interfaces", args=[compute_id]))
conn.close() conn.close()
except libvirtError as lib_err: except libvirtError as lib_err:
messages.error(request, lib_err) messages.error(request, lib_err)
return render(request, 'interface.html', locals()) return render(request, "interface.html", locals())

View file

@ -30,35 +30,37 @@ def networks(request, compute_id):
compute.type, compute.type,
) )
networks = conn.get_networks_info() networks = conn.get_networks_info()
dhcp4 = netmask4 = gateway4 = '' dhcp4 = netmask4 = gateway4 = ""
dhcp6 = prefix6 = gateway6 = '' dhcp6 = prefix6 = gateway6 = ""
ipv4 = ipv6 = False ipv4 = ipv6 = False
if request.method == 'POST': if request.method == "POST":
if 'create' in request.POST: if "create" in request.POST:
form = AddNetPool(request.POST) form = AddNetPool(request.POST)
if form.is_valid(): if form.is_valid():
data = form.cleaned_data data = form.cleaned_data
if data['name'] in networks: if data["name"] in networks:
msg = _("Network pool name already in use") msg = _("Network pool name already in use")
messages.error(request, msg) messages.error(request, msg)
errors = True errors = True
if data['forward'] in ['bridge', 'macvtap'] and data['bridge_name'] == '': if data["forward"] in ["bridge", "macvtap"] and data["bridge_name"] == "":
messages.error(request, _('Please enter bridge/dev name')) messages.error(request, _("Please enter bridge/dev name"))
errors = True errors = True
if data['subnet']: if data["subnet"]:
ipv4 = True ipv4 = True
gateway4, netmask4, dhcp4 = network_size(data['subnet'], data['dhcp4']) gateway4, netmask4, dhcp4 = network_size(data["subnet"], data["dhcp4"])
if data['subnet6']: if data["subnet6"]:
ipv6 = True ipv6 = True
gateway6, prefix6, dhcp6 = network_size(data['subnet6'], data['dhcp6']) gateway6, prefix6, dhcp6 = network_size(data["subnet6"], data["dhcp6"])
if prefix6 != '64': if prefix6 != "64":
messages.error(request, _('For libvirt, the IPv6 network prefix must be /64')) messages.error(
request, _("For libvirt, the IPv6 network prefix must be /64")
)
errors = True errors = True
if not errors: if not errors:
conn.create_network( conn.create_network(
data['name'], data["name"],
data['forward'], data["forward"],
ipv4, ipv4,
gateway4, gateway4,
netmask4, netmask4,
@ -67,11 +69,13 @@ def networks(request, compute_id):
gateway6, gateway6,
prefix6, prefix6,
dhcp6, dhcp6,
data['bridge_name'], data["bridge_name"],
data['openvswitch'], data["openvswitch"],
data['fixed'], data["fixed"],
)
return HttpResponseRedirect(
reverse("network", args=[compute_id, data["name"]])
) )
return HttpResponseRedirect(reverse('network', args=[compute_id, data['name']]))
else: else:
for msg_err in form.errors.values(): for msg_err in form.errors.values():
messages.error(request, msg_err.as_text()) messages.error(request, msg_err.as_text())
@ -79,7 +83,7 @@ def networks(request, compute_id):
except libvirtError as lib_err: except libvirtError as lib_err:
messages.error(request, lib_err) messages.error(request, lib_err)
return render(request, 'networks.html', locals()) return render(request, "networks.html", locals())
@superuser_only @superuser_only
@ -128,112 +132,118 @@ def network(request, compute_id, pool):
xml = conn._XMLDesc(0) xml = conn._XMLDesc(0)
except libvirtError as lib_err: except libvirtError as lib_err:
messages.error(request, 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 request.method == "POST":
if 'start' in request.POST: if "start" in request.POST:
try: try:
conn.start() conn.start()
return HttpResponseRedirect(request.get_full_path()) return HttpResponseRedirect(request.get_full_path())
except libvirtError as lib_err: except libvirtError as lib_err:
messages.error(request, lib_err) messages.error(request, lib_err)
if 'stop' in request.POST: if "stop" in request.POST:
try: try:
conn.stop() conn.stop()
return HttpResponseRedirect(request.get_full_path()) return HttpResponseRedirect(request.get_full_path())
except libvirtError as lib_err: except libvirtError as lib_err:
messages.error(request, lib_err) messages.error(request, lib_err)
if 'delete' in request.POST: if "delete" in request.POST:
try: try:
conn.delete() conn.delete()
return HttpResponseRedirect(reverse('networks', args=[compute_id])) return HttpResponseRedirect(reverse("networks", args=[compute_id]))
except libvirtError as lib_err: except libvirtError as lib_err:
messages.error(request, lib_err) messages.error(request, lib_err)
if 'set_autostart' in request.POST: if "set_autostart" in request.POST:
try: try:
conn.set_autostart(1) conn.set_autostart(1)
return HttpResponseRedirect(request.get_full_path()) return HttpResponseRedirect(request.get_full_path())
except libvirtError as lib_err: except libvirtError as lib_err:
messages.error(request, lib_err) messages.error(request, lib_err)
if 'unset_autostart' in request.POST: if "unset_autostart" in request.POST:
try: try:
conn.set_autostart(0) conn.set_autostart(0)
return HttpResponseRedirect(request.get_full_path()) return HttpResponseRedirect(request.get_full_path())
except libvirtError as lib_err: except libvirtError as lib_err:
messages.error(request, lib_err) messages.error(request, lib_err)
if 'modify_fixed_address' in request.POST: if "modify_fixed_address" in request.POST:
name = request.POST.get('name', '') name = request.POST.get("name", "")
address = request.POST.get('address', '') address = request.POST.get("address", "")
family = request.POST.get('family', 'ipv4') family = request.POST.get("family", "ipv4")
if family == 'ipv4': if family == "ipv4":
mac_duid = request.POST.get('mac', '') mac_duid = request.POST.get("mac", "")
if family == 'ipv6': if family == "ipv6":
mac_duid = request.POST.get('id', '') mac_duid = request.POST.get("id", "")
try: try:
ret_val = conn.modify_fixed_address(name, address, mac_duid, family) 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()) return HttpResponseRedirect(request.get_full_path())
except libvirtError as lib_err: except libvirtError as lib_err:
messages.error(request, lib_err) messages.error(request, lib_err)
except ValueError as val_err: except ValueError as val_err:
messages.error(request, val_err) messages.error(request, val_err)
if 'delete_fixed_address' in request.POST: if "delete_fixed_address" in request.POST:
ip = request.POST.get('address', '') ip = request.POST.get("address", "")
family = request.POST.get('family', 'ipv4') family = request.POST.get("family", "ipv4")
conn.delete_fixed_address(ip, family) 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()) return HttpResponseRedirect(request.get_full_path())
if 'modify_dhcp_range' in request.POST: if "modify_dhcp_range" in request.POST:
range_start = request.POST.get('range_start', '') range_start = request.POST.get("range_start", "")
range_end = request.POST.get('range_end', '') range_end = request.POST.get("range_end", "")
family = request.POST.get('family', 'ipv4') family = request.POST.get("family", "ipv4")
try: try:
conn.modify_dhcp_range(range_start, range_end, family) 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()) return HttpResponseRedirect(request.get_full_path())
except libvirtError as lib_err: except libvirtError as lib_err:
messages.error(request, lib_err) messages.error(request, lib_err)
if 'edit_network' in request.POST: if "edit_network" in request.POST:
edit_xml = request.POST.get('edit_xml', '') edit_xml = request.POST.get("edit_xml", "")
if edit_xml: if edit_xml:
conn.edit_network(edit_xml) conn.edit_network(edit_xml)
if conn.is_active(): 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: else:
messages.success(request, _("Network XML is changed.")) messages.success(request, _("Network XML is changed."))
return HttpResponseRedirect(request.get_full_path()) return HttpResponseRedirect(request.get_full_path())
if 'set_qos' in request.POST: if "set_qos" in request.POST:
qos_dir = request.POST.get('qos_direction', '') qos_dir = request.POST.get("qos_direction", "")
average = request.POST.get('qos_average') or 0 average = request.POST.get("qos_average") or 0
peak = request.POST.get('qos_peak') or 0 peak = request.POST.get("qos_peak") or 0
burst = request.POST.get('qos_burst') or 0 burst = request.POST.get("qos_burst") or 0
try: try:
conn.set_qos(qos_dir, average, peak, burst) conn.set_qos(qos_dir, average, peak, burst)
if conn.is_active(): if conn.is_active():
messages.success( messages.success(
request, request,
_(f"{qos_dir.capitalize()} QoS is set. Network XML is changed.") + _("%(qos_dir)s QoS is updated. Network XML is changed. Stop and start network to activate new config") % {"qos_dir": qos_dir.capitalize()}
_("Stop and start network to activate new config")) )
else: 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: except libvirtError as lib_err:
messages.error(request, lib_err) messages.error(request, lib_err)
return HttpResponseRedirect(request.get_full_path()) return HttpResponseRedirect(request.get_full_path())
if 'unset_qos' in request.POST: if "unset_qos" in request.POST:
qos_dir = request.POST.get('qos_direction', '') qos_dir = request.POST.get("qos_direction", "")
conn.unset_qos(qos_dir) conn.unset_qos(qos_dir)
if conn.is_active(): if conn.is_active():
messages.success( messages.success(
request, request,
_(f"{qos_dir.capitalize()} QoS is deleted. Network XML is changed. ") + _("%(qos_dir)s QoS is deleted. Network XML is changed. Stop and start network to activate new config") % {"qos_dir": qos_dir.capitalize()}
_("Stop and start network to activate new config.")) )
else: 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()) return HttpResponseRedirect(request.get_full_path())
conn.close() conn.close()
return render(request, 'network.html', locals()) return render(request, "network.html", locals())

View file

@ -25,14 +25,14 @@ def nwfilters(request, compute_id):
try: try:
conn = wvmNWFilters(compute.hostname, compute.login, compute.password, compute.type) conn = wvmNWFilters(compute.hostname, compute.login, compute.password, compute.type)
if request.method == 'POST': if request.method == "POST":
if 'create_nwfilter' in request.POST: if "create_nwfilter" in request.POST:
xml = request.POST.get('nwfilter_xml', '') xml = request.POST.get("nwfilter_xml", "")
if xml: if xml:
try: try:
util.etree.fromstring(xml) util.etree.fromstring(xml)
name = util.get_xml_path(xml, '/filter/@name') name = util.get_xml_path(xml, "/filter/@name")
uuid = util.get_xml_path(xml, '/filter/uuid') uuid = util.get_xml_path(xml, "/filter/uuid")
except util.etree.ParseError: except util.etree.ParseError:
name = None name = None
@ -45,28 +45,32 @@ def nwfilters(request, compute_id):
raise Exception(error_msg) raise Exception(error_msg)
else: else:
try: try:
msg = _("Creating NWFilter: %s" % name) msg = _("%(filter)s network filter is created") % {"filter": name}
conn.create_nwfilter(xml) conn.create_nwfilter(xml)
addlogmsg(request.user.username, compute.hostname, msg) addlogmsg(request.user.username, compute.hostname, msg)
except libvirtError as lib_err: except libvirtError as lib_err:
messages.error(request, lib_err) messages.error(request, lib_err)
addlogmsg(request.user.username, compute.hostname, lib_err) addlogmsg(request.user.username, compute.hostname, lib_err)
if 'del_nwfilter' in request.POST: if "del_nwfilter" in request.POST:
name = request.POST.get('nwfiltername', '') name = request.POST.get("nwfiltername", "")
msg = _(f"Deleting NWFilter: {name}") msg = _("%(filter)s network filter is deleted") % {"filter": name}
in_use = False in_use = False
nwfilter = conn.get_nwfilter(name) 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() instances = is_conn.get_instances()
for inst in 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() dom_filterrefs = i_conn.get_filterrefs()
if name in dom_filterrefs: if name in dom_filterrefs:
in_use = True 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) messages.error(request, msg)
addlogmsg(request.user.username, compute.hostname, msg) addlogmsg(request.user.username, compute.hostname, msg)
i_conn.close() i_conn.close()
@ -77,13 +81,13 @@ def nwfilters(request, compute_id):
nwfilter.undefine() nwfilter.undefine()
addlogmsg(request.user.username, compute.hostname, msg) addlogmsg(request.user.username, compute.hostname, msg)
if 'cln_nwfilter' in request.POST: if "cln_nwfilter" in request.POST:
name = request.POST.get('nwfiltername', '') name = request.POST.get("nwfiltername", "")
cln_name = request.POST.get('cln_name', name + '-clone') cln_name = request.POST.get("cln_name", name + "-clone")
conn.clone_nwfilter(name, cln_name) 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) addlogmsg(request.user.username, compute.hostname, msg)
for nwf in conn.get_nwfilters(): for nwf in conn.get_nwfilters():
@ -97,10 +101,14 @@ def nwfilters(request, compute_id):
messages.error(request, err) messages.error(request, err)
addlogmsg(request.user.username, compute.hostname, err) addlogmsg(request.user.username, compute.hostname, err)
return render(request, 'nwfilters.html', { return render(
'nwfilters': nwfilters_all, request,
'compute': compute, "nwfilters.html",
}) {
"nwfilters": nwfilters_all,
"compute": compute,
},
)
def nwfilter(request, compute_id, nwfltr): 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) compute = get_object_or_404(Compute, pk=compute_id)
try: 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) conn = wvmNWFilters(compute.hostname, compute.login, compute.password, compute.type)
for nwf in conn.get_nwfilters(): for nwf in conn.get_nwfilters():
@ -126,10 +136,10 @@ def nwfilter(request, compute_id, nwfltr):
rules = nwfilter.get_rules() rules = nwfilter.get_rules()
refs = nwfilter.get_filter_refs() refs = nwfilter.get_filter_refs()
if request.method == 'POST': if request.method == "POST":
if 'edit_nwfilter' in request.POST: if "edit_nwfilter" in request.POST:
new_xml = request.POST.get('edit_xml', '') new_xml = request.POST.get("edit_xml", "")
if new_xml: if new_xml:
nwfilter.delete() nwfilter.delete()
@ -139,10 +149,10 @@ def nwfilter(request, compute_id, nwfltr):
conn.create_nwfilter(xml) conn.create_nwfilter(xml)
raise libvirtError(lib_err) raise libvirtError(lib_err)
if 'del_nwfilter_rule' in request.POST: if "del_nwfilter_rule" in request.POST:
action = request.POST.get('action', '') action = request.POST.get("action", "")
direction = request.POST.get('direction', '') direction = request.POST.get("direction", "")
priority = request.POST.get('priority', '') priority = request.POST.get("priority", "")
new_xml = nwfilter.delete_rule(action, direction, priority) new_xml = nwfilter.delete_rule(action, direction, priority)
nwfilter.delete() nwfilter.delete()
@ -152,8 +162,8 @@ def nwfilter(request, compute_id, nwfltr):
conn.create_nwfilter(xml) conn.create_nwfilter(xml)
raise libvirtError(lib_err) raise libvirtError(lib_err)
if 'del_nwfilter_ref' in request.POST: if "del_nwfilter_ref" in request.POST:
ref_name = request.POST.get('ref') ref_name = request.POST.get("ref")
new_xml = nwfilter.delete_ref(ref_name) new_xml = nwfilter.delete_ref(ref_name)
nwfilter.delete() nwfilter.delete()
try: try:
@ -162,8 +172,8 @@ def nwfilter(request, compute_id, nwfltr):
conn.create_nwfilter(xml) conn.create_nwfilter(xml)
raise libvirtError(lib_err) raise libvirtError(lib_err)
if 'add_nwfilter_rule' in request.POST: if "add_nwfilter_rule" in request.POST:
rule_xml = request.POST.get('nwfilterrule_xml', '') rule_xml = request.POST.get("nwfilterrule_xml", "")
if not rule_xml: if not rule_xml:
return HttpResponseRedirect(request.get_full_path()) return HttpResponseRedirect(request.get_full_path())
new_xml = nwfilter.add_rule(rule_xml) new_xml = nwfilter.add_rule(rule_xml)
@ -174,8 +184,8 @@ def nwfilter(request, compute_id, nwfltr):
conn.create_nwfilter(xml) conn.create_nwfilter(xml)
raise libvirtError(lib_err) raise libvirtError(lib_err)
if 'add_nwfilter_ref' in request.POST: if "add_nwfilter_ref" in request.POST:
ref_name = request.POST.get('nwfilters_select', '') ref_name = request.POST.get("nwfilters_select", "")
if not ref_name: if not ref_name:
return HttpResponseRedirect(request.get_full_path()) return HttpResponseRedirect(request.get_full_path())
new_xml = nwfilter.add_ref(ref_name) new_xml = nwfilter.add_ref(ref_name)
@ -194,4 +204,4 @@ def nwfilter(request, compute_id, nwfltr):
except Exception as error_msg: except Exception as error_msg:
messages.error(request, error_msg) messages.error(request, error_msg)
return render(request, 'nwfilter.html', locals()) return render(request, "nwfilter.html", locals())

View file

@ -5,8 +5,14 @@ from computes.models import Compute
from django.contrib import messages from django.contrib import messages
from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404, render 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, from libvirt import (
VIR_SECRET_USAGE_TYPE_TLS, VIR_SECRET_USAGE_TYPE_VOLUME, libvirtError) 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 from vrtManager.secrets import wvmSecrets
@ -38,34 +44,36 @@ def secrets(request, compute_id):
secrt_value = conn.get_secret_value(uuid) secrt_value = conn.get_secret_value(uuid)
except libvirtError as lib_err: except libvirtError as lib_err:
secrt_value = None secrt_value = None
secrets_all.append({ secrets_all.append(
'usage': secrt.usageID(), {
'uuid': secrt.UUIDString(), "usage": secrt.usageID(),
'usageType': secret_usage_types[secrt.usageType()], "uuid": secrt.UUIDString(),
'value': secrt_value "usageType": secret_usage_types[secrt.usageType()],
}) "value": secrt_value,
if request.method == 'POST': }
if 'create' in request.POST: )
if request.method == "POST":
if "create" in request.POST:
form = AddSecret(request.POST) form = AddSecret(request.POST)
if form.is_valid(): if form.is_valid():
data = form.cleaned_data data = form.cleaned_data
conn.create_secret( conn.create_secret(
data['ephemeral'], data["ephemeral"],
data['private'], data["private"],
data['usage_type'], data["usage_type"],
data['data'], data["data"],
) )
return HttpResponseRedirect(request.get_full_path()) return HttpResponseRedirect(request.get_full_path())
else: else:
for msg_err in form.errors.values(): for msg_err in form.errors.values():
messages.error(request, msg_err.as_text()) messages.error(request, msg_err.as_text())
if 'delete' in request.POST: if "delete" in request.POST:
uuid = request.POST.get('uuid', '') uuid = request.POST.get("uuid", "")
conn.delete_secret(uuid) conn.delete_secret(uuid)
return HttpResponseRedirect(request.get_full_path()) return HttpResponseRedirect(request.get_full_path())
if 'set_value' in request.POST: if "set_value" in request.POST:
uuid = request.POST.get('uuid', '') uuid = request.POST.get("uuid", "")
value = request.POST.get('value', '') value = request.POST.get("value", "")
try: try:
conn.set_secret_value(uuid, value) conn.set_secret_value(uuid, value)
except Exception as err: except Exception as err:
@ -74,4 +82,4 @@ def secrets(request, compute_id):
except libvirtError as err: except libvirtError as err:
messages.error(request, err) messages.error(request, err)
return render(request, 'secrets.html', locals()) return render(request, "secrets.html", locals())

View file

@ -31,34 +31,54 @@ def storages(request, compute_id):
storages = conn.get_storages_info() storages = conn.get_storages_info()
secrets = conn.get_secrets() secrets = conn.get_secrets()
if request.method == 'POST': if request.method == "POST":
if 'create' in request.POST: if "create" in request.POST:
form = AddStgPool(request.POST) form = AddStgPool(request.POST)
if form.is_valid(): if form.is_valid():
data = form.cleaned_data data = form.cleaned_data
if data['name'] in storages: if data["name"] in storages:
msg = _("Pool name already use") msg = _("Pool name already use")
messages.error(request, msg) messages.error(request, msg)
errors = True errors = True
if data['stg_type'] == 'rbd': if data["stg_type"] == "rbd":
if not data['secret']: if not data["secret"]:
msg = _("You need create secret for pool") msg = _("You need create secret for pool")
messages.error(request, msg) messages.error(request, msg)
errors = True 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") msg = _("You need input all fields for creating ceph pool")
messages.error(request, msg) messages.error(request, msg)
errors = True errors = True
if not errors: if not errors:
if data['stg_type'] == 'rbd': if data["stg_type"] == "rbd":
conn.create_storage_ceph(data['stg_type'], data['name'], data['ceph_pool'], data['ceph_host'], conn.create_storage_ceph(
data['ceph_user'], data['secret']) data["stg_type"],
elif data['stg_type'] == 'netfs': data["name"],
conn.create_storage_netfs(data['stg_type'], data['name'], data['netfs_host'], data['source'], data["ceph_pool"],
data['source_format'], data['target']) 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: else:
conn.create_storage(data['stg_type'], data['name'], data['source'], data['target']) conn.create_storage(
return HttpResponseRedirect(reverse('storage', args=[compute_id, data['name']])) data["stg_type"], data["name"], data["source"], data["target"]
)
return HttpResponseRedirect(
reverse("storage", args=[compute_id, data["name"]])
)
else: else:
for msg_err in form.errors.values(): for msg_err in form.errors.values():
messages.error(request, msg_err.as_text()) messages.error(request, msg_err.as_text())
@ -66,7 +86,7 @@ def storages(request, compute_id):
except libvirtError as lib_err: except libvirtError as lib_err:
messages.error(request, lib_err) messages.error(request, lib_err)
return render(request, 'storages.html', locals()) return render(request, "storages.html", locals())
@superuser_only @superuser_only
@ -77,9 +97,10 @@ def storage(request, compute_id, pool):
:param pool: :param pool:
:return: :return:
""" """
def handle_uploaded_file(path, f_name): def handle_uploaded_file(path, f_name):
target = path + '/' + str(f_name) target = path + "/" + str(f_name)
destination = open(target, 'wb+') destination = open(target, "wb+")
for chunk in f_name.chunks(): for chunk in f_name.chunks():
destination.write(chunk) destination.write(chunk)
destination.close() destination.close()
@ -93,7 +114,7 @@ def storage(request, compute_id, pool):
storages = conn.get_storages() storages = conn.get_storages()
state = conn.is_active() state = conn.is_active()
size, free = conn.get_size() size, free = conn.get_size()
used = (size - free) used = size - free
if state: if state:
percent = (used * 100) // size percent = (used * 100) // size
else: else:
@ -109,55 +130,57 @@ def storage(request, compute_id, pool):
else: else:
volumes = None volumes = None
if request.method == 'POST': if request.method == "POST":
if 'start' in request.POST: if "start" in request.POST:
conn.start() conn.start()
return HttpResponseRedirect(request.get_full_path()) return HttpResponseRedirect(request.get_full_path())
if 'stop' in request.POST: if "stop" in request.POST:
conn.stop() conn.stop()
return HttpResponseRedirect(request.get_full_path()) return HttpResponseRedirect(request.get_full_path())
if 'delete' in request.POST: if "delete" in request.POST:
conn.delete() conn.delete()
return HttpResponseRedirect(reverse('storages', args=[compute_id])) return HttpResponseRedirect(reverse("storages", args=[compute_id]))
if 'set_autostart' in request.POST: if "set_autostart" in request.POST:
conn.set_autostart(1) conn.set_autostart(1)
return HttpResponseRedirect(request.get_full_path()) return HttpResponseRedirect(request.get_full_path())
if 'unset_autostart' in request.POST: if "unset_autostart" in request.POST:
conn.set_autostart(0) conn.set_autostart(0)
return HttpResponseRedirect(request.get_full_path()) return HttpResponseRedirect(request.get_full_path())
if 'del_volume' in request.POST: if "del_volume" in request.POST:
volname = request.POST.get('volname', '') volname = request.POST.get("volname", "")
vol = conn.get_volume(volname) vol = conn.get_volume(volname)
vol.delete(0) vol.delete(0)
messages.success(request, _(f"Volume: {volname} is deleted.")) messages.success(request, _("Volume: %(volume)s is deleted.") % {"vol": volname})
return redirect(reverse('storage', args=[compute.id, pool])) return redirect(reverse("storage", args=[compute.id, pool]))
# return HttpResponseRedirect(request.get_full_path()) # return HttpResponseRedirect(request.get_full_path())
if 'iso_upload' in request.POST: if "iso_upload" in request.POST:
if str(request.FILES['file']) in conn.update_volumes(): if str(request.FILES["file"]) in conn.update_volumes():
error_msg = _("ISO image already exist") error_msg = _("ISO image already exist")
messages.error(request, error_msg) messages.error(request, error_msg)
else: else:
handle_uploaded_file(path, request.FILES['file']) handle_uploaded_file(path, request.FILES["file"])
messages.success(request, _(f"ISO: {request.FILES['file']} is uploaded.")) messages.success(request, _("ISO: %(file)s is uploaded.") % {"file": request.FILES['file']})
return HttpResponseRedirect(request.get_full_path()) return HttpResponseRedirect(request.get_full_path())
if 'cln_volume' in request.POST: if "cln_volume" in request.POST:
form = CloneImage(request.POST) form = CloneImage(request.POST)
if form.is_valid(): if form.is_valid():
data = form.cleaned_data data = form.cleaned_data
img_name = data['name'] img_name = data["name"]
meta_prealloc = 0 meta_prealloc = 0
if img_name in conn.update_volumes(): if img_name in conn.update_volumes():
msg = _("Name of volume already in use") msg = _("Name of volume already in use")
messages.error(request, msg) messages.error(request, msg)
if data['convert']: if data["convert"]:
format = data['format'] format = data["format"]
if data['meta_prealloc'] and data['format'] == 'qcow2': if data["meta_prealloc"] and data["format"] == "qcow2":
meta_prealloc = True meta_prealloc = True
else: else:
format = None format = None
try: try:
name = conn.clone_volume(data['image'], data['name'], format, meta_prealloc) name = conn.clone_volume(data["image"], data["name"], format, meta_prealloc)
messages.success(request, _(f"{data['image']} image cloned as {name} successfully")) messages.success(
request, _("%(image)s image cloned as %(clone)s successfully") % {"image": data['image'], "name": name}
)
return HttpResponseRedirect(request.get_full_path()) return HttpResponseRedirect(request.get_full_path())
except libvirtError as lib_err: except libvirtError as lib_err:
messages.error(request, lib_err) messages.error(request, lib_err)
@ -167,11 +190,17 @@ def storage(request, compute_id, pool):
conn.close() conn.close()
return render(request, 'storage.html', locals()) return render(request, "storage.html", locals())
@superuser_only @superuser_only
def create_volume(request, compute_id, pool): 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) compute = get_object_or_404(Compute, pk=compute_id)
meta_prealloc = False meta_prealloc = False
@ -182,26 +211,26 @@ def create_volume(request, compute_id, pool):
form = CreateVolumeForm(request.POST or None) form = CreateVolumeForm(request.POST or None)
if form.is_valid(): if form.is_valid():
data = form.cleaned_data data = form.cleaned_data
if data['meta_prealloc'] and data['format'] == 'qcow2': if data["meta_prealloc"] and data["format"] == "qcow2":
meta_prealloc = True meta_prealloc = True
disk_owner_uid = int(app_settings.INSTANCE_VOLUME_DEFAULT_OWNER_UID) disk_owner_uid = int(app_settings.INSTANCE_VOLUME_DEFAULT_OWNER_UID)
disk_owner_gid = int(app_settings.INSTANCE_VOLUME_DEFAULT_OWNER_GID) disk_owner_gid = int(app_settings.INSTANCE_VOLUME_DEFAULT_OWNER_GID)
name = conn.create_volume( name = conn.create_volume(
data['name'], data["name"],
data['size'], data["size"],
data['format'], data["format"],
meta_prealloc, meta_prealloc,
disk_owner_uid, disk_owner_uid,
disk_owner_gid, 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: else:
for msg_err in form.errors.values(): for msg_err in form.errors.values():
messages.error(request, msg_err.as_text()) 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): def get_volumes(request, compute_id, pool):
@ -216,7 +245,7 @@ def get_volumes(request, compute_id, pool):
try: try:
conn = wvmStorage(compute.hostname, compute.login, compute.password, compute.type, pool) conn = wvmStorage(compute.hostname, compute.login, compute.password, compute.type, pool)
conn.refresh() conn.refresh()
data['vols'] = sorted(conn.get_volumes()) data["vols"] = sorted(conn.get_volumes())
except libvirtError: except libvirtError:
pass pass
return HttpResponse(json.dumps(data)) return HttpResponse(json.dumps(data))

View file

@ -1380,9 +1380,9 @@ class wvmInstance(wvmConnect):
elif net_source_type == 'iface': elif net_source_type == 'iface':
source.set('dev', net_source) source.set('dev', net_source)
else: else:
raise libvirtError(f"Unknown network type: {net_source_type}") raise libvirtError("Unknown network type: {}".format(net_source_type))
else: else:
raise libvirtError(f"Unknown network type: {interface.get('type')}") raise libvirtError("Unknown network type: {}".format(interface.get('type')))
source = interface.find('model') source = interface.find('model')
if net_model != 'default': if net_model != 'default':

View file

@ -363,7 +363,7 @@ class wvmNetwork(wvmConnect):
self.leases = self.net.DHCPLeases() self.leases = self.net.DHCPLeases()
except Exception as e: except Exception as e:
self.leases = [] self.leases = []
raise f"Error getting {self} DHCP leases: {e}" raise "Error getting {} DHCP leases: {}".format(self, e)
def get_dhcp_leases(self): def get_dhcp_leases(self):
if self.leases is None: if self.leases is None:

View file

@ -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) form = re.match("^([0-9a-fA-F]{1,2}:){5}[0-9a-fA-F]{1,2}$", val)
if form is None: 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 # Mapping of UEFI binary names to their associated architectures. We

View file

@ -15,7 +15,7 @@ class ExceptionMiddleware:
if isinstance(exception, libvirtError): if isinstance(exception, libvirtError):
messages.error( messages.error(
request, request,
_('libvirt Error - %(exception)s') % {'exception': exception}, _("libvirt Error - %(exception)s") % {"exception": exception},
) )
return render(request, '500.html', status=500) return render(request, '500.html', status=500)
# TODO: check connecting to host via VPN # TODO: check connecting to host via VPN