Merge "Add Instance.get_by_id() query method"

This commit is contained in:
Jenkins 2013-07-11 01:43:10 +00:00 committed by Gerrit Code Review
commit b14f9cd142
8 changed files with 71 additions and 37 deletions

View File

@ -603,9 +603,10 @@ def instance_get_by_uuid(context, uuid, columns_to_join=None):
return IMPL.instance_get_by_uuid(context, uuid, columns_to_join)
def instance_get(context, instance_id):
def instance_get(context, instance_id, columns_to_join=None):
"""Get an instance or raise if it does not exist."""
return IMPL.instance_get(context, instance_id)
return IMPL.instance_get(context, instance_id,
columns_to_join=columns_to_join)
def instance_get_all(context, columns_to_join=None):

View File

@ -1562,9 +1562,10 @@ def _instance_get_by_uuid(context, uuid, session=None, columns_to_join=None):
@require_context
def instance_get(context, instance_id):
def instance_get(context, instance_id, columns_to_join=None):
try:
result = _build_instance_get(context).filter_by(id=instance_id).first()
result = _build_instance_get(context, columns_to_join=columns_to_join
).filter_by(id=instance_id).first()
if not result:
raise exception.InstanceNotFound(instance_id=instance_id)

View File

@ -218,23 +218,36 @@ class Instance(base.NovaObject):
instance.obj_reset_changes()
return instance
@base.remotable_classmethod
def get_by_uuid(cls, context, uuid, expected_attrs=None):
if expected_attrs is None:
expected_attrs = []
# Construct DB-specific columns from generic expected_attrs
@staticmethod
def _attrs_to_columns(attrs):
"""Translate instance attributes into columns needing joining."""
columns_to_join = []
if 'metadata' in expected_attrs:
if 'metadata' in attrs:
columns_to_join.append('metadata')
if 'system_metadata' in expected_attrs:
if 'system_metadata' in attrs:
columns_to_join.append('system_metadata')
# NOTE(danms): The DB API currently always joins info_cache and
# security_groups for get operations, so don't add them to the
# list of columns
return columns_to_join
@base.remotable_classmethod
def get_by_uuid(cls, context, uuid, expected_attrs=None):
if expected_attrs is None:
expected_attrs = []
columns_to_join = cls._attrs_to_columns(expected_attrs)
db_inst = db.instance_get_by_uuid(context, uuid,
columns_to_join)
columns_to_join=columns_to_join)
return Instance._from_db_object(context, cls(), db_inst,
expected_attrs)
@base.remotable_classmethod
def get_by_id(cls, context, inst_id, expected_attrs=None):
if expected_attrs is None:
expected_attrs = []
columns_to_join = cls._attrs_to_columns(expected_attrs)
db_inst = db.instance_get(context, inst_id,
columns_to_join=columns_to_join)
return Instance._from_db_object(context, cls(), db_inst,
expected_attrs)

View File

@ -66,7 +66,7 @@ class DiskConfigTestCase(test.TestCase):
self.stubs.Set(db, 'instance_get', fake_instance_get)
def fake_instance_get_by_uuid(context, uuid, columns_to_get=None):
def fake_instance_get_by_uuid(context, uuid, columns_to_join=None):
for instance in FAKE_INSTANCES:
if uuid == instance['uuid']:
return instance

View File

@ -23,7 +23,7 @@ from nova import test
from nova.tests.api.openstack import fakes
def fake_instance_get(self, context, instance_id):
def fake_instance_get(context, instance_id, columns_to_join=None):
result = fakes.stub_instance(id=1, uuid=instance_id)
result['created_at'] = None
result['deleted_at'] = None

View File

