From c09525dd81b75884f6e2c2a19e3b04416e3ff08e Mon Sep 17 00:00:00 2001 From: cid Date: Tue, 8 Oct 2024 11:20:15 +0100 Subject: [PATCH] Gracefully handle bad request exception Closes-Bug: #1619235 Change-Id: I156ba389e437c49ae75411cfbf0e29bcd54733bc --- ironic/api/controllers/v1/node.py | 3 ++- ironic/api/controllers/v1/portgroup.py | 2 ++ ironic/tests/unit/api/controllers/v1/test_node.py | 14 ++++++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/ironic/api/controllers/v1/node.py b/ironic/api/controllers/v1/node.py index 605d409c81..f2a9905973 100644 --- a/ironic/api/controllers/v1/node.py +++ b/ironic/api/controllers/v1/node.py @@ -2345,7 +2345,6 @@ class NodesController(rest.RestController): @pecan.expose() def _lookup(self, ident, *remainder): - if ident in self._subcontroller_map: pecan.abort(http_client.NOT_FOUND) @@ -2353,6 +2352,8 @@ class NodesController(rest.RestController): ident = args.uuid_or_name('node', ident) except exception.InvalidParameterValue as e: pecan.abort(http_client.BAD_REQUEST, e.args[0]) + except exception.InvalidUuidOrName as e: + pecan.abort(http_client.BAD_REQUEST, e.args[0]) if not remainder: return if ((remainder[0] == 'portgroups' diff --git a/ironic/api/controllers/v1/portgroup.py b/ironic/api/controllers/v1/portgroup.py index 91740d3c74..9feace8ea5 100644 --- a/ironic/api/controllers/v1/portgroup.py +++ b/ironic/api/controllers/v1/portgroup.py @@ -147,6 +147,8 @@ class PortgroupsController(pecan.rest.RestController): ident = args.uuid_or_name('portgroup', ident) except exception.InvalidParameterValue as e: pecan.abort(http_client.BAD_REQUEST, e.args[0]) + except exception.InvalidUuidOrName as e: + pecan.abort(http_client.BAD_REQUEST, e.args[0]) if not remainder: return subcontroller = self._subcontroller_map.get(remainder[0]) diff --git a/ironic/tests/unit/api/controllers/v1/test_node.py b/ironic/tests/unit/api/controllers/v1/test_node.py index f0804f7f52..b169b34056 100644 --- a/ironic/tests/unit/api/controllers/v1/test_node.py +++ b/ironic/tests/unit/api/controllers/v1/test_node.py @@ -2581,6 +2581,20 @@ class TestListNodes(test_api_base.BaseApiTest): mock_vdi.assert_called_once_with(mock.ANY, mock.ANY, node.uuid, 'test-topic') + @mock.patch.object(api_utils, 'get_rpc_node', autospec=True) + def test_validate_invalid_uuid_or_name(self, mock_rpc_node): + invalid_ident = '1234~1234~1234' + mock_rpc_node.side_effect = exception.InvalidUuidOrName( + name=invalid_ident) + + ret = self.get_json('/nodes/%s' % invalid_ident, + headers={api_base.Version.string: "1.5"}, + expect_errors=True) + + self.assertEqual(http_client.BAD_REQUEST, ret.status_code) + self.assertIn('Expected a logical name or UUID', + ret.json['error_message']) + @mock.patch.object(rpcapi.ConductorAPI, 'get_indicator_state', autospec=True) def test_get_indicator_state(self, mock_gis):