summaryrefslogtreecommitdiff
path: root/nova
diff options
context:
space:
mode:
Diffstat (limited to 'nova')
-rw-r--r--nova/compute/manager.py83
-rw-r--r--nova/test.py4
-rw-r--r--nova/tests/functional/compute/test_resource_tracker.py2
-rw-r--r--nova/tests/functional/notification_sample_tests/test_metrics.py2
-rw-r--r--nova/tests/functional/test_compute_mgr.py2
-rw-r--r--nova/tests/functional/test_servers.py5
-rw-r--r--nova/tests/unit/compute/fake_resource_tracker.py9
-rw-r--r--nova/tests/unit/compute/test_compute.py51
-rw-r--r--nova/tests/unit/compute/test_compute_mgr.py154
9 files changed, 118 insertions, 194 deletions
diff --git a/nova/compute/manager.py b/nova/compute/manager.py
index 0b996a5626..937b097049 100644
--- a/nova/compute/manager.py
+++ b/nova/compute/manager.py
@@ -507,8 +507,6 @@ class ComputeManager(manager.Manager):
openstack_driver.is_neutron_security_groups())
self.cells_rpcapi = cells_rpcapi.CellsAPI()
self.query_client = query.SchedulerQueryClient()
- self._reportclient = None
- self._resource_tracker = None
self.instance_events = InstanceEvents()
self._sync_power_pool = eventlet.GreenPool(
size=CONF.sync_power_state_pool_size)
@@ -538,31 +536,20 @@ class ComputeManager(manager.Manager):
self.driver = driver.load_compute_driver(self.virtapi, compute_driver)
self.use_legacy_block_device_info = \
self.driver.need_legacy_block_device_info
+ self.rt = resource_tracker.ResourceTracker(self.host, self.driver)
+ self.reportclient = self.rt.reportclient
def reset(self):
LOG.info('Reloading compute RPC API')
compute_rpcapi.LAST_VERSION = None
self.compute_rpcapi = compute_rpcapi.ComputeAPI()
- self._get_resource_tracker().reportclient.clear_provider_cache()
-
- def _get_resource_tracker(self):
- if not self._resource_tracker:
- rt = resource_tracker.ResourceTracker(self.host, self.driver)
- self._resource_tracker = rt
- return self._resource_tracker
-
- @property
- def reportclient(self):
- if not self._reportclient:
- self._reportclient = self._get_resource_tracker().reportclient
- return self._reportclient
+ self.reportclient.clear_provider_cache()
def _update_resource_tracker(self, context, instance):
"""Let the resource tracker know that an instance has changed state."""
if instance.host == self.host:
- rt = self._get_resource_tracker()
- rt.update_usage(context, instance, instance.node)
+ self.rt.update_usage(context, instance, instance.node)
def _instance_update(self, context, instance, **kwargs):
"""Update an instance in the database using kwargs as value."""
@@ -1801,14 +1788,12 @@ class ComputeManager(manager.Manager):
def _build_failed(self, node):
if CONF.compute.consecutive_build_service_disable_threshold:
- rt = self._get_resource_tracker()
# NOTE(danms): Update our counter, but wait for the next
# update_available_resource() periodic to flush it to the DB
- rt.build_failed(node)
+ self.rt.build_failed(node)
def _build_succeeded(self, node):
- rt = self._get_resource_tracker()
- rt.build_succeeded(node)
+ self.rt.build_succeeded(node)
@wrap_exception()
@reverts_task_state
@@ -2093,8 +2078,7 @@ class ComputeManager(manager.Manager):
try:
scheduler_hints = self._get_scheduler_hints(filter_properties,
request_spec)
- rt = self._get_resource_tracker()
- with rt.instance_claim(context, instance, node, limits):
+ with self.rt.instance_claim(context, instance, node, limits):
# NOTE(russellb) It's important that this validation be done
# *after* the resource tracker instance claim, as that is where
# the host is set on the instance.
@@ -2983,11 +2967,10 @@ class ComputeManager(manager.Manager):
else:
LOG.info("Rebuilding instance", instance=instance)
- rt = self._get_resource_tracker()
if evacuate:
# This is an evacuation to a new host, so we need to perform a
# resource claim.
- rebuild_claim = rt.rebuild_claim
+ rebuild_claim = self.rt.rebuild_claim
else:
# This is a rebuild to the same host, so we don't need to make
# a claim since the instance is already on this host.
@@ -3053,7 +3036,7 @@ class ComputeManager(manager.Manager):
# get here when evacuating to a destination node. Rebuilding
# on the same host (not evacuate) uses the NopClaim which will
# not raise ComputeResourcesUnavailable.
- rt.delete_allocation_for_evacuated_instance(
+ self.rt.delete_allocation_for_evacuated_instance(
context, instance, scheduled_node, node_type='destination')
self._notify_instance_rebuild_error(context, instance, e, bdms)
raise exception.BuildAbortException(
@@ -3067,7 +3050,7 @@ class ComputeManager(manager.Manager):
except Exception as e:
self._set_migration_status(migration, 'failed')
if evacuate or scheduled_node is not None:
- rt.delete_allocation_for_evacuated_instance(
+ self.rt.delete_allocation_for_evacuated_instance(
context, instance, scheduled_node,
node_type='destination')
self._notify_instance_rebuild_error(context, instance, e, bdms)
@@ -3898,9 +3881,8 @@ class ComputeManager(manager.Manager):
with migration.obj_as_admin():
migration.save()
- rt = self._get_resource_tracker()
- rt.drop_move_claim(context, instance, migration.source_node,
- old_instance_type, prefix='old_')
+ self.rt.drop_move_claim(context, instance, migration.source_node,
+ old_instance_type, prefix='old_')
self._delete_allocation_after_move(context, instance, migration)
instance.drop_migration_context()
@@ -4007,8 +3989,7 @@ class ComputeManager(manager.Manager):
instance.revert_migration_context()
instance.save()
- rt = self._get_resource_tracker()
- rt.drop_move_claim(context, instance, instance.node)
+ self.rt.drop_move_claim(context, instance, instance.node)
# RPC cast back to the source host to finish the revert there.
self.compute_rpcapi.finish_revert_resize(context, instance,
@@ -4190,10 +4171,9 @@ class ComputeManager(manager.Manager):
instance.save()
limits = filter_properties.get('limits', {})
- rt = self._get_resource_tracker()
- with rt.resize_claim(context, instance, instance_type, node,
- migration, image_meta=image,
- limits=limits) as claim:
+ with self.rt.resize_claim(context, instance, instance_type, node,
+ migration, image_meta=image,
+ limits=limits) as claim:
LOG.info('Migrating', instance=instance)
# RPC cast to the source host to start the actual resize/migration.
self.compute_rpcapi.resize_instance(
@@ -4933,8 +4913,8 @@ class ComputeManager(manager.Manager):
# This should happen *before* the vm_state is changed to
# SHELVED_OFFLOADED in case client-side code is polling the API to
# schedule more instances (or unshelve) once this server is offloaded.
- rt = self._get_resource_tracker()
- rt.delete_allocation_for_shelve_offloaded_instance(context, instance)
+ self.rt.delete_allocation_for_shelve_offloaded_instance(context,
+ instance)
instance.power_state = current_power_state
# NOTE(mriedem): The vm_state has to be set before updating the
@@ -5021,7 +5001,6 @@ class ComputeManager(manager.Manager):
if node is None:
node = self._get_nodename(instance)
- rt = self._get_resource_tracker()
limits = filter_properties.get('limits', {})
allocations = self.reportclient.get_allocations_for_consumer(
@@ -5040,7 +5019,7 @@ class ComputeManager(manager.Manager):
self.host)
network_info = self.network_api.get_instance_nw_info(context, instance)
try:
- with rt.instance_claim(context, instance, node, limits):
+ with self.rt.instance_claim(context, instance, node, limits):
self.driver.spawn(context, instance, image_meta,
injected_files=[],
admin_password=None,
@@ -7688,25 +7667,12 @@ class ComputeManager(manager.Manager):
def _update_available_resource_for_node(self, context, nodename,
startup=False):
- rt = self._get_resource_tracker()
try:
- rt.update_available_resource(context, nodename, startup=startup)
+ self.rt.update_available_resource(context, nodename,
+ startup=startup)
except exception.ComputeHostNotFound:
- # NOTE(comstud): We can get to this case if a node was
- # marked 'deleted' in the DB and then re-added with a
- # different auto-increment id. The cached resource
- # tracker tried to update a deleted record and failed.
- # Don't add this resource tracker to the new dict, so
- # that this will resolve itself on the next run.
- LOG.info("Compute node '%s' not found in "
- "update_available_resource.", nodename)
- # TODO(jaypipes): Yes, this is inefficient to throw away all of the
- # compute nodes to force a rebuild, but this is only temporary
- # until Ironic baremetal node resource providers are tracked
- # properly in the report client and this is a tiny edge case
- # anyway.
- self._resource_tracker = None
- return
+ LOG.warning("Compute node '%s' not found in "
+ "update_available_resource.", nodename)
except exception.ReshapeFailed:
# We're only supposed to get here on startup, if a reshape was
# needed, was attempted, and failed. We want to kill the service.
@@ -7756,7 +7722,6 @@ class ComputeManager(manager.Manager):
LOG.warning("Virt driver is not ready.")
return
- rt = self._get_resource_tracker()
# Delete orphan compute node not reported by driver but still in db
for cn in compute_nodes_in_db:
if cn.hypervisor_hostname not in nodenames:
@@ -7766,7 +7731,7 @@ class ComputeManager(manager.Manager):
{'id': cn.id, 'hh': cn.hypervisor_hostname,
'nodes': nodenames})
cn.destroy()
- rt.remove_node(cn.hypervisor_hostname)
+ self.rt.remove_node(cn.hypervisor_hostname)
# Delete the corresponding resource provider in placement,
# along with any associated allocations and inventory.
self.reportclient.delete_resource_provider(context, cn,
diff --git a/nova/test.py b/nova/test.py
index cb6302c403..696176375b 100644
--- a/nova/test.py
+++ b/nova/test.py
@@ -49,6 +49,7 @@ from oslotest import moxstubout
import six
import testtools
+from nova.compute import resource_tracker
from nova import context
from nova.db import api as db
from nova import exception
@@ -415,8 +416,9 @@ class TestCase(testtools.TestCase):
# So this helper method tries to simulate a better compute service
# restart by cleaning up some of the internal state of the compute
# manager.
+ host, driver = compute.manager.host, compute.manager.driver
compute.stop()
- compute.manager._resource_tracker = None
+ compute.manager.rt = resource_tracker.ResourceTracker(host, driver)
compute.start()
def assertJsonEqual(self, expected, observed, message=''):
diff --git a/nova/tests/functional/compute/test_resource_tracker.py b/nova/tests/functional/compute/test_resource_tracker.py
index a02df4165c..e96b867d5f 100644
--- a/nova/tests/functional/compute/test_resource_tracker.py
+++ b/nova/tests/functional/compute/test_resource_tracker.py
@@ -413,7 +413,7 @@ class TestUpdateComputeNodeReservedAndAllocationRatio(
rp_uuid = self._get_provider_uuid_by_host('fake-host')
ctxt = context.get_admin_context()
- rt = compute_service.manager._get_resource_tracker()
+ rt = compute_service.manager.rt
inv = self.placement_api.get(
'/resource_providers/%s/inventories' % rp_uuid).body
diff --git a/nova/tests/functional/notification_sample_tests/test_metrics.py b/nova/tests/functional/notification_sample_tests/test_metrics.py
index 59ce17c68e..7824feb76e 100644
--- a/nova/tests/functional/notification_sample_tests/test_metrics.py
+++ b/nova/tests/functional/notification_sample_tests/test_metrics.py
@@ -29,7 +29,7 @@ class TestMetricsNotificationSample(
self.flags(compute_monitors=['cpu.virt_driver'])
super(TestMetricsNotificationSample, self).setUp()
# Reset the cpu stats of the 'cpu.virt_driver' monitor
- self.compute.manager._resource_tracker.monitors[0]._cpu_stats = {}
+ self.compute.manager.rt.monitors[0]._cpu_stats = {}
def test_metrics_update(self):
self.compute.manager.update_available_resource(
diff --git a/nova/tests/functional/test_compute_mgr.py b/nova/tests/functional/test_compute_mgr.py
index 77ee20b078..75a6e9f597 100644
--- a/nova/tests/functional/test_compute_mgr.py
+++ b/nova/tests/functional/test_compute_mgr.py
@@ -60,7 +60,7 @@ class ComputeManagerTestCase(test.TestCase):
@mock.patch.object(self.compute.manager.network_api,
'cleanup_instance_network_on_host')
@mock.patch('nova.compute.utils.notify_about_instance_usage')
- @mock.patch.object(self.compute.manager, '_get_resource_tracker')
+ @mock.patch.object(self.compute.manager, 'rt')
@mock.patch.object(self.compute.manager.driver, 'spawn')
def _test(mock_spawn, mock_grt, mock_notify, mock_cinoh, mock_can):
mock_spawn.side_effect = test.TestingException('Preserve this')
diff --git a/nova/tests/functional/test_servers.py b/nova/tests/functional/test_servers.py
index d1af06c171..357f5b6d6c 100644
--- a/nova/tests/functional/test_servers.py
+++ b/nova/tests/functional/test_servers.py
@@ -1507,9 +1507,8 @@ class ProviderTreeTests(integrated_helpers.ProviderUsageBaseTestCase):
self.assertEqual([], self._get_provider_traits(self.host_uuid))
def _run_update_available_resource(self, startup):
- ctx = context.get_admin_context()
- rt = self.compute._get_resource_tracker()
- rt.update_available_resource(ctx, self.compute.host, startup=startup)
+ self.compute.rt.update_available_resource(
+ context.get_admin_context(), self.compute.host, startup=startup)
def _run_update_available_resource_and_assert_raises(
self, exc=exception.ResourceProviderSyncFailed, startup=False):
diff --git a/nova/tests/unit/compute/fake_resource_tracker.py b/nova/tests/unit/compute/fake_resource_tracker.py
index 6e9df21900..6acba1bcc1 100644
--- a/nova/tests/unit/compute/fake_resource_tracker.py
+++ b/nova/tests/unit/compute/fake_resource_tracker.py
@@ -13,6 +13,9 @@
# License for the specific language governing permissions and limitations
# under the License.
+import fixtures
+
+
from nova.compute import resource_tracker
@@ -21,3 +24,9 @@ class FakeResourceTracker(resource_tracker.ResourceTracker):
def _update(self, context, compute_node, startup=False):
pass
+
+
+class RTMockMixin(object):
+ def _mock_rt(self, **kwargs):
+ return self.useFixture(fixtures.MockPatchObject(
+ self.compute, 'rt', **kwargs)).mock
diff --git a/nova/tests/unit/compute/test_compute.py b/nova/tests/unit/compute/test_compute.py
index 0ecaf32708..0f59000ce0 100644
--- a/nova/tests/unit/compute/test_compute.py
+++ b/nova/tests/unit/compute/test_compute.py
@@ -166,7 +166,7 @@ class BaseTestCase(test.TestCase):
# override tracker with a version that doesn't need the database:
fake_rt = fake_resource_tracker.FakeResourceTracker(self.compute.host,
self.compute.driver)
- self.compute._resource_tracker = fake_rt
+ self.compute.rt = fake_rt
def fake_get_compute_nodes_in_db(self, context, **kwargs):
fake_compute_nodes = [{'local_gb': 259,
@@ -262,7 +262,7 @@ class BaseTestCase(test.TestCase):
self.compute_api = compute.API()
# Just to make long lines short
- self.rt = self.compute._get_resource_tracker()
+ self.rt = self.compute.rt
self.mock_get_allocs = self.useFixture(
fixtures.fixtures.MockPatch(
@@ -1464,7 +1464,8 @@ class ComputeVolumeTestCase(BaseTestCase):
class ComputeTestCase(BaseTestCase,
- test_diagnostics.DiagnosticsComparisonMixin):
+ test_diagnostics.DiagnosticsComparisonMixin,
+ fake_resource_tracker.RTMockMixin):
def setUp(self):
super(ComputeTestCase, self).setUp()
self.useFixture(fixtures.SpawnIsSynchronousFixture())
@@ -6229,7 +6230,7 @@ class ComputeTestCase(BaseTestCase,
migration = objects.Migration(uuid=uuids.migration)
@mock.patch.object(self.compute.network_api, 'setup_networks_on_host')
- @mock.patch.object(self.compute, '_reportclient')
+ @mock.patch.object(self.compute, 'reportclient')
def do_it(mock_client, mock_setup):
mock_client.get_allocations_for_consumer.return_value = {
mock.sentinel.source: {
@@ -6550,12 +6551,11 @@ class ComputeTestCase(BaseTestCase,
'clear_events_for_instance'),
mock.patch.object(self.compute, 'update_available_resource'),
mock.patch.object(migration_obj, 'save'),
- mock.patch.object(self.compute, '_get_resource_tracker'),
) as (
post_live_migration, unfilter_instance,
migrate_instance_start, post_live_migration_at_destination,
post_live_migration_at_source, setup_networks_on_host,
- clear_events, update_available_resource, mig_save, getrt
+ clear_events, update_available_resource, mig_save
):
self.compute._post_live_migration(c, instance, dest,
migrate_data=migrate_data)
@@ -7466,14 +7466,11 @@ class ComputeTestCase(BaseTestCase,
@mock.patch.object(objects.Instance, 'save')
def test_instance_update_host_check(self, mock_save):
- # make sure rt usage doesn't happen if the host or node is different
- def fail_get(self):
- raise test.TestingException("wrong host")
- self.stub_out('nova.compute.manager.ComputeManager.'
- '_get_resource_tracker', fail_get)
-
+ # make sure rt usage doesn't update if the host or node is different
instance = self._create_fake_instance_obj({'host': 'someotherhost'})
- self.compute._instance_update(self.context, instance, vcpus=4)
+ with mock.patch.object(self.compute.rt, '_update_usage',
+ new=mock.NonCallableMock()):
+ self.compute._instance_update(self.context, instance, vcpus=4)
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
'remove_provider_tree_from_instance_allocation')
@@ -7698,7 +7695,6 @@ class ComputeTestCase(BaseTestCase,
self.assertNotEqual(0, instance.deleted)
def test_terminate_instance_updates_tracker(self):
- rt = self.compute._get_resource_tracker()
admin_context = context.get_admin_context()
cn = self.rt.compute_nodes[NODENAME]
@@ -7706,7 +7702,7 @@ class ComputeTestCase(BaseTestCase,
instance = self._create_fake_instance_obj()
instance.vcpus = 1
- rt.instance_claim(admin_context, instance, NODENAME)
+ self.compute.rt.instance_claim(admin_context, instance, NODENAME)
self.assertEqual(1, cn.vcpus_used)
self.compute.terminate_instance(admin_context, instance, [])
@@ -7720,17 +7716,16 @@ class ComputeTestCase(BaseTestCase,
# update properly.
@mock.patch('nova.objects.Instance.destroy')
def test_init_deleted_instance_updates_tracker(self, noop1, noop2, noop3):
- rt = self.compute._get_resource_tracker()
admin_context = context.get_admin_context()
- cn = rt.compute_nodes[NODENAME]
+ cn = self.compute.rt.compute_nodes[NODENAME]
self.assertEqual(0, cn.vcpus_used)
instance = self._create_fake_instance_obj()
instance.vcpus = 1
self.assertEqual(0, cn.vcpus_used)
- rt.instance_claim(admin_context, instance, NODENAME)
+ self.compute.rt.instance_claim(admin_context, instance, NODENAME)
self.compute._init_instance(admin_context, instance)
self.assertEqual(1, cn.vcpus_used)
@@ -8022,25 +8017,22 @@ class ComputeTestCase(BaseTestCase,
instance.old_flavor = old_type
instance.new_flavor = new_type
- fake_rt = mock.MagicMock()
-
def fake_drop_move_claim(*args, **kwargs):
pass
def fake_setup_networks_on_host(self, *args, **kwargs):
pass
+ self._mock_rt(
+ drop_move_claim=mock.Mock(side_effect=fake_drop_move_claim))
+
with test.nested(
- mock.patch.object(fake_rt, 'drop_move_claim',
- side_effect=fake_drop_move_claim),
- mock.patch.object(self.compute, '_get_resource_tracker',
- return_value=fake_rt),
mock.patch.object(self.compute.network_api,
'setup_networks_on_host',
side_effect=fake_setup_networks_on_host),
mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
'remove_provider_tree_from_instance_allocation')
- ) as (mock_drop, mock_get, mock_setup, mock_remove_allocs):
+ ) as (mock_setup, mock_remove_allocs):
migration = objects.Migration(context=self.context.elevated())
migration.instance_uuid = instance.uuid
migration.status = 'finished'
@@ -13041,11 +13033,11 @@ class EvacuateHostTestCase(BaseTestCase):
patch_spawn = mock.patch.object(self.compute.driver, 'spawn')
patch_on_disk = mock.patch.object(
self.compute.driver, 'instance_on_disk', return_value=True)
- self.compute._resource_tracker.rebuild_claim = mock.MagicMock()
+ self.compute.rt.rebuild_claim = mock.MagicMock()
with patch_spawn, patch_on_disk:
self._rebuild(migration=migration)
- self.assertTrue(self.compute._resource_tracker.rebuild_claim.called)
+ self.assertTrue(self.compute.rt.rebuild_claim.called)
self.assertEqual('done', migration.status)
migration.save.assert_called_once_with()
@@ -13070,7 +13062,7 @@ class EvacuateHostTestCase(BaseTestCase):
patch_on_disk = mock.patch.object(
self.compute.driver, 'instance_on_disk', return_value=True)
patch_claim = mock.patch.object(
- self.compute._resource_tracker, 'rebuild_claim',
+ self.compute.rt, 'rebuild_claim',
side_effect=exception.ComputeResourcesUnavailable(reason="boom"))
patch_remove_allocs = mock.patch(
'nova.scheduler.client.report.SchedulerReportClient.'
@@ -13088,8 +13080,7 @@ class EvacuateHostTestCase(BaseTestCase):
patch_spawn = mock.patch.object(self.compute.driver, 'spawn')
patch_on_disk = mock.patch.object(
self.compute.driver, 'instance_on_disk', return_value=True)
- patch_claim = mock.patch.object(
- self.compute._resource_tracker, 'rebuild_claim')
+ patch_claim = mock.patch.object(self.compute.rt, 'rebuild_claim')
patch_rebuild = mock.patch.object(
self.compute, '_do_rebuild_instance_with_claim',
side_effect=test.TestingException())
diff --git a/nova/tests/unit/compute/test_compute_mgr.py b/nova/tests/unit/compute/test_compute_mgr.py
index b6c7ed29a8..ae7a900e95 100644
--- a/nova/tests/unit/compute/test_compute_mgr.py
+++ b/nova/tests/unit/compute/test_compute_mgr.py
@@ -82,7 +82,8 @@ fake_host_list = [mock.sentinel.host1]
@ddt.ddt
-class ComputeManagerUnitTestCase(test.NoDBTestCase):
+class ComputeManagerUnitTestCase(test.NoDBTestCase,
+ fake_resource_tracker.RTMockMixin):
def setUp(self):
super(ComputeManagerUnitTestCase, self).setUp()
self.compute = manager.ComputeManager()
@@ -257,10 +258,8 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase):
cn.hypervisor_hostname = hyp_hostname
return cn
- @mock.patch.object(manager.ComputeManager, '_get_resource_tracker')
- def test_update_available_resource_for_node(self, get_rt):
- rt = mock.Mock(spec_set=['update_available_resource'])
- get_rt.return_value = rt
+ def test_update_available_resource_for_node(self):
+ rt = self._mock_rt(spec_set=['update_available_resource'])
self.compute._update_available_resource_for_node(
self.context,
@@ -273,36 +272,9 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase):
)
@mock.patch('nova.compute.manager.LOG')
- @mock.patch.object(manager.ComputeManager, '_get_resource_tracker')
- def test_update_available_resource_for_node_fail_no_host(self, get_rt,
- log_mock):
- rt = mock.Mock(spec_set=['update_available_resource'])
- exc = exception.ComputeHostNotFound(host=mock.sentinel.host)
- rt.update_available_resource.side_effect = exc
- get_rt.return_value = rt
- # Fake out the RT on the compute manager object so we can assert it's
- # nulled out after the ComputeHostNotFound exception is raised.
- self.compute._resource_tracker = rt
-
- self.compute._update_available_resource_for_node(
- self.context,
- mock.sentinel.node,
- )
- rt.update_available_resource.assert_called_once_with(
- self.context,
- mock.sentinel.node,
- startup=False,
- )
- self.assertTrue(log_mock.info.called)
- self.assertIsNone(self.compute._resource_tracker)
-
- @mock.patch('nova.compute.manager.LOG')
- @mock.patch.object(manager.ComputeManager, '_get_resource_tracker')
- def test_update_available_resource_for_node_reshape_failed(self, get_rt,
- log_mock):
+ def test_update_available_resource_for_node_reshape_failed(self, log_mock):
"""ReshapeFailed logs and reraises."""
- rt = mock.Mock(spec_set=['update_available_resource'])
- get_rt.return_value = rt
+ rt = self._mock_rt(spec_set=['update_available_resource'])
rt.update_available_resource.side_effect = exception.ReshapeFailed(
error='error')
@@ -316,12 +288,9 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase):
log_mock.critical.assert_called_once()
@mock.patch('nova.compute.manager.LOG')
- @mock.patch.object(manager.ComputeManager, '_get_resource_tracker')
- def test_update_available_resource_for_node_reshape_needed(self, get_rt,
- log_mock):
+ def test_update_available_resource_for_node_reshape_needed(self, log_mock):
"""ReshapeNeeded logs and reraises."""
- rt = mock.Mock(spec_set=['update_available_resource'])
- get_rt.return_value = rt
+ rt = self._mock_rt(spec_set=['update_available_resource'])
rt.update_available_resource.side_effect = exception.ReshapeNeeded()
self.assertRaises(exception.ReshapeNeeded,
@@ -333,13 +302,15 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase):
self.context, mock.sentinel.node, startup=True)
log_mock.exception.assert_called_once()
- @mock.patch.object(manager.ComputeManager, '_get_resource_tracker')
@mock.patch.object(manager.ComputeManager,
'_update_available_resource_for_node')
@mock.patch.object(fake_driver.FakeDriver, 'get_available_nodes')
@mock.patch.object(manager.ComputeManager, '_get_compute_nodes_in_db')
def test_update_available_resource(self, get_db_nodes, get_avail_nodes,
- update_mock, mock_get_rt):
+ update_mock):
+ mock_rt = self._mock_rt()
+ rc_mock = self.useFixture(fixtures.fixtures.MockPatchObject(
+ self.compute, 'reportclient')).mock
db_nodes = [self._make_compute_node('node%s' % i, i)
for i in range(1, 5)]
avail_nodes = set(['node2', 'node3', 'node4', 'node5'])
@@ -355,14 +326,13 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase):
for node in avail_nodes_l]
)
- rc_mock = mock_get_rt.return_value.reportclient
# First node in set should have been removed from DB
for db_node in db_nodes:
if db_node.hypervisor_hostname == 'node1':
db_node.destroy.assert_called_once_with()
rc_mock.delete_resource_provider.assert_called_once_with(
self.context, db_node, cascade=True)
- mock_get_rt.return_value.remove_node.assert_called_once_with(
+ mock_rt.remove_node.assert_called_once_with(
'node1')
else:
self.assertFalse(db_node.destroy.called)
@@ -4191,12 +4161,11 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase):
def test_rebuild_driver_error_same_host(self, mock_error, mock_aiffe):
instance = fake_instance.fake_instance_obj(self.context)
ex = test.TestingException('foo')
- with mock.patch.object(self.compute, '_get_resource_tracker') as mrt:
- self.assertRaises(test.TestingException,
- self._test_rebuild_ex, instance, ex)
- rt = mrt.return_value
- self.assertFalse(
- rt.delete_allocation_for_evacuated_instance.called)
+ rt = self._mock_rt()
+ self.assertRaises(test.TestingException,
+ self._test_rebuild_ex, instance, ex)
+ self.assertFalse(
+ rt.delete_allocation_for_evacuated_instance.called)
@mock.patch('nova.context.RequestContext.elevated')
@mock.patch('nova.compute.utils.add_instance_fault_from_exc')
@@ -4208,14 +4177,13 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase):
instance = fake_instance.fake_instance_obj(self.context)
instance.system_metadata = {}
ex = test.TestingException('foo')
- with mock.patch.object(self.compute, '_get_resource_tracker') as mrt:
- self.assertRaises(test.TestingException,
- self._test_rebuild_ex, instance, ex,
- recreate=True, scheduled_node='foo')
- rt = mrt.return_value
- delete_alloc = rt.delete_allocation_for_evacuated_instance
- delete_alloc.assert_called_once_with(self.context, instance, 'foo',
- node_type='destination')
+ rt = self._mock_rt()
+ self.assertRaises(test.TestingException,
+ self._test_rebuild_ex, instance, ex,
+ recreate=True, scheduled_node='foo')
+ delete_alloc = rt.delete_allocation_for_evacuated_instance
+ delete_alloc.assert_called_once_with(self.context, instance, 'foo',
+ node_type='destination')
@mock.patch('nova.context.RequestContext.elevated')
@mock.patch('nova.objects.instance.Instance.drop_migration_context')
@@ -4329,13 +4297,13 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase):
node=dead_node)
instance.system_metadata = img_sys_meta
instance.migration_context = None
+ mock_rt = self._mock_rt()
with test.nested(
- mock.patch.object(self.compute, '_get_resource_tracker'),
mock.patch.object(self.compute, '_get_compute_info'),
mock.patch.object(self.compute, '_do_rebuild_instance_with_claim'),
mock.patch.object(objects.Instance, 'save'),
mock.patch.object(self.compute, '_set_migration_status'),
- ) as (mock_rt, mock_get, mock_rebuild, mock_save, mock_set):
+ ) as (mock_get, mock_rebuild, mock_save, mock_set):
mock_get.return_value.hypervisor_hostname = 'new-node'
self.compute.rebuild_instance(self.context, instance, None, None,
None, None, None, None, True,
@@ -4343,13 +4311,11 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase):
mock_get.assert_called_once_with(mock.ANY, self.compute.host)
self.assertEqual('new-node', instance.node)
mock_set.assert_called_once_with(None, 'done')
- mock_rt.assert_called_once_with()
# Make sure the rebuild_claim was called with the proper image_meta
# from the instance.
- mock_rebuild_claim = mock_rt.return_value.rebuild_claim
- mock_rebuild_claim.assert_called_once()
- self.assertIn('image_meta', mock_rebuild_claim.call_args[1])
- actual_image_meta = mock_rebuild_claim.call_args[1][
+ mock_rt.rebuild_claim.assert_called_once()
+ self.assertIn('image_meta', mock_rt.rebuild_claim.call_args[1])
+ actual_image_meta = mock_rt.rebuild_claim.call_args[1][
'image_meta'].properties
self.assertIn('hw_numa_nodes', actual_image_meta)
self.assertEqual(1, actual_image_meta.hw_numa_nodes)
@@ -4748,7 +4714,7 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase):
def test_reset_clears_provider_cache(self):
# Seed the cache so we can tell we've cleared it
- reportclient = self.compute._get_resource_tracker().reportclient
+ reportclient = self.compute.reportclient
ptree = reportclient._provider_tree
ptree.new_root('foo', uuids.foo)
self.assertEqual([uuids.foo], ptree.get_provider_uuids())
@@ -4997,7 +4963,7 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
# override tracker with a version that doesn't need the database:
fake_rt = fake_resource_tracker.FakeResourceTracker(self.compute.host,
self.compute.driver)
- self.compute._resource_tracker = fake_rt
+ self.compute.rt = fake_rt
self.allocations = [{
"resource_provider": {
@@ -5010,7 +4976,8 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
}]
self.mock_get_allocs = self.useFixture(
fixtures.fixtures.MockPatchObject(
- fake_rt.reportclient, 'get_allocations_for_consumer')).mock
+ self.compute.reportclient,
+ 'get_allocations_for_consumer')).mock
self.mock_get_allocs.return_value = self.allocations
def _do_build_instance_update(self, mock_save, reschedule_update=False):
@@ -6652,7 +6619,8 @@ class ComputeManagerErrorsOutMigrationTestCase(test.NoDBTestCase):
@ddt.ddt
-class ComputeManagerMigrationTestCase(test.NoDBTestCase):
+class ComputeManagerMigrationTestCase(test.NoDBTestCase,
+ fake_resource_tracker.RTMockMixin):
class TestResizeError(Exception):
pass
@@ -6798,7 +6766,6 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase):
@mock.patch.object(self.compute, '_is_instance_storage_shared')
@mock.patch.object(self.compute, 'finish_revert_resize')
@mock.patch.object(self.compute, '_instance_update')
- @mock.patch.object(self.compute, '_get_resource_tracker')
@mock.patch.object(self.compute.driver, 'destroy')
@mock.patch.object(self.compute.network_api, 'setup_networks_on_host')
@mock.patch.object(self.compute.network_api, 'migrate_instance_start')
@@ -6812,7 +6779,6 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase):
migrate_instance_start,
setup_networks_on_host,
destroy,
- _get_resource_tracker,
_instance_update,
finish_revert_resize,
_is_instance_storage_shared,
@@ -6820,6 +6786,7 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase):
revert_migration_context,
mock_finish_revert):
+ self._mock_rt()
# NOTE(danms): Before a revert, the instance is "on"
# the destination host/node
self.migration.uuid = uuids.migration
@@ -6866,7 +6833,6 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase):
reportclient = self.compute.reportclient
- @mock.patch.object(self.compute, '_get_resource_tracker')
@mock.patch('nova.objects.ComputeNode.get_by_host_and_nodename')
@mock.patch.object(self.compute.driver, 'finish_revert_migration')
@mock.patch.object(self.compute.network_api, 'get_instance_nw_info',
@@ -6893,11 +6859,10 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase):
migrate_instance_finish,
get_instance_nw_info,
finish_revert_migration,
- mock_get_cn,
- get_resource_tracker):
+ mock_get_cn):
- # Restore the report client
- get_resource_tracker.return_value.reportclient = reportclient
+ # Mock the resource tracker, but keep the report client
+ self._mock_rt().reportclient = reportclient
fault_create.return_value = (
test_instance_fault.fake_faults['fake-uuid'][0])
self.instance.migration_context = objects.MigrationContext()
@@ -6913,10 +6878,6 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase):
do_test()
def test_finish_revert_resize_migration_context(self):
- fake_rt = resource_tracker.ResourceTracker(None, None)
- fake_rt.tracked_migrations[self.instance['uuid']] = (
- self.migration, None)
-
@mock.patch('nova.compute.resource_tracker.ResourceTracker.'
'drop_move_claim')
@mock.patch('nova.compute.rpcapi.ComputeAPI.finish_revert_resize')
@@ -6924,8 +6885,6 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase):
@mock.patch.object(self.compute.network_api, 'get_instance_nw_info')
@mock.patch.object(self.compute, '_is_instance_storage_shared')
@mock.patch.object(self.compute, '_instance_update')
- @mock.patch.object(self.compute, '_get_resource_tracker',
- return_value=fake_rt)
@mock.patch.object(self.compute.driver, 'destroy')
@mock.patch.object(self.compute.network_api, 'setup_networks_on_host')
@mock.patch.object(self.compute.network_api, 'migrate_instance_start')
@@ -6941,7 +6900,6 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase):
mock_migrate_instance_start,
mock_setup_networks_on_host,
mock_destroy,
- mock_get_resource_tracker,
mock_instance_update,
mock_is_instance_storage_shared,
mock_get_instance_nw_info,
@@ -6949,6 +6907,8 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase):
mock_finish_revert,
mock_drop_move_claim):
+ self.compute.rt.tracked_migrations[self.instance['uuid']] = (
+ self.migration, None)
self.instance.migration_context = objects.MigrationContext()
self.migration.source_compute = self.instance['host']
self.migration.source_node = self.instance['node']
@@ -7032,13 +6992,13 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase):
@mock.patch.object(self.compute, '_notify_about_instance_usage')
@mock.patch.object(self.compute, 'network_api')
@mock.patch.object(self.compute.driver, 'confirm_migration')
- @mock.patch.object(self.compute, '_get_resource_tracker')
@mock.patch.object(self.compute, '_delete_allocation_after_move')
@mock.patch.object(self.instance, 'drop_migration_context')
@mock.patch.object(self.instance, 'save')
- def do_confirm_resize(mock_save, mock_drop, mock_delete, mock_get_rt,
+ def do_confirm_resize(mock_save, mock_drop, mock_delete,
mock_confirm, mock_nwapi, mock_notify,
mock_mig_save):
+ self._mock_rt()
self.instance.migration_context = objects.MigrationContext()
self.migration.source_compute = self.instance['host']
self.migration.source_node = self.instance['node']
@@ -7053,7 +7013,7 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase):
do_confirm_resize()
def test_delete_allocation_after_move_confirm_by_migration(self):
- with mock.patch.object(self.compute, '_reportclient') as mock_report:
+ with mock.patch.object(self.compute, 'reportclient') as mock_report:
mock_report.delete_allocation_for_instance.return_value = True
self.compute._delete_allocation_after_move(self.context,
self.instance,
@@ -7064,7 +7024,7 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase):
def test_revert_allocation(self):
"""New-style migration-based allocation revert."""
- @mock.patch.object(self.compute, '_reportclient')
+ @mock.patch.object(self.compute, 'reportclient')
def doit(mock_report):
cu = uuids.node
a = {cu: {'resources': {'DISK_GB': 1}}}
@@ -7083,7 +7043,7 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase):
def test_revert_allocation_old_style(self):
"""Test that we don't delete allocs for migration if none found."""
- @mock.patch.object(self.compute, '_reportclient')
+ @mock.patch.object(self.compute, 'reportclient')
def doit(mock_report):
mock_report.get_allocations_for_consumer.return_value = {}
self.migration.uuid = uuids.migration
@@ -7104,7 +7064,7 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase):
we can do.
"""
- @mock.patch.object(self.compute, '_reportclient')
+ @mock.patch.object(self.compute, 'reportclient')
def doit(mock_report):
a = {
uuids.node: {'resources': {'DISK_GB': 1}},
@@ -7899,7 +7859,7 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase):
is_shared_instance_path=False,
is_shared_block_storage=False)
with test.nested(
- mock.patch.object(self.compute, '_reportclient'),
+ mock.patch.object(self.compute, 'reportclient'),
mock.patch.object(self.compute,
'_delete_allocation_after_move'),
) as (
@@ -7955,7 +7915,6 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase):
new=lambda: None)
@mock.patch.object(compute.reportclient,
'get_allocations_for_consumer_by_provider')
- @mock.patch.object(compute, '_get_resource_tracker')
@mock.patch.object(vol_bdm, 'save')
@mock.patch.object(compute, 'update_available_resource')
@mock.patch.object(compute.volume_api, 'attachment_delete')
@@ -7968,9 +7927,9 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase):
'get_by_instance_uuid')
def _test(mock_get_bdms, mock_net_api, mock_notify, mock_driver,
mock_rpc, mock_get_bdm_info, mock_attach_delete,
- mock_update_resource, mock_bdm_save, mock_rt, mock_ga,
+ mock_update_resource, mock_bdm_save, mock_ga,
mock_clean, mock_notify_action):
- mock_rt.return_value = mock.Mock()
+ self._mock_rt()
mock_get_bdms.return_value = [vol_bdm, image_bdm]
compute._post_live_migration(self.context, instance, dest_host,
@@ -8035,14 +7994,14 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase):
@mock.patch.object(self.compute, 'update_available_resource')
@mock.patch.object(self.compute, '_update_scheduler_instance_info')
@mock.patch.object(self.compute, '_clean_instance_console_tokens')
- @mock.patch.object(self.compute, '_get_resource_tracker')
- def _test(_get_resource_tracker, _clean_instance_console_tokens,
+ def _test(_clean_instance_console_tokens,
_update_scheduler_instance_info, update_available_resource,
driver_cleanup, _live_migration_cleanup_flags,
post_live_migration_at_destination,
post_live_migration_at_source, migrate_instance_start,
_notify_about_instance_usage, get_instance_nw_info,
_get_instance_block_device_info):
+ self._mock_rt()
self.compute._post_live_migration(
self.context, self.instance, 'fake-dest',
migrate_data=migrate_data)
@@ -8374,10 +8333,9 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase):
@mock.patch.object(self.compute, '_reschedule')
@mock.patch.object(self.compute, '_prep_resize')
- @mock.patch.object(self.compute, '_get_resource_tracker')
- def doit(mock_grt, mock_pr, mock_r):
- # Restore the report client
- mock_grt.return_value.reportclient = reportclient
+ def doit(mock_pr, mock_r):
+ # Mock the resource tracker, but keep the report client
+ self._mock_rt().reportclient = reportclient
mock_r.return_value = False
mock_pr.side_effect = test.TestingException