Fix and rename get_item_ids

1 Rename to get_items_ids
2 Fix a bug of filtering
3 Add a test on it
4 Add a test on ec2utils.os_id_to_ec2_id

Change-Id: I0ae4b0d2cd937ffa810f7cea3d818a72e3fac845
This commit is contained in:
Feodor Tersin 2015-04-13 11:09:35 +03:00
parent fcdb11b26e
commit 80655cb362
9 changed files with 105 additions and 16 deletions

View File

@ -282,7 +282,7 @@ def os_id_to_ec2_id(context, kind, os_id, items_by_os_id=None,
item = items_by_os_id.get(os_id)
if item:
return item['id']
ids = db_api.get_item_ids(context, kind, (os_id,))
ids = db_api.get_items_ids(context, kind, (os_id,))
if len(ids):
item_id, _os_id = ids[0]
else:

View File

@ -115,8 +115,8 @@ def get_public_items(context, kind, item_ids=None):
return IMPL.get_public_items(context, kind, item_ids)
def get_item_ids(context, kind, os_ids):
return IMPL.get_item_ids(context, kind, os_ids)
def get_items_ids(context, kind, os_ids):
return IMPL.get_items_ids(context, kind, os_ids)
def add_tags(context, tags):

View File

@ -219,11 +219,11 @@ def get_public_items(context, kind, item_ids=None):
@require_context
def get_item_ids(context, kind, os_ids):
def get_items_ids(context, kind, os_ids):
query = (model_query(context, models.Item).
filter(models.Item.id.like('%s-%%' % kind)))
if os_ids:
query = query.filter(models.Item.id.in_(os_ids))
query = query.filter(models.Item.os_id.in_(os_ids))
return [(item['id'], item['os_id'])
for item in query.all()]

View File

@ -110,8 +110,8 @@ class ApiTestCase(test_base.BaseTestCase):
tools.get_db_api_get_item_by_id(*self._db_items))
self.db_api.get_items_by_ids.side_effect = (
tools.get_db_api_get_items_by_ids(*self._db_items))
self.db_api.get_item_ids.side_effect = (
tools.get_db_api_get_item_ids(*self._db_items))
self.db_api.get_items_ids.side_effect = (
tools.get_db_api_get_items_ids(*self._db_items))
def add_mock_db_items(self, *items):
merged_items = items + tuple(item for item in self._db_items

View File

@ -187,12 +187,13 @@ class DbApiTestCase(test_base.BaseTestCase):
def _setup_items(self):
db_api.add_item(self.context, 'fake', {})
db_api.add_item(self.context, 'fake', {'is_public': True})
db_api.add_item(self.context, 'fake1', {})
db_api.add_item(self.context, 'fake1', {'os_id': fakes.random_os_id()})
db_api.add_item(self.other_context, 'fake', {})
db_api.add_item(self.other_context, 'fake', {'is_public': False})
db_api.add_item(self.other_context, 'fake', {'is_public': True})
db_api.add_item_id(self.other_context, 'fake', fakes.random_os_id())
db_api.add_item(self.other_context, 'fake1', {'is_public': True})
db_api.add_item(self.other_context, 'fake1',
{'is_public': False,
'os_id': fakes.random_os_id()})
def test_get_items(self):
self._setup_items()
@ -249,6 +250,20 @@ class DbApiTestCase(test_base.BaseTestCase):
(item_id, fakes.random_ec2_id('fake')))
self.assertEqual(1, len(items))
def test_get_items_ids(self):
self._setup_items()
item = db_api.get_items(self.context, 'fake1')[0]
other_item = db_api.get_items(self.other_context, 'fake1')[0]
items_ids = db_api.get_items_ids(self.context, 'fake1',
[item['os_id'], other_item['os_id']])
self.assertThat(items_ids,
matchers.ListMatches(
[(item['id'], item['os_id']),
(other_item['id'], other_item['os_id'])],
orderless_lists=True))
items_ids = db_api.get_items_ids(self.context, 'fake', [item['os_id']])
self.assertEqual(0, len(items_ids))
def test_get_public_items(self):
self._setup_items()
items = db_api.get_public_items(self.context, 'fake')

View File

