# Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""This file defines tasks to be executed in provision actions."""

import abc
import logging

import common


class BaseActionable(object):
    """Base class of an actionable item."""

    @abc.abstractmethod
    def execute(self, job, host, *args, **kwargs):
        """Execute the action item.

        @param job: A job object from a control file.
        @param host: A host to run this action against.
        @param args: arguments to passed to the test.
        @param kwargs: keyword arguments to passed to the test.

        @returns True if succeeds, False otherwise,
                 subclass should override this method.
        """
        raise NotImplementedError('Subclass should override execute.')


class TestActionable(BaseActionable):
    """A test to be executed as an action"""

    def __init__(self, test, extra_kwargs={}):
        """Init method.

        @param test: String, the test to run, e.g. stub_ServerToClientPass
        @param extra_kargs: A dictionary, extra keyval-based args
                            that will be passed when execute the test.
        """
        self.test = test
        self.extra_kwargs = extra_kwargs


    def execute(self, job, host, *args, **kwargs):
        """Execute the action item.

        @param job: A job object from a control file.
        @param host: A host to run this action against.
        @param args: arguments to passed to the test.
        @param kwargs: keyword arguments to passed to the test.

        @returns True if succeeds, False otherwise.
        """
        kwargs.update(self.extra_kwargs)
        return job.run_test(self.test, host=host, *args, **kwargs)


class RebootActionable(BaseActionable):
    """Reboot action."""

    def execute(self, job, host, *args, **kwargs):
        """Execute the action item.

        @param job: A job object from a control file.
        @param host: A host to run this action against.
        @param args: arguments to passed to the test.
        @param kwargs: keyword arguments to passed to the test.

        @returns True if succeeds.
        """
        logging.error('Executing RebootActionable ... ')
        host.reboot()
        logging.error('RebootActionable execution succeeds. ')
        return True
