diff --git a/package/yast2-storage-ng.changes b/package/yast2-storage-ng.changes index 2a6aa342a..bdd8477a0 100644 --- a/package/yast2-storage-ng.changes +++ b/package/yast2-storage-ng.changes @@ -1,3 +1,11 @@ +------------------------------------------------------------------- +Thu Mar 21 12:28:56 UTC 2024 - Ancor Gonzalez Sosa + +- GuidedProposal: internal settings to control the configuration + of boot-related partitions and the usage of adjust_by_ram. +- Needed for gh#openSUSE/agama#1111 +- 5.0.10 + ------------------------------------------------------------------- Tue Mar 12 13:57:30 UTC 2024 - Stefan Hundhammer diff --git a/package/yast2-storage-ng.spec b/package/yast2-storage-ng.spec index 5591bd9c5..cab772a64 100644 --- a/package/yast2-storage-ng.spec +++ b/package/yast2-storage-ng.spec @@ -16,7 +16,7 @@ # Name: yast2-storage-ng -Version: 5.0.9 +Version: 5.0.10 Release: 0 Summary: YaST2 - Storage Configuration License: GPL-2.0-only OR GPL-3.0-only diff --git a/src/lib/y2storage/proposal/devices_planner.rb b/src/lib/y2storage/proposal/devices_planner.rb index a79f9e234..790a1641e 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) @@ -285,6 +287,8 @@ def adjust_sizes(planned_device, volume) planned_device.min_size = min_size(volume) planned_device.max_size = max_size(volume) + return if volume.ignore_adjust_by_ram? + if volume.adjust_by_ram? planned_device.min_size = [planned_device.min_size, ram_size].max planned_device.max_size = [planned_device.max_size, ram_size].max 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/src/lib/y2storage/volume_specification.rb b/src/lib/y2storage/volume_specification.rb index a6ec332e4..ae3ceca1c 100644 --- a/src/lib/y2storage/volume_specification.rb +++ b/src/lib/y2storage/volume_specification.rb @@ -177,10 +177,16 @@ class VolumeSpecification # @return [Boolean] true if #snapshots_size and #snapshots_percentage should be ignored attr_accessor :ignore_snapshots_sizes + # Whether to ignore any possible effect on the size derived from RAM size + # + # @return [Boolean] true if #adjust_by_ram should be ignored + attr_accessor :ignore_adjust_by_ram + alias_method :proposed?, :proposed alias_method :proposed_configurable?, :proposed_configurable alias_method :adjust_by_ram?, :adjust_by_ram alias_method :adjust_by_ram_configurable?, :adjust_by_ram_configurable + alias_method :ignore_adjust_by_ram?, :ignore_adjust_by_ram alias_method :snapshots?, :snapshots alias_method :snapshots_configurable?, :snapshots_configurable alias_method :ignore_snapshots_sizes?, :ignore_snapshots_sizes @@ -380,6 +386,7 @@ def apply_defaults @fs_types = [] @ignore_fallback_sizes = false @ignore_snapshots_sizes = false + @ignore_adjust_by_ram = false @reformat = true end diff --git a/test/y2storage/proposal/devices_planner_test.rb b/test/y2storage/proposal/devices_planner_test.rb index 14be1ef35..c72b0d8bd 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] } @@ -463,6 +472,12 @@ expect(planned_device.min_size).to eq(8.GiB) expect(planned_device.max_size).to eq(8.GiB) end + + it "does not extend the sizes to ram size if #ignore_adjust_by_ram is set" do + vol_in_settings.ignore_adjust_by_ram = true + expect(planned_device.min_size).to eq(1.GiB) + expect(planned_device.max_size).to eq(2.GiB) + end end context "when it is planning a device with btrfs filesystem" do 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