diff options
-rw-r--r-- | nova/compute/resource_tracker.py | 7 | ||||
-rw-r--r-- | nova/conductor/api.py | 7 | ||||
-rw-r--r-- | nova/conductor/manager.py | 9 | ||||
-rw-r--r-- | nova/conductor/rpcapi.py | 7 | ||||
-rw-r--r-- | nova/tests/compute/test_resource_tracker.py | 20 | ||||
-rw-r--r-- | nova/tests/conductor/test_conductor.py | 26 |
6 files changed, 63 insertions, 13 deletions
diff --git a/nova/compute/resource_tracker.py b/nova/compute/resource_tracker.py index 256b64979..075d59ec8 100644 --- a/nova/compute/resource_tracker.py +++ b/nova/compute/resource_tracker.py @@ -166,11 +166,8 @@ class ResourceTracker(object): old_instance_type = instance_types.get_instance_type( old_instance_type_id) - return db.migration_create(context.elevated(), - {'instance_uuid': instance['uuid'], - 'source_compute': instance['host'], - 'source_node': instance['node'], - 'dest_compute': self.host, + return self.conductor_api.migration_create(context, instance, + {'dest_compute': self.host, 'dest_node': self.nodename, 'dest_host': self.driver.get_host_ip_addr(), 'old_instance_type_id': old_instance_type['id'], diff --git a/nova/conductor/api.py b/nova/conductor/api.py index c3459448d..4cc10604b 100644 --- a/nova/conductor/api.py +++ b/nova/conductor/api.py @@ -134,6 +134,9 @@ class LocalAPI(object): return self._manager.migration_get_unconfirmed_by_dest_compute( context, confirm_window, dest_compute) + def migration_create(self, context, instance, values): + return self._manager.migration_create(context, instance, values) + def migration_update(self, context, migration, status): return self._manager.migration_update(context, migration, status) @@ -364,6 +367,10 @@ class API(object): return crpcapi.migration_get_unconfirmed_by_dest_compute( context, confirm_window, dest_compute) + def migration_create(self, context, instance, values): + return self.conductor_rpcapi.migration_create(context, instance, + values) + def migration_update(self, context, migration, status): return self.conductor_rpcapi.migration_update(context, migration, status) diff --git a/nova/conductor/manager.py b/nova/conductor/manager.py index 8c52f292e..8c6f39f02 100644 --- a/nova/conductor/manager.py +++ b/nova/conductor/manager.py @@ -43,7 +43,7 @@ datetime_fields = ['launched_at', 'terminated_at'] class ConductorManager(manager.SchedulerDependentManager): """Mission: TBD.""" - RPC_API_VERSION = '1.29' + RPC_API_VERSION = '1.30' def __init__(self, *args, **kwargs): super(ConductorManager, self).__init__(service_name='conductor', @@ -100,6 +100,13 @@ class ConductorManager(manager.SchedulerDependentManager): context, confirm_window, dest_compute) return jsonutils.to_primitive(migrations) + def migration_create(self, context, instance, values): + values.update({'instance_uuid': instance['uuid'], + 'source_compute': instance['host'], + 'source_node': instance['node']}) + migration_ref = self.db.migration_create(context.elevated(), values) + return jsonutils.to_primitive(migration_ref) + @rpc_common.client_exceptions(exception.MigrationNotFound) def migration_update(self, context, migration, status): migration_ref = self.db.migration_update(context.elevated(), diff --git a/nova/conductor/rpcapi.py b/nova/conductor/rpcapi.py index 4f1d6133f..b7f760cf5 100644 --- a/nova/conductor/rpcapi.py +++ b/nova/conductor/rpcapi.py @@ -62,6 +62,7 @@ class ConductorAPI(nova.openstack.common.rpc.proxy.RpcProxy): 1.27 - Added service_create 1.28 - Added binary arg to service_get_all_by 1.29 - Added service_destroy + 1.30 - Added migration_create """ BASE_RPC_API_VERSION = '1.0' @@ -105,6 +106,12 @@ class ConductorAPI(nova.openstack.common.rpc.proxy.RpcProxy): dest_compute=dest_compute) return self.call(context, msg, version='1.20') + def migration_create(self, context, instance, values): + instance_p = jsonutils.to_primitive(instance) + msg = self.make_msg('migration_create', instance=instance_p, + values=values) + return self.call(context, msg, version='1.30') + def migration_update(self, context, migration, status): migration_p = jsonutils.to_primitive(migration) msg = self.make_msg('migration_update', migration=migration_p, diff --git a/nova/tests/compute/test_resource_tracker.py b/nova/tests/compute/test_resource_tracker.py index f5d523ec1..3bfd51461 100644 --- a/nova/tests/compute/test_resource_tracker.py +++ b/nova/tests/compute/test_resource_tracker.py @@ -24,6 +24,7 @@ from nova.compute import task_states from nova.compute import vm_states from nova import context from nova import db +from nova.openstack.common import cfg from nova.openstack.common import log as logging from nova.openstack.common import timeutils from nova import test @@ -35,6 +36,7 @@ LOG = logging.getLogger(__name__) FAKE_VIRT_MEMORY_MB = 5 FAKE_VIRT_LOCAL_GB = 6 FAKE_VIRT_VCPUS = 1 +CONF = cfg.CONF class UnsupportedVirtDriver(driver.ComputeDriver): @@ -97,14 +99,21 @@ class BaseTestCase(test.TestCase): self.context = context.get_admin_context() + self.flags(use_local=True, group='conductor') + self.conductor = self.start_service('conductor', + manager=CONF.conductor.manager) + self._instances = {} self._instance_types = {} - self.stubs.Set(db, 'instance_get_all_by_host_and_node', + self.stubs.Set(self.conductor.db, + 'instance_get_all_by_host_and_node', self._fake_instance_get_all_by_host_and_node) - self.stubs.Set(db, 'instance_update_and_get_original', + self.stubs.Set(self.conductor.db, + 'instance_update_and_get_original', self._fake_instance_update_and_get_original) - self.stubs.Set(db, 'instance_type_get', self._fake_instance_type_get) + self.stubs.Set(self.conductor.db, + 'instance_type_get', self._fake_instance_type_get) self.host = 'fakehost' @@ -622,7 +631,8 @@ class ResizeClaimTestCase(BaseTrackerTestCase): def setUp(self): super(ResizeClaimTestCase, self).setUp() - self.stubs.Set(db, 'migration_create', self._fake_migration_create) + self.stubs.Set(self.conductor.db, + 'migration_create', self._fake_migration_create) self.instance = self._fake_instance() self.instance_type = self._fake_instance_type_create() @@ -645,7 +655,7 @@ class ResizeClaimTestCase(BaseTrackerTestCase): if values: migration.update(values) - self._migrations[instance_uuid] = migration + self._migrations[migration['instance_uuid']] = migration return migration def test_claim(self): diff --git a/nova/tests/conductor/test_conductor.py b/nova/tests/conductor/test_conductor.py index e3ef6072a..46fadf4f0 100644 --- a/nova/tests/conductor/test_conductor.py +++ b/nova/tests/conductor/test_conductor.py @@ -35,14 +35,21 @@ from nova import test FAKE_IMAGE_REF = 'fake-image-ref' +class FakeContext(context.RequestContext): + def elevated(self): + """Return a consistent elevated context so we can detect it.""" + if not hasattr(self, '_elevated'): + self._elevated = super(FakeContext, self).elevated() + return self._elevated + + class _BaseTestCase(object): def setUp(self): super(_BaseTestCase, self).setUp() self.db = None self.user_id = 'fake' self.project_id = 'fake' - self.context = context.RequestContext(self.user_id, - self.project_id) + self.context = FakeContext(self.user_id, self.project_id) def stub_out_client_exceptions(self): def passthru(exceptions, func, *args, **kwargs): @@ -123,6 +130,21 @@ class _BaseTestCase(object): 'fake-window', 'fake-host') + def test_migration_create(self): + inst = {'uuid': 'fake-uuid', + 'host': 'fake-host', + 'node': 'fake-node'} + self.mox.StubOutWithMock(db, 'migration_create') + db.migration_create(self.context.elevated(), + {'instance_uuid': inst['uuid'], + 'source_compute': inst['host'], + 'source_node': inst['node'], + 'fake-key': 'fake-value'}).AndReturn('result') + self.mox.ReplayAll() + result = self.conductor.migration_create(self.context, inst, + {'fake-key': 'fake-value'}) + self.assertEqual(result, 'result') + def test_migration_update(self): migration = db.migration_create(self.context.elevated(), {'instance_uuid': 'fake-uuid', |