Skip to content

Commit

Permalink
Fix console db can't load attribute pool
Browse files Browse the repository at this point in the history
Lists consoles failed when populate console_type from console
db's pool attribute. The reason was db api console_get_all_by_instance
didn't join with pool. So add param 'columns_to_join' for db api, and
join pool attribute when lists consoles.

Change-Id: I18b44860270a401c55cf02b4334b973fbf357b03
Closes-bug: #1223205
  • Loading branch information
soulxu committed Sep 25, 2013
1 parent 97c49e1 commit 18f417c
Show file tree
Hide file tree
Showing 5 changed files with 25 additions and 10 deletions.
3 changes: 2 additions & 1 deletion nova/console/api.py
Expand Up @@ -36,7 +36,8 @@ def __init__(self, **kwargs):
super(API, self).__init__(**kwargs)

def get_consoles(self, context, instance_uuid):
return self.db.console_get_all_by_instance(context, instance_uuid)
return self.db.console_get_all_by_instance(context, instance_uuid,
columns_to_join=['pool'])

def get_console(self, context, instance_uuid, console_uuid):
return self.db.console_get(context, console_uuid, instance_uuid)
Expand Down
5 changes: 3 additions & 2 deletions nova/db/api.py
Expand Up @@ -1379,9 +1379,10 @@ def console_get_by_pool_instance(context, pool_id, instance_uuid):
return IMPL.console_get_by_pool_instance(context, pool_id, instance_uuid)


def console_get_all_by_instance(context, instance_uuid):
def console_get_all_by_instance(context, instance_uuid, columns_to_join=None):
"""Get consoles for a given instance."""
return IMPL.console_get_all_by_instance(context, instance_uuid)
return IMPL.console_get_all_by_instance(context, instance_uuid,
columns_to_join)


def console_get(context, console_id, instance_uuid=None):
Expand Down
11 changes: 7 additions & 4 deletions nova/db/sqlalchemy/api.py
Expand Up @@ -4085,10 +4085,13 @@ def console_get_by_pool_instance(context, pool_id, instance_uuid):
return result


def console_get_all_by_instance(context, instance_uuid):
return model_query(context, models.Console, read_deleted="yes").\
filter_by(instance_uuid=instance_uuid).\
all()
def console_get_all_by_instance(context, instance_uuid, columns_to_join=None):
query = model_query(context, models.Console, read_deleted="yes").\
filter_by(instance_uuid=instance_uuid)
if columns_to_join:
for column in columns_to_join:
query = query.options(joinedload(column))
return query.all()


def console_get(context, console_id, instance_uuid=None):
Expand Down
3 changes: 2 additions & 1 deletion nova/tests/console/test_console.py
Expand Up @@ -144,7 +144,8 @@ def _fake_db_console_get(_ctxt, _console_uuid, _instance_uuid):
return self.fake_console
self.stubs.Set(db, 'console_get', _fake_db_console_get)

def _fake_db_console_get_all_by_instance(_ctxt, _instance_uuid):
def _fake_db_console_get_all_by_instance(_ctxt, _instance_uuid,
columns_to_join):
return [self.fake_console]
self.stubs.Set(db, 'console_get_all_by_instance',
_fake_db_console_get_all_by_instance)
Expand Down
13 changes: 11 additions & 2 deletions nova/tests/db/test_db_api.py
Expand Up @@ -5524,15 +5524,15 @@ def setUp(self):
'compute_host': 'compute_host2',
},
]
console_pools = [db.console_pool_create(self.ctxt, val)
self.console_pools = [db.console_pool_create(self.ctxt, val)
for val in pools_data]
instance_uuid = uuidutils.generate_uuid()
db.instance_create(self.ctxt, {'uuid': instance_uuid})
self.console_data = [dict([('instance_name', 'name' + str(x)),
('instance_uuid', instance_uuid),
('password', 'pass' + str(x)),
('port', 7878 + x),
('pool_id', console_pools[x]['id'])])
('pool_id', self.console_pools[x]['id'])])
for x in xrange(len(pools_data))]
self.consoles = [db.console_create(self.ctxt, val)
for val in self.console_data]
Expand Down Expand Up @@ -5570,6 +5570,15 @@ def test_console_get_all_by_instance(self):
consoles_get = db.console_get_all_by_instance(self.ctxt, instance_uuid)
self._assertEqualListsOfObjects(self.consoles, consoles_get)

def test_console_get_all_by_instance_with_pool(self):
instance_uuid = self.consoles[0]['instance_uuid']
consoles_get = db.console_get_all_by_instance(self.ctxt, instance_uuid,
columns_to_join=['pool'])
self._assertEqualListsOfObjects(self.consoles, consoles_get,
ignored_keys=['pool'])
self._assertEqualListsOfObjects([pool for pool in self.console_pools],
[c['pool'] for c in consoles_get])

def test_console_get_all_by_instance_empty(self):
consoles_get = db.console_get_all_by_instance(self.ctxt,
uuidutils.generate_uuid())
Expand Down

0 comments on commit 18f417c

Please sign in to comment.