summaryrefslogtreecommitdiffstats
path: root/lib/puppet/type
diff options
context:
space:
mode:
Diffstat (limited to 'lib/puppet/type')
-rwxr-xr-xlib/puppet/type/zpool.rb43
1 files changed, 38 insertions, 5 deletions
diff --git a/lib/puppet/type/zpool.rb b/lib/puppet/type/zpool.rb
index 6d589a0fe..11618256f 100755
--- a/lib/puppet/type/zpool.rb
+++ b/lib/puppet/type/zpool.rb
@@ -1,4 +1,37 @@
module Puppet
+ class Property
+
+ class VDev < Property
+
+ def flatten_and_sort(array)
+ array.collect { |a| a.split(' ') }.flatten.sort
+ end
+
+ def insync?(is)
+ return true unless self.should
+
+ return @should == [:absent] if is == :absent
+
+ flatten_and_sort(is) == flatten_and_sort(@should)
+ end
+ end
+
+ class MultiVDev < VDev
+ def insync?(is)
+ return true unless self.should
+
+ return @should == [:absent] if is == :absent
+
+ return false unless is.length == @should.length
+
+ is.each_with_index { |list, i| return false unless flatten_and_sort(list) == flatten_and_sort(@should[i]) }
+
+ #if we made it this far we are in sync
+ true
+ end
+ end
+ end
+
newtype(:zpool) do
@doc = "Manage zpools. Create and delete zpools. The provider WILL NOT SYNC, only report differences.
@@ -6,11 +39,11 @@ module Puppet
ensurable
- newproperty(:disk, :array_matching => :all) do
+ newproperty(:disk, :array_matching => :all, :parent => Puppet::Property::VDev) do
desc "The disk(s) for this pool. Can be an array or space separated string"
end
- newproperty(:mirror, :array_matching => :all) do
+ newproperty(:mirror, :array_matching => :all, :parent => Puppet::Property::MultiVDev) do
desc "List of all the devices to mirror for this pool. Each mirror should be a space separated string.
mirror => [\"disk1 disk2\", \"disk3 disk4\"]"
@@ -21,7 +54,7 @@ module Puppet
end
end
- newproperty(:raidz, :array_matching => :all) do
+ newproperty(:raidz, :array_matching => :all, :parent => Puppet::Property::MultiVDev) do
desc "List of all the devices to raid for this pool. Should be an array of space separated strings.
raidz => [\"disk1 disk2\", \"disk3 disk4\"]"
@@ -32,11 +65,11 @@ module Puppet
end
end
- newproperty(:spare, :array_matching => :all) do
+ newproperty(:spare, :array_matching => :all, :parent => Puppet::Property::VDev) do
desc "Spare disk(s) for this pool."
end
- newproperty(:log, :array_matching => :all) do
+ newproperty(:log, :array_matching => :all, :parent => Puppet::Property::VDev) do
desc "Log disks for this pool. (doesn't support mirroring yet)"
end