Allow the use of an ensure_absent_val param

This commit aims to add a new feature for the ini_setting provider, this
feature aims to simulate the ensure => absent behavior when a specific
keyword is specified.

Currently a pattern we have is

if $myvar {
  keystone_config { 'SECTION/setting' : value => $myvar }
} else {
  keystone_config { 'SECTION/setting' : ensure => absent }
}

If one has dozens or hundreds of parameters to handle then it can easily
make the manifest hard to read.

The solution offer here would turn the above example in something like

Keystone_config {
  ensure_absent_val = '<SERVICE DEFAULT>' # It is the default
}

keystone_config { 'SECTION/setting' : value => $myvar }

If `$myvar` is '<SERVICE DEFAULT>' then it will act as if `ensure => absent` would
have been specified.

Also added new tests for openstack_config provider

Co-Authored-By: Denis Egorenko <degorenko@mirantis.com>

Change-Id: I0eeebde3aac2662cc7e69bfad7f8d2481463a218
This commit is contained in:
Yanis Guenane 2015-07-16 15:53:33 +02:00
parent 9ce94f1fa6
commit 3b85306d04
3 changed files with 80 additions and 20 deletions

View File

@ -1,11 +1,15 @@
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__),"..","..",".."))
require 'puppet_x/openstack/util/ini_file'
Puppet::Type.type(:openstack_config).provide(
:ini_setting,
:parent => Puppet::Type.type(:ini_setting).provider(:ruby)
) do
def exists?
if resource[:value] == ensure_absent_val
resource[:ensure] = :absent
end
super
end
def section
resource[:name].split('/', 2).first
end
@ -14,6 +18,10 @@ Puppet::Type.type(:openstack_config).provide(
resource[:name].split('/', 2).last
end
def ensure_absent_val
resource[:ensure_absent_val]
end
def separator
'='
end
@ -22,9 +30,4 @@ Puppet::Type.type(:openstack_config).provide(
self.class.file_path
end
private
def ini_file
@ini_file ||= PuppetX::Openstack::Util::IniFile.new(file_path, separator, section_prefix, section_suffix)
end
end

View File

@ -1,12 +0,0 @@
require File.expand_path('../../../../../../inifile/lib/puppet/util/ini_file', __FILE__)
module PuppetX
module Openstack
module Util
class IniFile < Puppet::Util::IniFile
end
end
end
end

View File

@ -0,0 +1,69 @@
#
# these tests are a little concerning b/c they are hacking around the
# modulepath, so these tests will not catch issues that may eventually arise
# related to loading these plugins.
# I could not, for the life of me, figure out how to programatcally set the modulepath
$LOAD_PATH.push(
File.join(
File.dirname(__FILE__),
'..',
'..',
'..',
'fixtures',
'modules',
'inifile',
'lib')
)
require 'spec_helper'
provider_class = Puppet::Type.type(:openstack_config).provider(:ini_setting)
describe provider_class do
let(:properties) do
{
:name => 'DEFAUL/foo',
:value => 'bar',
:ensure_absent_val => 'some_value',
:ensure => :present,
}
end
let(:type) do
Puppet::Type.newtype(:test_config) do
newparam(:name, :namevar => true)
newparam(:ensure)
newproperty(:value)
newparam(:ensure_absent_val)
end
end
let(:resource) do
resource = type.new(properties)
resource
end
context '#exists?' do
it 'ensure to present' do
child_conf = Class.new(provider_class) do
def self.file_path
'/some/file/path'
end
end
provider = child_conf.new(resource)
provider.exists?
expect(resource[:ensure]).to eq :present
end
it 'ensure to absent' do
child_conf = Class.new(provider_class) do
def self.file_path
'/some/file/path'
end
end
provider = child_conf.new(resource)
resource[:ensure_absent_val] = 'bar'
provider.exists?
expect(resource[:ensure]).to eq :absent
end
end
end