-
Notifications
You must be signed in to change notification settings - Fork 44
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #476 from yast/dasd_progress2
Report progress of DASD formatting to the D-Bus interface
- Loading branch information
Showing
12 changed files
with
664 additions
and
73 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
165 changes: 165 additions & 0 deletions
165
service/lib/dinstaller/dbus/storage/dasds_format_job.rb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,165 @@ | ||
# frozen_string_literal: true | ||
|
||
# Copyright (c) [2023] 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 "dbus" | ||
require "dinstaller/dbus/base_object" | ||
|
||
module DInstaller | ||
module DBus | ||
module Storage | ||
# Class representing the process of formatting a set of DASDs | ||
class DasdsFormatJob < BaseObject | ||
# Internal class to make easier to index the status information both by DASD id and by job | ||
# path, although in fact both are fully stable during the whole execution of the installer. | ||
# | ||
# This class helps to refresh the relationship between the DASD and its path every time a | ||
# status update is sent from the backend, although as already mentioned that wouldn't be | ||
# needed with the current implementation of the DASDs tree, since it keeps that relationship | ||
# stable. | ||
class DasdFormatInfo | ||
# @return [String] channel id of the DASD | ||
attr_accessor :id | ||
|
||
# @return [String] path of the DASD in the D-Bus tree | ||
attr_accessor :path | ||
|
||
# @return [Integer] total number of cylinders reported by the format operation | ||
attr_accessor :cylinders | ||
|
||
# @return [Integer] number of cylinders already processed by the format operation | ||
attr_accessor :progress | ||
|
||
# @return [Boolean] whether the disk is already fully formatted | ||
attr_accessor :done | ||
|
||
# Constructor | ||
# | ||
# @param status [Y2S390::FormatStatus] | ||
# @param dasds_tree [DasdsTree] | ||
def initialize(status, dasds_tree) | ||
@id = status.dasd.id | ||
@cylinders = status.cylinders | ||
@progress = status.progress | ||
@done = status.done? | ||
|
||
dbus_dasd = dasds_tree.find { |d| d.id == @id } | ||
if dbus_dasd | ||
@path = dbus_dasd.path | ||
else | ||
logger.warning "DASD is not longer in the D-BUS tree: #{status.inspect}" | ||
end | ||
end | ||
|
||
# Progress representation as expected by the D-Bus API (property Summary and signal | ||
# SummaryUpdated) | ||
def to_dbus | ||
[cylinders, progress, done] | ||
end | ||
end | ||
|
||
JOB_INTERFACE = "org.opensuse.DInstaller.Storage1.Job" | ||
private_constant :JOB_INTERFACE | ||
|
||
dbus_interface JOB_INTERFACE do | ||
dbus_reader(:running, "b") | ||
dbus_reader(:exit_code, "u") | ||
dbus_signal(:Finished, "exit_code:u") | ||
end | ||
|
||
DASD_FORMAT_INTERFACE = "org.opensuse.DInstaller.Storage1.DASD.Format" | ||
private_constant :DASD_FORMAT_INTERFACE | ||
|
||
dbus_interface DASD_FORMAT_INTERFACE do | ||
dbus_reader(:summary, "a{s(uub)}") | ||
end | ||
|
||
# @return [Boolean] | ||
attr_reader :running | ||
|
||
# @return [Integer] zero if still running | ||
attr_reader :exit_code | ||
|
||
# @return [Array<Y2390::Dasd>] | ||
attr_reader :dasds | ||
|
||
# Constructor | ||
# | ||
# @param initial [Array<Y2S390::FormatStatus>] initial status report from the format process | ||
# @param dasds_tree [DasdsTree] see #dasds_tree | ||
# @param path [DBus::ObjectPath] path in which the Job object is exported | ||
# @param logger [Logger, nil] | ||
def initialize(initial, dasds_tree, path, logger: nil) | ||
super(path, logger: logger) | ||
|
||
@exit_code = 0 | ||
@running = true | ||
@dasds_tree = dasds_tree | ||
@infos = {} | ||
update_info(initial) | ||
end | ||
|
||
# Current status, in the format described by the D-Bus API | ||
def summary | ||
result = {} | ||
@infos.each_value { |i| result[i.path] = i.to_dbus if i.path } | ||
result | ||
end | ||
|
||
# Marks the job as finished | ||
# | ||
# @note A Finished and a PropertiesChanged signals are always emitted. | ||
# | ||
# @param exit_code [Integer] | ||
def finish_format(exit_code) | ||
@running = false | ||
@exit_code = exit_code | ||
Finished(exit_code) | ||
dbus_properties_changed(JOB_INTERFACE, interfaces_and_properties.slice(JOB_INTERFACE), []) | ||
end | ||
|
||
# Updates the internal status information | ||
# | ||
# @note A SummaryUpdated signal is always emitted | ||
# | ||
# @param statuses [Array<Y2S390::FormatStatus] latest status update from the format process | ||
def update_format(statuses) | ||
return if statuses.empty? | ||
|
||
update_info(statuses) | ||
dbus_properties_changed(DASD_FORMAT_INTERFACE, { "Summary" => summary }, []) | ||
end | ||
|
||
private | ||
|
||
# @return [DasdsTree] D-Bus representation of the DASDs | ||
attr_reader :dasds_tree | ||
|
||
# @param statuses [Array<Y2S390::FormatStatus] latest status update from the format process | ||
def update_info(statuses) | ||
statuses.each do |status| | ||
info = DasdFormatInfo.new(status, dasds_tree) | ||
@infos[info.id] = info | ||
end | ||
end | ||
end | ||
end | ||
end | ||
end |
Oops, something went wrong.