Reraise exception with converting node ID

When a requested trait doesn't exist at trait deletion, the API
response contains an internal node ID, which shouldn't be exposed.
This patch reraises an exception with a node identifier specified to
the API.

Change-Id: I781a510b25fa7de735c97b4ed919dfcb3adbdd2c
Story: 2002062
Task: 19715
This commit is contained in:
Hironori Shiina 2018-05-21 18:32:50 +09:00
parent 75cd526bad
commit bae9e82e67
3 changed files with 17 additions and 3 deletions

View File

@ -865,8 +865,13 @@ class NodeTraitsController(rest.RestController):
with notify.handle_error_notification(context, node, 'update', with notify.handle_error_notification(context, node, 'update',
chassis_uuid=chassis_uuid): chassis_uuid=chassis_uuid):
topic = pecan.request.rpcapi.get_topic_for(node) topic = pecan.request.rpcapi.get_topic_for(node)
pecan.request.rpcapi.remove_node_traits( try:
context, node.id, traits, topic=topic) pecan.request.rpcapi.remove_node_traits(
context, node.id, traits, topic=topic)
except exception.NodeTraitNotFound:
# NOTE(hshiina): Internal node ID should not be exposed.
raise exception.NodeTraitNotFound(node_id=node.uuid,
trait=trait)
notify.emit_end_notification(context, node, 'update', notify.emit_end_notification(context, node, 'update',
chassis_uuid=chassis_uuid) chassis_uuid=chassis_uuid)

View File

@ -4846,11 +4846,13 @@ class TestTraits(test_api_base.BaseApiTest):
def test_delete_trait_fails_if_trait_not_found(self, mock_notify, def test_delete_trait_fails_if_trait_not_found(self, mock_notify,
mock_remove): mock_remove):
mock_remove.side_effect = exception.NodeTraitNotFound( mock_remove.side_effect = exception.NodeTraitNotFound(
node_id=self.node.uuid, trait='CUSTOM_12') node_id=self.node.id, trait='CUSTOM_12')
ret = self.delete('/nodes/%s/traits/CUSTOM_12' % self.node.name, ret = self.delete('/nodes/%s/traits/CUSTOM_12' % self.node.name,
headers={api_base.Version.string: self.version}, headers={api_base.Version.string: self.version},
expect_errors=True) expect_errors=True)
self.assertEqual(http_client.NOT_FOUND, ret.status_code) self.assertEqual(http_client.NOT_FOUND, ret.status_code)
self.assertIn(self.node.uuid, ret.json['error_message'])
self.assertNotIn(self.node.id, ret.json['error_message'])
mock_remove.assert_called_once_with(mock.ANY, self.node.id, mock_remove.assert_called_once_with(mock.ANY, self.node.id,
['CUSTOM_12'], topic='test-topic') ['CUSTOM_12'], topic='test-topic')
mock_notify.assert_has_calls( mock_notify.assert_has_calls(

View File

@ -0,0 +1,7 @@
---
fixes:
- |
Fixes a bug that exposes an internal node ID in an error message when
requested to delete a trait which doesn't exist. See
`bug 2002062 <https://storyboard.openstack.org/#!/story/2002062>`_ for
details.