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:
parent
ea409ca863
commit
217e106c8b
55 changed files with 2510 additions and 1454 deletions
|
|
@ -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"]
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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"]
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
),
|
||||
]
|
||||
),
|
||||
),
|
||||
]
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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"))
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue