From 6586d87eca93ba65aff163c732ed0d07e736dd17 Mon Sep 17 00:00:00 2001
From: Dudás Ádám <dudas.adam@cloud.bme.hu>
Date: Fri, 25 Apr 2014 19:03:27 +0200
Subject: [PATCH] vm: make async operation tasks abortable

---
 circle/vm/operations.py        |  8 +++++---
 circle/vm/tasks/local_tasks.py | 18 +++++++++++-------
 2 files changed, 16 insertions(+), 10 deletions(-)

diff --git a/circle/vm/operations.py b/circle/vm/operations.py
index acf8fd4..a7b214b 100644
--- a/circle/vm/operations.py
+++ b/circle/vm/operations.py
@@ -9,7 +9,9 @@ from django.utils.translation import ugettext_lazy as _
 from celery.exceptions import TimeLimitExceeded
 
 from common.operations import Operation, register_operation
-from .tasks.local_tasks import async_instance_operation, async_node_operation
+from .tasks.local_tasks import (
+    abortable_async_instance_operation, abortable_async_node_operation,
+)
 from .models import (
     Instance, InstanceActivity, InstanceTemplate, Interface, Node,
     NodeActivity,
@@ -21,7 +23,7 @@ logger = getLogger(__name__)
 
 class InstanceOperation(Operation):
     acl_level = 'owner'
-    async_operation = async_instance_operation
+    async_operation = abortable_async_instance_operation
     host_cls = Instance
 
     def __init__(self, instance):
@@ -440,7 +442,7 @@ register_operation(WakeUpOperation)
 
 
 class NodeOperation(Operation):
-    async_operation = async_node_operation
+    async_operation = abortable_async_node_operation
     host_cls = Node
 
     def __init__(self, node):
diff --git a/circle/vm/tasks/local_tasks.py b/circle/vm/tasks/local_tasks.py
index 5b42330..1d6bd36 100644
--- a/circle/vm/tasks/local_tasks.py
+++ b/circle/vm/tasks/local_tasks.py
@@ -1,34 +1,38 @@
+from celery.contrib.abortable import AbortableTask
 from manager.mancelery import celery
 
 
-@celery.task
-def async_instance_operation(operation_id, instance_pk, activity_pk, allargs,
-                             auxargs):
+@celery.task(base=AbortableTask, bind=True)
+def abortable_async_instance_operation(task, operation_id, instance_pk,
+                                       activity_pk, allargs, auxargs):
     from vm.models import Instance, InstanceActivity
     instance = Instance.objects.get(pk=instance_pk)
     operation = getattr(instance, operation_id)
     activity = InstanceActivity.objects.get(pk=activity_pk)
 
     # save async task UUID to activity
-    activity.task_uuid = async_instance_operation.request.id
+    activity.task_uuid = task.request.id
     activity.save()
 
     allargs['activity'] = activity
+    allargs['task'] = task
 
     return operation._exec_op(allargs, auxargs)
 
 
-@celery.task
-def async_node_operation(operation_id, node_pk, activity_pk, allargs, auxargs):
+@celery.task(base=AbortableTask, bind=True)
+def abortable_async_node_operation(task, operation_id, node_pk, activity_pk,
+                                   allargs, auxargs):
     from vm.models import Node, NodeActivity
     node = Node.objects.get(pk=node_pk)
     operation = getattr(node, operation_id)
     activity = NodeActivity.objects.get(pk=activity_pk)
 
     # save async task UUID to activity
-    activity.task_uuid = async_node_operation.request.id
+    activity.task_uuid = task.request.id
     activity.save()
 
     allargs['activity'] = activity
+    allargs['task'] = task
 
     return operation._exec_op(allargs, auxargs)
--
libgit2 0.26.0