diff --git a/ironic/api/middleware/parsable_error.py b/ironic/api/middleware/parsable_error.py index 6e742c06925..37e7137a7e6 100644 --- a/ironic/api/middleware/parsable_error.py +++ b/ironic/api/middleware/parsable_error.py @@ -64,6 +64,11 @@ class ParsableErrorMiddleware(object): state['headers'] = headers return start_response(status, headers, exc_info) + # The default for ironic is application/json. However, Pecan will try + # to output HTML errors if no Accept header is provided. + if 'HTTP_ACCEPT' not in environ or environ['HTTP_ACCEPT'] == '*/*': + environ['HTTP_ACCEPT'] = 'application/json' + app_iter = self.app(environ, replacement_start_response) if (state['status_code'] // 100) not in (2, 3): req = webob.Request(environ) diff --git a/ironic/tests/unit/api/controllers/v1/test_portgroup.py b/ironic/tests/unit/api/controllers/v1/test_portgroup.py index 38cd447d55e..cefe8d48124 100644 --- a/ironic/tests/unit/api/controllers/v1/test_portgroup.py +++ b/ironic/tests/unit/api/controllers/v1/test_portgroup.py @@ -400,8 +400,7 @@ class TestListPortgroups(test_api_base.BaseApiTest): expect_errors=True, headers={api_base.Version.string: '1.23'}) self.assertEqual(http_client.NOT_FOUND, response.status_int) - self.assertIn('The resource could not be found.', - response.json['error_message']) + self.assertIn('Not Found', response.json['error_message']) def test_ports_subresource_portgroup_not_found(self): non_existent_uuid = 'eeeeeeee-cccc-aaaa-bbbb-cccccccccccc' diff --git a/ironic/tests/unit/api/test_root.py b/ironic/tests/unit/api/test_root.py index 3ca47fae45f..bb70a0c8308 100644 --- a/ironic/tests/unit/api/test_root.py +++ b/ironic/tests/unit/api/test_root.py @@ -13,6 +13,8 @@ # License for the specific language governing permissions and limitations # under the License. +from six.moves import http_client + from ironic.api.controllers.v1 import versions from ironic.tests.unit.api import base @@ -35,6 +37,18 @@ class TestRoot(base.BaseApiTest): version1['min_version']) self.assertEqual(versions.max_version_string(), version1['version']) + def test_no_html_errors(self): + response = self.get_json('/foo', expect_errors=True) + self.assertEqual(http_client.NOT_FOUND, response.status_int) + self.assertIn('Not Found', response.json['error_message']) + self.assertNotIn('