agama/service/lib/y2storage/proposal/agama_devices_planner.rb
2025-05-05 15:12:40 +02:00

92 lines
3 KiB
Ruby

# frozen_string_literal: true
# Copyright (c) [2024-2025] 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 "y2storage/planned/devices_collection"
require "y2storage/proposal/agama_drive_planner"
require "y2storage/proposal/agama_vg_planner"
require "y2storage/proposal/agama_md_planner"
module Y2Storage
module Proposal
# Devices planner for Agama.
class AgamaDevicesPlanner
include Yast::Logger
# @param devicegraph [Devicegraph]
# @param issues_list [Array<Agama::Issue>]
def initialize(devicegraph, issues_list)
@devicegraph = devicegraph
@issues_list = issues_list
end
# List of devices that need to be created to satisfy the settings. Does not include
# devices needed for booting.
#
# For the time being, this only plans for drives, partitions, and new LVM volume groups.
#
# @param config [Agama::Storage::Config]
# @return [Planned::DevicesCollection]
def planned_devices(config)
@partitionables = {}
planned = planned_drives(config) + planned_mds(config) + planned_vgs(config)
Planned::DevicesCollection.new(planned)
end
protected
# @return [Y2Storage::Devicegraph]
attr_reader :devicegraph
# @return [Array<Agama::Issue>] List to register any found issue
attr_reader :issues_list
# @return [Hash] Map to track the planned devices
attr_reader :partitionables
# @param config [Agama::Storage::Config]
# @return [Array<Planned::Device>]
def planned_drives(config)
config.drives.flat_map do |drive|
planner = AgamaDrivePlanner.new(devicegraph, issues_list, partitionables)
planner.planned_devices(drive, config)
end
end
# @param config [Agama::Storage::Config]
# @return [Array<Planned::Device>]
def planned_mds(config)
config.md_raids.flat_map do |raid|
planner = AgamaMdPlanner.new(devicegraph, issues_list, partitionables)
planner.planned_devices(raid, config)
end
end
# @param config [Agama::Storage::Config]
# @return [Array<Planned::Device>]
def planned_vgs(config)
config.volume_groups.flat_map do |vg|
planner = AgamaVgPlanner.new(devicegraph, issues_list, partitionables)
planner.planned_devices(vg)
end
end
end
end
end