Make engine configurable, make debugger show local variables

To make it easy to set Mistral for debugging.
1) Make engine configurable.
2) Enable debugger via command line. Passing --use-debugger will make PyDev or PyCharm show
 local variables in debugging session.

Also, a tiny fix in action_factory.

Change-Id: Id054ae5156649b1f6bbba7131e54bf21d71c659a
This commit is contained in:
Dmitri Zimine 2014-02-25 20:11:48 -08:00
parent 368c1d9880
commit b0fa4605ce
7 changed files with 51 additions and 18 deletions

View File

@ -22,10 +22,19 @@ To run Mistral API server perform the following command in a shell:
Note that an example configuration file can be found in etc/mistral.conf.example.
### Running Mistral Task Executors
To run Mistral Task Executor instance perform the following command in a shell:
To run Mistral Task Executor instance perform the following command in a shell::
*tox -evenv -- python mistral/cmd/task_executor.py --config-file path_to_config*
Note that at least one Executor instance should be running so that workflow tasks are processed by Mistral.
### Debugging
To debug the engine, create etc/mistral.conf with the settings::
[engine]
engine = mistral.engine.local.engine
[pecan]
auth_enable = False
and run in pdb, PyDev or PyCharm::
mistral/cmd/api --config-file etc/mistral.conf --use-debugger

View File

@ -19,6 +19,10 @@ default_log_levels = mistral=INFO,mistral.cmd.api=INFO,mistral.api=DEBUG,wsme=DE
host = 0.0.0.0
port = 8989
[engine]
# Mistral engine class (string value)
#engine=mistral.engine.scalable.engine
[pecan]
auth_enable = True

View File

@ -19,6 +19,7 @@ import pecan
from oslo.config import cfg
from mistral import context as ctx
from mistral.engine import engine
from mistral.db import api as db_api
from mistral.services import periodic
from mistral.api import access_control
@ -47,6 +48,7 @@ def setup_app(config=None):
app_conf = dict(config.app)
db_api.setup_db()
engine.load_engine()
##TODO(akuznetsov) move this to event scheduling to separate process
periodic.setup()

View File

@ -29,9 +29,12 @@ from mistral.api import app
from mistral import config
from mistral.openstack.common import log as logging
eventlet.monkey_patch(
os=True, select=True, socket=True, thread=True, time=True)
os=True,
select=True,
socket=True,
thread=False if '--use-debugger' in sys.argv else True,
time=True)
LOG = logging.getLogger('mistral.cmd.api')

View File

@ -24,12 +24,16 @@ from keystoneclient.middleware import auth_token
from mistral.openstack.common import log
from mistral import version
api_opts = [
cfg.StrOpt('host', default='0.0.0.0', help='Mistral API server host'),
cfg.IntOpt('port', default=8989, help='Mistral API server port')
]
engine_opts = [
cfg.StrOpt('engine', default='mistral.engine.scalable.engine',
help='Mistral engine class')
]
pecan_opts = [
cfg.StrOpt('root', default='mistral.api.controllers.root.RootController',
help='Pecan root controller'),
@ -54,14 +58,25 @@ rabbit_opts = [
cfg.StrOpt('rabbit_password', default='guest', help='RabbitMQ password')
]
use_debugger = cfg.BoolOpt(
"use-debugger",
default=False,
help='Enables debugger. Note that using this option changes how the '
'eventlet library is used to support async IO. This could result '
'in failures that do not occur under normal operation. '
'Use at your own risk.'
)
CONF = cfg.CONF
CONF.register_opts(api_opts, group='api')
CONF.register_opts(engine_opts, group='engine')
CONF.register_opts(pecan_opts, group='pecan')
CONF.register_opts(auth_token.opts, group='keystone')
CONF.register_opts(db_opts, group='database')
CONF.register_opts(rabbit_opts, group='rabbit')
CONF.register_cli_opt(use_debugger)
CONF.import_opt('verbose', 'mistral.openstack.common.log')
CONF.import_opt('debug', 'mistral.openstack.common.log')
@ -73,7 +88,6 @@ CONF.import_opt('log_date_format', 'mistral.openstack.common.log')
CONF.import_opt('use_syslog', 'mistral.openstack.common.log')
CONF.import_opt('syslog_log_facility', 'mistral.openstack.common.log')
cfg.set_defaults(log.log_opts,
default_log_levels=['sqlalchemy=WARN',
'eventlet.wsgi.server=WARN'])

View File

@ -45,7 +45,7 @@ def _find_action_result_helper(task, action):
try:
return task['service_dsl']['actions'][action.name].get('output', {})
except (KeyError, AttributeError):
return None
return {}
def get_rest_action(task):

View File

@ -20,15 +20,16 @@ of workflow executions.
"""
from mistral.openstack.common import importutils
from oslo.config import cfg
_engine = None
# TODO(rakhmerov): make it configurable
module_name = "mistral.engine.scalable.engine"
try:
def load_engine():
global _engine
module_name = cfg.CONF.engine.engine
module = importutils.import_module(module_name)
IMPL = module.get_engine()
finally:
pass
_engine = module.get_engine()
def start_workflow_execution(workbook_name, task_name, context=None):
@ -40,7 +41,7 @@ def start_workflow_execution(workbook_name, task_name, context=None):
:param context: Execution context which defines a workflow input
:return: Workflow execution.
"""
return IMPL.start_workflow_execution(workbook_name, task_name, context)
return _engine.start_workflow_execution(workbook_name, task_name, context)
def stop_workflow_execution(workbook_name, execution_id):
@ -50,7 +51,7 @@ def stop_workflow_execution(workbook_name, execution_id):
:param execution_id: Workflow execution id.
:return: Workflow execution.
"""
return IMPL.stop_workflow_execution(workbook_name, execution_id)
return _engine.stop_workflow_execution(workbook_name, execution_id)
def convey_task_result(workbook_name, execution_id, task_id, state, result):
@ -72,8 +73,8 @@ def convey_task_result(workbook_name, execution_id, task_id, state, result):
:param result: Task result data.
:return: Task.
"""
return IMPL.convey_task_result(workbook_name, execution_id, task_id,
state, result)
return _engine.convey_task_result(workbook_name, execution_id, task_id,
state, result)
def get_workflow_execution_state(workbook_name, execution_id):
@ -83,7 +84,7 @@ def get_workflow_execution_state(workbook_name, execution_id):
:param execution_id: Workflow execution id.
:return: Current workflow state.
"""
return IMPL.get_workflow_execution_state(workbook_name, execution_id)
return _engine.get_workflow_execution_state(workbook_name, execution_id)
def get_task_state(workbook_name, execution_id, task_id):
@ -94,4 +95,4 @@ def get_task_state(workbook_name, execution_id, task_id):
:param task_id: Task id.
:return: Current task state.
"""
return IMPL.get_task_state(workbook_name, execution_id, task_id)
return _engine.get_task_state(workbook_name, execution_id, task_id)