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
# 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,

View file

@ -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)

View file

@ -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"))

View file

@ -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())

View file

@ -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

View file

@ -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)

View file

@ -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)

View file

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

File diff suppressed because it is too large Load diff

View file

@ -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())

View file

@ -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())

View file

@ -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())

View file

@ -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())

View file

@ -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))

View file

@ -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':

View file

@ -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:

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)
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

View file

@ -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