diff --git a/nova/tests/unit/virt/ironic/test_driver.py b/nova/tests/unit/virt/ironic/test_driver.py index dadc6b8c759e..c60eb56d3a05 100644 --- a/nova/tests/unit/virt/ironic/test_driver.py +++ b/nova/tests/unit/virt/ironic/test_driver.py @@ -734,11 +734,14 @@ class IronicDriverTestCase(test.NoDBTestCase): expected_uuids = [n['uuid'] for n in node_dicts if n['expected']] self.assertEqual(sorted(expected_uuids), sorted(available_nodes)) + @mock.patch.object(ironic_driver.IronicDriver, + '_node_resources_used', return_value=False) @mock.patch.object(ironic_driver.IronicDriver, '_node_resources_unavailable', return_value=False) @mock.patch.object(ironic_driver.IronicDriver, '_node_resource') @mock.patch.object(ironic_driver.IronicDriver, '_node_from_cache') - def test_get_inventory_no_rc(self, mock_nfc, mock_nr, mock_res_unavail): + def test_get_inventory_no_rc(self, mock_nfc, mock_nr, mock_res_unavail, + mock_res_used): """Ensure that when node.resource_class is missing, that we return the legacy VCPU, MEMORY_MB and DISK_GB resources for inventory. """ @@ -782,14 +785,18 @@ class IronicDriverTestCase(test.NoDBTestCase): } mock_nfc.assert_called_once_with(mock.sentinel.nodename) mock_nr.assert_called_once_with(mock_nfc.return_value) + mock_res_used.assert_called_once_with(mock_nfc.return_value) mock_res_unavail.assert_called_once_with(mock_nfc.return_value) self.assertEqual(expected, result) + @mock.patch.object(ironic_driver.IronicDriver, + '_node_resources_used', return_value=False) @mock.patch.object(ironic_driver.IronicDriver, '_node_resources_unavailable', return_value=False) @mock.patch.object(ironic_driver.IronicDriver, '_node_resource') @mock.patch.object(ironic_driver.IronicDriver, '_node_from_cache') - def test_get_inventory_with_rc(self, mock_nfc, mock_nr, mock_res_unavail): + def test_get_inventory_with_rc(self, mock_nfc, mock_nr, mock_res_unavail, + mock_res_used): """Ensure that when node.resource_class is present, that we return the legacy VCPU, MEMORY_MB and DISK_GB resources for inventory in addition to the custom resource class inventory record. @@ -842,14 +849,18 @@ class IronicDriverTestCase(test.NoDBTestCase): } mock_nfc.assert_called_once_with(mock.sentinel.nodename) mock_nr.assert_called_once_with(mock_nfc.return_value) + mock_res_used.assert_called_once_with(mock_nfc.return_value) mock_res_unavail.assert_called_once_with(mock_nfc.return_value) self.assertEqual(expected, result) + @mock.patch.object(ironic_driver.IronicDriver, + '_node_resources_used', return_value=False) @mock.patch.object(ironic_driver.IronicDriver, '_node_resources_unavailable', return_value=False) @mock.patch.object(ironic_driver.IronicDriver, '_node_resource') @mock.patch.object(ironic_driver.IronicDriver, '_node_from_cache') - def test_get_inventory_only_rc(self, mock_nfc, mock_nr, mock_res_unavail): + def test_get_inventory_only_rc(self, mock_nfc, mock_nr, mock_res_unavail, + mock_res_used): """Ensure that when node.resource_class is present, that we return the legacy VCPU, MEMORY_MB and DISK_GB resources for inventory in addition to the custom resource class inventory record. @@ -878,15 +889,18 @@ class IronicDriverTestCase(test.NoDBTestCase): } mock_nfc.assert_called_once_with(mock.sentinel.nodename) mock_nr.assert_called_once_with(mock_nfc.return_value) + mock_res_used.assert_called_once_with(mock_nfc.return_value) mock_res_unavail.assert_called_once_with(mock_nfc.return_value) self.assertEqual(expected, result) + @mock.patch.object(ironic_driver.IronicDriver, + '_node_resources_used', return_value=True) @mock.patch.object(ironic_driver.IronicDriver, '_node_resources_unavailable', return_value=False) @mock.patch.object(ironic_driver.IronicDriver, '_node_resource') @mock.patch.object(ironic_driver.IronicDriver, '_node_from_cache') def test_get_inventory_with_rc_occupied(self, mock_nfc, mock_nr, - mock_res_unavail): + mock_res_unavail, mock_res_used): """Ensure that when a node is used, we report the inventory matching the consumed resources. """ @@ -938,18 +952,23 @@ class IronicDriverTestCase(test.NoDBTestCase): } mock_nfc.assert_called_once_with(mock.sentinel.nodename) mock_nr.assert_called_once_with(mock_nfc.return_value) - mock_res_unavail.assert_called_once_with(mock_nfc.return_value) + mock_res_used.assert_called_once_with(mock_nfc.return_value) + self.assertFalse(mock_res_unavail.called) self.assertEqual(expected, result) + @mock.patch.object(ironic_driver.IronicDriver, + '_node_resources_used', return_value=False) @mock.patch.object(ironic_driver.IronicDriver, '_node_resources_unavailable', return_value=True) @mock.patch.object(ironic_driver.IronicDriver, '_node_from_cache') - def test_get_inventory_disabled_node(self, mock_nfc, mock_res_unavail): + def test_get_inventory_disabled_node(self, mock_nfc, mock_res_unavail, + mock_res_used): """Ensure that when a node is disabled, that get_inventory() returns an empty dict. """ result = self.driver.get_inventory(mock.sentinel.nodename) mock_nfc.assert_called_once_with(mock.sentinel.nodename) + mock_res_used.assert_called_once_with(mock_nfc.return_value) mock_res_unavail.assert_called_once_with(mock_nfc.return_value) self.assertEqual({}, result) diff --git a/nova/virt/ironic/driver.py b/nova/virt/ironic/driver.py index a32f8bdd3ceb..a2feb16462b7 100644 --- a/nova/virt/ironic/driver.py +++ b/nova/virt/ironic/driver.py @@ -768,7 +768,8 @@ class IronicDriver(virt_driver.ComputeDriver): # and DISK_GB resource classes in early Queens when Ironic nodes will # *always* return the custom resource class that represents the # baremetal node class in an atomic, singular unit. - if self._node_resources_unavailable(node): + if (not self._node_resources_used(node) and + self._node_resources_unavailable(node)): # TODO(dtantsur): report resources as reserved instead of reporting # an empty inventory LOG.debug('Node %(node)s is not ready for a deployment, '