def test_invoke_prepare_params(self):
        api_request = apirequest.APIRequest('FakeAction', 'fake_v1',
                                            fakes.DOTTED_FAKE_PARAMS)
        api_request.invoke(self.fake_context)

        self.controller.fake_action.assert_called_once_with(
            self.fake_context, **fakes.DICT_FAKE_PARAMS)
Beispiel #2
0
 def test_render_response_utf8(self):
     req = apirequest.APIRequest("FakeAction", "FakeVersion", {})
     resp = {
         'utf8': unichr(40960) + u'abcd' + unichr(1972)
     }
     data = req._render_response(resp, 'uuid')
     self.assertIn('<utf8>&#40960;abcd&#1972;</utf8>', data)
    def test_xmlns_version_matches_request_version(self):
        self.controller.fake_action.return_value = {}

        api_request = apirequest.APIRequest('FakeAction', '2010-10-30', {})
        result = api_request.invoke(self.fake_context)

        self._compare_aws_xml('FakeActionResponse',
                              'http://ec2.amazonaws.com/doc/2010-10-30/',
                              self.fake_context.request_id, {}, result)
Beispiel #4
0
 def test_render_response_ascii(self):
     req = apirequest.APIRequest("FakeAction", "FakeVersion", {})
     resp = {
         'string': 'foo',
         'int': 1,
     }
     data = req._render_response(resp, 'uuid')
     self.assertIn('<FakeActionResponse xmlns="http://ec2.amazonaws.com/'
                   'doc/FakeVersion/', data)
     self.assertIn('<int>1</int>', data)
     self.assertIn('<string>foo</string>', data)
    def test_invoke_returns_true(self):
        self.controller.fake_action.return_value = True

        api_request = apirequest.APIRequest('FakeAction', 'fake_v1',
                                            {'Param': 'fake'})
        result = api_request.invoke(self.fake_context)

        self._compare_aws_xml('FakeActionResponse',
                              'http://ec2.amazonaws.com/doc/fake_v1/',
                              self.fake_context.request_id, {'return': True},
                              result)
        self.controller.fake_action.assert_called_once_with(self.fake_context,
                                                            param='fake')
    def test_invoke_returns_data(self):
        self.controller.fake_action.return_value = fakes.DICT_FAKE_RESULT_DATA

        api_request = apirequest.APIRequest('FakeAction', 'fake_v1',
                                            {'Param': 'fake'})
        result = api_request.invoke(self.fake_context)

        self._compare_aws_xml('FakeActionResponse',
                              'http://ec2.amazonaws.com/doc/fake_v1/',
                              self.fake_context.request_id,
                              fakes.DICT_FAKE_RESULT_DATA, result)
        self.controller.fake_action.assert_called_once_with(self.fake_context,
                                                            param='fake')
Beispiel #7
0
    def setUp(self):
        super(ApiInitTestCase, self).setUp()
        self.controller = self.mock(
            'ec2api.api.cloud.VpcCloudController').return_value
        self.fake_context = mock.NonCallableMock(
            request_id=context.generate_request_id())

        ec2_request = apirequest.APIRequest('FakeAction', 'fake_v1',
                                            {'Param': 'fake_param'})
        self.environ = {
            'REQUEST_METHOD': 'FAKE',
            'ec2.request': ec2_request,
            'ec2api.context': self.fake_context
        }
        self.request = wsgi.Request(self.environ)
        self.application = api.Executor()
    def setUp(self):
        super(ApiInitTestCase, self).setUp()

        controller_patcher = mock.patch('ec2api.api.cloud.VpcCloudController')
        self.controller_class = controller_patcher.start()
        self.controller = self.controller_class.return_value
        self.addCleanup(controller_patcher.stop)

        self.fake_context = mock.NonCallableMock(request_id=str(uuid.uuid4()))

        ec2_request = apirequest.APIRequest('FakeAction', 'fake_v1',
                                            {'Param': 'fake_param'})
        self.environ = {
            'REQUEST_METHOD': 'FAKE',
            'ec2.request': ec2_request,
            'ec2api.context': self.fake_context
        }
        self.request = wsgi.Request(self.environ)
        self.application = api.Executor()
Beispiel #9
0
    def __call__(self, req):
        non_args = [
            'Action', 'Signature', 'AWSAccessKeyId', 'SignatureMethod',
            'SignatureVersion', 'Version', 'Timestamp'
        ]
        args = dict(req.params)
        try:
            expired = ec2utils.is_ec2_timestamp_expired(
                req.params, expires=CONF.ec2_timestamp_expiry)
            if expired:
                msg = _("Timestamp failed validation.")
                LOG.exception(msg)
                raise webob.exc.HTTPForbidden(explanation=msg)

            # Raise KeyError if omitted
            action = req.params['Action']
            # Fix bug lp:720157 for older (version 1) clients
            version = req.params.get('SignatureVersion')
            if version and int(version) == 1:
                non_args.remove('SignatureMethod')
                if 'SignatureMethod' in args:
                    args.pop('SignatureMethod')
            for non_arg in non_args:
                args.pop(non_arg, None)
        except KeyError:
            raise webob.exc.HTTPBadRequest()
        except exception.InvalidRequest as err:
            raise webob.exc.HTTPBadRequest(explanation=err.format_message())

        LOG.debug('action: %s', action)
        for key, value in args.items():
            LOG.debug('arg: %(key)s\t\tval: %(value)s', {
                'key': key,
                'value': value
            })

        # Success!
        api_request = apirequest.APIRequest(action, req.params['Version'],
                                            args)
        req.environ['ec2.request'] = api_request
        return self.application
    def __call__(self, req):
        non_args = [
            'Action', 'Signature', 'JCSAccessKeyId', 'SignatureMethod',
            'SignatureVersion', 'Version', 'Timestamp'
        ]
        args = dict(req.params)
        success_flag = True
        try:
            expired = ec2utils.is_ec2_timestamp_expired(
                req.params, expires=CONF.ec2_timestamp_expiry)
            if expired:
                msg = _("Timestamp failed validation.")
                LOG.exception(msg)
                raise webob.exc.HTTPForbidden(explanation=msg)

            # Raise KeyError if omitted
            action = req.params['Action']
            # Fix bug lp:720157 for older (version 1) clients
            version = req.params.get('SignatureVersion')
            if version and int(version) == 1:
                non_args.remove('SignatureMethod')
                if 'SignatureMethod' in args:
                    args.pop('SignatureMethod')
            for non_arg in non_args:
                args.pop(non_arg, None)
        except KeyError:
            success_flag = False
            raise webob.exc.HTTPBadRequest()
        except exception.InvalidRequest as err:
            success_flag = False
            raise webob.exc.HTTPBadRequest(explanation=unicode(err))
        finally:
            if not success_flag:
                context = req.environ['ec2api.context']
                metric_dict = {
                    "request_id": getattr(context, "request_id"),
                    "failure": "KeyError"
                }
                actionName = ec2utils.camelcase_to_underscore(
                    req.params.get('Action'))
                metric_logger.logFailure(actionName,
                                         addOnInfoPairs=metric_dict)

        LOG.debug('action: %s', action)
        for key, value in args.items():
            LOG.debug('arg: %(key)s\t\tval: %(value)s', {
                'key': key,
                'value': value
            })

        # Check if sbs_apis.list file is present and if the action
        # belongs in that list
        if self.sbs_apis and action in self.sbs_apis:
            return self._execute_sbs_api(action, args,
                                         req.environ['ec2api.context'])

        # Success!
        api_request = apirequest.APIRequest(action, req.params['Version'],
                                            args)
        req.environ['ec2.request'] = api_request
        return self.application