Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions README.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,11 @@ If the resource already exists but does not match the specified parameters,
this function will attempt to recreate the resource leading to a duplicate
resource definition error.

An array of resources can also be passed in and each will be created with
the type and parameters specified if it doesn't already exist.

ensure_resource('user', ['dan','alex'], {'ensure' => 'present'})



- *Type*: statement
Expand Down
22 changes: 16 additions & 6 deletions lib/puppet/parser/functions/ensure_resource.rb
Original file line number Diff line number Diff line change
Expand Up @@ -19,17 +19,27 @@
this function will attempt to recreate the resource leading to a duplicate
resource definition error.

An array of resources can also be passed in and each will be created with
the type and parameters specified if it doesn't already exist.

ensure_resource('user', ['dan','alex'], {'ensure' => 'present'})

ENDOFDOC
) do |vals|
type, title, params = vals
raise(ArgumentError, 'Must specify a type') unless type
raise(ArgumentError, 'Must specify a title') unless title
params ||= {}
Puppet::Parser::Functions.function(:defined_with_params)
if function_defined_with_params(["#{type}[#{title}]", params])
Puppet.debug("Resource #{type}[#{title}] not created b/c it already exists")
else
Puppet::Parser::Functions.function(:create_resources)
function_create_resources([type.capitalize, { title => params }])

items = title.kind_of?(Array) ? title : [].push(title)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is it necessary to do [].push(title) as opposed to doing [title]?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wasn't aware of the [title] way of doing it. That seems more verbose. I'll update the pull request to use the new form.


items.each do |item|
Puppet::Parser::Functions.function(:defined_with_params)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was in the original implementation, but do you know why this is being done? Is this necessary?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure why it's being done, but if there is a better way of doing it, I'd be happy to refactor it.

if function_defined_with_params(["#{type}[#{item}]", params])
Puppet.debug("Resource #{type}[#{item}] not created b/c it already exists")
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would be good to remove the abbreviation here.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've removed it in the latest commit.

else
Puppet::Parser::Functions.function(:create_resources)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same with this method; does this need to be here?

function_create_resources([type.capitalize, { item => params }])
end
end
end
35 changes: 35 additions & 0 deletions spec/functions/ensure_resource_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -37,4 +37,39 @@
).and_raise_error(Puppet::Error)
end
end

describe 'when an array of new resources are passed in' do
it do
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Each one of these expectations should be in a separate it block; this helps isolate test behavior. I've created a branch that provides an example of how this should be done, at https://github.com/adrienthebo/puppetlabs-stdlib/tree/maint-refactor_ensure_resource_expectations

should run.with_params('User', ['dan', 'alex'], {})
compiler.catalog.resource('User[dan]').to_s.should == 'User[dan]'
compiler.catalog.resource('User[alex]').to_s.should == 'User[alex]'
end
end

describe 'when an array of existing resources is compared against existing resources' do
let :pre_condition do
'user { "dan": ensure => present; "alex": ensure => present }'
end
it do
should run.with_params('User', ['dan', 'alex'], {})
compiler.catalog.resource('User[dan]').to_s.should == 'User[dan]'
compiler.catalog.resource('User[alex]').to_s.should == 'User[alex]'
end
end

describe 'when compared against existing resources with attributes' do
let :pre_condition do
'user { "dan": ensure => present; "alex": ensure => present }'
end
it do
# These should not fail
should run.with_params('User', ['dan', 'alex'], {})
should run.with_params('User', ['dan', 'alex'], '')
should run.with_params('User', ['dan', 'alex'], {'ensure' => 'present'})
# This should fail
should run.with_params('User', ['dan', 'alex'],
{'ensure' => 'absent'}
).and_raise_error(Puppet::Error)
end
end
end