-
Notifications
You must be signed in to change notification settings - Fork 580
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
Parse deferred templates non deferred first #1425
base: main
Are you sure you want to change the base?
Conversation
@alexjfisher I removed the commented out tests since puppetlabs/rspec-puppet#24 is merged and |
Very open to idea that this new feature should be behind a parameter: file{'/tmp/junk':
content => stdlib::deferrable_epp(
'module/file.epp',
{ 'port' => '1234', pass => Deferred('secrets::get',['mysecret'])},
prerender => true,
),
} or something? |
Because of
this might be necessary, but maybe the default can be the new behaviour? |
cfcbea5
to
55a003f
Compare
Yes someone using a secret array type, while rare I expect, will have to do something. Set new Have added |
Currently it is not possible to have a template file.epp ```puppet <%- | Stdlib::Port $port, String[1] $password, | %> port <%= $port %> password <%= $password %> ``` and run ```puppet file{'/tmp/junk': content => stdlib::deferrable_epp('module/file.epp', { 'port' => '1234', pass => Deferred('secrets::get',['mysecret'])}), } ``` since the deferred template substitution will fail: ``` Error: Failed to apply catalog: Evaluation Error: Resource type not found: Stdlib::Port (file: inlined-epp-text, line: 2, column: 3) ``` due to Stdlib::Port not being available on the agent node. This change now parses the EPP twice. The first pass will reduce the template to: ```puppet port = 1234 password <%= $password %> ``` and this simpler template will be passed in deferred mode. Note the original template type for password must accept the intermediate generated value of `<%= $password %>` which is typically case for a secret password.
That works for me. (I think more likely than a non string type is someone using |
As this is it's backwards incompatible. I think true is better. Depends a bit how near we are to a major bump. |
Process the configuration file `redis.conf` template twice if some of the templates values are deferred. Currently with deferred values the resulting deferred template cannot be processed since it contains complex datatypes from stdlib in particular. This is a redis specific solution that may arrive genraly one day in puppetlabs/puppetlabs-stdlib#1425
if $variables.stdlib::nested_values.any |$value| { $value.is_a(Deferred) } { | ||
if $preparse { | ||
$_variables_escaped = $variables.map | $_var , $_value | { |
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.
Like voxpupuli/puppet-redis#515 (comment) this has the problem that nested_values
does recurse into hashes while $variables.map
doesn't. I think the inner part is essentially a Puppet native version of Ruby's Hash#transform_values
. Perhaps what's needed is a deep_transform_values
.
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.
So:
stdlib::deferrable_epp(template, { 'data' => { 'a' => Deferred(....) } })
Used to be supported and now it would not be with this patch as it is.
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.
Yes. It would be good to somehow cover this in a test case.
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.
Even assuming deep_transform_values can be made available (there is one in rails I see) exactly how you then handle the above case in the the intermediate template somewhat makes my head hurt.
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.
Which is I'd think that Puppet should have a native way. Isn't there a .resolve
function like there is .unwrap
for Sensitive
?
Process the configuration file `redis.conf` template twice if some of the templates values are deferred. Currently with deferred values the resulting deferred template cannot be processed since it contains complex datatypes from stdlib in particular. This is a redis specific solution that may arrive genraly one day in puppetlabs/puppetlabs-stdlib#1425
Process the configuration file `redis.conf` template twice if some of the templates values are deferred. Currently with deferred values the resulting deferred template cannot be processed since it contains complex datatypes from stdlib in particular. This is a redis specific solution that may arrive genraly one day in puppetlabs/puppetlabs-stdlib#1425
Process the configuration file `redis.conf` template twice if some of the templates values are deferred. Currently with deferred values the resulting deferred template cannot be processed since it contains complex datatypes from stdlib in particular. This is a redis specific solution that may arrive genraly one day in puppetlabs/puppetlabs-stdlib#1425
Summary
Parse templates with deferred values twice so complex data types can be used.
Additional Context
Currently it is not possible to have a template
file.epp
and run
since the deferred template substitution will fail:
due to
Stdlib::Port
not being available on the agent node.This change now parses the EPP twice. The first non deferred parse will reduce the template to:
port = 1234 password <%= $password %>
and this simpler template will be parsed in deferred mode.
Note the original template type for password must accept the intermediate generated value of
<%= $password %>
which is typically case for a secret password. If the deferred value is more complicated then the argumentpreparse
can beset
false
to not attempt the epp substitution of non deferred values.Provide a detailed description of all the changes present in this pull request.
Related Issues (if any)
Fixes voxpupuli/puppet-redis#513
Checklist