@ -242,7 +242,7 @@ class ServersControllerTest(test.TestCase):
"""Create two servers with the same host and different
project_ids and check that the hostId's are unique.
"""
def return_instance_with_host(self, *args):
def return_instance_with_host(self, *args, **kwargs):
project_id = str(uuid.uuid4())
return fakes.stub_instance(id=1, uuid=FAKE_UUID,
project_id=project_id,

View File

@ -4522,7 +4522,7 @@ class ComputeTestCase(BaseTestCase):
'status': None})
def fake_instance_get_by_uuid(context, instance_uuid,
cols_to_join=None):
columns_to_join=None):
# raise InstanceNotFound exception for uuid 'noexist'
if instance_uuid == 'noexist':
raise exception.InstanceNotFound(instance_id=instance_uuid)
@ -6541,7 +6541,7 @@ class ComputeAPITestCase(BaseTestCase):
expected = dict(exp_instance.iteritems())
expected['name'] = exp_instance['name']
def fake_db_get(_context, _instance_uuid):
def fake_db_get(_context, _instance_uuid, columns_to_join=None):
return exp_instance
self.stubs.Set(db, 'instance_get_by_uuid', fake_db_get)
@ -6556,7 +6556,7 @@ class ComputeAPITestCase(BaseTestCase):
expected = dict(exp_instance.iteritems())
expected['name'] = exp_instance['name']
def fake_db_get(context, instance_uuid):
def fake_db_get(context, instance_uuid, columns_to_join=None):
return exp_instance
self.stubs.Set(db, 'instance_get_by_uuid', fake_db_get)
@ -6570,7 +6570,7 @@ class ComputeAPITestCase(BaseTestCase):
expected = dict(exp_instance.iteritems())
expected['name'] = exp_instance['name']
def fake_db_get(_context, _instance_id):
def fake_db_get(_context, _instance_id, columns_to_join=None):
return exp_instance
self.stubs.Set(db, 'instance_get', fake_db_get)

View File

