This adds a --strict option that can be passed in when calling the
nova-manage cell_v2 discover_hosts command. When this option is used,
the command will only return success if a new host has been found.
In any other case it is considered a failure.
Closes-Bug: #
1692982
Change-Id: I942af11a3987e1edce67423c66931ad9ece65587
(cherry picked from commit
aaae213bf32096c56cb1bfcb4d0ac3cafd1c13fb)
transport url or database connection was missing, and 2 if a cell is
already using that transport url and database connection combination.
-``nova-manage cell_v2 discover_hosts [--cell_uuid <cell_uuid>] [--verbose]``
+``nova-manage cell_v2 discover_hosts [--cell_uuid <cell_uuid>] [--verbose] [--strict]``
Searches cells, or a single cell, and maps found hosts. This command will
check the database for each cell (or a single one if passed in) and map
any hosts which are not currently mapped. If a host is already mapped
nothing will be done. You need to re-run this command each time you add
more compute hosts to a cell (otherwise the scheduler will never place
- instances there).
+ instances there). If the strict option is provided the command will only
+ be considered successful if an unmapped host is discovered (exit code 0).
+ Any other case is considered a failure (exit code 1).
``nova-manage cell_v2 list_cells [--verbose]``
'map.')
@args('--verbose', action='store_true',
help=_('Provide detailed output when discovering hosts.'))
- def discover_hosts(self, cell_uuid=None, verbose=False):
+ @args('--strict', action='store_true',
+ help=_('Considered successful (exit code 0) only when an unmapped '
+ 'host is discovered. Any other outcome will be considered a '
+ 'failure (exit code 1).'))
+ def discover_hosts(self, cell_uuid=None, verbose=False, strict=False):
"""Searches cells, or a single cell, and maps found hosts.
When a new host is added to a deployment it will add a service entry
print(msg)
ctxt = context.RequestContext()
- host_mapping_obj.discover_hosts(ctxt, cell_uuid, status_fn)
+ hosts = host_mapping_obj.discover_hosts(ctxt, cell_uuid, status_fn)
+ # discover_hosts will return an empty list if no hosts are discovered
+ if strict:
+ return int(not hosts)
@action_description(
_("Add a new cell to nova API database. "
mock_cell_mapping_get_by_uuid.assert_not_called()
+ @mock.patch('nova.objects.host_mapping.discover_hosts')
+ def test_discover_hosts_strict(self, mock_discover_hosts):
+ # Check for exit code 0 if unmapped hosts found
+ mock_discover_hosts.return_value = ['fake']
+ self.assertEqual(self.commands.discover_hosts(strict=True), 0)
+
+ # Check for exit code 1 if no unmapped hosts are found
+ mock_discover_hosts.return_value = []
+ self.assertEqual(self.commands.discover_hosts(strict=True), 1)
+
+ # Check the return when strict=False
+ self.assertIsNone(self.commands.discover_hosts())
+
def test_validate_transport_url_in_conf(self):
from_conf = 'fake://user:pass@host:port/'
self.flags(transport_url=from_conf)