+1 On Jan 6, 2009, at 3:16 PM, Jeffrey McCune wrote:
> > Moved parse_type and parse_name from the provider into a module. > Mixed the module into both the MCX type and mcxcontent provider. > > Updated tests and added tests to ensure users, groups and computers > are automatically required. > > Qualified TypeMap constant and moved into the module. > > The TypeMap constant is used by both the mcx type and provider > and therefore should be moved into the mcx utility module > included in both. Furthermore, references to TypeMap should > probably be fully qualified to prevent namespace collisions. > > Signed-off-by: Jeffrey McCune <[email protected]> > --- > lib/puppet/provider/mcx/mcxcontent.rb | 54 ++++--------------- > lib/puppet/type/mcx.rb | 10 ++++ > lib/puppet/util/mcx.rb | 62 +++++++++++++++++++++ > spec/unit/provider/mcx/mcxcontent.rb | 24 ++++---- > spec/unit/type/mcx.rb | 97 ++++++++++++++++++++++++ > +++++++++ > 5 files changed, 192 insertions(+), 55 deletions(-) > create mode 100644 lib/puppet/util/mcx.rb > > diff --git a/lib/puppet/provider/mcx/mcxcontent.rb b/lib/puppet/ > provider/mcx/mcxcontent.rb > index 1fea60c..e6c202a 100644 > --- a/lib/puppet/provider/mcx/mcxcontent.rb > +++ b/lib/puppet/provider/mcx/mcxcontent.rb > @@ -18,9 +18,12 @@ > # Author: Jeff McCune <[email protected]> > > require 'tempfile' > +require 'puppet/util/mcx' > > Puppet::Type.type(:mcx).provide :mcxcontent, :parent => > Puppet::Provider do > > + include Puppet::Util::Mcx > + > desc "MCX Settings management using DirectoryService on OS X. > > This provider manages the entire MCXSettings attribute available > @@ -36,15 +39,6 @@ > Puppet::Type.type(:mcx).provide :mcxcontent, :parent => > Puppet::Provider do > > " > > - # This provides a mapping of puppet types to DirectoryService > - # type strings. > - TypeMap = { > - :user => "Users", > - :group => "Groups", > - :computer => "Computers", > - :computerlist => "ComputerLists", > - } > - > class MCXContentProviderException < Exception > > end > @@ -58,17 +52,17 @@ > Puppet::Type.type(:mcx).provide :mcxcontent, :parent => > Puppet::Provider do > # an array of instances of this class. > def self.instances > mcx_list = [] > - for ds_type in TypeMap.keys > - ds_path = "/Local/Default/#{TypeMap[ds_type]}" > + for ds_type in Puppet::Util::Mcx::TypeMap.keys > + ds_path = "/Local/Default/ > #{Puppet::Util::Mcx::TypeMap[ds_type]}" > output = dscl 'localhost', '-list', ds_path > member_list = output.split > for ds_name in member_list > content = mcxexport(ds_type, ds_name) > if content.empty? > - Puppet.debug "/#{TypeMap[ds_type]}/#{ds_name} > has no MCX data." > + Puppet.debug "/ > #{Puppet::Util::Mcx::TypeMap[ds_type]}/#{ds_name} has no MCX data." > else > # This node has MCX data. > - rsrc = self.new(:name => "/#{TypeMap[ds_type]}/ > #{ds_name}", > + rsrc = self.new(:name => "/ > #{Puppet::Util::Mcx::TypeMap[ds_type]}/#{ds_name}", > :ds_type => ds_type, > :ds_name => ds_name, > :content => content) > @@ -84,14 +78,14 @@ > Puppet::Type.type(:mcx).provide :mcxcontent, :parent => > Puppet::Provider do > # mcxexport is used by instances, and therefore > # a class method. > def self.mcxexport(ds_type, ds_name) > - ds_t = TypeMap[ds_type] > + ds_t = Puppet::Util::Mcx::TypeMap[ds_type] > ds_n = ds_name.to_s > ds_path = "/Local/Default/#{ds_t}/#{ds_n}" > dscl 'localhost', '-mcxexport', ds_path > end > > def mcximport(ds_type, ds_name, val) > - ds_t = TypeMap[ds_type] > + ds_t = Puppet::Util::Mcx::TypeMap[ds_type] > ds_n = ds_name.to_s > ds_path = "/Local/Default/#{ds_t}/#{ds_name}" > > @@ -106,32 +100,6 @@ > Puppet::Type.type(:mcx).provide :mcxcontent, :parent => > Puppet::Provider do > end > end > > - # Given the resource name string, parse ds_type out. > - def parse_type(name) > - tmp = name.split('/')[1] > - if ! tmp.is_a? String > - raise MCXContentProviderException, > - "Coult not parse ds_type from resource name '#{name}'. > Specify with ds_type parameter." > - end > - # De-pluralize and downcase. > - tmp = tmp.chop.downcase.to_sym > - if not TypeMap.keys.member? tmp > - raise MCXContentProviderException, > - "Coult not parse ds_type from resource name '#{name}'. > Specify with ds_type parameter." > - end > - return tmp > - end > - > - # Given the resource name string, parse ds_name out. > - def parse_name(name) > - ds_name = name.split('/')[2] > - if ! ds_name.is_a? String > - raise MCXContentProviderException, > - "Could not parse ds_name from resource name '#{name}'. > Specify with ds_name parameter." > - end > - return ds_name > - end > - > # Gather ds_type and ds_name from resource or > # parse it out of the name. > # This is a private instance method, not a class method. > @@ -140,7 +108,7 @@ > Puppet::Type.type(:mcx).provide :mcxcontent, :parent => > Puppet::Provider do > if ds_type.nil? > ds_type = parse_type(resource[:name]) > end > - raise MCXContentProviderException unless > TypeMap.keys.include? ds_type.to_sym > + raise MCXContentProviderException unless > Puppet::Util::Mcx::TypeMap.keys.include? ds_type.to_sym > > ds_name = resource[:ds_name] > if ds_name.nil? > @@ -164,7 +132,7 @@ > Puppet::Type.type(:mcx).provide :mcxcontent, :parent => > Puppet::Provider do > > def destroy > ds_parms = get_dsparams > - ds_t = TypeMap[ds_parms[:ds_type]] > + ds_t = Puppet::Util::Mcx::TypeMap[ds_parms[:ds_type]] > ds_n = ds_parms[:ds_name].to_s > ds_path = "/Local/Default/#{ds_t}/#{ds_n}" > > diff --git a/lib/puppet/type/mcx.rb b/lib/puppet/type/mcx.rb > index f92cc46..3612f0d 100644 > --- a/lib/puppet/type/mcx.rb > +++ b/lib/puppet/type/mcx.rb > @@ -17,8 +17,12 @@ > > # Author: Jeff McCune <[email protected]> > > +require 'puppet/util/mcx' > + > Puppet::Type.newtype(:mcx) do > > + include Puppet::Util::Mcx > + > @doc = "MCX object management using DirectoryService on OS X. > > Original Author: Jeff McCune <[email protected]> > @@ -91,7 +95,13 @@ to other machines. > # value returns a Symbol > name = value(:name) > ds_type = value(:ds_type) > + if ds_type.nil? > + ds_type = parse_type(name) > + end > ds_name = value(:ds_name) > + if ds_name.nil? > + ds_name = parse_name(name) > + end > if ds_type == type > rval = [ ds_name.to_s ] > else > diff --git a/lib/puppet/util/mcx.rb b/lib/puppet/util/mcx.rb > new file mode 100644 > index 0000000..a057c7f > --- /dev/null > +++ b/lib/puppet/util/mcx.rb > @@ -0,0 +1,62 @@ > +#-- > +# Copyright (C) 2008 Jeffrey J McCune. > + > +# This program and entire repository is free software; you can > +# redistribute it and/or modify it under the terms of the GNU > +# General Public License as published by the Free Software > +# Foundation; either version 2 of the License, or any later version. > + > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > + > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write to the Free Software > +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA > 02110-1301 USA > + > +# Author: Jeff McCune <[email protected]> > + > +# Helper methods common to the MCX Type and Providers > +module Puppet::Util::Mcx > + > + # This provides a mapping of puppet types to DirectoryService > + # type strings. > + TypeMap = { > + :user => "Users", > + :group => "Groups", > + :computer => "Computers", > + :computerlist => "ComputerLists", > + } > + > + class MCXUtilException < Exception > + > + end > + > + # Given the resource name string, parse ds_type out. > + def parse_type(name) > + tmp = name.split('/')[1] > + if ! tmp.is_a? String > + raise MCXUtilException, > + "Coult not parse ds_type from resource name '#{name}'. > Specify with ds_type parameter." > + end > + # De-pluralize and downcase. > + tmp = tmp.chop.downcase.to_sym > + if not Puppet::Util::Mcx::TypeMap.keys.member? tmp > + raise MCXUtilException, > + "Coult not parse ds_type from resource name '#{name}'. > Specify with ds_type parameter." > + end > + return tmp > + end > + > + # Given the resource name string, parse ds_name out. > + def parse_name(name) > + ds_name = name.split('/')[2] > + if ! ds_name.is_a? String > + raise MCXUtilException, > + "Could not parse ds_name from resource name '#{name}'. > Specify with ds_name parameter." > + end > + return ds_name > + end > + > +end > diff --git a/spec/unit/provider/mcx/mcxcontent.rb b/spec/unit/ > provider/mcx/mcxcontent.rb > index eedff7d..740baaf 100755 > --- a/spec/unit/provider/mcx/mcxcontent.rb > +++ b/spec/unit/provider/mcx/mcxcontent.rb > @@ -98,23 +98,23 @@ describe provider_class do > @resource.stubs(:[]).with(:name).returns "/Foo/bar" > end > it "should not accept /Foo/bar" do > - lambda { @provider.create }.should > raise_error(MCXContentProviderException) > + lambda { @provider.create }.should > raise_error(Puppet::Util::Mcx::MCXUtilException) > end > it "should accept /Foo/bar with ds_type => user" do > @resource.stubs(:[]).with(:ds_type).returns "user" > - lambda { @provider.create }.should_not > raise_error(MCXContentProviderException) > + lambda { @provider.create }.should_not raise_error > end > it "should accept /Foo/bar with ds_type => group" do > @resource.stubs(:[]).with(:ds_type).returns "group" > - lambda { @provider.create }.should_not > raise_error(MCXContentProviderException) > + lambda { @provider.create }.should_not raise_error > end > it "should accept /Foo/bar with ds_type => computer" do > @resource.stubs(:[]).with(:ds_type).returns "computer" > - lambda { @provider.create }.should_not > raise_error(MCXContentProviderException) > + lambda { @provider.create }.should_not raise_error > end > it "should accept :name => /Foo/bar with ds_type => > computerlist" do > @resource.stubs(:[]).with(:ds_type).returns "computerlist" > - lambda { @provider.create }.should_not > raise_error(MCXContentProviderException) > + lambda { @provider.create }.should_not raise_error > end > end > > @@ -123,35 +123,35 @@ describe provider_class do > @resource.stubs(:[]).with(:name).returns "foobar" > end > it "should not accept unspecified :ds_type and :ds_name" do > - lambda { @provider.create }.should > raise_error(MCXContentProviderException) > + lambda { @provider.create }.should > raise_error(Puppet::Util::Mcx::MCXUtilException) > end > it "should not accept unspecified :ds_type" do > @resource.stubs(:[]).with(:ds_type).returns "user" > - lambda { @provider.create }.should > raise_error(MCXContentProviderException) > + lambda { @provider.create }.should > raise_error(Puppet::Util::Mcx::MCXUtilException) > end > it "should not accept unspecified :ds_name" do > @resource.stubs(:[]).with(:ds_name).returns "foo" > - lambda { @provider.create }.should > raise_error(MCXContentProviderException) > + lambda { @provider.create }.should > raise_error(Puppet::Util::Mcx::MCXUtilException) > end > it "should accept :ds_type => user, ds_name => foo" do > @resource.stubs(:[]).with(:ds_type).returns "user" > @resource.stubs(:[]).with(:ds_name).returns "foo" > - lambda { @provider.create }.should_not > raise_error(MCXContentProviderException) > + lambda { @provider.create }.should_not raise_error > end > it "should accept :ds_type => group, ds_name => foo" do > @resource.stubs(:[]).with(:ds_type).returns "group" > @resource.stubs(:[]).with(:ds_name).returns "foo" > - lambda { @provider.create }.should_not > raise_error(MCXContentProviderException) > + lambda { @provider.create }.should_not raise_error > end > it "should accept :ds_type => computer, ds_name => foo" do > @resource.stubs(:[]).with(:ds_type).returns "computer" > @resource.stubs(:[]).with(:ds_name).returns "foo" > - lambda { @provider.create }.should_not > raise_error(MCXContentProviderException) > + lambda { @provider.create }.should_not raise_error > end > it "should accept :ds_type => computerlist, ds_name => foo" do > @resource.stubs(:[]).with(:ds_type).returns "computerlist" > @resource.stubs(:[]).with(:ds_name).returns "foo" > - lambda { @provider.create }.should_not > raise_error(MCXContentProviderException) > + lambda { @provider.create }.should_not raise_error > end > it "should not accept :ds_type => bogustype, ds_name => foo" > do > @resource.stubs(:[]).with(:ds_type).returns "bogustype" > diff --git a/spec/unit/type/mcx.rb b/spec/unit/type/mcx.rb > index 8016377..ce2baaf 100755 > --- a/spec/unit/type/mcx.rb > +++ b/spec/unit/type/mcx.rb > @@ -76,6 +76,103 @@ describe mcx_type, "default values" do > > end > > +describe mcx_type, "when managing resources when the ds_type and > ds_name are specified" do > + before :each do > + provider_class = mcx_type.provider(mcx_type.providers[0]) > + mcx_type.stubs(:defaultprovider).returns provider_class > + end > + > + after :each do > + mcx_type.clear > + end > + > + it "should autorequire groups when the type is specified" do > + foo_mcx = mcx_type.create(:name => 'foo1', :ds_type => > 'group', :ds_name => 'foo1') > + foo = Puppet::Type.type(:group).create(:name => 'foo1') > + > + config = Puppet::Node::Catalog.new :testing do |conf| > + [foo_mcx, foo].each { |resource| conf.add_resource > resource } > + end > + > + rel = foo_mcx.autorequire[0] > + rel.source.ref.should == foo.ref > + rel.target.ref.should == foo_mcx.ref > + end > + it "should autorequire users when the type is specified" do > + foo_mcx = mcx_type.create(:name => 'foo1', :ds_type => > 'user', :ds_name => 'foo1') > + foo = Puppet::Type.type(:user).create(:name => 'foo1') > + > + config = Puppet::Node::Catalog.new :testing do |conf| > + [foo_mcx, foo].each { |resource| conf.add_resource > resource } > + end > + > + rel = foo_mcx.autorequire[0] > + rel.source.ref.should == foo.ref > + rel.target.ref.should == foo_mcx.ref > + end > + it "should autorequire computers when the type is specified" do > + foo_mcx = mcx_type.create(:name => 'foo1', :ds_type => > 'computer', :ds_name => 'foo1') > + foo = Puppet::Type.type(:computer).create(:name => 'foo1') > + > + config = Puppet::Node::Catalog.new :testing do |conf| > + [foo_mcx, foo].each { |resource| conf.add_resource > resource } > + end > + > + rel = foo_mcx.autorequire[0] > + rel.source.ref.should == foo.ref > + rel.target.ref.should == foo_mcx.ref > + end > + > +end > + > +describe mcx_type, "when managing resources when the ds_type and > ds_name are not specified" do > + before :each do > + provider_class = mcx_type.provider(mcx_type.providers[0]) > + mcx_type.stubs(:defaultprovider).returns provider_class > + end > + > + after :each do > + mcx_type.clear > + end > + > + it "should autorequire groups when parsing the type" do > + foo_mcx = mcx_type.create(:name => '/Groups/foo') > + foo = Puppet::Type.type(:group).create(:name => 'foo') > + > + config = Puppet::Node::Catalog.new :testing do |conf| > + [foo_mcx, foo].each { |resource| conf.add_resource > resource } > + end > + > + rel = foo_mcx.autorequire[0] > + rel.source.ref.should == foo.ref > + rel.target.ref.should == foo_mcx.ref > + end > + it "should autorequire users when parsing the type" do > + foo_mcx = mcx_type.create(:name => '/Users/foo') > + foo = Puppet::Type.type(:user).create(:name => 'foo') > + > + config = Puppet::Node::Catalog.new :testing do |conf| > + [foo_mcx, foo].each { |resource| conf.add_resource > resource } > + end > + > + rel = foo_mcx.autorequire[0] > + rel.source.ref.should == foo.ref > + rel.target.ref.should == foo_mcx.ref > + end > + it "should autorequire computers when parsing the type" do > + foo_mcx = mcx_type.create(:name => '/Computers/foo') > + foo = Puppet::Type.type(:computer).create(:name => 'foo') > + > + config = Puppet::Node::Catalog.new :testing do |conf| > + [foo_mcx, foo].each { |resource| conf.add_resource > resource } > + end > + > + rel = foo_mcx.autorequire[0] > + rel.source.ref.should == foo.ref > + rel.target.ref.should == foo_mcx.ref > + end > +end > + > describe mcx_type, "when validating properties" do > > before :each do > -- > 1.6.0.4 > > > > -- The only thing that saves us from the bureaucracy is inefficiency. An efficient bureaucracy is the greatest threat to liberty. --Eugene McCarthy --------------------------------------------------------------------- Luke Kanies | http://reductivelabs.com | http://madstop.com --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Puppet Developers" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/puppet-dev?hl=en -~----------~----~----~----~------~----~------~--~---
