diff --git a/lib/linux_admin/disk.rb b/lib/linux_admin/disk.rb index e704930..df96f1a 100644 --- a/lib/linux_admin/disk.rb +++ b/lib/linux_admin/disk.rb @@ -88,7 +88,19 @@ def partitions end end + def create_partition_table(type = "msdos") + run!(cmd(:parted), :params => { nil => [path, "mklabel", type]}) + end + + def has_partition_table? + result = run(cmd(:parted), :params => { nil => [path, "print"]}) + + result_indicates_partition_table?(result) + end + def create_partition(partition_type, size) + create_partition_table unless has_partition_table? + id, start = partitions.empty? ? [1, 0] : [(partitions.last.id + 1), @@ -118,5 +130,13 @@ def clear! self end + + private + + def result_indicates_partition_table?(result) + # parted exits with 1 but writes this oddly spelled error to stdout. + missing = (result.exit_status == 1 && result.output.include?("unrecognised disk label")) + !missing + end end end diff --git a/spec/disk_spec.rb b/spec/disk_spec.rb index a5cc1c8..e66dc55 100644 --- a/spec/disk_spec.rb +++ b/spec/disk_spec.rb @@ -106,6 +106,7 @@ @disk.instance_variable_set(:@partitions, [LinuxAdmin::Partition.new(:id => 1, :end_sector => 1024)]) + @disk.stub(:has_partition_table? => true) end it "uses parted" do @@ -139,6 +140,35 @@ @disk.create_partition 'primary', 1024 }.should change{@disk.partitions.size}.by(1) end + + it "creates partition table if missing" do + @disk.stub(:has_partition_table? => false) + @disk.should_receive(:create_partition_table) + @disk.should_receive(:run!) + @disk.create_partition 'primary', 1024 + end + end + + describe "#has_partition_table?" do + it "positive case" do + disk = LinuxAdmin::Disk.new :path => '/dev/hda' + disk.should_receive(:run).and_return(double(:output => "", :exit_status => 0)) + disk.should have_partition_table + end + + it "negative case" do + disk = LinuxAdmin::Disk.new :path => '/dev/hda' + output = "\e[?1034h\r\rError: /dev/sdb: unrecognised disk label\n" + disk.should_receive(:run).and_return(double(:output => output, :exit_status => 1)) + disk.should_not have_partition_table + end + end + + it "#create_partition_table" do + disk = LinuxAdmin::Disk.new :path => '/dev/hda' + options = {:params => {nil => ["/dev/hda", "mklabel", "msdos"]}} + disk.should_receive(:run!).with(disk.cmd(:parted), options) + disk.create_partition_table end describe "#clear!" do