cleanup migrations
Signed-off-by: Nico Schottelius <nico@nico-notebook.schottelius.org>
This commit is contained in:
parent
ed40b21d16
commit
f7b14bf507
22 changed files with 148 additions and 198 deletions
|
@ -46,6 +46,12 @@
|
||||||
old order. The old order stops one second before the new order
|
old order. The old order stops one second before the new order
|
||||||
starts.
|
starts.
|
||||||
|
|
||||||
|
If a order has been replaced can be seen by its replaced_by count:
|
||||||
|
#+BEGIN_SRC sh
|
||||||
|
>>> Order.objects.get(id=1).replaced_by.count()
|
||||||
|
1
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
** Product and Product Children
|
** Product and Product Children
|
||||||
- A product describes something a user can buy
|
- A product describes something a user can buy
|
||||||
- A product inherits from the uncloud_pay.models.Product model to
|
- A product inherits from the uncloud_pay.models.Product model to
|
||||||
|
|
|
@ -1,12 +1,9 @@
|
||||||
import json
|
import json
|
||||||
|
|
||||||
import uncloud.secrets as secrets
|
|
||||||
|
|
||||||
|
|
||||||
from xmlrpc.client import ServerProxy as RPCClient
|
from xmlrpc.client import ServerProxy as RPCClient
|
||||||
|
|
||||||
from django_auth_ldap.backend import LDAPBackend
|
from django_auth_ldap.backend import LDAPBackend
|
||||||
from django.core.management.base import BaseCommand
|
from django.core.management.base import BaseCommand
|
||||||
|
from django.conf import settings
|
||||||
from xmltodict import parse
|
from xmltodict import parse
|
||||||
|
|
||||||
from opennebula.models import VM as VMModel
|
from opennebula.models import VM as VMModel
|
||||||
|
@ -19,9 +16,9 @@ class Command(BaseCommand):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def handle(self, *args, **options):
|
def handle(self, *args, **options):
|
||||||
with RPCClient(secrets.OPENNEBULA_URL) as rpc_client:
|
with RPCClient(settings.OPENNEBULA_URL) as rpc_client:
|
||||||
success, response, *_ = rpc_client.one.vmpool.infoextended(
|
success, response, *_ = rpc_client.one.vmpool.infoextended(
|
||||||
secrets.OPENNEBULA_USER_PASS, -2, -1, -1, -1
|
settings.OPENNEBULA_USER_PASS, -2, -1, -1, -1
|
||||||
)
|
)
|
||||||
if success:
|
if success:
|
||||||
vms = json.loads(json.dumps(parse(response)))['VM_POOL']['VM']
|
vms = json.loads(json.dumps(parse(response)))['VM_POOL']['VM']
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Generated by Django 3.0.6 on 2020-06-21 12:34
|
# Generated by Django 3.0.6 on 2020-08-01 16:38
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
import django.contrib.postgres.fields.jsonb
|
import django.contrib.postgres.fields.jsonb
|
||||||
|
@ -12,15 +12,22 @@ class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
|
('uncloud_pay', '0001_initial'),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='VM',
|
name='VM',
|
||||||
fields=[
|
fields=[
|
||||||
|
('extra_data', django.contrib.postgres.fields.jsonb.JSONField(blank=True, editable=False, null=True)),
|
||||||
|
('status', models.CharField(choices=[('PENDING', 'Pending'), ('AWAITING_PAYMENT', 'Awaiting payment'), ('BEING_CREATED', 'Being created'), ('SCHEDULED', 'Scheduled'), ('ACTIVE', 'Active'), ('MODIFYING', 'Modifying'), ('DELETED', 'Deleted'), ('DISABLED', 'Disabled'), ('UNUSABLE', 'Unusable')], default='AWAITING_PAYMENT', max_length=32)),
|
||||||
('vmid', models.IntegerField(primary_key=True, serialize=False)),
|
('vmid', models.IntegerField(primary_key=True, serialize=False)),
|
||||||
('data', django.contrib.postgres.fields.jsonb.JSONField()),
|
('data', django.contrib.postgres.fields.jsonb.JSONField()),
|
||||||
('owner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
('order', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, to='uncloud_pay.Order')),
|
||||||
|
('owner', models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
||||||
],
|
],
|
||||||
|
options={
|
||||||
|
'abstract': False,
|
||||||
|
},
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|
|
@ -1,38 +0,0 @@
|
||||||
# Generated by Django 3.0.6 on 2020-08-01 12:03
|
|
||||||
|
|
||||||
from django.conf import settings
|
|
||||||
import django.contrib.postgres.fields.jsonb
|
|
||||||
from django.db import migrations, models
|
|
||||||
import django.db.models.deletion
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('uncloud_pay', '0003_auto_20200621_1442'),
|
|
||||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
|
||||||
('opennebula', '0001_initial'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='vm',
|
|
||||||
name='extra_data',
|
|
||||||
field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, editable=False, null=True),
|
|
||||||
),
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='vm',
|
|
||||||
name='order',
|
|
||||||
field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, to='uncloud_pay.Order'),
|
|
||||||
),
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='vm',
|
|
||||||
name='status',
|
|
||||||
field=models.CharField(choices=[('PENDING', 'Pending'), ('AWAITING_PAYMENT', 'Awaiting payment'), ('BEING_CREATED', 'Being created'), ('SCHEDULED', 'Scheduled'), ('ACTIVE', 'Active'), ('MODIFYING', 'Modifying'), ('DELETED', 'Deleted'), ('DISABLED', 'Disabled'), ('UNUSABLE', 'Unusable')], default='AWAITING_PAYMENT', max_length=32),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='vm',
|
|
||||||
name='owner',
|
|
||||||
field=models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
|
|
||||||
),
|
|
||||||
]
|
|
14
uncloud/templates/uncloud/base.html
Normal file
14
uncloud/templates/uncloud/base.html
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<!-- Required meta tags -->
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
|
|
||||||
|
<title>{% block title %}Welcome to uncloud{% endblock %}</title>
|
||||||
|
{% block header %}{% endblock %}
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
{% block body %}{% endblock %}
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -1,4 +1,4 @@
|
||||||
# Generated by Django 3.0.6 on 2020-06-21 12:34
|
# Generated by Django 3.0.6 on 2020-08-01 16:38
|
||||||
|
|
||||||
import django.contrib.auth.models
|
import django.contrib.auth.models
|
||||||
import django.contrib.auth.validators
|
import django.contrib.auth.validators
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Generated by Django 3.0.6 on 2020-06-21 12:34
|
# Generated by Django 3.0.6 on 2020-08-01 16:38
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
import django.contrib.postgres.fields.jsonb
|
import django.contrib.postgres.fields.jsonb
|
||||||
|
|
77
uncloud_pay/management/commands/add-opennebula-vm-orders.py
Normal file
77
uncloud_pay/management/commands/add-opennebula-vm-orders.py
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
from django.core.management.base import BaseCommand
|
||||||
|
from django.contrib.auth import get_user_model
|
||||||
|
|
||||||
|
from django.utils import timezone
|
||||||
|
from datetime import datetime, timedelta
|
||||||
|
|
||||||
|
from uncloud_pay.models import *
|
||||||
|
#import opennebula.models as one
|
||||||
|
from uncloud_vm.models import *
|
||||||
|
|
||||||
|
def vm_price_2020(cpu=1, ram=2, v6only=False):
|
||||||
|
if v6only:
|
||||||
|
discount = 9
|
||||||
|
else:
|
||||||
|
discount = 0
|
||||||
|
|
||||||
|
return cpu*3 + ram*4 - discount
|
||||||
|
|
||||||
|
def disk_price_2020(size_in_gb, disk_type):
|
||||||
|
if disk_type == VMDiskType.CEPH_SSD:
|
||||||
|
price = 3.5/10
|
||||||
|
elif disk_type == VMDiskType.CEPH_HDD:
|
||||||
|
price = 1.5/100
|
||||||
|
else:
|
||||||
|
raise Exception("not yet defined price")
|
||||||
|
|
||||||
|
return size_in_gb * price
|
||||||
|
|
||||||
|
class Command(BaseCommand):
|
||||||
|
help = 'Adding VMs / creating orders for user'
|
||||||
|
|
||||||
|
def add_arguments(self, parser):
|
||||||
|
parser.add_argument('--username', type=str, required=True)
|
||||||
|
|
||||||
|
def handle(self, *args, **options):
|
||||||
|
user = get_user_model().objects.get(username=options['username'])
|
||||||
|
addr, created = BillingAddress.objects.get_or_create(
|
||||||
|
owner=user,
|
||||||
|
active=True,
|
||||||
|
defaults={'organization': 'Undefined organisation',
|
||||||
|
'name': 'Undefined name',
|
||||||
|
'street': 'Undefined Street',
|
||||||
|
'city': 'Undefined city',
|
||||||
|
'postal_code': '8750',
|
||||||
|
'country': 'CH',
|
||||||
|
'active': True
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
orders = []
|
||||||
|
|
||||||
|
# 25206
|
||||||
|
vm25206 = VMProduct.objects.create(name="OpenNebula 25206",
|
||||||
|
cores=1,
|
||||||
|
ram_in_gb=4,
|
||||||
|
owner=user)
|
||||||
|
|
||||||
|
vm25206_ssd = VMDiskProduct.objects.create(vm=vm25206,
|
||||||
|
owner=user,
|
||||||
|
size_in_gb=30)
|
||||||
|
|
||||||
|
order_vm_25206 = Order.objects.create(owner=user,
|
||||||
|
billing_address=addr,
|
||||||
|
starting_date=timezone.make_aware(datetime.datetime(2020,3,3)),
|
||||||
|
recurring_period=RecurringPeriod.PER_30D,
|
||||||
|
recurring_price = vm_price_2020(cpu=1, ram=4) / 2,
|
||||||
|
description = "VM %s" % vm25206
|
||||||
|
)
|
||||||
|
|
||||||
|
order_vm_25206_ssd = Order.objects.create(owner=user,
|
||||||
|
billing_address=addr,
|
||||||
|
starting_date=timezone.make_aware(datetime.datetime(2020,3,3)),
|
||||||
|
recurring_period=RecurringPeriod.PER_30D,
|
||||||
|
recurring_price = disk_price_2020(30, VMDiskType.CEPH_SSD) / 2,
|
||||||
|
description = vm25206_ssd
|
||||||
|
)
|
|
@ -1,4 +1,4 @@
|
||||||
# Generated by Django 3.0.6 on 2020-06-21 12:34
|
# Generated by Django 3.0.6 on 2020-08-01 16:38
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
import django.core.validators
|
import django.core.validators
|
||||||
|
@ -23,9 +23,9 @@ class Migration(migrations.Migration):
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
('creation_date', models.DateTimeField(auto_now_add=True)),
|
('creation_date', models.DateTimeField(auto_now_add=True)),
|
||||||
('starting_date', models.DateTimeField()),
|
('starting_date', models.DateTimeField(default=uncloud_pay.models.start_of_this_month)),
|
||||||
('ending_date', models.DateTimeField()),
|
('ending_date', models.DateTimeField(default=uncloud_pay.models.end_of_this_month)),
|
||||||
('due_date', models.DateField()),
|
('due_date', models.DateField(default=uncloud_pay.models.default_payment_delay)),
|
||||||
('valid', models.BooleanField(default=True)),
|
('valid', models.BooleanField(default=True)),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
@ -53,10 +53,12 @@ class Migration(migrations.Migration):
|
||||||
('starting_date', models.DateTimeField(default=django.utils.timezone.now)),
|
('starting_date', models.DateTimeField(default=django.utils.timezone.now)),
|
||||||
('ending_date', models.DateTimeField(blank=True, null=True)),
|
('ending_date', models.DateTimeField(blank=True, null=True)),
|
||||||
('recurring_period', models.IntegerField(choices=[(31536000, 'Per 365 days'), (2592000, 'Per 30 days'), (604800, 'Per Week'), (86400, 'Per Day'), (3600, 'Per Hour'), (60, 'Per Minute'), (1, 'Per Second'), (0, 'Onetime')], default=2592000)),
|
('recurring_period', models.IntegerField(choices=[(31536000, 'Per 365 days'), (2592000, 'Per 30 days'), (604800, 'Per Week'), (86400, 'Per Day'), (3600, 'Per Hour'), (60, 'Per Minute'), (1, 'Per Second'), (0, 'Onetime')], default=2592000)),
|
||||||
|
('one_time_price', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, validators=[django.core.validators.MinValueValidator(0)])),
|
||||||
|
('recurring_price', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, validators=[django.core.validators.MinValueValidator(0)])),
|
||||||
('billing_address', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='uncloud_pay.BillingAddress')),
|
('billing_address', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='uncloud_pay.BillingAddress')),
|
||||||
('depends_on', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='parent_of', to='uncloud_pay.Order')),
|
('depends_on', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='parent_of', to='uncloud_pay.Order')),
|
||||||
('owner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
('owner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
||||||
('replaced_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='supersede', to='uncloud_pay.Order')),
|
('replaces', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='replaced_by', to='uncloud_pay.Order')),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
|
@ -115,7 +117,7 @@ class Migration(migrations.Migration):
|
||||||
name='BillRecord',
|
name='BillRecord',
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
('usage_count', models.IntegerField(default=1)),
|
('quantity', models.IntegerField(default=1)),
|
||||||
('creation_date', models.DateTimeField(auto_now_add=True)),
|
('creation_date', models.DateTimeField(auto_now_add=True)),
|
||||||
('starting_date', models.DateTimeField()),
|
('starting_date', models.DateTimeField()),
|
||||||
('ending_date', models.DateTimeField()),
|
('ending_date', models.DateTimeField()),
|
||||||
|
@ -137,4 +139,8 @@ class Migration(migrations.Migration):
|
||||||
model_name='billingaddress',
|
model_name='billingaddress',
|
||||||
constraint=models.UniqueConstraint(condition=models.Q(active=True), fields=('owner',), name='one_active_billing_address_per_user'),
|
constraint=models.UniqueConstraint(condition=models.Q(active=True), fields=('owner',), name='one_active_billing_address_per_user'),
|
||||||
),
|
),
|
||||||
|
migrations.AddConstraint(
|
||||||
|
model_name='bill',
|
||||||
|
constraint=models.UniqueConstraint(fields=('owner', 'starting_date', 'ending_date'), name='one_bill_per_month_per_user'),
|
||||||
|
),
|
||||||
]
|
]
|
||||||
|
|
|
@ -1,33 +0,0 @@
|
||||||
# Generated by Django 3.0.6 on 2020-06-21 13:35
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
import uncloud_pay.models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('uncloud_pay', '0001_initial'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='bill',
|
|
||||||
name='due_date',
|
|
||||||
field=models.DateField(default=uncloud_pay.models.default_payment_delay),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='bill',
|
|
||||||
name='ending_date',
|
|
||||||
field=models.DateTimeField(default=uncloud_pay.models.end_of_this_month),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='bill',
|
|
||||||
name='starting_date',
|
|
||||||
field=models.DateTimeField(default=uncloud_pay.models.start_of_this_month),
|
|
||||||
),
|
|
||||||
migrations.AddConstraint(
|
|
||||||
model_name='bill',
|
|
||||||
constraint=models.UniqueConstraint(fields=('owner', 'starting_date', 'ending_date'), name='one_bill_per_month_per_user'),
|
|
||||||
),
|
|
||||||
]
|
|
|
@ -1,18 +0,0 @@
|
||||||
# Generated by Django 3.0.6 on 2020-06-21 14:42
|
|
||||||
|
|
||||||
from django.db import migrations
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('uncloud_pay', '0002_auto_20200621_1335'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.RenameField(
|
|
||||||
model_name='billrecord',
|
|
||||||
old_name='usage_count',
|
|
||||||
new_name='quantity',
|
|
||||||
),
|
|
||||||
]
|
|
|
@ -1,23 +0,0 @@
|
||||||
# Generated by Django 3.0.6 on 2020-08-01 16:04
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
import django.db.models.deletion
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('uncloud_pay', '0003_auto_20200621_1442'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.RemoveField(
|
|
||||||
model_name='order',
|
|
||||||
name='replaced_by',
|
|
||||||
),
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='order',
|
|
||||||
name='replaces',
|
|
||||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='replaced_by', to='uncloud_pay.Order'),
|
|
||||||
),
|
|
||||||
]
|
|
|
@ -1,24 +0,0 @@
|
||||||
# Generated by Django 3.0.6 on 2020-08-01 16:26
|
|
||||||
|
|
||||||
import django.core.validators
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('uncloud_pay', '0004_auto_20200801_1604'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='order',
|
|
||||||
name='one_time_price',
|
|
||||||
field=models.DecimalField(decimal_places=2, default=0.0, max_digits=10, validators=[django.core.validators.MinValueValidator(0)]),
|
|
||||||
),
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='order',
|
|
||||||
name='recurring_price',
|
|
||||||
field=models.DecimalField(decimal_places=2, default=0.0, max_digits=10, validators=[django.core.validators.MinValueValidator(0)]),
|
|
||||||
),
|
|
||||||
]
|
|
|
@ -398,7 +398,7 @@ class Order(models.Model):
|
||||||
def records(self):
|
def records(self):
|
||||||
return OrderRecord.objects.filter(order=self)
|
return OrderRecord.objects.filter(order=self)
|
||||||
|
|
||||||
# these are reald fields!!!
|
# these are real fields!!!
|
||||||
# @property
|
# @property
|
||||||
# def one_time_price(self):
|
# def one_time_price(self):
|
||||||
# return reduce(lambda acc, record: acc + record.one_time_price, self.records, 0)
|
# return reduce(lambda acc, record: acc + record.one_time_price, self.records, 0)
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Generated by Django 3.0.6 on 2020-06-21 12:34
|
# Generated by Django 3.0.6 on 2020-08-01 16:38
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
import django.contrib.postgres.fields.jsonb
|
import django.contrib.postgres.fields.jsonb
|
||||||
|
@ -12,9 +12,9 @@ class Migration(migrations.Migration):
|
||||||
initial = True
|
initial = True
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('uncloud_pay', '0001_initial'),
|
|
||||||
('uncloud_vm', '__first__'),
|
('uncloud_vm', '__first__'),
|
||||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
|
('uncloud_pay', '0001_initial'),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
import uuid
|
|
||||||
|
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from uncloud_pay.models import Product, RecurringPeriod, AMOUNT_MAX_DIGITS, AMOUNT_DECIMALS
|
from uncloud_pay.models import Product, RecurringPeriod, AMOUNT_MAX_DIGITS, AMOUNT_DECIMALS
|
||||||
from uncloud_vm.models import VMProduct, VMDiskImageProduct
|
from uncloud_vm.models import VMProduct, VMDiskImageProduct
|
||||||
|
@ -23,7 +21,8 @@ class MatrixServiceProduct(Product):
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def base_image():
|
def base_image():
|
||||||
# TODO: find a way to safely reference debian 10 image.
|
# TODO: find a way to safely reference debian 10 image.
|
||||||
return VMDiskImageProduct.objects.get(uuid="93e564c5-adb3-4741-941f-718f76075f02")
|
#e return VMDiskImageProduct.objects.get(uuid="93e564c5-adb3-4741-941f-718f76075f02")
|
||||||
|
return False
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def allowed_recurring_periods():
|
def allowed_recurring_periods():
|
||||||
|
|
|
@ -12,9 +12,9 @@ class MatrixServiceProductSerializer(serializers.ModelSerializer):
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = MatrixServiceProduct
|
model = MatrixServiceProduct
|
||||||
fields = ['uuid', 'order', 'owner', 'status', 'vm', 'domain',
|
fields = ['order', 'owner', 'status', 'vm', 'domain',
|
||||||
'recurring_period']
|
'recurring_period']
|
||||||
read_only_fields = ['uuid', 'order', 'owner', 'status']
|
read_only_fields = ['order', 'owner', 'status']
|
||||||
|
|
||||||
class OrderMatrixServiceProductSerializer(MatrixServiceProductSerializer):
|
class OrderMatrixServiceProductSerializer(MatrixServiceProductSerializer):
|
||||||
recurring_period = serializers.ChoiceField(
|
recurring_period = serializers.ChoiceField(
|
||||||
|
@ -37,9 +37,9 @@ class OrderMatrixServiceProductSerializer(MatrixServiceProductSerializer):
|
||||||
class GenericServiceProductSerializer(serializers.ModelSerializer):
|
class GenericServiceProductSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = GenericServiceProduct
|
model = GenericServiceProduct
|
||||||
fields = ['uuid', 'order', 'owner', 'status', 'custom_recurring_price',
|
fields = ['order', 'owner', 'status', 'custom_recurring_price',
|
||||||
'custom_description', 'custom_one_time_price']
|
'custom_description', 'custom_one_time_price']
|
||||||
read_only_fields = ['uuid', 'order', 'owner', 'status']
|
read_only_fields = [ 'owner', 'status']
|
||||||
|
|
||||||
class OrderGenericServiceProductSerializer(GenericServiceProductSerializer):
|
class OrderGenericServiceProductSerializer(GenericServiceProductSerializer):
|
||||||
recurring_period = serializers.ChoiceField(
|
recurring_period = serializers.ChoiceField(
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
|
|
||||||
# Register your models here.
|
# Register your models here.
|
||||||
|
from uncloud_vm.models import *
|
||||||
|
|
||||||
|
admin.site.register(VMProduct)
|
||||||
|
admin.site.register(VMDiskProduct)
|
||||||
|
|
|
@ -1,10 +1,9 @@
|
||||||
# Generated by Django 3.0.6 on 2020-06-21 12:34
|
# Generated by Django 3.0.6 on 2020-08-01 16:38
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
import django.contrib.postgres.fields.jsonb
|
import django.contrib.postgres.fields.jsonb
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
import django.db.models.deletion
|
import django.db.models.deletion
|
||||||
import uuid
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
@ -12,16 +11,16 @@ class Migration(migrations.Migration):
|
||||||
initial = True
|
initial = True
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('uncloud_pay', '0001_initial'),
|
|
||||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
|
('uncloud_pay', '0001_initial'),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='VMCluster',
|
name='VMCluster',
|
||||||
fields=[
|
fields=[
|
||||||
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
('extra_data', django.contrib.postgres.fields.jsonb.JSONField(blank=True, editable=False, null=True)),
|
('extra_data', django.contrib.postgres.fields.jsonb.JSONField(blank=True, editable=False, null=True)),
|
||||||
('uuid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
|
||||||
('name', models.CharField(max_length=128, unique=True)),
|
('name', models.CharField(max_length=128, unique=True)),
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
|
@ -31,8 +30,8 @@ class Migration(migrations.Migration):
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='VMDiskImageProduct',
|
name='VMDiskImageProduct',
|
||||||
fields=[
|
fields=[
|
||||||
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
('extra_data', django.contrib.postgres.fields.jsonb.JSONField(blank=True, editable=False, null=True)),
|
('extra_data', django.contrib.postgres.fields.jsonb.JSONField(blank=True, editable=False, null=True)),
|
||||||
('uuid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
|
||||||
('name', models.CharField(max_length=256)),
|
('name', models.CharField(max_length=256)),
|
||||||
('is_os_image', models.BooleanField(default=False)),
|
('is_os_image', models.BooleanField(default=False)),
|
||||||
('is_public', models.BooleanField(default=False, editable=False)),
|
('is_public', models.BooleanField(default=False, editable=False)),
|
||||||
|
@ -51,8 +50,8 @@ class Migration(migrations.Migration):
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='VMHost',
|
name='VMHost',
|
||||||
fields=[
|
fields=[
|
||||||
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
('extra_data', django.contrib.postgres.fields.jsonb.JSONField(blank=True, editable=False, null=True)),
|
('extra_data', django.contrib.postgres.fields.jsonb.JSONField(blank=True, editable=False, null=True)),
|
||||||
('uuid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
|
||||||
('hostname', models.CharField(max_length=253, unique=True)),
|
('hostname', models.CharField(max_length=253, unique=True)),
|
||||||
('physical_cores', models.IntegerField(default=0)),
|
('physical_cores', models.IntegerField(default=0)),
|
||||||
('usable_cores', models.IntegerField(default=0)),
|
('usable_cores', models.IntegerField(default=0)),
|
||||||
|
@ -114,7 +113,8 @@ class Migration(migrations.Migration):
|
||||||
('extra_data', django.contrib.postgres.fields.jsonb.JSONField(blank=True, editable=False, null=True)),
|
('extra_data', django.contrib.postgres.fields.jsonb.JSONField(blank=True, editable=False, null=True)),
|
||||||
('status', models.CharField(choices=[('PENDING', 'Pending'), ('AWAITING_PAYMENT', 'Awaiting payment'), ('BEING_CREATED', 'Being created'), ('SCHEDULED', 'Scheduled'), ('ACTIVE', 'Active'), ('MODIFYING', 'Modifying'), ('DELETED', 'Deleted'), ('DISABLED', 'Disabled'), ('UNUSABLE', 'Unusable')], default='AWAITING_PAYMENT', max_length=32)),
|
('status', models.CharField(choices=[('PENDING', 'Pending'), ('AWAITING_PAYMENT', 'Awaiting payment'), ('BEING_CREATED', 'Being created'), ('SCHEDULED', 'Scheduled'), ('ACTIVE', 'Active'), ('MODIFYING', 'Modifying'), ('DELETED', 'Deleted'), ('DISABLED', 'Disabled'), ('UNUSABLE', 'Unusable')], default='AWAITING_PAYMENT', max_length=32)),
|
||||||
('size_in_gb', models.FloatField(blank=True)),
|
('size_in_gb', models.FloatField(blank=True)),
|
||||||
('image', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='uncloud_vm.VMDiskImageProduct')),
|
('disk_type', models.CharField(choices=[('ceph/ssd', 'Ceph Ssd'), ('ceph/hdd', 'Ceph Hdd'), ('local/ssd', 'Local Ssd'), ('local/hdd', 'Local Hdd')], default='ceph/ssd', max_length=20)),
|
||||||
|
('image', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='uncloud_vm.VMDiskImageProduct')),
|
||||||
('order', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, to='uncloud_pay.Order')),
|
('order', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, to='uncloud_pay.Order')),
|
||||||
('owner', models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
('owner', models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
||||||
('vm', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='uncloud_vm.VMProduct')),
|
('vm', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='uncloud_vm.VMProduct')),
|
||||||
|
|
|
@ -1,18 +0,0 @@
|
||||||
# Generated by Django 3.0.6 on 2020-08-01 14:02
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('uncloud_vm', '0001_initial'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='vmdiskproduct',
|
|
||||||
name='disk_type',
|
|
||||||
field=models.CharField(choices=[('ceph/ssd', 'Ceph Ssd'), ('ceph/hdd', 'Ceph Hdd'), ('local/ssd', 'Local Ssd'), ('local/hdd', 'Local Hdd')], default='ceph/ssd', max_length=20),
|
|
||||||
),
|
|
||||||
]
|
|
|
@ -1,5 +1,3 @@
|
||||||
import uuid
|
|
||||||
|
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
|
|
||||||
|
@ -10,13 +8,9 @@ import uncloud_pay.models as pay_models
|
||||||
import uncloud_storage.models
|
import uncloud_storage.models
|
||||||
|
|
||||||
class VMCluster(UncloudModel):
|
class VMCluster(UncloudModel):
|
||||||
uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
|
||||||
name = models.CharField(max_length=128, unique=True)
|
name = models.CharField(max_length=128, unique=True)
|
||||||
|
|
||||||
|
|
||||||
class VMHost(UncloudModel):
|
class VMHost(UncloudModel):
|
||||||
uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
|
||||||
|
|
||||||
# 253 is the maximum DNS name length
|
# 253 is the maximum DNS name length
|
||||||
hostname = models.CharField(max_length=253, unique=True)
|
hostname = models.CharField(max_length=253, unique=True)
|
||||||
|
|
||||||
|
@ -132,7 +126,7 @@ class VMDiskImageProduct(UncloudModel):
|
||||||
)
|
)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "VMDiskImage {} ({}): {} gb".format(self.uuid,
|
return "VMDiskImage {} ({}): {} gb".format(self.id,
|
||||||
self.name,
|
self.name,
|
||||||
self.size_in_gb)
|
self.size_in_gb)
|
||||||
|
|
||||||
|
|
|
@ -67,7 +67,7 @@ class VMSnapshotProductSerializer(serializers.ModelSerializer):
|
||||||
disks = VMDiskProduct.objects.filter(vm=value)
|
disks = VMDiskProduct.objects.filter(vm=value)
|
||||||
|
|
||||||
if len(disks) == 0:
|
if len(disks) == 0:
|
||||||
raise serializers.ValidationError("VM {} does not have any disks, cannot snapshot".format(value.uuid))
|
raise serializers.ValidationError("VM {} does not have any disks, cannot snapshot".format(value.id))
|
||||||
|
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
@ -96,9 +96,9 @@ class VMProductSerializer(serializers.ModelSerializer):
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = VMWithOSProduct
|
model = VMWithOSProduct
|
||||||
fields = ['uuid', 'order', 'owner', 'status', 'name', 'cores',
|
fields = ['order', 'owner', 'status', 'name', 'cores',
|
||||||
'ram_in_gb', 'primary_disk', 'snapshots', 'disks', 'extra_data']
|
'ram_in_gb', 'primary_disk', 'snapshots', 'disks', 'extra_data']
|
||||||
read_only_fields = ['uuid', 'order', 'owner', 'status']
|
read_only_fields = ['order', 'owner', 'status']
|
||||||
|
|
||||||
class OrderVMProductSerializer(VMProductSerializer):
|
class OrderVMProductSerializer(VMProductSerializer):
|
||||||
recurring_period = serializers.ChoiceField(
|
recurring_period = serializers.ChoiceField(
|
||||||
|
@ -119,7 +119,7 @@ class NicoVMProductSerializer(serializers.ModelSerializer):
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = VMProduct
|
model = VMProduct
|
||||||
read_only_fields = ['uuid', 'order', 'owner', 'status',
|
read_only_fields = ['order', 'owner', 'status',
|
||||||
'vmhost', 'vmcluster', 'snapshots',
|
'vmhost', 'vmcluster', 'snapshots',
|
||||||
'extra_data' ]
|
'extra_data' ]
|
||||||
fields = read_only_fields + [ 'name',
|
fields = read_only_fields + [ 'name',
|
||||||
|
|
Loading…
Reference in a new issue