summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xnova/compute/manager.py38
-rw-r--r--nova/conductor/api.py32
-rw-r--r--nova/conductor/manager.py28
-rw-r--r--nova/conductor/rpcapi.py27
-rw-r--r--nova/tests/compute/test_compute.py22
-rw-r--r--nova/tests/conductor/test_conductor.py34
6 files changed, 153 insertions, 28 deletions
diff --git a/nova/compute/manager.py b/nova/compute/manager.py
index 504d16da2..4bb08aa16 100755
--- a/nova/compute/manager.py
+++ b/nova/compute/manager.py
@@ -1840,8 +1840,9 @@ class ComputeManager(manager.SchedulerDependentManager):
self.network_api.setup_networks_on_host(context, instance,
teardown=True)
- self.network_api.migrate_instance_start(context, instance,
- migration)
+ self.conductor_api.network_migrate_instance_start(context,
+ instance,
+ migration)
network_info = self._get_instance_nw_info(context, instance)
block_device_info = self._get_instance_volume_block_device_info(
@@ -1920,8 +1921,9 @@ class ComputeManager(manager.SchedulerDependentManager):
instance['uuid'], launched_at=timeutils.utcnow(),
expected_task_state=task_states.RESIZE_REVERTING)
- self.network_api.migrate_instance_finish(context, instance,
- migration)
+ self.conductor_api.network_migrate_instance_finish(context,
+ instance,
+ migration)
instance = self._instance_update(context, instance['uuid'],
vm_state=vm_states.ACTIVE, task_state=None)
@@ -1934,15 +1936,13 @@ class ComputeManager(manager.SchedulerDependentManager):
self._quota_commit(context, reservations)
- @staticmethod
- def _quota_commit(context, reservations):
+ def _quota_commit(self, context, reservations):
if reservations:
- QUOTAS.commit(context, reservations)
+ self.conductor_api.quota_commit(context, reservations)
- @staticmethod
- def _quota_rollback(context, reservations):
+ def _quota_rollback(self, context, reservations):
if reservations:
- QUOTAS.rollback(context, reservations)
+ self.conductor_api.quota_rollback(context, reservations)
def _prep_resize(self, context, image, instance, instance_type,
reservations, request_spec, filter_properties, node):
@@ -2096,8 +2096,9 @@ class ComputeManager(manager.SchedulerDependentManager):
self._terminate_volume_connections(context, instance)
- self.network_api.migrate_instance_start(context, instance,
- migration)
+ self.conductor_api.network_migrate_instance_start(context,
+ instance,
+ migration)
migration = self.conductor_api.migration_update(context,
migration, 'post-migrating')
@@ -2156,8 +2157,9 @@ class ComputeManager(manager.SchedulerDependentManager):
self.network_api.setup_networks_on_host(context, instance,
migration['dest_compute'])
- self.network_api.migrate_instance_finish(context, instance,
- migration)
+ self.conductor_api.network_migrate_instance_finish(context,
+ instance,
+ migration)
network_info = self._get_instance_nw_info(context, instance)
@@ -2864,7 +2866,9 @@ class ComputeManager(manager.SchedulerDependentManager):
migration = {'source_compute': self.host,
'dest_compute': dest, }
- self.network_api.migrate_instance_start(ctxt, instance_ref, migration)
+ self.conductor_api.network_migrate_instance_start(ctxt,
+ instance_ref,
+ migration)
# Define domain at destination host, without doing it,
# pause/suspend/terminate do not work.
@@ -2919,7 +2923,9 @@ class ComputeManager(manager.SchedulerDependentManager):
self.host)
migration = {'source_compute': instance['host'],
'dest_compute': self.host, }
- self.network_api.migrate_instance_finish(context, instance, migration)
+ self.conductor_api.network_migrate_instance_finish(context,
+ instance,
+ migration)
network_info = self._get_instance_nw_info(context, instance)
block_device_info = self._get_instance_volume_block_device_info(
diff --git a/nova/conductor/api.py b/nova/conductor/api.py
index 3b193fff8..50f59d9d6 100644
--- a/nova/conductor/api.py
+++ b/nova/conductor/api.py
@@ -303,6 +303,22 @@ class LocalAPI(object):
return self._manager.security_groups_trigger_members_refresh(context,
group_ids)
+ def network_migrate_instance_start(self, context, instance, migration):
+ return self._manager.network_migrate_instance_start(context,
+ instance,
+ migration)
+
+ def network_migrate_instance_finish(self, context, instance, migration):
+ return self._manager.network_migrate_instance_finish(context,
+ instance,
+ migration)
+
+ def quota_commit(self, context, reservations):
+ return self._manager.quota_commit(context, reservations)
+
+ def quota_rollback(self, context, reservations):
+ return self._manager.quota_rollback(context, reservations)
+
class API(object):
"""Conductor API that does updates via RPC to the ConductorManager."""
@@ -604,3 +620,19 @@ class API(object):
def security_groups_trigger_members_refresh(self, context, group_ids):
return self.conductor_rpcapi.security_groups_trigger_members_refresh(
context, group_ids)
+
+ def network_migrate_instance_start(self, context, instance, migration):
+ return self.conductor_rpcapi.network_migrate_instance_start(context,
+ instance,
+ migration)
+
+ def network_migrate_instance_finish(self, context, instance, migration):
+ return self.conductor_rpcapi.network_migrate_instance_finish(context,
+ instance,
+ migration)
+
+ def quota_commit(self, context, reservations):
+ return self.conductor_rpcapi.quota_commit(context, reservations)
+
+ def quota_rollback(self, context, reservations):
+ return self.conductor_rpcapi.quota_rollback(context, reservations)
diff --git a/nova/conductor/manager.py b/nova/conductor/manager.py
index 0d2031a4a..905d2e2cd 100644
--- a/nova/conductor/manager.py
+++ b/nova/conductor/manager.py
@@ -18,12 +18,13 @@ from nova.compute import api as compute_api
from nova.compute import utils as compute_utils
from nova import exception
from nova import manager
+from nova import network
from nova import notifications
from nova.openstack.common import jsonutils
from nova.openstack.common import log as logging
from nova.openstack.common.rpc import common as rpc_common
from nova.openstack.common import timeutils
-
+from nova import quota
LOG = logging.getLogger(__name__)
@@ -46,12 +47,23 @@ datetime_fields = ['launched_at', 'terminated_at']
class ConductorManager(manager.SchedulerDependentManager):
"""Mission: TBD."""
- RPC_API_VERSION = '1.40'
+ RPC_API_VERSION = '1.41'
def __init__(self, *args, **kwargs):
super(ConductorManager, self).__init__(service_name='conductor',
*args, **kwargs)
self.security_group_api = compute_api.SecurityGroupAPI()
+ self._network_api = None
+ self.quotas = quota.QUOTAS
+
+ @property
+ def network_api(self):
+ # NOTE(danms): We need to instantiate our network_api on first use
+ # to avoid the circular dependency that exists between our init
+ # and network_api's
+ if self._network_api is None:
+ self._network_api = network.API()
+ return self._network_api
def ping(self, context, arg):
return jsonutils.to_primitive({'service': 'conductor', 'arg': arg})
@@ -360,3 +372,15 @@ class ConductorManager(manager.SchedulerDependentManager):
def security_groups_trigger_members_refresh(self, context, group_ids):
self.security_group_api.trigger_members_refresh(context, group_ids)
+
+ def network_migrate_instance_start(self, context, instance, migration):
+ self.network_api.migrate_instance_start(context, instance, migration)
+
+ def network_migrate_instance_finish(self, context, instance, migration):
+ self.network_api.migrate_instance_finish(context, instance, migration)
+
+ def quota_commit(self, context, reservations):
+ quota.QUOTAS.commit(context, reservations)
+
+ def quota_rollback(self, context, reservations):
+ quota.QUOTAS.rollback(context, reservations)
diff --git a/nova/conductor/rpcapi.py b/nova/conductor/rpcapi.py
index f5ce0b4cb..58613e59a 100644
--- a/nova/conductor/rpcapi.py
+++ b/nova/conductor/rpcapi.py
@@ -75,6 +75,9 @@ class ConductorAPI(nova.openstack.common.rpc.proxy.RpcProxy):
1.40 - Added security_groups_trigger_handler and
security_groups_trigger_members_refresh
Remove instance_get_active_by_window
+ 1.41 - Added fixed_ip_get_by_instance, network_get,
+ instance_floating_address_get_all, quota_commit,
+ quota_rollback
"""
BASE_RPC_API_VERSION = '1.0'
@@ -382,3 +385,27 @@ class ConductorAPI(nova.openstack.common.rpc.proxy.RpcProxy):
msg = self.make_msg('security_groups_trigger_members_refresh',
group_ids=group_ids)
return self.call(context, msg, version='1.40')
+
+ def network_migrate_instance_start(self, context, instance, migration):
+ instance_p = jsonutils.to_primitive(instance)
+ migration_p = jsonutils.to_primitive(migration)
+ msg = self.make_msg('network_migrate_instance_start',
+ instance=instance_p, migration=migration_p)
+ return self.call(context, msg, version='1.41')
+
+ def network_migrate_instance_finish(self, context, instance, migration):
+ instance_p = jsonutils.to_primitive(instance)
+ migration_p = jsonutils.to_primitive(migration)
+ msg = self.make_msg('network_migrate_instance_finish',
+ instance=instance_p, migration=migration_p)
+ return self.call(context, msg, version='1.41')
+
+ def quota_commit(self, context, reservations):
+ reservations_p = jsonutils.to_primitive(reservations)
+ msg = self.make_msg('quota_commit', reservations=reservations_p)
+ return self.call(context, msg, version='1.41')
+
+ def quota_rollback(self, context, reservations):
+ reservations_p = jsonutils.to_primitive(reservations)
+ msg = self.make_msg('quota_rollback', reservations=reservations_p)
+ return self.call(context, msg, version='1.41')
diff --git a/nova/tests/compute/test_compute.py b/nova/tests/compute/test_compute.py
index 36629d5d8..12bd3cf19 100644
--- a/nova/tests/compute/test_compute.py
+++ b/nova/tests/compute/test_compute.py
@@ -2640,10 +2640,11 @@ class ComputeTestCase(BaseTestCase):
# creating mocks
self.mox.StubOutWithMock(self.compute.driver, 'unfilter_instance')
self.compute.driver.unfilter_instance(inst_ref, [])
- self.mox.StubOutWithMock(self.compute.network_api,
- 'migrate_instance_start')
+ self.mox.StubOutWithMock(self.compute.conductor_api,
+ 'network_migrate_instance_start')
migration = {'source_compute': srchost, 'dest_compute': dest, }
- self.compute.network_api.migrate_instance_start(c, inst_ref, migration)
+ self.compute.conductor_api.network_migrate_instance_start(c, inst_ref,
+ migration)
self.mox.StubOutWithMock(rpc, 'call')
rpc.call(c, rpc.queue_get_for(c, CONF.compute_topic, dest),
{"method": "post_live_migration_at_destination",
@@ -2684,11 +2685,12 @@ class ComputeTestCase(BaseTestCase):
# creating mocks
self.mox.StubOutWithMock(self.compute.driver, 'unfilter_instance')
self.compute.driver.unfilter_instance(inst_ref, [])
- self.mox.StubOutWithMock(self.compute.network_api,
- 'migrate_instance_start')
+ self.mox.StubOutWithMock(self.compute.conductor_api,
+ 'network_migrate_instance_start')
migration = {'source_compute': srchost,
'dest_compute': dest, }
- self.compute.network_api.migrate_instance_start(c, inst_ref, migration)
+ self.compute.conductor_api.network_migrate_instance_start(c, inst_ref,
+ migration)
self.mox.StubOutWithMock(rpc, 'call')
rpc.call(c, rpc.queue_get_for(c, CONF.compute_topic, dest),
{"method": "post_live_migration_at_destination",
@@ -2710,8 +2712,8 @@ class ComputeTestCase(BaseTestCase):
def test_post_live_migration_at_destination(self):
self.mox.StubOutWithMock(self.compute.network_api,
'setup_networks_on_host')
- self.mox.StubOutWithMock(self.compute.network_api,
- 'migrate_instance_finish')
+ self.mox.StubOutWithMock(self.compute.conductor_api,
+ 'network_migrate_instance_finish')
self.mox.StubOutWithMock(self.compute, '_get_power_state')
self.mox.StubOutWithMock(self.compute, '_instance_update')
@@ -2726,8 +2728,8 @@ class ComputeTestCase(BaseTestCase):
self.compute.host)
migration = {'source_compute': instance['host'],
'dest_compute': self.compute.host, }
- self.compute.network_api.migrate_instance_finish(admin_ctxt,
- instance, migration)
+ self.compute.conductor_api.network_migrate_instance_finish(admin_ctxt,
+ instance, migration)
fake_net_info = []
fake_block_dev_info = {'foo': 'bar'}
self.compute.driver.post_live_migration_at_destination(admin_ctxt,
diff --git a/nova/tests/conductor/test_conductor.py b/nova/tests/conductor/test_conductor.py
index bd73328e8..5c9ce9e5f 100644
--- a/nova/tests/conductor/test_conductor.py
+++ b/nova/tests/conductor/test_conductor.py
@@ -31,6 +31,7 @@ from nova import notifications
from nova.openstack.common import jsonutils
from nova.openstack.common.rpc import common as rpc_common
from nova.openstack.common import timeutils
+from nova import quota
from nova import test
@@ -503,6 +504,39 @@ class _BaseTestCase(object):
self.conductor.security_groups_trigger_members_refresh(self.context,
[1, 2, 3])
+ def test_network_migrate_instance_start(self):
+ self.mox.StubOutWithMock(self.conductor_manager.network_api,
+ 'migrate_instance_start')
+ self.conductor_manager.network_api.migrate_instance_start(self.context,
+ 'instance',
+ 'migration')
+ self.mox.ReplayAll()
+ self.conductor.network_migrate_instance_start(self.context,
+ 'instance',
+ 'migration')
+
+ def test_network_migrate_instance_finish(self):
+ self.mox.StubOutWithMock(self.conductor_manager.network_api,
+ 'migrate_instance_finish')
+ self.conductor_manager.network_api.migrate_instance_finish(
+ self.context, 'instance', 'migration')
+ self.mox.ReplayAll()
+ self.conductor.network_migrate_instance_finish(self.context,
+ 'instance',
+ 'migration')
+
+ def test_quota_commit(self):
+ self.mox.StubOutWithMock(quota.QUOTAS, 'commit')
+ quota.QUOTAS.commit(self.context, 'reservations')
+ self.mox.ReplayAll()
+ self.conductor.quota_commit(self.context, 'reservations')
+
+ def test_quota_commit(self):
+ self.mox.StubOutWithMock(quota.QUOTAS, 'rollback')
+ quota.QUOTAS.rollback(self.context, 'reservations')
+ self.mox.ReplayAll()
+ self.conductor.quota_rollback(self.context, 'reservations')
+
class ConductorTestCase(_BaseTestCase, test.TestCase):
"""Conductor Manager Tests."""