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=2dc39f2a756f82040d82cba324b21f44fad8ef3f;hp=198798477d9f0422b62ff65088fc52b0c1ded287;hpb=d4b6110c989169c702f039a4c7dc1b309685bba3;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 198798477..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,7 +7,7 @@ Puppet::Type.type(:keystone_tenant).provide( desc "Provider to manage keystone tenants/projects." - @credentials = Puppet::Provider::Openstack::CredentialsV2_0.new + @credentials = Puppet::Provider::Openstack::CredentialsV3.new def initialize(value={}) super(value) @@ -15,7 +15,9 @@ Puppet::Type.type(:keystone_tenant).provide( end def create - properties = [resource[:name]] + # 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 @@ -25,8 +27,12 @@ Puppet::Type.type(:keystone_tenant).provide( properties << '--description' properties << resource[:description] end - self.class.request('project', 'create', properties) - @property_hash[:ensure] = :present + if project_domain + properties << '--domain' + properties << project_domain + end + @property_hash = self.class.request('project', 'create', properties) + @property_hash[:ensure] = :present end def exists? @@ -34,7 +40,7 @@ Puppet::Type.type(:keystone_tenant).provide( end def destroy - self.class.request('project', 'delete', @property_hash[:id]) + self.class.request('project', 'delete', id) @property_hash.clear end @@ -54,29 +60,67 @@ Puppet::Type.type(:keystone_tenant).provide( @property_hash[:description] end + def domain + @property_hash[:domain] + end + def id @property_hash[:id] end def self.instances + instance_hash = {} list = request('project', 'list', '--long') - list.collect do |project| + 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 + 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 self.prefetch(resources) - tenants = instances - resources.keys.each do |name| - if provider = tenants.find{ |tenant| tenant.name == name } - resources[name].provider = provider + 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 end @@ -90,8 +134,7 @@ Puppet::Type.type(:keystone_tenant).provide( options << '--disable' end (options << "--description=#{resource[:description]}") if @property_flush[:description] - options << @property_hash[:id] - self.class.request('project', 'set', options) unless options.empty? + self.class.request('project', 'set', [id] + options) unless options.empty? @property_flush.clear end end