Signed-off-by: Sandor Szuecs <[email protected]>
---
 lib/puppet/provider/mcx/mcxcontent.rb     |  194 +++++++++++++----------------
 spec/unit/provider/mcx/mcxcontent_spec.rb |   26 ++--
 2 files changed, 102 insertions(+), 118 deletions(-)

diff --git a/lib/puppet/provider/mcx/mcxcontent.rb 
b/lib/puppet/provider/mcx/mcxcontent.rb
index cb5adc6..4f14faa 100644
--- a/lib/puppet/provider/mcx/mcxcontent.rb
+++ b/lib/puppet/provider/mcx/mcxcontent.rb
@@ -45,58 +45,92 @@ Puppet::Type.type(:mcx).provide :mcxcontent, :parent => 
Puppet::Provider do
     :computerlist => "ComputerLists",
   }
 
-  class MCXContentProviderException < Exception
-
-  end
-
   commands :dscl => "/usr/bin/dscl"
   confine :operatingsystem => :darwin
   defaultfor :operatingsystem => :darwin
-
-  # self.instances is all important.
-  # This is the only class method, it returns
-  # 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]}"
-      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."
-        else
-          # This node has MCX data.
-
-            rsrc = self.new(
+  
+  # FIXME: dslocal name is fixed. The default should be "Default" if we do not 
+  # want to break existing installations.
+  DSLOCAL_DIR = "Default"
+  
+  class << self
+    # It returns an array of instances of this class.
+    def instances
+      mcx_list = []
+      TypeMap.keys.each do |ds_type|
+        ds_path = "/Local/#{DSLOCAL_DIR}/#{TypeMap[ds_type]}"
+        output = dscl 'localhost', '-list', ds_path
+        member_list = output.split
+        member_list.each do |ds_name|
+          content = mcxexport(ds_type, ds_name)
+          if content.empty?
+            Puppet.debug "/#{TypeMap[ds_type]}/#{ds_name} has no MCX data."
+          else
+            # This node has MCX data.
+            mcx_list << self.new(
               :name => "/#{TypeMap[ds_type]}/#{ds_name}",
-                :ds_type => ds_type,
-                :ds_name => ds_name,
-
-                :content => content)
-          mcx_list << rsrc
+              :ds_type => ds_type,
+              :ds_name => ds_name,
+              :content => content)
+          end
         end
       end
+      mcx_list
+    end
+
+    def mcxexport(ds_type, ds_name)
+      ds_t = TypeMap[ds_type]
+      ds_n = ds_name.to_s
+      ds_path = "/Local/#{DSLOCAL_DIR}/#{ds_t}/#{ds_n}"
+      dscl 'localhost', '-mcxexport', ds_path
     end
-    mcx_list
   end
+  
+  public
 
-  private
+  def create
+    self.content=(resource[:content])
+  end
 
-  # mcxexport is used by instances, and therefore
-  # a class method.
-  def self.mcxexport(ds_type, ds_name)
-    ds_t = TypeMap[ds_type]
-    ds_n = ds_name.to_s
-    ds_path = "/Local/Default/#{ds_t}/#{ds_n}"
-    dscl 'localhost', '-mcxexport', ds_path
+  def destroy
+    ds_parms = get_dsparams
+    ds_t = TypeMap[ds_parms[:ds_type]]
+    ds_n = ds_parms[:ds_name].to_s
+    ds_path = "/Local/#{DSLOCAL_DIR}/#{ds_t}/#{ds_n}"
+
+    dscl 'localhost', '-mcxdelete', ds_path
   end
 
+  def exists?
+    begin
+      has_mcx?
+    rescue Puppet::ExecutionFailure => e
+      return false
+    end
+  end
+
+  def content
+    ds_parms = get_dsparams
+
+    self.class.mcxexport(ds_parms[:ds_type], ds_parms[:ds_name])
+  end
+
+  def content=(value)
+    # dscl localhost -mcximport
+    ds_parms = get_dsparams
+
+    mcximport(ds_parms[:ds_type], ds_parms[:ds_name], resource[:content])
+  end
+  
+  private
+  
+  def has_mcx?
+    !content.empty?
+  end
+  
   def mcximport(ds_type, ds_name, val)
     ds_t = TypeMap[ds_type]
