1
0
Fork 0
mirror of https://github.com/retspen/webvirtcloud synced 2024-12-24 15:15:22 +00:00

Merge pull request #370 from Real-Gecko/master

More instances tests
This commit is contained in:
catborise 2020-10-15 16:31:47 +03:00 committed by GitHub
commit 4f959eaee8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 787 additions and 404 deletions

View file

@ -10,19 +10,19 @@ def apply_change_password(sender, **kwargs):
from django.conf import settings
from django.contrib.auth.models import User, Permission
if hasattr(settings, 'SHOW_PROFILE_EDIT_PASSWORD'):
print('\033[92mSHOW_PROFILE_EDIT_PASSWORD is found inside settings.py\033[0m')
print('\033[92mApplying permission can_change_password for all users\033[0m')
print('\033[1m! \033[92mSHOW_PROFILE_EDIT_PASSWORD is found inside settings.py\033[0m')
print('\033[1m* \033[92mApplying permission can_change_password for all users\033[0m')
users = User.objects.all()
permission = Permission.objects.get(codename='change_password')
if settings.SHOW_PROFILE_EDIT_PASSWORD:
print('\033[91mWarning!!! Setting to True for all users\033[0m')
print('\033[1m! \033[91mWarning!!! Setting to True for all users\033[0m')
for user in users:
user.user_permissions.add(permission)
else:
print('\033[91mWarning!!! Setting to False for all users\033[0m')
print('\033[1m* \033[91mWarning!!! Setting to False for all users\033[0m')
for user in users:
user.user_permissions.remove(permission)
print('\033[1mDon`t forget to remove the option from settings.py\033[0m')
print('\033[1m! Don`t forget to remove the option from settings.py\033[0m')
def create_admin(sender, **kwargs):
@ -32,11 +32,11 @@ def create_admin(sender, **kwargs):
from django.contrib.auth.models import User
from accounts.models import UserAttributes
plan = kwargs['plan']
plan = kwargs.get('plan', [])
for migration, rolled_back in plan:
if migration.app_label == 'accounts' and migration.name == '0001_initial' and not rolled_back:
if User.objects.count() == 0:
print('\033[92mCreating default admin user\033[0m')
print('\033[1m* \033[92mCreating default admin user\033[0m')
admin = User.objects.create_superuser('admin', None, 'admin')
UserAttributes(user=admin, max_instances=-1, max_cpus=-1, max_memory=-1, max_disk_size=-1).save()
break
@ -47,5 +47,5 @@ class AccountsConfig(AppConfig):
verbose_name = 'Accounts'
def ready(self):
post_migrate.connect(apply_change_password, sender=self)
post_migrate.connect(create_admin, sender=self)
post_migrate.connect(apply_change_password, sender=self)

View file

@ -1,7 +1,6 @@
<domain type="kvm">
<name>test-vm</name>
<uuid>1bd3c1f2-dd12-4b8d-a298-dff387cb9f93</uuid>
<description>None</description>
<memory unit="KiB">131072</memory>
<currentMemory unit="KiB">131072</currentMemory>
<vcpu placement="static">1</vcpu>

View file

@ -6,38 +6,41 @@ def migrate_can_clone_instances(sender, **kwargs):
'''
Migrate can clone instances user attribute to permission
'''
from django.conf import settings
from django.contrib.auth.models import User, Permission
from accounts.models import UserAttributes
from django.contrib.auth.models import Permission, User
plan = kwargs['plan']
plan = kwargs.get('plan', [])
for migration, rolled_back in plan:
if migration.app_label == 'instances' and migration.name == '0002_permissionset' and not rolled_back:
users = User.objects.all()
permission = Permission.objects.get(codename='clone_instances')
print('\033[92mMigrating can_clone_instaces user attribute to permission\033[0m')
print('\033[1m* \033[92mMigrating can_clone_instaces user attribute to permission\033[0m')
for user in users:
if user.userattributes:
if user.userattributes.can_clone_instances:
user.user_permissions.add(permission)
break
def apply_passwordless_console(sender, **kwargs):
'''
Apply new passwordless_console permission for all users
'''
from django.conf import settings
from django.contrib.auth.models import User, Permission
from django.contrib.auth.models import Permission
from django.contrib.auth import get_user_model
User = get_user_model()
plan = kwargs.get('plan', [])
for migration, rolled_back in plan:
if migration.app_label == 'instances' and migration.name == '0009_auto_20200717_0524' and not rolled_back:
print('\033[1m* \033[92mApplying permission passwordless_console for all users\033[0m')
users = User.objects.all()
permission = Permission.objects.get(codename='passwordless_console')
for user in users:
user.user_permissions.add(permission)
print('\033[92mApplying permission passwordless_console for all users\033[0m')
users = User.objects.all()
permission = Permission.objects.get(codename='passwordless_console')
for user in users:
user.user_permissions.add(permission)
class InstancesConfig(AppConfig):
name = 'instances'
verbose_name = 'instances'
verbose_name = 'Instances'
def ready(self):
post_migrate.connect(migrate_can_clone_instances, sender=self)

