[vpn] update to show reservations, create wireguard config
This commit is contained in:
		
					parent
					
						
							
								85b4d70592
							
						
					
				
			
			
				commit
				
					
						ff133e81b7
					
				
			
		
					 7 changed files with 75 additions and 19 deletions
				
			
		| 
						 | 
				
			
			@ -1,9 +0,0 @@
 | 
			
		|||
## Introduction
 | 
			
		||||
 | 
			
		||||
This document describes how to create a product and use it.
 | 
			
		||||
 | 
			
		||||
A product (like a VMSnapshotproduct) creates an order when ordered.
 | 
			
		||||
The "order" is used to combine products together.
 | 
			
		||||
 | 
			
		||||
Sub-products or related products link to the same order.
 | 
			
		||||
Each product has one (?) orderrecord
 | 
			
		||||
							
								
								
									
										34
									
								
								uncloud_django_based/uncloud/doc/README-products.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								uncloud_django_based/uncloud/doc/README-products.md
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,34 @@
 | 
			
		|||
## Introduction
 | 
			
		||||
 | 
			
		||||
This document describes how to create, modify or
 | 
			
		||||
delete a product and use it.
 | 
			
		||||
 | 
			
		||||
A product (like a VMSnapshotproduct) creates an order when ordered.
 | 
			
		||||
The "order" is used to combine products together.
 | 
			
		||||
 | 
			
		||||
Sub-products or related products link to the same order.
 | 
			
		||||
Each product has one (?) orderrecord
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## How to delete a product (logic 1)
 | 
			
		||||
 | 
			
		||||
If a user want so delete (=cancel) a product, the following steps
 | 
			
		||||
should be taken:
 | 
			
		||||
 | 
			
		||||
* the associated order is set to cancelled
 | 
			
		||||
* the product itself is deleted
 | 
			
		||||
 | 
			
		||||
[above steps to be reviewed]
 | 
			
		||||
 | 
			
		||||
## How to delete a product (rest api)
 | 
			
		||||
 | 
			
		||||
http -a nicoschottelius:$(pass
 | 
			
		||||
ungleich.ch/nico.schottelius@ungleich.ch)
 | 
			
		||||
http://localhost:8000/net/vpn/43c83088-f4d6-49b9-86c7-40251ac07ada/
 | 
			
		||||
 | 
			
		||||
-> does not delete the reservation.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### Deleting a VPN
 | 
			
		||||
 | 
			
		||||
When the product is deleted, the network must be marked as free.
 | 
			
		||||
| 
						 | 
				
			
			@ -14,3 +14,7 @@ django-extensions
 | 
			
		|||
 | 
			
		||||
# PDF creating
 | 
			
		||||
django-hardcopy
 | 
			
		||||
 | 
			
		||||
# schema support
 | 
			
		||||
pyyaml
 | 
			
		||||
uritemplate
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,8 +19,8 @@ from django.urls import path, include
 | 
			
		|||
from django.conf import settings
 | 
			
		||||
from django.conf.urls.static import static
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
from rest_framework import routers
 | 
			
		||||
from rest_framework.schemas import get_schema_view
 | 
			
		||||
 | 
			
		||||
from opennebula   import views as oneviews
 | 
			
		||||
from uncloud_auth import views as authviews
 | 
			
		||||
