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_ids=[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_ids=[item['os_id']]) self.assertEqual(0, len(items_ids)) item_ids = db_api.get_items_ids( self.context, 'fake1', item_ids=[item['id'], other_item['id']]) self.assertThat( item_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_ids=[item['id']]) self.assertEqual(0, len(items_ids))
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_ids=[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_ids=[item['os_id']]) self.assertEqual(0, len(items_ids)) item_ids = db_api.get_items_ids(self.context, 'fake1', item_ids=[item['id'], other_item['id']]) self.assertThat(item_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_ids=[item['id']]) self.assertEqual(0, len(items_ids))
def os_id_to_ec2_id(context, kind, os_id, items_by_os_id=None, ids_by_os_id=None, project_id=None): if os_id is None: return None if ids_by_os_id is not None: item_id = ids_by_os_id.get(os_id) if item_id: return item_id if items_by_os_id is not None: item = items_by_os_id.get(os_id) if item: return item['id'] ids = db_api.get_items_ids(context, kind, item_os_ids=(os_id, )) if len(ids): item_id, _os_id = ids[0] else: item_id = db_api.add_item_id(context, kind, os_id, project_id=project_id) if ids_by_os_id is not None: ids_by_os_id[os_id] = item_id return item_id
def get_os_image(context, ec2_image_id): kind = get_ec2_id_kind(ec2_image_id) ids = db_api.get_items_ids(context, kind, item_ids=(ec2_image_id,)) if not ids: raise exception.InvalidAMIIDNotFound(id=ec2_image_id) _id, os_id = ids[0] glance = clients.glance(context) try: return glance.images.get(os_id) except glance_exception.HTTPNotFound: raise exception.InvalidAMIIDNotFound(id=ec2_image_id)
def get_os_image(context, ec2_image_id): kind = get_ec2_id_kind(ec2_image_id) ids = db_api.get_items_ids(context, kind, item_ids=(ec2_image_id, )) if not ids: raise exception.InvalidAMIIDNotFound(id=ec2_image_id) _id, os_id = ids[0] glance = clients.glance(context) try: return glance.images.get(os_id) except glance_exception.HTTPNotFound: raise exception.InvalidAMIIDNotFound(id=ec2_image_id)
def get_db_items(self): # TODO(ft): we can't get all images from DB per one request due # different kinds. It's need to refactor DB API and ec2utils functions # to work with kind smarter if self.ids: local_images = db_api.get_items_by_ids(self.context, self.ids) else: local_images = sum((db_api.get_items(self.context, kind) for kind in ('ami', 'ari', 'aki')), []) public_images = sum( (db_api.get_public_items(self.context, kind, self.ids) for kind in ('ami', 'ari', 'aki')), []) mapped_ids = [] if self.ids: mapped_ids = [{ 'id': item_id, 'os_id': os_id } for kind in ('ami', 'ari', 'aki') for item_id, os_id in db_api.get_items_ids( self.context, kind, item_ids=self.ids)] # NOTE(ft): mapped_ids must be the first to let complete items from # next lists to override mappings, which do not have item body data images = sum((mapped_ids, local_images, public_images), []) if self.ids: # NOTE(ft): public images, owned by a current user, appear in both # local and public lists of images. Therefore it's not enough to # just compare length of requested and retrieved lists to make sure # that all requested images are retrieved. images_ids = set(i['id'] for i in images) if len(images_ids) < len(self.ids): missed_ids = self.ids - images_ids raise exception.InvalidAMIIDNotFound(id=next(iter(missed_ids))) self.pending_images = { i['id']: i for i in local_images if not i['os_id'] } self.snapshot_ids = dict( (s['os_id'], s['id']) for s in db_api.get_items(self.context, 'snap')) self.local_images_os_ids = set(i['os_id'] for i in local_images) self.ids_dict = {} return images
def get_db_items(self): # TODO(ft): we can't get all images from DB per one request due # different kinds. It's need to refactor DB API and ec2utils functions # to work with kind smarter if self.ids: local_images = db_api.get_items_by_ids(self.context, self.ids) else: local_images = sum((db_api.get_items(self.context, kind) for kind in ('ami', 'ari', 'aki')), []) public_images = sum((db_api.get_public_items(self.context, kind, self.ids) for kind in ('ami', 'ari', 'aki')), []) mapped_ids = [] if self.ids: mapped_ids = [{'id': item_id, 'os_id': os_id} for kind in ('ami', 'ari', 'aki') for item_id, os_id in db_api.get_items_ids( self.context, kind, item_ids=self.ids)] # NOTE(ft): mapped_ids must be the first to let complete items from # next lists to override mappings, which do not have item body data images = sum((mapped_ids, local_images, public_images), []) if self.ids: # NOTE(ft): public images, owned by a current user, appear in both # local and public lists of images. Therefore it's not enough to # just compare length of requested and retrieved lists to make sure # that all requested images are retrieved. images_ids = set(i['id'] for i in images) if len(images_ids) < len(self.ids): missed_ids = self.ids - images_ids raise exception.InvalidAMIIDNotFound(id=next(iter(missed_ids))) self.pending_images = {i['id']: i for i in local_images if not i['os_id']} self.snapshot_ids = dict( (s['os_id'], s['id']) for s in db_api.get_items(self.context, 'snap')) self.local_images_os_ids = set(i['os_id'] for i in local_images) self.ids_dict = {} return images
def os_id_to_ec2_id(context, kind, os_id, items_by_os_id=None, ids_by_os_id=None, project_id=None): if os_id is None: return None if ids_by_os_id is not None: item_id = ids_by_os_id.get(os_id) if item_id: return item_id if items_by_os_id is not None: item = items_by_os_id.get(os_id) if item: return item['id'] ids = db_api.get_items_ids(context, kind, item_os_ids=(os_id,)) if len(ids): item_id, _os_id = ids[0] else: item_id = db_api.add_item_id(context, kind, os_id, project_id=project_id) if ids_by_os_id is not None: ids_by_os_id[os_id] = item_id return item_id