]> git.donarmstrong.com Git - dsa-puppet.git/blob - 3rdparty/modules/keystone/lib/puppet/provider/keystone_user_role/openstack.rb
try with modules from master
[dsa-puppet.git] / 3rdparty / modules / keystone / lib / puppet / provider / keystone_user_role / openstack.rb
1 require 'puppet/provider/keystone'
2
3 Puppet::Type.type(:keystone_user_role).provide(
4   :openstack,
5   :parent => Puppet::Provider::Keystone
6 ) do
7
8   desc "Provider to manage keystone role assignments to users."
9
10   @credentials = Puppet::Provider::Openstack::CredentialsV2_0.new
11
12   def initialize(value={})
13     super(value)
14     @property_flush = {}
15   end
16
17   def create
18     properties = []
19     properties << '--project' << get_project
20     properties << '--user' << get_user
21     if resource[:roles]
22       resource[:roles].each do |role|
23         self.class.request('role', 'add', [role] + properties)
24       end
25     end
26   end
27
28   def destroy
29     properties = []
30     properties << '--project' << get_project
31     properties << '--user' << get_user
32     if @property_hash[:roles]
33       @property_hash[:roles].each do |role|
34         self.class.request('role', 'remove', [role] + properties)
35       end
36     end
37     @property_hash[:ensure] = :absent
38   end
39
40   def exists?
41     if @user_role_hash
42       return ! @property_hash[:name].empty?
43     else
44       roles = self.class.request('user role', 'list', [get_user, '--project', get_project])
45       # Since requesting every combination of users, roles, and
46       # projects is so expensive, construct the property hash here
47       # instead of in self.instances so it can be used in the role
48       # and destroy methods
49       @property_hash[:name] = resource[:name]
50       if roles.empty?
51         @property_hash[:ensure] = :absent
52       else
53         @property_hash[:ensure] = :present
54         @property_hash[:roles]  = roles.collect do |role|
55           role[:name]
56         end
57       end
58       return @property_hash[:ensure] == :present
59     end
60   end
61
62   def roles
63     @property_hash[:roles]
64   end
65
66   def roles=(value)
67     current_roles = roles
68     # determine the roles to be added and removed
69     remove = current_roles - Array(value)
70     add    = Array(value) - current_roles
71     user = get_user
72     project = get_project
73     add.each do |role_name|
74       self.class.request('role', 'add', [role_name, '--project', project, '--user', user])
75     end
76     remove.each do |role_name|
77       self.class.request('role', 'remove', [role_name, '--project', project, '--user', user])
78     end
79   end
80
81   def self.instances
82     instances = build_user_role_hash
83     instances.collect do |title, roles|
84       new(
85         :name   => title,
86         :ensure => :present,
87         :roles  => roles
88       )
89     end
90   end
91
92   private
93
94   def get_user
95     resource[:name].rpartition('@').first
96   end
97
98   def get_project
99     resource[:name].rpartition('@').last
100   end
101
102   def self.get_projects
103     request('project', 'list').collect { |project| project[:name] }
104   end
105
106   def self.get_users(project)
107     request('user', 'list', ['--project', project]).collect { |user| user[:name] }
108   end
109
110   def self.set_user_role_hash(user_role_hash)
111     @user_role_hash = user_role_hash
112   end
113
114   def self.build_user_role_hash
115     hash = @user_role_hash || {}
116     return hash unless hash.empty?
117     projects = get_projects
118     projects.each do |project|
119       users = get_users(project)
120       users.each do |user|
121         user_roles = request('user role', 'list', [user, '--project', project])
122         hash["#{user}@#{project}"] = []
123         user_roles.each do |role|
124           hash["#{user}@#{project}"] << role[:name]
125         end
126       end
127     end
128     set_user_role_hash(hash)
129     hash
130   end
131 end