Merge "Handle special characters in database connection URL netloc"

This commit is contained in:
Jenkins
2017-05-22 16:40:15 +00:00
committed by Gerrit Code Review
3 changed files with 48 additions and 6 deletions
+14 -6
View File
@@ -70,6 +70,7 @@ from oslo_utils import uuidutils
import prettytable
import six.moves.urllib.parse as urlparse
from sqlalchemy.engine import url as sqla_url
from nova.api.ec2 import ec2utils
from nova import availability_zones
@@ -1215,12 +1216,19 @@ class CellV2Commands(object):
# based on the database connection url.
# The cell0 database will use the same database scheme and
# netloc as the main database, with a related path.
scheme, netloc, path, query, fragment = \
urlparse.urlsplit(CONF.database.connection)
root, ext = os.path.splitext(path)
path = root + "_cell0" + ext
return urlparse.urlunsplit((scheme, netloc, path, query,
fragment))
connection = CONF.database.connection
# sqlalchemy has a nice utility for parsing database connection
# URLs so we use that here to get the db name so we don't have to
# worry about parsing and splitting a URL which could have special
# characters in the password, which makes parsing a nightmare.
url = sqla_url.make_url(connection)
cell0_db_name = url.database + '_cell0'
# We need to handle multiple occurrences of the substring, e.g. if
# the username and db name are both 'nova' we need to only replace
# the last one, which is the database name in the URL, not the
# username.
connection = connection.rstrip(url.database)
return connection + cell0_db_name
dbc = database_connection or cell0_default_connection()
ctxt = context.RequestContext()
+25
View File
@@ -15,6 +15,7 @@
import sys
import ddt
import fixtures
import mock
from oslo_db import exception as db_exc
@@ -809,6 +810,7 @@ class CellCommandsTestCase(test.NoDBTestCase):
mock_db_cell_create.assert_called_once_with(ctxt, exp_values)
@ddt.ddt
class CellV2CommandsTestCase(test.NoDBTestCase):
USES_DB_SELF = True
@@ -1138,6 +1140,29 @@ class CellV2CommandsTestCase(test.NoDBTestCase):
self.assertEqual('fake://netloc/nova_cell0',
cell_mapping.database_connection)
@ddt.data('mysql+pymysql://nova:abcd0123:AB@controller/nova',
'mysql+pymysql://nova:abcd0123?AB@controller/nova',
'mysql+pymysql://nova:abcd0123@AB@controller/nova',
'mysql+pymysql://nova:abcd0123/AB@controller/nova',
'mysql+pymysql://test:abcd0123%AB@controller/nova')
def test_map_cell0_default_database_special_characters(self,
decoded_connection):
"""Tests that a URL with special characters, like in the credentials,
is handled properly.
"""
self.flags(connection=decoded_connection, group='database')
ctxt = context.RequestContext()
self.commands.map_cell0()
cell_mapping = objects.CellMapping.get_by_uuid(
ctxt, objects.CellMapping.CELL0_UUID)
self.assertEqual('cell0', cell_mapping.name)
self.assertEqual('none:///', cell_mapping.transport_url)
self.assertEqual(
decoded_connection + '_cell0',
cell_mapping.database_connection)
# Delete the cell mapping for the next iteration.
cell_mapping.destroy()
def _test_migrate_simple_command(self, cell0_sync_fail=False):
ctxt = context.RequestContext()
CONF.set_default('connection',
@@ -0,0 +1,9 @@
---
fixes:
- |
Includes the fix for `bug 1673613`_ which could cause issues when upgrading
and running ``nova-manage cell_v2 simple_cell_setup`` or
``nova-manage cell_v2 map_cell0`` where the database connection is read
from config and has special characters in the URL.
.. _bug 1673613: https://launchpad.net/bugs/1673613