Skip to content
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

(#20548) Allow an array of resource titles to be passed into the ensure_... #152

Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
5 changes: 5 additions & 0 deletions README.markdown
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
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 : [title]
Copy link

Choose a reason for hiding this comment

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

Another slick way to do this is: title = [title].flatten


items.each do |item|
Puppet::Parser::Functions.function(:defined_with_params)
Copy link
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
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 because it already exists")
else
Puppet::Parser::Functions.function(:create_resources)
Copy link
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
60 changes: 42 additions & 18 deletions spec/functions/ensure_resource_spec.rb
Expand Up @@ -4,17 +4,16 @@
require 'rspec-puppet'
describe 'ensure_resource' do
describe 'when a type or title is not specified' do
it do
should run.with_params().and_raise_error(ArgumentError)
should run.with_params(['type']).and_raise_error(ArgumentError)
end
it { should run.with_params().and_raise_error(ArgumentError) }
it { should run.with_params(['type']).and_raise_error(ArgumentError) }
end

describe 'when compared against a resource with no attributes' do
let :pre_condition do
'user { "dan": }'
end
it do
should run.with_params('user', 'dan', {})
it "should contain the the ensured resources" do
subject.should run.with_params('user', 'dan', {})
compiler.catalog.resource('User[dan]').to_s.should == 'User[dan]'
end
end
Expand All @@ -23,18 +22,43 @@
let :pre_condition do
'user { "dan": ensure => present, shell => "/bin/csh", managehome => false}'
end
it do
# these first three should not fail
should run.with_params('User', 'dan', {})
should run.with_params('User', 'dan', '')
should run.with_params('User', 'dan', {'ensure' => 'present'})
should run.with_params('User', 'dan',
{'ensure' => 'present', 'managehome' => false}
)
# test that this fails
should run.with_params('User', 'dan',
{'ensure' => 'absent', 'managehome' => false}
).and_raise_error(Puppet::Error)
# these first three should not fail
it { should run.with_params('User', 'dan', {}) }
it { should run.with_params('User', 'dan', '') }
it { should run.with_params('User', 'dan', {'ensure' => 'present'}) }
it { should run.with_params('User', 'dan', {'ensure' => 'present', 'managehome' => false}) }
# test that this fails
it { should run.with_params('User', 'dan', {'ensure' => 'absent', 'managehome' => false}).and_raise_error(Puppet::Error) }
end

describe 'when an array of new resources are passed in' do
it "should contain the ensured resources" do
subject.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 "should return the existing resources" do
subject.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
# These should not fail
it { should run.with_params('User', ['dan', 'alex'], {}) }
it { should run.with_params('User', ['dan', 'alex'], '') }
it { should run.with_params('User', ['dan', 'alex'], {'ensure' => 'present'}) }
# This should fail
it { should run.with_params('User', ['dan', 'alex'], {'ensure' => 'absent'}).and_raise_error(Puppet::Error) }
end
end