Merge "Fix error in instance_get_all_by_filters() use of soft_deleted filter"

This commit is contained in:
Jenkins
2013-05-30 22:11:26 +00:00
committed by Gerrit Code Review

View File

@@ -31,6 +31,7 @@ from sqlalchemy.exc import IntegrityError
from sqlalchemy import MetaData from sqlalchemy import MetaData
from sqlalchemy.sql.expression import select from sqlalchemy.sql.expression import select
from nova.compute import vm_states
from nova import context from nova import context
from nova import db from nova import db
from nova.db.sqlalchemy import api as sqlalchemy_api from nova.db.sqlalchemy import api as sqlalchemy_api
@@ -88,7 +89,7 @@ class DbTestCase(test.TestCase):
self.project_id = 'fake' self.project_id = 'fake'
self.context = context.RequestContext(self.user_id, self.project_id) self.context = context.RequestContext(self.user_id, self.project_id)
def create_instances_with_args(self, **kwargs): def create_instance_with_args(self, **kwargs):
args = {'reservation_id': 'a', 'image_ref': 1, 'host': 'host1', args = {'reservation_id': 'a', 'image_ref': 1, 'host': 'host1',
'node': 'node1', 'project_id': self.project_id, 'node': 'node1', 'project_id': self.project_id,
'vm_state': 'fake'} 'vm_state': 'fake'}
@@ -120,36 +121,36 @@ class DbApiTestCase(DbTestCase):
otherprojectcontext = context.RequestContext(self.user_id, otherprojectcontext = context.RequestContext(self.user_id,
"%s2" % self.project_id) "%s2" % self.project_id)
self.create_instances_with_args(hostname='fake_name') self.create_instance_with_args(hostname='fake_name')
# With scope 'global' any duplicate should fail, be it this project: # With scope 'global' any duplicate should fail, be it this project:
self.flags(osapi_compute_unique_server_name_scope='global') self.flags(osapi_compute_unique_server_name_scope='global')
self.assertRaises(exception.InstanceExists, self.assertRaises(exception.InstanceExists,
self.create_instances_with_args, self.create_instance_with_args,
hostname='fake_name') hostname='fake_name')
# or another: # or another:
self.assertRaises(exception.InstanceExists, self.assertRaises(exception.InstanceExists,
self.create_instances_with_args, self.create_instance_with_args,
context=otherprojectcontext, context=otherprojectcontext,
hostname='fake_name') hostname='fake_name')
# With scope 'project' a duplicate in the project should fail: # With scope 'project' a duplicate in the project should fail:
self.flags(osapi_compute_unique_server_name_scope='project') self.flags(osapi_compute_unique_server_name_scope='project')
self.assertRaises(exception.InstanceExists, self.assertRaises(exception.InstanceExists,
self.create_instances_with_args, self.create_instance_with_args,
hostname='fake_name') hostname='fake_name')
# With scope 'project' a duplicate in a different project should work: # With scope 'project' a duplicate in a different project should work:
self.flags(osapi_compute_unique_server_name_scope='project') self.flags(osapi_compute_unique_server_name_scope='project')
self.create_instances_with_args(context=otherprojectcontext, self.create_instance_with_args(context=otherprojectcontext,
hostname='fake_name') hostname='fake_name')
self.flags(osapi_compute_unique_server_name_scope=None) self.flags(osapi_compute_unique_server_name_scope=None)
def test_instance_metadata_get_all_query(self): def test_instance_metadata_get_all_query(self):
self.create_instances_with_args(metadata={'foo': 'bar'}) self.create_instance_with_args(metadata={'foo': 'bar'})
self.create_instances_with_args(metadata={'baz': 'quux'}) self.create_instance_with_args(metadata={'baz': 'quux'})
result = db.instance_metadata_get_all(self.context, []) result = db.instance_metadata_get_all(self.context, [])
self.assertEqual(2, len(result)) self.assertEqual(2, len(result))
@@ -182,7 +183,7 @@ class DbApiTestCase(DbTestCase):
check_exc_format(db.get_instance_uuid_by_ec2_id) check_exc_format(db.get_instance_uuid_by_ec2_id)
def test_instance_get_all_with_meta(self): def test_instance_get_all_with_meta(self):
inst = self.create_instances_with_args() inst = self.create_instance_with_args()
fake_meta, fake_sys = self.create_metadata_for_instance(inst['uuid']) fake_meta, fake_sys = self.create_metadata_for_instance(inst['uuid'])
result = db.instance_get_all(self.context) result = db.instance_get_all(self.context)
for inst in result: for inst in result:
@@ -192,7 +193,7 @@ class DbApiTestCase(DbTestCase):
self.assertEqual(sys_meta, fake_sys) self.assertEqual(sys_meta, fake_sys)
def test_instance_get_all_by_filters_with_meta(self): def test_instance_get_all_by_filters_with_meta(self):
inst = self.create_instances_with_args() inst = self.create_instance_with_args()
fake_meta, fake_sys = self.create_metadata_for_instance(inst['uuid']) fake_meta, fake_sys = self.create_metadata_for_instance(inst['uuid'])
result = db.instance_get_all_by_filters(self.context, {}) result = db.instance_get_all_by_filters(self.context, {})
for inst in result: for inst in result:
@@ -202,7 +203,7 @@ class DbApiTestCase(DbTestCase):
self.assertEqual(sys_meta, fake_sys) self.assertEqual(sys_meta, fake_sys)
def test_instance_get_all_by_filters_without_meta(self): def test_instance_get_all_by_filters_without_meta(self):
inst = self.create_instances_with_args() inst = self.create_instance_with_args()
fake_meta, fake_sys = self.create_metadata_for_instance(inst['uuid']) fake_meta, fake_sys = self.create_metadata_for_instance(inst['uuid'])
result = db.instance_get_all_by_filters(self.context, {}, result = db.instance_get_all_by_filters(self.context, {},
columns_to_join=[]) columns_to_join=[])
@@ -213,34 +214,41 @@ class DbApiTestCase(DbTestCase):
self.assertEqual(sys_meta, {}) self.assertEqual(sys_meta, {})
def test_instance_get_all_by_filters(self): def test_instance_get_all_by_filters(self):
self.create_instances_with_args() self.create_instance_with_args()
self.create_instances_with_args() self.create_instance_with_args()
result = db.instance_get_all_by_filters(self.context, {}) result = db.instance_get_all_by_filters(self.context, {})
self.assertEqual(2, len(result)) self.assertEqual(2, len(result))
def test_instance_get_all_by_filters_regex(self): def test_instance_get_all_by_filters_regex(self):
self.create_instances_with_args(display_name='test1') self.create_instance_with_args(display_name='test1')
self.create_instances_with_args(display_name='teeeest2') self.create_instance_with_args(display_name='teeeest2')
self.create_instances_with_args(display_name='diff') self.create_instance_with_args(display_name='diff')
result = db.instance_get_all_by_filters(self.context, result = db.instance_get_all_by_filters(self.context,
{'display_name': 't.*st.'}) {'display_name': 't.*st.'})
self.assertEqual(2, len(result)) self.assertEqual(2, len(result))
def test_instance_get_all_by_filters_exact_match(self):
self.create_instance_with_args(host='host1')
self.create_instance_with_args(host='host12')
result = db.instance_get_all_by_filters(self.context,
{'host': 'host1'})
self.assertEqual(1, len(result))
def test_instance_get_all_by_filters_metadata(self): def test_instance_get_all_by_filters_metadata(self):
self.create_instances_with_args(metadata={'foo': 'bar'}) self.create_instance_with_args(metadata={'foo': 'bar'})
self.create_instances_with_args() self.create_instance_with_args()
result = db.instance_get_all_by_filters(self.context, result = db.instance_get_all_by_filters(self.context,
{'metadata': {'foo': 'bar'}}) {'metadata': {'foo': 'bar'}})
self.assertEqual(1, len(result)) self.assertEqual(1, len(result))
def test_instance_get_all_by_filters_unicode_value(self): def test_instance_get_all_by_filters_unicode_value(self):
self.create_instances_with_args(display_name=u'test♥') self.create_instance_with_args(display_name=u'test♥')
result = db.instance_get_all_by_filters(self.context, result = db.instance_get_all_by_filters(self.context,
{'display_name': u'test'}) {'display_name': u'test'})
self.assertEqual(1, len(result)) self.assertEqual(1, len(result))
def test_instance_get_by_uuid(self): def test_instance_get_by_uuid(self):
inst = self.create_instances_with_args() inst = self.create_instance_with_args()
fake_meta, fake_sys = self.create_metadata_for_instance(inst['uuid']) fake_meta, fake_sys = self.create_metadata_for_instance(inst['uuid'])
result = db.instance_get_by_uuid(self.context, inst['uuid']) result = db.instance_get_by_uuid(self.context, inst['uuid'])
meta = utils.metadata_to_dict(result['metadata']) meta = utils.metadata_to_dict(result['metadata'])
@@ -249,7 +257,7 @@ class DbApiTestCase(DbTestCase):
self.assertEqual(sys_meta, fake_sys) self.assertEqual(sys_meta, fake_sys)
def test_instance_get_by_uuid_join_empty(self): def test_instance_get_by_uuid_join_empty(self):
inst = self.create_instances_with_args() inst = self.create_instance_with_args()
fake_meta, fake_sys = self.create_metadata_for_instance(inst['uuid']) fake_meta, fake_sys = self.create_metadata_for_instance(inst['uuid'])
result = db.instance_get_by_uuid(self.context, inst['uuid'], result = db.instance_get_by_uuid(self.context, inst['uuid'],
columns_to_join=[]) columns_to_join=[])
@@ -259,7 +267,7 @@ class DbApiTestCase(DbTestCase):
self.assertEqual(sys_meta, {}) self.assertEqual(sys_meta, {})
def test_instance_get_by_uuid_join_meta(self): def test_instance_get_by_uuid_join_meta(self):
inst = self.create_instances_with_args() inst = self.create_instance_with_args()
fake_meta, fake_sys = self.create_metadata_for_instance(inst['uuid']) fake_meta, fake_sys = self.create_metadata_for_instance(inst['uuid'])
result = db.instance_get_by_uuid(self.context, inst['uuid'], result = db.instance_get_by_uuid(self.context, inst['uuid'],
columns_to_join=['metadata']) columns_to_join=['metadata'])
@@ -269,7 +277,7 @@ class DbApiTestCase(DbTestCase):
self.assertEqual(sys_meta, {}) self.assertEqual(sys_meta, {})
def test_instance_get_by_uuid_join_sys_meta(self): def test_instance_get_by_uuid_join_sys_meta(self):
inst = self.create_instances_with_args() inst = self.create_instance_with_args()
fake_meta, fake_sys = self.create_metadata_for_instance(inst['uuid']) fake_meta, fake_sys = self.create_metadata_for_instance(inst['uuid'])
result = db.instance_get_by_uuid(self.context, inst['uuid'], result = db.instance_get_by_uuid(self.context, inst['uuid'],
columns_to_join=['system_metadata']) columns_to_join=['system_metadata'])
@@ -279,8 +287,8 @@ class DbApiTestCase(DbTestCase):
self.assertEqual(sys_meta, fake_sys) self.assertEqual(sys_meta, fake_sys)
def test_instance_get_all_by_filters_deleted(self): def test_instance_get_all_by_filters_deleted(self):
inst1 = self.create_instances_with_args() inst1 = self.create_instance_with_args()
inst2 = self.create_instances_with_args(reservation_id='b') inst2 = self.create_instance_with_args(reservation_id='b')
db.instance_destroy(self.context, inst1['uuid']) db.instance_destroy(self.context, inst1['uuid'])
result = db.instance_get_all_by_filters(self.context, {}) result = db.instance_get_all_by_filters(self.context, {})
self.assertEqual(2, len(result)) self.assertEqual(2, len(result))
@@ -291,10 +299,44 @@ class DbApiTestCase(DbTestCase):
else: else:
self.assertTrue(result[1]['deleted']) self.assertTrue(result[1]['deleted'])
def test_instance_get_all_by_filters_deleted_and_soft_deleted(self):
inst1 = self.create_instance_with_args()
inst2 = self.create_instance_with_args(vm_state=vm_states.SOFT_DELETED)
inst3 = self.create_instance_with_args()
db.instance_destroy(self.context, inst1['uuid'])
result = db.instance_get_all_by_filters(self.context,
{'deleted': True})
self.assertEqual(2, len(result))
self.assertIn(inst1['id'], [result[0]['id'], result[1]['id']])
self.assertIn(inst2['id'], [result[0]['id'], result[1]['id']])
def test_instance_get_all_by_filters_deleted_no_soft_deleted(self):
inst1 = self.create_instance_with_args()
inst2 = self.create_instance_with_args(vm_state=vm_states.SOFT_DELETED)
inst3 = self.create_instance_with_args()
db.instance_destroy(self.context, inst1['uuid'])
result = db.instance_get_all_by_filters(self.context,
{'deleted': True,
'soft_deleted': False})
self.assertEqual(1, len(result))
self.assertEqual(inst1['id'], result[0]['id'])
def test_instance_get_all_by_filters_alive_and_soft_deleted(self):
inst1 = self.create_instance_with_args()
inst2 = self.create_instance_with_args(vm_state=vm_states.SOFT_DELETED)
inst3 = self.create_instance_with_args()
db.instance_destroy(self.context, inst1['uuid'])
result = db.instance_get_all_by_filters(self.context,
{'deleted': False,
'soft_deleted': True})
self.assertEqual(2, len(result))
self.assertIn(inst2['id'], [result[0]['id'], result[1]['id']])
self.assertIn(inst3['id'], [result[0]['id'], result[1]['id']])
def test_instance_get_all_by_host_and_node_no_join(self): def test_instance_get_all_by_host_and_node_no_join(self):
# Test that system metadata is not joined. # Test that system metadata is not joined.
sys_meta = {'foo': 'bar'} sys_meta = {'foo': 'bar'}
expected = self.create_instances_with_args(system_metadata=sys_meta) expected = self.create_instance_with_args(system_metadata=sys_meta)
elevated = self.context.elevated() elevated = self.context.elevated()
instances = db.instance_get_all_by_host_and_node(elevated, 'host1', instances = db.instance_get_all_by_host_and_node(elevated, 'host1',
@@ -506,12 +548,12 @@ class DbApiTestCase(DbTestCase):
otherprojectcontext = context.RequestContext(self.user_id, otherprojectcontext = context.RequestContext(self.user_id,
"%s2" % self.project_id) "%s2" % self.project_id)
inst = self.create_instances_with_args(hostname='fake_name') inst = self.create_instance_with_args(hostname='fake_name')
uuid1p1 = inst['uuid'] uuid1p1 = inst['uuid']
inst = self.create_instances_with_args(hostname='fake_name2') inst = self.create_instance_with_args(hostname='fake_name2')
uuid2p1 = inst['uuid'] uuid2p1 = inst['uuid']
inst = self.create_instances_with_args(context=otherprojectcontext, inst = self.create_instance_with_args(context=otherprojectcontext,
hostname='fake_name3') hostname='fake_name3')
uuid1p2 = inst['uuid'] uuid1p2 = inst['uuid']
@@ -1271,9 +1313,9 @@ class NotDbApiTestCase(DbTestCase):
def test_instance_get_all_by_filters_regex_unsupported_db(self): def test_instance_get_all_by_filters_regex_unsupported_db(self):
# Ensure that the 'LIKE' operator is used for unsupported dbs. # Ensure that the 'LIKE' operator is used for unsupported dbs.
self.create_instances_with_args(display_name='test1') self.create_instance_with_args(display_name='test1')
self.create_instances_with_args(display_name='test.*') self.create_instance_with_args(display_name='test.*')
self.create_instances_with_args(display_name='diff') self.create_instance_with_args(display_name='diff')
result = db.instance_get_all_by_filters(self.context, result = db.instance_get_all_by_filters(self.context,
{'display_name': 'test.*'}) {'display_name': 'test.*'})
self.assertEqual(1, len(result)) self.assertEqual(1, len(result))
@@ -1282,9 +1324,9 @@ class NotDbApiTestCase(DbTestCase):
self.assertEqual(2, len(result)) self.assertEqual(2, len(result))
def test_instance_get_all_by_filters_paginate(self): def test_instance_get_all_by_filters_paginate(self):
test1 = self.create_instances_with_args(display_name='test1') test1 = self.create_instance_with_args(display_name='test1')
test2 = self.create_instances_with_args(display_name='test2') test2 = self.create_instance_with_args(display_name='test2')
test3 = self.create_instances_with_args(display_name='test3') test3 = self.create_instance_with_args(display_name='test3')
result = db.instance_get_all_by_filters(self.context, result = db.instance_get_all_by_filters(self.context,
{'display_name': '%test%'}, {'display_name': '%test%'},
@@ -1645,17 +1687,17 @@ class SqlAlchemyDbApiTestCase(DbTestCase):
def test_instance_get_all_by_host(self): def test_instance_get_all_by_host(self):
ctxt = context.get_admin_context() ctxt = context.get_admin_context()
self.create_instances_with_args() self.create_instance_with_args()
self.create_instances_with_args() self.create_instance_with_args()
self.create_instances_with_args(host='host2') self.create_instance_with_args(host='host2')
result = sqlalchemy_api._instance_get_all_uuids_by_host(ctxt, 'host1') result = sqlalchemy_api._instance_get_all_uuids_by_host(ctxt, 'host1')
self.assertEqual(2, len(result)) self.assertEqual(2, len(result))
def test_instance_get_all_uuids_by_host(self): def test_instance_get_all_uuids_by_host(self):
ctxt = context.get_admin_context() ctxt = context.get_admin_context()
self.create_instances_with_args() self.create_instance_with_args()
self.create_instances_with_args() self.create_instance_with_args()
self.create_instances_with_args(host='host2') self.create_instance_with_args(host='host2')
result = sqlalchemy_api._instance_get_all_uuids_by_host(ctxt, 'host1') result = sqlalchemy_api._instance_get_all_uuids_by_host(ctxt, 'host1')
self.assertEqual(2, len(result)) self.assertEqual(2, len(result))
self.assertEqual(types.UnicodeType, type(result[0])) self.assertEqual(types.UnicodeType, type(result[0]))