From be992f7b9a1b02a238b3a0c15c3de67e8aedd4ba Mon Sep 17 00:00:00 2001 From: Chris Behrens Date: Wed, 16 Jan 2013 18:49:45 +0000 Subject: Cells: Add cells support to instance_usage_audit_log api extension Adds task_log_get_all() call to HostAPI() so that we can use the local DB when cells is disabled or proxy via cells if cells is enabled. Adds task_log_get_all() call to cells. Change-Id: I9e78c17fcf70f98903d0a26c1de3e2581b8977ad --- .../contrib/test_instance_usage_audit_log.py | 16 ++--- nova/tests/cells/test_cells_manager.py | 73 +++++++++++++++++++--- nova/tests/cells/test_cells_messaging.py | 55 ++++++++++++++++ nova/tests/cells/test_cells_rpcapi.py | 18 ++++++ nova/tests/compute/test_host_api.py | 25 ++++++++ 5 files changed, 172 insertions(+), 15 deletions(-) (limited to 'nova/tests') diff --git a/nova/tests/api/openstack/compute/contrib/test_instance_usage_audit_log.py b/nova/tests/api/openstack/compute/contrib/test_instance_usage_audit_log.py index 4ada22a17..920fd86d5 100644 --- a/nova/tests/api/openstack/compute/contrib/test_instance_usage_audit_log.py +++ b/nova/tests/api/openstack/compute/contrib/test_instance_usage_audit_log.py @@ -80,11 +80,8 @@ TEST_LOGS3 = [ ] -def fake_service_get_all(context): - return TEST_COMPUTE_SERVICES - - -def fake_task_log_get_all(context, task_name, begin, end): +def fake_task_log_get_all(context, task_name, begin, end, + host=None, state=None): assert task_name == "instance_usage_audit" if begin == begin1 and end == end1: @@ -114,13 +111,18 @@ class InstanceUsageAuditLogTest(test.TestCase): self.context = context.get_admin_context() timeutils.set_time_override(datetime.datetime(2012, 7, 5, 10, 0, 0)) self.controller = ial.InstanceUsageAuditLogController() + self.host_api = self.controller.host_api + + def fake_service_get_all(context, disabled): + self.assertTrue(disabled is None) + return TEST_COMPUTE_SERVICES self.stubs.Set(utils, 'last_completed_audit_period', fake_last_completed_audit_period) self.stubs.Set(db, 'service_get_all', - fake_service_get_all) + fake_service_get_all) self.stubs.Set(db, 'task_log_get_all', - fake_task_log_get_all) + fake_task_log_get_all) def tearDown(self): super(InstanceUsageAuditLogTest, self).tearDown() diff --git a/nova/tests/cells/test_cells_manager.py b/nova/tests/cells/test_cells_manager.py index d3d412af7..df670b91f 100644 --- a/nova/tests/cells/test_cells_manager.py +++ b/nova/tests/cells/test_cells_manager.py @@ -37,6 +37,8 @@ FAKE_SERVICES = [dict(id=1, host='host1', dict(id=2, host='host2', compute_node=[FAKE_COMPUTE_NODES[1]]), dict(id=3, host='host3', compute_node=[])] +FAKE_TASK_LOGS = [dict(id=1, host='host1'), + dict(id=2, host='host2')] class CellsManagerClassTestCase(test.TestCase): @@ -52,14 +54,6 @@ class CellsManagerClassTestCase(test.TestCase): self.driver = self.cells_manager.driver self.ctxt = 'fake_context' - def _get_fake_responses(self): - responses = [] - expected_responses = [] - for x in xrange(1, 4): - responses.append(messaging.Response('cell%s' % x, x, False)) - expected_responses.append(('cell%s' % x, x)) - return expected_responses, responses - def _get_fake_response(self, raw_response=None, exc=False): if exc: return messaging.Response('fake', test.TestingException(), @@ -313,3 +307,66 @@ class CellsManagerClassTestCase(test.TestCase): topic=topic, rpc_message='fake-rpc-msg', call=True, timeout=-1) self.assertEqual('fake-response', response) + + def _build_task_log_responses(self, num): + responses = [] + expected_response = [] + # 3 cells... so 3 responses. Each response is a list of task log + # entries. Manager should turn these into a single list of + # task log entries. + for i in xrange(num): + cell_name = 'path!to!cell%i' % i + task_logs = [] + for task_log in FAKE_TASK_LOGS: + task_logs.append(copy.deepcopy(task_log)) + expected_task_log = copy.deepcopy(task_log) + cells_utils.add_cell_to_task_log(expected_task_log, + cell_name) + expected_response.append(expected_task_log) + response = messaging.Response(cell_name, task_logs, False) + responses.append(response) + return expected_response, responses + + def test_task_log_get_all(self): + expected_response, responses = self._build_task_log_responses(3) + self.mox.StubOutWithMock(self.msg_runner, + 'task_log_get_all') + self.msg_runner.task_log_get_all(self.ctxt, None, + 'fake-name', 'fake-begin', + 'fake-end', host=None, state=None).AndReturn(responses) + self.mox.ReplayAll() + response = self.cells_manager.task_log_get_all(self.ctxt, + task_name='fake-name', + period_beginning='fake-begin', period_ending='fake-end') + self.assertEqual(expected_response, response) + + def test_task_log_get_all_with_filters(self): + expected_response, responses = self._build_task_log_responses(1) + cell_and_host = cells_utils.cell_with_item('fake-cell', 'fake-host') + self.mox.StubOutWithMock(self.msg_runner, + 'task_log_get_all') + self.msg_runner.task_log_get_all(self.ctxt, 'fake-cell', + 'fake-name', 'fake-begin', 'fake-end', host='fake-host', + state='fake-state').AndReturn(responses) + self.mox.ReplayAll() + response = self.cells_manager.task_log_get_all(self.ctxt, + task_name='fake-name', + period_beginning='fake-begin', period_ending='fake-end', + host=cell_and_host, state='fake-state') + self.assertEqual(expected_response, response) + + def test_task_log_get_all_with_cell_but_no_host_filters(self): + expected_response, responses = self._build_task_log_responses(1) + # Host filter only has cell name. + cell_and_host = 'fake-cell' + self.mox.StubOutWithMock(self.msg_runner, + 'task_log_get_all') + self.msg_runner.task_log_get_all(self.ctxt, 'fake-cell', + 'fake-name', 'fake-begin', 'fake-end', host=None, + state='fake-state').AndReturn(responses) + self.mox.ReplayAll() + response = self.cells_manager.task_log_get_all(self.ctxt, + task_name='fake-name', + period_beginning='fake-begin', period_ending='fake-end', + host=cell_and_host, state='fake-state') + self.assertEqual(expected_response, response) diff --git a/nova/tests/cells/test_cells_messaging.py b/nova/tests/cells/test_cells_messaging.py index f6c51325a..b505ea4f6 100644 --- a/nova/tests/cells/test_cells_messaging.py +++ b/nova/tests/cells/test_cells_messaging.py @@ -789,6 +789,28 @@ class CellsTargetedMethodsTestCase(test.TestCase): fake_topic, fake_rpc_message, False, timeout=None) + def test_task_log_get_all_targetted(self): + task_name = 'fake_task_name' + begin = 'fake_begin' + end = 'fake_end' + host = 'fake_host' + state = 'fake_state' + + self.mox.StubOutWithMock(self.tgt_db_inst, 'task_log_get_all') + self.tgt_db_inst.task_log_get_all(self.ctxt, task_name, + begin, end, host=host, + state=state).AndReturn(['fake_result']) + + self.mox.ReplayAll() + + response = self.src_msg_runner.task_log_get_all(self.ctxt, + self.tgt_cell_name, task_name, begin, end, host=host, + state=state) + self.assertTrue(isinstance(response, list)) + self.assertEqual(1, len(response)) + result = response[0].value_or_raise() + self.assertEqual(['fake_result'], result) + class CellsBroadcastMethodsTestCase(test.TestCase): """Test case for _BroadcastMessageMethods class. Most of these @@ -1085,3 +1107,36 @@ class CellsBroadcastMethodsTestCase(test.TestCase): ('api-cell!child-cell2', [3]), ('api-cell', [1, 2])] self.assertEqual(expected, response_values) + + def test_task_log_get_all_broadcast(self): + # Reset this, as this is a broadcast down. + self._setup_attrs(up=False) + task_name = 'fake_task_name' + begin = 'fake_begin' + end = 'fake_end' + host = 'fake_host' + state = 'fake_state' + + ctxt = self.ctxt.elevated() + + self.mox.StubOutWithMock(self.src_db_inst, 'task_log_get_all') + self.mox.StubOutWithMock(self.mid_db_inst, 'task_log_get_all') + self.mox.StubOutWithMock(self.tgt_db_inst, 'task_log_get_all') + + self.src_db_inst.task_log_get_all(ctxt, task_name, + begin, end, host=host, state=state).AndReturn([1, 2]) + self.mid_db_inst.task_log_get_all(ctxt, task_name, + begin, end, host=host, state=state).AndReturn([3]) + self.tgt_db_inst.task_log_get_all(ctxt, task_name, + begin, end, host=host, state=state).AndReturn([4, 5]) + + self.mox.ReplayAll() + + responses = self.src_msg_runner.task_log_get_all(ctxt, None, + task_name, begin, end, host=host, state=state) + response_values = [(resp.cell_name, resp.value_or_raise()) + for resp in responses] + expected = [('api-cell!child-cell2!grandchild-cell1', [4, 5]), + ('api-cell!child-cell2', [3]), + ('api-cell', [1, 2])] + self.assertEqual(expected, response_values) diff --git a/nova/tests/cells/test_cells_rpcapi.py b/nova/tests/cells/test_cells_rpcapi.py index 876bc5ce5..c1e9b5ca8 100644 --- a/nova/tests/cells/test_cells_rpcapi.py +++ b/nova/tests/cells/test_cells_rpcapi.py @@ -259,3 +259,21 @@ class CellsAPITestCase(test.TestCase): expected_args, version='1.2') self.assertEqual(result, 'fake_response') + + def test_task_log_get_all(self): + call_info = self._stub_rpc_method('call', 'fake_response') + result = self.cells_rpcapi.task_log_get_all(self.fake_context, + task_name='fake_name', + period_beginning='fake_begin', + period_ending='fake_end', + host='fake_host', + state='fake_state') + + expected_args = {'task_name': 'fake_name', + 'period_beginning': 'fake_begin', + 'period_ending': 'fake_end', + 'host': 'fake_host', + 'state': 'fake_state'} + self._check_result(call_info, 'task_log_get_all', expected_args, + version='1.3') + self.assertEqual(result, 'fake_response') diff --git a/nova/tests/compute/test_host_api.py b/nova/tests/compute/test_host_api.py index 151743715..772ae1eb1 100644 --- a/nova/tests/compute/test_host_api.py +++ b/nova/tests/compute/test_host_api.py @@ -197,6 +197,18 @@ class ComputeHostAPITestCase(test.TestCase): 'fake-host') self.assertEqual(['fake-responses'], result) + def test_task_log_get_all(self): + self.mox.StubOutWithMock(self.host_api.db, 'task_log_get_all') + + self.host_api.db.task_log_get_all(self.ctxt, + 'fake-name', 'fake-begin', 'fake-end', host='fake-host', + state='fake-state').AndReturn('fake-response') + self.mox.ReplayAll() + result = self.host_api.task_log_get_all(self.ctxt, 'fake-name', + 'fake-begin', 'fake-end', host='fake-host', + state='fake-state') + self.assertEqual('fake-response', result) + class ComputeHostAPICellsTestCase(ComputeHostAPITestCase): def setUp(self): @@ -296,3 +308,16 @@ class ComputeHostAPICellsTestCase(ComputeHostAPITestCase): result = self.host_api.instance_get_all_by_host(self.ctxt, cell_and_host) self.assertEqual(expected_result, result) + + def test_task_log_get_all(self): + self.mox.StubOutWithMock(self.host_api.cells_rpcapi, + 'task_log_get_all') + + self.host_api.cells_rpcapi.task_log_get_all(self.ctxt, + 'fake-name', 'fake-begin', 'fake-end', host='fake-host', + state='fake-state').AndReturn('fake-response') + self.mox.ReplayAll() + result = self.host_api.task_log_get_all(self.ctxt, 'fake-name', + 'fake-begin', 'fake-end', host='fake-host', + state='fake-state') + self.assertEqual('fake-response', result) -- cgit