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 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):
|
class DeploymentChannelManager(DefaultChannelManager):
|
||||||
def can_read_channel(self, user, channel):
|
def can_read_channel(self, user: User, channel: str):
|
||||||
return user is not None and user.is_authenticated
|
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 import shared_task
|
||||||
from celery.contrib.abortable import AbortableTask
|
from celery.contrib.abortable import AbortableTask
|
||||||
from django_eventstream import send_event
|
|
||||||
|
|
||||||
|
from deployment.channel import Event
|
||||||
from deployment.models import Deployment, Type, Status
|
from deployment.models import Deployment, Type, Status
|
||||||
|
|
||||||
|
|
||||||
@ -32,15 +32,7 @@ class DeploymentTask(AbortableTask):
|
|||||||
self.update_state(meta={"progress": progress})
|
self.update_state(meta={"progress": progress})
|
||||||
|
|
||||||
self.deploy.status = status
|
self.deploy.status = status
|
||||||
send_event(
|
Event.send_details(self.deploy, progress)
|
||||||
f"deployment-{self.deploy.id}",
|
|
||||||
"message",
|
|
||||||
{
|
|
||||||
"id": self.deploy.id,
|
|
||||||
"status": self.deploy.status,
|
|
||||||
"progress": progress,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
def run_medium(self):
|
def run_medium(self):
|
||||||
progress = 62
|
progress = 62
|
||||||
@ -56,15 +48,7 @@ class DeploymentTask(AbortableTask):
|
|||||||
self.update_state(meta={"progress": progress})
|
self.update_state(meta={"progress": progress})
|
||||||
|
|
||||||
self.deploy.status = status
|
self.deploy.status = status
|
||||||
send_event(
|
Event.send_details(self.deploy, progress)
|
||||||
f"deployment-{self.deploy.id}",
|
|
||||||
"message",
|
|
||||||
{
|
|
||||||
"id": self.deploy.id,
|
|
||||||
"status": self.deploy.status,
|
|
||||||
"progress": progress,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
def run_large(self):
|
def run_large(self):
|
||||||
progress = 0
|
progress = 0
|
||||||
@ -72,33 +56,15 @@ class DeploymentTask(AbortableTask):
|
|||||||
for i in self.try_exec(6):
|
for i in self.try_exec(6):
|
||||||
progress = i * 20
|
progress = i * 20
|
||||||
self.update_state(meta={"progress": progress})
|
self.update_state(meta={"progress": progress})
|
||||||
if progress != 100:
|
if i != 5:
|
||||||
send_event(
|
Event.send_details(self.deploy, progress)
|
||||||
f"deployment-{self.deploy.id}",
|
|
||||||
"message",
|
|
||||||
{
|
|
||||||
"id": self.deploy.id,
|
|
||||||
"status": self.deploy.status
|
|
||||||
if i != 5
|
|
||||||
else Status.SUCCESS.name,
|
|
||||||
"progress": progress,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.deploy.status = Status.FAILED.name
|
self.deploy.status = Status.FAILED.name
|
||||||
self.deploy.error = e
|
self.deploy.error = e
|
||||||
else:
|
else:
|
||||||
self.deploy.status = Status.SUCCESS.name
|
self.deploy.status = Status.SUCCESS.name
|
||||||
|
|
||||||
send_event(
|
Event.send_details(self.deploy, progress)
|
||||||
f"deployment-{self.deploy.id}",
|
|
||||||
"message",
|
|
||||||
{
|
|
||||||
"id": self.deploy.id,
|
|
||||||
"status": self.deploy.status,
|
|
||||||
"progress": progress,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def progress(self):
|
def progress(self):
|
||||||
@ -125,11 +91,7 @@ class DeploymentTask(AbortableTask):
|
|||||||
self.deploy.task_id = None
|
self.deploy.task_id = None
|
||||||
self.deploy.save()
|
self.deploy.save()
|
||||||
|
|
||||||
send_event(
|
Event.send(self.deploy)
|
||||||
"deployment",
|
|
||||||
"message",
|
|
||||||
{"id": self.deploy.id, "status": self.deploy.status},
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@shared_task(base=DeploymentTask, bind=True, ignore_result=True)
|
@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>/deploy", deploy, name="deployment-launch"),
|
||||||
path("<uuid:deployment_id>/abort", abort, name="deployment-abort"),
|
path("<uuid:deployment_id>/abort", abort, name="deployment-abort"),
|
||||||
path(
|
path(
|
||||||
"events/",
|
"events/<user_id>/",
|
||||||
include(django_eventstream.urls),
|
include(django_eventstream.urls),
|
||||||
{"channels": ["deployment"]},
|
{"format-channels": ["deployment_{user_id}"]},
|
||||||
name="deployment-events",
|
name="deployment-events",
|
||||||
),
|
),
|
||||||
path(
|
path(
|
||||||
"<deployment_id>/events/",
|
"events/<user_id>/<deployment_id>/",
|
||||||
include(django_eventstream.urls),
|
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,
|
HttpResponseBadRequest,
|
||||||
)
|
)
|
||||||
from django.shortcuts import render, get_object_or_404
|
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.forms import DeploymentForm
|
||||||
from deployment.models import Deployment, Status
|
from deployment.models import Deployment, Status
|
||||||
from deployment.tasks import deploy as launch_deploy
|
from deployment.tasks import deploy as launch_deploy
|
||||||
@ -30,8 +30,8 @@ def index(request):
|
|||||||
"deployment/board.html",
|
"deployment/board.html",
|
||||||
{
|
{
|
||||||
"page_obj": page_obj,
|
"page_obj": page_obj,
|
||||||
"range_pages": [i + 1 for i in range(page_obj.paginator.num_pages)],
|
"range_pages": (i + 1 for i in range(page_obj.paginator.num_pages)),
|
||||||
"url": "events/",
|
"url": f"events/{request.user.id}/",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -74,23 +74,8 @@ def abort(request, deployment_id):
|
|||||||
deployment.task_id = None
|
deployment.task_id = None
|
||||||
deployment.save()
|
deployment.save()
|
||||||
|
|
||||||
# first event in details
|
Event.send_details(deployment, progress)
|
||||||
send_event(
|
Event.send(deployment)
|
||||||
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},
|
|
||||||
)
|
|
||||||
|
|
||||||
return HttpResponseRedirect(f"/deployment/{deployment.id}")
|
return HttpResponseRedirect(f"/deployment/{deployment.id}")
|
||||||
|
|
||||||
@ -118,7 +103,7 @@ def details(request, deployment_id):
|
|||||||
return render(
|
return render(
|
||||||
request,
|
request,
|
||||||
"deployment/details.html",
|
"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