@ -93,7 +93,8 @@ class _TestInstanceObject(object):
def test_get_without_expected(self):
ctxt = context.get_admin_context()
self.mox.StubOutWithMock(db, 'instance_get_by_uuid')
db.instance_get_by_uuid(ctxt, 'uuid', []).AndReturn(self.fake_instance)
db.instance_get_by_uuid(ctxt, 'uuid', columns_to_join=[]
).AndReturn(self.fake_instance)
self.mox.ReplayAll()
inst = instance.Instance.get_by_uuid(ctxt, 'uuid')
# Make sure these weren't loaded
@ -107,7 +108,8 @@ class _TestInstanceObject(object):
self.mox.StubOutWithMock(db, 'instance_get_by_uuid')
db.instance_get_by_uuid(
ctxt, 'uuid',
['metadata', 'system_metadata']).AndReturn(self.fake_instance)
columns_to_join=['metadata', 'system_metadata']
).AndReturn(self.fake_instance)
self.mox.ReplayAll()
inst = instance.Instance.get_by_uuid(
ctxt, 'uuid', expected_attrs=instance.INSTANCE_OPTIONAL_FIELDS)
@ -116,15 +118,26 @@ class _TestInstanceObject(object):
self.assertTrue(hasattr(inst, attrname))
self.assertRemotes()
def test_get_by_id(self):
ctxt = context.get_admin_context()
self.mox.StubOutWithMock(db, 'instance_get')
db.instance_get(ctxt, 'instid', columns_to_join=[]
).AndReturn(self.fake_instance)
self.mox.ReplayAll()
inst = instance.Instance.get_by_id(ctxt, 'instid')
self.assertEqual(inst.uuid, self.fake_instance['uuid'])
self.assertRemotes()
def test_load(self):
ctxt = context.get_admin_context()
self.mox.StubOutWithMock(db, 'instance_get_by_uuid')
fake_uuid = self.fake_instance['uuid']
db.instance_get_by_uuid(ctxt, fake_uuid, []).AndReturn(
self.fake_instance)
db.instance_get_by_uuid(ctxt, fake_uuid, columns_to_join=[]
).AndReturn(self.fake_instance)
fake_inst2 = dict(self.fake_instance,
system_metadata=[{'key': 'foo', 'value': 'bar'}])
db.instance_get_by_uuid(ctxt, fake_uuid, ['system_metadata']
db.instance_get_by_uuid(ctxt, fake_uuid,
columns_to_join=['system_metadata']
).AndReturn(fake_inst2)
self.mox.ReplayAll()
inst = instance.Instance.get_by_uuid(ctxt, fake_uuid)
@ -142,8 +155,8 @@ class _TestInstanceObject(object):
ctxt = context.get_admin_context()
self.mox.StubOutWithMock(db, 'instance_get_by_uuid')
fake_instance = self.fake_instance
db.instance_get_by_uuid(ctxt, 'fake-uuid', []).AndReturn(
fake_instance)
db.instance_get_by_uuid(ctxt, 'fake-uuid', columns_to_join=[]
).AndReturn(fake_instance)
self.mox.ReplayAll()
inst = instance.Instance.get_by_uuid(ctxt, 'fake-uuid')
self.assertEqual(inst.id, fake_instance['id'])
@ -158,10 +171,12 @@ class _TestInstanceObject(object):
ctxt = context.get_admin_context()
self.mox.StubOutWithMock(db, 'instance_get_by_uuid')
fake_uuid = self.fake_instance['uuid']
db.instance_get_by_uuid(ctxt, fake_uuid, []).AndReturn(
dict(self.fake_instance, host='orig-host'))
db.instance_get_by_uuid(ctxt, fake_uuid, []).AndReturn(
dict(self.fake_instance, host='new-host'))
db.instance_get_by_uuid(ctxt, fake_uuid, columns_to_join=[]
).AndReturn(dict(self.fake_instance,
host='orig-host'))
db.instance_get_by_uuid(ctxt, fake_uuid, columns_to_join=[]
).AndReturn(dict(self.fake_instance,
host='new-host'))
self.mox.ReplayAll()
inst = instance.Instance.get_by_uuid(ctxt, fake_uuid)
self.assertEqual(inst.host, 'orig-host')
@ -177,7 +192,8 @@ class _TestInstanceObject(object):
self.mox.StubOutWithMock(db, 'instance_get_by_uuid')
self.mox.StubOutWithMock(db, 'instance_update_and_get_original')
self.mox.StubOutWithMock(db, 'instance_info_cache_update')
db.instance_get_by_uuid(ctxt, fake_uuid, []).AndReturn(fake_inst)
db.instance_get_by_uuid(ctxt, fake_uuid, columns_to_join=[]
).AndReturn(fake_inst)
db.instance_update_and_get_original(
ctxt, fake_uuid, {'user_data': 'foo'}).AndReturn(
(fake_inst, dict(fake_inst, host='newhost')))
@ -192,7 +208,8 @@ class _TestInstanceObject(object):
fake_inst = dict(self.fake_instance, id=123, deleted=123)
fake_uuid = fake_inst['uuid']
self.mox.StubOutWithMock(db, 'instance_get_by_uuid')
db.instance_get_by_uuid(ctxt, fake_uuid, []).AndReturn(fake_inst)
db.instance_get_by_uuid(ctxt, fake_uuid, columns_to_join=[]
).AndReturn(fake_inst)
self.mox.ReplayAll()
inst = instance.Instance.get_by_uuid(ctxt, fake_uuid)
# NOTE(danms): Make sure it's actually a bool
@ -207,7 +224,8 @@ class _TestInstanceObject(object):
self.mox.StubOutWithMock(db, 'instance_get_by_uuid')
self.mox.StubOutWithMock(db, 'instance_update_and_get_original')
self.mox.StubOutWithMock(db, 'instance_info_cache_update')
db.instance_get_by_uuid(ctxt, fake_uuid, []).AndReturn(fake_inst)
db.instance_get_by_uuid(ctxt, fake_uuid, columns_to_join=[]
).AndReturn(fake_inst)
db.instance_info_cache_update(ctxt, fake_uuid,
{'network_info': 'bar'})
self.mox.ReplayAll()
@ -235,7 +253,8 @@ class _TestInstanceObject(object):
self.mox.StubOutWithMock(db, 'instance_get_by_uuid')
self.mox.StubOutWithMock(db, 'instance_update_and_get_original')
self.mox.StubOutWithMock(db, 'security_group_update')
db.instance_get_by_uuid(ctxt, fake_uuid, []).AndReturn(fake_inst)
db.instance_get_by_uuid(ctxt, fake_uuid, columns_to_join=[]
).AndReturn(fake_inst)
db.security_group_update(ctxt, 1, {'description': 'changed'}
).AndReturn(fake_inst['security_groups'][0])
self.mox.ReplayAll()
@ -260,8 +279,8 @@ class _TestInstanceObject(object):
for x in test_instance_fault.fake_faults['fake-uuid']]
self.mox.StubOutWithMock(db, 'instance_get_by_uuid')
self.mox.StubOutWithMock(db, 'instance_fault_get_by_instance_uuids')
db.instance_get_by_uuid(ctxt, fake_uuid, []).AndReturn(
self.fake_instance)
db.instance_get_by_uuid(ctxt, fake_uuid, columns_to_join=[]
).AndReturn(self.fake_instance)
db.instance_fault_get_by_instance_uuids(ctxt, [fake_uuid]).AndReturn(
{fake_uuid: fake_faults})
self.mox.ReplayAll()