summaryrefslogtreecommitdiff
path: root/lib/chef/provider/group
diff options
context:
space:
mode:
authorTom Duffield <tom@chef.io>2016-10-19 16:32:52 -0500
committerTom Duffield <tom@chef.io>2016-10-20 15:13:40 -0500
commitf1920088085648f74225c6fdda4efdd95afa35ff (patch)
treed99d97931f4c1f331a0f46a7998edfc23f7a5c3d /lib/chef/provider/group
parent20cc4626599063e7a8f284fd6dc89e127d360d15 (diff)
downloadchef-f1920088085648f74225c6fdda4efdd95afa35ff.tar.gz
Raise error if suse group manager adds non-existent userCOOL-597/address-suse-test-failures
The expected behavior of chef, as defined by our tests, is that if a user specified in a group resource does not exist than chef should raise an error. On suse, we use groupmod which will not raise an error if you attempt to add a non-existent user to a group. This change adds in a simple check that will raise an error if the specified does not exist. Signed-off-by: Tom Duffield <tom@chef.io>
Diffstat (limited to 'lib/chef/provider/group')
-rw-r--r--lib/chef/provider/group/suse.rb27
1 files changed, 23 insertions, 4 deletions
diff --git a/lib/chef/provider/group/suse.rb b/lib/chef/provider/group/suse.rb
index a79038e25e..273485df16 100644
--- a/lib/chef/provider/group/suse.rb
+++ b/lib/chef/provider/group/suse.rb
@@ -17,6 +17,7 @@
#
require "chef/provider/group/groupadd"
+require "etc"
class Chef
class Provider
@@ -36,24 +37,42 @@ class Chef
a.failure_message Chef::Exceptions::Group, "Could not find binary /usr/sbin/groupmod for #{@new_resource.name}"
# No whyrun alternative: this component should be available in the base install of any given system that uses it
end
+
+ requirements.assert(:create, :manage, :modify) do |a|
+ a.assertion do
+ begin
+ to_add(@new_resource.members).any? { |member| Etc.getpwnam(member) }
+ rescue
+ false
+ end
+ end
+ a.failure_message Chef::Exceptions::Group, "Could not add users #{to_add(@new_resource.members).join(", ")} to #{@new_resource.group_name}: one of these users does not exist"
+ a.whyrun "Could not find one of these users: #{to_add(@new_resource.members).join(", ")}. Assuming it will be created by a prior step"
+ end
end
def set_members(members)
- to_delete = @current_resource.members - members
- to_delete.each do |member|
+ to_remove(members).each do |member|
remove_member(member)
end
- to_add = members - @current_resource.members
- to_add.each do |member|
+ to_add(members).each do |member|
add_member(member)
end
end
+ def to_add(members)
+ members - @current_resource.members
+ end
+
def add_member(member)
shell_out!("groupmod -A #{member} #{@new_resource.group_name}")
end
+ def to_remove(members)
+ @current_resource.members - members
+ end
+
def remove_member(member)
shell_out!("groupmod -R #{member} #{@new_resource.group_name}")
end