Exemple #1
0
    def find(self, **kwargs):
        """Find a single item with attributes matching ``**kwargs``.

        This isn't very efficient: it loads the entire list then filters on
        the Python side.
        """
        matches = self.findall(**kwargs)
        num_matches = len(matches)
        if num_matches == 0:
            msg = "No %s matching %s." % (self.resource_class.__name__, kwargs)
            raise exceptions.NotFound(404, msg)
        elif num_matches > 1:
            raise exceptions.NoUniqueMatch
        else:
            return matches[0]
Exemple #2
0
    def _find_resource_by_id_or_name(id_or_name, resource_list,
                                     resource_type_name):
        """The method is trying to find id or name in item_list

        The method searches item with id_or_name in list and returns it.
        If there is more than one value or no values then it raises an
        exception

        :param id_or_name: resource id or name
        :param resource_list: list of resources
        :param resource_type_name: name of resource type that will be used
                                   for exceptions
        :raises NotFound, NoUniqueMatch
        :return: resource or generate an exception otherwise
        """
        search_result_by_id = [res for res in resource_list
                               if res.id == id_or_name]
        if search_result_by_id:
            return search_result_by_id[0]
        else:
            # try to find resource by name
            search_result_by_name = [res for res in resource_list
                                     if res.name == id_or_name]
            match_count = len(search_result_by_name)
            if match_count > 1:
                message = ("Ambiguous {0} name '{1}'. Found more than one "
                           "{0} for this name in Manila."
                           ).format(resource_type_name, id_or_name)
                raise exceptions.NoUniqueMatch(message)
            elif match_count == 1:
                return search_result_by_name[0]
            else:
                message = ("{0} '{1}' was not found in Manila. Please "
                           "use the identity of existing {0} in Heat "
                           "template.").format(resource_type_name, id_or_name)
                raise exceptions.NotFound(message=message)
