From 4bfc5502611d3f04f8b748769e82f37f8477e664 Mon Sep 17 00:00:00 2001 From: Matt Riedemann Date: Sun, 15 Jan 2017 14:10:28 -0500 Subject: [PATCH] Add nova-manage cell_v2 list_cells command We have some commands which create cells and some commands which take a cell uuid as an argument but don't have a way to list cells, so this adds a command to do that. Change-Id: I0f79e8c16c41ed45f9f59c20644511c7f130cdf9 Closes-Bug: #1656675 --- nova/cmd/manage.py | 24 ++++++++++++++++++ nova/tests/unit/test_nova_manage.py | 39 +++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/nova/cmd/manage.py b/nova/cmd/manage.py index ceb365380b..0c45695f84 100644 --- a/nova/cmd/manage.py +++ b/nova/cmd/manage.py @@ -1441,6 +1441,30 @@ class CellV2Commands(object): print(cell_mapping_uuid) return 0 + @args('--verbose', action='store_true', + help=_('Show more details than just the cell name and uuid.')) + def list_cells(self, verbose=False): + """Lists the v2 cells in the deployment. + + By default only the cell name and uuid are shown. Use the --verbose + option to see transport URL and database connection details. + """ + cell_mappings = objects.CellMappingList.get_all( + context.get_admin_context()) + + field_names = [_('Name'), _('UUID')] + if verbose: + field_names.extend([_('Transport URL'), _('Database Connection')]) + + t = prettytable.PrettyTable(field_names) + for cell in sorted(cell_mappings, key=lambda _cell: _cell.name): + fields = [cell.name, cell.uuid] + if verbose: + fields.extend([cell.transport_url, cell.database_connection]) + t.add_row(fields) + print(t) + return 0 + CATEGORIES = { 'account': AccountCommands, diff --git a/nova/tests/unit/test_nova_manage.py b/nova/tests/unit/test_nova_manage.py index 1f6de46170..7c123c0070 100644 --- a/nova/tests/unit/test_nova_manage.py +++ b/nova/tests/unit/test_nova_manage.py @@ -1426,6 +1426,45 @@ class CellV2CommandsTestCase(test.NoDBTestCase): self.assertEqual(1, status) self.assertIn('--database_connection', self.output.getvalue()) + def test_list_cells_no_cells_verbose_false(self): + self.assertEqual(0, self.commands.list_cells()) + output = self.output.getvalue().strip() + self.assertEqual('''\ ++------+------+ +| Name | UUID | ++------+------+ ++------+------+''', output) + + def test_list_cells_multiple_sorted_verbose_true(self): + ctxt = context.RequestContext() + # This uses fake uuids so the table can stay under 80 characeters. + cell_mapping0 = objects.CellMapping( + context=ctxt, uuid='00000000-0000-0000', + database_connection='fake:///db0', transport_url='none:///', + name='cell0') + cell_mapping0.create() + cell_mapping1 = objects.CellMapping( + context=ctxt, uuid='9e36a3ed-3eb6-4327', + database_connection='fake:///dblon', transport_url='fake:///mqlon', + name='london') + cell_mapping1.create() + cell_mapping2 = objects.CellMapping( + context=ctxt, uuid='8a3c608c-b275-496c', + database_connection='fake:///dbdal', transport_url='fake:///mqdal', + name='dallas') + cell_mapping2.create() + self.assertEqual(0, self.commands.list_cells(verbose=True)) + output = self.output.getvalue().strip() + self.assertEqual('''\ ++--------+--------------------+---------------+---------------------+ +| Name | UUID | Transport URL | Database Connection | ++--------+--------------------+---------------+---------------------+ +| cell0 | 00000000-0000-0000 | none:/// | fake:///db0 | +| dallas | 8a3c608c-b275-496c | fake:///mqdal | fake:///dbdal | +| london | 9e36a3ed-3eb6-4327 | fake:///mqlon | fake:///dblon | ++--------+--------------------+---------------+---------------------+''', + output) + class TestNovaManageMain(test.NoDBTestCase): """Tests the nova-manage:main() setup code."""