dockerize app + add celery + impl pushpin for message events

This commit is contained in:
2023-09-18 14:29:37 +02:00
parent bd11ddbd60
commit 5d51bc6637
28 changed files with 353 additions and 302 deletions
+23 -13
View File
@@ -1,9 +1,8 @@
# Generated by Django 4.2 on 2023-09-15 08:14
# Generated by Django 4.2.5 on 2023-09-18 08:14
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import uuid
class Migration(migrations.Migration):
@@ -17,21 +16,32 @@ class Migration(migrations.Migration):
migrations.CreateModel(
name="Deployment",
fields=[
(
"id",
models.UUIDField(
default=uuid.UUID("d7e9833f-e912-4640-8bf0-19e114a1136f"),
primary_key=True,
serialize=False,
),
),
("id", models.UUIDField(primary_key=True, serialize=False)),
("name", models.TextField()),
(
"type",
models.CharField(
choices=[("S", "Light"), ("M", "Medium"), ("L", "Heavy")],
default="S",
max_length=1,
choices=[
("SLIM", "Slim"),
("MEDIUM", "Medium"),
("LARGE", "Large"),
],
default="SLIM",
max_length=6,
),
),
(
"status",
models.CharField(
choices=[
("READY", "Ready"),
("PENDING", "Pending"),
("RUNNING", "Running"),
("SUCCESS", "Success"),
("FAILED", "Failed"),
],
default="READY",
max_length=7,
),
),
(
@@ -1,36 +0,0 @@
# Generated by Django 4.2 on 2023-09-15 08:31
from django.db import migrations, models
import uuid
class Migration(migrations.Migration):
dependencies = [
("deployment", "0001_initial"),
]
operations = [
migrations.AddField(
model_name="deployment",
name="status",
field=models.CharField(
choices=[
("PENDING", "Pending"),
("RUNNING", "Running"),
("SUCCESS", "Success"),
("FAILED", "Failed"),
],
default="PENDING",
max_length=7,
),
),
migrations.AlterField(
model_name="deployment",
name="id",
field=models.UUIDField(
default=uuid.UUID("7909f7f2-0ee4-45f6-b8d4-beb5df8efc73"),
primary_key=True,
serialize=False,
),
),
]
@@ -1,24 +0,0 @@
# Generated by Django 4.2.5 on 2023-09-16 08:16
from django.db import migrations, models
import uuid
class Migration(migrations.Migration):
dependencies = [
('deployment', '0002_deployment_status_alter_deployment_id'),
]
operations = [
migrations.AlterField(
model_name='deployment',
name='id',
field=models.UUIDField(default=uuid.UUID('8584555b-51ea-46a4-aebc-f7a8ab8670a4'), primary_key=True, serialize=False),
),
migrations.AlterField(
model_name='deployment',
name='status',
field=models.CharField(choices=[('READY', 'Ready'), ('PENDING', 'Pending'), ('RUNNING', 'Running'), ('SUCCESS', 'Success'), ('FAILED', 'Failed')], default='READY', max_length=7),
),
]
@@ -1,47 +0,0 @@
# Generated by Django 4.2.5 on 2023-09-16 08:43
import deployment.models
from django.db import migrations, models
import uuid
class Migration(migrations.Migration):
dependencies = [
("deployment", "0003_alter_deployment_id_alter_deployment_status"),
]
operations = [
migrations.AlterField(
model_name="deployment",
name="id",
field=models.UUIDField(
default=uuid.UUID("d29e958f-7b3d-43a8-bc17-a40ab4184dc6"),
primary_key=True,
serialize=False,
),
),
migrations.AlterField(
model_name="deployment",
name="status",
field=models.CharField(
choices=[
("READY", "Ready"),
("PENDING", "Pending"),
("RUNNING", "Running"),
("SUCCESS", "Success"),
("FAILED", "Failed"),
],
default=deployment.models.Status["READY"],
max_length=7,
),
),
migrations.AlterField(
model_name="deployment",
name="type",
field=models.CharField(
choices=[("SLIM", "Slim"), ("MEDIUM", "Medium"), ("LARGE", "Large")],
default=deployment.models.Type["SLIM"],
max_length=6,
),
),
]
@@ -1,22 +0,0 @@
# Generated by Django 4.2.5 on 2023-09-16 08:43
from django.db import migrations, models
import uuid
class Migration(migrations.Migration):
dependencies = [
("deployment", "0004_alter_deployment_id_alter_deployment_status_and_more"),
]
operations = [
migrations.AlterField(
model_name="deployment",
name="id",
field=models.UUIDField(
default=uuid.UUID("ec7ebcb5-420a-47c3-ba07-e8c340895865"),
primary_key=True,
serialize=False,
),
),
]
@@ -1,46 +0,0 @@
# Generated by Django 4.2.5 on 2023-09-16 08:45
from django.db import migrations, models
import uuid
class Migration(migrations.Migration):
dependencies = [
("deployment", "0005_alter_deployment_id"),
]
operations = [
migrations.AlterField(
model_name="deployment",
name="id",
field=models.UUIDField(
default=uuid.UUID("b8feb7aa-9c79-478b-ba91-df2e03f4145b"),
primary_key=True,
serialize=False,
),
),
migrations.AlterField(
model_name="deployment",
name="status",
field=models.CharField(
choices=[
("READY", "Ready"),
("PENDING", "Pending"),
("RUNNING", "Running"),
("SUCCESS", "Success"),
("FAILED", "Failed"),
],
default="Ready",
max_length=7,
),
),
migrations.AlterField(
model_name="deployment",
name="type",
field=models.CharField(
choices=[("SLIM", "Slim"), ("MEDIUM", "Medium"), ("LARGE", "Large")],
default="Slim",
max_length=6,
),
),
]
@@ -1,22 +0,0 @@
# Generated by Django 4.2.5 on 2023-09-16 17:21
from django.db import migrations, models
import uuid
class Migration(migrations.Migration):
dependencies = [
("deployment", "0006_alter_deployment_id_alter_deployment_status_and_more"),
]
operations = [
migrations.AlterField(
model_name="deployment",
name="id",
field=models.UUIDField(
default=uuid.UUID("0cc4ae03-f52e-4f3a-9fe1-fecda707b20e"),
primary_key=True,
serialize=False,
),
),
]
+3 -12
View File
@@ -4,9 +4,6 @@ from uuid import uuid4
from django.contrib.auth.models import User
from django.db import models
from django.db.models.signals import pre_save, pre_delete
from django.dispatch import receiver
from django_eventstream import send_event
class Type(Enum):
@@ -32,21 +29,15 @@ class Status(Enum):
class Deployment(models.Model):
id = models.UUIDField(primary_key=True, default=uuid4())
id = models.UUIDField(primary_key=True)
name = models.TextField(null=False, blank=False)
type = models.CharField(
max_length=6, choices=Type.into_choices(), default=Type.SLIM.value
max_length=6, choices=Type.into_choices(), default=Type.SLIM.name
)
status = models.CharField(
max_length=7, choices=Status.into_choices(), default=Status.READY.value
max_length=7, choices=Status.into_choices(), default=Status.READY.name
)
user = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return f"{self.name} | {self.type} | {self.status}"
@receiver(pre_save, sender=Deployment)
@receiver(pre_delete, sender=Deployment)
def deployment_update_handler(sender, instance, **kwargs):
send_event("deployment", "update", {"id": instance.id, "status": instance.status})
+32
View File
@@ -0,0 +1,32 @@
import time
import random
from uuid import UUID
from celery import shared_task
from django_eventstream import send_event
from deployment.models import Deployment, Type, Status
@shared_task
def deploy(deployment_id: UUID):
deploy = Deployment.objects.get(id=deployment_id)
deploy.status = Status.RUNNING.name
deploy.save()
match deploy.type:
case Type.SLIM.name:
time.sleep(10)
case Type.MEDIUM.name:
time.sleep(60)
case Type.LARGE.name:
time.sleep(120)
deploy.status = (
Status.FAILED.name if random.randint(0, 10) % 2 != 0 else Status.SUCCESS.name
)
deploy.save()
send_event("test", "message", {"id": deploy.id, "status": deploy.status})
print("event sent")
+6 -2
View File
@@ -1,8 +1,12 @@
from django.urls import path
from deployment.views import index, create, details
import django_eventstream
from django.urls import path, include
from deployment.views import index, create, details, deploy
urlpatterns = [
path("", index, name="deployment"),
path("create", create, name="deployment-create"),
path("<uuid:deployment_id>", details, name="deployment-details"),
path("<uuid:deployment_id>/deploy", deploy, name="deployment-launch"),
path("events/", include(django_eventstream.urls), {"channels": ["test"]}),
]
+16 -1
View File
@@ -10,6 +10,7 @@ from django.shortcuts import render, get_object_or_404
from deployment.forms import DeploymentForm
from deployment.models import Deployment, Status
from deployment.tasks import deploy as launch_deploy
def index(request):
@@ -20,10 +21,24 @@ def index(request):
page_obj = paginator.get_page(page_number)
return render(
request, "deployment/board.html", {"page_obj": page_obj, "url": "/events/"}
request, "deployment/board.html", {"page_obj": page_obj, "url": "events/"}
)
def deploy(request, deployment_id):
deployment = get_object_or_404(Deployment, id=deployment_id)
if request.method == "POST":
deployment.status = Status.PENDING.name
deployment.save()
launch_deploy.delay(deployment_id)
if page := request.GET.get("page", ""):
return HttpResponseRedirect(f"/deployment?page={page}")
return HttpResponseRedirect("/deployment")
def details(request, deployment_id):
deployment = get_object_or_404(Deployment, id=deployment_id)