summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nova/compute/resource_tracker.py7
-rw-r--r--nova/conductor/api.py7
-rw-r--r--nova/conductor/manager.py9
-rw-r--r--nova/conductor/rpcapi.py7
-rw-r--r--nova/tests/compute/test_resource_tracker.py20
-rw-r--r--nova/tests/conductor/test_conductor.py26
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',