Merge "Fix improper HTTP status code usage (RFC 7231)"

This commit is contained in:
Zuul
2025-08-26 12:27:37 +00:00
committed by Gerrit Code Review
9 changed files with 48 additions and 48 deletions

View File

@@ -2870,7 +2870,7 @@ class NodesController(rest.RestController):
of the resource to be returned.
"""
if self.from_chassis:
raise exception.OperationNotPermitted()
raise exception.Invalid(_("Malformed request URI."))
rpc_node = api_utils.check_node_policy_and_retrieve(
'baremetal:node:get', node_ident, with_suffix=True)
@@ -2896,7 +2896,7 @@ class NodesController(rest.RestController):
:language: javascript
"""
if self.from_chassis:
raise exception.OperationNotPermitted()
raise exception.Invalid(_("Malformed request URI."))
node_capabilities = node.get('properties', {}).get('capabilities', '')
# ``check_allow_boot_mode`` expects ``node_capabilities`` to be a list
@@ -2997,7 +2997,7 @@ class NodesController(rest.RestController):
def _validate_patch(self, patch, reset_interfaces):
corrected_values = {}
if self.from_chassis:
raise exception.OperationNotPermitted()
raise exception.Invalid(_("Malformed request URI."))
node_capabilities = api_utils.get_patch_values(
patch, '/properties/capabilities')
@@ -3253,7 +3253,7 @@ class NodesController(rest.RestController):
raise exception.NotFound()
if self.from_chassis:
raise exception.OperationNotPermitted()
raise exception.Invalid(_("Malformed request URI."))
context = api.request.context
try:

View File