| 
						 | 
				
			
			@ -47,6 +47,7 @@ router.register(r'service/matrix', serviceviews.MatrixServiceProductViewSet, bas
 | 
			
		|||
 | 
			
		||||
# Net
 | 
			
		||||
router.register(r'net/vpn', netviews.VPNNetworkViewSet, basename='vpnnet')
 | 
			
		||||
router.register(r'net/vpnreservation', netviews.VPNNetworkReservationViewSet, basename='vpnnetreservation')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Pay
 | 
			
		||||
| 
						 | 
				
			
			@ -75,5 +76,10 @@ urlpatterns = [
 | 
			
		|||
    # web/ = stuff to view in the browser
 | 
			
		||||
 | 
			
		||||
    path('web/pdf/', payviews.MyPDFView.as_view(), name='pdf'),
 | 
			
		||||
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework')) # for login to REST API
 | 
			
		||||
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework')), # for login to REST API
 | 
			
		||||
    path('openapi', get_schema_view(
 | 
			
		||||
        title="uncloud",
 | 
			
		||||
        description="uncloud API",
 | 
			
		||||
        version="1.0.0"
 | 
			
		||||
    ), name='openapi-schema'),
 | 
			
		||||
]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -114,15 +114,20 @@ PrivateKey = {privatekey}
 | 
			
		|||
 | 
			
		||||
        peers = []
 | 
			
		||||
 | 
			
		||||
        for vpnnetwork in self.vpnnetworkreservation_set:
 | 
			
		||||
            public_key = vpnnetwork.wireguard_public_key
 | 
			
		||||
            peer_network = "{}/{}".format(vpnnetwork.address, self.subnetwork_size)
 | 
			
		||||
        for reservation in self.vpnnetworkreservation_set.filter(status='used'):
 | 
			
		||||
            public_key = reservation.vpnnetwork_set.first().wireguard_public_key
 | 
			
		||||
            peer_network = "{}/{}".format(reservation.address, self.subnetwork_size)
 | 
			
		||||
            owner = reservation.vpnnetwork_set.first().owner
 | 
			
		||||
 | 
			
		||||
            peers.append("""
 | 
			
		||||
# Owner: {owner}
 | 
			
		||||
[Peer]
 | 
			
		||||
PublicKey = {public_key}
 | 
			
		||||
AllowedIPs = {peer_network}
 | 
			
		||||
""")
 | 
			
		||||
""".format(
 | 
			
		||||
    owner=owner,
 | 
			
		||||
    public_key=public_key,
 | 
			
		||||
    peer_network=peer_network))
 | 
			
		||||
 | 
			
		||||
        wireguard_config.extend(peers)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -140,9 +145,6 @@ AllowedIPs = {peer_network}
 | 
			
		|||
        pass
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class VPNNetworkReservation(UncloudModel):
 | 
			
		||||
    """
 | 
			
		||||
     This class tracks the used VPN networks. It will be deleted, when the product is cancelled.
 | 
			
		||||
| 
						 | 
				
			
			@ -170,3 +172,12 @@ class VPNNetwork(Product):
 | 
			
		|||
                               editable=False)
 | 
			
		||||
 | 
			
		||||
    wireguard_public_key = models.CharField(max_length=48)
 | 
			
		||||
 | 
			
		||||
    def delete(self, *args, **kwargs):
 | 
			
		||||
        self.network.status = 'free'
 | 
			
		||||
        self.network.save()
 | 
			
		||||
        super().save(*args, **kwargs)
 | 
			
		||||
        print("deleted {}".format(self))
 | 
			
		||||
 | 
			
		||||
# managing deletion
 | 
			
		||||
# - record free network (?)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,6 +11,12 @@ class VPNPoolSerializer(serializers.ModelSerializer):
 | 
			
		|||
        model = VPNPool
 | 
			
		||||
        fields = '__all__'
 | 
			
		||||
 | 
			
		||||
class VPNNetworkReservationSerializer(serializers.ModelSerializer):
 | 
			
		||||
    class Meta:
 | 
			
		||||
        model = VPNNetworkReservation
 | 
			
		||||
        fields = '__all__'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class VPNNetworkSerializer(serializers.ModelSerializer):
 | 
			
		||||
    class Meta:
 | 
			
		||||
        model = VPNNetwork
 | 
			
		||||
| 
						 | 
				
			
			@ -29,7 +35,6 @@ class VPNNetworkSerializer(serializers.ModelSerializer):
 | 
			
		|||
        i.e. contains \n or similar!
 | 
			
		||||
        We might even need to be more strict to not break wireguard...
 | 
			
		||||
        """
 | 
			
		||||
        print(value)
 | 
			
		||||
 | 
			
		||||
        try:
 | 
			
		||||
            base64.standard_b64decode(value)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,6 +13,11 @@ class VPNPoolViewSet(viewsets.ModelViewSet):
 | 
			
		|||
    permission_classes = [permissions.IsAdminUser]
 | 
			
		||||
    queryset = VPNPool.objects.all()
 | 
			
		||||
 | 
			
		||||
class VPNNetworkReservationViewSet(viewsets.ModelViewSet):
 | 
			
		||||
    serializer_class = VPNNetworkReservationSerializer
 | 
			
		||||
    permission_classes = [permissions.IsAdminUser]
 | 
			
		||||
    queryset = VPNNetworkReservation.objects.all()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class VPNNetworkViewSet(viewsets.ModelViewSet):
 | 
			
		||||
    serializer_class = VPNNetworkSerializer
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue