diff options
author | Tom Duffield <tom@chef.io> | 2016-10-19 16:32:52 -0500 |
---|---|---|
committer | Tom Duffield <tom@chef.io> | 2016-10-20 15:13:40 -0500 |
commit | f1920088085648f74225c6fdda4efdd95afa35ff (patch) | |
tree | d99d97931f4c1f331a0f46a7998edfc23f7a5c3d /lib/chef/provider/group | |
parent | 20cc4626599063e7a8f284fd6dc89e127d360d15 (diff) | |
download | chef-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.rb | 27 |
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 |