From b5a6802a1505804ed1459da8e259a35f7c4f23df Mon Sep 17 00:00:00 2001 From: Mo Morsi Date: Thu, 29 Aug 2013 18:03:18 -0400 Subject: [PATCH] if logical volume size <= 100, use value as % of free extents to allocate --- lib/linux_admin/logical_volume.rb | 30 +++++++++++++++++++++++++++--- spec/logical_volume_spec.rb | 30 +++++++++++++++++++++++++++--- 2 files changed, 54 insertions(+), 6 deletions(-) diff --git a/lib/linux_admin/logical_volume.rb b/lib/linux_admin/logical_volume.rb index fb94e44..dab4f58 100644 --- a/lib/linux_admin/logical_volume.rb +++ b/lib/linux_admin/logical_volume.rb @@ -38,10 +38,34 @@ def extend_with(vg) self end - def self.create(name, vg, size) + private + + def self.bytes_to_string(bytes) + if bytes > 1.gigabytes + (bytes / 1.gigabytes).to_s + "G" + elsif bytes > 1.megabytes + (bytes / 1.megabytes).to_s + "M" + elsif bytes > 1.kilobytes + (bytes / 1.kilobytes).to_s + "K" + else + bytes.to_s + end + end + + public + + def self.create(name, vg, value) self.scan # initialize local logical volumes - run!(cmd(:lvcreate), - :params => { '-n' => name, nil => vg.name, '-L' => size}) + params = { '-n' => name, nil => vg.name} + size = nil + if value <= 100 + # size = # TODO size from extents + params.merge!({'-l' => "#{value}%FREE"}) + else + size = value + params.merge!({'-L' => bytes_to_string(size)}) + end + run!(cmd(:lvcreate), :params => params) lv = LogicalVolume.new :name => name, :volume_group => vg, :sectors => size diff --git a/spec/logical_volume_spec.rb b/spec/logical_volume_spec.rb index 751afec..ac2f7e8 100644 --- a/spec/logical_volume_spec.rb +++ b/spec/logical_volume_spec.rb @@ -51,13 +51,37 @@ :params => { '-n' => 'lv', nil => 'vg', '-L' => '256G' }) - described_class.create 'lv', @vg, '256G' + described_class.create 'lv', @vg, 256.gigabytes + end + + context "size is specified" do + it "passes -L option to lvcreate" do + described_class.instance_variable_set(:@lvs, []) + described_class.should_receive(:run!). + with(LinuxAdmin.cmd(:lvcreate), + :params => { '-n' => 'lv', + nil => 'vg', + '-L' => '256G' }) + described_class.create 'lv', @vg, 256.gigabytes + end + end + + context "extents is specified" do + it "passes -l option to lvcreate" do + described_class.instance_variable_set(:@lvs, []) + described_class.should_receive(:run!). + with(LinuxAdmin.cmd(:lvcreate), + :params => { '-n' => 'lv', + nil => 'vg', + '-l' => '100%FREE' }) + described_class.create 'lv', @vg, 100 + end end it "returns new logical volume" do LinuxAdmin::VolumeGroup.stub(:run! => double(:output => "")) described_class.stub(:run! => double(:output => "")) - lv = described_class.create 'lv', @vg, '256G' + lv = described_class.create 'lv', @vg, 256.gigabytes lv.should be_an_instance_of(described_class) lv.name.should == 'lv' end @@ -65,7 +89,7 @@ it "adds logical volume to local registry" do LinuxAdmin::VolumeGroup.stub(:run! => double(:output => "")) described_class.stub(:run! => double(:output => "")) - lv = described_class.create 'lv', @vg, '256G' + lv = described_class.create 'lv', @vg, 256.gigabytes described_class.scan.should include(lv) end end