@ -149,6 +149,80 @@ class EC2UtilsTestCase(testtools.TestCase):
self.assertEqual(conv('remove'), 'remove')
self.assertEqual(conv(''), '')
@mock.patch('ec2api.db.api.IMPL')
def test_os_id_to_ec2_id(self, db_api):
fake_context = mock.Mock(service_catalog=[{'type': 'fake'}])
fake_id = fakes.random_ec2_id('fake')
fake_os_id = fakes.random_os_id()
# no cache, item is found
db_api.get_items_ids.return_value = [(fake_id, fake_os_id)]
item_id = ec2utils.os_id_to_ec2_id(fake_context, 'fake', fake_os_id)
self.assertEqual(fake_id, item_id)
db_api.get_items_ids.assert_called_once_with(
fake_context, 'fake', (fake_os_id,))
self.assertFalse(db_api.add_item_id.called)
# no cache, item isn't found
db_api.get_items_ids.return_value = []
db_api.add_item_id.return_value = fake_id
item_id = ec2utils.os_id_to_ec2_id(fake_context, 'fake', fake_os_id)
self.assertEqual(fake_id, item_id)
db_api.add_item_id.assert_called_once_with(
fake_context, 'fake', fake_os_id)
# no item in cache, item isn't found
db_api.reset_mock()
ids_cache = {fakes.random_os_id(): fakes.random_ec2_id('fake')}
item_id = ec2utils.os_id_to_ec2_id(fake_context, 'fake', fake_os_id,
ids_by_os_id=ids_cache)
self.assertEqual(fake_id, item_id)
self.assertIn(fake_os_id, ids_cache)
self.assertEqual(fake_id, ids_cache[fake_os_id])
db_api.add_item_id.assert_called_once_with(
fake_context, 'fake', fake_os_id)
# no item in cache, item is found
db_api.reset_mock()
db_api.get_items_ids.return_value = [(fake_id, fake_os_id)]
ids_cache = {}
item_id = ec2utils.os_id_to_ec2_id(fake_context, 'fake', fake_os_id,
ids_by_os_id=ids_cache)
self.assertEqual(fake_id, item_id)
self.assertEqual({fake_os_id: fake_id}, ids_cache)
self.assertFalse(db_api.add_item_id.called)
# item in cache
db_api.reset_mock()
ids_cache = {fake_os_id: fake_id}
item_id = ec2utils.os_id_to_ec2_id(fake_context, 'fake', fake_os_id,
ids_by_os_id=ids_cache)
self.assertEqual(fake_id, item_id)
self.assertEqual({fake_os_id: fake_id}, ids_cache)
self.assertFalse(db_api.get_items_ids.called)
self.assertFalse(db_api.add_item_id.called)
# item in items dict
items_dict = {fake_os_id: {'id': fake_id,
'os_id': fake_os_id}}
ids_cache = {}
item_id = ec2utils.os_id_to_ec2_id(fake_context, 'fake', fake_os_id,
items_by_os_id=items_dict,
ids_by_os_id=ids_cache)
self.assertEqual(fake_id, item_id)
self.assertFalse(db_api.get_items_ids.called)
self.assertFalse(db_api.add_item_id.called)
self.assertEqual({}, ids_cache)
# item not in items dict, item is found
items_dict = {fake_os_id: {'id': fake_id,
'os_id': fake_os_id}}
db_api.get_items_ids.return_value = [(fake_id, fake_os_id)]
item_id = ec2utils.os_id_to_ec2_id(fake_context, 'fake', fake_os_id,
items_by_os_id=items_dict)
self.assertEqual(fake_id, item_id)
self.assertFalse(db_api.add_item_id.called)
@mock.patch('glanceclient.client.Client')
@mock.patch('ec2api.db.api.IMPL')
def test_get_os_image(self, db_api, glance):

View File

@ -350,7 +350,7 @@ class ProxyTestCase(test_base.BaseTestCase):
keypair = mock.Mock(public_key=fakes.PUBLIC_KEY_KEY_PAIR)
keypair.configure_mock(name=fakes.NAME_KEY_PAIR)
nova.return_value.keypairs.get.return_value = keypair
db_api.get_item_ids.return_value = [
db_api.get_items_ids.return_value = [
(fakes.ID_EC2_INSTANCE_1, fakes.ID_OS_INSTANCE_1)]
instance_api.describe_instances.return_value = {
'reservationSet': [fakes.EC2_RESERVATION_1]}

View File

@ -91,7 +91,7 @@ class MetadataApiTestCase(base.ApiTestCase):
api.get_metadata_item, self.fake_context, ['9999-99-99'],
fakes.ID_OS_INSTANCE_1, fakes.IP_NETWORK_INTERFACE_2)
self.db_api.get_item_ids.assert_called_with(
self.db_api.get_items_ids.assert_called_with(
self.fake_context, 'i', (fakes.ID_OS_INSTANCE_1,))
self.instance_api.describe_instances.assert_called_with(
self.fake_context, [fakes.ID_EC2_INSTANCE_1])

View File

@ -92,15 +92,15 @@ def get_db_api_get_items_by_ids(*items):
return db_api_get_items_by_ids
def get_db_api_get_item_ids(*items):
"""Generate db_api.get_item_ids mock function."""
def get_db_api_get_items_ids(*items):
"""Generate db_api.get_items_ids mock function."""
def db_api_get_item_ids(context, kind, item_os_ids):
def db_api_get_items_ids(context, kind, item_os_ids):
return [(item['id'], item['os_id'])
for item in items
if (item['os_id'] in item_os_ids and
ec2utils.get_ec2_id_kind(item['id']) == kind)]
return db_api_get_item_ids
return db_api_get_items_ids
def get_neutron_create(kind, os_id, addon={}):