Skip to content

Commit

Permalink
Export btrfs_set_default_volume_name
Browse files Browse the repository at this point in the history
  • Loading branch information
imobachgs committed Nov 3, 2016
1 parent 722c159 commit ea1a1e2
Show file tree
Hide file tree
Showing 5 changed files with 208 additions and 1 deletion.
31 changes: 31 additions & 0 deletions src/modules/AutoinstPartPlan.rb
Expand Up @@ -7,6 +7,7 @@
#
# $Id: AutoinstPartPlan.ycp 2813 2008-06-12 13:52:30Z sschober $
require "yast"
require "yast2/execute"

module Yast
class AutoinstPartPlanClass < Module
Expand Down Expand Up @@ -770,6 +771,36 @@ def Read
)
end

# Try to find the default subvol for the installation
#
# * Root partition takes precedence
# * Not supported: more than 1 Btrfs filesystems, one using
# a '@' default subvolume and the other using ''. In that case,
# default_subvolume is set to product's default.
def find_btrfs_subvol_name_default
parts = Storage.GetTargetMap.map { |_k, d| d.fetch("partitions") }.flatten.compact
btrfs_parts = parts.select { |p| p["used_fs"] == :btrfs }
default_subvol_names = btrfs_parts.reduce({}) do |memo, part|
memo[part["mount"]] = btrfs_subvol_name_for(part)
memo
end

# Root takes precedence
return default_subvol_names["/"] if default_subvol_names.has_key?("/")

# If all has the same default subvolume name
found_names = default_subvol_names.values.uniq
return found_names.first if found_names.size == 1

# If there're different values, fallback to product's default
btrfs_subvol_name_from_product
end

def btrfs_subvol_name_for(partition)
ret = Yast::Execute.on_target("btrfs", "subvol", "list", partition["mount"], stdout: :capture)
ret.split("\n").first =~ /.+ @\z/ ? "@" : ""
end

# Dump the settings to a map, for autoinstallation use.
# @return [Array]
def Export
Expand Down
58 changes: 57 additions & 1 deletion test/AutoinstPartPlan_test.rb
Expand Up @@ -5,6 +5,7 @@

Yast.import "AutoinstPartPlan"
Yast.import "Profile"
Yast.import "ProductFeatures"

describe Yast::AutoinstPartPlan do
let(:target_map_path) { File.join(FIXTURES_PATH, "storage", "nfs_root.yml") }
Expand Down Expand Up @@ -50,7 +51,7 @@
let(:default_subvol) { "@" }

before do
expect(Yast::Storage).to receive(:GetTargetMap).and_return(target_map)
allow(Yast::Storage).to receive(:GetTargetMap).and_return(target_map)
stub_const("Yast::FileSystems", double("filesystems", default_subvol: default_subvol))
Yast::AutoinstPartPlan.Read
end
Expand All @@ -74,4 +75,59 @@
expect(snapshots).to be_empty
end
end

describe "#find_btrfs_subvol_name_default" do
let(:target_map) { YAML.load_file(File.join(FIXTURES_PATH, "storage", "subvolumes.yml")) }
let(:btrfs_list) { File.read(File.join(FIXTURES_PATH, "output", "btrfs_list.out")) }
let(:btrfs_list_no_at) { File.read(File.join(FIXTURES_PATH, "output", "btrfs_list_no_at.out")) }
let(:default_subvol) { "@" }

before do
allow(Yast::Storage).to receive(:GetTargetMap).and_return(target_map)
allow(Yast::ProductFeatures).to receive(:GetStringFeature)
.with("partitioning", "btrfs_default_subvolume").and_return(default_subvol)
end

context "when root partition uses the default subvolume name (@)" do
let(:btrfs_list) { File.read(File.join(FIXTURES_PATH, "output", "btrfs_list.out")) }

it "returns the default subvolume name" do
allow(Yast::Execute).to receive(:on_target).with("btrfs", "subvol", "list", "/", anything)
.and_return(btrfs_list)
allow(Yast::Execute).to receive(:on_target).with("btrfs", "subvol", "list", "/srv", anything)
.and_return(btrfs_list_no_at)
expect(subject.find_btrfs_subvol_name_default).to eq(default_subvol)
end
end

context "when root partitions does not use the default subvolume name (@)" do
before do
allow(Yast::Execute).to receive(:on_target).with("btrfs", "subvol", "list", "/", anything)
.and_return(btrfs_list_no_at)
end

context "but all partitions uses the same subvolume name" do
before do
allow(Yast::Execute).to receive(:on_target).with("btrfs", "subvol", "list", "/srv", anything)
.and_return(btrfs_list_no_at)
end

it "returns the used name ('' in this case)" do
expect(Yast::AutoinstPartPlan.find_btrfs_subvol_name_default).to eq("")
end
end

context "and partitions uses different subvolume names" do
before do
allow(Yast::Execute).to receive(:on_target).with("btrfs", "subvol", "list", "/srv", anything)
.and_return(btrfs_list)
end

