Fix missing error handling during pegleg render

1. Currently Pegleg render does not show error output when deckhand produce
   error exception.
2. Added unit test case for this PS

Change-Id: If1699545dfc539dc09cea449bd2a48c888294c44
This commit is contained in:
pallav 2018-06-11 19:21:24 +05:30
parent cc000c66ab
commit f4dd4f7db6
2 changed files with 90 additions and 0 deletions

View File

@ -79,6 +79,14 @@ def render(site_name, output_stream):
rendered_documents, errors = util.deckhand.deckhand_render(
documents=documents)
err_msg = ''
if errors:
for err in errors:
if isinstance(err, tuple) and len(err) > 1:
err_msg += ': '.join(err) + '\n'
else:
err_msg += str(err) + '\n'
raise click.ClickException(err_msg)
yaml.dump_all(rendered_documents, output_stream, default_flow_style=False)

View File

@ -15,6 +15,9 @@
import mock
from pegleg.engine import lint
from pegleg.engine.errorcodes import DECKHAND_DUPLICATE_SCHEMA
from pegleg.engine.errorcodes import DECKHAND_RENDER_EXCEPTION
from pegleg.engine.util import deckhand
from pegleg.engine.util import files
from tests.unit.fixtures import create_tmp_deployment_files
@ -150,3 +153,82 @@ def test_verify_deckhand_render_site_documents_separately(
assert sorted(
expected_documents, key=sort_func) == sorted(
actual_documents, key=sort_func)
@mock.patch('pegleg.engine.util.deckhand.deckhand_render')
def test_verify_deckhand_render_error_handling(mock_render):
"""
Verifying deckhand render error handling.
Parameters:
mock_render: Mock render object.
"""
exp_dict = {
'exp1':
DECKHAND_DUPLICATE_SCHEMA + ": Duplicate schema specified.\n",
'exp2':
DECKHAND_RENDER_EXCEPTION +
": An unknown Deckhand exception occurred while trying to render documents\n",
'exp3':
"Generic Error\n"
}
# No exception raised
mock_render.return_value = _return_deckhand_render_errors()
errors = deckhand.deckhand_render()
assert errors == []
# check errors object type
mock_render.return_value = _return_deckhand_render_errors(1)
errors = deckhand.deckhand_render()
assert isinstance(errors, list)
# check single exception handling
assert _deckhand_render_exception_msg(errors) == exp_dict['exp1']
# check multiple exception with tuple type
mock_render.return_value = _return_deckhand_render_errors(2)
errors = deckhand.deckhand_render()
assert _deckhand_render_exception_msg(
errors) == exp_dict['exp1'] + exp_dict['exp2']
# check multiple exception with mixed type
mock_render.return_value = _return_deckhand_render_errors(3)
errors = deckhand.deckhand_render()
assert _deckhand_render_exception_msg(
errors) == exp_dict['exp1'] + exp_dict['exp2'] + exp_dict['exp3']
def _deckhand_render_exception_msg(errors):
"""
Helper function to create deckhand render exception msg.
Parameters:
errors: List of errors provided by deckhand render.
Returns:
string: formulated error message.
"""
err_msg = ''
for err in errors:
if isinstance(err, tuple) and len(err) > 1:
err_msg += ': '.join(err) + '\n'
else:
err_msg += str(err) + '\n'
return err_msg
def _return_deckhand_render_errors(error_count=0):
"""
Helper function to mock deckhand render errors.
Parameters:
error_count: Number of mock errors to return.
Returns:
List: List of mock errors as per error_count.
"""
errors = []
if error_count >= 1:
errors.append((DECKHAND_DUPLICATE_SCHEMA,
'Duplicate schema specified.'))
if error_count >= 2:
errors.append((DECKHAND_RENDER_EXCEPTION,
'An unknown Deckhand exception occurred while '
'trying to render documents'))
if error_count >= 3:
errors.append(('Generic Error'))
return errors