
Before the 2.0 release it would be great to get these removed so let's mark that version as the version that will no longer have these in it. Change-Id: I66a74d270bf95db005e9febfce1a5e211c7a49f6
132 lines
4.4 KiB
Python
132 lines
4.4 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
# Copyright (C) 2013 Yahoo! Inc. All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
|
|
import abc
|
|
|
|
from debtcollector import moves
|
|
import six
|
|
|
|
from taskflow.types import notifier
|
|
|
|
|
|
@six.add_metaclass(abc.ABCMeta)
|
|
class Engine(object):
|
|
"""Base for all engines implementations.
|
|
|
|
:ivar notifier: A notification object that will dispatch events that
|
|
occur related to the flow the engine contains.
|
|
:ivar task_notifier: A notification object that will dispatch events that
|
|
occur related to the tasks the engine contains.
|
|
occur related to the tasks the engine
|
|
contains (deprecated).
|
|
:ivar atom_notifier: A notification object that will dispatch events that
|
|
occur related to the atoms the engine contains.
|
|
"""
|
|
|
|
def __init__(self, flow, flow_detail, backend, options):
|
|
self._flow = flow
|
|
self._flow_detail = flow_detail
|
|
self._backend = backend
|
|
if not options:
|
|
self._options = {}
|
|
else:
|
|
self._options = dict(options)
|
|
self._notifier = notifier.Notifier()
|
|
self._atom_notifier = notifier.Notifier()
|
|
|
|
@property
|
|
def notifier(self):
|
|
"""The flow notifier."""
|
|
return self._notifier
|
|
|
|
@property
|
|
@moves.moved_property('atom_notifier', version="0.6",
|
|
removal_version="2.0")
|
|
def task_notifier(self):
|
|
"""The task notifier.
|
|
|
|
.. deprecated:: 0.6
|
|
|
|
The property is **deprecated** and is present for
|
|
backward compatibility **only**. In order to access this
|
|
property going forward the :py:attr:`.atom_notifier` should
|
|
be used instead.
|
|
"""
|
|
return self._atom_notifier
|
|
|
|
@property
|
|
def atom_notifier(self):
|
|
"""The atom notifier."""
|
|
return self._atom_notifier
|
|
|
|
@property
|
|
def options(self):
|
|
"""The options that were passed to this engine on construction."""
|
|
return self._options
|
|
|
|
@abc.abstractproperty
|
|
def storage(self):
|
|
"""The storage unit for this engine."""
|
|
|
|
@abc.abstractmethod
|
|
def compile(self):
|
|
"""Compiles the contained flow into a internal representation.
|
|
|
|
This internal representation is what the engine will *actually* use to
|
|
run. If this compilation can not be accomplished then an exception
|
|
is expected to be thrown with a message indicating why the compilation
|
|
could not be achieved.
|
|
"""
|
|
|
|
@abc.abstractmethod
|
|
def prepare(self):
|
|
"""Performs any pre-run, but post-compilation actions.
|
|
|
|
NOTE(harlowja): During preparation it is currently assumed that the
|
|
underlying storage will be initialized, the atoms will be reset and
|
|
the engine will enter the PENDING state.
|
|
"""
|
|
|
|
@abc.abstractmethod
|
|
def validate(self):
|
|
"""Performs any pre-run, post-prepare validation actions.
|
|
|
|
NOTE(harlowja): During validation all final dependencies
|
|
will be verified and ensured. This will by default check that all
|
|
atoms have satisfiable requirements (satisfied by some other
|
|
provider).
|
|
"""
|
|
|
|
@abc.abstractmethod
|
|
def run(self):
|
|
"""Runs the flow in the engine to completion (or die trying)."""
|
|
|
|
@abc.abstractmethod
|
|
def suspend(self):
|
|
"""Attempts to suspend the engine.
|
|
|
|
If the engine is currently running atoms then this will attempt to
|
|
suspend future work from being started (currently active atoms can
|
|
not currently be preempted) and move the engine into a suspend state
|
|
which can then later be resumed from.
|
|
"""
|
|
|
|
|
|
# TODO(harlowja): remove in 0.7 or later...
|
|
EngineBase = moves.moved_class(Engine, 'EngineBase', __name__,
|
|
version="0.6", removal_version="2.0")
|