1
0
Fork 0
mirror of https://github.com/retspen/webvirtcloud synced 2025-07-31 12:41:08 +00:00

format python code with black

This commit is contained in:
catborise 2022-11-02 08:54:35 +03:00
parent ea409ca863
commit 217e106c8b
55 changed files with 2510 additions and 1454 deletions

View file

@ -1,4 +1,3 @@
from rest_framework import serializers
from computes.models import Compute
from vrtManager.connection import (
@ -10,18 +9,17 @@ from vrtManager.connection import (
class ComputeSerializer(serializers.ModelSerializer):
# Use <input type="password"> for the input.
password = serializers.CharField(style={'input_type': 'password'})
# Use <input type="password"> for the input.
password = serializers.CharField(style={"input_type": "password"})
# Use a radio input instead of a select input.
conn_types = (
(CONN_SSH, 'SSH'),
(CONN_TCP, 'TCP'),
(CONN_TLS, 'TLS'),
(CONN_SOCKET, 'SOCK'),
(CONN_SSH, "SSH"),
(CONN_TCP, "TCP"),
(CONN_TLS, "TLS"),
(CONN_SOCKET, "SOCK"),
)
type = serializers.ChoiceField(choices=conn_types)
class Meta:
model = Compute
fields = ['id', 'name', 'hostname', 'login', 'password', 'type', 'details']
fields = ["id", "name", "hostname", "login", "password", "type", "details"]

View file

@ -11,13 +11,13 @@ class ComputeViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows computes to be viewed or edited.
"""
queryset = Compute.objects.all().order_by('name')
queryset = Compute.objects.all().order_by("name")
serializer_class = ComputeSerializer
permission_classes = [permissions.IsAuthenticated]
class ComputeArchitecturesView(viewsets.ViewSet):
def list(self, request, compute_pk=None):
"""
Return a list of supported host architectures.
@ -43,7 +43,6 @@ class ComputeArchitecturesView(viewsets.ViewSet):
class ComputeMachinesView(viewsets.ViewSet):
def list(self, request, compute_pk=None, archs_pk=None):
"""
Return a list of supported host architectures.

View file

@ -13,8 +13,8 @@ class TcpComputeForm(forms.ModelForm):
class Meta:
model = Compute
widgets = {'password': forms.PasswordInput()}
fields = '__all__'
widgets = {"password": forms.PasswordInput()}
fields = "__all__"
class SshComputeForm(forms.ModelForm):
@ -23,7 +23,7 @@ class SshComputeForm(forms.ModelForm):
class Meta:
model = Compute
exclude = ['password']
exclude = ["password"]
class TlsComputeForm(forms.ModelForm):
@ -32,14 +32,14 @@ class TlsComputeForm(forms.ModelForm):
class Meta:
model = Compute
widgets = {'password': forms.PasswordInput()}
fields = '__all__'
widgets = {"password": forms.PasswordInput()}
fields = "__all__"
class SocketComputeForm(forms.ModelForm):
hostname = forms.CharField(widget=forms.HiddenInput, initial='localhost')
hostname = forms.CharField(widget=forms.HiddenInput, initial="localhost")
type = forms.IntegerField(widget=forms.HiddenInput, initial=CONN_SOCKET)
class Meta:
model = Compute
fields = ['name', 'details', 'hostname', 'type']
fields = ["name", "details", "hostname", "type"]

View file

@ -8,11 +8,11 @@ from vrtManager.hostdetails import wvmHostDetails
class Compute(Model):
name = CharField(_('name'), max_length=64, unique=True)
hostname = CharField(_('hostname'), max_length=64)
login = CharField(_('login'), max_length=20)
password = CharField(_('password'), max_length=14, blank=True, null=True)
details = CharField(_('details'), max_length=64, null=True, blank=True)
name = CharField(_("name"), max_length=64, unique=True)
hostname = CharField(_("hostname"), max_length=64)
login = CharField(_("login"), max_length=20)
password = CharField(_("password"), max_length=14, blank=True, null=True)
details = CharField(_("details"), max_length=64, null=True, blank=True)
type = IntegerField()
@cached_property
@ -55,7 +55,7 @@ class Compute(Model):
@cached_property
def ram_usage(self):
return self.proxy.get_memory_usage()['percent']
return self.proxy.get_memory_usage()["percent"]
def __str__(self):
return self.name

View file

@ -7,115 +7,121 @@ from .models import Compute
class ComputesTestCase(TestCase):
def setUp(self):
self.client.login(username='admin', password='admin')
self.client.login(username="admin", password="admin")
Compute(
name='local',
hostname='localhost',
login='',
password='',
details='local',
name="local",
hostname="localhost",
login="",
password="",
details="local",
type=4,
).save()
def test_index(self):
response = self.client.get(reverse('computes'))
response = self.client.get(reverse("computes"))
self.assertEqual(response.status_code, 200)
def test_create_update_delete(self):
response = self.client.get(reverse('add_socket_host'))
response = self.client.get(reverse("add_socket_host"))
self.assertEqual(response.status_code, 200)
response = self.client.post(
reverse('add_socket_host'),
reverse("add_socket_host"),
{
'name': 'l1',
'details': 'Created',
'hostname': 'localhost',
'type': 4,
"name": "l1",
"details": "Created",
"hostname": "localhost",
"type": 4,
},
)
self.assertRedirects(response, reverse('computes'))
self.assertRedirects(response, reverse("computes"))
compute = Compute.objects.get(pk=2)
self.assertEqual(compute.name, 'l1')
self.assertEqual(compute.details, 'Created')
self.assertEqual(compute.name, "l1")
self.assertEqual(compute.details, "Created")
response = self.client.get(reverse('compute_update', args=[2]))
response = self.client.get(reverse("compute_update", args=[2]))
self.assertEqual(response.status_code, 200)
response = self.client.post(
reverse('compute_update', args=[2]),
reverse("compute_update", args=[2]),
{
'name': 'l2',
'details': 'Updated',
'hostname': 'localhost',
'type': 4,
"name": "l2",
"details": "Updated",
"hostname": "localhost",
"type": 4,
},
)
self.assertRedirects(response, reverse('computes'))
self.assertRedirects(response, reverse("computes"))
compute = Compute.objects.get(pk=2)
self.assertEqual(compute.name, 'l2')
self.assertEqual(compute.details, 'Updated')
self.assertEqual(compute.name, "l2")
self.assertEqual(compute.details, "Updated")
response = self.client.get(reverse('compute_delete', args=[2]))
response = self.client.get(reverse("compute_delete", args=[2]))
self.assertEqual(response.status_code, 200)
response = self.client.post(reverse('compute_delete', args=[2]))
self.assertRedirects(response, reverse('computes'))
response = self.client.post(reverse("compute_delete", args=[2]))
self.assertRedirects(response, reverse("computes"))
with self.assertRaises(ObjectDoesNotExist):
Compute.objects.get(id=2)
def test_overview(self):
response = self.client.get(reverse('overview', args=[1]))
response = self.client.get(reverse("overview", args=[1]))
self.assertEqual(response.status_code, 200)
def test_graph(self):
response = self.client.get(reverse('compute_graph', args=[1]))
response = self.client.get(reverse("compute_graph", args=[1]))
self.assertEqual(response.status_code, 200)
def test_instances(self):
response = self.client.get(reverse('instances', args=[1]))
response = self.client.get(reverse("instances", args=[1]))
self.assertEqual(response.status_code, 200)
def test_storages(self):
response = self.client.get(reverse('storages', args=[1]))
response = self.client.get(reverse("storages", args=[1]))
self.assertEqual(response.status_code, 200)
def test_storage(self):
pass
def test_default_storage_volumes(self):
response = self.client.get(reverse('volumes', kwargs={'compute_id': 1, 'pool': 'default'}))
response = self.client.get(
reverse("volumes", kwargs={"compute_id": 1, "pool": "default"})
)
self.assertEqual(response.status_code, 200)
def test_default_storage(self):
response = self.client.get(reverse('storage', kwargs={'compute_id': 1, 'pool': 'default'}))
response = self.client.get(
reverse("storage", kwargs={"compute_id": 1, "pool": "default"})
)
self.assertEqual(response.status_code, 200)
def test_networks(self):
response = self.client.get(reverse('networks', args=[1]))
response = self.client.get(reverse("networks", args=[1]))
self.assertEqual(response.status_code, 200)
def test_default_network(self):
response = self.client.get(reverse('network', kwargs={'compute_id': 1, 'pool': 'default'}))
response = self.client.get(
reverse("network", kwargs={"compute_id": 1, "pool": "default"})
)
self.assertEqual(response.status_code, 200)
def test_interfaces(self):
response = self.client.get(reverse('interfaces', args=[1]))
response = self.client.get(reverse("interfaces", args=[1]))
self.assertEqual(response.status_code, 200)
# TODO: add test for single interface
def test_nwfilters(self):
response = self.client.get(reverse('nwfilters', args=[1]))
response = self.client.get(reverse("nwfilters", args=[1]))
self.assertEqual(response.status_code, 200)
# TODO: add test for single nwfilter
def test_secrets(self):
response = self.client.get(reverse('virtsecrets', args=[1]))
response = self.client.get(reverse("virtsecrets", args=[1]))
self.assertEqual(response.status_code, 200)
# def test_create_instance_select_type(self):
@ -125,19 +131,29 @@ class ComputesTestCase(TestCase):
# TODO: create_instance
def test_machines(self):
response = self.client.get(reverse('machines', kwargs={'compute_id': 1, 'arch': 'x86_64'}))
response = self.client.get(
reverse("machines", kwargs={"compute_id": 1, "arch": "x86_64"})
)
self.assertEqual(response.status_code, 200)
def test_compute_disk_buses(self):
response = self.client.get(
reverse('buses', kwargs={
'compute_id': 1,
'arch': 'x86_64',
'machine': 'pc',
'disk': 'disk',
}))
reverse(
"buses",
kwargs={
"compute_id": 1,
"arch": "x86_64",
"machine": "pc",
"disk": "disk",
},
)
)
self.assertEqual(response.status_code, 200)
def test_dom_capabilities(self):
response = self.client.get(reverse('domcaps', kwargs={'compute_id': 1, 'arch': 'x86_64', 'machine': 'pc'}))
response = self.client.get(
reverse(
"domcaps", kwargs={"compute_id": 1, "arch": "x86_64", "machine": "pc"}
)
)
self.assertEqual(response.status_code, 200)

View file

@ -9,36 +9,71 @@ from storages.views import create_volume, get_volumes, storage, storages
from . import forms, views
urlpatterns = [
path('', views.computes, name='computes'),
path('add_tcp_host/', views.compute_create, {'FormClass': forms.TcpComputeForm}, name='add_tcp_host'),
path('add_ssh_host/', views.compute_create, {'FormClass': forms.SshComputeForm}, name='add_ssh_host'),
path('add_tls_host/', views.compute_create, {'FormClass': forms.TlsComputeForm}, name='add_tls_host'),
path('add_socket_host/', views.compute_create, {'FormClass': forms.SocketComputeForm}, name='add_socket_host'),
path("", views.computes, name="computes"),
path(
'<int:compute_id>/',
include([
path('', views.overview, name='overview'),
path('update/', views.compute_update, name='compute_update'),
path('delete/', views.compute_delete, name='compute_delete'),
path('statistics', views.compute_graph, name='compute_graph'),
path('instances/', views.instances, name='instances'),
path('storages/', storages, name='storages'),
path('storage/<str:pool>/volumes/', get_volumes, name='volumes'),
path('storage/<str:pool>/', storage, name='storage'),
path('storage/<str:pool>/create_volume/', create_volume, name='create_volume'),
path('networks/', networks, name='networks'),
path('network/<str:pool>/', network, name='network'),
path('interfaces/', interfaces, name='interfaces'),
path('interface/<str:iface>/', interface, name='interface'),
path('nwfilters/', nwfilters, name='nwfilters'),
path('nwfilter/<str:nwfltr>/', nwfilter, name='nwfilter'),
path('virtsecrets/', secrets, name='virtsecrets'),
path('archs/<str:arch>/machines/', views.get_compute_machine_types, name='machines'),
path(
'archs/<str:arch>/machines/<str:machine>/disks/<str:disk>/buses/',
views.get_compute_disk_buses,
name='buses',
),
path('archs/<str:arch>/machines/<str:machine>/capabilities/', views.get_dom_capabilities, name='domcaps'),
])),
"add_tcp_host/",
views.compute_create,
{"FormClass": forms.TcpComputeForm},
name="add_tcp_host",
),
path(
"add_ssh_host/",
views.compute_create,
{"FormClass": forms.SshComputeForm},
name="add_ssh_host",
),
path(
"add_tls_host/",
views.compute_create,
{"FormClass": forms.TlsComputeForm},
name="add_tls_host",
),
path(
"add_socket_host/",
views.compute_create,
{"FormClass": forms.SocketComputeForm},
name="add_socket_host",
),
path(
"<int:compute_id>/",
include(
[
path("", views.overview, name="overview"),
path("update/", views.compute_update, name="compute_update"),
path("delete/", views.compute_delete, name="compute_delete"),
path("statistics", views.compute_graph, name="compute_graph"),
path("instances/", views.instances, name="instances"),
path("storages/", storages, name="storages"),
path("storage/<str:pool>/volumes/", get_volumes, name="volumes"),
path("storage/<str:pool>/", storage, name="storage"),
path(
"storage/<str:pool>/create_volume/",
create_volume,
name="create_volume",
),
path("networks/", networks, name="networks"),
path("network/<str:pool>/", network, name="network"),
path("interfaces/", interfaces, name="interfaces"),
path("interface/<str:iface>/", interface, name="interface"),
path("nwfilters/", nwfilters, name="nwfilters"),
path("nwfilter/<str:nwfltr>/", nwfilter, name="nwfilter"),
path("virtsecrets/", secrets, name="virtsecrets"),
path(
"archs/<str:arch>/machines/",
views.get_compute_machine_types,
name="machines",
),
path(
"archs/<str:arch>/machines/<str:machine>/disks/<str:disk>/buses/",
views.get_compute_disk_buses,
name="buses",
),
path(
"archs/<str:arch>/machines/<str:machine>/capabilities/",
views.get_dom_capabilities,
name="domcaps",
),
]
),
),
]

View file

@ -9,7 +9,7 @@ def refresh_instance_database(compute):
Instance.objects.filter(compute=compute).exclude(name__in=domain_names).delete()
Instance.objects.filter(compute=compute).exclude(uuid__in=domain_uuids).delete()
# Create instances that're on host but not in DB
names = Instance.objects.filter(compute=compute).values_list('name', flat=True)
names = Instance.objects.filter(compute=compute).values_list("name", flat=True)
for domain in domains:
if domain.name() not in names:
Instance(compute=compute, name=domain.name(), uuid=domain.UUIDString()).save()
Instance( compute=compute, name=domain.name(), uuid=domain.UUIDString()).save()

View file

@ -3,9 +3,9 @@ import re
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _
have_symbol = re.compile('[^a-zA-Z0-9._-]+')
wrong_ip = re.compile('^0.|^255.')
wrong_name = re.compile('[^a-zA-Z0-9._-]+')
have_symbol = re.compile("[^a-zA-Z0-9._-]+")
wrong_ip = re.compile("^0.|^255.")
wrong_name = re.compile("[^a-zA-Z0-9._-]+")
def validate_hostname(value):
@ -13,12 +13,14 @@ def validate_hostname(value):
wip = wrong_ip.match(value)
if sym:
raise ValidationError(_('Hostname must contain only numbers, or the domain name separated by "."'))
raise ValidationError(
_('Hostname must contain only numbers, or the domain name separated by "."')
)
elif wip:
raise ValidationError(_('Wrong IP address'))
raise ValidationError(_("Wrong IP address"))
def validate_name(value):
have_symbol = wrong_name.match('[^a-zA-Z0-9._-]+')
have_symbol = wrong_name.match("[^a-zA-Z0-9._-]+")
if have_symbol:
raise ValidationError(_('The hostname must not contain any special characters'))
raise ValidationError(_("The hostname must not contain any special characters"))

View file

@ -7,7 +7,12 @@ from django.utils import timezone
from libvirt import libvirtError
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 (
@ -39,7 +44,8 @@ def computes(request):
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"
"true"
if connection_manager.host_is_up(compute.type, compute.hostname) is True else "false"
)
conn = wvmHostDetails(
@ -48,7 +54,14 @@ def overview(request, compute_id):
compute.password,
compute.type,
)
hostname, host_arch, host_memory, logical_cpu, model_cpu, uri_conn = conn.get_node_info()
(
hostname,
host_arch,
host_memory,
logical_cpu,
model_cpu,
uri_conn,
) = conn.get_node_info()
hypervisor = conn.get_hypervisors_domain_types()
mem_usage = conn.get_memory_usage()
emulator = conn.get_emulator(host_arch)
@ -64,9 +77,15 @@ 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