summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Smith <danms@us.ibm.com>2013-01-04 09:01:29 -0800
committerGerrit Code Review <review@openstack.org>2013-01-05 03:26:30 +0000
commitba2a0565a6451ee3227b6e11bbdd8ea75cbf1fc3 (patch)
tree1fb950f9c010e317bff621da557ca39d9219cd76
parent6323c80323d01e042558bd78e74c5d6da66a1e17 (diff)
downloadnova-ba2a0565a6451ee3227b6e11bbdd8ea75cbf1fc3.tar.gz
nova-ba2a0565a6451ee3227b6e11bbdd8ea75cbf1fc3.tar.xz
nova-ba2a0565a6451ee3227b6e11bbdd8ea75cbf1fc3.zip
Move vol_usage methods to conductor
This patch moves the compute/manager's use of the following methods to conductor: - vol_usage_update() - vol_get_usage_by_time() Related to blueprint no-db-compute-manager Change-Id: I51a30d66be51eb532cb19c8b06b87ad07387dd54
-rw-r--r--nova/compute/manager.py23
-rw-r--r--nova/conductor/api.py24
-rw-r--r--nova/conductor/manager.py13
-rw-r--r--nova/conductor/rpcapi.py17
-rw-r--r--nova/tests/conductor/test_conductor.py20
5 files changed, 87 insertions, 10 deletions
diff --git a/nova/compute/manager.py b/nova/compute/manager.py
index f01fa265b..588e437f9 100644
--- a/nova/compute/manager.py
+++ b/nova/compute/manager.py
@@ -2430,9 +2430,11 @@ class ComputeManager(manager.SchedulerDependentManager):
if vol_stats:
LOG.debug(_("Updating volume usage cache with totals"))
rd_req, rd_bytes, wr_req, wr_bytes, flush_ops = vol_stats
- self.db.vol_usage_update(context, volume_id, rd_req, rd_bytes,
- wr_req, wr_bytes, instance['id'],
- update_totals=True)
+ self.conductor_api.vol_usage_update(context, volume_id,
+ rd_req, rd_bytes,
+ wr_req, wr_bytes,
+ instance,
+ update_totals=True)
self._detach_volume(context, instance, bdm)
volume = self.volume_api.get(context, volume_id)
@@ -3056,11 +3058,13 @@ class ComputeManager(manager.SchedulerDependentManager):
for usage in vol_usages:
# Allow switching of greenthreads between queries.
greenthread.sleep(0)
- self.db.vol_usage_update(context, usage['volume'], usage['rd_req'],
- usage['rd_bytes'], usage['wr_req'],
- usage['wr_bytes'],
- usage['instance']['uuid'],
- last_refreshed=refreshed)
+ self.conductor_api.vol_usage_update(context, usage['volume'],
+ usage['rd_req'],
+ usage['rd_bytes'],
+ usage['wr_req'],
+ usage['wr_bytes'],
+ usage['instance'],
+ last_refreshed=refreshed)
def _send_volume_usage_notifications(self, context, start_time):
"""Queries vol usage cache table and sends a vol usage notification"""
@@ -3068,7 +3072,8 @@ class ComputeManager(manager.SchedulerDependentManager):
# the last run of get_all_volume_usage and this one
# but detach stats will be recorded in db and returned from
# vol_get_usage_by_time
- vol_usages = self.db.vol_get_usage_by_time(context, start_time)
+ vol_usages = self.conductor_api.vol_get_usage_by_time(context,
+ start_time)
for vol_usage in vol_usages:
notifier.notify(context, 'volume.%s' % self.host, 'volume.usage',
notifier.INFO,
diff --git a/nova/conductor/api.py b/nova/conductor/api.py
index ca65e83db..883b368df 100644
--- a/nova/conductor/api.py
+++ b/nova/conductor/api.py
@@ -198,6 +198,18 @@ class LocalAPI(object):
return self._manager.block_device_mapping_destroy(
context, instance=instance, volume_id=volume_id)
+ def vol_get_usage_by_time(self, context, start_time):
+ return self._manager.vol_get_usage_by_time(context, start_time)
+
+ def vol_usage_update(self, context, vol_id, rd_req, rd_bytes, wr_req,
+ wr_bytes, instance, last_refreshed=None,
+ update_totals=False):
+ return self._manager.vol_usage_update(context, vol_id,
+ rd_req, rd_bytes,
+ wr_req, wr_bytes,
+ instance, last_refreshed,
+ update_totals)
+
class API(object):
"""Conductor API that does updates via RPC to the ConductorManager"""
@@ -348,3 +360,15 @@ class API(object):
volume_id):
return self.conductor_rpcapi.block_device_mapping_destroy(
context, instance=instance, volume_id=volume_id)
+
+ def vol_get_usage_by_time(self, context, start_time):
+ return self.conductor_rpcapi.vol_get_usage_by_time(context, start_time)
+
+ def vol_usage_update(self, context, vol_id, rd_req, rd_bytes, wr_req,
+ wr_bytes, instance, last_refreshed=None,
+ update_totals=False):
+ return self.conductor_rpcapi.vol_usage_update(context, vol_id,
+ rd_req, rd_bytes,
+ wr_req, wr_bytes,
+ instance, last_refreshed,
+ update_totals)
diff --git a/nova/conductor/manager.py b/nova/conductor/manager.py
index 7ddfd497e..1585a6e83 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.18'
+ RPC_API_VERSION = '1.19'
def __init__(self, *args, **kwargs):
super(ConductorManager, self).__init__(service_name='conductor',
@@ -215,3 +215,14 @@ class ConductorManager(manager.SchedulerDependentManager):
def instance_type_get(self, context, instance_type_id):
result = self.db.instance_type_get(context, instance_type_id)
return jsonutils.to_primitive(result)
+
+ def vol_get_usage_by_time(self, context, start_time):
+ result = self.db.vol_get_usage_by_time(context, start_time)
+ return jsonutils.to_primitive(result)
+
+ def vol_usage_update(self, context, vol_id, rd_req, rd_bytes, wr_req,
+ wr_bytes, instance, last_refreshed=None,
+ update_totals=False):
+ self.db.vol_usage_update(context, vol_id, rd_req, rd_bytes, wr_req,
+ wr_bytes, instance['uuid'], last_refreshed,
+ update_totals)
diff --git a/nova/conductor/rpcapi.py b/nova/conductor/rpcapi.py
index aeaad8868..21ee59d31 100644
--- a/nova/conductor/rpcapi.py
+++ b/nova/conductor/rpcapi.py
@@ -50,6 +50,7 @@ class ConductorAPI(nova.openstack.common.rpc.proxy.RpcProxy):
1.16 - Added instance_destroy
1.17 - Added instance_info_cache_delete
1.18 - Added instance_type_get
+ 1.19 - Added vol_get_usage_by_time and vol_usage_update
"""
BASE_RPC_API_VERSION = '1.0'
@@ -208,3 +209,19 @@ class ConductorAPI(nova.openstack.common.rpc.proxy.RpcProxy):
msg = self.make_msg('instance_type_get',
instance_type_id=instance_type_id)
return self.call(context, msg, version='1.18')
+
+ def vol_get_usage_by_time(self, context, start_time):
+ start_time_p = jsonutils.to_primitive(start_time)
+ msg = self.make_msg('vol_get_usage_by_time', start_time=start_time_p)
+ return self.call(context, msg, version='1.19')
+
+ def vol_usage_update(self, context, vol_id, rd_req, rd_bytes, wr_req,
+ wr_bytes, instance, last_refreshed=None,
+ update_totals=False):
+ instance_p = jsonutils.to_primitive(instance)
+ msg = self.make_msg('vol_usage_update', vol_id=vol_id, rd_req=rd_req,
+ rd_bytes=rd_bytes, wr_req=wr_req,
+ wr_bytes=wr_bytes,
+ instance=instance_p, last_refreshed=last_refreshed,
+ update_totals=update_totals)
+ return self.call(context, msg, version='1.19')
diff --git a/nova/tests/conductor/test_conductor.py b/nova/tests/conductor/test_conductor.py
index 454d5347a..d2c3df19a 100644
--- a/nova/tests/conductor/test_conductor.py
+++ b/nova/tests/conductor/test_conductor.py
@@ -308,6 +308,26 @@ class _BaseTestCase(object):
result = self.conductor.instance_type_get(self.context, 'fake-id')
self.assertEqual(result, 'fake-type')
+ def test_vol_get_usage_by_time(self):
+ self.mox.StubOutWithMock(db, 'vol_get_usage_by_time')
+ db.vol_get_usage_by_time(self.context, 'fake-time').AndReturn(
+ 'fake-usage')
+ self.mox.ReplayAll()
+ result = self.conductor.vol_get_usage_by_time(self.context,
+ 'fake-time')
+ self.assertEqual(result, 'fake-usage')
+
+ def test_vol_usage_update(self):
+ self.mox.StubOutWithMock(db, 'vol_usage_update')
+ db.vol_usage_update(self.context, 'fake-vol', 'rd-req', 'rd-bytes',
+ 'wr-req', 'wr-bytes', 'fake-id', 'fake-refr',
+ 'fake-bool')
+ self.mox.ReplayAll()
+ self.conductor.vol_usage_update(self.context, 'fake-vol', 'rd-req',
+ 'rd-bytes', 'wr-req', 'wr-bytes',
+ {'uuid': 'fake-id'}, 'fake-refr',
+ 'fake-bool')
+
class ConductorTestCase(_BaseTestCase, test.TestCase):
"""Conductor Manager Tests"""