Merge "Validate transport_url in nova-manage cell_v2 commands"

This commit is contained in:
Zuul 2018-09-25 10:10:23 +00:00 committed by Gerrit Code Review
commit 2f635fa914
3 changed files with 28 additions and 16 deletions

View File

@ -149,8 +149,8 @@ Nova Cells v2
specified, it will use the one defined by ``[DEFAULT]/transport_url`` specified, it will use the one defined by ``[DEFAULT]/transport_url``
in the configuration file. Returns 0 if setup is completed in the configuration file. Returns 0 if setup is completed
(or has already been done), 1 if no hosts are reporting (and cannot be (or has already been done), 1 if no hosts are reporting (and cannot be
mapped), 1 if the transport url is missing, and 2 if run in a cells v1 mapped), 1 if the transport url is missing or invalid, and 2 if run in a
environment. cells v1 environment.
``nova-manage cell_v2 map_cell0 [--database_connection <database_connection>]`` ``nova-manage cell_v2 map_cell0 [--database_connection <database_connection>]``
Create a cell mapping to the database connection for the cell0 database. Create a cell mapping to the database connection for the cell0 database.
@ -184,7 +184,7 @@ Nova Cells v2
use the one defined by ``[DEFAULT]/transport_url`` in the configuration use the one defined by ``[DEFAULT]/transport_url`` in the configuration
file. This command is idempotent (can be run multiple times), and the file. This command is idempotent (can be run multiple times), and the
verbose option will print out the resulting cell mapping uuid. Returns 0 verbose option will print out the resulting cell mapping uuid. Returns 0
on successful completion, and 1 if the transport url is missing. on successful completion, and 1 if the transport url is missing or invalid.
``nova-manage cell_v2 verify_instance --uuid <instance_uuid> [--quiet]`` ``nova-manage cell_v2 verify_instance --uuid <instance_uuid> [--quiet]``
Verify instance mapping to a cell. This command is useful to determine if Verify instance mapping to a cell. This command is useful to determine if
@ -211,7 +211,8 @@ Nova Cells v2
explained below: explained below:
* Returns 0 if the cell mapping was successfully created. * Returns 0 if the cell mapping was successfully created.
* Returns 1 if the transport url or database connection was missing. * Returns 1 if the transport url or database connection was missing
or invalid.
* Returns 2 if another cell is already using that transport url and/or * Returns 2 if another cell is already using that transport url and/or
database connection combination. database connection combination.

View File

