summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNick Lewis <nick@puppetlabs.com>2011-08-09 13:04:37 -0700
committerJacob Helwig <jacob@puppetlabs.com>2011-08-19 13:52:59 -0700
commita32c8be4b32cfbc0588648e56e9194f3a75bbaa6 (patch)
tree7086e7db0c6168d7b71b994934bd9979a4049075
parent4f7170a0fd7d77d7d9941001cdb7dbcb0662d6b4 (diff)
downloadpuppet-a32c8be4b32cfbc0588648e56e9194f3a75bbaa6.tar.gz
puppet-a32c8be4b32cfbc0588648e56e9194f3a75bbaa6.tar.xz
puppet-a32c8be4b32cfbc0588648e56e9194f3a75bbaa6.zip
(#8409) Add a default group provider for Windows
This provider, windows_adsi, uses the Puppet::Util::ADSI module to manage groups. It can only manage group existence and memberships, but is fully functional in those regards. Based on work by: Joel Rosario <joel.r@.internal.directi.com> Based on work by: Cameron Thomas <cameron@puppetlabs.com> Reviewed-By: Matt Robinson <matt@puppetlabs.com> (cherry picked from commit 01f09f5f395bab66b90a4e81e958aa89025977b4)
-rw-r--r--lib/puppet/provider/group/windows_adsi.rb48
-rw-r--r--spec/unit/provider/group/windows_adsi_spec.rb79
2 files changed, 127 insertions, 0 deletions
diff --git a/lib/puppet/provider/group/windows_adsi.rb b/lib/puppet/provider/group/windows_adsi.rb
new file mode 100644
index 000000000..4468d0071
--- /dev/null
+++ b/lib/puppet/provider/group/windows_adsi.rb
@@ -0,0 +1,48 @@
+require 'puppet/util/adsi'
+
+Puppet::Type.type(:group).provide :windows_adsi do
+ desc "Group management for Windows"
+
+ defaultfor :operatingsystem => :windows
+ confine :operatingsystem => :windows
+ confine :feature => :microsoft_windows
+
+ has_features :manages_members
+
+ def group
+ @group ||= Puppet::Util::ADSI::Group.new(@resource[:name])
+ end
+
+ def members
+ group.members
+ end
+
+ def members=(members)
+ group.set_members(members)
+ end
+
+ def create
+ @group = Puppet::Util::ADSI::Group.create(@resource[:name])
+ self.members = @resource[:members]
+ end
+
+ def exists?
+ Puppet::Util::ADSI::Group.exists?(@resource[:name])
+ end
+
+ def delete
+ Puppet::Util::ADSI::Group.delete(@resource[:name])
+ end
+
+ def gid
+ nil
+ end
+
+ def gid=(value)
+ warning "No support for managing property gid of group #{@resource[:name]} on Windows"
+ end
+
+ def self.instances
+ Puppet::Util::ADSI::Group.map { |g| new(:ensure => :present, :name => g.name) }
+ end
+end
diff --git a/spec/unit/provider/group/windows_adsi_spec.rb b/spec/unit/provider/group/windows_adsi_spec.rb
new file mode 100644
index 000000000..7faaa1a8c
--- /dev/null
+++ b/spec/unit/provider/group/windows_adsi_spec.rb
@@ -0,0 +1,79 @@
+#!/usr/bin/env ruby
+
+require 'spec_helper'
+
+describe Puppet::Type.type(:group).provider(:windows_adsi) do
+ let(:resource) do
+ Puppet::Type.type(:group).new(
+ :title => 'testers',
+ :provider => :windows_adsi
+ )
+ end
+
+ let(:provider) { resource.provider }
+
+ let(:connection) { stub 'connection' }
+
+ before :each do
+ Puppet::Util::ADSI.stubs(:computer_name).returns('testcomputername')
+ Puppet::Util::ADSI.stubs(:connect).returns connection
+ end
+
+ describe ".instances" do
+ it "should enumerate all groups" do
+ names = ['group1', 'group2', 'group3']
+ stub_groups = names.map{|n| stub(:name => n)}
+
+ connection.stubs(:execquery).with("select * from win32_group").returns stub_groups
+
+ described_class.instances.map(&:name).should =~ names
+ end
+ end
+
+ describe "when managing members" do
+ it "should be able to provide a list of members" do
+ provider.group.stubs(:members).returns ['user1', 'user2', 'user3']
+
+ provider.members.should =~ ['user1', 'user2', 'user3']
+ end
+
+ it "should be able to set group members" do
+ provider.group.stubs(:members).returns ['user1', 'user2']
+
+ provider.group.expects(:remove_members).with('user1')
+ provider.group.expects(:add_members).with('user3')
+
+ provider.members = ['user2', 'user3']
+ end
+ end
+
+ it "should be able to create a group" do
+ resource[:members] = ['user1', 'user2']
+
+ group = stub 'group'
+ Puppet::Util::ADSI::Group.expects(:create).with('testers').returns group
+
+ group.expects(:set_members).with(['user1', 'user2'])
+
+ provider.create
+ end
+
+ it "should be able to test whether a group exists" do
+ Puppet::Util::ADSI.stubs(:connect).returns stub('connection')
+ provider.should be_exists
+
+ Puppet::Util::ADSI.stubs(:connect).returns nil
+ provider.should_not be_exists
+ end
+
+ it "should be able to delete a group" do
+ connection.expects(:Delete).with('group', 'testers')
+
+ provider.delete
+ end
+
+ it "should warn when trying to manage the gid property" do
+ provider.expects(:warning).with { |msg| msg =~ /No support for managing property gid/ }
+ provider.send(:gid=, 500)
+ end
+end