138 lines
3.8 KiB
Python
138 lines
3.8 KiB
Python
import time
|
|
import random
|
|
from uuid import UUID
|
|
|
|
from celery import shared_task
|
|
from celery.contrib.abortable import AbortableTask
|
|
from django_eventstream import send_event
|
|
|
|
from deployment.models import Deployment, Type, Status
|
|
|
|
|
|
class DeploymentTask(AbortableTask):
|
|
def try_exec(self, stop: int):
|
|
if stop == 0:
|
|
stop = 1
|
|
|
|
for i in range(1, stop):
|
|
time.sleep(5 * stop - 2 * i)
|
|
|
|
if random.randint(0, 10) == 10:
|
|
raise Exception("unable to perform the deployment")
|
|
|
|
yield i
|
|
|
|
def run_slim(self):
|
|
progress = 95
|
|
self.update_state(meta={"progress": progress})
|
|
|
|
time.sleep(5)
|
|
status = Status.SUCCESS.name
|
|
progress = 100
|
|
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,
|
|
},
|
|
)
|
|
|
|
def run_medium(self):
|
|
progress = 62
|
|
self.update_state(meta={"progress": progress})
|
|
|
|
time.sleep(10)
|
|
if random.randint(0, 10) % 2 != 0:
|
|
status = Status.FAILED.name
|
|
self.deploy.error = "arg.. no chance"
|
|
else:
|
|
status = Status.SUCCESS.name
|
|
progress = 100
|
|
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,
|
|
},
|
|
)
|
|
|
|
def run_large(self):
|
|
progress = 0
|
|
try:
|
|
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,
|
|
},
|
|
)
|
|
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,
|
|
},
|
|
)
|
|
|
|
@property
|
|
def progress(self):
|
|
return self.request.get("meta", {}).get("progress", 0)
|
|
|
|
def launch(self, deployment_id: UUID):
|
|
progress = 0
|
|
self.update_state(meta={"progress": progress})
|
|
|
|
self.deploy = Deployment.objects.get(id=deployment_id)
|
|
|
|
self.deploy.task_id = self.request.id
|
|
self.deploy.status = Status.RUNNING.name
|
|
self.deploy.save()
|
|
|
|
match self.deploy.type:
|
|
case Type.SLIM.name:
|
|
self.run_slim()
|
|
case Type.MEDIUM.name:
|
|
self.run_medium()
|
|
case Type.LARGE.name:
|
|
self.run_large()
|
|
|
|
self.deploy.task_id = None
|
|
self.deploy.save()
|
|
|
|
send_event(
|
|
"deployment",
|
|
"message",
|
|
{"id": self.deploy.id, "status": self.deploy.status},
|
|
)
|
|
|
|
|
|
@shared_task(base=DeploymentTask, bind=True, ignore_result=True)
|
|
def deploy(self, deployment_id: UUID):
|
|
self.launch(deployment_id)
|