Example #1
0
 def test_convert_exception_to_http_exc_multiple_same_codes(self):
     e = n_exc.MultipleExceptions([exceptions.NetworkNotFound(net_id='nid'),
                                   exceptions.PortNotFound(port_id='pid')])
     conv = common.convert_exception_to_http_exc(e, base_v2.FAULT_MAP, None)
     self.assertIsInstance(conv, exc.HTTPNotFound)
     self.assertEqual(
         "Network nid could not be found.\nPort pid could not be found.",
         jsonutils.loads(conv.body)['NeutronError']['message'])
Example #2
0
 def test_convert_exception_to_http_exc_multiple_different_codes(self):
     e = n_exc.MultipleExceptions([exceptions.NetworkInUse(net_id='nid'),
                                   exceptions.PortNotFound(port_id='pid')])
     conv = common.convert_exception_to_http_exc(e, base_v2.FAULT_MAP, None)
     self.assertIsInstance(conv, exc.HTTPConflict)
     self.assertEqual(
         ("HTTP 409 NetworkInUse: Unable to complete operation on network "
          "nid. There are one or more ports still in use on the network.\n"
          "HTTP 404 PortNotFound: Port pid could not be found."),
         jsonutils.loads(conv.body)['NeutronError']['message'])
Example #3
0
 def test_convert_exception_to_http_exc_multiple_same_codes(self):
     e = exceptions.MultipleExceptions([
         exceptions.NetworkNotFound(net_id='nid'),
         exceptions.PortNotFound(port_id='pid')
     ])
     conv = common.convert_exception_to_http_exc(e, base_v2.FAULT_MAP, None)
     self.assertIsInstance(conv, exc.HTTPNotFound)
     self.assertEqual(
         "Network nid could not be found.\nPort pid could not be found.",
         jsonutils.loads(conv.body)['NeutronError']['message'])
Example #4
0
 def test_convert_exception_to_http_exc_multiple_different_codes(self):
     e = exceptions.MultipleExceptions([
         exceptions.NetworkInUse(net_id='nid'),
         exceptions.PortNotFound(port_id='pid')
     ])
     conv = common.convert_exception_to_http_exc(e, base_v2.FAULT_MAP, None)
     self.assertIsInstance(conv, exc.HTTPConflict)
     self.assertEqual(
         ("HTTP 409 NetworkInUse: Unable to complete operation on network "
          "nid. There are one or more ports still in use on the network.\n"
          "HTTP 404 PortNotFound: Port pid could not be found."),
         jsonutils.loads(conv.body)['NeutronError']['message'])
Example #5
0
 def on_error(self, state, e):
     language = None
     if state.request.accept_language:
         language = state.request.accept_language.best_match(
             oslo_i18n.get_available_languages('neutron'))
     exc = api_common.convert_exception_to_http_exc(e, faults.FAULT_MAP,
                                                    language)
     if hasattr(exc, 'code') and 400 <= exc.code < 500:
         LOG.info('%(action)s failed (client error): %(exc)s',
                  {'action': state.request.method, 'exc': exc})
     else:
         LOG.exception('%s failed.', state.request.method)
     return exc
Example #6
0
    def resource(request):
        route_args = request.environ.get('wsgiorg.routing_args')
        if route_args:
            args = route_args[1].copy()
        else:
            args = {}

        # NOTE(jkoelker) by now the controller is already found, remove
        #                it from the args if it is in the matchdict
        args.pop('controller', None)
        fmt = args.pop('format', None)
        action = args.pop('action', None)
        content_type = format_types.get(fmt, request.best_match_content_type())
        language = request.best_match_language()
        deserializer = deserializers.get(content_type)
        serializer = serializers.get(content_type)

        try:
            if request.body:
                args['body'] = deserializer.deserialize(request.body)['body']

            method = getattr(controller, action)

            result = method(request=request, **args)
        except Exception as e:
            mapped_exc = api_common.convert_exception_to_http_exc(
                e, faults, language)
            if hasattr(mapped_exc, 'code') and 400 <= mapped_exc.code < 500:
                LOG.info(_LI('%(action)s failed (client error): %(exc)s'), {
                    'action': action,
                    'exc': mapped_exc
                })
            else:
                LOG.exception(_LE('%(action)s failed: %(details)s'), {
                    'action': action,
                    'details': utils.extract_exc_details(e),
                })
            raise mapped_exc

        status = action_status.get(action, 200)
        body = serializer.serialize(result)
        # NOTE(jkoelker) Comply with RFC2616 section 9.7
        if status == 204:
            content_type = ''
            body = None

        return webob.Response(request=request,
                              status=status,
                              content_type=content_type,
                              body=body)
