Skip to content

Commit

Permalink
Merge pull request #1350 from yast/huha-pkg-sp5
Browse files Browse the repository at this point in the history
Ensure adding Storage Support Software Packages for MicroOS [SLE-15-SP5]
  • Loading branch information
shundhammer committed Jul 11, 2023
2 parents 5884c80 + 985006e commit 8e00070
Show file tree
Hide file tree
Showing 12 changed files with 195 additions and 20 deletions.
15 changes: 15 additions & 0 deletions package/yast2-storage-ng.changes
@@ -1,3 +1,18 @@
-------------------------------------------------------------------
Wed Jul 5 13:42:12 UTC 2023 - Stefan Hundhammer <shundhammer@suse.com>

- Ensure adding storage support software packages for MicroOS
which uses its custom partitions_proposal client, not the
standard inst_disk_proposal client (bsc#1212452)
https://github.com/yast/yast-storage-ng/pull/1350
- 4.5.24

-------------------------------------------------------------------
Thu Jun 29 11:42:21 UTC 2023 - Ancor Gonzalez Sosa <ancor@suse.com>

- Honor encryption settings if they are set into ProductFeatures
by the Common Critera role (jsc#PED-4166, jsc#PED-4474).

-------------------------------------------------------------------
Wed Jun 7 08:03:52 UTC 2023 - Stefan Hundhammer <shundhammer@suse.com>

Expand Down
2 changes: 1 addition & 1 deletion package/yast2-storage-ng.spec
Expand Up @@ -16,7 +16,7 @@
#

Name: yast2-storage-ng
Version: 4.5.23
Version: 4.5.24
Release: 0
Summary: YaST2 - Storage Configuration
License: GPL-2.0-only OR GPL-3.0-only
Expand Down
18 changes: 1 addition & 17 deletions src/lib/y2storage/clients/inst_disk_proposal.rb
Expand Up @@ -158,23 +158,7 @@ def actions_after_partitioner(devicegraph, dialog_result)
# Add storage-related software packages (filesystem tools etc.) to the
# set of packages to be installed.
def add_storage_packages
features = storage_manager.staging.used_features
required_features = storage_manager.staging.used_features(required_only: true)

required_packages = required_features.pkg_list
optional_packages = features.pkg_list - required_packages

set_proposal_packages(required_packages, false)
set_proposal_packages(optional_packages, true)
end

# @see #add_storage_packages
#
# @param pkgs [Array<String>] list of packages
# @param optional [Boolean] whether the packages in the list are optional
def set_proposal_packages(pkgs, optional)
pkg_handler = Y2Storage::PackageHandler.new(pkgs, optional: optional)
pkg_handler.set_proposal_packages
Y2Storage::PackageHandler.set_proposal_packages_for(storage_manager.staging)
end

# Save the list of filesystem to /etc/sysconfig/storage.
Expand Down
5 changes: 3 additions & 2 deletions src/lib/y2storage/clients/partitions_proposal.rb
Expand Up @@ -116,8 +116,9 @@ def update_state
staging = storage_manager.staging
actiongraph = staging ? staging.actiongraph : nil
self.actions_presenter = ActionsPresenter.new(actiongraph)
Y2Storage::DumpManager.dump(staging)
Y2Storage::DumpManager.dump(actions_presenter)
DumpManager.dump(staging)
DumpManager.dump(actions_presenter)
PackageHandler.set_proposal_packages_for(staging)
end
end

Expand Down
17 changes: 17 additions & 0 deletions src/lib/y2storage/devicegraph.rb
Expand Up @@ -612,6 +612,23 @@ def used_features(required_only: false)
StorageFeaturesList.from_bitfield(storage_used_features(type))
end

# List of required (mandatory) storage features used by the devicegraph
#
# @return [StorageFeaturesList]
def required_used_features
used_features(required_only: true)
end

# List of optional storage features used by the devicegraph
#
# @return [StorageFeaturesList]
def optional_used_features
all = storage_used_features(Storage::UsedFeaturesDependencyType_SUGGESTED)
required = storage_used_features(Storage::UsedFeaturesDependencyType_REQUIRED)
# Using binary XOR in those bit fields to calculate the difference
StorageFeaturesList.from_bitfield(all ^ required)
end

private

# Copy of a device tree where hashes have been substituted by sorted
Expand Down
15 changes: 15 additions & 0 deletions src/lib/y2storage/package_handler.rb
Expand Up @@ -112,6 +112,21 @@ def set_proposal_packages
success
end

# Add the proposal packages for storage that are needed for the specified
# devicegraph's used features. This marks the packages for installation;
# it does not install them yet.
#
# @param devicegraph [Devicegraph] usually StorageManager.instance.staging
# @param optional
def self.set_proposal_packages_for(devicegraph, optional: true)
required_packages = devicegraph.required_used_features.pkg_list
PackageHandler.new(required_packages, optional: false).set_proposal_packages
return unless optional

optional_packages = devicegraph.optional_used_features.pkg_list
PackageHandler.new(optional_packages, optional: true).set_proposal_packages
end

private

# Whether the packages should be considered as optional when adding them to the
Expand Down
17 changes: 17 additions & 0 deletions src/lib/y2storage/proposal_settings.rb
Expand Up @@ -441,6 +441,23 @@ def load_features
load_feature(:proposal, :multidisk_first)
load_size_feature(:proposal, :lvm_vg_size)
load_volumes_feature(:volumes)
load_encryption
end

# Loads the default encryption settings
#
# The encryption settings are not part of control.xml, but can be injected by a previous step of
# the installation, eg. the dialog of the Common Criteria system role
def load_encryption
enc = feature(:proposal, :encryption)

return unless enc
return unless enc.respond_to?(:password)

passwd = enc.password.to_s
return if passwd.nil? || passwd.empty?

self.encryption_password = passwd
end

def validated_delete_mode(mode)
Expand Down
8 changes: 8 additions & 0 deletions src/lib/y2storage/storage_feature.rb
Expand Up @@ -125,6 +125,14 @@ def self.all
end
end

# Drop the cache of storage packages that are available.
#
# This is only ever needed if the available packages might have changed
# since the last use of this class.
def self.drop_cache
@all = nil
end

# Constructor
#
# This looks up a constant in the ::Storage namespace to make sure the id
Expand Down
50 changes: 50 additions & 0 deletions test/y2storage/devicegraph_test.rb
Expand Up @@ -1319,4 +1319,54 @@ def with_sda2_deleted(initial_graph)
end
end
end

describe "#required_used_features" do
before { fake_scenario(scenario) }

context "with local devices combining several filesystem types" do
let(:scenario) { "mixed_disks" }

it "returns only the features for mounted filesystems" do
features = fake_devicegraph.required_used_features
expect(features).to be_a Y2Storage::StorageFeaturesList
expect(features.map(&:id))
.to contain_exactly(:UF_BTRFS, :UF_XFS, :UF_SWAP)
end
end

context "with an empty disk" do
let(:scenario) { "empty_disks" }

it "Survives not having any storage features" do
features = fake_devicegraph.required_used_features
expect(features).to be_a Y2Storage::StorageFeaturesList
expect(features.map(&:id)).to be == []
end
end
end

describe "#optional_used_features" do
before { fake_scenario(scenario) }

context "with local devices combining several filesystem types" do
let(:scenario) { "mixed_disks" }

it "returns only the features for filesystems that are not mounted" do
features = fake_devicegraph.optional_used_features
expect(features).to be_a Y2Storage::StorageFeaturesList
expect(features.map(&:id))
.to contain_exactly(:UF_EXT4, :UF_NTFS)
end
end

context "with an empty disk" do
let(:scenario) { "empty_disks" }

it "Survives not having any storage features" do
features = fake_devicegraph.optional_used_features
expect(features).to be_a Y2Storage::StorageFeaturesList
expect(features.map(&:id)).to be == []
end
end
end
end
44 changes: 44 additions & 0 deletions test/y2storage/package_handler_test.rb
Expand Up @@ -23,6 +23,7 @@

require_relative "spec_helper"
require "y2storage/package_handler"
require "y2storage/storage_feature"

describe Y2Storage::PackageHandler do
let(:feature_pkg) { ["lvm2", "btrfsprogs", "e2fsprogs"] }
Expand Down Expand Up @@ -135,4 +136,47 @@
end
end
end

describe ".set_proposal_packages_for" do
before do
fake_scenario(scenario)
Y2Storage::StorageFeature.drop_cache
allow(Yast::Mode).to receive(:installation).and_return(installation)
allow(Yast::Package).to receive(:Installed).and_return(false)
allow(Yast::Package).to receive(:Available).and_return(true)
end

context "with local devices combining several filesystem types" do
PROPOSAL_ID = "storage_proposal"
let(:scenario) { "mixed_disks" }
let(:installation) { true }

it "Adds the correct required and optional storage packages to the proposal" do
expect(Yast::PackagesProposal).to receive(:SetResolvables)
.with(PROPOSAL_ID, :package, ["btrfsprogs", "e2fsprogs", "xfsprogs"], optional: false)
.and_return true
expect(Yast::PackagesProposal).to receive(:SetResolvables)
.with(PROPOSAL_ID, :package, ["e2fsprogs", "ntfs-3g", "ntfsprogs"], optional: true)
.and_return true
described_class.set_proposal_packages_for(fake_devicegraph)
end

it "Adds only required storage packages to the proposal if 'optional' is 'false" do
expect(Yast::PackagesProposal).to receive(:SetResolvables)
.with(PROPOSAL_ID, :package, ["btrfsprogs", "e2fsprogs", "xfsprogs"], optional: false)
.and_return true
described_class.set_proposal_packages_for(fake_devicegraph, optional: false)
end
end

context "with empty disks" do
let(:scenario) { "empty_disks" }
let(:installation) { true }

it "Does not add any storage packages to the proposal" do
expect(Yast::PackagesProposal).not_to receive(:SetResolvables)
described_class.set_proposal_packages_for(fake_devicegraph, optional: true)
end
end
end
end
22 changes: 22 additions & 0 deletions test/y2storage/proposal_settings_test.rb
Expand Up @@ -35,6 +35,19 @@ def stub_partitioning_features(features = {})
stub_features("partitioning" => initial_partitioning_features.merge(features))
end

# Used to test the mechanism to inject an encryption password into the settings
class TestInjectedPassword
include Y2Storage::SecretAttributes

# Real password
secret_attr :password

# Constructor
def initialize(passwd)
self.password = passwd
end
end

before do
Y2Storage::StorageManager.create_test_instance
end
Expand Down Expand Up @@ -333,6 +346,15 @@ def read_feature(feature, value)
expect(settings.lvm).to eq false
end

it "sets 'encryption_password' based on the 'encryption' feature in the 'proposal' section" do
read_feature("encryption", "SuperSecret")
expect(settings.use_encryption).to eq false
expect(settings.encryption_password).to eq nil
read_feature("encryption", TestInjectedPassword.new("SuperSecret"))
expect(settings.use_encryption).to eq true
expect(settings.encryption_password).to eq "SuperSecret"
end

it "sets 'delete_resize_configurable' based on the feature in the 'proposal' section" do
read_feature("delete_resize_configurable", true)
expect(settings.delete_resize_configurable).to eq true
Expand Down
2 changes: 2 additions & 0 deletions test/y2storage/storage_features_list_test.rb
Expand Up @@ -22,6 +22,7 @@
# find current contact information at www.suse.com.

require_relative "spec_helper"
require "y2storage/storage_feature"
require "y2storage/storage_features_list"

describe Y2Storage::StorageFeaturesList do
Expand Down Expand Up @@ -84,6 +85,7 @@
let(:bits) { Storage::UF_NTFS | Storage::UF_EXT3 }

before do
Y2Storage::StorageFeature.drop_cache
allow(Yast::Package).to receive(:Available).and_return false
allow(Yast::Package).to receive(:Available).with("ntfsprogs").and_return true
end
Expand Down

0 comments on commit 8e00070

Please sign in to comment.