-    ds_n = ds_name.to_s
-    ds_path = "/Local/Default/#{ds_t}/#{ds_name}"
+    ds_path = "/Local/#{DSLOCAL_DIR}/#{ds_t}/#{ds_name}"
 
     tmp = Tempfile.new('puppet_mcx')
     begin
@@ -111,95 +145,45 @@ Puppet::Type.type(:mcx).provide :mcxcontent, :parent => 
Puppet::Provider do
 
   # 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."
+    ds_type = name.split('/')[1]
+    unless ds_type
+      error("Could 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."
+    ds_type = ds_type.chop.downcase.to_sym
+    unless TypeMap.key? ds_type
+      error("Could not parse ds_type from resource name '#{name}'. Specify 
with ds_type parameter.")
     end
-    tmp
+    ds_type
   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."
+    unless ds_name
+      error("Could not parse ds_name from resource name '#{name}'. Specify 
with ds_name parameter.")
     end
     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.
+  # Gather ds_type and ds_name from resource or parse it out of the name.
   def get_dsparams
     ds_type = resource[:ds_type]
     ds_type ||= parse_type(resource[:name])
-    raise MCXContentProviderException unless TypeMap.keys.include? 
ds_type.to_sym
+    unless TypeMap.key? ds_type.to_sym
+      raise Puppet::Error.new("#{ds_type} is not a key in TypeMap") 
+    end
 
     ds_name = resource[:ds_name]
     ds_name ||= parse_name(resource[:name])
 
-    rval = {
+    {
       :ds_type => ds_type.to_sym,
       :ds_name => ds_name,
     }
-
-    return rval
-
   end
-
-  public
-
-  def create
-    self.content=(resource[:content])
+  
+  def error(msg)
+    raise Puppet::Error.new(msg)
   end
-
-  def destroy
-    ds_parms = get_dsparams
-    ds_t = TypeMap[ds_parms[:ds_type]]
-    ds_n = ds_parms[:ds_name].to_s
-    ds_path = "/Local/Default/#{ds_t}/#{ds_n}"
-
-    dscl 'localhost', '-mcxdelete', ds_path
-  end
-
-  def exists?
-    # JJM Just re-use the content method and see if it's empty.
-    begin
-      mcx = content
-    rescue Puppet::ExecutionFailure => e
-      return false
-    end
-    has_mcx = ! mcx.empty?
-  end
-
-  def content
-    ds_parms = get_dsparams
-
-      mcx = self.class.mcxexport(
-        ds_parms[:ds_type],
-
-          ds_parms[:ds_name])
-    mcx
-  end
-
-  def content=(value)
-    # dscl localhost -mcximport
-    ds_parms = get_dsparams
-
-      mcx = mcximport(
-        ds_parms[:ds_type],
-          ds_parms[:ds_name],
-
-          resource[:content])
-    mcx
-  end
-
 end
diff --git a/spec/unit/provider/mcx/mcxcontent_spec.rb 
b/spec/unit/provider/mcx/mcxcontent_spec.rb
index d3fb043..d6db168 100755
--- a/spec/unit/provider/mcx/mcxcontent_spec.rb
+++ b/spec/unit/provider/mcx/mcxcontent_spec.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::Error)
     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(Puppet::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(Puppet::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(Puppet::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(Puppet::Error)
     end
   end
 
@@ -123,40 +123,40 @@ 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::Error)
     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::Error)
     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::Error)
     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(Puppet::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(Puppet::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(Puppet::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(Puppet::Error)
     end
     it "should not accept :ds_type => bogustype, ds_name => foo" do
       @resource.stubs(:[]).with(:ds_type).returns "bogustype"
       @resource.stubs(:[]).with(:ds_name).returns "foo"
-      lambda { @provider.create }.should 
raise_error(MCXContentProviderException)
+      lambda { @provider.create }.should raise_error(Puppet::Error)
     end
   end
 
-- 
1.7.3.1

-- 
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.

Reply via email to