diff options
author | James Turnbull <james@lovedthanlost.net> | 2011-01-26 08:54:55 +1100 |
---|---|---|
committer | Daniel Pittman <daniel@rimspace.net> | 2011-01-25 22:11:10 -0800 |
commit | f1ab58839b5fc2d311b2c2656e480fb563acd03f (patch) | |
tree | 64afdfe3b19b4a6c1c582fa71bfcf7fc6c53de03 | |
parent | 41090d3617d99f9eaa58df32be93f3d16467bc50 (diff) | |
download | puppet-f1ab58839b5fc2d311b2c2656e480fb563acd03f.tar.gz puppet-f1ab58839b5fc2d311b2c2656e480fb563acd03f.tar.xz puppet-f1ab58839b5fc2d311b2c2656e480fb563acd03f.zip |
Fixed #6009 - nested member list vs directory service group provider
The Directory Service group (and user) provider behaves erratically if members
is a nested list; this happens with the following manifest:
$r = ["root"]
$a = ["daemon", "crc"]
$n = ["nobody"]
group { "testgroup":
ensure => present,
members => [$r, $a, $n]
}
This resolves the issue by flattening the list at the time we are using it;
while a more general solution might be desirable this resolves the specific
issue cleanly enough.
Original patch from Clay Caviness.
Tests by Daniel Pittman <daniel@puppetlabs.com>
Signed-off-by: Daniel Pittman <daniel@puppetlabs.com>
Signed-off-by: James Turnbull <james@lovedthanlost.net>
-rw-r--r-- | lib/puppet/provider/nameservice/directoryservice.rb | 4 | ||||
-rwxr-xr-x | spec/unit/provider/nameservice/directoryservice_spec.rb | 38 |
2 files changed, 40 insertions, 2 deletions
diff --git a/lib/puppet/provider/nameservice/directoryservice.rb b/lib/puppet/provider/nameservice/directoryservice.rb index 965a2aa60..b01880360 100644 --- a/lib/puppet/provider/nameservice/directoryservice.rb +++ b/lib/puppet/provider/nameservice/directoryservice.rb @@ -442,7 +442,7 @@ class DirectoryService < Puppet::Provider::NameService def remove_unwanted_members(current_members, new_members) current_members.each do |member| - if not new_members.include?(member) + if not new_members.flatten.include?(member) cmd = [:dseditgroup, "-o", "edit", "-n", ".", "-d", member, @resource[:name]] begin execute(cmd) @@ -454,7 +454,7 @@ class DirectoryService < Puppet::Provider::NameService end def add_members(current_members, new_members) - new_members.each do |new_member| + new_members.flatten.each do |new_member| if current_members.nil? or not current_members.include?(new_member) cmd = [:dseditgroup, "-o", "edit", "-n", ".", "-a", new_member, @resource[:name]] begin diff --git a/spec/unit/provider/nameservice/directoryservice_spec.rb b/spec/unit/provider/nameservice/directoryservice_spec.rb new file mode 100755 index 000000000..661899db9 --- /dev/null +++ b/spec/unit/provider/nameservice/directoryservice_spec.rb @@ -0,0 +1,38 @@ +#!/usr/bin/env ruby + +require File.dirname(__FILE__) + '/../../../spec_helper' + +# We use this as a reasonable way to obtain all the support infrastructure. +[:user, :group].each do |type_for_this_round| + provider_class = Puppet::Type.type(type_for_this_round).provider(:directoryservice) + + describe provider_class do + before do + @resource = stub("resource") + @provider = provider_class.new(@resource) + end + + it "[#6009] should handle nested arrays of members" do + current = ["foo", "bar", "baz"] + desired = ["foo", ["quux"], "qorp"] + group = 'example' + + @resource.stubs(:[]).with(:name).returns(group) + @resource.stubs(:[]).with(:auth_membership).returns(true) + @provider.instance_variable_set(:@property_value_cache_hash, + { :members => current }) + + %w{bar baz}.each do |del| + @provider.expects(:execute).once. + with([:dseditgroup, '-o', 'edit', '-n', '.', '-d', del, group]) + end + + %w{quux qorp}.each do |add| + @provider.expects(:execute).once. + with([:dseditgroup, '-o', 'edit', '-n', '.', '-a', add, group]) + end + + expect { @provider.set(:members, desired) }.should_not raise_error + end + end +end |