From ead58f1522770894950d5a2708d9ae4fa5ac147c Mon Sep 17 00:00:00 2001 From: Ollie Leahy Date: Thu, 21 Mar 2013 13:16:05 +0000 Subject: [PATCH] Add tenant/ user id to volume usage notifications Volume usage notifications are generated to enable traffic based billing on volumes. Include tenant id and user id to make these notifications more useful to billing systems. Fixes bug # 1158292 Change-Id: Ic71c10f0fc5d9e8c5a0e2f538de072e7ccca20ee --- nova/tests/test_db_api.py | 38 +++++++++++++++++++++++++++------ nova/tests/test_migrations.py | 40 +++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 7 deletions(-) diff --git a/nova/tests/test_db_api.py b/nova/tests/test_db_api.py index b24f7666..b81b04be 100644 --- a/nova/tests/test_db_api.py +++ b/nova/tests/test_db_api.py @@ -2372,11 +2372,17 @@ class VolumeUsageDBApiTestCase(test.TestCase): refreshed_time = now - datetime.timedelta(seconds=5) expected_vol_usages = [{'volume_id': u'1', + 'instance_uuid': 'fake-instance-uuid1', + 'project_id': 'fake-project-uuid1', + 'user_id': 'fake-user-uuid1', 'curr_reads': 1000, 'curr_read_bytes': 2000, 'curr_writes': 3000, 'curr_write_bytes': 4000}, {'volume_id': u'2', + 'instance_uuid': 'fake-instance-uuid2', + 'project_id': 'fake-project-uuid2', + 'user_id': 'fake-user-uuid2', 'curr_reads': 100, 'curr_read_bytes': 200, 'curr_writes': 300, @@ -2390,13 +2396,20 @@ class VolumeUsageDBApiTestCase(test.TestCase): 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) + wr_req=30, wr_bytes=40, + instance_id='fake-instance-uuid1', + project_id='fake-project-uuid1', + user_id='fake-user-uuid1') vol_usage = db.vol_usage_update(ctxt, 2, rd_req=100, rd_bytes=200, wr_req=300, wr_bytes=400, - instance_id=1) + instance_id='fake-instance-uuid2', + project_id='fake-project-uuid2', + user_id='fake-user-uuid2') vol_usage = db.vol_usage_update(ctxt, 1, rd_req=1000, rd_bytes=2000, wr_req=3000, wr_bytes=4000, - instance_id=1, + instance_id='fake-instance-uuid1', + project_id='fake-project-uuid1', + user_id='fake-user-uuid1', last_refreshed=refreshed_time) vol_usages = db.vol_get_usage_by_time(ctxt, start_time) @@ -2411,6 +2424,9 @@ class VolumeUsageDBApiTestCase(test.TestCase): timeutils.set_time_override(now) start_time = now - datetime.timedelta(seconds=10) expected_vol_usages = {'volume_id': u'1', + 'project_id': 'fake-project-uuid', + 'user_id': 'fake-user-uuid', + 'instance_uuid': 'fake-instance-uuid', 'tot_reads': 600, 'tot_read_bytes': 800, 'tot_writes': 1000, @@ -2422,17 +2438,25 @@ class VolumeUsageDBApiTestCase(test.TestCase): vol_usage = db.vol_usage_update(ctxt, 1, rd_req=100, rd_bytes=200, wr_req=300, wr_bytes=400, - instance_id=1) + instance_id='fake-instance-uuid', + project_id='fake-project-uuid', + user_id='fake-user-uuid') vol_usage = db.vol_usage_update(ctxt, 1, rd_req=200, rd_bytes=300, wr_req=400, wr_bytes=500, - instance_id=1, + instance_id='fake-instance-uuid', + project_id='fake-project-uuid', + user_id='fake-user-uuid', 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) + instance_id='fake-instance-uuid', + project_id='fake-project-uuid', + user_id='fake-user-uuid') vol_usage = db.vol_usage_update(ctxt, 1, rd_req=400, rd_bytes=500, wr_req=600, wr_bytes=700, - instance_id=1, + instance_id='fake-instance-uuid', + project_id='fake-project-uuid', + user_id='fake-user-uuid', update_totals=True) vol_usages = db.vol_get_usage_by_time(ctxt, start_time) diff --git a/nova/tests/test_migrations.py b/nova/tests/test_migrations.py index 749494ea..edd882d6 100644 --- a/nova/tests/test_migrations.py +++ b/nova/tests/test_migrations.py @@ -1229,6 +1229,46 @@ class TestNovaMigrations(BaseMigrationTestCase, CommonTestsMixIn): it_projects.insert().execute, dict(instance_type=31, project_id='pr1', deleted=0)) + # migration 175, Modify volume_usage-cache, Drop column instance_id, add + # columns instance_uuid, project_id and user_id + def _pre_upgrade_175(self, engine): + volume_usage_cache = get_table(engine, 'volume_usage_cache') + fake_usage = {'volume_id': 'fake_volume_id', + 'instance_id': 10, + 'tot_last_refreshed': datetime.datetime.now(), + 'tot_reads': 2, + 'tot_read_bytes': 3, + 'tot_writes': 4, + 'tot_write_bytes': 5, + 'curr_last_refreshed': datetime.datetime.now(), + 'curr_reads': 6, + 'curr_read_bytes': 7, + 'curr_writes': 8, + 'curr_write_bytes': 9} + volume_usage_cache.insert().execute(fake_usage) + + def _check_175(self, engine, data): + volume_usage_cache = get_table(engine, 'volume_usage_cache') + # Get the record + rows = volume_usage_cache.select().execute().fetchall() + self.assertEqual(len(rows), 1) + + self.assertEqual(rows[0]['instance_uuid'], None) + self.assertEqual(rows[0]['project_id'], None) + self.assertEqual(rows[0]['user_id'], None) + self.assertFalse('instance_id' in rows[0]) + + def _post_downgrade_175(self, engine): + volume_usage_cache = get_table(engine, 'volume_usage_cache') + # Get the record + rows = volume_usage_cache.select().execute().fetchall() + self.assertEqual(len(rows), 1) + + self.assertFalse('instance_uuid' in rows[0]) + self.assertFalse('project_id' in rows[0]) + self.assertFalse('user_id' in rows[0]) + self.assertEqual(rows[0]['instance_id'], None) + class TestBaremetalMigrations(BaseMigrationTestCase, CommonTestsMixIn): """Test sqlalchemy-migrate migrations."""