def test_content_create_busy_retry(self): # Several attempts, service still busy with patch('oio.api.base.HttpApi._direct_request', Mock(side_effect=ServiceBusy(""))): self.assertRaises( ServiceBusy, self.api.container.content_create, self.account, self.container, "test", size=1, data={}, request_attempts=3) # Conflict error at first attempt with patch('oio.api.base.HttpApi._direct_request', Mock(side_effect=Conflict(""))): self.assertRaises( Conflict, self.api.container.content_create, self.account, self.container, "test", size=1, data={}, request_attempts=3) # Service busy followed by Conflict: operation probably # finished in background after the proxy timed out with patch('oio.api.base.HttpApi._direct_request', Mock(side_effect=[ServiceBusy(), Conflict("")])): self.api.container.content_create( self.account, self.container, "test", size=1, data={}, request_attempts=3)
def test_content_create_busy_noretry(self): # Conflict error + no retry configured -> no retry issued with patch( 'oio.api.base.HttpApi._direct_request', Mock(side_effect=[Conflict(""), ServiceBusy("")])): self.assertRaises(Conflict, self.api.container.content_create, self.account, self.container, "test", size=1, data={}) # Service busy + no retry configured -> no retry must be done # and the Conflict side effect is not used. with patch( 'oio.api.base.HttpApi._direct_request', Mock(side_effect=[ServiceBusy(), Conflict("")])): self.assertRaises(ServiceBusy, self.api.container.content_create, self.account, self.container, "test", size=1, data={})
def catch_service_errors_wrapper(*args, **kwargs): try: return func(*args, **kwargs) # Redis exception hierarchy has changed across versions, this is # why we catch several types here. except error_types as err: raise ServiceBusy(message=str(err))