Return 404 when a secret does not have a payload

Currently when a Secret payload GET is performed, a 500 Error will
be thrown if there is no payload present. The correct behavior
would be to throw a 404.

Change-Id: Ibbe8a592c853fc0196ae7c2daf365754c800fc87
Partial-Bug: #1561701
This commit is contained in:
Fernando Diaz 2016-03-30 03:50:38 +00:00
parent d1c370ed6d
commit d9b5ac8295
3 changed files with 41 additions and 5 deletions

View File

@ -39,6 +39,11 @@ def _secret_not_found():
'another castle.'))
def _secret_payload_not_found():
"""Throw exception indicating secret's payload is not found."""
pecan.abort(404, u._('Not Found. Sorry but your secret has no payload.'))
def _secret_already_has_data():
"""Throw exception that the secret already has data."""
pecan.abort(409, u._("Secret already has data, cannot modify it."))
@ -148,6 +153,11 @@ class SecretController(controllers.ACLMixin):
'application/octet-stream')
pecan.override_template('', accept_header)
# check if payload exists before proceeding
encrypted = getattr(secret, 'encrypted_data')
if not encrypted:
_secret_payload_not_found()
twsk = kwargs.get('trans_wrapped_session_key', None)
transport_key = None
@ -178,11 +188,10 @@ class SecretController(controllers.ACLMixin):
def payload(self, external_project_id, **kwargs):
if pecan.request.method != 'GET':
pecan.abort(405)
resp = self._on_get_secret_payload(
self.secret,
external_project_id,
**kwargs
)
resp = self._on_get_secret_payload(self.secret,
external_project_id,
**kwargs)
LOG.info(u._LI('Retrieved secret payload for project: %s'),
external_project_id)

View File

@ -368,6 +368,18 @@ class WhenGettingPuttingOrDeletingSecret(utils.BarbicanAPIBaseTestCase):
)
self.assertEqual(404, get_resp.status_int)
def test_returns_404_on_get_payload_when_no_payload(self):
resp, secret_uuid = create_secret(self.app)
headers = {
'Accept': 'text/plain',
}
get_resp = self.app.get(
'/secrets/{0}/payload'.format(secret_uuid),
headers=headers,
expect_errors=True
)
self.assertEqual(404, get_resp.status_int)
def test_returns_404_on_get_with_bad_uuid(self):
get_resp = self.app.get(
'/secrets/98c876d9-aaac-44e4-8ea8-441932962b05X',

View File

@ -185,6 +185,21 @@ class SecretsTestCase(base.TestCase):
resp = self.behaviors.get_secret_metadata('not_a_uuid')
self.assertEqual(resp.status_code, 404)
@testcase.attr('negative')
def test_secret_get_secret_payload_doesnt_exist(self):
"""GET a non-existent payload.
Should return a 404.
"""
test_model = secret_models.SecretModel(
**self.default_secret_create_all_none_data)
resp, secret_ref = self.behaviors.create_secret(test_model)
self.assertEqual(resp.status_code, 201)
resp = self.behaviors.get_secret(secret_ref, 'text/plain')
self.assertEqual(resp.status_code, 404)
@testcase.attr('positive')
def test_secret_get_payload_no_accept_header(self):
"""GET a secret payload, do not pass in accept header.