From e1f8198af688b6d3746c6354a5d5d4b0e104830a Mon Sep 17 00:00:00 2001 From: Alexei Kornienko Date: Mon, 10 Jun 2013 15:47:50 +0300 Subject: Refactored tests for instance_actions_* Moved tests to separate test case blueprint db-api-tests Change-Id: Ia4fdfdd3da58dcf6a04f96de7df7672bfc1200c5 --- nova/tests/db/test_db_api.py | 958 ++++++++++++++++++++++--------------------- 1 file changed, 480 insertions(+), 478 deletions(-) diff --git a/nova/tests/db/test_db_api.py b/nova/tests/db/test_db_api.py index 4d01e8e0a..75df3400a 100644 --- a/nova/tests/db/test_db_api.py +++ b/nova/tests/db/test_db_api.py @@ -589,293 +589,6 @@ class DbApiTestCase(DbTestCase): # Ensure that metadata is updated during instance_update self._test_instance_update_updates_metadata('metadata') - def test_instance_action_start(self): - """Create an instance action.""" - ctxt = context.get_admin_context() - uuid = str(stdlib_uuid.uuid4()) - - start_time = timeutils.utcnow() - action_values = {'action': 'run_instance', - 'instance_uuid': uuid, - 'request_id': ctxt.request_id, - 'user_id': ctxt.user_id, - 'project_id': ctxt.project_id, - 'start_time': start_time} - db.action_start(ctxt, action_values) - - # Retrieve the action to ensure it was successfully added - actions = db.actions_get(ctxt, uuid) - self.assertEqual(1, len(actions)) - self.assertEqual('run_instance', actions[0]['action']) - self.assertEqual(start_time, actions[0]['start_time']) - self.assertEqual(ctxt.request_id, actions[0]['request_id']) - self.assertEqual(ctxt.user_id, actions[0]['user_id']) - self.assertEqual(ctxt.project_id, actions[0]['project_id']) - - def test_instance_action_finish(self): - """Create an instance action.""" - ctxt = context.get_admin_context() - uuid = str(stdlib_uuid.uuid4()) - - start_time = timeutils.utcnow() - action_start_values = {'action': 'run_instance', - 'instance_uuid': uuid, - 'request_id': ctxt.request_id, - 'user_id': ctxt.user_id, - 'project_id': ctxt.project_id, - 'start_time': start_time} - db.action_start(ctxt, action_start_values) - - finish_time = timeutils.utcnow() + datetime.timedelta(seconds=5) - action_finish_values = {'instance_uuid': uuid, - 'request_id': ctxt.request_id, - 'finish_time': finish_time} - db.action_finish(ctxt, action_finish_values) - - # Retrieve the action to ensure it was successfully added - actions = db.actions_get(ctxt, uuid) - self.assertEqual(1, len(actions)) - self.assertEqual('run_instance', actions[0]['action']) - self.assertEqual(start_time, actions[0]['start_time']) - self.assertEqual(finish_time, actions[0]['finish_time']) - self.assertEqual(ctxt.request_id, actions[0]['request_id']) - self.assertEqual(ctxt.user_id, actions[0]['user_id']) - self.assertEqual(ctxt.project_id, actions[0]['project_id']) - - def test_instance_actions_get_by_instance(self): - """Ensure we can get actions by UUID.""" - ctxt1 = context.get_admin_context() - ctxt2 = context.get_admin_context() - uuid1 = str(stdlib_uuid.uuid4()) - uuid2 = str(stdlib_uuid.uuid4()) - - action_values = {'action': 'run_instance', - 'instance_uuid': uuid1, - 'request_id': ctxt1.request_id, - 'user_id': ctxt1.user_id, - 'project_id': ctxt1.project_id, - 'start_time': timeutils.utcnow()} - db.action_start(ctxt1, action_values) - action_values['action'] = 'resize' - db.action_start(ctxt1, action_values) - - action_values = {'action': 'reboot', - 'instance_uuid': uuid2, - 'request_id': ctxt2.request_id, - 'user_id': ctxt2.user_id, - 'project_id': ctxt2.project_id, - 'start_time': timeutils.utcnow()} - db.action_start(ctxt2, action_values) - db.action_start(ctxt2, action_values) - - # Retrieve the action to ensure it was successfully added - actions = db.actions_get(ctxt1, uuid1) - self.assertEqual(2, len(actions)) - self.assertEqual('resize', actions[0]['action']) - self.assertEqual('run_instance', actions[1]['action']) - - def test_instance_action_get_by_instance_and_action(self): - """Ensure we can get an action by instance UUID and action id.""" - ctxt1 = context.get_admin_context() - ctxt2 = context.get_admin_context() - uuid1 = str(stdlib_uuid.uuid4()) - uuid2 = str(stdlib_uuid.uuid4()) - - action_values = {'action': 'run_instance', - 'instance_uuid': uuid1, - 'request_id': ctxt1.request_id, - 'user_id': ctxt1.user_id, - 'project_id': ctxt1.project_id, - 'start_time': timeutils.utcnow()} - db.action_start(ctxt1, action_values) - action_values['action'] = 'resize' - db.action_start(ctxt1, action_values) - - action_values = {'action': 'reboot', - 'instance_uuid': uuid2, - 'request_id': ctxt2.request_id, - 'user_id': ctxt2.user_id, - 'project_id': ctxt2.project_id, - 'start_time': timeutils.utcnow()} - db.action_start(ctxt2, action_values) - db.action_start(ctxt2, action_values) - - actions = db.actions_get(ctxt1, uuid1) - request_id = actions[0]['request_id'] - action = db.action_get_by_request_id(ctxt1, uuid1, request_id) - self.assertEqual('run_instance', action['action']) - self.assertEqual(ctxt1.request_id, action['request_id']) - - def test_instance_action_event_start(self): - """Create an instance action event.""" - ctxt = context.get_admin_context() - uuid = str(stdlib_uuid.uuid4()) - - start_time = timeutils.utcnow() - action_values = {'action': 'run_instance', - 'instance_uuid': uuid, - 'request_id': ctxt.request_id, - 'user_id': ctxt.user_id, - 'project_id': ctxt.project_id, - 'start_time': start_time} - action = db.action_start(ctxt, action_values) - - event_values = {'event': 'schedule', - 'instance_uuid': uuid, - 'request_id': ctxt.request_id, - 'start_time': start_time} - db.action_event_start(ctxt, event_values) - - # Retrieve the event to ensure it was successfully added - events = db.action_events_get(ctxt, action['id']) - self.assertEqual(1, len(events)) - self.assertEqual('schedule', events[0]['event']) - self.assertEqual(start_time, events[0]['start_time']) - - def test_instance_action_event_finish_success(self): - """Finish an instance action event.""" - ctxt = context.get_admin_context() - uuid = str(stdlib_uuid.uuid4()) - - start_time = timeutils.utcnow() - action_values = {'action': 'run_instance', - 'instance_uuid': uuid, - 'request_id': ctxt.request_id, - 'user_id': ctxt.user_id, - 'project_id': ctxt.project_id, - 'start_time': start_time} - action = db.action_start(ctxt, action_values) - - event_values = {'event': 'schedule', - 'request_id': ctxt.request_id, - 'instance_uuid': uuid, - 'start_time': start_time} - db.action_event_start(ctxt, event_values) - - finish_time = timeutils.utcnow() + datetime.timedelta(seconds=5) - event_finish_values = {'event': 'schedule', - 'request_id': ctxt.request_id, - 'instance_uuid': uuid, - 'finish_time': finish_time, - 'result': 'Success'} - db.action_event_finish(ctxt, event_finish_values) - - # Retrieve the event to ensure it was successfully added - events = db.action_events_get(ctxt, action['id']) - action = db.action_get_by_request_id(ctxt, uuid, ctxt.request_id) - self.assertEqual(1, len(events)) - self.assertEqual('schedule', events[0]['event']) - self.assertEqual(start_time, events[0]['start_time']) - self.assertEqual(finish_time, events[0]['finish_time']) - self.assertNotEqual(action['message'], 'Error') - - def test_instance_action_event_finish_error(self): - """Finish an instance action event with an error.""" - ctxt = context.get_admin_context() - uuid = str(stdlib_uuid.uuid4()) - - start_time = timeutils.utcnow() - action_values = {'action': 'run_instance', - 'instance_uuid': uuid, - 'request_id': ctxt.request_id, - 'user_id': ctxt.user_id, - 'project_id': ctxt.project_id, - 'start_time': start_time} - action = db.action_start(ctxt, action_values) - - event_values = {'event': 'schedule', - 'request_id': ctxt.request_id, - 'instance_uuid': uuid, - 'start_time': start_time} - db.action_event_start(ctxt, event_values) - - finish_time = timeutils.utcnow() + datetime.timedelta(seconds=5) - event_finish_values = {'event': 'schedule', - 'request_id': ctxt.request_id, - 'instance_uuid': uuid, - 'finish_time': finish_time, - 'result': 'Error'} - db.action_event_finish(ctxt, event_finish_values) - - # Retrieve the event to ensure it was successfully added - events = db.action_events_get(ctxt, action['id']) - action = db.action_get_by_request_id(ctxt, uuid, ctxt.request_id) - self.assertEqual(1, len(events)) - self.assertEqual('schedule', events[0]['event']) - self.assertEqual(start_time, events[0]['start_time']) - self.assertEqual(finish_time, events[0]['finish_time']) - self.assertEqual(action['message'], 'Error') - - def test_instance_action_and_event_start_string_time(self): - """Create an instance action and event with a string start_time.""" - ctxt = context.get_admin_context() - uuid = str(stdlib_uuid.uuid4()) - - start_time = timeutils.utcnow() - start_time_str = timeutils.strtime(start_time) - action_values = {'action': 'run_instance', - 'instance_uuid': uuid, - 'request_id': ctxt.request_id, - 'user_id': ctxt.user_id, - 'project_id': ctxt.project_id, - 'start_time': start_time_str} - action = db.action_start(ctxt, action_values) - - event_values = {'event': 'schedule', - 'instance_uuid': uuid, - 'request_id': ctxt.request_id, - 'start_time': start_time_str} - db.action_event_start(ctxt, event_values) - - # Retrieve the event to ensure it was successfully added - events = db.action_events_get(ctxt, action['id']) - self.assertEqual(1, len(events)) - self.assertEqual('schedule', events[0]['event']) - # db api still returns models with datetime, not str, values - self.assertEqual(start_time, events[0]['start_time']) - - def test_instance_action_event_get_by_id(self): - """Get a specific instance action event.""" - ctxt1 = context.get_admin_context() - ctxt2 = context.get_admin_context() - uuid1 = str(stdlib_uuid.uuid4()) - uuid2 = str(stdlib_uuid.uuid4()) - - action_values = {'action': 'run_instance', - 'instance_uuid': uuid1, - 'request_id': ctxt1.request_id, - 'user_id': ctxt1.user_id, - 'project_id': ctxt1.project_id, - 'start_time': timeutils.utcnow()} - added_action = db.action_start(ctxt1, action_values) - - action_values = {'action': 'reboot', - 'instance_uuid': uuid2, - 'request_id': ctxt2.request_id, - 'user_id': ctxt2.user_id, - 'project_id': ctxt2.project_id, - 'start_time': timeutils.utcnow()} - db.action_start(ctxt2, action_values) - - start_time = timeutils.utcnow() - event_values = {'event': 'schedule', - 'instance_uuid': uuid1, - 'request_id': ctxt1.request_id, - 'start_time': start_time} - added_event = db.action_event_start(ctxt1, event_values) - - event_values = {'event': 'reboot', - 'instance_uuid': uuid2, - 'request_id': ctxt2.request_id, - 'start_time': timeutils.utcnow()} - db.action_event_start(ctxt2, event_values) - - # Retrieve the event to ensure it was successfully added - event = db.action_event_get_by_id(ctxt1, added_action['id'], - added_event['id']) - self.assertEqual('schedule', event['event']) - self.assertEqual(start_time, event['start_time']) - def test_add_key_pair(self, name=None): """Check if keypair creation work as expected.""" keypair = { @@ -1859,247 +1572,536 @@ class SecurityGroupTestCase(test.TestCase, ModelsObjectComparatorMixin): self.assertEqual((True, False), real) - def test_security_group_count_by_project(self): + def test_security_group_count_by_project(self): + values = [ + {'name': 'fake1', 'project_id': 'fake_proj1'}, + {'name': 'fake2', 'project_id': 'fake_proj1'}, + {'name': 'fake3', 'project_id': 'fake_proj2'}, + ] + security_groups = [self._create_security_group(vals) + for vals in values] + + real = [] + for project in ('fake_proj1', 'fake_proj2'): + real.append(db.security_group_count_by_project(self.ctxt, project)) + expected = [2, 1] + + self.assertEquals(expected, real) + + def test_security_group_in_use(self): + instance = db.instance_create(self.ctxt, dict(host='foo')) + values = [ + {'instances': [instance]}, + {'instances': []}, + ] + + security_groups = [self._create_security_group(vals) + for vals in values] + + real = [] + for security_group in security_groups: + in_use = db.security_group_in_use(self.ctxt, + security_group['id']) + real.append(in_use) + expected = [True, False] + + self.assertEquals(expected, real) + + def test_security_group_ensure_default(self): + self.assertFalse(db.security_group_exists(self.ctxt, + self.ctxt.project_id, + 'default')) + + default_group = db.security_group_ensure_default(self.ctxt) + + self.assertTrue(db.security_group_exists(self.ctxt, + self.ctxt.project_id, + 'default')) + + +class ServiceTestCase(test.TestCase, ModelsObjectComparatorMixin): + def setUp(self): + super(ServiceTestCase, self).setUp() + self.ctxt = context.get_admin_context() + + def _get_base_values(self): + return { + 'host': 'fake_host', + 'binary': 'fake_binary', + 'topic': 'fake_topic', + 'report_count': 3, + 'disabled': False + } + + def _create_service(self, values): + v = self._get_base_values() + v.update(values) + return db.service_create(self.ctxt, v) + + def test_service_create(self): + service = self._create_service({}) + self.assertFalse(service['id'] is None) + for key, value in self._get_base_values().iteritems(): + self.assertEqual(value, service[key]) + + def test_service_destroy(self): + service1 = self._create_service({}) + service2 = self._create_service({'host': 'fake_host2'}) + + db.service_destroy(self.ctxt, service1['id']) + self.assertRaises(exception.ServiceNotFound, + db.service_get, self.ctxt, service1['id']) + self._assertEqualObjects(db.service_get(self.ctxt, service2['id']), + service2, ignored_keys=['compute_node']) + + def test_service_update(self): + service = self._create_service({}) + new_values = { + 'host': 'fake_host1', + 'binary': 'fake_binary1', + 'topic': 'fake_topic1', + 'report_count': 4, + 'disabled': True + } + db.service_update(self.ctxt, service['id'], new_values) + updated_service = db.service_get(self.ctxt, service['id']) + for key, value in new_values.iteritems(): + self.assertEqual(value, updated_service[key]) + + def test_service_update_not_found_exception(self): + self.assertRaises(exception.ServiceNotFound, + db.service_update, self.ctxt, 100500, {}) + + def test_service_get(self): + service1 = self._create_service({}) + service2 = self._create_service({'host': 'some_other_fake_host'}) + real_service1 = db.service_get(self.ctxt, service1['id']) + self._assertEqualObjects(service1, real_service1, + ignored_keys=['compute_node']) + + def test_service_get_with_compute_node(self): + service = self._create_service({}) + compute_values = dict(vcpus=2, memory_mb=1024, local_gb=2048, + vcpus_used=0, memory_mb_used=0, + local_gb_used=0, free_ram_mb=1024, + free_disk_gb=2048, hypervisor_type="xen", + hypervisor_version=1, cpu_info="", + running_vms=0, current_workload=0, + service_id=service['id']) + compute = db.compute_node_create(self.ctxt, compute_values) + real_service = db.service_get(self.ctxt, service['id']) + real_compute = real_service['compute_node'][0] + self.assertEqual(compute['id'], real_compute['id']) + + def test_service_get_not_found_exception(self): + self.assertRaises(exception.ServiceNotFound, + db.service_get, self.ctxt, 100500) + + def test_service_get_by_host_and_topic(self): + service1 = self._create_service({'host': 'host1', 'topic': 'topic1'}) + service2 = self._create_service({'host': 'host2', 'topic': 'topic2'}) + + real_service1 = db.service_get_by_host_and_topic(self.ctxt, + host='host1', + topic='topic1') + self._assertEqualObjects(service1, real_service1) + + def test_service_get_all(self): + values = [ + {'host': 'host1', 'topic': 'topic1'}, + {'host': 'host2', 'topic': 'topic2'}, + {'disabled': True} + ] + services = [self._create_service(vals) for vals in values] + disabled_services = [services[-1]] + non_disabled_services = services[:-1] + + compares = [ + (services, db.service_get_all(self.ctxt)), + (disabled_services, db.service_get_all(self.ctxt, True)), + (non_disabled_services, db.service_get_all(self.ctxt, False)) + ] + for comp in compares: + self._assertEqualListsOfObjects(*comp) + + def test_service_get_all_by_topic(self): + values = [ + {'host': 'host1', 'topic': 't1'}, + {'host': 'host2', 'topic': 't1'}, + {'disabled': True, 'topic': 't1'}, + {'host': 'host3', 'topic': 't2'} + ] + services = [self._create_service(vals) for vals in values] + expected = services[:2] + real = db.service_get_all_by_topic(self.ctxt, 't1') + self._assertEqualListsOfObjects(expected, real) + + def test_service_get_all_by_host(self): values = [ - {'name': 'fake1', 'project_id': 'fake_proj1'}, - {'name': 'fake2', 'project_id': 'fake_proj1'}, - {'name': 'fake3', 'project_id': 'fake_proj2'}, + {'host': 'host1', 'topic': 't1'}, + {'host': 'host1', 'topic': 't1'}, + {'host': 'host2', 'topic': 't1'}, + {'host': 'host3', 'topic': 't2'} ] - security_groups = [self._create_security_group(vals) - for vals in values] - - real = [] - for project in ('fake_proj1', 'fake_proj2'): - real.append(db.security_group_count_by_project(self.ctxt, project)) - expected = [2, 1] + services = [self._create_service(vals) for vals in values] - self.assertEquals(expected, real) + expected = services[:2] + real = db.service_get_all_by_host(self.ctxt, 'host1') + self._assertEqualListsOfObjects(expected, real) - def test_security_group_in_use(self): - instance = db.instance_create(self.ctxt, dict(host='foo')) + def test_service_get_by_compute_host(self): values = [ - {'instances': [instance]}, - {'instances': []}, + {'host': 'host1', 'topic': CONF.compute_topic}, + {'host': 'host2', 'topic': 't1'}, + {'host': 'host3', 'topic': CONF.compute_topic} ] + services = [self._create_service(vals) for vals in values] - security_groups = [self._create_security_group(vals) - for vals in values] + real_service = db.service_get_by_compute_host(self.ctxt, 'host1') + self._assertEqualObjects(services[0], real_service, + ignored_keys=['compute_node']) - real = [] - for security_group in security_groups: - in_use = db.security_group_in_use(self.ctxt, - security_group['id']) - real.append(in_use) - expected = [True, False] + self.assertRaises(exception.ComputeHostNotFound, + db.service_get_by_compute_host, + self.ctxt, 'non-exists-host') - self.assertEquals(expected, real) + def test_service_get_by_compute_host_not_found(self): + self.assertRaises(exception.ComputeHostNotFound, + db.service_get_by_compute_host, + self.ctxt, 'non-exists-host') - def test_security_group_ensure_default(self): - self.assertFalse(db.security_group_exists(self.ctxt, - self.ctxt.project_id, - 'default')) + def test_service_get_by_args(self): + values = [ + {'host': 'host1', 'binary': 'a'}, + {'host': 'host2', 'binary': 'b'} + ] + services = [self._create_service(vals) for vals in values] - default_group = db.security_group_ensure_default(self.ctxt) + service1 = db.service_get_by_args(self.ctxt, 'host1', 'a') + self._assertEqualObjects(services[0], service1) - self.assertTrue(db.security_group_exists(self.ctxt, - self.ctxt.project_id, - 'default')) + service2 = db.service_get_by_args(self.ctxt, 'host2', 'b') + self._assertEqualObjects(services[1], service2) + + def test_service_get_by_args_not_found_exception(self): + self.assertRaises(exception.HostBinaryNotFound, + db.service_get_by_args, + self.ctxt, 'non-exists-host', 'a') -class ServiceTestCase(test.TestCase, ModelsObjectComparatorMixin): +class BaseInstanceTypeTestCase(test.TestCase, ModelsObjectComparatorMixin): def setUp(self): - super(ServiceTestCase, self).setUp() + super(BaseInstanceTypeTestCase, self).setUp() self.ctxt = context.get_admin_context() def _get_base_values(self): return { - 'host': 'fake_host', - 'binary': 'fake_binary', - 'topic': 'fake_topic', - 'report_count': 3, - 'disabled': False + 'name': 'fake_name', + 'memory_mb': 512, + 'vcpus': 1, + 'root_gb': 10, + 'ephemeral_gb': 10, + 'flavorid': 'fake_flavor', + 'swap': 0, + 'rxtx_factor': 0.5, + 'vcpu_weight': 1, + 'disabled': False, + 'is_public': True } - def _create_service(self, values): + def _create_inst_type(self, values): v = self._get_base_values() v.update(values) - return db.service_create(self.ctxt, v) + return db.instance_type_create(self.ctxt, v) - def test_service_create(self): - service = self._create_service({}) - self.assertFalse(service['id'] is None) - for key, value in self._get_base_values().iteritems(): - self.assertEqual(value, service[key]) - def test_service_destroy(self): - service1 = self._create_service({}) - service2 = self._create_service({'host': 'fake_host2'}) +class InstanceActionTestCase(test.TestCase, ModelsObjectComparatorMixin): + def test_instance_action_start(self): + """Create an instance action.""" + ctxt = context.get_admin_context() + uuid = str(stdlib_uuid.uuid4()) - db.service_destroy(self.ctxt, service1['id']) - self.assertRaises(exception.ServiceNotFound, - db.service_get, self.ctxt, service1['id']) - self._assertEqualObjects(db.service_get(self.ctxt, service2['id']), - service2, ignored_keys=['compute_node']) + start_time = timeutils.utcnow() + action_values = {'action': 'run_instance', + 'instance_uuid': uuid, + 'request_id': ctxt.request_id, + 'user_id': ctxt.user_id, + 'project_id': ctxt.project_id, + 'start_time': start_time} + db.action_start(ctxt, action_values) - def test_service_update(self): - service = self._create_service({}) - new_values = { - 'host': 'fake_host1', - 'binary': 'fake_binary1', - 'topic': 'fake_topic1', - 'report_count': 4, - 'disabled': True - } - db.service_update(self.ctxt, service['id'], new_values) - updated_service = db.service_get(self.ctxt, service['id']) - for key, value in new_values.iteritems(): - self.assertEqual(value, updated_service[key]) + # Retrieve the action to ensure it was successfully added + actions = db.actions_get(ctxt, uuid) + self.assertEqual(1, len(actions)) + self.assertEqual('run_instance', actions[0]['action']) + self.assertEqual(start_time, actions[0]['start_time']) + self.assertEqual(ctxt.request_id, actions[0]['request_id']) + self.assertEqual(ctxt.user_id, actions[0]['user_id']) + self.assertEqual(ctxt.project_id, actions[0]['project_id']) - def test_service_update_not_found_exception(self): - self.assertRaises(exception.ServiceNotFound, - db.service_update, self.ctxt, 100500, {}) + def test_instance_action_finish(self): + """Create an instance action.""" + ctxt = context.get_admin_context() + uuid = str(stdlib_uuid.uuid4()) + + start_time = timeutils.utcnow() + action_start_values = {'action': 'run_instance', + 'instance_uuid': uuid, + 'request_id': ctxt.request_id, + 'user_id': ctxt.user_id, + 'project_id': ctxt.project_id, + 'start_time': start_time} + db.action_start(ctxt, action_start_values) + + finish_time = timeutils.utcnow() + datetime.timedelta(seconds=5) + action_finish_values = {'instance_uuid': uuid, + 'request_id': ctxt.request_id, + 'finish_time': finish_time} + db.action_finish(ctxt, action_finish_values) + + # Retrieve the action to ensure it was successfully added + actions = db.actions_get(ctxt, uuid) + self.assertEqual(1, len(actions)) + self.assertEqual('run_instance', actions[0]['action']) + self.assertEqual(start_time, actions[0]['start_time']) + self.assertEqual(finish_time, actions[0]['finish_time']) + self.assertEqual(ctxt.request_id, actions[0]['request_id']) + self.assertEqual(ctxt.user_id, actions[0]['user_id']) + self.assertEqual(ctxt.project_id, actions[0]['project_id']) + + def test_instance_actions_get_by_instance(self): + """Ensure we can get actions by UUID.""" + ctxt1 = context.get_admin_context() + ctxt2 = context.get_admin_context() + uuid1 = str(stdlib_uuid.uuid4()) + uuid2 = str(stdlib_uuid.uuid4()) + + action_values = {'action': 'run_instance', + 'instance_uuid': uuid1, + 'request_id': ctxt1.request_id, + 'user_id': ctxt1.user_id, + 'project_id': ctxt1.project_id, + 'start_time': timeutils.utcnow()} + db.action_start(ctxt1, action_values) + action_values['action'] = 'resize' + db.action_start(ctxt1, action_values) + + action_values = {'action': 'reboot', + 'instance_uuid': uuid2, + 'request_id': ctxt2.request_id, + 'user_id': ctxt2.user_id, + 'project_id': ctxt2.project_id, + 'start_time': timeutils.utcnow()} + db.action_start(ctxt2, action_values) + db.action_start(ctxt2, action_values) + + # Retrieve the action to ensure it was successfully added + actions = db.actions_get(ctxt1, uuid1) + self.assertEqual(2, len(actions)) + self.assertEqual('resize', actions[0]['action']) + self.assertEqual('run_instance', actions[1]['action']) + + def test_instance_action_get_by_instance_and_action(self): + """Ensure we can get an action by instance UUID and action id.""" + ctxt1 = context.get_admin_context() + ctxt2 = context.get_admin_context() + uuid1 = str(stdlib_uuid.uuid4()) + uuid2 = str(stdlib_uuid.uuid4()) + + action_values = {'action': 'run_instance', + 'instance_uuid': uuid1, + 'request_id': ctxt1.request_id, + 'user_id': ctxt1.user_id, + 'project_id': ctxt1.project_id, + 'start_time': timeutils.utcnow()} + db.action_start(ctxt1, action_values) + action_values['action'] = 'resize' + db.action_start(ctxt1, action_values) + + action_values = {'action': 'reboot', + 'instance_uuid': uuid2, + 'request_id': ctxt2.request_id, + 'user_id': ctxt2.user_id, + 'project_id': ctxt2.project_id, + 'start_time': timeutils.utcnow()} + db.action_start(ctxt2, action_values) + db.action_start(ctxt2, action_values) + + actions = db.actions_get(ctxt1, uuid1) + request_id = actions[0]['request_id'] + action = db.action_get_by_request_id(ctxt1, uuid1, request_id) + self.assertEqual('run_instance', action['action']) + self.assertEqual(ctxt1.request_id, action['request_id']) + + def test_instance_action_event_start(self): + """Create an instance action event.""" + ctxt = context.get_admin_context() + uuid = str(stdlib_uuid.uuid4()) + + start_time = timeutils.utcnow() + action_values = {'action': 'run_instance', + 'instance_uuid': uuid, + 'request_id': ctxt.request_id, + 'user_id': ctxt.user_id, + 'project_id': ctxt.project_id, + 'start_time': start_time} + action = db.action_start(ctxt, action_values) - def test_service_get(self): - service1 = self._create_service({}) - service2 = self._create_service({'host': 'some_other_fake_host'}) - real_service1 = db.service_get(self.ctxt, service1['id']) - self._assertEqualObjects(service1, real_service1, - ignored_keys=['compute_node']) + event_values = {'event': 'schedule', + 'instance_uuid': uuid, + 'request_id': ctxt.request_id, + 'start_time': start_time} + db.action_event_start(ctxt, event_values) - def test_service_get_with_compute_node(self): - service = self._create_service({}) - compute_values = dict(vcpus=2, memory_mb=1024, local_gb=2048, - vcpus_used=0, memory_mb_used=0, - local_gb_used=0, free_ram_mb=1024, - free_disk_gb=2048, hypervisor_type="xen", - hypervisor_version=1, cpu_info="", - running_vms=0, current_workload=0, - service_id=service['id']) - compute = db.compute_node_create(self.ctxt, compute_values) - real_service = db.service_get(self.ctxt, service['id']) - real_compute = real_service['compute_node'][0] - self.assertEqual(compute['id'], real_compute['id']) + # Retrieve the event to ensure it was successfully added + events = db.action_events_get(ctxt, action['id']) + self.assertEqual(1, len(events)) + self.assertEqual('schedule', events[0]['event']) + self.assertEqual(start_time, events[0]['start_time']) - def test_service_get_not_found_exception(self): - self.assertRaises(exception.ServiceNotFound, - db.service_get, self.ctxt, 100500) + def test_instance_action_event_finish_success(self): + """Finish an instance action event.""" + ctxt = context.get_admin_context() + uuid = str(stdlib_uuid.uuid4()) - def test_service_get_by_host_and_topic(self): - service1 = self._create_service({'host': 'host1', 'topic': 'topic1'}) - service2 = self._create_service({'host': 'host2', 'topic': 'topic2'}) + start_time = timeutils.utcnow() + action_values = {'action': 'run_instance', + 'instance_uuid': uuid, + 'request_id': ctxt.request_id, + 'user_id': ctxt.user_id, + 'project_id': ctxt.project_id, + 'start_time': start_time} + action = db.action_start(ctxt, action_values) - real_service1 = db.service_get_by_host_and_topic(self.ctxt, - host='host1', - topic='topic1') - self._assertEqualObjects(service1, real_service1) + event_values = {'event': 'schedule', + 'request_id': ctxt.request_id, + 'instance_uuid': uuid, + 'start_time': start_time} + db.action_event_start(ctxt, event_values) - def test_service_get_all(self): - values = [ - {'host': 'host1', 'topic': 'topic1'}, - {'host': 'host2', 'topic': 'topic2'}, - {'disabled': True} - ] - services = [self._create_service(vals) for vals in values] - disabled_services = [services[-1]] - non_disabled_services = services[:-1] + finish_time = timeutils.utcnow() + datetime.timedelta(seconds=5) + event_finish_values = {'event': 'schedule', + 'request_id': ctxt.request_id, + 'instance_uuid': uuid, + 'finish_time': finish_time, + 'result': 'Success'} + db.action_event_finish(ctxt, event_finish_values) - compares = [ - (services, db.service_get_all(self.ctxt)), - (disabled_services, db.service_get_all(self.ctxt, True)), - (non_disabled_services, db.service_get_all(self.ctxt, False)) - ] - for comp in compares: - self._assertEqualListsOfObjects(*comp) + # Retrieve the event to ensure it was successfully added + events = db.action_events_get(ctxt, action['id']) + action = db.action_get_by_request_id(ctxt, uuid, ctxt.request_id) + self.assertEqual(1, len(events)) + self.assertEqual('schedule', events[0]['event']) + self.assertEqual(start_time, events[0]['start_time']) + self.assertEqual(finish_time, events[0]['finish_time']) + self.assertNotEqual(action['message'], 'Error') - def test_service_get_all_by_topic(self): - values = [ - {'host': 'host1', 'topic': 't1'}, - {'host': 'host2', 'topic': 't1'}, - {'disabled': True, 'topic': 't1'}, - {'host': 'host3', 'topic': 't2'} - ] - services = [self._create_service(vals) for vals in values] - expected = services[:2] - real = db.service_get_all_by_topic(self.ctxt, 't1') - self._assertEqualListsOfObjects(expected, real) + def test_instance_action_event_finish_error(self): + """Finish an instance action event with an error.""" + ctxt = context.get_admin_context() + uuid = str(stdlib_uuid.uuid4()) - def test_service_get_all_by_host(self): - values = [ - {'host': 'host1', 'topic': 't1'}, - {'host': 'host1', 'topic': 't1'}, - {'host': 'host2', 'topic': 't1'}, - {'host': 'host3', 'topic': 't2'} - ] - services = [self._create_service(vals) for vals in values] + start_time = timeutils.utcnow() + action_values = {'action': 'run_instance', + 'instance_uuid': uuid, + 'request_id': ctxt.request_id, + 'user_id': ctxt.user_id, + 'project_id': ctxt.project_id, + 'start_time': start_time} + action = db.action_start(ctxt, action_values) - expected = services[:2] - real = db.service_get_all_by_host(self.ctxt, 'host1') - self._assertEqualListsOfObjects(expected, real) + event_values = {'event': 'schedule', + 'request_id': ctxt.request_id, + 'instance_uuid': uuid, + 'start_time': start_time} + db.action_event_start(ctxt, event_values) - def test_service_get_by_compute_host(self): - values = [ - {'host': 'host1', 'topic': CONF.compute_topic}, - {'host': 'host2', 'topic': 't1'}, - {'host': 'host3', 'topic': CONF.compute_topic} - ] - services = [self._create_service(vals) for vals in values] + finish_time = timeutils.utcnow() + datetime.timedelta(seconds=5) + event_finish_values = {'event': 'schedule', + 'request_id': ctxt.request_id, + 'instance_uuid': uuid, + 'finish_time': finish_time, + 'result': 'Error'} + db.action_event_finish(ctxt, event_finish_values) - real_service = db.service_get_by_compute_host(self.ctxt, 'host1') - self._assertEqualObjects(services[0], real_service, - ignored_keys=['compute_node']) + # Retrieve the event to ensure it was successfully added + events = db.action_events_get(ctxt, action['id']) + action = db.action_get_by_request_id(ctxt, uuid, ctxt.request_id) + self.assertEqual(1, len(events)) + self.assertEqual('schedule', events[0]['event']) + self.assertEqual(start_time, events[0]['start_time']) + self.assertEqual(finish_time, events[0]['finish_time']) + self.assertEqual(action['message'], 'Error') - self.assertRaises(exception.ComputeHostNotFound, - db.service_get_by_compute_host, - self.ctxt, 'non-exists-host') + def test_instance_action_and_event_start_string_time(self): + """Create an instance action and event with a string start_time.""" + ctxt = context.get_admin_context() + uuid = str(stdlib_uuid.uuid4()) - def test_service_get_by_compute_host_not_found(self): - self.assertRaises(exception.ComputeHostNotFound, - db.service_get_by_compute_host, - self.ctxt, 'non-exists-host') + start_time = timeutils.utcnow() + start_time_str = timeutils.strtime(start_time) + action_values = {'action': 'run_instance', + 'instance_uuid': uuid, + 'request_id': ctxt.request_id, + 'user_id': ctxt.user_id, + 'project_id': ctxt.project_id, + 'start_time': start_time_str} + action = db.action_start(ctxt, action_values) - def test_service_get_by_args(self): - values = [ - {'host': 'host1', 'binary': 'a'}, - {'host': 'host2', 'binary': 'b'} - ] - services = [self._create_service(vals) for vals in values] + event_values = {'event': 'schedule', + 'instance_uuid': uuid, + 'request_id': ctxt.request_id, + 'start_time': start_time_str} + db.action_event_start(ctxt, event_values) - service1 = db.service_get_by_args(self.ctxt, 'host1', 'a') - self._assertEqualObjects(services[0], service1) + # Retrieve the event to ensure it was successfully added + events = db.action_events_get(ctxt, action['id']) + self.assertEqual(1, len(events)) + self.assertEqual('schedule', events[0]['event']) + # db api still returns models with datetime, not str, values + self.assertEqual(start_time, events[0]['start_time']) - service2 = db.service_get_by_args(self.ctxt, 'host2', 'b') - self._assertEqualObjects(services[1], service2) + def test_instance_action_event_get_by_id(self): + """Get a specific instance action event.""" + ctxt1 = context.get_admin_context() + ctxt2 = context.get_admin_context() + uuid1 = str(stdlib_uuid.uuid4()) + uuid2 = str(stdlib_uuid.uuid4()) - def test_service_get_by_args_not_found_exception(self): - self.assertRaises(exception.HostBinaryNotFound, - db.service_get_by_args, - self.ctxt, 'non-exists-host', 'a') + action_values = {'action': 'run_instance', + 'instance_uuid': uuid1, + 'request_id': ctxt1.request_id, + 'user_id': ctxt1.user_id, + 'project_id': ctxt1.project_id, + 'start_time': timeutils.utcnow()} + added_action = db.action_start(ctxt1, action_values) + action_values = {'action': 'reboot', + 'instance_uuid': uuid2, + 'request_id': ctxt2.request_id, + 'user_id': ctxt2.user_id, + 'project_id': ctxt2.project_id, + 'start_time': timeutils.utcnow()} + db.action_start(ctxt2, action_values) -class BaseInstanceTypeTestCase(test.TestCase, ModelsObjectComparatorMixin): - def setUp(self): - super(BaseInstanceTypeTestCase, self).setUp() - self.ctxt = context.get_admin_context() + start_time = timeutils.utcnow() + event_values = {'event': 'schedule', + 'instance_uuid': uuid1, + 'request_id': ctxt1.request_id, + 'start_time': start_time} + added_event = db.action_event_start(ctxt1, event_values) - def _get_base_values(self): - return { - 'name': 'fake_name', - 'memory_mb': 512, - 'vcpus': 1, - 'root_gb': 10, - 'ephemeral_gb': 10, - 'flavorid': 'fake_flavor', - 'swap': 0, - 'rxtx_factor': 0.5, - 'vcpu_weight': 1, - 'disabled': False, - 'is_public': True - } + event_values = {'event': 'reboot', + 'instance_uuid': uuid2, + 'request_id': ctxt2.request_id, + 'start_time': timeutils.utcnow()} + db.action_event_start(ctxt2, event_values) - def _create_inst_type(self, values): - v = self._get_base_values() - v.update(values) - return db.instance_type_create(self.ctxt, v) + # Retrieve the event to ensure it was successfully added + event = db.action_event_get_by_id(ctxt1, added_action['id'], + added_event['id']) + self.assertEqual('schedule', event['event']) + self.assertEqual(start_time, event['start_time']) class InstanceFaultTestCase(test.TestCase, ModelsObjectComparatorMixin): -- cgit