]> xenbits.xensource.com Git - osstest/openstack-nova.git/commitdiff
Add strict option to discover_hosts
authorEric Berglund <esberglu@us.ibm.com>
Wed, 24 May 2017 02:26:28 +0000 (22:26 -0400)
committerEric Fried <efried@us.ibm.com>
Wed, 7 Jun 2017 20:19:38 +0000 (20:19 +0000)
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)

doc/source/man/nova-manage.rst
nova/cmd/manage.py
nova/tests/unit/test_nova_manage.py

index f6258c5e4b2b479383b586d75176bb3cadc84884..3073665274ccec496a39b41aa294015a4022a807 100644 (file)
@@ -141,14 +141,16 @@ Nova Cells v2
     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]``
 
index 00856c3637d48d2a25e5dd53b0ba9ed35acad967..4fe33da68cef31a7c8454945f4a64010d99b12d7 100644 (file)
@@ -1384,7 +1384,11 @@ class CellV2Commands(object):
                '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
@@ -1397,7 +1401,10 @@ class CellV2Commands(object):
                 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. "
index d9208280009b0ff15694a7c979c29dcfab911afb..b7d85fdeba8aba23fc03d6d5cc1d7a7bd57d4837 100644 (file)
@@ -1386,6 +1386,19 @@ class CellV2CommandsTestCase(test.NoDBTestCase):
 
         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)