summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSunil Shetye2025-03-10 15:32:57 +0530
committerSunil Shetye2025-03-11 12:28:25 +0530
commit9afd6ed1666a7bb2c884be4f57d77edff4135784 (patch)
tree2447b69030b711f46a5ccd2cb16580f9ca16d4f6
parent96d0cce0b3a37511ceb3c89e6e38d5005f8ab147 (diff)
downloadCommon-Interface-Project-9afd6ed1666a7bb2c884be4f57d77edff4135784.tar.gz
Common-Interface-Project-9afd6ed1666a7bb2c884be4f57d77edff4135784.tar.bz2
Common-Interface-Project-9afd6ed1666a7bb2c884be4f57d77edff4135784.zip
add status to task
-rw-r--r--blocks/simulationAPI/helpers/ngspice_helper.py14
-rw-r--r--blocks/simulationAPI/models.py27
-rw-r--r--blocks/simulationAPI/serializers.py7
-rw-r--r--blocks/simulationAPI/tasks.py24
4 files changed, 45 insertions, 27 deletions
diff --git a/blocks/simulationAPI/helpers/ngspice_helper.py b/blocks/simulationAPI/helpers/ngspice_helper.py
index 95cecd2a..914fdc1e 100644
--- a/blocks/simulationAPI/helpers/ngspice_helper.py
+++ b/blocks/simulationAPI/helpers/ngspice_helper.py
@@ -9,6 +9,7 @@ from datetime import datetime
from pathlib import Path
from tempfile import mkstemp
from django.conf import settings
+from simulationAPI.models import Task
logger = get_task_logger(__name__)
XmlToXcos = join(settings.BASE_DIR, 'Xcos/XmlToXcos.sh')
@@ -42,6 +43,14 @@ class CannotRunParser(Exception):
""" Base class for exceptions in this module. """
+def update_task_status(task_id, status, meta=None):
+ # Update Celery backend state
+ current_task.update_state(state=status, meta=meta or {})
+
+ # Update Django database
+ Task.objects.filter(task_id=task_id).update(status=status)
+
+
def CreateXml(file_path, parameters, task_id):
parameters = json.loads(parameters)
current_dir = settings.MEDIA_ROOT + '/' + str(task_id)
@@ -111,9 +120,8 @@ def ExecXml(task):
os.close(LOGFILEFD)
- current_task.update_state(
- state='STREAMING',
- meta={'current_process': 'Processed Xml, Streaming Output'})
+ update_task_status(task_id, 'STREAMING',
+ meta={'current_process': 'Processed Xml, Streaming Output'})
cmd = "try;"
cmd += "chdir('%s');" % current_dir
diff --git a/blocks/simulationAPI/models.py b/blocks/simulationAPI/models.py
index 119d11be..b2f09505 100644
--- a/blocks/simulationAPI/models.py
+++ b/blocks/simulationAPI/models.py
@@ -5,9 +5,20 @@ from django.conf import settings
from django.utils import timezone
from datetime import timedelta
import uuid
+from celery.result import AsyncResult
+
+
+TASK_STATUS_CHOICES = [
+ ("PENDING", "Pending"),
+ ("STARTED", "Started"),
+ ("STREAMING", "Streaming"),
+ ("SUCCESS", "Success"),
+ ("FAILURE", "Failure"),
+ ("RETRY", "Retry"),
+ ("CANCELED", "Canceled"),
+]
-# session
class Session(models.Model):
session_id = models.CharField(primary_key=True, max_length=40, null=False, editable=False)
app_name = models.CharField(max_length=40, blank=False, null=False, default='')
@@ -43,25 +54,25 @@ class Session(models.Model):
raise ValidationError("mismatch: Cannot update.")
def __str__(self):
+ """String for representing the Model object."""
return self.session_id
class Task(models.Model):
task_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
- file = models.FileField(storage=FileSystemStorage(location=settings.MEDIA_ROOT), default='default_file.txt')
-
+ file = models.FileField(storage=FileSystemStorage(location=settings.MEDIA_ROOT))
+ status = models.CharField(max_length=20, choices=TASK_STATUS_CHOICES, null=False, default="PENDING")
parameters = models.TextField(blank=True, null=True)
upload_time = models.DateTimeField(auto_now=True)
log_name = models.CharField(max_length=500, blank=True, null=True)
returncode = models.IntegerField(blank=True, null=True)
-
- task_time = models.DateTimeField(auto_now=True)
-
- session = models.ForeignKey(Session, on_delete=models.CASCADE, related_name='task_files', null=True, blank=True)
+ session = models.ForeignKey(Session, on_delete=models.CASCADE, related_name='task', null=True)
+ start_time = models.DateTimeField(null=True)
+ end_time = models.DateTimeField(null=True)
def save(self, *args, **kwargs):
super(Task, self).save(*args, **kwargs)
def __str__(self):
"""String for representing the Model object."""
- return self.task_id.hex
+ return f"{self.task_id.hex} - {self.status}"
diff --git a/blocks/simulationAPI/serializers.py b/blocks/simulationAPI/serializers.py
index 596d8590..01579427 100644
--- a/blocks/simulationAPI/serializers.py
+++ b/blocks/simulationAPI/serializers.py
@@ -10,7 +10,7 @@ logger = get_task_logger(__name__)
class SessionSerializer(serializers.ModelSerializer):
class Meta:
model = Session
- fields = ('session_id', 'app_name', 'created_at')
+ fields = ('session_id', 'app_name', 'created_at', 'expire_at', 'count')
class TaskSerializer(serializers.HyperlinkedModelSerializer):
@@ -18,8 +18,8 @@ class TaskSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Task
- fields = ('task_id', 'file', 'parameters', 'upload_time',
- 'log_name', 'returncode', 'task_time', 'session')
+ fields = ('task_id', 'file', 'status', 'parameters', 'upload_time',
+ 'log_name', 'returncode', 'session', 'start_time', 'end_time')
def create(self, validated_data):
# Takes file from request and stores it along with a taskid
@@ -35,6 +35,5 @@ class TaskSerializer(serializers.HyperlinkedModelSerializer):
parameters = json.dumps(postdata, separators=(',', ':'))
session, created = Session.objects.get_or_create(session_id=session_id, app_name=app_name)
task = Task.objects.create(session=session, file=file, parameters=parameters)
- # logger.info('session: %s, task: %s', session, task)
logger.info("Session: %s (created: %s), Task: %s", session, created, task)
return task
diff --git a/blocks/simulationAPI/tasks.py b/blocks/simulationAPI/tasks.py
index 7dff6aa3..f7089096 100644
--- a/blocks/simulationAPI/tasks.py
+++ b/blocks/simulationAPI/tasks.py
@@ -1,11 +1,11 @@
-from celery import shared_task, current_task, states
+from celery import shared_task, states
from celery.exceptions import Ignore
from celery.utils.log import get_task_logger
from redis import Redis
import traceback
from blocks.celery_tasks import app
-from simulationAPI.helpers import ngspice_helper
+from simulationAPI.helpers.ngspice_helper import ExecXml, update_task_status
from simulationAPI.models import Task
logger = get_task_logger(__name__)
@@ -32,11 +32,10 @@ def process_task(task_id):
logger.info("Processing %s %s %s",
session_id, task.file.path, task.session.app_name)
- current_task.update_state(
- state='PROGRESS',
- meta={'current_process': 'Started Processing File'})
+ update_task_status(task_id, 'STARTED',
+ meta={'current_process': 'Started Processing File'})
- output = ngspice_helper.ExecXml(task)
+ output = ExecXml(task)
if output == "Streaming":
state = 'STREAMING'
current_process = 'Processed Xml, Streaming Output'
@@ -44,15 +43,16 @@ def process_task(task_id):
state = 'SUCCESS'
current_process = 'Processed Xml, Loading Output'
- current_task.update_state(
- state=state,
- meta={'current_process': current_process})
+ update_task_status(task_id, state,
+ meta={'current_process': current_process})
return output
except Exception as e:
- current_task.update_state(state=states.FAILURE, meta={
- 'exc_type': type(e).__name__,
- 'exc_message': traceback.format_exc().split('\n')})
+ update_task_status(task_id, 'FAILURE',
+ meta={
+ 'exc_type': type(e).__name__,
+ 'exc_message': traceback.format_exc().split('\n')
+ })
logger.exception('Exception Occurred:')
raise Ignore()