def get_os_image(context, ec2_image_id): kind = get_ec2_id_kind(ec2_image_id) images = db_api.get_public_items(context, kind, (ec2_image_id,)) image = (images[0] if len(images) else get_db_item(context, ec2_image_id)) glance = clients.glance(context) try: return glance.images.get(image['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 test_get_public_items(self): self._setup_items() items = db_api.get_public_items(self.context, 'fake') self.assertEqual(2, len(items)) public_item_ids = [i['id'] for i in items] items = db_api.get_public_items(self.context, 'fake', public_item_ids) self.assertEqual(2, len(items)) items = db_api.get_public_items(self.context, 'fake', [public_item_ids[0]]) self.assertEqual(1, len(items)) items = db_api.get_public_items(self.context, 'fake', (public_item_ids[1], )) self.assertEqual(1, len(items)) items = db_api.get_public_items(self.context, 'fake1', [public_item_ids[0]]) self.assertEqual(0, len(items)) items = db_api.get_public_items(self.context, 'fake', fakes.random_ec2_id('fake')) self.assertEqual(0, len(items)) items = db_api.get_public_items(self.context, 'fake0', []) self.assertEqual(0, len(items))
def test_get_public_items(self): self._setup_items() items = db_api.get_public_items(self.context, 'fake') self.assertEqual(2, len(items)) public_item_ids = [i['id'] for i in items] items = db_api.get_public_items(self.context, 'fake', public_item_ids) self.assertEqual(2, len(items)) items = db_api.get_public_items(self.context, 'fake', [public_item_ids[0]]) self.assertEqual(1, len(items)) items = db_api.get_public_items(self.context, 'fake', (public_item_ids[1],)) self.assertEqual(1, len(items)) items = db_api.get_public_items(self.context, 'fake1', [public_item_ids[0]]) self.assertEqual(0, len(items)) items = db_api.get_public_items(self.context, 'fake', fakes.random_ec2_id('fake')) self.assertEqual(0, len(items)) items = db_api.get_public_items(self.context, 'fake0', []) self.assertEqual(0, len(items))