Example #7
0
 def on_error(self, state, e):
     language = None
     if state.request.accept_language:
         language = state.request.accept_language.best_match(
             oslo_i18n.get_available_languages('neutron'))
     exc = api_common.convert_exception_to_http_exc(e, v2base.FAULT_MAP,
                                                    language)
     if hasattr(exc, 'code') and 400 <= exc.code < 500:
         LOG.info(_LI('%(action)s failed (client error): %(exc)s'), {
             'action': state.request.method,
             'exc': exc
         })
     else:
         LOG.exception(_LE('%s failed.'), state.request.method)
     return exc
 def on_error(self, state, e):
     language = None
     if state.request.accept_language:
         all_languages = oslo_i18n.get_available_languages('neutron')
         language = state.request.accept_language.lookup(
             all_languages, default='fake_LANG')
         if language == 'fake_LANG':
             language = None
     exc = api_common.convert_exception_to_http_exc(e, faults.FAULT_MAP,
                                                    language)
     if hasattr(exc, 'code') and 400 <= exc.code < 500:
         LOG.info('%(action)s failed (client error): %(exc)s',
                  {'action': state.request.method, 'exc': exc})
     else:
         LOG.exception('%s failed.', state.request.method)
     return exc
Example #9
0
    def resource(request):
        route_args = request.environ.get('wsgiorg.routing_args')
        if route_args:
            args = route_args[1].copy()
        else:
            args = {}

        # NOTE(jkoelker) by now the controller is already found, remove
        #                it from the args if it is in the matchdict
        args.pop('controller', None)
        fmt = args.pop('format', None)
        action = args.pop('action', None)
        content_type = format_types.get(fmt,
                                        request.best_match_content_type())
        language = request.best_match_language()
        deserializer = deserializers.get(content_type)
        serializer = serializers.get(content_type)

        try:
            if request.body:
                args['body'] = deserializer.deserialize(request.body)['body']

            method = getattr(controller, action)

            result = method(request=request, **args)
        except Exception as e:
            mapped_exc = api_common.convert_exception_to_http_exc(e, faults,
                                                                  language)
            if hasattr(mapped_exc, 'code') and 400 <= mapped_exc.code < 500:
                LOG.info(_LI('%(action)s failed (client error): %(exc)s'),
                         {'action': action, 'exc': mapped_exc})
            else:
                LOG.exception(_LE('%s failed'), action)
            raise mapped_exc

        status = action_status.get(action, 200)
        body = serializer.serialize(result)
        # NOTE(jkoelker) Comply with RFC2616 section 9.7
        if status == 204:
            content_type = ''
            body = None

        return webob.Response(request=request, status=status,
                              content_type=content_type,
                              body=body)
Example #10
0
    def resource(request):
        route_args = request.environ.get("wsgiorg.routing_args")
        if route_args:
            args = route_args[1].copy()
        else:
            args = {}

        # NOTE(jkoelker) by now the controller is already found, remove
        #                it from the args if it is in the matchdict
        args.pop("controller", None)
        fmt = args.pop("format", None)
        action = args.pop("action", None)
        content_type = format_types.get(fmt, request.best_match_content_type())
        language = request.best_match_language()
        deserializer = deserializers.get(content_type)
        serializer = serializers.get(content_type)

        try:
            if request.body:
                args["body"] = deserializer.deserialize(request.body)["body"]

            method = getattr(controller, action)

            result = method(request=request, **args)
        except Exception as e:
            mapped_exc = api_common.convert_exception_to_http_exc(e, faults, language)
            if hasattr(mapped_exc, "code") and 400 <= mapped_exc.code < 500:
                LOG.info(_LI("%(action)s failed (client error): %(exc)s"), {"action": action, "exc": mapped_exc})
            else:
                LOG.exception(
                    _LE("%(action)s failed: %(details)s"), {"action": action, "details": utils.extract_exc_details(e)}
                )
            raise mapped_exc

        status = action_status.get(action, 200)
        body = serializer.serialize(result)
        # NOTE(jkoelker) Comply with RFC2616 section 9.7
        if status == 204:
            content_type = ""
            body = None

        return webob.Response(request=request, status=status, content_type=content_type, body=body)
