diff --git a/.travis.yml b/.travis.yml index c5fb27a..10e31c5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,15 +1,17 @@ +--- language: python python: - - "3.6" + - "3.9" env: - - DJANGO=3.2.4 + - DJANGO=3.2.15 install: - pip install -r dev/requirements.txt script: - - pep8 --exclude=IPy.py --ignore=E501 vrtManager accounts admin appsettings computes \ - console create datasource instances interfaces \ - logs networks nwfilters storages virtsecrets - - pyflakes vrtManager accounts admin appsettings computes console create datasource instances interfaces \ - logs networks nwfilters storages virtsecrets + - pep8 --exclude=IPy.py --ignore=E501 vrtManager accounts admin appsettings \ + computesconsole create datasource instances \ + interfaceslogs networks nwfilters storages \ + virtsecrets + - pyflakes vrtManager accounts admin appsettings computes console create datasource \ + instances interfaces logs networks nwfilters storages virtsecrets - python manage.py migrate - python manage.py test --settings=webvirtcloud.settings-dev diff --git a/Dockerfile b/Dockerfile index fd89448..4f57585 100644 --- a/Dockerfile +++ b/Dockerfile @@ -37,10 +37,12 @@ RUN python3 -m venv venv && \ pip3 install -U pip && \ pip3 install wheel && \ pip3 install -r conf/requirements.txt && \ + pip3 cache purge && \ chown -R www-data:www-data /srv/webvirtcloud RUN . venv/bin/activate && \ python3 manage.py migrate && \ + python3 manage.py collectstatic --noinput && \ chown -R www-data:www-data /srv/webvirtcloud # Setup Nginx diff --git a/README.md b/README.md index e00b1ff..2027439 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ chmod 744 install.sh ### Generate secret key -You should generate SECRET_KEY after cloning repo. Then put it into webvirtcloud/settings.py. +You should generate SECRET_KEY after cloning repository. Then put it into webvirtcloud/settings.py. ```python3 import random, string @@ -72,6 +72,7 @@ virtualenv -p python3 venv source venv/bin/activate pip install -r conf/requirements.txt python3 manage.py migrate +python3 manage.py collectstatic --noinput sudo chown -R www-data:www-data /srv/webvirtcloud sudo rm /etc/nginx/sites-enabled/default ``` @@ -100,7 +101,7 @@ sudo yum -y install epel-release sudo yum -y install python3-virtualenv python3-devel libvirt-devel glibc gcc nginx supervisor python3-lxml git python3-libguestfs iproute-tc cyrus-sasl-md5 python3-libguestfs libsasl2-dev libldap2-dev libssl-dev ``` -#### Creating directories and cloning repo +#### Creating directories and cloning repository ```bash sudo mkdir /srv && cd /srv @@ -119,6 +120,7 @@ source venv/bin/activate pip3 install -r conf/requirements.txt cp conf/nginx/webvirtcloud.conf /etc/nginx/conf.d/ python3 manage.py migrate +python3 manage.py collectstatic --noinput ``` #### Configure the supervisor for CentOS @@ -357,6 +359,7 @@ source venv/bin/activate git pull pip3 install -U -r conf/requirements.txt python3 manage.py migrate +python3 manage.py collectstatic --noinput sudo service supervisor restart ``` diff --git a/Vagrantfile b/Vagrantfile index d92377c..51522bb 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -42,7 +42,9 @@ Vagrant.configure(2) do |config| sudo cp /srv/webvirtcloud/conf/nginx/webvirtcloud.conf /etc/nginx/conf.d sudo cp /srv/webvirtcloud/webvirtcloud/settings.py.template /srv/webvirtcloud/webvirtcloud/settings.py sudo sed "s/SECRET_KEY = ''/SECRET_KEY = '"`python3 /srv/webvirtcloud/conf/runit/secret_generator.py`"'/" -i /srv/webvirtcloud/webvirtcloud/settings.py + python3 /srv/webvirtcloud/manage.py makemigrations python3 /srv/webvirtcloud/manage.py migrate + python3 /srv/webvirtcloud/manage.py collectstatic --noinput sudo rm /etc/nginx/sites-enabled/default sudo chown -R www-data:www-data /srv/webvirtcloud sudo service nginx restart diff --git a/accounts/utils.py b/accounts/utils.py index 4507a54..fbbdf81 100644 --- a/accounts/utils.py +++ b/accounts/utils.py @@ -27,7 +27,7 @@ def validate_ssh_key(key): return False typeofkey = array[0] string = array[1] - username = array[2] + # must have only valid rsa-ssh key characters ie binascii characters try: data = base64.decodebytes(string) @@ -39,10 +39,9 @@ def validate_ssh_key(key): 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: - return True - else: + if data[4 : 4 + str_len] != typeofkey: return False + return True def send_email_with_otp(user, device): diff --git a/instances/migrations/0011_createinstance_migrateinstance.py b/instances/migrations/0011_createinstance_migrateinstance.py new file mode 100644 index 0000000..131a55e --- /dev/null +++ b/instances/migrations/0011_createinstance_migrateinstance.py @@ -0,0 +1,59 @@ +# Generated by Django 3.2.15 on 2022-08-23 12:25 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('instances', '0010_auto_20220722_0812'), + ] + + operations = [ + migrations.CreateModel( + name='CreateInstance', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(error_messages={'required': 'No Virtual Machine name has been entered'}, max_length=64)), + ('firmware', models.CharField(max_length=50)), + ('vcpu', models.IntegerField(error_messages={'required': 'No VCPU has been entered'})), + ('vcpu_mode', models.CharField(blank=True, max_length=20)), + ('disk', models.IntegerField(blank=True)), + ('memory', models.IntegerField(error_messages={'required': 'No RAM size has been entered'})), + ('networks', models.CharField(error_messages={'required': 'No Network pool has been choosen'}, max_length=256)), + ('nwfilter', models.CharField(blank=True, max_length=256)), + ('storage', models.CharField(blank=True, max_length=256)), + ('template', models.CharField(blank=True, max_length=256)), + ('images', models.CharField(blank=True, max_length=256)), + ('cache_mode', models.CharField(error_messages={'required': 'Please select HDD cache mode'}, max_length=12)), + ('hdd_size', models.IntegerField(blank=True)), + ('meta_prealloc', models.BooleanField(blank=True, default=False)), + ('virtio', models.BooleanField(default=True)), + ('qemu_ga', models.BooleanField(default=False)), + ('mac', models.CharField(blank=True, max_length=17)), + ('console_pass', models.CharField(blank=True, max_length=64)), + ('graphics', models.CharField(error_messages={'required': 'Please select a graphics type'}, max_length=12)), + ('video', models.CharField(error_messages={'required': 'Please select a video driver'}, max_length=12)), + ('listener_addr', models.CharField(choices=[('127.0.0.1', 'Localhost'), ('0.0.0.0', 'All interfaces')], max_length=20)), + ], + options={ + 'managed': False, + }, + ), + migrations.CreateModel( + name='MigrateInstance', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('live', models.BooleanField(verbose_name='Live')), + ('xml_del', models.BooleanField(default=True, verbose_name='Undefine XML')), + ('offline', models.BooleanField(verbose_name='Offline')), + ('autoconverge', models.BooleanField(default=True, verbose_name='Auto Converge')), + ('compress', models.BooleanField(default=False, verbose_name='Compress')), + ('postcopy', models.BooleanField(default=False, verbose_name='Post Copy')), + ('unsafe', models.BooleanField(default=False, verbose_name='Unsafe')), + ], + options={ + 'managed': False, + }, + ), + ] diff --git a/instances/models.py b/instances/models.py index cc15873..fa18483 100644 --- a/instances/models.py +++ b/instances/models.py @@ -210,16 +210,16 @@ class Instance(models.Model): class MigrateInstance(models.Model): - instance = models.ForeignKey(Instance, on_delete=models.DO_NOTHING) - target_compute = models.ForeignKey(Compute, related_name='target', on_delete=models.DO_NOTHING) + instance = models.ForeignKey(Instance, related_name='source_host', on_delete=models.DO_NOTHING) + target_compute = models.ForeignKey(Compute, related_name='target_host', on_delete=models.DO_NOTHING) - live = models.BooleanField(_('Live'), blank=False) - xml_del = models.BooleanField(_('Undefine XML'), blank=False, default=True) - offline = models.BooleanField(_('Offline'), blank=False) - autoconverge = models.BooleanField(_('Auto Converge'), blank=False, default=True) - compress = models.BooleanField(_('Compress'), blank=False, default=False) - postcopy = models.BooleanField(_('Post Copy'), blank=False, default=False) - unsafe = models.BooleanField(_('Unsafe'), blank=False, default=False) + live = models.BooleanField(_('Live')) + xml_del = models.BooleanField(_('Undefine XML'), default=True) + offline = models.BooleanField(_('Offline')) + autoconverge = models.BooleanField(_('Auto Converge'), default=True) + compress = models.BooleanField(_('Compress'), default=False) + postcopy = models.BooleanField(_('Post Copy'), default=False) + unsafe = models.BooleanField(_('Unsafe'), default=False) class Meta: managed = False diff --git a/instances/templates/allinstances_index_grouped.html b/instances/templates/allinstances_index_grouped.html index 5d270d4..604f81e 100644 --- a/instances/templates/allinstances_index_grouped.html +++ b/instances/templates/allinstances_index_grouped.html @@ -3,7 +3,7 @@
| # | +# | {% trans "Name" %} {% trans "Description" %} |
{% trans "User"%} | {% trans "Status" %} | @@ -31,7 +31,7 @@ {% trans "Connected" %} {% if app_settings.VM_DRBD_STATUS == 'True' %} -+ | {% endif %} | {{ compute.cpu_count }} | {{ compute.ram_size|filesizeformat }} | diff --git a/instances/templates/create_instance_w2.html b/instances/templates/create_instance_w2.html index 9c38670..f71328a 100644 --- a/instances/templates/create_instance_w2.html +++ b/instances/templates/create_instance_w2.html @@ -51,7 +51,7 @@
|---|