Merge "Fix improper HTTP status code usage (RFC 7231)"
This commit is contained in:
@@ -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:
|
||||
|
@@ -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)
|
||||
|
@@ -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)
|
||||
|
@@ -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)
|
||||
|
@@ -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)
|
||||
|
@@ -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)
|
||||
|
@@ -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)
|
||||
|
@@ -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)
|
||||
|
@@ -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,
|
||||
|
Reference in New Issue
Block a user