1 require 'puppet/provider/keystone'
3 Puppet::Type.type(:keystone_tenant).provide(
5 :parent => Puppet::Provider::Keystone
8 desc "Provider to manage keystone tenants/projects."
10 @credentials = Puppet::Provider::Openstack::CredentialsV3.new
12 def initialize(value={})
18 # see if resource[:domain], or project_name::project_domain
19 project_name, project_domain = self.class.name_and_domain(resource[:name], resource[:domain])
20 properties = [project_name]
21 if resource[:enabled] == :true
22 properties << '--enable'
23 elsif resource[:enabled] == :false
24 properties << '--disable'
26 if resource[:description]
27 properties << '--description'
28 properties << resource[:description]
31 properties << '--domain'
32 properties << project_domain
34 @property_hash = self.class.request('project', 'create', properties)
35 @property_hash[:ensure] = :present
39 @property_hash[:ensure] == :present
43 self.class.request('project', 'delete', id)
48 @property_flush[:enabled] = value
52 bool_to_sym(@property_hash[:enabled])
55 def description=(value)
56 @property_flush[:description] = value
60 @property_hash[:description]
64 @property_hash[:domain]
73 list = request('project', 'list', '--long')
74 list.each do |project|
75 domname = domain_name_from_id(project[:domain_id])
76 if instance_hash.include?(project[:name]) # not unique
77 curdomid = instance_hash[project[:name]][:domain_id]
78 if curdomid != default_domain_id
79 # Move the project from the short name slot to the long name slot
80 # because it is not in the default domain.
81 curdomname = domain_name_from_id(curdomid)
82 instance_hash["#{project[:name]}::#{curdomname}"] = instance_hash[project[:name]]
83 # Use the short name slot for the new project
84 instance_hash[project[:name]] = project
86 # Use the long name for the new project
87 instance_hash["#{project[:name]}::#{domname}"] = project
90 # Unique (for now) - store in short name slot
91 instance_hash[project[:name]] = project
94 instance_hash.keys.collect do |project_name|
95 project = instance_hash[project_name]
96 domname = domain_name_from_id(project[:domain_id])
98 :name => project_name,
100 :enabled => project[:enabled].downcase.chomp == 'true' ? true : false,
101 :description => project[:description],
103 :domain_id => project[:domain_id],
109 def self.prefetch(resources)
112 resources.each do |resname, resource|
113 # resname may be specified as just "name" or "name::domain"
114 name, resdomain = name_and_domain(resname, resource[:domain])
115 provider = projects.find do |project|
116 # have a match if the full instance name matches the full resource name, OR
117 # the base resource name matches the base instance name, and the
118 # resource domain matches the instance domain
119 project_name, project_domain = name_and_domain(project.name, project.domain)
120 (project.name == resname) ||
121 ((project_name == name) && (project_domain == resdomain))
123 resource.provider = provider if provider
129 if @property_flush && !@property_flush.empty?
130 case @property_flush[:enabled]
132 options << '--enable'
134 options << '--disable'
136 (options << "--description=#{resource[:description]}") if @property_flush[:description]
137 self.class.request('project', 'set', [id] + options) unless options.empty?
138 @property_flush.clear