diff --git a/neutron/api/v2/base.py b/neutron/api/v2/base.py index 80a51dbc86c..18fbe3710b3 100644 --- a/neutron/api/v2/base.py +++ b/neutron/api/v2/base.py @@ -332,6 +332,7 @@ class Controller(object): if hasattr(self, '_nova_notifier'): self._nova_notifier.send_network_change(action, orig, returned) + @db_api.retry_db_errors def index(self, request, **kwargs): """Returns a list of the requested entity.""" parent_id = kwargs.get(self._parent_id_name) @@ -339,6 +340,7 @@ class Controller(object): policy.init() return self._items(request, True, parent_id) + @db_api.retry_db_errors def show(self, request, id, **kwargs): """Returns detailed information about the requested entity.""" try: diff --git a/neutron/tests/unit/api/v2/test_base.py b/neutron/tests/unit/api/v2/test_base.py index beb0c008834..bb0fac7400b 100644 --- a/neutron/tests/unit/api/v2/test_base.py +++ b/neutron/tests/unit/api/v2/test_base.py @@ -17,6 +17,7 @@ import os import mock from oslo_config import cfg +from oslo_db import exception as db_exc from oslo_policy import policy as oslo_policy from oslo_utils import uuidutils import six @@ -1113,6 +1114,20 @@ class JSONV2TestCase(APIv2TestBase, testlib_api.WebTestCase): expect_errors=True) self.assertEqual(400, res.status_int) + def test_retry_on_index(self): + instance = self.plugin.return_value + instance.get_networks.side_effect = [db_exc.RetryRequest(None), []] + api = webtest.TestApp(router.APIRouter()) + api.get(_get_path('networks', fmt=self.fmt)) + self.assertTrue(instance.get_networks.called) + + def test_retry_on_show(self): + instance = self.plugin.return_value + instance.get_network.side_effect = [db_exc.RetryRequest(None), {}] + api = webtest.TestApp(router.APIRouter()) + api.get(_get_path('networks', _uuid(), fmt=self.fmt)) + self.assertTrue(instance.get_network.called) + class SubresourceTest(base.BaseTestCase): def setUp(self):