@@ -589,7 +589,7 @@ class PortsController(rest.RestController):
:raises: NotAcceptable, HTTPNotFound
"""
if self.parent_node_ident or self.parent_portgroup_ident:
raise exception.OperationNotPermitted()
raise exception.Invalid(_("Malformed request URI."))
rpc_port, rpc_node = api_utils.check_port_policy_and_retrieve(
'baremetal:port:get', port_ident)
@@ -610,7 +610,7 @@ class PortsController(rest.RestController):
:raises: NotAcceptable, HTTPNotFound, Conflict
"""
if self.parent_node_ident or self.parent_portgroup_ident:
raise exception.OperationNotPermitted()
raise exception.Invalid(_("Malformed request URI."))
# NOTE(lucasagomes): Create the node_id attribute on-the-fly
# to satisfy the api -> rpc object
@@ -732,7 +732,7 @@ class PortsController(rest.RestController):
:raises: NotAcceptable, HTTPNotFound
"""
if self.parent_node_ident or self.parent_portgroup_ident:
raise exception.OperationNotPermitted()
raise exception.Invalid(_("Malformed request URI."))
api_utils.patch_validate_allowed_fields(patch, PATCH_ALLOWED_FIELDS)
@@ -842,10 +842,10 @@ class PortsController(rest.RestController):
"""Delete a port.
:param port_uuid: UUID of a port.
:raises: OperationNotPermitted, HTTPNotFound
:raises: Invalid, HTTPNotFound
"""
if self.parent_node_ident or self.parent_portgroup_ident:
raise exception.OperationNotPermitted()
raise exception.Invalid(_("Malformed request URI."))
rpc_port, rpc_node = api_utils.check_port_policy_and_retrieve(
'baremetal:port:delete', port_uuid)

View File

@@ -364,7 +364,7 @@ class PortgroupsController(pecan.rest.RestController):
'baremetal:portgroup:get', portgroup_ident, portgroup=True)
if self.parent_node_ident:
raise exception.OperationNotPermitted()
raise exception.Invalid(_("Malformed request URI."))
api_utils.check_allowed_portgroup_fields(fields)
@@ -411,7 +411,7 @@ class PortgroupsController(pecan.rest.RestController):
context = api.request.context
if self.parent_node_ident:
raise exception.OperationNotPermitted()
raise exception.Invalid(_("Malformed request URI."))
if (not api_utils.allow_portgroup_mode_properties()
and (portgroup.get('mode') or portgroup.get('properties'))):
@@ -462,7 +462,7 @@ class PortgroupsController(pecan.rest.RestController):
'baremetal:portgroup:update', portgroup_ident, portgroup=True)
if self.parent_node_ident:
raise exception.OperationNotPermitted()
raise exception.Invalid(_("Malformed request URI."))
if (not api_utils.allow_portgroup_mode_properties()
and (api_utils.is_path_updated(patch, '/mode')
@@ -554,7 +554,7 @@ class PortgroupsController(pecan.rest.RestController):
context = api.request.context
if self.parent_node_ident:
raise exception.OperationNotPermitted()
raise exception.Invalid(_("Malformed request URI."))
notify.emit_start_notification(context, rpc_portgroup, 'delete',
node_uuid=rpc_node.uuid)

View File

@@ -209,7 +209,7 @@ class VolumeConnectorsController(rest.RestController):
:returns: API-serializable volume connector object.
:raises: OperationNotPermitted if accessed with specifying a parent
:raises: Invalid if accessed with specifying a parent
node.
:raises: VolumeConnectorNotFound if no volume connector exists with
the specified UUID.
@@ -221,7 +221,7 @@ class VolumeConnectorsController(rest.RestController):
target=False)
if self.parent_node_ident:
raise exception.OperationNotPermitted()
raise exception.Invalid(_("Malformed request URI."))
return convert_with_links(rpc_connector, fields=fields)
@@ -236,7 +236,7 @@ class VolumeConnectorsController(rest.RestController):
:returns: API-serializable volume connector object.
:raises: OperationNotPermitted if accessed with specifying a parent
:raises: Invalid if accessed with specifying a parent
node.
:raises: VolumeConnectorTypeAndIdAlreadyExists if a volume
connector already exists with the same type and connector_id
@@ -263,7 +263,7 @@ class VolumeConnectorsController(rest.RestController):
value=node_uuid)
if self.parent_node_ident:
raise exception.OperationNotPermitted()
raise exception.Invalid(_("Malformed request URI."))
# NOTE(hshiina): UUID is mandatory for notification payload
if not connector.get('uuid'):
@@ -296,7 +296,7 @@ class VolumeConnectorsController(rest.RestController):
:returns: API-serializable volume connector object.
:raises: OperationNotPermitted if accessed with specifying a
:raises: Invalid if accessed with specifying a
parent node.
:raises: PatchError if a given patch can not be applied.
:raises: VolumeConnectorNotFound if no volume connector exists with
@@ -321,7 +321,7 @@ class VolumeConnectorsController(rest.RestController):
target=False)
if self.parent_node_ident:
raise exception.OperationNotPermitted()
raise exception.Invalid(_("Malformed request URI."))
api_utils.patch_validate_allowed_fields(patch, PATCH_ALLOWED_FIELDS)
@@ -380,7 +380,7 @@ class VolumeConnectorsController(rest.RestController):
:param connector_uuid: UUID of a volume connector.
:raises: OperationNotPermitted if accessed with specifying a
:raises: Invalid if accessed with specifying a
parent node.
:raises: NodeLocked if node is locked by another conductor
:raises: NodeNotFound if the node associated with the connector does
@@ -397,7 +397,7 @@ class VolumeConnectorsController(rest.RestController):
connector_uuid,
target=False)
if self.parent_node_ident:
raise exception.OperationNotPermitted()
raise exception.Invalid(_("Malformed request URI."))
notify.emit_start_notification(context, rpc_connector, 'delete',
node_uuid=rpc_node.uuid)

View File

@@ -239,7 +239,7 @@ class VolumeTargetsController(rest.RestController):
:returns: API-serializable volume target object.
:raises: OperationNotPermitted if accessed with specifying a parent
:raises: Invalid if accessed with specifying a parent
node.
:raises: VolumeTargetNotFound if no volume target with this UUID exists
"""
@@ -250,7 +250,7 @@ class VolumeTargetsController(rest.RestController):
target=True)
if self.parent_node_ident:
raise exception.OperationNotPermitted()
raise exception.Invalid(_("Malformed request URI."))
cdict = api.request.context.to_policy_values()
if not policy.check_policy('baremetal:volume:view_target_properties',
@@ -270,7 +270,7 @@ class VolumeTargetsController(rest.RestController):
:returns: API-serializable volume target object.
:raises: OperationNotPermitted if accessed with specifying a parent
:raises: Invalid if accessed with specifying a parent
node.
:raises: VolumeTargetBootIndexAlreadyExists if a volume target already
exists with the same node ID and boot index
@@ -297,7 +297,7 @@ class VolumeTargetsController(rest.RestController):
value=node_uuid)
if self.parent_node_ident:
raise exception.OperationNotPermitted()
raise exception.Invalid(_("Malformed request URI."))
# NOTE(hshiina): UUID is mandatory for notification payload
if not target.get('uuid'):
@@ -328,7 +328,7 @@ class VolumeTargetsController(rest.RestController):
:returns: API-serializable volume target object.
:raises: OperationNotPermitted if accessed with specifying a
:raises: Invalid if accessed with specifying a
parent node.
:raises: PatchError if a given patch can not be applied.
:raises: InvalidParameterValue if the volume target's UUID is being
@@ -350,7 +350,7 @@ class VolumeTargetsController(rest.RestController):
target=True)
if self.parent_node_ident:
raise exception.OperationNotPermitted()
raise exception.Invalid(_("Malformed request URI."))
api_utils.patch_validate_allowed_fields(patch, PATCH_ALLOWED_FIELDS)
@@ -414,7 +414,7 @@ class VolumeTargetsController(rest.RestController):
:param target_uuid: UUID of a volume target.
:raises: OperationNotPermitted if accessed with specifying a
:raises: Invalid if accessed with specifying a
parent node.
:raises: NodeLocked if node is locked by another conductor
:raises: NodeNotFound if the node associated with the target does
@@ -430,7 +430,7 @@ class VolumeTargetsController(rest.RestController):
target=True)
if self.parent_node_ident:
raise exception.OperationNotPermitted()
raise exception.Invalid(_("Malformed request URI."))
rpc_target = objects.VolumeTarget.get_by_uuid(context, target_uuid)
rpc_node = objects.Node.get_by_id(context, rpc_target.node_id)

