summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZuul <zuul@review.openstack.org>2018-04-19 18:11:30 +0000
committerGerrit Code Review <review@openstack.org>2018-04-19 18:11:30 +0000
commitb14ed423fe7b0d2112524128b1286a37d5f56c9c (patch)
treefc1ec40f88d4e6254c0d49bad0700d24394ac089
parent39b28d0bc9184b334e5d4f1e525a1f385e48a3d0 (diff)
parent15aed7e0e0b4564d78db466e565e612eda6c502a (diff)
downloadnova-b14ed423fe7b0d2112524128b1286a37d5f56c9c.tar.gz
Merge "ironic: Get correct inventory for deployed node" into stable/pike
-rw-r--r--nova/tests/unit/virt/ironic/test_driver.py31
-rw-r--r--nova/virt/ironic/driver.py3
2 files changed, 27 insertions, 7 deletions
diff --git a/nova/tests/unit/virt/ironic/test_driver.py b/nova/tests/unit/virt/ironic/test_driver.py
index f534df6333..4d6b82337a 100644
--- a/nova/tests/unit/virt/ironic/test_driver.py
+++ b/nova/tests/unit/virt/ironic/test_driver.py
@@ -734,10 +734,13 @@ class IronicDriverTestCase(test.NoDBTestCase):
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.
"""
@@ -781,14 +784,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.
@@ -841,14 +848,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.
@@ -877,15 +888,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.
"""
@@ -937,18 +951,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 6e2c8d3166..2b8e86b690 100644
--- a/nova/virt/ironic/driver.py
+++ b/nova/virt/ironic/driver.py
@@ -757,7 +757,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, '