Ejemplo n.º 1
0
    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))
Ejemplo n.º 2
0
    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))
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
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)
Ejemplo n.º 5
0
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)
Ejemplo n.º 6
0
    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
Ejemplo n.º 7
0
    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
Ejemplo n.º 8
0
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