Provide hints when nova-manage db sync fails to sync cell0

Lots of people get tripped up on the error message when
syncing cell0 fails and the question asked is confusing and
possibly misleading, so this change includes several questions
for troubleshooting and also dumps the actual error message.

Related-Bug: #1706118

Change-Id: I865f76705f10493152af50b9842c6fedc563fea4
This commit is contained in:
Matt Riedemann 2017-07-24 11:30:35 -04:00 committed by Stephen Finucane
parent 8c48863d7c
commit 05f3d9d39b
2 changed files with 30 additions and 3 deletions

View File

@ -732,9 +732,15 @@ class DbCommands(object):
except exception.CellMappingNotFound:
print(_('WARNING: cell0 mapping not found - not'
' syncing cell0.'))
except Exception:
print(_('ERROR: could not access cell mapping database - has'
' api db been created?'))
except Exception as e:
print(_("""ERROR: Could not access cell0.
Has the nova_api database been created?
Has the nova_cell0 database been created?
Has "nova-manage api_db sync" been run?
Has "nova-manage cell_v2 map_cell0" been run?
Is [api_database]/connection set in nova.conf?
Is the cell0 database connection URL correct?
Error: %s""") % six.text_type(e))
return migration.db_sync(version)
def version(self):

View File

@ -567,6 +567,27 @@ Archiving.....stopped
]
mock_db_sync.assert_has_calls(db_sync_calls)
@mock.patch.object(objects.CellMapping, 'get_by_uuid',
side_effect=test.TestingException('invalid connection'))
def test_sync_cell0_unknown_error(self, mock_get_by_uuid):
"""Asserts that a detailed error message is given when an unknown
error occurs trying to get the cell0 cell mapping.
"""
self.commands.sync()
mock_get_by_uuid.assert_called_once_with(
test.MatchType(context.RequestContext),
objects.CellMapping.CELL0_UUID)
expected = """ERROR: Could not access cell0.
Has the nova_api database been created?
Has the nova_cell0 database been created?
Has "nova-manage api_db sync" been run?
Has "nova-manage cell_v2 map_cell0" been run?
Is [api_database]/connection set in nova.conf?
Is the cell0 database connection URL correct?
Error: invalid connection
"""
self.assertEqual(expected, self.output.getvalue())
def _fake_db_command(self, migrations=None):
if migrations is None:
mock_mig_1 = mock.MagicMock(__name__="mock_mig_1")