View File

@@ -458,7 +458,7 @@ class TestPatch(test_api_base.BaseApiTest):
response = self.patch_json('/chassis/%s/nodes' % chassis.uuid,
[{'path': '/extra/foo', 'value': 'bar',
'op': 'add'}], expect_errors=True)
self.assertEqual(http_client.FORBIDDEN, response.status_int)
self.assertEqual(http_client.BAD_REQUEST, response.status_int)
def test_remove_uuid(self):
chassis = obj_utils.get_test_chassis(self.context)
@@ -544,7 +544,7 @@ class TestPost(test_api_base.BaseApiTest):
ndict['chassis_uuid'] = chassis.uuid
response = self.post_json('/chassis/nodes', ndict,
expect_errors=True)
self.assertEqual(http_client.FORBIDDEN, response.status_int)
self.assertEqual(http_client.BAD_REQUEST, response.status_int)
def test_create_chassis_valid_extra(self):
cdict = apiutils.chassis_post_data(extra={'str': 'foo', 'int': 123,
@@ -629,4 +629,4 @@ class TestDelete(test_api_base.BaseApiTest):
chassis = obj_utils.create_test_chassis(self.context)
response = self.delete('/chassis/%s/nodes' % chassis.uuid,
expect_errors=True)
self.assertEqual(http_client.FORBIDDEN, response.status_int)
self.assertEqual(http_client.BAD_REQUEST, response.status_int)

View File

@@ -3170,7 +3170,7 @@ class TestPatch(test_api_base.BaseApiTest):
self.node.uuid,
[{'path': '/extra/foo', 'value': 'bar',
'op': 'add'}], expect_errors=True)
self.assertEqual(http_client.FORBIDDEN, response.status_int)
self.assertEqual(http_client.BAD_REQUEST, response.status_int)
def test_patch_portgroups_subresource(self):
response = self.patch_json(
@@ -3179,7 +3179,7 @@ class TestPatch(test_api_base.BaseApiTest):
[{'path': '/extra/foo', 'value': 'bar',
'op': 'add'}], expect_errors=True,
headers={'X-OpenStack-Ironic-API-Version': '1.24'})
self.assertEqual(http_client.FORBIDDEN, response.status_int)
self.assertEqual(http_client.BAD_REQUEST, response.status_int)
def test_patch_volume_connectors_subresource_no_connector_id(self):
response = self.patch_json(
@@ -3199,7 +3199,7 @@ class TestPatch(test_api_base.BaseApiTest):
[{'path': '/extra/foo', 'value': 'bar', 'op': 'add'}],
expect_errors=True,
headers={api_base.Version.string: str(api_v1.max_version())})
self.assertEqual(http_client.FORBIDDEN, response.status_int)
self.assertEqual(http_client.BAD_REQUEST, response.status_int)
def test_patch_volume_targets_subresource(self):
target = obj_utils.create_test_volume_target(self.context,
@@ -3210,7 +3210,7 @@ class TestPatch(test_api_base.BaseApiTest):
[{'path': '/extra/foo', 'value': 'bar', 'op': 'add'}],
expect_errors=True,
headers={api_base.Version.string: str(api_v1.max_version())})
self.assertEqual(http_client.FORBIDDEN, response.status_int)
self.assertEqual(http_client.BAD_REQUEST, response.status_int)
def test_remove_uuid(self):
response = self.patch_json('/nodes/%s' % self.node.uuid,
@@ -4933,7 +4933,7 @@ class TestPost(test_api_base.BaseApiTest):
pdict['node_uuid'] = node.uuid
response = self.post_json('/nodes/%s/ports' % node.uuid, pdict,
expect_errors=True)
self.assertEqual(http_client.FORBIDDEN, response.status_int)
self.assertEqual(http_client.BAD_REQUEST, response.status_int)
def test_post_portgroups_subresource(self):
node = obj_utils.create_test_node(self.context)
@@ -4942,7 +4942,7 @@ class TestPost(test_api_base.BaseApiTest):
response = self.post_json(
'/nodes/%s/portgroups' % node.uuid, pgdict, expect_errors=True,
headers={'X-OpenStack-Ironic-API-Version': '1.24'})
self.assertEqual(http_client.FORBIDDEN, response.status_int)
self.assertEqual(http_client.BAD_REQUEST, response.status_int)
def test_post_volume_connectors_subresource_no_node_id(self):
node = obj_utils.create_test_node(self.context)
@@ -4962,7 +4962,7 @@ class TestPost(test_api_base.BaseApiTest):
'/nodes/%s/volume/connectors' % node.uuid, pdict,
expect_errors=True,
headers={api_base.Version.string: str(api_v1.max_version())})
self.assertEqual(http_client.FORBIDDEN, response.status_int)
self.assertEqual(http_client.BAD_REQUEST, response.status_int)
def test_post_volume_targets_subresource(self):
node = obj_utils.create_test_node(self.context)
@@ -4972,7 +4972,7 @@ class TestPost(test_api_base.BaseApiTest):
'/nodes/%s/volume/targets' % node.uuid, pdict,
expect_errors=True,
headers={api_base.Version.string: str(api_v1.max_version())})
self.assertEqual(http_client.FORBIDDEN, response.status_int)
self.assertEqual(http_client.BAD_REQUEST, response.status_int)
def test_create_node_no_mandatory_field_driver(self):
ndict = test_api_utils.post_get_test_node()
@@ -5367,7 +5367,7 @@ class TestDelete(test_api_base.BaseApiTest):
'/nodes/%(node_uuid)s/ports/%(port_uuid)s' %
{'node_uuid': node.uuid, 'port_uuid': port.uuid},
expect_errors=True)
self.assertEqual(http_client.FORBIDDEN, response.status_int)
self.assertEqual(http_client.BAD_REQUEST, response.status_int)
def test_delete_portgroup_subresource(self):
node = obj_utils.create_test_node(self.context)
@@ -5377,7 +5377,7 @@ class TestDelete(test_api_base.BaseApiTest):
{'node_uuid': node.uuid, 'pg_uuid': pg.uuid},
expect_errors=True,
headers={'X-OpenStack-Ironic-API-Version': '1.24'})
self.assertEqual(http_client.FORBIDDEN, response.status_int)
self.assertEqual(http_client.BAD_REQUEST, response.status_int)
def test_delete_volume_connectors_subresource_no_connector_id(self):
node = obj_utils.create_test_node(self.context)
@@ -5395,7 +5395,7 @@ class TestDelete(test_api_base.BaseApiTest):
'/nodes/%s/volume/connectors/%s' % (node.uuid, connector.uuid),
expect_errors=True,
headers={api_base.Version.string: str(api_v1.max_version())})
self.assertEqual(http_client.FORBIDDEN, response.status_int)
self.assertEqual(http_client.BAD_REQUEST, response.status_int)
def test_delete_volume_targets_subresource(self):
node = obj_utils.create_test_node(self.context)
@@ -5405,7 +5405,7 @@ class TestDelete(test_api_base.BaseApiTest):
'/nodes/%s/volume/targets/%s' % (node.uuid, target.uuid),
expect_errors=True,
headers={api_base.Version.string: str(api_v1.max_version())})
self.assertEqual(http_client.FORBIDDEN, response.status_int)
self.assertEqual(http_client.BAD_REQUEST, response.status_int)
@mock.patch.object(notification_utils, '_emit_api_notification',
autospec=True)