View file

@ -61,6 +61,4 @@ class NewVMForm(forms.Form):
have_symbol = re.match('^[a-zA-Z0-9._-]+$', name)
if not have_symbol:
raise forms.ValidationError(_('The name of the virtual machine must not contain any special characters'))
elif len(name) > 64:
raise forms.ValidationError(_('The name of the virtual machine must not exceed 20 characters'))
return name

File diff suppressed because it is too large Load diff

View file

@ -65,5 +65,5 @@ urlpatterns = [
path('guess_clone_name/', views.guess_clone_name, name='guess_clone_name'),
path('random_mac_address/', views.random_mac_address, name='random_mac_address'),
path('check_instance/<vname>/', views.check_instance, name='check_instance'),
path('sshkeys/<vname>/', views.sshkeys, name='sshkeys'),
path('<int:pk>/sshkeys/', views.sshkeys, name='sshkeys'),
]

View file

@ -1,40 +1,17 @@
import os
import random
import string
from collections import OrderedDict
from django.conf import settings
from django.contrib.auth.models import User
from django.utils.translation import gettext_lazy as _
from accounts.models import UserInstance
from appsettings.settings import app_settings
from logs.views import addlogmsg
from django.conf import settings
from django.utils.translation import gettext_lazy as _
from vrtManager.connection import connection_manager
from vrtManager.hostdetails import wvmHostDetails
from vrtManager.instance import wvmInstance, wvmInstances
from .models import Instance
def filesizefstr(size_str):
if size_str == '':
return 0
size_str = size_str.upper().replace("B", "")
if size_str[-1] == 'K':
return int(float(size_str[:-1])) << 10
elif size_str[-1] == 'M':
return int(float(size_str[:-1])) << 20
elif size_str[-1] == 'G':
return int(float(size_str[:-1])) << 30
elif size_str[-1] == 'T':
return int(float(size_str[:-1])) << 40
elif size_str[-1] == 'P':
return int(float(size_str[:-1])) << 50
else:
return int(float(size_str))
def get_clone_free_names(size=10):
prefix = app_settings.CLONE_INSTANCE_DEFAULT_PREFIX
free_names = []
@ -186,36 +163,6 @@ def migrate_instance(
instance.save()
def get_hosts_status(computes):
"""
Function return all hosts all vds on host
"""
compute_data = []
for compute in computes:
compute_data.append({
'id': compute.id,
'name': compute.name,
'hostname': compute.hostname,
'status': connection_manager.host_is_up(compute.type, compute.hostname),
'type': compute.type,
'login': compute.login,
'password': compute.password,
'details': compute.details,
})
return compute_data
def get_userinstances_info(instance):
info = {}
uis = UserInstance.objects.filter(instance=instance)
info['count'] = uis.count()
if info['count'] > 0:
info['first_user'] = uis[0]
else:
info['first_user'] = None
return info
def refr(compute):
if compute.status is True:
domains = compute.proxy.wvm.listAllDomains()
@ -229,83 +176,6 @@ def refr(compute):
Instance(compute=compute, name=domain.name(), uuid=domain.UUIDString()).save()
def refresh_instance_database(comp, inst_name, info, all_host_vms, user):
# Multiple Instance Name Check
instances = Instance.objects.filter(name=inst_name)
if instances.count() > 1:
for i in instances:
user_instances_count = UserInstance.objects.filter(instance=i).count()
if user_instances_count == 0:
addlogmsg(user.username, i.name, _("Deleting due to multiple(Instance Name) records."))
i.delete()
# Multiple UUID Check
instances = Instance.objects.filter(uuid=info['uuid'])
if instances.count() > 1:
for i in instances:
if i.name != inst_name:
addlogmsg(user.username, i.name, _("Deleting due to multiple(UUID) records."))
i.delete()
try:
inst_on_db = Instance.objects.get(compute_id=comp["id"], name=inst_name)
if inst_on_db.uuid != info['uuid']:
inst_on_db.save()
all_host_vms[comp["id"], comp["name"], comp["status"], comp["cpu"], comp["mem_size"],
comp["mem_perc"]][inst_name]['is_template'] = inst_on_db.is_template
all_host_vms[comp["id"], comp["name"], comp["status"], comp["cpu"], comp["mem_size"],
comp["mem_perc"]][inst_name]['userinstances'] = get_userinstances_info(inst_on_db)
except Instance.DoesNotExist:
inst_on_db = Instance(compute_id=comp["id"], name=inst_name, uuid=info['uuid'])
inst_on_db.save()
def get_user_instances(user):
all_user_vms = {}
user_instances = UserInstance.objects.filter(user=user)
for usr_inst in user_instances:
if connection_manager.host_is_up(usr_inst.instance.compute.type, usr_inst.instance.compute.hostname):
conn = wvmHostDetails(
usr_inst.instance.compute.hostname,
usr_inst.instance.compute.login,
usr_inst.instance.compute.password,
usr_inst.instance.compute.type,
)
all_user_vms[usr_inst] = conn.get_user_instances(usr_inst.instance.name)
all_user_vms[usr_inst].update({'compute_id': usr_inst.instance.compute.id})
return all_user_vms
def get_host_instances(compute):
all_host_vms = OrderedDict()
# if compute.status:
comp_node_info = compute.proxy.get_node_info()
comp_mem = compute.proxy.get_memory_usage()
comp_instances = compute.proxy.get_host_instances(True)
# if comp_instances:
comp_info = {
"id": compute.id,
"name": compute.name,
"status": compute.status,
"cpu": comp_node_info[3],
"mem_size": comp_node_info[2],
"mem_perc": comp_mem['percent'],
}
# refr(compute)
all_host_vms[comp_info["id"], comp_info["name"], comp_info["status"], comp_info["cpu"], comp_info["mem_size"],
comp_info["mem_perc"]] = comp_instances
for vm, info in comp_instances.items():
# TODO: Delete this function completely
refresh_instance_database(comp_info, vm, info, all_host_vms, User.objects.get(pk=1))
# else:
# raise libvirtError(_(f"Problem occurred with host: {compute.name} - {status}"))
return all_host_vms
def get_dhcp_mac_address(vname):
dhcp_file = settings.BASE_DIR + '/dhcpd.conf'
mac = ''
@ -342,20 +212,3 @@ def get_clone_disk_name(disk, prefix, clone_name=''):
else:
image = f"{disk['image']}-clone"
return image
# TODO: this function is not used
def _get_clone_disks(disks, vname=''):
clone_disks = []
for disk in disks:
new_image = get_clone_disk_name(disk, vname)
if not new_image:
continue
new_disk = {
'dev': disk['dev'],
'storage': disk['storage'],
'image': new_image,
'format': disk['format'],
}
clone_disks.append(new_disk)
return clone_disks

View file

@ -51,7 +51,7 @@ def index(request):
def instance(request, pk):
instance: Instance = get_object_or_404(Instance, pk=pk)
instance: Instance = get_instance(request.user, pk)
compute: Compute = instance.compute
computes = Compute.objects.all().order_by('name')
computes_count = computes.count()
@ -59,7 +59,6 @@ def instance(request, pk):
publickeys = UserSSHKey.objects.filter(user_id=request.user.id)
keymaps = settings.QEMU_KEYMAPS
console_types = AppSettings.objects.get(key="QEMU_CONSOLE_DEFAULT_TYPE").choices_as_list()
#
console_form = ConsoleForm(
initial={
'type': instance.console_type,
@ -67,7 +66,6 @@ def instance(request, pk):
'password': instance.console_passwd,
'keymap': instance.console_keymap,
})
#
console_listen_addresses = settings.QEMU_CONSOLE_LISTEN_ADDRESSES
bottom_bar = app_settings.VIEW_INSTANCE_DETAIL_BOTTOM_BAR
allow_admin_or_not_template = request.user.is_superuser or request.user.is_staff or not instance.is_template
@ -78,15 +76,6 @@ def instance(request, pk):
except UserInstance.DoesNotExist:
userinstance = None
if not request.user.is_superuser:
if not userinstance:
return redirect(reverse('index'))
if len(instance.media) != 0:
media_iso = sorted(instance.proxy.get_iso_media())
else:
media_iso = []
memory_range = [256, 512, 768, 1024, 2048, 3072, 4096, 6144, 8192, 16384]
if instance.memory not in memory_range:
insort(memory_range, instance.memory)
@ -127,18 +116,11 @@ def instance(request, pk):
vcpu_host = len(instance.vcpu_range)
memory_host = instance.proxy.get_max_memory()
bus_host = instance.proxy.get_disk_bus_types(instance.arch, instance.machine)
# videos_host = instance.proxy.get_video_models(instance.arch, instance.machine)
networks_host = sorted(instance.proxy.get_networks())
nwfilters_host = instance.proxy.get_nwfilters()
storages_host = sorted(instance.proxy.get_storages(True))
net_models_host = instance.proxy.get_network_models()
try:
interfaces_host = sorted(instance.proxy.get_ifaces())
except Exception as e:
addlogmsg(request.user.username, instance.name, e)
messages.error(request, e)
return render(request, 'instance.html', locals())
@ -210,18 +192,18 @@ def check_instance(request, vname):
data = {'vname': vname, 'exists': False}
if instance:
data['exists'] = True
return HttpResponse(json.dumps(data))
return JsonResponse(data)
def sshkeys(request, vname):
def sshkeys(request, pk):
"""
:param request:
:param vname:
:return:
"""
instance = get_instance(request.user, pk)
instance_keys = []
userinstances = UserInstance.objects.filter(instance__name=vname)
userinstances = UserInstance.objects.filter(instance=instance)
for ui in userinstances:
keys = UserSSHKey.objects.filter(user=ui.user)
@ -239,7 +221,7 @@ def get_instance(user, pk):
'''
Check that instance is available for user, if not raise 404
'''
instance = Instance.objects.get(pk=pk)
instance = get_object_or_404(Instance, pk=pk)
user_instances = user.userinstance_set.all().values_list('instance', flat=True)
if user.is_superuser or instance.id in user_instances:
@ -498,7 +480,6 @@ def resize_disk(request, pk):
if request.user.is_superuser or request.user.is_staff or userinstance.is_change:
disks_new = list()
for disk in disks:
# input_disk_size = utils.filesizefstr(request.POST.get('disk_size_' + disk['dev'], ''))
input_disk_size = int(request.POST.get('disk_size_' + disk['dev'], '0')) * 1073741824
if input_disk_size > disk['size'] + (64 << 20):
disk['size_new'] = input_disk_size
@ -973,7 +954,7 @@ def set_qos(request, pk):
messages.success(
request,
_("%(qos_dir)s QoS is set. Network XML is changed. \
Stop and start network to activate new config." ) % {'qos_dir': qos_dir.capitalize()})
Stop and start network to activate new config.") % {'qos_dir': qos_dir.capitalize()})
return redirect(request.META.get('HTTP_REFERER') + '#network')
@ -991,7 +972,7 @@ def unset_qos(request, pk):
messages.success(
request,
_("%(qos_dir)s QoS is deleted. Network XML is changed. \
Stop and start network to activate new config." ) % {'qos_dir': qos_dir.capitalize()})
Stop and start network to activate new config.") % {'qos_dir': qos_dir.capitalize()})
return redirect(request.META.get('HTTP_REFERER') + '#network')
@ -1005,7 +986,7 @@ def add_owner(request, pk):
if app_settings.ALLOW_INSTANCE_MULTIPLE_OWNER == 'False':
check_inst = UserInstance.objects.filter(instance=instance).count()
if check_inst > 1:
if check_inst > 0:
messages.error(request, _("Only one owner is allowed and the one already added"))
else:
add_user_inst = UserInstance(instance=instance, user_id=user_id)
@ -1027,7 +1008,7 @@ def del_owner(request, pk):
return redirect(request.META.get('HTTP_REFERER') + '#users')
@permission_required('instances.clone_instances')
@permission_required('instances.clone_instances', raise_exception=True)
def clone(request, pk):
instance = get_instance(request.user, pk)