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)
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>ꀀabcd޴</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)
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')
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()
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