X-Git-Url: https://git.adam-barratt.org.uk/?a=blobdiff_plain;f=3rdparty%2Fmodules%2Fkeystone%2Flib%2Fpuppet%2Fprovider%2Fkeystone_tenant%2Fopenstack.rb;h=57a299fd6a80bf57d66700d9b1f2531346b0faff;hb=87423ba664cd5f2bb462ebadd08b1a90d0fe1c8d;hp=ef15c50e6f48792bdcaf058dbf0535dab6cecc24;hpb=9323043aa25de76c23ba73489d575aecc7a8041d;p=mirror%2Fdsa-puppet.git diff --git a/3rdparty/modules/keystone/lib/puppet/provider/keystone_tenant/openstack.rb b/3rdparty/modules/keystone/lib/puppet/provider/keystone_tenant/openstack.rb index ef15c50e6..57a299fd6 100644 --- a/3rdparty/modules/keystone/lib/puppet/provider/keystone_tenant/openstack.rb +++ b/3rdparty/modules/keystone/lib/puppet/provider/keystone_tenant/openstack.rb @@ -7,13 +7,17 @@ Puppet::Type.type(:keystone_tenant).provide( desc "Provider to manage keystone tenants/projects." + @credentials = Puppet::Provider::Openstack::CredentialsV3.new + def initialize(value={}) super(value) @property_flush = {} end def create - properties = [] + # see if resource[:domain], or project_name::project_domain + project_name, project_domain = self.class.name_and_domain(resource[:name], resource[:domain]) + properties = [project_name] if resource[:enabled] == :true properties << '--enable' elsif resource[:enabled] == :false @@ -23,87 +27,115 @@ Puppet::Type.type(:keystone_tenant).provide( properties << '--description' properties << resource[:description] end - @instance = request('project', 'create', resource[:name], resource[:auth], properties) + if project_domain + properties << '--domain' + properties << project_domain + end + @property_hash = self.class.request('project', 'create', properties) + @property_hash[:ensure] = :present end def exists? - ! instance(resource[:name]).empty? + @property_hash[:ensure] == :present end def destroy - request('project', 'delete', resource[:name], resource[:auth]) + self.class.request('project', 'delete', id) + @property_hash.clear end - def enabled=(value) @property_flush[:enabled] = value end def enabled - bool_to_sym(instance(resource[:name])[:enabled]) + bool_to_sym(@property_hash[:enabled]) end - def description=(value) @property_flush[:description] = value end def description - instance(resource[:name])[:description] + @property_hash[:description] end + def domain + @property_hash[:domain] + end def id - instance(resource[:name])[:id] + @property_hash[:id] end def self.instances - if not resource[:os_cacert].nil? - resource_args = ['project', 'list', nil, nil, '--long', '--os-cacert', resource[:os_cacert]] - else - resource_args = ['project', 'list', nil, nil, '--long'] + instance_hash = {} + list = request('project', 'list', '--long') + list.each do |project| + domname = domain_name_from_id(project[:domain_id]) + if instance_hash.include?(project[:name]) # not unique + curdomid = instance_hash[project[:name]][:domain_id] + if curdomid != default_domain_id + # Move the project from the short name slot to the long name slot + # because it is not in the default domain. + curdomname = domain_name_from_id(curdomid) + instance_hash["#{project[:name]}::#{curdomname}"] = instance_hash[project[:name]] + # Use the short name slot for the new project + instance_hash[project[:name]] = project + else + # Use the long name for the new project + instance_hash["#{project[:name]}::#{domname}"] = project + end + else + # Unique (for now) - store in short name slot + instance_hash[project[:name]] = project + end end - list = request(resource_args) - list.collect do |project| + instance_hash.keys.collect do |project_name| + project = instance_hash[project_name] + domname = domain_name_from_id(project[:domain_id]) new( - :name => project[:name], + :name => project_name, :ensure => :present, :enabled => project[:enabled].downcase.chomp == 'true' ? true : false, :description => project[:description], + :domain => domname, + :domain_id => project[:domain_id], :id => project[:id] ) end end - def instances - if not resource[:os_cacert].nil? - resource_args = ['project', 'list', nil, resource[:auth], '--long', '--os-cacert', resource[:os_cacert]] - else - resource_args = ['project', 'list', nil, resource[:auth], '--long'] + def self.prefetch(resources) + project_hash = {} + projects = instances + resources.each do |resname, resource| + # resname may be specified as just "name" or "name::domain" + name, resdomain = name_and_domain(resname, resource[:domain]) + provider = projects.find do |project| + # have a match if the full instance name matches the full resource name, OR + # the base resource name matches the base instance name, and the + # resource domain matches the instance domain + project_name, project_domain = name_and_domain(project.name, project.domain) + (project.name == resname) || + ((project_name == name) && (project_domain == resdomain)) + end + resource.provider = provider if provider end - instances = request(resource_args) - instances.collect do |project| - { - :name => project[:name], - :enabled => project[:enabled].downcase.chomp == 'true' ? true : false, - :description => project[:description], - :id => project[:id] - } - end - end - - def instance(name) - @instance ||= instances.select { |instance| instance[:name] == name }.first || {} end def flush options = [] - if @property_flush - (options << '--enable') if @property_flush[:enabled] == :true - (options << '--disable') if @property_flush[:enabled] == :false - # There is a --description flag for the set command, but it does not work if the value is empty - (options << '--property' << "description=#{resource[:description]}") if @property_flush[:description] - request('project', 'set', resource[:name], resource[:auth], options) unless options.empty? + if @property_flush && !@property_flush.empty? + case @property_flush[:enabled] + when :true + options << '--enable' + when :false + options << '--disable' + end + (options << "--description=#{resource[:description]}") if @property_flush[:description] + self.class.request('project', 'set', [id] + options) unless options.empty? + @property_flush.clear end end