Exemple #3
0
class TestIsNotFound(common.HeatTestCase):

    scenarios = [
        ('aodh_not_found',
         dict(
             is_not_found=True,
             is_over_limit=False,
             is_client_exception=True,
             is_conflict=False,
             plugin='aodh',
             exception=lambda: aodh_exc.NotFound('not found'),
         )),
        ('aodh_overlimit',
         dict(
             is_not_found=False,
             is_over_limit=True,
             is_client_exception=True,
             is_conflict=False,
             plugin='aodh',
             exception=lambda: aodh_exc.OverLimit('over'),
         )),
        ('aodh_conflict',
         dict(
             is_not_found=False,
             is_over_limit=False,
             is_client_exception=True,
             is_conflict=True,
             plugin='aodh',
             exception=lambda: aodh_exc.Conflict('conflict'),
         )),
        ('cinder_not_found',
         dict(
             is_not_found=True,
             is_over_limit=False,
             is_client_exception=True,
             is_conflict=False,
             plugin='cinder',
             exception=lambda: cinder_exc.NotFound(code=404),
         )),
        ('cinder_exception',
         dict(is_not_found=False,
              is_over_limit=False,
              is_client_exception=False,
              is_conflict=False,
              plugin='cinder',
              exception=lambda: Exception())),
        ('cinder_overlimit',
         dict(
             is_not_found=False,
             is_over_limit=True,
             is_client_exception=True,
             is_conflict=False,
             plugin='cinder',
             exception=lambda: cinder_exc.OverLimit(code=413),
         )),
        ('cinder_conflict',
         dict(
             is_not_found=False,
             is_over_limit=False,
             is_client_exception=True,
             is_conflict=True,
             plugin='cinder',
             exception=lambda: cinder_exc.ClientException(code=409,
                                                          message='conflict'),
         )),
        ('glance_not_found_1',
         dict(
             is_not_found=True,
             is_over_limit=False,
             is_client_exception=True,
             is_conflict=False,
             plugin='glance',
             exception=lambda: client_exception.EntityMatchNotFound(),
         )),
        ('glance_not_found_2',
         dict(
             is_not_found=True,
             is_over_limit=False,
             is_client_exception=True,
             is_conflict=False,
             plugin='glance',
             exception=lambda: glance_exc.HTTPNotFound(),
         )),
        ('glance_exception',
         dict(is_not_found=False,
              is_over_limit=False,
              is_client_exception=False,
              is_conflict=False,
              plugin='glance',
              exception=lambda: Exception())),
        ('glance_overlimit',
         dict(
             is_not_found=False,
             is_over_limit=True,
             is_client_exception=True,
             is_conflict=False,
             plugin='glance',
             exception=lambda: glance_exc.HTTPOverLimit(details='over'),
         )),
        ('glance_conflict_1',
         dict(
             is_not_found=False,
             is_over_limit=False,
             is_client_exception=True,
             is_conflict=True,
             plugin='glance',
             exception=lambda: glance_exc.Conflict(),
         )),
        ('heat_not_found',
         dict(
             is_not_found=True,
             is_over_limit=False,
             is_client_exception=True,
             is_conflict=False,
             plugin='heat',
             exception=lambda: heat_exc.HTTPNotFound(message='gone'),
         )),
        ('heat_exception',
         dict(is_not_found=False,
              is_over_limit=False,
              is_client_exception=False,
              is_conflict=False,
              plugin='heat',
              exception=lambda: Exception())),
        ('heat_overlimit',
         dict(
             is_not_found=False,
             is_over_limit=True,
             is_client_exception=True,
             is_conflict=False,
             plugin='heat',
             exception=lambda: heat_exc.HTTPOverLimit(message='over'),
         )),
        ('heat_conflict',
         dict(
             is_not_found=False,
             is_over_limit=False,
             is_client_exception=True,
             is_conflict=True,
             plugin='heat',
             exception=lambda: heat_exc.HTTPConflict(),
         )),
        ('keystone_not_found',
         dict(
             is_not_found=True,
             is_over_limit=False,
             is_client_exception=True,
             is_conflict=False,
             plugin='keystone',
             exception=lambda: keystone_exc.NotFound(details='gone'),
         )),
        ('keystone_entity_not_found',
         dict(
             is_not_found=True,
             is_over_limit=False,
             is_client_exception=True,
             is_conflict=False,
             plugin='keystone',
             exception=lambda: exception.EntityNotFound(),
         )),
        ('keystone_exception',
         dict(is_not_found=False,
              is_over_limit=False,
              is_client_exception=False,
              is_conflict=False,
              plugin='keystone',
              exception=lambda: Exception())),
        ('keystone_overlimit',
         dict(
             is_not_found=False,
             is_over_limit=True,
             is_client_exception=True,
             is_conflict=False,
             plugin='keystone',
             exception=lambda: keystone_exc.RequestEntityTooLarge(details=
                                                                  'over'),
         )),
        ('keystone_conflict',
         dict(
             is_not_found=False,
             is_over_limit=False,
             is_client_exception=True,
             is_conflict=True,
             plugin='keystone',
             exception=lambda: keystone_exc.Conflict(message='Conflict'),
         )),
        ('neutron_not_found',
         dict(
             is_not_found=True,
             is_over_limit=False,
             is_client_exception=True,
             is_conflict=False,
             plugin='neutron',
             exception=lambda: neutron_exc.NotFound,
         )),
        ('neutron_network_not_found',
         dict(
             is_not_found=True,
             is_over_limit=False,
             is_client_exception=True,
             is_conflict=False,
             plugin='neutron',
             exception=lambda: neutron_exc.NetworkNotFoundClient(),
         )),
        ('neutron_port_not_found',
         dict(
             is_not_found=True,
             is_over_limit=False,
             is_client_exception=True,
             is_conflict=False,
             plugin='neutron',
             exception=lambda: neutron_exc.PortNotFoundClient(),
         )),
        ('neutron_status_not_found',
         dict(
             is_not_found=True,
             is_over_limit=False,
             is_client_exception=True,
             is_conflict=False,
             plugin='neutron',
             exception=lambda: neutron_exc.NeutronClientException(status_code=
                                                                  404),
         )),
        ('neutron_exception',
         dict(is_not_found=False,
              is_over_limit=False,
              is_client_exception=False,
              is_conflict=False,
              plugin='neutron',
              exception=lambda: Exception())),
        ('neutron_overlimit',
         dict(
             is_not_found=False,
             is_over_limit=True,
             is_client_exception=True,
             is_conflict=False,
             plugin='neutron',
             exception=lambda: neutron_exc.NeutronClientException(status_code=
                                                                  413),
         )),
        ('neutron_conflict',
         dict(
             is_not_found=False,
             is_over_limit=False,
             is_client_exception=True,
             is_conflict=True,
             plugin='neutron',
             exception=lambda: neutron_exc.Conflict(),
         )),
        ('nova_not_found',
         dict(
             is_not_found=True,
             is_over_limit=False,
             is_client_exception=True,
             is_conflict=False,
             is_unprocessable_entity=False,
             plugin='nova',
             exception=lambda: fakes_nova.fake_exception(),
         )),
        ('nova_exception',
         dict(is_not_found=False,
              is_over_limit=False,
              is_client_exception=False,
              is_conflict=False,
              is_unprocessable_entity=False,
              plugin='nova',
              exception=lambda: Exception())),
        ('nova_overlimit',
         dict(
             is_not_found=False,
             is_over_limit=True,
             is_client_exception=True,
             is_conflict=False,
             is_unprocessable_entity=False,
             plugin='nova',
             exception=lambda: fakes_nova.fake_exception(413),
         )),
        ('nova_unprocessable_entity',
         dict(
             is_not_found=False,
             is_over_limit=False,
             is_client_exception=True,
             is_conflict=False,
             is_unprocessable_entity=True,
             plugin='nova',
             exception=lambda: fakes_nova.fake_exception(422),
         )),
        ('nova_conflict',
         dict(
             is_not_found=False,
             is_over_limit=False,
             is_client_exception=True,
             is_conflict=True,
             is_unprocessable_entity=False,
             plugin='nova',
             exception=lambda: fakes_nova.fake_exception(409),
         )),
        ('openstack_not_found',
         dict(
             is_not_found=True,
             is_over_limit=False,
             is_client_exception=True,
             is_conflict=False,
             is_unprocessable_entity=False,
             plugin='openstack',
             exception=lambda: exceptions.ResourceNotFound,
         )),
        ('swift_not_found',
         dict(
             is_not_found=True,
             is_over_limit=False,
             is_client_exception=True,
             is_conflict=False,
             plugin='swift',
             exception=lambda: swift_exc.ClientException(msg='gone',
                                                         http_status=404),
         )),
        ('swift_exception',
         dict(is_not_found=False,
              is_over_limit=False,
              is_client_exception=False,
              is_conflict=False,
              plugin='swift',
              exception=lambda: Exception())),
        ('swift_overlimit',
         dict(
             is_not_found=False,
             is_over_limit=True,
             is_client_exception=True,
             is_conflict=False,
             plugin='swift',
             exception=lambda: swift_exc.ClientException(msg='ouch',
                                                         http_status=413),
         )),
        ('swift_conflict',
         dict(
             is_not_found=False,
             is_over_limit=False,
             is_client_exception=True,
             is_conflict=True,
             plugin='swift',
             exception=lambda: swift_exc.ClientException(msg='conflict',
                                                         http_status=409),
         )),
        ('trove_not_found',
         dict(
             is_not_found=True,
             is_over_limit=False,
             is_client_exception=True,
             is_conflict=False,
             plugin='trove',
             exception=lambda: troveclient.exceptions.NotFound(message='gone'),
         )),
        ('trove_exception',
         dict(is_not_found=False,
              is_over_limit=False,
              is_client_exception=False,
              is_conflict=False,
              plugin='trove',
              exception=lambda: Exception())),
        ('trove_overlimit',
         dict(
             is_not_found=False,
             is_over_limit=True,
             is_client_exception=True,
             is_conflict=False,
             plugin='trove',
             exception=lambda: troveclient.exceptions.RequestEntityTooLarge(
                 message='over'),
         )),
        ('trove_conflict',
         dict(
             is_not_found=False,
             is_over_limit=False,
             is_client_exception=True,
             is_conflict=True,
             plugin='trove',
             exception=lambda: troveclient.exceptions.Conflict(message=
                                                               'Conflict'),
         )),
        ('sahara_not_found',
         dict(
             is_not_found=True,
             is_over_limit=False,
             is_client_exception=True,
             is_conflict=False,
             plugin='sahara',
             exception=lambda: sahara_base.APIException(error_message='gone1',
                                                        error_code=404),
         )),
        ('sahara_exception',
         dict(is_not_found=False,
              is_over_limit=False,
              is_client_exception=False,
              is_conflict=False,
              plugin='sahara',
              exception=lambda: Exception())),
        ('sahara_overlimit',
         dict(
             is_not_found=False,
             is_over_limit=True,
             is_client_exception=True,
             is_conflict=False,
             plugin='sahara',
             exception=lambda: sahara_base.APIException(error_message='over1',
                                                        error_code=413),
         )),
        ('sahara_conflict',
         dict(
             is_not_found=False,
             is_over_limit=False,
             is_client_exception=True,
             is_conflict=True,
             plugin='sahara',
             exception=lambda: sahara_base.APIException(
                 error_message='conflict1', error_code=409),
         )),
        ('zaqar_not_found',
         dict(
             is_not_found=True,
             is_over_limit=False,
             is_client_exception=True,
             is_conflict=False,
             plugin='zaqar',
             exception=lambda: zaqar_exc.ResourceNotFound(),
         )),
        ('manila_not_found',
         dict(
             is_not_found=True,
             is_over_limit=False,
             is_client_exception=True,
             is_conflict=False,
             plugin='manila',
             exception=lambda: manila_exc.NotFound(),
         )),
        ('manila_exception',
         dict(is_not_found=False,
              is_over_limit=False,
              is_client_exception=False,
              is_conflict=False,
              plugin='manila',
              exception=lambda: Exception())),
        ('manila_overlimit',
         dict(
             is_not_found=False,
             is_over_limit=True,
             is_client_exception=True,
             is_conflict=False,
             plugin='manila',
             exception=lambda: manila_exc.RequestEntityTooLarge(),
         )),
        ('manila_conflict',
         dict(
             is_not_found=False,
             is_over_limit=False,
             is_client_exception=True,
             is_conflict=True,
             plugin='manila',
             exception=lambda: manila_exc.Conflict(),
         )),
        ('mistral_not_found1',
         dict(
             is_not_found=True,
             is_over_limit=False,
             is_client_exception=False,
             is_conflict=False,
             plugin='mistral',
             exception=lambda: mistral_base.APIException(404),
         )),
        ('mistral_not_found2',
         dict(
             is_not_found=True,
             is_over_limit=False,
             is_client_exception=False,
             is_conflict=False,
             plugin='mistral',
             exception=lambda: keystone_exc.NotFound(),
         )),
    ]

    def test_is_not_found(self):
        con = mock.Mock()
        c = clients.Clients(con)
        client_plugin = c.client_plugin(self.plugin)
        try:
            raise self.exception()
        except Exception as e:
            if self.is_not_found != client_plugin.is_not_found(e):
                raise

    def test_ignore_not_found(self):
        con = mock.Mock()
        c = clients.Clients(con)
        client_plugin = c.client_plugin(self.plugin)
        try:
            exp = self.exception()
            exp_class = exp.__class__
            raise exp
        except Exception as e:
            if self.is_not_found:
                client_plugin.ignore_not_found(e)
            else:
                self.assertRaises(exp_class, client_plugin.ignore_not_found, e)

    def test_ignore_not_found_context_manager(self):
        con = mock.Mock()
        c = clients.Clients(con)
        client_plugin = c.client_plugin(self.plugin)

        exp = self.exception()
        exp_class = exp.__class__

        def try_raise():
            with client_plugin.ignore_not_found:
                raise exp

        if self.is_not_found:
            try_raise()
        else:
            self.assertRaises(exp_class, try_raise)

    def test_ignore_conflict_and_not_found(self):
        con = mock.Mock()
        c = clients.Clients(con)
        client_plugin = c.client_plugin(self.plugin)
        try:
            exp = self.exception()
            exp_class = exp.__class__
            raise exp
        except Exception as e:
            if self.is_conflict or self.is_not_found:
                client_plugin.ignore_conflict_and_not_found(e)
            else:
                self.assertRaises(exp_class,
                                  client_plugin.ignore_conflict_and_not_found,
                                  e)

    def test_ignore_conflict_and_not_found_context_manager(self):
        con = mock.Mock()
        c = clients.Clients(con)
        client_plugin = c.client_plugin(self.plugin)

        exp = self.exception()
        exp_class = exp.__class__

        def try_raise():
            with client_plugin.ignore_conflict_and_not_found:
                raise exp

        if self.is_conflict or self.is_not_found:
            try_raise()
        else:
            self.assertRaises(exp_class, try_raise)

    def test_is_over_limit(self):
        con = mock.Mock()
        c = clients.Clients(con)
        client_plugin = c.client_plugin(self.plugin)
        try:
            raise self.exception()
        except Exception as e:
            if self.is_over_limit != client_plugin.is_over_limit(e):
                raise

    def test_is_client_exception(self):
        con = mock.Mock()
        c = clients.Clients(con)
        client_plugin = c.client_plugin(self.plugin)
        try:
            raise self.exception()
        except Exception as e:
            ice = self.is_client_exception
            actual = client_plugin.is_client_exception(e)
            if ice != actual:
                raise

    def test_is_conflict(self):
        con = mock.Mock()
        c = clients.Clients(con)
        client_plugin = c.client_plugin(self.plugin)
        try:
            raise self.exception()
        except Exception as e:
            if self.is_conflict != client_plugin.is_conflict(e):
                raise

    def test_is_unprocessable_entity(self):
        con = mock.Mock()
        c = clients.Clients(con)
        # only 'nova' client plugin need to check this exception
        if self.plugin == 'nova':
            client_plugin = c.client_plugin(self.plugin)
            try:
                raise self.exception()
            except Exception as e:
                iue = self.is_unprocessable_entity
                if iue != client_plugin.is_unprocessable_entity(e):
                    raise
Exemple #4
0
 def get(self, resource_id):
     for resource in self.resources:
         if resource.id == str(resource_id):
             return resource
     raise exceptions.NotFound(resource_id)
Exemple #5
0
 def raise_exc(*args, **kwargs):
     raise manila_client_exc.NotFound(404)