Skip to content

Add function ensure_resource and defined_with_params #86

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

Merged
merged 4 commits into from
Aug 15, 2012
Merged
Show file tree
Hide file tree
Changes from all commits
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
35 changes: 35 additions & 0 deletions lib/puppet/parser/functions/defined_with_params.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Test whether a given class or definition is defined
require 'puppet/parser/functions'

Puppet::Parser::Functions.newfunction(:defined_with_params,
:type => :rvalue,
:doc => <<-'ENDOFDOC'
Takes a resource reference and an optional hash of attributes.

Returns true if a resource with the specified attributes has already been added
to the catalog, and false otherwise.

user { 'dan':
ensure => present,
}

if ! defined_with_params(User[dan], {'ensure' => 'present' }) {
user { 'dan': ensure => present, }
}
ENDOFDOC
) do |vals|
reference, params = vals
raise(ArgumentError, 'Must specify a reference') unless reference
if (! params) || params == ''
params = {}
end
ret = false
if resource = findresource(reference.to_s)
matches = params.collect do |key, value|
resource[key] == value
end
ret = params.empty? || !matches.include?(false)
end
Puppet.debug("Resource #{reference} was not determined to be defined")
ret
end
33 changes: 33 additions & 0 deletions lib/puppet/parser/functions/ensure_resource.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Test whether a given class or definition is defined
require 'puppet/parser/functions'

Puppet::Parser::Functions.newfunction(:ensure_resource,
:type => :statement,
:doc => <<-'ENDOFDOC'
Takes a resource type, title, and a list of attributes that describe a
resource.

user { 'dan':
ensure => present,
}

This example only creates the resource if it does not already exist:

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

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.

ENDOFDOC
) do |vals|
type, title, params = vals
raise(ArgumentError, 'Must specify a type') unless type
raise(ArgumentError, 'Must specify a title') unless title
params ||= {}
if function_defined_with_params(["#{type}[#{title}]", params])
Puppet.debug("Resource #{type}[#{title}] not created b/c it already exists")
else
function_create_resources([type.capitalize, { title => params }])
end
end
37 changes: 37 additions & 0 deletions spec/functions/defined_with_params_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#! /usr/bin/env ruby -S rspec
require 'spec_helper'

require 'rspec-puppet'
describe 'defined_with_params' do
describe 'when a resource is not specified' do
it { should run.with_params().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]', {}).and_return(true)
should run.with_params('User[bob]', {}).and_return(false)
should run.with_params('User[dan]', {'foo' => 'bar'}).and_return(false)
end
end

describe 'when compared against a resource with attributes' do
let :pre_condition do
'user { "dan": ensure => present, shell => "/bin/csh", managehome => false}'
end
it do
should run.with_params('User[dan]', {}).and_return(true)
should run.with_params('User[dan]', '').and_return(true)
should run.with_params('User[dan]', {'ensure' => 'present'}
).and_return(true)
should run.with_params('User[dan]',
{'ensure' => 'present', 'managehome' => false}
).and_return(true)
should run.with_params('User[dan]',
{'ensure' => 'absent', 'managehome' => false}
).and_return(false)
end
end
end
40 changes: 40 additions & 0 deletions spec/functions/ensure_resource_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#! /usr/bin/env ruby -S rspec
require 'spec_helper'

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
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', {})
compiler.catalog.resource('User[dan]').to_s.should == 'User[dan]'
end
end

describe 'when compared against a resource with attributes' do
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)
end
end
end