Skip to content

Commit

Permalink
Revert "Revert "Merge pull request #86 from bodepd/ensure_resource""
Browse files Browse the repository at this point in the history
This reverts commit 1e09833.
  • Loading branch information
Dan Bode committed Aug 15, 2012
1 parent 1e09833 commit b42c82a
Show file tree
Hide file tree
Showing 4 changed files with 145 additions and 0 deletions.
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

0 comments on commit b42c82a

Please sign in to comment.