deb-mistral/mistral/utils/rpc_utils.py
Dawid Deja 4f028caffe Make mistral work with amqp and zmq backends
Since adding alternative rpc layer all services was throwing
exception on start if rpc_backend was different from 'rabbit'.
This patch change this behaviour and make mistral work again
with zmq and amqp.

Change-Id: I704e218ea800193504e3be9974627056db4a88b4
2016-08-08 17:22:36 +02:00

112 lines
3.3 KiB
Python

# Copyright 2015 - Mirantis, Inc.
#
# 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.
from oslo_config import cfg
import oslo_messaging as messaging
from mistral import exceptions as exc
from mistral import utils
CONF = cfg.CONF
CONF.import_opt('rpc_response_timeout', 'mistral.config')
def get_rpc_info_from_oslo(additional_conf=None):
transport = messaging.TransportURL.parse(CONF, CONF.transport_url)
rpc_backend = _get_rpc_backend(transport)
conf_dict = _get_rpc_info(rpc_backend, transport)
return utils.merge_dicts(conf_dict, _get_extra_info(additional_conf, ))
def _get_rpc_backend(transport):
if transport:
return transport.transport
return CONF.rpc_backend
def _get_rpc_info(rpc_backend, transport):
if rpc_backend in ['amqp', 'zmq']:
return {}
elif transport and len(transport.hosts) == 1:
# TODO(ddeja): Handle multiple hosts.
return _get_rpc_info_from_transport_url(transport, rpc_backend)
elif rpc_backend in ['rabbit', 'fake']:
return _get_rabbit_info_from_oslo()
else:
raise exc.MistralException(
'Mistral cannot run with rpc_backend %s' % rpc_backend
)
def _get_rpc_info_from_transport_url(transport, rpc_backend):
if rpc_backend in ['rabbit', 'fake']:
durable_queues = CONF.oslo_messaging_rabbit.amqp_durable_queues
auto_delete = CONF.oslo_messaging_rabbit.amqp_auto_delete
else:
raise exc.MistralException(
'Mistral cannot run with rpc_backend %s' % rpc_backend
)
transport_host = transport.hosts[0]
return _prepare_conf_dict(
transport_host.username,
transport_host.password,
transport_host.hostname,
transport_host.port,
transport.virtual_host or '/',
durable_queues,
auto_delete
)
def _get_rabbit_info_from_oslo():
return _prepare_conf_dict(
CONF.oslo_messaging_rabbit.rabbit_userid,
CONF.oslo_messaging_rabbit.rabbit_password,
CONF.oslo_messaging_rabbit.rabbit_host,
CONF.oslo_messaging_rabbit.rabbit_port,
CONF.oslo_messaging_rabbit.rabbit_virtual_host,
CONF.oslo_messaging_rabbit.amqp_durable_queues,
CONF.oslo_messaging_rabbit.amqp_auto_delete,
)
def _prepare_conf_dict(user_id, password, host, port, virtual_host,
durable_queues, auto_delete):
return {
'user_id': user_id,
'password': password,
'host': host,
'port': port,
'virtual_host': virtual_host,
'durable_queues': durable_queues,
'auto_delete': auto_delete
}
def _get_extra_info(additional_conf):
return {
'exchange': CONF.control_exchange,
'topic': additional_conf.topic,
'server_id': additional_conf.host,
'timeout': CONF.rpc_response_timeout
}