100 lines
2.7 KiB
Python
100 lines
2.7 KiB
Python
import time
|
|
import random
|
|
from uuid import UUID
|
|
|
|
from celery import shared_task
|
|
from celery.contrib.abortable import AbortableTask
|
|
|
|
from deployment.channel import 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
|
|
Event.send_details(self.deploy, 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
|
|
Event.send_details(self.deploy, 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 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
|
|
|
|
Event.send_details(self.deploy, 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()
|
|
|
|
Event.send(self.deploy)
|
|
|
|
|
|
@shared_task(base=DeploymentTask, bind=True, ignore_result=True)
|
|
def deploy(self, deployment_id: UUID):
|
|
self.launch(deployment_id)
|