diff options
author | Russell Bryant <rbryant@redhat.com> | 2012-05-30 14:57:03 -0400 |
---|---|---|
committer | Russell Bryant <rbryant@redhat.com> | 2012-06-01 14:05:51 -0400 |
commit | cf2b87347cd801112f89552a78efabb92a63bac6 (patch) | |
tree | 35bcaa64760c89737c8992e46730e6a9f6f0b70f | |
parent | b7744f8f7e345928df016a04b6d8a5935470b254 (diff) | |
download | nova-cf2b87347cd801112f89552a78efabb92a63bac6.tar.gz nova-cf2b87347cd801112f89552a78efabb92a63bac6.tar.xz nova-cf2b87347cd801112f89552a78efabb92a63bac6.zip |
Add shared_storage_test methods to compute rpcapi.
Part of bug 1006467.
This patch adds 3 methods used to check if shared storage works between
two compute hosts to the compute rpcapi. These methods are used by the
scheduler.
This also cuts down on some duplicated code in test_scheduler.
Change-Id: If0bf7f7fdd2beb0e5280ae52daf049372f8bc9e2
-rw-r--r-- | nova/compute/rpcapi.py | 15 | ||||
-rw-r--r-- | nova/scheduler/driver.py | 16 | ||||
-rw-r--r-- | nova/tests/compute/test_rpcapi.py | 12 | ||||
-rw-r--r-- | nova/tests/scheduler/test_scheduler.py | 119 |
4 files changed, 67 insertions, 95 deletions
diff --git a/nova/compute/rpcapi.py b/nova/compute/rpcapi.py index 155c23abf..8c25906c9 100644 --- a/nova/compute/rpcapi.py +++ b/nova/compute/rpcapi.py @@ -84,6 +84,16 @@ class ComputeAPI(nova.rpc.proxy.RpcProxy): mountpoint=mountpoint), topic=self._compute_topic(ctxt, None, instance)) + def check_shared_storage_test_file(self, ctxt, filename, host): + return self.call(ctxt, self.make_msg('check_shared_storage_test_file', + filename=filename), + topic=self._compute_topic(ctxt, host, None)) + + def cleanup_shared_storage_test_file(self, ctxt, filename, host): + self.cast(ctxt, self.make_msg('cleanup_shared_storage_test_file', + filename=filename), + topic=self._compute_topic(ctxt, host, None)) + def compare_cpu(self, ctxt, cpu_info, host): return self.call(ctxt, self.make_msg('compare_cpu', cpu_info=cpu_info), topic=self._compute_topic(ctxt, host, None)) @@ -95,6 +105,11 @@ class ComputeAPI(nova.rpc.proxy.RpcProxy): instance_uuid=instance['uuid'], migration_id=migration_id), topic=self._compute_topic(ctxt, host, instance)) + def create_shared_storage_test_file(self, ctxt, host): + return self.call(ctxt, + self.make_msg('create_shared_storage_test_file'), + topic=self._compute_topic(ctxt, host, None)) + def detach_volume(self, ctxt, instance, volume_id): self.cast(ctxt, self.make_msg('detach_volume', instance_uuid=instance['uuid'], volume_id=volume_id), diff --git a/nova/scheduler/driver.py b/nova/scheduler/driver.py index 94c3395fe..bcdc6ce10 100644 --- a/nova/scheduler/driver.py +++ b/nova/scheduler/driver.py @@ -489,21 +489,17 @@ class Scheduler(object): """ src = instance_ref['host'] - dst_t = rpc.queue_get_for(context, FLAGS.compute_topic, dest) - src_t = rpc.queue_get_for(context, FLAGS.compute_topic, src) - filename = rpc.call(context, dst_t, - {"method": 'create_shared_storage_test_file'}) + filename = self.compute_rpcapi.create_shared_storage_test_file(context, + dest) try: # make sure existence at src host. - ret = rpc.call(context, src_t, - {"method": 'check_shared_storage_test_file', - "args": {'filename': filename}}) + ret = self.compute_rpcapi.check_shared_storage_test_file(context, + filename, src) finally: - rpc.cast(context, dst_t, - {"method": 'cleanup_shared_storage_test_file', - "args": {'filename': filename}}) + self.compute_rpcapi.cleanup_shared_storage_test_file(context, + filename, dest) return ret diff --git a/nova/tests/compute/test_rpcapi.py b/nova/tests/compute/test_rpcapi.py index dabb1f4b2..47fb10645 100644 --- a/nova/tests/compute/test_rpcapi.py +++ b/nova/tests/compute/test_rpcapi.py @@ -106,6 +106,14 @@ class ComputeRpcAPITestCase(test.TestCase): self._test_compute_api('attach_volume', 'cast', instance=self.fake_instance, volume_id='id', mountpoint='mp') + def test_check_shared_storage_test_file(self): + self._test_compute_api('check_shared_storage_test_file', 'call', + filename='fn', host='host') + + def test_cleanup_shared_storage_test_file(self): + self._test_compute_api('cleanup_shared_storage_test_file', 'cast', + filename='fn', host='host') + def test_compare_cpu(self): self._test_compute_api('compare_cpu', 'call', cpu_info='info', host='host') @@ -118,6 +126,10 @@ class ComputeRpcAPITestCase(test.TestCase): self._test_compute_api('confirm_resize', 'call', instance=self.fake_instance, migration_id='id', host='host') + def test_create_shared_storage_test_file(self): + self._test_compute_api('create_shared_storage_test_file', 'call', + host='host') + def test_detach_volume(self): self._test_compute_api('detach_volume', 'cast', instance=self.fake_instance, volume_id='id') diff --git a/nova/tests/scheduler/test_scheduler.py b/nova/tests/scheduler/test_scheduler.py index 2ad79eed6..c8f02d357 100644 --- a/nova/tests/scheduler/test_scheduler.py +++ b/nova/tests/scheduler/test_scheduler.py @@ -469,6 +469,29 @@ class SchedulerTestCase(test.TestCase): block_migration=block_migration, disk_over_commit=disk_over_commit) + def _check_shared_storage(self, dest, instance, check_result): + tmp_filename = 'test-filename' + rpc.queue_get_for(self.context, FLAGS.compute_topic, + dest).AndReturn('dest_queue') + rpc.call(self.context, 'dest_queue', + {'method': 'create_shared_storage_test_file', + 'args': {}, + 'version': compute_rpcapi.ComputeAPI.RPC_API_VERSION}, None + ).AndReturn(tmp_filename) + rpc.queue_get_for(self.context, FLAGS.compute_topic, + instance['host']).AndReturn('src_queue') + rpc.call(self.context, 'src_queue', + {'method': 'check_shared_storage_test_file', + 'args': {'filename': tmp_filename}, + 'version': compute_rpcapi.ComputeAPI.RPC_API_VERSION}, None + ).AndReturn(check_result) + rpc.queue_get_for(self.context, FLAGS.compute_topic, + dest).AndReturn('dest_queue') + rpc.cast(self.context, 'dest_queue', + {'method': 'cleanup_shared_storage_test_file', + 'args': {'filename': tmp_filename}, + 'version': compute_rpcapi.ComputeAPI.RPC_API_VERSION}) + def test_live_migration_all_checks_pass(self): """Test live migration when all checks pass.""" @@ -514,21 +537,9 @@ class SchedulerTestCase(test.TestCase): None).AndReturn( json.dumps([{'disk_size': 1024 * (1024 ** 3)}])) - # Common checks (shared storage ok, same hypervisor,e tc) - rpc.queue_get_for(self.context, FLAGS.compute_topic, - dest).AndReturn('dest_queue') - rpc.queue_get_for(self.context, FLAGS.compute_topic, - instance['host']).AndReturn('src_queue') - tmp_filename = 'test-filename' - rpc.call(self.context, 'dest_queue', - {'method': 'create_shared_storage_test_file'} - ).AndReturn(tmp_filename) - rpc.call(self.context, 'src_queue', - {'method': 'check_shared_storage_test_file', - 'args': {'filename': tmp_filename}}).AndReturn(False) - rpc.cast(self.context, 'dest_queue', - {'method': 'cleanup_shared_storage_test_file', - 'args': {'filename': tmp_filename}}) + # Common checks (shared storage ok, same hypervisor, etc) + self._check_shared_storage(dest, instance, False) + db.service_get_all_compute_by_host(self.context, dest).AndReturn( [{'compute_node': [{'hypervisor_type': 'xen', 'hypervisor_version': 1}]}]) @@ -758,20 +769,7 @@ class SchedulerTestCase(test.TestCase): self.driver._live_migration_dest_check(self.context, instance, dest, block_migration, disk_over_commit) - rpc.queue_get_for(self.context, FLAGS.compute_topic, - dest).AndReturn('dest_queue') - rpc.queue_get_for(self.context, FLAGS.compute_topic, - instance['host']).AndReturn('src_queue') - tmp_filename = 'test-filename' - rpc.call(self.context, 'dest_queue', - {'method': 'create_shared_storage_test_file'} - ).AndReturn(tmp_filename) - rpc.call(self.context, 'src_queue', - {'method': 'check_shared_storage_test_file', - 'args': {'filename': tmp_filename}}).AndReturn(False) - rpc.cast(self.context, 'dest_queue', - {'method': 'cleanup_shared_storage_test_file', - 'args': {'filename': tmp_filename}}) + self._check_shared_storage(dest, instance, False) self.mox.ReplayAll() self.assertRaises(exception.InvalidSharedStorage, @@ -800,20 +798,7 @@ class SchedulerTestCase(test.TestCase): self.driver._live_migration_dest_check(self.context, instance, dest, block_migration, disk_over_commit) - rpc.queue_get_for(self.context, FLAGS.compute_topic, - dest).AndReturn('dest_queue') - rpc.queue_get_for(self.context, FLAGS.compute_topic, - instance['host']).AndReturn('src_queue') - tmp_filename = 'test-filename' - rpc.call(self.context, 'dest_queue', - {'method': 'create_shared_storage_test_file'} - ).AndReturn(tmp_filename) - rpc.call(self.context, 'src_queue', - {'method': 'check_shared_storage_test_file', - 'args': {'filename': tmp_filename}}).AndReturn(False) - rpc.cast(self.context, 'dest_queue', - {'method': 'cleanup_shared_storage_test_file', - 'args': {'filename': tmp_filename}}) + self._check_shared_storage(dest, instance, False) self.mox.ReplayAll() self.assertRaises(exception.InvalidSharedStorage, @@ -841,20 +826,8 @@ class SchedulerTestCase(test.TestCase): self.driver._live_migration_dest_check(self.context, instance, dest, block_migration, disk_over_commit) - rpc.queue_get_for(self.context, FLAGS.compute_topic, - dest).AndReturn('dest_queue') - rpc.queue_get_for(self.context, FLAGS.compute_topic, - instance['host']).AndReturn('src_queue') - tmp_filename = 'test-filename' - rpc.call(self.context, 'dest_queue', - {'method': 'create_shared_storage_test_file'} - ).AndReturn(tmp_filename) - rpc.call(self.context, 'src_queue', - {'method': 'check_shared_storage_test_file', - 'args': {'filename': tmp_filename}}).AndReturn(True) - rpc.cast(self.context, 'dest_queue', - {'method': 'cleanup_shared_storage_test_file', - 'args': {'filename': tmp_filename}}) + self._check_shared_storage(dest, instance, True) + db.service_get_all_compute_by_host(self.context, dest).AndReturn( [{'compute_node': [{'hypervisor_type': 'xen', 'hypervisor_version': 1}]}]) @@ -890,20 +863,8 @@ class SchedulerTestCase(test.TestCase): self.driver._live_migration_dest_check(self.context, instance, dest, block_migration, disk_over_commit) - rpc.queue_get_for(self.context, FLAGS.compute_topic, - dest).AndReturn('dest_queue') - rpc.queue_get_for(self.context, FLAGS.compute_topic, - instance['host']).AndReturn('src_queue') - tmp_filename = 'test-filename' - rpc.call(self.context, 'dest_queue', - {'method': 'create_shared_storage_test_file'} - ).AndReturn(tmp_filename) - rpc.call(self.context, 'src_queue', - {'method': 'check_shared_storage_test_file', - 'args': {'filename': tmp_filename}}).AndReturn(True) - rpc.cast(self.context, 'dest_queue', - {'method': 'cleanup_shared_storage_test_file', - 'args': {'filename': tmp_filename}}) + self._check_shared_storage(dest, instance, True) + db.service_get_all_compute_by_host(self.context, dest).AndReturn( [{'compute_node': [{'hypervisor_type': 'xen', 'hypervisor_version': 1}]}]) @@ -938,20 +899,8 @@ class SchedulerTestCase(test.TestCase): self.driver._live_migration_dest_check(self.context, instance, dest, block_migration, disk_over_commit) - rpc.queue_get_for(self.context, FLAGS.compute_topic, - dest).AndReturn('dest_queue') - rpc.queue_get_for(self.context, FLAGS.compute_topic, - instance['host']).AndReturn('src_queue') - tmp_filename = 'test-filename' - rpc.call(self.context, 'dest_queue', - {'method': 'create_shared_storage_test_file'} - ).AndReturn(tmp_filename) - rpc.call(self.context, 'src_queue', - {'method': 'check_shared_storage_test_file', - 'args': {'filename': tmp_filename}}).AndReturn(True) - rpc.cast(self.context, 'dest_queue', - {'method': 'cleanup_shared_storage_test_file', - 'args': {'filename': tmp_filename}}) + self._check_shared_storage(dest, instance, True) + db.service_get_all_compute_by_host(self.context, dest).AndReturn( [{'compute_node': [{'hypervisor_type': 'xen', 'hypervisor_version': 1}]}]) |