View File

@@ -1908,7 +1908,7 @@ class TestPatch(test_api_base.BaseApiTest):
{'portgroup': portgroup.uuid, 'port': port.uuid},
[{'path': '/address', 'value': '00:00:00:00:00:00',
'op': 'replace'}], headers=headers, expect_errors=True)
self.assertEqual(http_client.FORBIDDEN, response.status_int)
self.assertEqual(http_client.BAD_REQUEST, response.status_int)
self.assertEqual('application/json', response.content_type)
def test_update_in_inspecting_not_allowed(self, mock_upd):
@@ -2448,7 +2448,7 @@ class TestPost(test_api_base.BaseApiTest):
response = self.post_json('/portgroups/%s/ports' % self.portgroup.uuid,
pdict, headers=headers, expect_errors=True)
self.assertEqual('application/json', response.content_type)
self.assertEqual(http_client.FORBIDDEN, response.status_int)
self.assertEqual(http_client.BAD_REQUEST, response.status_int)
self.assertFalse(mock_create.called)
def _test_create_port(self, mock_create, in_portgroup=False,
@@ -2711,5 +2711,5 @@ class TestDelete(test_api_base.BaseApiTest):
'/portgroups/%(portgroup)s/ports/%(port)s' %
{'portgroup': portgroup.uuid, 'port': port.uuid},
headers=headers, expect_errors=True)
self.assertEqual(http_client.FORBIDDEN, response.status_int)
self.assertEqual(http_client.BAD_REQUEST, response.status_int)
self.assertEqual('application/json', response.content_type)

View File

@@ -410,7 +410,7 @@ class TestListPortgroups(test_api_base.BaseApiTest):
'/portgroups/%s/ports/%s' % (pg.uuid, uuidutils.generate_uuid()),
headers={api_base.Version.string: str(api_v1.max_version())},
expect_errors=True)
self.assertEqual(http_client.FORBIDDEN, response.status_int)
self.assertEqual(http_client.BAD_REQUEST, response.status_int)
def test_ports_subresource_no_portgroups_allowed(self):
pg = obj_utils.create_test_portgroup(self.context,