From ece2bca8312c7698f8f327e6667cf76cc790ca57 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sun, 20 Dec 2020 21:45:47 +0100 Subject: [PATCH] add new /sizes endpoint --- uncloud/urls.py | 2 +- .../migrations/0005_auto_20201220_1837.py | 18 ++++++++++++++++ uncloud_net/selectors.py | 21 ++----------------- uncloud_net/serializers.py | 19 +++++++++++++++++ uncloud_net/services.py | 2 ++ uncloud_net/views.py | 10 +++++++++ 6 files changed, 52 insertions(+), 20 deletions(-) create mode 100644 uncloud_net/migrations/0005_auto_20201220_1837.py diff --git a/uncloud/urls.py b/uncloud/urls.py index 7e8167d..cce19be 100644 --- a/uncloud/urls.py +++ b/uncloud/urls.py @@ -69,7 +69,7 @@ router.register(r'v1/user/register', authviews.AccountManagementViewSet, basenam # Net router.register(r'v2/net/wireguardvpn', netviews.WireGuardVPNViewSet, basename='wireguardvpnnetwork') -#router.register(r'v1/admin/vpnreservation', netviews.VPNNetworkReservationViewSet, basename='vpnnetreservation') +router.register(r'v2/net/wireguardvpnsizes', netviews.WireGuardVPNSizes, basename='wireguardvpnnetworksizes') diff --git a/uncloud_net/migrations/0005_auto_20201220_1837.py b/uncloud_net/migrations/0005_auto_20201220_1837.py new file mode 100644 index 0000000..1dbabe6 --- /dev/null +++ b/uncloud_net/migrations/0005_auto_20201220_1837.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1 on 2020-12-20 18:37 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('uncloud_net', '0004_auto_20201213_1734'), + ] + + operations = [ + migrations.AlterField( + model_name='wireguardvpn', + name='wireguard_public_key', + field=models.CharField(max_length=48, unique=True), + ), + ] diff --git a/uncloud_net/selectors.py b/uncloud_net/selectors.py index bcb1ea8..6e12e8b 100644 --- a/uncloud_net/selectors.py +++ b/uncloud_net/selectors.py @@ -1,12 +1,7 @@ from django.db import transaction from django.db.models import Count, F - - from .models import * -# def get_num_used_networks(pool): -# return pool.wireguardvpn_set.count() - def get_suitable_pools(subnetwork_mask): """ Find suitable pools for a certain network size. @@ -44,17 +39,5 @@ def allowed_vpn_network_reservation_size(): # Need to return set of tuples, see # https://docs.djangoproject.com/en/3.1/ref/models/fields/#field-choices - return set([ (pool.subnetwork_mask, pool.subnetwork_mask) for pool in pools ]) - - -#def get_next_vpnnetwork(pool): - # get all associated networks - # look for the lowest free number - # return that - - - # select last used one - # try to increment by one -> get new network - - # if that fails search through the existing vpns for the first unused number - # +# return set([ (pool.subnetwork_mask, pool.subnetwork_mask) for pool in pools ]) + return set([pool.subnetwork_mask for pool in pools ]) diff --git a/uncloud_net/serializers.py b/uncloud_net/serializers.py index 88aedff..8287047 100644 --- a/uncloud_net/serializers.py +++ b/uncloud_net/serializers.py @@ -6,6 +6,8 @@ from rest_framework import serializers from .models import * from .services import * +from .selectors import * + class WireGuardVPNSerializer(serializers.ModelSerializer): address = serializers.CharField(read_only=True) @@ -23,6 +25,14 @@ class WireGuardVPNSerializer(serializers.ModelSerializer): } + def validate_network_mask(self, value): + msg = _(f"No pool for network size {value}") + sizes = allowed_vpn_network_reservation_size() + + if not value in sizes: + raise serializers.ValidationError(msg) + + def validate_wireguard_public_key(self, value): msg = _("Supplied key is not a valid wireguard public key") @@ -41,3 +51,12 @@ class WireGuardVPNSerializer(serializers.ModelSerializer): raise serializers.ValidationError(msg) return value + + +class WireGuardVPNSizesSerializer(serializers.Serializer): + + size = serializers.IntegerField(min_value=0, max_value=128) + + # sizes = serializers.ListField( + # child=serializers.IntegerField(min_value=0, max_value=128) + # ) diff --git a/uncloud_net/services.py b/uncloud_net/services.py index 4f80c44..a23d48f 100644 --- a/uncloud_net/services.py +++ b/uncloud_net/services.py @@ -7,6 +7,8 @@ from .tasks import * @transaction.atomic def create_wireguard_vpn(owner, public_key, network_mask): + + pool = get_suitable_pools(network_mask)[0] count = pool.wireguardvpn_set.count() diff --git a/uncloud_net/views.py b/uncloud_net/views.py index 72ff681..8a5c6fb 100644 --- a/uncloud_net/views.py +++ b/uncloud_net/views.py @@ -56,3 +56,13 @@ class WireGuardVPNCreateView(LoginRequiredMixin, SuccessMessageMixin, CreateView def get_success_message(self, cleaned_data): return self.success_message % dict(cleaned_data, the_prefix = self.object.prefix) + +class WireGuardVPNSizes(viewsets.ViewSet): + def list(self, request): + sizes = allowed_vpn_network_reservation_size() + print(sizes) + + sizes = [ { 'size': size } for size in sizes ] + print(sizes) + + return Response(WireGuardVPNSizesSerializer(sizes, many=True).data)