summaryrefslogtreecommitdiff
path: root/lib/chef/provider/group
diff options
context:
space:
mode:
authorsersut <serdar@opscode.com>2013-11-14 16:31:37 -0800
committersersut <serdar@opscode.com>2013-11-14 16:31:37 -0800
commit0876fcfb6641e7393155aac9f4ebbfbefa2898cf (patch)
treee0df0d4f1d37a22ec62702341e6e007d066b7760 /lib/chef/provider/group
parentd1854c850a71167f4aad27782fdd77c28a97819d (diff)
downloadchef-0876fcfb6641e7393155aac9f4ebbfbefa2898cf.tar.gz
exluded_members support in pw group provider.
Diffstat (limited to 'lib/chef/provider/group')
-rw-r--r--lib/chef/provider/group/pw.rb50
1 files changed, 41 insertions, 9 deletions
diff --git a/lib/chef/provider/group/pw.rb b/lib/chef/provider/group/pw.rb
index 66da8281be..2ba117d872 100644
--- a/lib/chef/provider/group/pw.rb
+++ b/lib/chef/provider/group/pw.rb
@@ -72,18 +72,50 @@ class Chef
# Set the membership option depending on the current resource states
def set_members_option
opt = ""
- unless @new_resource.members.empty?
- opt << " -M #{@new_resource.members.join(',')}"
- Chef::Log.debug("#{@new_resource} setting group members to #{@new_resource.members.join(', ')}")
+
+ if @new_resource.append
+ # Append is set so we will only add members given in the
+ # members list and remove members given in the
+ # excluded_members list.
+ if @new_resource.members && !@new_resource.members.empty?
+ members_to_be_added = [ ]
+ @new_resource.members.each do |member|
+ members_to_be_added << member if !@current_resource.members.include?(member)
+ end
+ end
+
+ if @new_resource.excluded_members && !@new_resource.excluded_members.empty?
+ members_to_be_removed = [ ]
+ @new_resource.excluded_members.each do |member|
+ members_to_be_removed << member if @current_resource.members.include?(member)
+ end
+ end
else
- # New member list is empty so we should delete any old group members
- unless @current_resource.members.empty?
- opt << " -d #{@current_resource.members.join(',')}"
- Chef::Log.debug("#{@new_resource} removing group members #{@current_resource.members.join(', ')}")
- else
- Chef::Log.debug("#{@new_resource} not changing group members, the group has no members")
+ # Append is not set so we're resetting the membership of
+ # the group to the given members.
+ members_to_be_added = @new_resource.members
+ members_to_be_removed = [ ]
+ @current_resource.members.each do |member|
+ # No need to re-add a member if it's present in the new
+ # list of members
+ if members_to_be_added.include? member
+ members_to_be_added.delete member
+ else
+ members_to_be_removed << member
+ end
end
end
+
+ unless members_to_be_added.empty?
+ Chef::Log.debug("#{@new_resource} adding group members: #{members_to_be_added.join(',')}")
+ opt << " -M #{members_to_be_added.join(',')}"
+ end
+
+ unless members_to_be_removed.empty?
+ Chef::Log.debug("#{@new_resource} removing group members: #{members_to_be_removed.join(',')}")
+ opt << " -d #{members_to_be_removed.join(',')}"
+ end
+
opt
end