-
Notifications
You must be signed in to change notification settings - Fork 115
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Unify render errors and handle an edge case #253
Conversation
@@ -865,4 +879,8 @@ def test_cronjobs_can_be_deployed | |||
cronjobs = FixtureSetAssertions::CronJobs.new(@namespace) | |||
cronjobs.assert_cronjob_present("my-cronjob") | |||
end | |||
|
|||
def test_friendly_error_on_misidentified_erb_file |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
.rubocop.yml
Outdated
@@ -3,3 +3,9 @@ inherit_from: | |||
|
|||
AllCops: | |||
TargetRubyVersion: 2.3 | |||
|
|||
Style/TrailingCommaInArrayLiteral: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not opposed to adding these (I guess it must have been added to the styleguide? rubocop started caring about it), but doing so now would cause rebase hell for the several people with huge PRs in flight.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe we flip these on when we hit 1.0? I agree these are going to cause a lot of pain for nothing more than a style preference right now.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I personally like enjoy trailing commas in hashes and arrays, they make it easier to add an element, treat every line the same way and they show up as only one line change in git. So I am all for enabling them. But yeah, we shouldn't bug people with open PRs with it.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Some minor comments. Though I wonder if we want to check for the presence of <%
and if its there add something liker "Did you forgot to add .erb
suffix?" to the warning message
lib/kubernetes-deploy/deploy_task.rb
Outdated
@@ -225,24 +225,25 @@ def discover_resources | |||
end | |||
end | |||
resources | |||
rescue InvalidTemplateError => e | |||
debug_msg = paragraph_for_invalid_templates(e.message, filenames: [e.filename], content: e.content) | |||
@logger.summary.add_paragraph(debug_msg) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do you envision a case where you'd want generate the message and not log it? If not can you combine these two lines into a function log_invalid_templates
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why log here instead of split_templates
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why log here instead of split_templates
I think I did that because one of the three places that can raise this is the rescue
of split_templates
, so the alternative is:
def split_templates(filename)
...
rescue Psych::SyntaxError => e
log_invalid_templates(e.message, filenames: [filename], content: rendered_content)
raise FatalDeploymentError, "Failed to render and parse template"
rescue InvalidTemplateError => e
log_invalid_templates(e.message, filenames: [e.filename], content: e.content)
raise FatalDeploymentError, "Failed to render and parse template"
end
It's a bit of duplication, but I don't feel strongly about it. Do you think that would be easier to follow?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think moving it to split_templates is easer to read / understand.
.rubocop.yml
Outdated
@@ -3,3 +3,9 @@ inherit_from: | |||
|
|||
AllCops: | |||
TargetRubyVersion: 2.3 | |||
|
|||
Style/TrailingCommaInArrayLiteral: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe we flip these on when we hit 1.0? I agree these are going to cause a lot of pain for nothing more than a style preference right now.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I only have minor comments, I need to run the tests and take a look at the output before approving it though :)
.rubocop.yml
Outdated
@@ -3,3 +3,9 @@ inherit_from: | |||
|
|||
AllCops: | |||
TargetRubyVersion: 2.3 | |||
|
|||
Style/TrailingCommaInArrayLiteral: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I personally like enjoy trailing commas in hashes and arrays, they make it easier to add an element, treat every line the same way and they show up as only one line change in git. So I am all for enabling them. But yeah, we shouldn't bug people with open PRs with it.
lib/kubernetes-deploy/deploy_task.rb
Outdated
debug_msg += "> Error from kubectl:\n#{indent_four(err)}" | ||
if file_content.present? | ||
debug_msg += "\n> Rendered template content:\n#{indent_four(file_content)}" | ||
def paragraph_for_invalid_templates(err, filenames:, content:) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think it's a little weird to have one required argument, followed by two required keyword arguments.
Especially since the function has an if content present?
block which kind of implies that content is not always required. Maybe make all 3 keyword parameters and give content:
a default of nil
? or just do the latter?
raise InvalidPartialError, err.message | ||
# get the filename from the first parent, not the missing partial itself | ||
raise err if err.filename == partial | ||
raise InvalidPartialError.new(err.message, filename: partial, content: expanded_template || template) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Shouldn't the underlying code raise the correct error type? Instead of rescuing one type and raising either one or the other?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is transforming the data, not just the error type. rescue PartialNotFound
needs to be distinct because it is the first parent (potentially of a long chain) that has the relevant filename and template content. So we hit this case in the missing child (in which case we skip it, L64) and the first parent (in which case we grab the filename and content, L65), and then after that we just add the additional parent name to the list (L67), like we would for any other type of error.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In making the change to have paragraph_for_invalid_templates
do the logging itself, I noticed that record_invalid_template
could be simplified and merged with it. It was more complex because it supported multiple file paths, but really, calling it once per file path (by refactoring into what is now record_apply_failure
) leads to better output anyway. Please take another look.
The main tests affected by the last commit are test_multiple_invalid_k8s_specs_fails_on_apply_and_prints_template
, test_output_when_switching_labels_incorrectly
and test_invalid_k8s_spec_that_is_valid_yaml_but_has_no_template_path_in_error_prints_helpful_message
"You may wish to roll back this deploy." | ||
@logger.summary.add_paragraph(ColorizedString.new(warn_msg).yellow) | ||
|
||
unidentified_errors = [] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This might be a bad idea. If there were a multi-line error message where one of the middle lines has a filename in it, we'd be splitting it up strangely. I haven't seen that, but I certainly haven't seen everything. An alternative is to always dump the complete error before the individual cases we were able to extract and enhance.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would totally say, let's deal with it when it comes up
line.scan(%r{"(/\S+\.ya?ml\S*)"}).each_with_object([]) do |matches, bad_files| | ||
matches.each do |path| | ||
content = File.read(path) if File.file?(path) | ||
bad_files << { filename: File.basename(path), err: line, content: content } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, I'm not worried about the possible edge case with multiline errors and filenames. |
"You may wish to roll back this deploy." | ||
@logger.summary.add_paragraph(ColorizedString.new(warn_msg).yellow) | ||
|
||
unidentified_errors = [] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would totally say, let's deal with it when it comes up
Started off fixing an edge case where a
.yml
file that actually starts with some ERB would raise an exception instead of failing gracefully with a nice message. Ended up shaving a small yak upon noticing that we displayed errors about invalid templates several different ways.Before
test_deploy_fails_if_required_binding_not_present
test_missing_nested_partial_prints_helpful_error
test_invalid_yaml_in_partial_prints_helpful_error
test_invalid_yaml_fails_fast
test_multiple_invalid_k8s_specs_fails_on_apply_and_prints_template
After
test_deploy_fails_if_required_binding_not_present
test_missing_nested_partial_correctly_identifies_invalid_template_and_its_parents
[improved test]test_invalid_yaml_in_partial_prints_helpful_error
test_invalid_yaml_fails_fast
test_multiple_invalid_k8s_specs_fails_on_apply_and_prints_template