From b80e106ace391d88de683c3da5e03878ce1ffa1d Mon Sep 17 00:00:00 2001 From: Al Bailey Date: Tue, 7 Jun 2016 10:36:17 -0400 Subject: [PATCH] puppet-lvm kilo quilt changes --- .../lvm/lib/puppet/provider/logical_volume/lvm.rb | 194 ++++++++++++++------- .../lvm/lib/puppet/provider/physical_volume/lvm.rb | 2 +- .../lvm/lib/puppet/provider/volume_group/lvm.rb | 60 ++++++- .../modules/lvm/lib/puppet/type/logical_volume.rb | 32 +++- .../puppet/modules/lvm/manifests/logical_volume.pp | 6 + packstack/puppet/modules/lvm/manifests/volume.pp | 11 +- .../puppet/provider/logical_volume/lvm_spec.rb | 55 +++--- 7 files changed, 267 insertions(+), 93 deletions(-) diff --git a/packstack/puppet/modules/lvm/lib/puppet/provider/logical_volume/lvm.rb b/packstack/puppet/modules/lvm/lib/puppet/provider/logical_volume/lvm.rb index e813193..2f41695 100755 --- a/packstack/puppet/modules/lvm/lib/puppet/provider/logical_volume/lvm.rb +++ b/packstack/puppet/modules/lvm/lib/puppet/provider/logical_volume/lvm.rb @@ -3,24 +3,56 @@ Puppet::Type.type(:logical_volume).provide :lvm do commands :lvcreate => 'lvcreate', :lvremove => 'lvremove', + :lvresize => 'lvresize', :lvextend => 'lvextend', :lvs => 'lvs', - :resize2fs => 'resize2fs', + :vgs => 'vgs', :umount => 'umount', :blkid => 'blkid', :dmsetup => 'dmsetup', + :dd => 'dd', :lvconvert => 'lvconvert', - :lvdisplay => 'lvdisplay' - - optional_commands :xfs_growfs => 'xfs_growfs', - :resize4fs => 'resize4fs' + :lvdisplay => 'lvdisplay', + :fsadm => 'fsadm', + :dd => 'dd' + + def round_to_extent(size) + lvm_size_units = { + "K" => 1**0, "M" => 1024**1, "G" => 1024**2, "T" => 1024**3, "P" => 1024**4, "E" => 1025**5, + } + + if @resource[:size] =~ /^([0-9]+(\.[0-9]+)?)([KMGTPE])/i + size_value = $1.to_f + size_unit = $3.upcase + size_kibi = (size_value * lvm_size_units[size_unit]).to_i + if vgs('--noheading', '-o', 'vg_extent_size', '--units', 'k', "#{@resource[:volume_group]}") =~ /\s+(\d+)\.\d+k/i + vg_extent_size_kibi = $1.to_i + end + new_size_kibi = ((size_kibi + vg_extent_size_kibi - 1) / vg_extent_size_kibi) * vg_extent_size_kibi + "#{new_size_kibi}k" + else + size + end + end def create args = ['-n', @resource[:name]] if @resource[:size] - args.push('--size', @resource[:size]) + size = @resource[:size] + if size == 'max' + size = vgs('--noheading', '-o', 'vg_size', '--units', 'k', "#{@resource[:volume_group]}").strip + elsif @resource[:round_to_extent] then + size = round_to_extent(size) + end + args.push('--size', size) elsif @resource[:initial_size] - args.push('--size', @resource[:initial_size]) + args.push( + '--size', + if @resource[:round_to_extent] then + round_to_extent(@resource[:initial_size]) + else + @resource[:initial_size] + end) end if @resource[:extents] args.push('--extents', @resource[:extents]) @@ -63,6 +95,7 @@ Puppet::Type.type(:logical_volume).provide :lvm do args << @resource[:volume_group] lvcreate(*args) + lvzero end def destroy @@ -75,9 +108,16 @@ Puppet::Type.type(:logical_volume).provide :lvm do lvs(@resource[:volume_group]) =~ lvs_pattern end + def exec_cmd(*cmd) + output = Puppet::Util::Execution.execute(cmd, :failonfail => false, :combine => true) + {:out => output, :exit => $CHILD_STATUS.exitstatus} + end + def size if @resource[:size] =~ /^\d+\.?\d{0,2}([KMGTPE])/i unit = $1.downcase + else + unit = 'k' end raw = lvs('--noheading', '--unit', unit, path) @@ -92,64 +132,87 @@ Puppet::Type.type(:logical_volume).provide :lvm do end def size=(new_size) - lvm_size_units = { "K" => 1, "M" => 1024, "G" => 1048576, "T" => 1073741824, "P" => 1099511627776, "E" => 1125899906842624 } - lvm_size_units_match = lvm_size_units.keys().join('|') + lvm_size_units = { + "K" => 1**0, "M" => 1024**1, "G" => 1024**2, "T" => 1024**3, "P" => 1024**4, "E" => 1025**5, + } - resizeable = false - current_size = size() + current_size = size() - if current_size =~ /(\d+\.{0,1}\d{0,2})(#{lvm_size_units_match})/i - current_size_bytes = $1.to_i - current_size_unit = $2.upcase - end + if current_size =~ /^([0-9]+(\.[0-9]+)?)([KMGTPE])/i + current_size_value = $1.to_f + current_size_unit = $3.upcase + current_size = (current_size_value * lvm_size_units[current_size_unit]).to_i + end - if new_size =~ /(\d+)(#{lvm_size_units_match})/i - new_size_bytes = $1.to_i - new_size_unit = $2.upcase - end + info( "Current: value=#{current_size_value}, unit=#{current_size_unit}, kibi=#{current_size}" ) - ## Get the extend size - if lvs('--noheading', '-o', 'vg_extent_size', '--units', 'k', path) =~ /\s+(\d+)\.\d+k/i - vg_extent_size = $1.to_i - end + if new_size == 'max' + new_size = vgs('--noheading', '-o', 'vg_size', '--units', 'k', "#{@resource[:volume_group]}").strip + end - ## Verify that it's a extension: Reduce is potentially dangerous and should be done manually - if lvm_size_units[current_size_unit] < lvm_size_units[new_size_unit] - resizeable = true - elsif lvm_size_units[current_size_unit] > lvm_size_units[new_size_unit] - if (current_size_bytes * lvm_size_units[current_size_unit]) < (new_size_bytes * lvm_size_units[new_size_unit]) - resizeable = true - end - elsif lvm_size_units[current_size_unit] == lvm_size_units[new_size_unit] - if new_size_bytes > current_size_bytes - resizeable = true - end - end + if new_size =~ /^([0-9]+(\.[0-9]+)?)([KMGTPE])/i + new_size_value = $1.to_f + new_size_unit = $3.upcase + new_size = (new_size_value * lvm_size_units[new_size_unit]).to_i + end - if not resizeable - if @resource[:size_is_minsize] == :true or @resource[:size_is_minsize] == true or @resource[:size_is_minsize] == 'true' - info( "Logical volume already has minimum size of #{new_size} (currently #{current_size})" ) - else - fail( "Decreasing the size requires manual intervention (#{new_size} < #{current_size})" ) - end - else - ## Check if new size fits the extend blocks - if new_size_bytes * lvm_size_units[new_size_unit] % vg_extent_size != 0 - fail( "Cannot extend to size #{new_size} because VG extent size is #{vg_extent_size} KB" ) - end + info( "New: value=#{new_size_value}, unit=#{new_size_unit}, kibi=#{new_size}" ) - lvextend( '-L', new_size, path) || fail( "Cannot extend to size #{new_size} because lvextend failed." ) + ## Get the extend size + if lvs('--noheading', '-o', 'vg_extent_size', '--units', 'k', path) =~ /\s+(\d+)\.\d+k/i + vg_extent_size = $1.to_i + end - blkid_type = blkid(path) - if command(:resize4fs) and blkid_type =~ /\bTYPE=\"(ext4)\"/ - resize4fs( path) || fail( "Cannot resize file system to size #{new_size} because resize2fs failed." ) - elsif blkid_type =~ /\bTYPE=\"(ext[34])\"/ - resize2fs( path) || fail( "Cannot resize file system to size #{new_size} because resize2fs failed." ) - elsif blkid_type =~ /\bTYPE=\"(xfs)\"/ - xfs_growfs( path) || fail( "Cannot resize filesystem to size #{new_size} because xfs_growfs failed." ) + if new_size < current_size + if @resource[:size_is_minsize] == :true or @resource[:size_is_minsize] == true or @resource[:size_is_minsize] == 'true' + info( "Logical volume already has minimum size of #{new_size} (currently #{current_size})" ) + else + if not @resource[:allow_reduce] + fail( "Decreasing the size requires manual intervention (#{new_size} < #{current_size})" ) + end + if new_size % vg_extent_size != 0 + if @resource[:round_to_extent] + new_size = ((new_size + vg_extent_size - 1) / vg_extent_size) * vg_extent_size + if new_size >= current_size + info( "Logical volume already has a size of #{current_size}" ) + return + end + else + fail( "Cannot reduce to size #{new_size} because VG extent size is #{vg_extent_size} KB" ) end - + end + exec_cmd('umount', path) + exec_cmd('fsadm', '-y', 'check', path ) + r = exec_cmd('fsadm', '-y', 'resize', path, "#{new_size}k") + if r[:exit] != 0 and @resource[:nuke_fs_on_resize_failure] + exec_cmd('dd', 'if=/dev/zero', "of=#{path}", "bs=512", "count=16", "conv=notrunc") + blkid('-g') + end + lvresize( '-f', '-L', "#{new_size}k", path) || fail( "Cannot reduce to size #{new_size} because lvresize failed." ) + end + elsif new_size > current_size + if new_size % vg_extent_size != 0 + if @resource[:round_to_extent] + new_size = ((new_size + vg_extent_size - 1) / vg_extent_size) * vg_extent_size + if new_size <= current_size + info( "Logical volume already has a size of #{current_size}" ) + return + end + else + fail( "Cannot extend to size #{new_size} because VG extent size is #{vg_extent_size} KB" ) + end + end + lvextend( '-L', "#{new_size}k", path) || fail( "Cannot extend to size #{new_size} because lvextend failed." ) + exec_cmd('umount', path) + exec_cmd('fsadm', '-y', 'check', path ) + r = exec_cmd('fsadm', '-y', 'resize', path, "#{new_size}k") + if r[:exit] != 0 and @resource[:nuke_fs_on_resize_failure] + exec_cmd('dd', 'if=/dev/zero', "of=#{path}", "bs=512", "count=16", "conv=notrunc") + blkid('-g') end + else + info( "Logical volume already has a size of #{current_size}" ) + end end @@ -161,7 +224,7 @@ Puppet::Type.type(:logical_volume).provide :lvm do # Minus one because it says "2" when there is only one spare. And so on. n = ($1.to_i)-1 #puts " current mirrors: #{n}" - return n.to_s + return n.to_s end return 0.to_s end @@ -176,7 +239,7 @@ Puppet::Type.type(:logical_volume).provide :lvm do end # Region size cannot be changed on an existing mirror (not even when changing to zero mirrors). - + if @resource[:alloc] args.push( '--alloc', @resource[:alloc] ) end @@ -222,9 +285,6 @@ Puppet::Type.type(:logical_volume).provide :lvm do end end - - - private def lvs_pattern @@ -240,4 +300,18 @@ Puppet::Type.type(:logical_volume).provide :lvm do "/dev/#{@resource[:volume_group]}" end + def lvzero + if lvs('--noheading', '-o', 'lv_size', '--units', 'm', path) =~ /\s+(\d+)\.\d+m/i + lv_size = $1.to_i + lv_size = lv_size - 2 + begin + dd('if=/dev/zero', 'of=' + path, 'bs=1M', "seek=#{lv_size}") + rescue + end + begin + dd('if=/dev/zero', 'of=' + path, 'bs=1M', 'count=100') + rescue + end + end + end end diff --git a/packstack/puppet/modules/lvm/lib/puppet/provider/physical_volume/lvm.rb b/packstack/puppet/modules/lvm/lib/puppet/provider/physical_volume/lvm.rb index eaefc92..6ac6e0a 100644 --- a/packstack/puppet/modules/lvm/lib/puppet/provider/physical_volume/lvm.rb +++ b/packstack/puppet/modules/lvm/lib/puppet/provider/physical_volume/lvm.rb @@ -4,7 +4,7 @@ Puppet::Type.type(:physical_volume).provide(:lvm) do commands :pvcreate => 'pvcreate', :pvremove => 'pvremove', :pvs => 'pvs', :vgs => 'vgs' def create - pvcreate(@resource[:name]) + pvcreate('-y', @resource[:name]) end def destroy diff --git a/packstack/puppet/modules/lvm/lib/puppet/provider/volume_group/lvm.rb b/packstack/puppet/modules/lvm/lib/puppet/provider/volume_group/lvm.rb index c8de071..3d54dba 100644 --- a/packstack/puppet/modules/lvm/lib/puppet/provider/volume_group/lvm.rb +++ b/packstack/puppet/modules/lvm/lib/puppet/provider/volume_group/lvm.rb @@ -1,12 +1,18 @@ +require 'csv' + Puppet::Type.type(:volume_group).provide :lvm do desc "Manages LVM volume groups" commands :vgcreate => 'vgcreate', :vgremove => 'vgremove', + :pvremove => 'pvremove', :vgs => 'vgs', :vgextend => 'vgextend', :vgreduce => 'vgreduce', - :pvs => 'pvs' + :vgscan => 'vgscan', + :pvs => 'pvs', + :lvremove => 'lvremove', + :umount => 'umount' def create vgcreate(@resource[:name], *@resource.should(:physical_volumes)) @@ -22,17 +28,55 @@ Puppet::Type.type(:volume_group).provide :lvm do false end + def exec_cmd(*cmd) + output = Puppet::Util::Execution.execute(cmd, :failonfail => false, :combine => true) + {:out => output, :exit => $CHILD_STATUS.exitstatus} + end + def physical_volumes=(new_volumes = []) - # Only take action if createonly is false just to be safe - # this is really only here to enforce the createonly setting - # if something goes wrong in physical_volumes - if @resource[:createonly].to_s == "false" - existing_volumes = physical_volumes - extraneous = existing_volumes - new_volumes - extraneous.each { |volume| reduce_with(volume) } + # Only take action if createonly is false just to be safe + # this is really only here to enforce the createonly setting + # if something goes wrong in physical_volumes + if @resource[:createonly].to_s == "false" + vgreduce('--removemissing', '--force', @resource[:name]) + existing_volumes = physical_volumes + extraneous = existing_volumes - new_volumes + pv_to_lv={} + pv_to_dev={} + csv = CSV.new(pvs('-o', 'pv_name,vg_name,lv_name', '--separator', ','), + :headers => true, :header_converters => :symbol) + csv.to_a.map {|row| row.to_hash}.each do |m| + unless m[:lv].nil? + pv_to_lv[m[:_pv].strip] = "#{m[:vg]}/#{m[:lv]}" + pv_to_dev[m[:_pv].strip] = "#{m[:vg].gsub('-','--')}-#{m[:lv].gsub('-','--')}" + end + end + + if extraneous == existing_volumes + extraneous.each do |volume| + if pv_to_lv.has_key?(volume) + exec_cmd('/bin/umount', "/dev/mapper/#{pv_to_dev[volume]}") + lvremove('-f', pv_to_lv[volume]) + end + end + vgremove(@resource[:name], '--force') + extraneous.each do |volume| + pvremove(volume) + end + vgcreate(@resource[:name], *new_volumes) + else + extraneous.each do |volume| + if pv_to_lv.has_key?(volume) + exec_cmd('/bin/umount', "/dev/mapper/#{pv_to_dev[volume]}") + lvremove('-f', pv_to_lv[volume]) + end + reduce_with(volume) + pvremove(volume) + end missing = new_volumes - existing_volumes missing.each { |volume| extend_with(volume) } end + end end def physical_volumes diff --git a/packstack/puppet/modules/lvm/lib/puppet/type/logical_volume.rb b/packstack/puppet/modules/lvm/lib/puppet/type/logical_volume.rb index f907e08..3081650 100644 --- a/packstack/puppet/modules/lvm/lib/puppet/type/logical_volume.rb +++ b/packstack/puppet/modules/lvm/lib/puppet/type/logical_volume.rb @@ -31,7 +31,7 @@ Puppet::Type.newtype(:logical_volume) do newproperty(:size) do desc "The size of the logical volume. Set to undef to use all available space" validate do |value| - unless value =~ /^[0-9]+(\.[0-9]+)?[KMGTPE]/i + unless value =~ /(^[0-9]+(\.[0-9]+)?[KMGTPE]|max)/i raise ArgumentError , "#{value} is not a valid logical volume size" end end @@ -50,6 +50,36 @@ Puppet::Type.newtype(:logical_volume) do desc "Configures the logical volume type. AIX only" end + newparam(:allow_reduce) do + desc "Allow reducing logical volume size." + validate do |value| + unless [:true, true, "true", :false, false, "false"].include?(value) + raise ArgumentError , "allow_reduce must either be true or false" + end + end + defaultto :false + end + + newparam(:round_to_extent) do + desc "Allow rounding of logical volume size to extent size." + validate do |value| + unless [:true, true, "true", :false, false, "false"].include?(value) + raise ArgumentError , "round_to_extent must either be true or false" + end + end + defaultto :false + end + + newparam(:nuke_fs_on_resize_failure) do + desc "Remove filesystem on logical volume resize failure." + defaultto :false + validate do |value| + unless [:true, true, "true", :false, false, "false"].include?(value) + raise ArgumentError , "nuke_fs_on_resize_failure must either be true or false" + end + end + end + newparam(:range) do desc "Sets the inter-physical volume allocation policy. AIX only" validate do |value| diff --git a/packstack/puppet/modules/lvm/manifests/logical_volume.pp b/packstack/puppet/modules/lvm/manifests/logical_volume.pp index e6e5e78..4888b5d 100644 --- a/packstack/puppet/modules/lvm/manifests/logical_volume.pp +++ b/packstack/puppet/modules/lvm/manifests/logical_volume.pp @@ -3,7 +3,9 @@ define lvm::logical_volume ( $volume_group, $size = undef, + $size_is_minsize = false, $initial_size = undef, + $round_to_extent = false, $ensure = present, $options = 'defaults', $pass = '2', @@ -12,6 +14,7 @@ define lvm::logical_volume ( $mkfs_options = undef, $mountpath = "/${name}", $mountpath_require = false, + $remounts = true, $createfs = true, $extents = undef, $stripes = undef, @@ -21,6 +24,7 @@ define lvm::logical_volume ( ) { validate_bool($mountpath_require) + validate_bool($size_is_minsize) if ($name == undef) { fail("lvm::logical_volume \$name can't be undefined") @@ -51,6 +55,7 @@ define lvm::logical_volume ( ensure => $ensure, volume_group => $volume_group, size => $size, + size_is_minsize => $size_is_minsize, initial_size => $initial_size, stripes => $stripes, stripesize => $stripesize, @@ -81,6 +86,7 @@ define lvm::logical_volume ( pass => $pass, dump => $dump, atboot => true, + remounts => $remounts, } } } diff --git a/packstack/puppet/modules/lvm/manifests/volume.pp b/packstack/puppet/modules/lvm/manifests/volume.pp index a8bc3c8..bdfc937 100644 --- a/packstack/puppet/modules/lvm/manifests/volume.pp +++ b/packstack/puppet/modules/lvm/manifests/volume.pp @@ -59,7 +59,10 @@ define lvm::volume ( $fstype = undef, $size = undef, $extents = undef, - $initial_size = undef + $initial_size = undef, + $allow_reduce = false, + $round_to_extent = false, + $nuke_fs_on_resize_failure = false ) { if ($name == undef) { @@ -88,6 +91,9 @@ define lvm::volume ( volume_group => $vg, size => $size, initial_size => $initial_size, + allow_reduce => $allow_reduce, + round_to_extent => $round_to_extent, + nuke_fs_on_resize_failure => $nuke_fs_on_resize_failure, before => Volume_group[$vg] } } @@ -124,6 +130,9 @@ define lvm::volume ( volume_group => $vg, size => $size, extents => $extents, + allow_reduce => $allow_reduce, + round_to_extent => $round_to_extent, + nuke_fs_on_resize_failure => $nuke_fs_on_resize_failure, require => Volume_group[$vg] } diff --git a/packstack/puppet/modules/lvm/spec/unit/puppet/provider/logical_volume/lvm_spec.rb b/packstack/puppet/modules/lvm/spec/unit/puppet/provider/logical_volume/lvm_spec.rb index 56c32a5..a465a7f 100644 --- a/packstack/puppet/modules/lvm/spec/unit/puppet/provider/logical_volume/lvm_spec.rb +++ b/packstack/puppet/modules/lvm/spec/unit/puppet/provider/logical_volume/lvm_spec.rb @@ -12,23 +12,24 @@ describe provider_class do describe 'when creating' do context 'with size' do it "should execute 'lvcreate' with a '--size' option" do - @resource.expects(:[]).with(:name).returns('mylv') - @resource.expects(:[]).with(:volume_group).returns('myvg') + @resource.expects(:[]).with(:name).returns('mylv').at_least_once + @resource.expects(:[]).with(:volume_group).returns('myvg').at_least_once @resource.expects(:[]).with(:size).returns('1g').at_least_once @resource.expects(:[]).with(:extents).returns(nil).at_least_once @resource.expects(:[]).with(:stripes).returns(nil).at_least_once @resource.expects(:[]).with(:stripesize).returns(nil).at_least_once @resource.expects(:[]).with(:readahead).returns(nil).at_least_once @resource.expects(:[]).with(:mirror).returns(nil).at_least_once - @resource.expects(:[]).with(:alloc).returns(nil).at_least_once + @resource.expects(:[]).with(:alloc).returns(nil).at_least_once + @resource.expects(:[]).with(:round_to_extent).returns(false).at_least_once @provider.expects(:lvcreate).with('-n', 'mylv', '--size', '1g', 'myvg') @provider.create end end context 'with initial_size' do it "should execute 'lvcreate' with a '--size' option" do - @resource.expects(:[]).with(:name).returns('mylv') - @resource.expects(:[]).with(:volume_group).returns('myvg') + @resource.expects(:[]).with(:name).returns('mylv').at_least_once + @resource.expects(:[]).with(:volume_group).returns('myvg').at_least_once @resource.expects(:[]).with(:initial_size).returns('1g').at_least_once @resource.expects(:[]).with(:size).returns(nil).at_least_once @resource.expects(:[]).with(:extents).returns(nil).at_least_once @@ -36,15 +37,16 @@ describe provider_class do @resource.expects(:[]).with(:stripesize).returns(nil).at_least_once @resource.expects(:[]).with(:readahead).returns(nil).at_least_once @resource.expects(:[]).with(:mirror).returns(nil).at_least_once - @resource.expects(:[]).with(:alloc).returns(nil).at_least_once + @resource.expects(:[]).with(:alloc).returns(nil).at_least_once + @resource.expects(:[]).with(:round_to_extent).returns(false).at_least_once @provider.expects(:lvcreate).with('-n', 'mylv', '--size', '1g', 'myvg') @provider.create end end context 'without size and without extents' do it "should execute 'lvcreate' without a '--size' option or a '--extents' option" do - @resource.expects(:[]).with(:name).returns('mylv') - @resource.expects(:[]).with(:volume_group).returns('myvg') + @resource.expects(:[]).with(:name).returns('mylv').at_least_once + @resource.expects(:[]).with(:volume_group).returns('myvg').at_least_once @resource.expects(:[]).with(:size).returns(nil).at_least_once @resource.expects(:[]).with(:initial_size).returns(nil).at_least_once @resource.expects(:[]).with(:extents).returns(nil).at_least_once @@ -52,45 +54,47 @@ describe provider_class do @resource.expects(:[]).with(:stripesize).returns(nil).at_least_once @resource.expects(:[]).with(:readahead).returns(nil).at_least_once @resource.expects(:[]).with(:mirror).returns(nil).at_least_once - @resource.expects(:[]).with(:alloc).returns(nil).at_least_once + @resource.expects(:[]).with(:alloc).returns(nil).at_least_once @provider.expects(:lvcreate).with('-n', 'mylv', '--extents', '100%FREE', 'myvg') @provider.create end end context 'with extents' do it "should execute 'lvcreate' with a '--extents' option" do - @resource.expects(:[]).with(:name).returns('mylv') - @resource.expects(:[]).with(:volume_group).returns('myvg') + @resource.expects(:[]).with(:name).returns('mylv').at_least_once + @resource.expects(:[]).with(:volume_group).returns('myvg').at_least_once @resource.expects(:[]).with(:size).returns('1g').at_least_once @resource.expects(:[]).with(:extents).returns('80%vg').at_least_once @resource.expects(:[]).with(:stripes).returns(nil).at_least_once @resource.expects(:[]).with(:stripesize).returns(nil).at_least_once @resource.expects(:[]).with(:readahead).returns(nil).at_least_once @resource.expects(:[]).with(:mirror).returns(nil).at_least_once - @resource.expects(:[]).with(:alloc).returns(nil).at_least_once + @resource.expects(:[]).with(:alloc).returns(nil).at_least_once + @resource.expects(:[]).with(:round_to_extent).returns(false).at_least_once @provider.expects(:lvcreate).with('-n', 'mylv', '--size', '1g', '--extents', '80%vg', 'myvg') @provider.create end end context 'without extents' do it "should execute 'lvcreate' without a '--extents' option" do - @resource.expects(:[]).with(:name).returns('mylv') - @resource.expects(:[]).with(:volume_group).returns('myvg') + @resource.expects(:[]).with(:name).returns('mylv').at_least_once + @resource.expects(:[]).with(:volume_group).returns('myvg').at_least_once @resource.expects(:[]).with(:size).returns('1g').at_least_once @resource.expects(:[]).with(:extents).returns(nil).at_least_once @resource.expects(:[]).with(:stripes).returns(nil).at_least_once @resource.expects(:[]).with(:stripesize).returns(nil).at_least_once @resource.expects(:[]).with(:readahead).returns(nil).at_least_once @resource.expects(:[]).with(:mirror).returns(nil).at_least_once - @resource.expects(:[]).with(:alloc).returns(nil).at_least_once + @resource.expects(:[]).with(:alloc).returns(nil).at_least_once + @resource.expects(:[]).with(:round_to_extent).returns(false).at_least_once @provider.expects(:lvcreate).with('-n', 'mylv', '--size', '1g', 'myvg') @provider.create end end context 'with initial_size and mirroring' do it "should execute 'lvcreate' with '--size' and '--mirrors' and '--mirrorlog' options" do - @resource.expects(:[]).with(:name).returns('mylv') - @resource.expects(:[]).with(:volume_group).returns('myvg') + @resource.expects(:[]).with(:name).returns('mylv').at_least_once + @resource.expects(:[]).with(:volume_group).returns('myvg').at_least_once @resource.expects(:[]).with(:initial_size).returns('1g').at_least_once @resource.expects(:[]).with(:size).returns(nil).at_least_once @resource.expects(:[]).with(:extents).returns(nil).at_least_once @@ -102,6 +106,7 @@ describe provider_class do @resource.expects(:[]).with(:region_size).returns(nil).at_least_once @resource.expects(:[]).with(:no_sync).returns(nil).at_least_once @resource.expects(:[]).with(:alloc).returns(nil).at_least_once + @resource.expects(:[]).with(:round_to_extent).returns(false).at_least_once @provider.expects(:lvcreate).with('-n', 'mylv', '--size', '1g', '--mirrors', '1', '--mirrorlog', 'core', 'myvg') @provider.create end @@ -120,13 +125,15 @@ describe provider_class do @resource.expects(:[]).with(:stripesize).returns(nil).at_least_once @resource.expects(:[]).with(:readahead).returns(nil).at_least_once @resource.expects(:[]).with(:mirror).returns(nil).at_least_once - @resource.expects(:[]).with(:alloc).returns(nil).at_least_once + @resource.expects(:[]).with(:alloc).returns(nil).at_least_once + @resource.expects(:[]).with(:round_to_extent).returns(false).at_least_once + @resource.expects(:[]).with(:nuke_fs_on_resize_failure).returns(false).at_least_once @provider.expects(:lvcreate).with('-n', 'mylv', '--size', '1g', 'myvg') @provider.create @provider.expects(:lvs).with('--noheading', '--unit', 'g', '/dev/myvg/mylv').returns(' 1.00g').at_least_once @provider.expects(:lvs).with('--noheading', '-o', 'vg_extent_size', '--units', 'k', '/dev/myvg/mylv').returns(' 1000.00k') @provider.expects(:lvextend).with('-L', '2000000k', '/dev/myvg/mylv').returns(true) - @provider.expects(:blkid).with('/dev/myvg/mylv') + #@provider.expects(:blkid).with('/dev/myvg/mylv') @provider.size = '2000000k' end end @@ -140,7 +147,8 @@ describe provider_class do @resource.expects(:[]).with(:stripesize).returns(nil).at_least_once @resource.expects(:[]).with(:readahead).returns(nil).at_least_once @resource.expects(:[]).with(:mirror).returns(nil).at_least_once - @resource.expects(:[]).with(:alloc).returns(nil).at_least_once + @resource.expects(:[]).with(:alloc).returns(nil).at_least_once + @resource.expects(:[]).with(:round_to_extent).returns(false).at_least_once @provider.expects(:lvcreate).with('-n', 'mylv', '--size', '1g', 'myvg') @provider.create @provider.expects(:lvs).with('--noheading', '--unit', 'g', '/dev/myvg/mylv').returns(' 1.00g').at_least_once @@ -161,7 +169,9 @@ describe provider_class do @resource.expects(:[]).with(:readahead).returns(nil).at_least_once @resource.expects(:[]).with(:size_is_minsize).returns(:false).at_least_once @resource.expects(:[]).with(:mirror).returns(nil).at_least_once - @resource.expects(:[]).with(:alloc).returns(nil).at_least_once + @resource.expects(:[]).with(:alloc).returns(nil).at_least_once + @resource.expects(:[]).with(:round_to_extent).returns(false).at_least_once + @resource.expects(:[]).with(:allow_reduce).returns(false).at_least_once @provider.expects(:lvcreate).with('-n', 'mylv', '--size', '1g', 'myvg') @provider.create @provider.expects(:lvs).with('--noheading', '--unit', 'g', '/dev/myvg/mylv').returns(' 1.00g').at_least_once @@ -182,7 +192,8 @@ describe provider_class do @resource.expects(:[]).with(:readahead).returns(nil).at_least_once @resource.expects(:[]).with(:size_is_minsize).returns(:true).at_least_once @resource.expects(:[]).with(:mirror).returns(nil).at_least_once - @resource.expects(:[]).with(:alloc).returns(nil).at_least_once + @resource.expects(:[]).with(:alloc).returns(nil).at_least_once + @resource.expects(:[]).with(:round_to_extent).returns(false).at_least_once @provider.expects(:lvcreate).with('-n', 'mylv', '--size', '1g', 'myvg') @provider.create @provider.expects(:lvs).with('--noheading', '--unit', 'g', '/dev/myvg/mylv').returns(' 1.00g').at_least_once -- 1.8.3.1