Skip to content

Commit c8a37aa

Browse files
committed
Merge remote-tracking branch 'origin' into pull_182_fix_arbiter
2 parents db30ca2 + 2ad1146 commit c8a37aa

File tree

2 files changed

+48
-11
lines changed

2 files changed

+48
-11
lines changed

lib/puppet/provider/mongodb_user/mongodb.rb

+47-10
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ def create
8080
"createUser": "#{@resource[:username]}",
8181
"pwd": "#{password_hash}",
8282
"customData": {"createdBy": "Puppet Mongodb_user['#{@resource[:name]}']"},
83-
"roles": #{@resource[:roles].to_json},
83+
"roles": #{role_hashes(@resource[:roles], @resource[:database]).to_json},
8484
"digestPassword": false
8585
}
8686
EOS
@@ -152,14 +152,16 @@ def roles=(roles)
152152
if mongo_24?
153153
mongo_eval("db.system.users.update({user:'#{@resource[:username]}'}, { $set: {roles: #{@resource[:roles].to_json}}})")
154154
else
155-
grant = roles - @property_hash[:roles]
155+
current_roles = role_strings(roles, @resource[:database])
156+
desired_roles = role_strings(@property_hash[:roles], @resource[:database])
157+
grant = (current_roles-desired_roles)
156158
unless grant.empty?
157-
mongo_eval("db.getSiblingDB('#{@resource[:database]}').grantRolesToUser('#{@resource[:username]}', #{grant. to_json})")
159+
mongo_eval("db.getSiblingDB('#{@resource[:database]}').grantRolesToUser('#{@resource[:username]}', #{role_hashes(grant, @resource[:database]).to_json})")
158160
end
159161

160-
revoke = @property_hash[:roles] - roles
162+
revoke = (desired_roles-current_roles)
161163
unless revoke.empty?
162-
mongo_eval("db.getSiblingDB('#{@resource[:database]}').revokeRolesFromUser('#{@resource[:username]}', #{revoke.to_json})")
164+
mongo_eval("db.getSiblingDB('#{@resource[:database]}').revokeRolesFromUser('#{@resource[:username]}', #{role_hashes(grant, @resource[:database]).to_json})")
163165
end
164166
end
165167
else
@@ -169,13 +171,48 @@ def roles=(roles)
169171

170172
private
171173

172-
def self.from_roles(roles, db)
174+
def self.role_strings(roles, db)
173175
roles.map do |entry|
174-
if entry['db'] == db
175-
entry['role']
176-
else
177-
"#{entry['role']}@#{entry['db']}"
176+
if entry.instance_of? Hash and entry.has_key? 'role'
177+
if entry['db'] == db
178+
entry['role']
179+
else
180+
"#{entry['role']}@#{entry['db']}"
181+
end
182+
elsif entry.instance_of? String
183+
if entry.end_with? "@#{db}"
184+
entry.gsub(/^(.*)@.*$/, '\1')
185+
else
186+
entry
187+
end
178188
end
179189
end.sort
180190
end
191+
192+
def role_strings(roles, db)
193+
self.class.role_strings(roles, db)
194+
end
195+
196+
def role_hashes(roles, db)
197+
roles.sort.map do |entry|
198+
if entry.instance_of? Hash and entry.has_key? 'role'
199+
if entry['db'] == db
200+
entry['role']
201+
else
202+
entry
203+
end
204+
elsif entry.instance_of? String
205+
if entry.end_with? "@#{db}"
206+
entry.gsub(/^(.*)@.*$/, '\1')
207+
elsif entry.include? '@'
208+
{
209+
'role' => entry.gsub(/^(.*)@.*$/, '\1'),
210+
'db' => entry.gsub(/^.*@(.*)$/, '\1'),
211+
}
212+
else
213+
entry
214+
end
215+
end
216+
end
217+
end
181218
end

lib/puppet/type/mongodb_user.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ def initialize(*args)
3939
newproperty(:roles, array_matching: :all) do
4040
desc "The user's roles."
4141
defaultto ['dbAdmin']
42-
newvalue(%r{^\w+$})
42+
newvalue(%r{^\w+(@\w+)?$})
4343

4444
# Pretty output for arrays.
4545
def should_to_s(value)

0 commit comments

Comments
 (0)