it "returns the distribution default" do
value = Yast::AutoinstPartPlan.find_btrfs_subvol_name_default
expect(value).to eq("")
end
end
end
end
end
28 changes: 28 additions & 0 deletions test/fixtures/output/btrfs_list.out
@@ -0,0 +1,28 @@
ID 257 gen 34 top level 5 path @
ID 258 gen 51 top level 257 path @/.snapshots
ID 259 gen 88 top level 258 path @/.snapshots/1/snapshot
ID 260 gen 44 top level 257 path @/boot/grub2/i386-pc
ID 261 gen 15 top level 257 path @/boot/grub2/x86_64-efi
ID 262 gen 44 top level 257 path @/home
ID 263 gen 51 top level 257 path @/opt
ID 264 gen 50 top level 257 path @/srv
ID 265 gen 88 top level 257 path @/tmp
ID 266 gen 64 top level 257 path @/usr/local
ID 267 gen 38 top level 257 path @/var/crash
ID 268 gen 22 top level 257 path @/var/lib/mailman
ID 269 gen 88 top level 257 path @/var/lib/named
ID 270 gen 24 top level 257 path @/var/lib/pgsql
ID 271 gen 88 top level 257 path @/var/log
ID 272 gen 38 top level 257 path @/var/opt
ID 273 gen 84 top level 257 path @/var/spool
ID 274 gen 51 top level 257 path @/var/tmp
ID 275 gen 30 top level 257 path @/mysubvol
ID 276 gen 47 top level 275 path @/mysubvol/mysubsubvol
ID 277 gen 32 top level 257 path @/myothersubvol
ID 278 gen 47 top level 277 path @/myothersubvol/myothersubsubvol
ID 279 gen 33 top level 257 path @/nocow
ID 280 gen 35 top level 257 path @/myvol
ID 282 gen 40 top level 259 path var/lib/machines
ID 283 gen 48 top level 258 path @/.snapshots/2/snapshot
ID 284 gen 49 top level 258 path @/.snapshots/3/snapshot
ID 285 gen 50 top level 258 path @/.snapshots/4/snapshot
27 changes: 27 additions & 0 deletions test/fixtures/output/btrfs_list_no_at.out
@@ -0,0 +1,27 @@
ID 257 gen 48 top level 5 path .snapshots
ID 258 gen 92 top level 257 path .snapshots/1/snapshot
ID 259 gen 41 top level 5 path boot/grub2/i386-pc
ID 260 gen 12 top level 5 path boot/grub2/x86_64-efi
ID 261 gen 41 top level 5 path home
ID 262 gen 49 top level 5 path opt
ID 263 gen 47 top level 5 path srv
ID 264 gen 91 top level 5 path tmp
ID 265 gen 61 top level 5 path usr/local
ID 266 gen 35 top level 5 path var/crash
ID 267 gen 19 top level 5 path var/lib/mailman
ID 268 gen 89 top level 5 path var/lib/named
ID 269 gen 21 top level 5 path var/lib/pgsql
ID 270 gen 90 top level 5 path var/log
ID 271 gen 35 top level 5 path var/opt
ID 272 gen 91 top level 5 path var/spool
ID 273 gen 48 top level 5 path var/tmp
ID 274 gen 27 top level 5 path mysubvol
ID 275 gen 44 top level 274 path mysubvol/mysubsubvol
ID 276 gen 29 top level 5 path @/myothersubvol
ID 277 gen 44 top level 276 path @/myothersubvol/myothersubsubvol
ID 278 gen 30 top level 5 path nocow
ID 279 gen 32 top level 5 path myvol
ID 281 gen 37 top level 258 path var/lib/machines
ID 282 gen 45 top level 257 path .snapshots/2/snapshot
ID 283 gen 46 top level 257 path .snapshots/3/snapshot
ID 284 gen 47 top level 257 path .snapshots/4/snapshot
65 changes: 65 additions & 0 deletions test/fixtures/storage/subvolumes.yml
Expand Up @@ -56,6 +56,71 @@
used_by_device: ''
dasd_format: 0
dasd_type: 0
"/dev/vdb":
unique: KSbE.Fxp0d3BezAE
bus: None
device: "/dev/vdb"
bios_id: '0x80'
driver: virtio-pci
driver_module: virtio_pci
partitions:
- device: "/dev/vdb1"
name: vdb1
used_by_type: :UB_NONE
used_by_device: ''
size_k: 753664
used_fs: :swap
detected_fs: :swap
mount: swap
mountby: :uuid
fstopt: defaults
uuid: 3fc06e37-d6b6-4411-baf3-2920cdf19fa4
nr: 1
fsid: 130
fstype: Linux swap
region:
- 0
- 94
type: :primary
- device: "/dev/vdb2"
name: vdb2
used_by:
- type: :UB_BTRFS
device: 862e2cbf-0501-48a1-85a3-142bfe3ab51b
used_by_type: :UB_BTRFS
used_by_device: 862e2cbf-0501-48a1-85a3-142bfe3ab51b
size_k: 13925376
used_fs: :btrfs
detected_fs: :btrfs
fstopt: defaults
nr: 2
fsid: 131
fstype: Linux native
region:
- 93
- 1734
type: :primary
boot: true
subvol:
- name: shared
- name: www
uuid: 862e2cbf-0501-48a1-85a3-142bfe3ab51b
mount: "/srv"
mountby: :uuid
size_k: 14680064
cyl_size: 8225280
cyl_count: 1827
sector_size: 512
label: msdos
name: vdb
max_logical: 255
max_primary: 4
type: :CT_DISK
transport: :unknown
used_by_type: :UB_NONE
used_by_device: ''
dasd_format: 0
dasd_type: 0
"/dev/btrfs":
device: "/dev/btrfs"
name: btrfs
Expand Down

0 comments on commit ea1a1e2

Please sign in to comment.