diff --git a/src/lib/y2storage/proposal/devices_planner.rb b/src/lib/y2storage/proposal/devices_planner.rb index a79f9e234..4a2260f74 100644 --- a/src/lib/y2storage/proposal/devices_planner.rb +++ b/src/lib/y2storage/proposal/devices_planner.rb @@ -75,6 +75,8 @@ def volumes_planned_devices(target, devicegraph) # @param devicegraph [Devicegraph] # @return [Array] def add_boot_devices(devices, target, devicegraph) + return unless settings.boot + @target = target devices.unshift(*planned_boot_devices(devices, devicegraph)) remove_shadowed_subvolumes(devices) diff --git a/src/lib/y2storage/proposal_settings.rb b/src/lib/y2storage/proposal_settings.rb index 62a083734..ab7a76617 100644 --- a/src/lib/y2storage/proposal_settings.rb +++ b/src/lib/y2storage/proposal_settings.rb @@ -213,6 +213,10 @@ def candidate_devices=(devices) alias_method :lvm, :use_lvm alias_method :lvm=, :use_lvm= + # @return [Boolean] whether the proposal should automatically configure any partition + # possibly needed for booting the system. + attr_accessor :boot + # @return [ProposalSpaceSettings] attr_reader :space_settings @@ -313,7 +317,7 @@ def lvm_vg_strategy=(strategy) # List of all the supported settings SETTINGS = [ :multidisk_first, :root_device, :explicit_root_device, - :candidate_devices, :explicit_candidate_devices, + :candidate_devices, :explicit_candidate_devices, :boot, :windows_delete_mode, :linux_delete_mode, :other_delete_mode, :resize_windows, :delete_resize_configurable, :lvm, :separate_vgs, :allocate_volume_mode, :lvm_vg_strategy, :lvm_vg_size @@ -389,6 +393,7 @@ def root_volume # Defaults when a setting is not specified DEFAULTS = { allocate_volume_mode: :auto, + boot: true, delete_resize_configurable: true, linux_delete_mode: :ondemand, lvm: false, diff --git a/test/y2storage/proposal/devices_planner_test.rb b/test/y2storage/proposal/devices_planner_test.rb index 14be1ef35..9703cf2aa 100755 --- a/test/y2storage/proposal/devices_planner_test.rb +++ b/test/y2storage/proposal/devices_planner_test.rb @@ -108,6 +108,15 @@ ) end + context "if ProposalSettings#boot is set to false" do + before { settings.boot = false } + + it "does not include the partitions needed by BootRequirementChecker" do + mount_points = subject.planned_devices(:desired, devicegraph).map(&:mount_point) + expect(mount_points).to_not include("/one_boot", "/other_boot") + end + end + context "when a volume is specified in section" do let(:volumes) { [volume] } diff --git a/test/y2storage/proposal_agama_boot_test.rb b/test/y2storage/proposal_agama_boot_test.rb new file mode 100755 index 000000000..ad53b2f03 --- /dev/null +++ b/test/y2storage/proposal_agama_boot_test.rb @@ -0,0 +1,95 @@ +#!/usr/bin/env rspec + +# Copyright (c) [2024] SUSE LLC +# +# All Rights Reserved. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of version 2 of the GNU General Public License as published +# by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +# more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, contact SUSE LLC. +# +# To contact SUSE LLC about this file by physical or electronic mail, you may +# find current contact information at www.suse.com. + +require_relative "spec_helper" +require "storage" +require "y2storage" +require_relative "#{TEST_PATH}/support/proposal_examples" +require_relative "#{TEST_PATH}/support/proposal_context" + +describe Y2Storage::MinGuidedProposal do + describe "#propose with settings in the Agama style" do + subject(:proposal) { described_class.new(settings: settings) } + + include_context "proposal" + let(:scenario) { "empty_hard_disk_gpt_50GiB" } + let(:architecture) { :x86 } + let(:settings_format) { :ng } + let(:control_file_content) { { "partitioning" => { "volumes" => volumes } } } + let(:volumes) { [{ "mount_point" => "/", "fs_type" => "xfs", "min_size" => "10 GiB" }] } + + before do + # Speed-up things by avoiding calls to hwinfo + allow_any_instance_of(Y2Storage::Disk).to receive(:hwinfo).and_return(Y2Storage::HWInfoDisk.new) + + settings.candidate_devices = ["/dev/sda"] + settings.root_device = "/dev/sda" + + allow(storage_arch).to receive(:efiboot?).and_return(efi) + end + + context "in an EFI system" do + let(:efi) { true } + + it "creates an ESP partition" do + proposal.propose + mount_points = proposal.devices.mount_points.map(&:path) + expect(proposal.devices.partitions.size).to eq 2 + expect(mount_points).to contain_exactly("/boot/efi", "/") + end + + context "if ProposalSettings#boot is set to false" do + before { settings.boot = false } + + it "does not create any extra partition for booting" do + proposal.propose + mount_points = proposal.devices.mount_points.map(&:path) + expect(proposal.devices.partitions.size).to eq 1 + expect(mount_points).to contain_exactly("/") + end + end + end + + context "in an legacy x86 system" do + let(:efi) { false } + + it "creates a bios boot partition" do + proposal.propose + partitions = proposal.devices.partitions + expect(partitions.size).to eq 2 + expect(partitions.map(&:id)).to contain_exactly( + Y2Storage::PartitionId::BIOS_BOOT, Y2Storage::PartitionId::LINUX + ) + end + + context "if ProposalSettings#boot is set to false" do + before { settings.boot = false } + + it "does not create any extra partition for booting" do + proposal.propose + partitions = proposal.devices.partitions + expect(partitions.size).to eq 1 + expect(partitions.first.id.to_sym).to eq :linux + end + end + end + end +end