Example #11
0
    def resource(request):
        route_args = request.environ.get('wsgiorg.routing_args')
        if route_args:
            args = route_args[1].copy()
        else:
            args = {}

        # NOTE(jkoelker) by now the controller is already found, remove
        #                it from the args if it is in the matchdict
        args.pop('controller', None)
        fmt = args.pop('format', None)
        action = args.pop('action', None)
        content_type = format_types.get(fmt, request.best_match_content_type())
        language = request.best_match_language()
        deserializer = deserializers.get(content_type)
        serializer = serializers.get(content_type)

        try:
            if request.body:
                args['body'] = deserializer.deserialize(request.body)['body']

            # Routes library is dumb and cuts off everything after last dot (.)
            # as format. At the same time, it doesn't enforce format suffix,
            # which combined makes it impossible to pass a 'id' with dots
            # included (the last section after the last dot is lost). This is
            # important for some API extensions like tags where the id is
            # really a tag name that can contain special characters.
            #
            # To work around the Routes behaviour, we will attach the suffix
            # back to id if it's not one of supported formats (atm json only).
            # This of course won't work for the corner case of a tag name that
            # actually ends with '.json', but there seems to be no better way
            # to tackle it without breaking API backwards compatibility.
            if fmt is not None and fmt not in format_types:
                args['id'] = '.'.join([args['id'], fmt])

            revision_number = api_common.check_request_for_revision_constraint(
                request)
            if revision_number is not None:
                request.context.set_transaction_constraint(
                    controller._collection, args['id'], revision_number)

            method = getattr(controller, action)
            result = method(request=request, **args)
        except Exception as e:
            mapped_exc = api_common.convert_exception_to_http_exc(
                e, faults, language)
            if hasattr(mapped_exc, 'code') and 400 <= mapped_exc.code < 500:
                LOG.info('%(action)s failed (client error): %(exc)s', {
                    'action': action,
                    'exc': mapped_exc
                })
            else:
                LOG.exception('%(action)s failed: %(details)s', {
                    'action': action,
                    'details': utils.extract_exc_details(e),
                })
            raise mapped_exc

        status = action_status.get(action, 200)
        body = serializer.serialize(result)
        # NOTE(jkoelker) Comply with RFC2616 section 9.7
        if status == 204:
            content_type = ''
            body = None

        return webob.Response(request=request,
                              status=status,
                              content_type=content_type,
                              body=body)
Example #12
0
 def test_convert_exception_to_http_exc_multiple_empty_inner(self):
     e = exceptions.MultipleExceptions([])
     conv = common.convert_exception_to_http_exc(e, base_v2.FAULT_MAP, None)
     self.assertIsInstance(conv, exc.HTTPInternalServerError)
Example #13
0
 def test_convert_exception_to_http_exc_multiple_empty_inner(self):
     e = exceptions.MultipleExceptions([])
     conv = common.convert_exception_to_http_exc(e, base_v2.FAULT_MAP, None)
     self.assertIsInstance(conv, exc.HTTPInternalServerError)
Example #14
0
    def resource(request):
        route_args = request.environ.get('wsgiorg.routing_args')
        if route_args:
            args = route_args[1].copy()
        else:
            args = {}

        # NOTE(jkoelker) by now the controller is already found, remove
        #                it from the args if it is in the matchdict
        args.pop('controller', None)
        fmt = args.pop('format', None)
        action = args.pop('action', None)
        content_type = format_types.get(fmt,
                                        request.best_match_content_type())
        language = request.best_match_language()
        deserializer = deserializers.get(content_type)
        serializer = serializers.get(content_type)

        try:
            if request.body:
                args['body'] = deserializer.deserialize(request.body)['body']

            # Routes library is dumb and cuts off everything after last dot (.)
            # as format. At the same time, it doesn't enforce format suffix,
            # which combined makes it impossible to pass a 'id' with dots
            # included (the last section after the last dot is lost). This is
            # important for some API extensions like tags where the id is
            # really a tag name that can contain special characters.
            #
            # To work around the Routes behaviour, we will attach the suffix
            # back to id if it's not one of supported formats (atm json only).
            # This of course won't work for the corner case of a tag name that
            # actually ends with '.json', but there seems to be no better way
            # to tackle it without breaking API backwards compatibility.
            if fmt is not None and fmt not in format_types:
                args['id'] = '.'.join([args['id'], fmt])

            revision_number = api_common.check_request_for_revision_constraint(
                request)
            if revision_number is not None:
                request.context.set_transaction_constraint(
                    controller._collection, args['id'], revision_number)

            method = getattr(controller, action)
            result = method(request=request, **args)
        except Exception as e:
            mapped_exc = api_common.convert_exception_to_http_exc(e, faults,
                                                                  language)
            if hasattr(mapped_exc, 'code') and 400 <= mapped_exc.code < 500:
                LOG.info('%(action)s failed (client error): %(exc)s',
                         {'action': action, 'exc': mapped_exc})
            else:
                LOG.exception('%(action)s failed: %(details)s',
                              {
                                  'action': action,
                                  'details': utils.extract_exc_details(e),
                              }
                              )
            raise mapped_exc

        status = action_status.get(action, 200)
        body = serializer.serialize(result)
        # NOTE(jkoelker) Comply with RFC2616 section 9.7
        if status == 204:
            content_type = ''
            body = None

        return webob.Response(request=request, status=status,
                              content_type=content_type,
                              body=body)