@ -1028,6 +1028,14 @@ class CellV2Commands(object):
if not transport_url: if not transport_url:
print('Must specify --transport-url if [DEFAULT]/transport_url ' print('Must specify --transport-url if [DEFAULT]/transport_url '
'is not set in the configuration file.') 'is not set in the configuration file.')
return None
try:
messaging.TransportURL.parse(conf=CONF, url=transport_url)
except (messaging.InvalidTransportURL, ValueError) as e:
print(_('Invalid transport URL: %s') % six.text_type(e))
return None
return transport_url return transport_url
def _non_unique_transport_url_database_connection_checker(self, ctxt, def _non_unique_transport_url_database_connection_checker(self, ctxt,
@ -1442,11 +1450,10 @@ class CellV2Commands(object):
def create_cell(self, name=None, database_connection=None, def create_cell(self, name=None, database_connection=None,
transport_url=None, verbose=False, disabled=False): transport_url=None, verbose=False, disabled=False):
ctxt = context.get_context() ctxt = context.get_context()
transport_url = transport_url or CONF.transport_url transport_url = self._validate_transport_url(transport_url)
if not transport_url: if not transport_url:
print(_('Must specify --transport-url if [DEFAULT]/transport_url '
'is not set in the configuration file.'))
return 1 return 1
database_connection = database_connection or CONF.database.connection database_connection = database_connection or CONF.database.connection
if not database_connection: if not database_connection:
print(_('Must specify --database_connection ' print(_('Must specify --database_connection '

View File

@ -1739,13 +1739,13 @@ class CellV2CommandsTestCase(test.NoDBTestCase):
True) True)
def test_validate_transport_url_in_conf(self): def test_validate_transport_url_in_conf(self):
from_conf = 'fake://user:pass@host:port/' from_conf = 'fake://user:pass@host:5672/'
self.flags(transport_url=from_conf) self.flags(transport_url=from_conf)
self.assertEqual(from_conf, self.assertEqual(from_conf,
self.commands._validate_transport_url(None)) self.commands._validate_transport_url(None))
def test_validate_transport_url_on_command_line(self): def test_validate_transport_url_on_command_line(self):
from_cli = 'fake://user:pass@host:port/' from_cli = 'fake://user:pass@host:5672/'
self.assertEqual(from_cli, self.assertEqual(from_cli,
self.commands._validate_transport_url(from_cli)) self.commands._validate_transport_url(from_cli))
@ -1754,11 +1754,15 @@ class CellV2CommandsTestCase(test.NoDBTestCase):
self.assertIsNone(self.commands._validate_transport_url(None)) self.assertIsNone(self.commands._validate_transport_url(None))
def test_validate_transport_url_favors_command_line(self): def test_validate_transport_url_favors_command_line(self):
self.flags(transport_url='fake://user:pass@host:port/') self.flags(transport_url='fake://user:pass@host:5672/')
from_cli = 'fake://otheruser:otherpass@otherhost:otherport' from_cli = 'fake://otheruser:otherpass@otherhost:5673'
self.assertEqual(from_cli, self.assertEqual(from_cli,
self.commands._validate_transport_url(from_cli)) self.commands._validate_transport_url(from_cli))
def test_validate_transport_url_invalid_url(self):
self.assertIsNone(self.commands._validate_transport_url('not-a-url'))
self.assertIn('Invalid transport URL', self.output.getvalue())
def test_non_unique_transport_url_database_connection_checker(self): def test_non_unique_transport_url_database_connection_checker(self):
ctxt = context.RequestContext() ctxt = context.RequestContext()
cell1 = objects.CellMapping(context=ctxt, uuid=uuidsentinel.cell1, cell1 = objects.CellMapping(context=ctxt, uuid=uuidsentinel.cell1,
@ -1792,7 +1796,7 @@ class CellV2CommandsTestCase(test.NoDBTestCase):
ctxt = context.get_context() ctxt = context.get_context()
kwargs = dict( kwargs = dict(
name='fake-name', name='fake-name',
transport_url='fake-transport-url', transport_url='http://fake-transport-url',
database_connection='fake-db-connection') database_connection='fake-db-connection')
status = self.commands.create_cell(verbose=True, **kwargs) status = self.commands.create_cell(verbose=True, **kwargs)
self.assertEqual(0, status) self.assertEqual(0, status)
@ -1807,7 +1811,7 @@ class CellV2CommandsTestCase(test.NoDBTestCase):
def test_create_cell_use_config_values(self): def test_create_cell_use_config_values(self):
settings = dict( settings = dict(
transport_url='fake-conf-transport-url', transport_url='http://fake-conf-transport-url',
database_connection='fake-conf-db-connection') database_connection='fake-conf-db-connection')
self.flags(connection=settings['database_connection'], self.flags(connection=settings['database_connection'],
group='database') group='database')
@ -1826,7 +1830,7 @@ class CellV2CommandsTestCase(test.NoDBTestCase):
def test_create_cell_failed_if_non_unique(self): def test_create_cell_failed_if_non_unique(self):
kwargs = dict( kwargs = dict(
name='fake-name', name='fake-name',
transport_url='fake-transport-url', transport_url='http://fake-transport-url',
database_connection='fake-db-connection') database_connection='fake-db-connection')
status1 = self.commands.create_cell(verbose=True, **kwargs) status1 = self.commands.create_cell(verbose=True, **kwargs)
status2 = self.commands.create_cell(verbose=True, **kwargs) status2 = self.commands.create_cell(verbose=True, **kwargs)
@ -1842,7 +1846,7 @@ class CellV2CommandsTestCase(test.NoDBTestCase):
def test_create_cell_failed_if_no_database_connection(self): def test_create_cell_failed_if_no_database_connection(self):
self.flags(connection=None, group='database') self.flags(connection=None, group='database')
status = self.commands.create_cell(transport_url='fake-transport-url') status = self.commands.create_cell(transport_url='http://fake-url')
self.assertEqual(1, status) self.assertEqual(1, status)
self.assertIn('--database_connection', self.output.getvalue()) self.assertIn('--database_connection', self.output.getvalue())
@ -1850,7 +1854,7 @@ class CellV2CommandsTestCase(test.NoDBTestCase):
ctxt = context.get_context() ctxt = context.get_context()
kwargs = dict( kwargs = dict(
name='fake-name1', name='fake-name1',
transport_url='fake-transport-url1', transport_url='http://fake-transport-url1',
database_connection='fake-db-connection1') database_connection='fake-db-connection1')
status1 = self.commands.create_cell(verbose=True, disabled=True, status1 = self.commands.create_cell(verbose=True, disabled=True,
**kwargs) **kwargs)