fix events url + check on deployment manager + refactor send event
This commit is contained in:
parent
7030b95dc5
commit
4e1a2ba20b
@ -1,6 +1,48 @@
|
||||
from django.contrib.auth.models import User
|
||||
from django_eventstream import send_event
|
||||
from django_eventstream.channelmanager import DefaultChannelManager
|
||||
|
||||
from deployment.models import Deployment
|
||||
|
||||
|
||||
def parse_channel(channel: str) -> tuple[str] | None:
|
||||
parts = channel.lstrip("deployment_").split("_")
|
||||
if len_part := len(parts):
|
||||
if len_part == 1:
|
||||
return (parts[0], "")
|
||||
if len_part == 2:
|
||||
return (parts[0], parts[1])
|
||||
return
|
||||
|
||||
|
||||
class DeploymentChannelManager(DefaultChannelManager):
|
||||
def can_read_channel(self, user, channel):
|
||||
return user is not None and user.is_authenticated
|
||||
def can_read_channel(self, user: User, channel: str):
|
||||
match parse_channel(channel):
|
||||
case (user_id, ""):
|
||||
return user_id == user.id or user.is_superuser
|
||||
case (user_id, _):
|
||||
# TODO(rmanach): check if the deployment belongs to the user
|
||||
return user_id == user.id or user.is_superuser
|
||||
return False
|
||||
|
||||
|
||||
class Event:
|
||||
@staticmethod
|
||||
def send_details(deployment: Deployment, progress: int):
|
||||
send_event(
|
||||
f"deployment_{deployment.user.id}_{deployment.id}",
|
||||
"message",
|
||||
{
|
||||
"id": deployment.id,
|
||||
"status": deployment.status,
|
||||
"progress": progress,
|
||||
},
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def send(deployment: Deployment):
|
||||
send_event(
|
||||
f"deployment_{deployment.user.id}",
|
||||
"message",
|
||||
{"id": deployment.id, "status": deployment.status},
|
||||
)
|
||||
|
||||
@ -4,8 +4,8 @@ from uuid import UUID
|
||||
|
||||
from celery import shared_task
|
||||
from celery.contrib.abortable import AbortableTask
|
||||
from django_eventstream import send_event
|
||||
|
||||
from deployment.channel import Event
|
||||
from deployment.models import Deployment, Type, Status
|
||||
|
||||
|
||||
@ -32,15 +32,7 @@ class DeploymentTask(AbortableTask):
|
||||
self.update_state(meta={"progress": progress})
|
||||
|
||||
self.deploy.status = status
|
||||
send_event(
|
||||
f"deployment-{self.deploy.id}",
|
||||
"message",
|
||||
{
|
||||
"id": self.deploy.id,
|
||||
"status": self.deploy.status,
|
||||
"progress": progress,
|
||||
},
|
||||
)
|
||||
Event.send_details(self.deploy, progress)
|
||||
|
||||
def run_medium(self):
|
||||
progress = 62
|
||||
@ -56,15 +48,7 @@ class DeploymentTask(AbortableTask):
|
||||
self.update_state(meta={"progress": progress})
|
||||
|
||||
self.deploy.status = status
|
||||
send_event(
|
||||
f"deployment-{self.deploy.id}",
|
||||
"message",
|
||||
{
|
||||
"id": self.deploy.id,
|
||||
"status": self.deploy.status,
|
||||
"progress": progress,
|
||||
},
|
||||
)
|
||||
Event.send_details(self.deploy, progress)
|
||||
|
||||
def run_large(self):
|
||||
progress = 0
|
||||
@ -72,33 +56,15 @@ class DeploymentTask(AbortableTask):
|
||||
for i in self.try_exec(6):
|
||||
progress = i * 20
|
||||
self.update_state(meta={"progress": progress})
|
||||
if progress != 100:
|
||||
send_event(
|
||||
f"deployment-{self.deploy.id}",
|
||||
"message",
|
||||
{
|
||||
"id": self.deploy.id,
|
||||
"status": self.deploy.status
|
||||
if i != 5
|
||||
else Status.SUCCESS.name,
|
||||
"progress": progress,
|
||||
},
|
||||
)
|
||||
if i != 5:
|
||||
Event.send_details(self.deploy, progress)
|
||||
except Exception as e:
|
||||
self.deploy.status = Status.FAILED.name
|
||||
self.deploy.error = e
|
||||
else:
|
||||
self.deploy.status = Status.SUCCESS.name
|
||||
|
||||
send_event(
|
||||
f"deployment-{self.deploy.id}",
|
||||
"message",
|
||||
{
|
||||
"id": self.deploy.id,
|
||||
"status": self.deploy.status,
|
||||
"progress": progress,
|
||||
},
|
||||
)
|
||||
Event.send_details(self.deploy, progress)
|
||||
|
||||
@property
|
||||
def progress(self):
|
||||
@ -125,11 +91,7 @@ class DeploymentTask(AbortableTask):
|
||||
self.deploy.task_id = None
|
||||
self.deploy.save()
|
||||
|
||||
send_event(
|
||||
"deployment",
|
||||
"message",
|
||||
{"id": self.deploy.id, "status": self.deploy.status},
|
||||
)
|
||||
Event.send(self.deploy)
|
||||
|
||||
|
||||
@shared_task(base=DeploymentTask, bind=True, ignore_result=True)
|
||||
|
||||
@ -10,14 +10,14 @@ urlpatterns = [
|
||||
path("<uuid:deployment_id>/deploy", deploy, name="deployment-launch"),
|
||||
path("<uuid:deployment_id>/abort", abort, name="deployment-abort"),
|
||||
path(
|
||||
"events/",
|
||||
"events/<user_id>/",
|
||||
include(django_eventstream.urls),
|
||||
{"channels": ["deployment"]},
|
||||
{"format-channels": ["deployment_{user_id}"]},
|
||||
name="deployment-events",
|
||||
),
|
||||
path(
|
||||
"<deployment_id>/events/",
|
||||
"events/<user_id>/<deployment_id>/",
|
||||
include(django_eventstream.urls),
|
||||
{"format-channels": ["deployment-{deployment_id}"]},
|
||||
{"format-channels": ["deployment_{user_id}_{deployment_id}"]},
|
||||
),
|
||||
]
|
||||
|
||||
@ -9,8 +9,8 @@ from django.http import (
|
||||
HttpResponseBadRequest,
|
||||
)
|
||||
from django.shortcuts import render, get_object_or_404
|
||||
from django_eventstream import send_event
|
||||
|
||||
from deployment.channel import Event
|
||||
from deployment.forms import DeploymentForm
|
||||
from deployment.models import Deployment, Status
|
||||
from deployment.tasks import deploy as launch_deploy
|
||||
@ -30,8 +30,8 @@ def index(request):
|
||||
"deployment/board.html",
|
||||
{
|
||||
"page_obj": page_obj,
|
||||
"range_pages": [i + 1 for i in range(page_obj.paginator.num_pages)],
|
||||
"url": "events/",
|
||||
"range_pages": (i + 1 for i in range(page_obj.paginator.num_pages)),
|
||||
"url": f"events/{request.user.id}/",
|
||||
},
|
||||
)
|
||||
|
||||
@ -74,23 +74,8 @@ def abort(request, deployment_id):
|
||||
deployment.task_id = None
|
||||
deployment.save()
|
||||
|
||||
# first event in details
|
||||
send_event(
|
||||
f"deployment-{deployment.id}",
|
||||
"message",
|
||||
{
|
||||
"id": deployment.id,
|
||||
"status": deployment.status,
|
||||
"progress": progress,
|
||||
},
|
||||
)
|
||||
|
||||
# global event
|
||||
send_event(
|
||||
"deployment",
|
||||
"message",
|
||||
{"id": deployment.id, "status": deployment.status},
|
||||
)
|
||||
Event.send_details(deployment, progress)
|
||||
Event.send(deployment)
|
||||
|
||||
return HttpResponseRedirect(f"/deployment/{deployment.id}")
|
||||
|
||||
@ -118,7 +103,7 @@ def details(request, deployment_id):
|
||||
return render(
|
||||
request,
|
||||
"deployment/details.html",
|
||||
{"deployment": deployment, "url": f"{deployment.id}/events/"},
|
||||
{"deployment": deployment, "url": f"events/{request.user.id}/{deployment.id}/"},
|
||||
)
|
||||
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user