# Copyright 2014 Budapest University of Technology and Economics (BME IK)
#
# This file is part of CIRCLE Cloud.
#
# CIRCLE is free software: you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free
# Software Foundation, either version 3 of the License, or (at your option)
# any later version.
#
# CIRCLE is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along
# with CIRCLE.  If not, see <http://www.gnu.org/licenses/>.

from celery.contrib.abortable import AbortableTask
from manager.mancelery import celery
from common.transport import from_wire


@celery.task(base=AbortableTask, bind=True)
def abortable_async_instance_operation(task, operation_id, instance_pk,
                                       activity_pk, allargs_wire, auxargs_wire):
    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)

    allargs = from_wire(allargs_wire) 
    auxargs = from_wire(auxargs_wire)

    # save async task UUID to activity
    activity.task_uuid = task.request.id
    activity.save()

    allargs['activity'] = activity
    allargs['task'] = task

    return operation._exec_op(allargs, auxargs)


@celery.task(base=AbortableTask, bind=True)
def abortable_async_node_operation(task, operation_id, node_pk, activity_pk,
                                   allargs_wire, auxargs_wire):
    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)

    allargs = from_wire(allargs_wire) 
    auxargs = from_wire(auxargs_wire)

    # save async task UUID to activity
    activity.task_uuid = task.request.id
    activity.save()

    allargs['activity'] = activity
    allargs['task'] = task

    return operation._exec_op(allargs, auxargs)
