diff --git a/service/lib/agama/storage/config_conversions/from_json.rb b/service/lib/agama/storage/config_conversions/from_json.rb index 26e210765..80d9ecbea 100644 --- a/service/lib/agama/storage/config_conversions/from_json.rb +++ b/service/lib/agama/storage/config_conversions/from_json.rb @@ -20,7 +20,6 @@ # find current contact information at www.suse.com. require "agama/config" -require "agama/storage/config_builder" require "agama/storage/config_conversions/from_json_conversions/config" require "agama/storage/config_json_solver" @@ -33,10 +32,10 @@ class FromJSON # # @param config_json [Hash] # @param product_config [Agama::Config, nil] - def initialize(config_json, product_config: nil) - # Copies the JSON hash to avoid changes in the given parameter, see {ConfigJSONSolver}. - @config_json = json_dup(config_json) - @product_config = product_config || Agama::Config.new + def initialize(config_json, default_paths: [], mandatory_paths: []) + @config_json = config_json + @default_paths = default_paths + @mandatory_paths = mandatory_paths end # Performs the conversion from Hash according to the JSON schema. @@ -48,13 +47,15 @@ def convert # * The JSON does not match the schema. # * The JSON contains more than one "generate" for partitions and logical volumes. # * The JSON contains invalid aliases (now checked by ConfigChecker). + + # Copies the JSON hash to avoid changes in the given config, see {ConfigJSONSolver}. + config_json = json_dup(self.config_json) + ConfigJSONSolver - .new(product_config) + .new(default_paths, mandatory_paths) .solve(config_json) - FromJSONConversions::Config - .new(config_json, config_builder: config_builder) - .convert + FromJSONConversions::Config.new(config_json).convert end private @@ -62,8 +63,9 @@ def convert # @return [Hash] attr_reader :config_json - # @return [Agama::Config] - attr_reader :product_config + attr_reader :default_paths + + attr_reader :mandatory_paths # Deep dup of the given JSON. # @@ -72,11 +74,6 @@ def convert def json_dup(json) Marshal.load(Marshal.dump(json)) end - - # @return [ConfigBuilder] - def config_builder - @config_builder ||= ConfigBuilder.new(product_config) - end end end end diff --git a/service/lib/agama/storage/config_conversions/from_json_conversions/base.rb b/service/lib/agama/storage/config_conversions/from_json_conversions/base.rb index c295b9242..aaabfdfc0 100644 --- a/service/lib/agama/storage/config_conversions/from_json_conversions/base.rb +++ b/service/lib/agama/storage/config_conversions/from_json_conversions/base.rb @@ -25,35 +25,30 @@ module ConfigConversions module FromJSONConversions # Base class for conversions from JSON hash according to schema. class Base - # @param config_builder [ConfigBuilder, nil] - def initialize(config_builder = nil) - @config_builder = config_builder + def initialize(config_json) + @config_json = config_json end # Performs the conversion from Hash according to the JSON schema. # - # @param default [Object] A {Config} or any its configs from {Storage::Configs}. + # @param config [Object] A {Config} or any of its configs from {Storage::Configs}. # @return [Object] A {Config} or any its configs from {Storage::Configs}. - def convert(default) - default.dup.tap do |config| - conversions(config).each do |property, value| - next if value.nil? + def convert(config) + conversions.each do |property, value| + next if value.nil? - config.public_send("#{property}=", value) - end + config.public_send("#{property}=", value) end end private - # @return [ConfigBuilder, nil] - attr_reader :config_builder + attr_reader :config_json # Values to apply to the config. # - # @param _default [Object] A {Config} or any its configs from {Storage::Configs}. # @return [Hash] e.g., { name: "/dev/vda" }. - def conversions(_default) + def conversions {} end end diff --git a/service/lib/agama/storage/config_conversions/from_json_conversions/boot.rb b/service/lib/agama/storage/config_conversions/from_json_conversions/boot.rb index 259d12ec1..82cbd6858 100644 --- a/service/lib/agama/storage/config_conversions/from_json_conversions/boot.rb +++ b/service/lib/agama/storage/config_conversions/from_json_conversions/boot.rb @@ -28,18 +28,14 @@ module ConfigConversions module FromJSONConversions # Boot conversion from JSON hash according to schema. class Boot < Base - # @param boot_json [Hash] - def initialize(boot_json) - super() - @boot_json = boot_json - end - # @see Base#convert # - # @param default [Configs::Boot, nil] + # @param boot_json [Hash] # @return [Configs::Boot] - def convert(default = nil) - super(default || Configs::Boot.new) + def convert(boot_json) + @boot_json = boot_json + + super(Configs::Boot.new) end private @@ -49,9 +45,9 @@ def convert(default = nil) # @see Base#conversions # - # @param _default [Configs::Boot] + # @param _config [Configs::Boot] # @return [Hash] - def conversions(_default) + def conversions(_config) { configure: boot_json[:configure], device: boot_json[:device] diff --git a/service/lib/agama/storage/config_conversions/from_json_conversions/btrfs.rb b/service/lib/agama/storage/config_conversions/from_json_conversions/btrfs.rb index 0e95b0a24..932fac874 100644 --- a/service/lib/agama/storage/config_conversions/from_json_conversions/btrfs.rb +++ b/service/lib/agama/storage/config_conversions/from_json_conversions/btrfs.rb @@ -28,18 +28,14 @@ module ConfigConversions module FromJSONConversions # Btrfs conversion from JSON hash according to schema. class Btrfs < Base - # @param btrfs_json [Hash] - def initialize(btrfs_json) - super() - @btrfs_json = btrfs_json - end - # @see Base#convert # - # @param default [Configs::Btrfs, nil] + # @param btrfs_json [Hash] # @return [Configs::Btrfs] - def convert(default = nil) - super(default || Configs::Btrfs.new) + def convert(btrfs_json) + @btrfs_json = btrfs_json + + super(Configs::Btrfs.new) end private @@ -49,9 +45,9 @@ def convert(default = nil) # @see Base#conversions # - # @param _default [Configs::Btrfs] + # @param _config [Configs::Btrfs] # @return [Hash] - def conversions(_default) + def conversions(_config) { snapshots: btrfs_json[:snapshots] } diff --git a/service/lib/agama/storage/config_conversions/from_json_conversions/config.rb b/service/lib/agama/storage/config_conversions/from_json_conversions/config.rb index fbb4c6fd3..1aeb8500e 100644 --- a/service/lib/agama/storage/config_conversions/from_json_conversions/config.rb +++ b/service/lib/agama/storage/config_conversions/from_json_conversions/config.rb @@ -31,19 +31,14 @@ module ConfigConversions module FromJSONConversions # Config conversion from JSON hash according to schema. class Config < Base - # @param config_json [Hash] - # @param config_builder [ConfigBuilder, nil] - def initialize(config_json, config_builder: nil) - super(config_builder) - @config_json = config_json - end - # @see Base#convert # - # @param default [Config, nil] + # @param config_json [Hash] # @return [Config] - def convert(default = nil) - super(default || Storage::Config.new) + def convert(config_json) + @config_json = config_json + + super(Storage::Config.new) end private @@ -55,21 +50,20 @@ def convert(default = nil) # # @param default [Config] # @return [Hash] - def conversions(default) + def conversions(config) { - boot: convert_boot(default.boot), + boot: convert_boot, drives: convert_drives, volume_groups: convert_volume_groups } end - # @param default [Configs::Boot, nil] # @return [Configs::Boot, nil] - def convert_boot(default = nil) + def convert_boot boot_json = config_json[:boot] return unless boot_json - FromJSONConversions::Boot.new(boot_json).convert(default) + FromJSONConversions::Boot.new.convert(boot_json) end # @return [Array, nil] @@ -83,7 +77,7 @@ def convert_drives # @param drive_json [Hash] # @return [Configs::Drive] def convert_drive(drive_json) - FromJSONConversions::Drive.new(drive_json, config_builder: config_builder).convert + FromJSONConversions::Drive.new.convert(drive_json) end # @return [Array, nil] @@ -97,9 +91,7 @@ def convert_volume_groups # @param volume_group_json [Hash] # @return [Configs::VolumeGroup] def convert_volume_group(volume_group_json) - FromJSONConversions::VolumeGroup - .new(volume_group_json, config_builder: config_builder) - .convert + FromJSONConversions::VolumeGroup.new.convert(volume_group_json) end end end diff --git a/service/lib/agama/storage/config_conversions/from_json_conversions/drive.rb b/service/lib/agama/storage/config_conversions/from_json_conversions/drive.rb index 8146da620..1d77ea9f0 100644 --- a/service/lib/agama/storage/config_conversions/from_json_conversions/drive.rb +++ b/service/lib/agama/storage/config_conversions/from_json_conversions/drive.rb @@ -39,19 +39,14 @@ class Drive < Base include WithPtableType include WithPartitions - # @param drive_json [Hash] - # @param config_builder [ConfigBuilder, nil] - def initialize(drive_json, config_builder: nil) - super(config_builder) - @drive_json = drive_json - end - # @see Base#convert # - # @param default [Configs::Drive, nil] + # @param drive_json [Hash] # @return [Configs::Drive] - def convert(default = nil) - super(default || Configs::Drive.new) + def convert(drive_json) + @drive_json = drive_json + + super(Configs::Drive.new) end private @@ -61,14 +56,14 @@ def convert(default = nil) # @see Base#conversions # - # @param default [Configs::Drive] + # @param _config [Configs::Drive] # @return [Hash] - def conversions(default) + def conversions(_config) { - search: convert_search(drive_json, default: default.search), + search: convert_search(drive_json), alias: drive_json[:alias], - encryption: convert_encryption(drive_json, default: default.encryption), - filesystem: convert_filesystem(drive_json, default: default.filesystem), + encryption: convert_encryption(drive_json), + filesystem: convert_filesystem(drive_json), ptable_type: convert_ptable_type(drive_json), partitions: convert_partitions(drive_json) } diff --git a/service/lib/agama/storage/config_conversions/from_json_conversions/encryption.rb b/service/lib/agama/storage/config_conversions/from_json_conversions/encryption.rb index c280f0ebf..81207f9a6 100644 --- a/service/lib/agama/storage/config_conversions/from_json_conversions/encryption.rb +++ b/service/lib/agama/storage/config_conversions/from_json_conversions/encryption.rb @@ -30,19 +30,14 @@ module ConfigConversions module FromJSONConversions # Encryption conversion from JSON hash according to schema. class Encryption < Base - # @param encryption_json [Hash, String] - # @param config_builder [ConfigBuilder, nil] - def initialize(encryption_json, config_builder: nil) - super(config_builder) - @encryption_json = encryption_json - end - # @see Base#convert # - # @param default [Configs::Encryption, nil] + # @param encryption_json [Hash, String] # @return [Configs::Encryption] - def convert(default = nil) - super(default || self.default) + def convert(encryption_json) + @encryption_json = encryption_json + + super(Configs::Encryption.new) end private @@ -50,14 +45,11 @@ def convert(default = nil) # @return [Hash, String] attr_reader :encryption_json - # @return [Configs::Encryption] - attr_reader :default_config - # @see Base#conversions # - # @param _default [Configs::Encryption] + # @param _config [Configs::Encryption] # @return [Hash] - def conversions(_default) + def conversions(_config) return luks1_conversions if luks1? return luks2_conversions if luks2? return pervasive_luks2_conversions if pervasive_luks2? @@ -159,15 +151,6 @@ def convert_label def convert_pbkd_function Y2Storage::PbkdFunction.find(encryption_json.dig(:luks2, :pbkdFunction)) end - - # Default encryption config. - # - # @return [Configs::Encryption] - def default - return Configs::Encryption.new unless config_builder - - config_builder.default_encryption - end end end end diff --git a/service/lib/agama/storage/config_conversions/from_json_conversions/filesystem.rb b/service/lib/agama/storage/config_conversions/from_json_conversions/filesystem.rb index 68b605c7f..c91797951 100644 --- a/service/lib/agama/storage/config_conversions/from_json_conversions/filesystem.rb +++ b/service/lib/agama/storage/config_conversions/from_json_conversions/filesystem.rb @@ -30,19 +30,14 @@ module ConfigConversions module FromJSONConversions # Filesystem conversion from JSON hash according to schema. class Filesystem < Base - # @param filesystem_json [Hash] - # @param config_builder [ConfigBuilder, nil] - def initialize(filesystem_json, config_builder: nil) - super(config_builder) - @filesystem_json = filesystem_json - end - # @see Base#convert # - # @param default [Configs::Filesystem, nil] + # @param filesystem_json [Hash] # @return [Configs::Filesystem] - def convert(default = nil) - super(default || self.default) + def convert(filesystem_json) + @filesystem_json = filesystem_json + + super(Configs::Filesystem.new) end private @@ -52,9 +47,9 @@ def convert(default = nil) # @see Base#conversions # - # @param default [Configs::Filesystem] + # @param _config [Configs::Filesystem] # @return [Hash] - def conversions(default) + def conversions(_config) { reuse: filesystem_json[:reuseIfPossible], label: filesystem_json[:label], @@ -62,7 +57,7 @@ def conversions(default) mount_options: filesystem_json[:mountOptions], mkfs_options: filesystem_json[:mkfsOptions], mount_by: convert_mount_by, - type: convert_type(default.type) + type: convert_type } end @@ -74,22 +69,12 @@ def convert_mount_by Y2Storage::Filesystems::MountByType.find(value.to_sym) end - # @param default [Configs::FilesystemType, nil] # @return [Configs::FilesystemType, nil] - def convert_type(default = nil) + def convert_type filesystem_type_json = filesystem_json[:type] return unless filesystem_type_json - FromJSONConversions::FilesystemType.new(filesystem_type_json).convert(default) - end - - # Default filesystem config. - # - # @return [Configs::Filesystem] - def default - return Configs::Filesystem.new unless config_builder - - config_builder.default_filesystem(filesystem_json[:path]) + FromJSONConversions::FilesystemType.new.convert(filesystem_type_json) end end end diff --git a/service/lib/agama/storage/config_conversions/from_json_conversions/filesystem_type.rb b/service/lib/agama/storage/config_conversions/from_json_conversions/filesystem_type.rb index 094e9976c..e8fd37de1 100644 --- a/service/lib/agama/storage/config_conversions/from_json_conversions/filesystem_type.rb +++ b/service/lib/agama/storage/config_conversions/from_json_conversions/filesystem_type.rb @@ -31,18 +31,14 @@ module ConfigConversions module FromJSONConversions # Filesystem type conversion from JSON hash according to schema. class FilesystemType < Base - # @param filesystem_type_json [Hash, String] - def initialize(filesystem_type_json) - super() - @filesystem_type_json = filesystem_type_json - end - # @see Base#convert # - # @param default [Configs::FilesystemType, nil] + # @param filesystem_type_json [Hash, String] # @return [Configs::FilesystemType] - def convert(default = nil) - super(default || Configs::FilesystemType.new) + def convert(filesystem_type_json) + @filesystem_type_json = filesystem_type_json + + super(Configs::FilesystemType.new) end private @@ -52,12 +48,12 @@ def convert(default = nil) # @see Base#conversions # - # @param default [Configs::FilesystemType] + # @param _default [Configs::FilesystemType] # @return [Hash] - def conversions(default) + def conversions(_default) { fs_type: convert_type, - btrfs: convert_btrfs(default.btrfs) + btrfs: convert_btrfs } end @@ -67,15 +63,14 @@ def convert_type Y2Storage::Filesystems::Type.find(value.to_sym) end - # @param default [Configs::Btrfs, nil] # @return [Configs::Btrfs, nil] - def convert_btrfs(default = nil) + def convert_btrfs return if filesystem_type_json.is_a?(String) btrfs_json = filesystem_type_json[:btrfs] return unless btrfs_json - FromJSONConversions::Btrfs.new(btrfs_json).convert(default) + FromJSONConversions::Btrfs.new.convert(btrfs_json) end end end diff --git a/service/lib/agama/storage/config_conversions/from_json_conversions/partition.rb b/service/lib/agama/storage/config_conversions/from_json_conversions/partition.rb index 81a487057..ff59947e9 100644 --- a/service/lib/agama/storage/config_conversions/from_json_conversions/partition.rb +++ b/service/lib/agama/storage/config_conversions/from_json_conversions/partition.rb @@ -39,23 +39,20 @@ class Partition < Base include WithSize # @param partition_json [Hash] - def initialize(partition_json, config_builder: nil) - super(config_builder) - @partition_json = partition_json + def initialize(partition_json) + super(partition_json) end # @see Base#convert # - # @param default [Configs::Partition, nil] # @return [Configs::Partition] - def convert(default = nil) - super(default || Configs::Partition.new) + def convert + super(Configs::Partition.new) end private - # @return [Hash] - attr_reader :partition_json + alias_method :partition_json, :config_json # @see Base#conversions # @@ -63,11 +60,11 @@ def convert(default = nil) # @return [Hash] def conversions(default) { - search: convert_search(partition_json, default: default.search), + search: convert_search(partition_json), alias: partition_json[:alias], - encryption: convert_encryption(partition_json, default: default.encryption), - filesystem: convert_filesystem(partition_json, default: default.filesystem), - size: convert_size(partition_json, default: default.size), + encryption: convert_encryption(partition_json), + filesystem: convert_filesystem(partition_json), + size: convert_size(partition_json), id: convert_id, delete: partition_json[:delete], delete_if_needed: partition_json[:deleteIfNeeded] diff --git a/service/lib/agama/storage/config_conversions/from_json_conversions/search.rb b/service/lib/agama/storage/config_conversions/from_json_conversions/search.rb index 327568a36..86291e4d2 100644 --- a/service/lib/agama/storage/config_conversions/from_json_conversions/search.rb +++ b/service/lib/agama/storage/config_conversions/from_json_conversions/search.rb @@ -28,18 +28,14 @@ module ConfigConversions module FromJSONConversions # Search conversion from JSON hash according to schema. class Search < Base - # @param search_json [Hash, String] - def initialize(search_json) - super() - @search_json = search_json - end - # @see Base#convert # - # @param default [Configs::Search, nil] + # @param search_json [Hash, String] # @return [Configs::Search] - def convert(default = nil) - super(default || Configs::Search.new) + def convert(search_json) + @search_json = search_json + + super(Configs::Search.new) end private @@ -49,9 +45,9 @@ def convert(default = nil) # @see Base#conversions # - # @param _default [Configs::Partition] + # @param _config [Configs::Partition] # @return [Hash] - def conversions(_default) + def conversions(_config) { name: convert_name, if_not_found: convert_not_found diff --git a/service/lib/agama/storage/config_conversions/from_json_conversions/with_encryption.rb b/service/lib/agama/storage/config_conversions/from_json_conversions/with_encryption.rb index 2dce8c39d..13d94ffa2 100644 --- a/service/lib/agama/storage/config_conversions/from_json_conversions/with_encryption.rb +++ b/service/lib/agama/storage/config_conversions/from_json_conversions/with_encryption.rb @@ -28,16 +28,12 @@ module FromJSONConversions # Mixin for encryption conversion. module WithEncryption # @param json [Hash] - # @param default [Configs::Encryption, nil] - # # @return [Configs::Encryption, nil] - def convert_encryption(json, default: nil) + def convert_encryption(json) encryption_json = json[:encryption] return unless encryption_json - FromJSONConversions::Encryption - .new(encryption_json, config_builder: config_builder) - .convert(default) + FromJSONConversions::Encryption.new.convert(encryption_json) end end end diff --git a/service/lib/agama/storage/config_conversions/from_json_conversions/with_filesystem.rb b/service/lib/agama/storage/config_conversions/from_json_conversions/with_filesystem.rb index 9f5e84678..7c7c01b46 100644 --- a/service/lib/agama/storage/config_conversions/from_json_conversions/with_filesystem.rb +++ b/service/lib/agama/storage/config_conversions/from_json_conversions/with_filesystem.rb @@ -28,19 +28,12 @@ module FromJSONConversions # Mixin for filesystem conversion. module WithFilesystem # @param json [Hash] - # @param default [Configs::Filesystem, nil] - # # @return [Configs::Filesystem, nil] - def convert_filesystem(json, default: nil) + def convert_filesystem(json) filesystem_json = json[:filesystem] return unless filesystem_json - # @todo Check whether the given filesystem can be used for the mount point. - # @todo Check whether snapshots can be configured and restore to default if needed. - - FromJSONConversions::Filesystem - .new(filesystem_json, config_builder: config_builder) - .convert(default) + FromJSONConversions::Filesystem.new.convert(filesystem_json) end end end diff --git a/service/lib/agama/storage/config_conversions/from_json_conversions/with_partitions.rb b/service/lib/agama/storage/config_conversions/from_json_conversions/with_partitions.rb index 432fb9ab6..d9439ac5e 100644 --- a/service/lib/agama/storage/config_conversions/from_json_conversions/with_partitions.rb +++ b/service/lib/agama/storage/config_conversions/from_json_conversions/with_partitions.rb @@ -27,10 +27,10 @@ module ConfigConversions module FromJSONConversions # Mixin for partitions conversion. module WithPartitions - # @param json [Hash] + # @param config_json [Hash] # @return [Array, nil] - def convert_partitions(json) - partitions_json = json[:partitions] + def convert_partitions(config_json) + partitions_json = config_json[:partitions] return unless partitions_json partitions_json.map { |p| convert_partition(p) } @@ -39,9 +39,7 @@ def convert_partitions(json) # @param partition_json [Hash] # @return [Configs::Partition] def convert_partition(partition_json) - FromJSONConversions::Partition - .new(partition_json, config_builder: config_builder) - .convert + FromJSONConversions::Partition.new(partition_json).convert end end end diff --git a/service/lib/agama/storage/config_conversions/from_json_conversions/with_ptable_type.rb b/service/lib/agama/storage/config_conversions/from_json_conversions/with_ptable_type.rb index d6c8d6b6f..1d0a0b5d3 100644 --- a/service/lib/agama/storage/config_conversions/from_json_conversions/with_ptable_type.rb +++ b/service/lib/agama/storage/config_conversions/from_json_conversions/with_ptable_type.rb @@ -28,7 +28,6 @@ module FromJSONConversions # Mixin for partition table type conversion. module WithPtableType # @param json [Hash] - # # @return [Y2Storage::PartitionTables::Type, nil] def convert_ptable_type(json) value = json[:ptableType] diff --git a/service/lib/agama/storage/config_conversions/from_json_conversions/with_search.rb b/service/lib/agama/storage/config_conversions/from_json_conversions/with_search.rb index 7a25dbc25..a6d662e7e 100644 --- a/service/lib/agama/storage/config_conversions/from_json_conversions/with_search.rb +++ b/service/lib/agama/storage/config_conversions/from_json_conversions/with_search.rb @@ -28,15 +28,12 @@ module FromJSONConversions # Mixin for search conversion. module WithSearch # @param json [Hash] - # @param default [Configs::Search, nil] - # # @return [Configs::Search, nil] - def convert_search(json, default: nil) + def convert_search(json) search_json = json[:search] return unless search_json - converter = FromJSONConversions::Search.new(search_json) - converter.convert(default) + FromJSONConversions::Search.new.convert(search_json) end end end