diff options
| author | Jenkins <jenkins@review.openstack.org> | 2012-12-04 19:33:15 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2012-12-04 19:33:15 +0000 |
| commit | ad3176ee5318fccceff48cbdb6c8c910579c4698 (patch) | |
| tree | 053f2923fa65599ed43bdc5928f925494357ad96 /nova/tests | |
| parent | 0e43b371db88711c30c70d5f1dec1f6ccc51e0ec (diff) | |
| parent | f51885a9732c84d3b91d049ae5fe995d9296795e (diff) | |
Merge "Implements volume usage metering."
Diffstat (limited to 'nova/tests')
| -rw-r--r-- | nova/tests/test_db_api.py | 86 | ||||
| -rw-r--r-- | nova/tests/test_libvirt.py | 50 |
2 files changed, 136 insertions, 0 deletions
diff --git a/nova/tests/test_db_api.py b/nova/tests/test_db_api.py index 546aeaa97..f2124c021 100644 --- a/nova/tests/test_db_api.py +++ b/nova/tests/test_db_api.py @@ -1315,3 +1315,89 @@ class InstanceDestroyConstraints(test.TestCase): ctx, instance['uuid'], constraint) instance = db.instance_get_by_uuid(ctx, instance['uuid']) self.assertFalse(instance['deleted']) + + +class VolumeUsageDBApiTestCase(test.TestCase): + def setUp(self): + super(VolumeUsageDBApiTestCase, self).setUp() + self.user_id = 'fake' + self.project_id = 'fake' + self.context = context.RequestContext(self.user_id, self.project_id) + + def test_vol_usage_update_no_totals_update(self): + ctxt = context.get_admin_context() + now = timeutils.utcnow() + timeutils.set_time_override(now) + start_time = now - datetime.timedelta(seconds=10) + refreshed_time = now - datetime.timedelta(seconds=5) + + expected_vol_usages = [{'volume_id': u'1', + 'curr_reads': 1000, + 'curr_read_bytes': 2000, + 'curr_writes': 3000, + 'curr_write_bytes': 4000}, + {'volume_id': u'2', + 'curr_reads': 100, + 'curr_read_bytes': 200, + 'curr_writes': 300, + 'curr_write_bytes': 400}] + + def _compare(vol_usage, expected): + for key, value in expected.items(): + self.assertEqual(vol_usage[key], value) + + vol_usages = db.vol_get_usage_by_time(ctxt, start_time) + self.assertEqual(len(vol_usages), 0) + + vol_usage = db.vol_usage_update(ctxt, 1, rd_req=10, rd_bytes=20, + wr_req=30, wr_bytes=40, instance_id=1) + vol_usage = db.vol_usage_update(ctxt, 2, rd_req=100, rd_bytes=200, + wr_req=300, wr_bytes=400, + instance_id=1) + vol_usage = db.vol_usage_update(ctxt, 1, rd_req=1000, rd_bytes=2000, + wr_req=3000, wr_bytes=4000, + instance_id=1, + last_refreshed=refreshed_time) + + vol_usages = db.vol_get_usage_by_time(ctxt, start_time) + self.assertEqual(len(vol_usages), 2) + _compare(vol_usages[0], expected_vol_usages[0]) + _compare(vol_usages[1], expected_vol_usages[1]) + timeutils.clear_time_override() + + def test_vol_usage_update_totals_update(self): + ctxt = context.get_admin_context() + now = timeutils.utcnow() + timeutils.set_time_override(now) + start_time = now - datetime.timedelta(seconds=10) + expected_vol_usages = {'volume_id': u'1', + 'tot_reads': 600, + 'tot_read_bytes': 800, + 'tot_writes': 1000, + 'tot_write_bytes': 1200, + 'curr_reads': 0, + 'curr_read_bytes': 0, + 'curr_writes': 0, + 'curr_write_bytes': 0} + + vol_usage = db.vol_usage_update(ctxt, 1, rd_req=100, rd_bytes=200, + wr_req=300, wr_bytes=400, + instance_id=1) + vol_usage = db.vol_usage_update(ctxt, 1, rd_req=200, rd_bytes=300, + wr_req=400, wr_bytes=500, + instance_id=1, + update_totals=True) + vol_usage = db.vol_usage_update(ctxt, 1, rd_req=300, rd_bytes=400, + wr_req=500, wr_bytes=600, + instance_id=1) + vol_usage = db.vol_usage_update(ctxt, 1, rd_req=400, rd_bytes=500, + wr_req=600, wr_bytes=700, + instance_id=1, + update_totals=True) + + vol_usages = db.vol_get_usage_by_time(ctxt, start_time) + + self.assertEquals(1, len(vol_usages)) + for key, value in expected_vol_usages.items(): + self.assertEqual(vol_usages[0][key], value) + timeutils.clear_time_override() diff --git a/nova/tests/test_libvirt.py b/nova/tests/test_libvirt.py index 5c90ebcd1..5df7d920d 100644 --- a/nova/tests/test_libvirt.py +++ b/nova/tests/test_libvirt.py @@ -4213,6 +4213,56 @@ class LibvirtDriverTestCase(test.TestCase): _fake_network_info(self.stubs, 1)) +class LibvirtVolumeUsageTestCase(test.TestCase): + """Test for nova.virt.libvirt.libvirt_driver.LibvirtDriver + .get_all_volume_usage""" + + def setUp(self): + super(LibvirtVolumeUsageTestCase, self).setUp() + self.conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False) + self.c = context.get_admin_context() + + # creating instance + inst = {} + inst['uuid'] = '875a8070-d0b9-4949-8b31-104d125c9a64' + self.ins_ref = db.instance_create(self.c, inst) + + # verify bootable volume device path also + self.bdms = [{'volume_id': 1, + 'device_name': '/dev/vde'}, + {'volume_id': 2, + 'device_name': 'vda'}] + + def test_get_all_volume_usage(self): + def fake_block_stats(instance_name, disk): + return (169L, 688640L, 0L, 0L, -1L) + + self.stubs.Set(self.conn, 'block_stats', fake_block_stats) + vol_usage = self.conn.get_all_volume_usage(self.c, + [dict(instance=self.ins_ref, instance_bdms=self.bdms)]) + + expected_usage = [{'volume': 1, + 'instance_id': 1, + 'rd_bytes': 688640L, 'wr_req': 0L, + 'flush_operations': -1L, 'rd_req': 169L, + 'wr_bytes': 0L}, + {'volume': 2, + 'instance_id': 1, + 'rd_bytes': 688640L, 'wr_req': 0L, + 'flush_operations': -1L, 'rd_req': 169L, + 'wr_bytes': 0L}] + self.assertEqual(vol_usage, expected_usage) + + def test_get_all_volume_usage_device_not_found(self): + def fake_lookup(instance_name): + raise libvirt.libvirtError('invalid path') + + self.stubs.Set(self.conn, '_lookup_by_name', fake_lookup) + vol_usage = self.conn.get_all_volume_usage(self.c, + [dict(instance=self.ins_ref, instance_bdms=self.bdms)]) + self.assertEqual(vol_usage, []) + + class LibvirtNonblockingTestCase(test.TestCase): """Test libvirt_nonblocking option""" |
