diff --git a/qa/tasks/mgr/dashboard/test_rgw.py b/qa/tasks/mgr/dashboard/test_rgw.py index 3f385f79a27..40a294a80db 100644 --- a/qa/tasks/mgr/dashboard/test_rgw.py +++ b/qa/tasks/mgr/dashboard/test_rgw.py @@ -550,7 +550,7 @@ class RgwUserTest(RgwTestCase): self._delete('/api/rgw/user/teuth-test-user') self.assertStatus(204) self.get_rgw_user('teuth-test-user') - self.assertStatus(500) + self.assertStatus(404) resp = self.jsonBody() self.assertIn('detail', resp) self.assertIn('failed request with status code 404', resp['detail']) @@ -593,7 +593,7 @@ class RgwUserTest(RgwTestCase): self._delete('/api/rgw/user/test01$teuth-test-user') self.assertStatus(204) self.get_rgw_user('test01$teuth-test-user') - self.assertStatus(500) + self.assertStatus(404) resp = self.jsonBody() self.assertIn('detail', resp) self.assertIn('failed request with status code 404', resp['detail']) diff --git a/src/pybind/mgr/dashboard/controllers/rgw.py b/src/pybind/mgr/dashboard/controllers/rgw.py index a0ef6965771..c7f22103bd7 100755 --- a/src/pybind/mgr/dashboard/controllers/rgw.py +++ b/src/pybind/mgr/dashboard/controllers/rgw.py @@ -394,7 +394,11 @@ class RgwRESTController(RESTController): result = json_str_to_object(result) return result except (DashboardException, RequestException) as e: - http_status_code = e.status if isinstance(e, DashboardException) else 500 + response = getattr(e, 'response', None) + if isinstance(e, RequestException) and response is not None: + http_status_code = getattr(response, 'status_code', 500) + else: + http_status_code = getattr(e, 'status_code', getattr(e, 'status', None)) or 500 raise DashboardException(e, http_status_code=http_status_code, component='rgw') diff --git a/src/pybind/mgr/dashboard/tests/test_rgw.py b/src/pybind/mgr/dashboard/tests/test_rgw.py index 609d5388fc4..a1e37e6110b 100644 --- a/src/pybind/mgr/dashboard/tests/test_rgw.py +++ b/src/pybind/mgr/dashboard/tests/test_rgw.py @@ -2,7 +2,7 @@ from unittest.mock import Mock, call, patch from .. import mgr -from ..controllers.rgw import Rgw, RgwDaemon, RgwTopic, RgwUser +from ..controllers.rgw import Rgw, RgwBucket, RgwDaemon, RgwTopic, RgwUser from ..rest_client import RequestException from ..services.rgw_client import RgwClient, RgwMultisite from ..tests import ControllerTestCase, RgwStub @@ -600,3 +600,51 @@ class TestRgwTopicController(ControllerTestCase): result = controller.delete(key='RGW22222222222222222:HttpTest') mock_delete_topic.assert_called_with(key='RGW22222222222222222:HttpTest') self.assertEqual(result, None) + + +class RgwBucketControllerTestCase(ControllerTestCase): + @classmethod + def setup_server(cls): + cls.setup_controllers([RgwBucket], '/test') + + @patch('dashboard.services.rgw_client.RgwClient.admin_instance') + def test_get_bucket_not_found(self, mock_admin_instance): + mock_instance = Mock() + mock_admin_instance.return_value = mock_instance + + mock_response = Mock() + mock_response.status_code = 404 + mock_exception = RequestException('RGW REST API failed request') + mock_exception.response = mock_response + mock_instance.proxy.side_effect = mock_exception + + self._get('/test/api/rgw/bucket/i-do-not-exist') + self.assertStatus(404) + + @patch('dashboard.services.rgw_client.RgwClient.admin_instance') + def test_get_bucket_not_found_with_fallback_attribute(self, mock_admin_instance): + + mock_instance = Mock() + mock_admin_instance.return_value = mock_instance + + # mock that lacks a .response but has a direct .status_code attribute. + mock_exception = RequestException('RGW REST API failed request') + mock_exception.status_code = 404 + + mock_instance.proxy.side_effect = mock_exception + + self._get('/test/api/rgw/bucket/i-do-not-exist') + self.assertStatus(404) + + @patch('dashboard.services.rgw_client.RgwClient.admin_instance') + def test_get_bucket_server_error(self, mock_admin_instance): + mock_instance = Mock() + mock_admin_instance.return_value = mock_instance + + mock_exception = RequestException('Internal Server Error') + mock_exception.status_code = 500 + + mock_instance.proxy.side_effect = mock_exception + + self._get('/test/api/rgw/bucket/i-do-not-exist') + self.assertStatus(500)