puppet-keystone/lib/puppet/provider/keystone_domain_config/openstack.rb

109 lines
3.4 KiB
Ruby

Puppet::Type.type(:keystone_domain_config).provide(
:openstack,
:parent => Puppet::Type.type(:openstack_config).provider(:ini_setting)
) do
class Puppet::Error::OpenstackMissingDomainName < Puppet::Error; end
class Puppet::Error::OpenstackMissingDomainDir < Puppet::Error; end
# return the first which is defined:
# 1. the value defined in the catalog (@base_dir)
# 2. the value defined in the keystone.conf file
# 3. the default value '/etc/keystone/domains'
def self.base_dir
return @base_dir if @base_dir
base_dir = Puppet::Resource.indirection
.find('Keystone_config/identity/domain_config_dir')[:value]
if base_dir == :absent
'/etc/keystone/domains'
else
base_dir
end
end
def self.find_domain_conf(catalog)
catalog.resources.find do |r|
# better than is_a? here because symbol
# Puppet::Type::Keystone_config may not be defined.
r.class.to_s == 'Puppet::Type::Keystone_config' &&
r.name == 'identity/domain_config_dir'
end
end
# Use the prefetch hook to check if the keystone_config
# identity/domain_config_dir is changed in the same catalog. This
# avoid to have to run puppet twice to get the right domain config
# file changed. Note, prefetch is the only time we can have acces
# to the catalog from the provider.
def self.prefetch(resources)
catalog = resources.values.first.catalog
resource_dir = find_domain_conf(catalog)
@base_dir = resource_dir.nil? ? nil : resource_dir[:value]
end
def self.base_dir_exists?
base_dir_resource = Puppet::Resource.indirection
.find("file/#{base_dir}")[:ensure]
base_dir_resource == :directory ? true : false
end
def create
unless self.class.base_dir_exists?
raise(Puppet::Error::OpenstackMissingDomainDir,
"You must create the #{self.class.base_dir} directory " \
'for keystone domain configuration.')
end
super
end
# Do not provide self.file_path method. We need to create instance
# with different file paths, so we cannot have the same path for all
# the instances. This force us to redefine the instances class
# method.
def self.instances
resources = []
Dir.glob(File.join(base_dir,'keystone.*.conf')).each do |domain_conf_file|
domain = domain_conf_file.gsub(/^.*\/keystone\.(.*)\.conf$/, '\1')
ini_file = Puppet::Util::IniFile.new(domain_conf_file, '=')
ini_file.section_names.each do |section_name|
ini_file.get_settings(section_name).each do |setting, value|
resources.push(
new(
:name => "#{domain}::#{section_name}/#{setting}",
:value => value,
:ensure => :present
)
)
end
end
end
resources
end
def path
File.join(self.class.base_dir, 'keystone.' + domain + '.conf')
end
# This avoid to have only one file for all the instances.
alias_method :file_path, :path
def domain
if !@domain.nil?
@domain
else
result = name.partition('::')
if (result[1] == '' && result[2] == '') || result[0] == ''
raise(Puppet::Error::OpenstackMissingDomainName,
'You must provide a domain name in the name of the resource ' \
'<domain_name>::<section>/<key>. It cannot be empty.')
else
@domain = result[0]
end
end
end
def section
@section ||= super.sub(domain + '::', '')
end
end