def _register_endpoint_discovery(self, client, endpoint_url, config): if endpoint_url is not None: # Don't register any handlers in the case of a custom endpoint url return # Only attach handlers if the service supports discovery if client.meta.service_model.endpoint_discovery_operation is None: return events = client.meta.events service_id = client.meta.service_model.service_id.hyphenize() enabled = False if config and config.endpoint_discovery_enabled is not None: enabled = config.endpoint_discovery_enabled elif self._config_store: enabled = self._config_store.get_config_variable( 'endpoint_discovery_enabled') enabled = self._normalize_endpoint_discovery_config(enabled) if enabled and self._requires_endpoint_discovery(client, enabled): discover = enabled is True manager = EndpointDiscoveryManager(client, always_discover=discover) handler = EndpointDiscoveryHandler(manager) handler.register(events, service_id) else: events.register('before-parameter-build', block_endpoint_discovery_required_operations)
def _register_endpoint_discovery(self, client, endpoint_url, config): if endpoint_url is not None: # Don't register any handlers in the case of a custom endpoint url return # Only attach handlers if the service supports discovery if client.meta.service_model.endpoint_discovery_operation is None: return events = client.meta.events service_id = client.meta.service_model.service_id.hyphenize() enabled = False if config and config.endpoint_discovery_enabled is not None: enabled = config.endpoint_discovery_enabled elif self._config_store: enabled = self._config_store.get_config_variable( 'endpoint_discovery_enabled') if enabled: manager = EndpointDiscoveryManager(client) handler = EndpointDiscoveryHandler(manager) handler.register(events, service_id) else: events.register('before-parameter-build', block_endpoint_discovery_required_operations)
def setUp(self): super(TestEndpointDiscoveryHandler, self).setUp() self.manager = mock.Mock(spec=EndpointDiscoveryManager) self.handler = EndpointDiscoveryHandler(self.manager) self.service_model = ServiceModel(self.service_description)
class TestEndpointDiscoveryHandler(BaseEndpointDiscoveryTest): def setUp(self): super(TestEndpointDiscoveryHandler, self).setUp() self.manager = mock.Mock(spec=EndpointDiscoveryManager) self.handler = EndpointDiscoveryHandler(self.manager) self.service_model = ServiceModel(self.service_description) def test_register_handler(self): events = mock.Mock(spec=HierarchicalEmitter) self.handler.register(events, 'foo-bar') events.register.assert_any_call('before-parameter-build.foo-bar', self.handler.gather_identifiers) events.register.assert_any_call('needs-retry.foo-bar', self.handler.handle_retries) events.register_first.assert_called_with( 'request-created.foo-bar', self.handler.discover_endpoint) def test_discover_endpoint(self): request = AWSRequest() request.context = {'discovery': {'identifiers': {}}} self.manager.describe_endpoint.return_value = 'https://new.foo' self.handler.discover_endpoint(request, 'TestOperation') self.assertEqual(request.url, 'https://new.foo') self.manager.describe_endpoint.assert_called_with( Operation='TestOperation', Identifiers={}) def test_discover_endpoint_fails(self): request = AWSRequest() request.context = {'discovery': {'identifiers': {}}} request.url = 'old.com' self.manager.describe_endpoint.return_value = None self.handler.discover_endpoint(request, 'TestOperation') self.assertEqual(request.url, 'old.com') self.manager.describe_endpoint.assert_called_with( Operation='TestOperation', Identifiers={}) def test_discover_endpoint_no_protocol(self): request = AWSRequest() request.context = {'discovery': {'identifiers': {}}} self.manager.describe_endpoint.return_value = 'new.foo' self.handler.discover_endpoint(request, 'TestOperation') self.assertEqual(request.url, 'https://new.foo') self.manager.describe_endpoint.assert_called_with( Operation='TestOperation', Identifiers={}) def test_inject_no_context(self): request = AWSRequest(url='https://original.foo') self.handler.discover_endpoint(request, 'TestOperation') self.assertEqual(request.url, 'https://original.foo') self.manager.describe_endpoint.assert_not_called() def test_gather_identifiers(self): context = {} params = {'Foo': 'value1', 'Nested': {'Bar': 'value2'}} ids = {'Foo': 'value1', 'Bar': 'value2'} model = self.service_model.operation_model('TestDiscoveryRequired') self.manager.gather_identifiers.return_value = ids self.handler.gather_identifiers(params, model, context) self.assertEqual(context['discovery']['identifiers'], ids) def test_gather_identifiers_not_discoverable(self): context = {} model = self.service_model.operation_model('DescribeEndpoints') self.handler.gather_identifiers({}, model, context) self.assertEqual(context, {}) def test_discovery_disabled_but_required(self): model = self.service_model.operation_model('TestDiscoveryRequired') with self.assertRaises(EndpointDiscoveryRequired): block_endpoint_discovery_required_operations(model) def test_discovery_disabled_but_optional(self): context = {} model = self.service_model.operation_model('TestDiscoveryOptional') block_endpoint_discovery_required_operations(model, context=context) self.assertEqual(context, {}) def test_does_not_retry_no_response(self): retry = self.handler.handle_retries(None, None, None) self.assertIsNone(retry) def test_does_not_retry_other_errors(self): parsed_response = {'ResponseMetadata': {'HTTPStatusCode': 200}} response = (None, parsed_response) retry = self.handler.handle_retries(None, response, None) self.assertIsNone(retry) def test_does_not_retry_if_no_context(self): request_dict = {'context': {}} parsed_response = {'ResponseMetadata': {'HTTPStatusCode': 421}} response = (None, parsed_response) retry = self.handler.handle_retries(request_dict, response, None) self.assertIsNone(retry) def _assert_retries(self, parsed_response): request_dict = {'context': {'discovery': {'identifiers': {}}}} response = (None, parsed_response) model = self.service_model.operation_model('TestDiscoveryOptional') retry = self.handler.handle_retries(request_dict, response, model) self.assertEqual(retry, 0) self.manager.delete_endpoints.assert_called_with( Operation='TestDiscoveryOptional', Identifiers={}) def test_retries_421_status_code(self): parsed_response = {'ResponseMetadata': {'HTTPStatusCode': 421}} self._assert_retries(parsed_response) def test_retries_invalid_endpoint_exception(self): parsed_response = {'Error': {'Code': 'InvalidEndpointException'}} self._assert_retries(parsed_response)
def setUp(self): super(TestEndpointDiscoveryHandler, self).setUp() self.manager = Mock(spec=EndpointDiscoveryManager) self.handler = EndpointDiscoveryHandler(self.manager) self.service_model = ServiceModel(self.service_description)
class TestEndpointDiscoveryHandler(BaseEndpointDiscoveryTest): def setUp(self): super(TestEndpointDiscoveryHandler, self).setUp() self.manager = Mock(spec=EndpointDiscoveryManager) self.handler = EndpointDiscoveryHandler(self.manager) self.service_model = ServiceModel(self.service_description) def test_register_handler(self): events = Mock(spec=HierarchicalEmitter) self.handler.register(events, 'foo-bar') events.register.assert_any_call( 'before-parameter-build.foo-bar', self.handler.gather_identifiers ) events.register.assert_any_call( 'needs-retry.foo-bar', self.handler.handle_retries ) events.register_first.assert_called_with( 'request-created.foo-bar', self.handler.discover_endpoint ) def test_discover_endpoint(self): request = AWSRequest() request.context = { 'discovery': {'identifiers': {}} } self.manager.describe_endpoint.return_value = 'https://new.foo' self.handler.discover_endpoint(request, 'TestOperation') self.assertEqual(request.url, 'https://new.foo') self.manager.describe_endpoint.assert_called_with( Operation='TestOperation', Identifiers={} ) def test_discover_endpoint_fails(self): request = AWSRequest() request.context = { 'discovery': {'identifiers': {}} } request.url = 'old.com' self.manager.describe_endpoint.return_value = None self.handler.discover_endpoint(request, 'TestOperation') self.assertEqual(request.url, 'old.com') self.manager.describe_endpoint.assert_called_with( Operation='TestOperation', Identifiers={} ) def test_discover_endpoint_no_protocol(self): request = AWSRequest() request.context = { 'discovery': {'identifiers': {}} } self.manager.describe_endpoint.return_value = 'new.foo' self.handler.discover_endpoint(request, 'TestOperation') self.assertEqual(request.url, 'https://new.foo') self.manager.describe_endpoint.assert_called_with( Operation='TestOperation', Identifiers={} ) def test_inject_no_context(self): request = AWSRequest(url='https://original.foo') self.handler.discover_endpoint(request, 'TestOperation') self.assertEqual(request.url, 'https://original.foo') self.manager.describe_endpoint.assert_not_called() def test_gather_identifiers(self): context = {} params = { 'Foo': 'value1', 'Nested': {'Bar': 'value2'} } ids = { 'Foo': 'value1', 'Bar': 'value2' } model = self.service_model.operation_model('TestDiscoveryRequired') self.manager.gather_identifiers.return_value = ids self.handler.gather_identifiers(params, model, context) self.assertEqual(context['discovery']['identifiers'], ids) def test_gather_identifiers_not_discoverable(self): context = {} model = self.service_model.operation_model('DescribeEndpoints') self.handler.gather_identifiers({}, model, context) self.assertEqual(context, {}) def test_discovery_disabled_but_required(self): model = self.service_model.operation_model('TestDiscoveryRequired') with self.assertRaises(EndpointDiscoveryRequired): block_endpoint_discovery_required_operations(model) def test_discovery_disabled_but_optional(self): context = {} model = self.service_model.operation_model('TestDiscoveryOptional') block_endpoint_discovery_required_operations(model, context=context) self.assertEqual(context, {}) def test_does_not_retry_no_response(self): retry = self.handler.handle_retries(None, None, None) self.assertIsNone(retry) def test_does_not_retry_other_errors(self): parsed_response = { 'ResponseMetadata': {'HTTPStatusCode': 200} } response = (None, parsed_response) retry = self.handler.handle_retries(None, response, None) self.assertIsNone(retry) def test_does_not_retry_if_no_context(self): request_dict = {'context': {}} parsed_response = { 'ResponseMetadata': {'HTTPStatusCode': 421} } response = (None, parsed_response) retry = self.handler.handle_retries(request_dict, response, None) self.assertIsNone(retry) def _assert_retries(self, parsed_response): request_dict = { 'context': { 'discovery': {'identifiers': {}} } } response = (None, parsed_response) model = self.service_model.operation_model('TestDiscoveryOptional') retry = self.handler.handle_retries(request_dict, response, model) self.assertEqual(retry, 0) self.manager.delete_endpoints.assert_called_with( Operation='TestDiscoveryOptional', Identifiers={} ) def test_retries_421_status_code(self): parsed_response = { 'ResponseMetadata': {'HTTPStatusCode': 421} } self._assert_retries(parsed_response) def test_retries_invalid_endpoint_exception(self): parsed_response = {'Error': {'Code': 'InvalidEndpointException'}} self._assert_retries(parsed_response)