Add warning when credential is not specified for each host
User may not set username/password for each host in config option transport_url. All hosts should have username/password, or no host have username/password at the same time. This commit adds warning if user doesn't set properly. Closes-Bug: #1595965 Change-Id: I4e204ce8365274566064168a2ba02c3278579717
This commit is contained in:
@@ -95,6 +95,14 @@ class TestParseURL(test_utils.BaseTestCase):
|
|||||||
username='u', password='p'),
|
username='u', password='p'),
|
||||||
dict(host='host2', port=4321),
|
dict(host='host2', port=4321),
|
||||||
]))),
|
]))),
|
||||||
|
('multi_host_partial_creds',
|
||||||
|
dict(url='foo://u:p@host1,host2/bar', aliases=None,
|
||||||
|
expect=dict(transport='foo',
|
||||||
|
virtual_host='bar',
|
||||||
|
hosts=[
|
||||||
|
dict(host='host1', username='u', password='p'),
|
||||||
|
dict(host='host2'),
|
||||||
|
]))),
|
||||||
('multi_creds',
|
('multi_creds',
|
||||||
dict(url='foo://u1:p1@host1:1234,u2:p2@host2:4321/bar', aliases=None,
|
dict(url='foo://u1:p1@host1:1234,u2:p2@host2:4321/bar', aliases=None,
|
||||||
expect=dict(transport='foo',
|
expect=dict(transport='foo',
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ import six
|
|||||||
from six.moves.urllib import parse
|
from six.moves.urllib import parse
|
||||||
from stevedore import driver
|
from stevedore import driver
|
||||||
|
|
||||||
|
from oslo_messaging._i18n import _LW
|
||||||
from oslo_messaging import exceptions
|
from oslo_messaging import exceptions
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
@@ -372,8 +373,9 @@ class TransportURL(object):
|
|||||||
Netloc is parsed following the sequence bellow:
|
Netloc is parsed following the sequence bellow:
|
||||||
|
|
||||||
* It is first split by ',' in order to support multiple hosts
|
* It is first split by ',' in order to support multiple hosts
|
||||||
* Username and password should be specified for each host, in
|
* All hosts should be specified with username/password or not
|
||||||
case of lack of specification they will be omitted::
|
at the same time. In case of lack of specification, username and
|
||||||
|
password will be omitted::
|
||||||
|
|
||||||
user:pass@host1:port1,host2:port2
|
user:pass@host1:port1,host2:port2
|
||||||
|
|
||||||
@@ -416,6 +418,8 @@ class TransportURL(object):
|
|||||||
if url.path.startswith('/'):
|
if url.path.startswith('/'):
|
||||||
virtual_host = parse.unquote(url.path[1:])
|
virtual_host = parse.unquote(url.path[1:])
|
||||||
|
|
||||||
|
hosts_with_credentials = []
|
||||||
|
hosts_without_credentials = []
|
||||||
hosts = []
|
hosts = []
|
||||||
|
|
||||||
for host in url.netloc.split(','):
|
for host in url.netloc.split(','):
|
||||||
@@ -454,9 +458,23 @@ class TransportURL(object):
|
|||||||
hostname, port = hostname.split(':', 1)
|
hostname, port = hostname.split(':', 1)
|
||||||
port = int(port)
|
port = int(port)
|
||||||
|
|
||||||
|
if username is None or password is None:
|
||||||
|
hosts_without_credentials.append(hostname)
|
||||||
|
else:
|
||||||
|
hosts_with_credentials.append(hostname)
|
||||||
|
|
||||||
hosts.append(TransportHost(hostname=hostname,
|
hosts.append(TransportHost(hostname=hostname,
|
||||||
port=port,
|
port=port,
|
||||||
username=username,
|
username=username,
|
||||||
password=password))
|
password=password))
|
||||||
|
|
||||||
|
if (len(hosts_with_credentials) > 0 and
|
||||||
|
len(hosts_without_credentials) > 0):
|
||||||
|
LOG.warning(_LW("All hosts must be set with username/password or "
|
||||||
|
"not at the same time. Hosts with credentials "
|
||||||
|
"are: %(hosts_with_credentials)s. Hosts without "
|
||||||
|
"credentials are %(hosts_without_credentials)s."),
|
||||||
|
{'hosts_with_credentials': hosts_with_credentials,
|
||||||
|
'hosts_without_credentials':
|
||||||
|
hosts_without_credentials})
|
||||||
return cls(conf, transport, virtual_host, hosts, aliases, query)
|
return cls(conf, transport, virtual_host, hosts, aliases, query)
|
||||||
|
|||||||
Reference in New Issue
Block a user