4f028caffe
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
112 lines
3.3 KiB
Python
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
|
|
}
|