Skip to content

Commit

Permalink
Merge pull request #548 from joseivanlopez/storage-issues-dbus
Browse files Browse the repository at this point in the history
D-Bus API for storage issues
  • Loading branch information
joseivanlopez authored Apr 27, 2023
2 parents 921d28c + d86b948 commit b1b9366
Show file tree
Hide file tree
Showing 24 changed files with 942 additions and 174 deletions.
24 changes: 23 additions & 1 deletion service/lib/agama/dbus.rb
Original file line number Diff line number Diff line change
@@ -1,11 +1,33 @@
# frozen_string_literal: true

# Copyright (c) [2022-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.

module Agama
# Namespace for DBus API
# Namespace for D-Bus API
module DBus
end
end

require "agama/dbus/manager"
require "agama/dbus/language"
require "agama/dbus/software"
require "agama/dbus/storage"
require "agama/dbus/users"
require "agama/dbus/questions"
4 changes: 2 additions & 2 deletions service/lib/agama/dbus/clients/storage.rb
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
require "agama/dbus/clients/base"
require "agama/dbus/clients/with_service_status"
require "agama/dbus/clients/with_progress"
require "agama/dbus/clients/with_validation"
require "agama/dbus/clients/with_issues"

module Agama
module DBus
Expand All @@ -31,7 +31,7 @@ module Clients
class Storage < Base
include WithServiceStatus
include WithProgress
include WithValidation
include WithIssues

STORAGE_IFACE = "org.opensuse.Agama.Storage1"
private_constant :STORAGE_IFACE
Expand Down
54 changes: 54 additions & 0 deletions service/lib/agama/dbus/clients/with_issues.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# 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 "agama/issue"

module Agama
module DBus
# Mixin to include in the clients of services that implement the Issues interface
module WithIssues
ISSUES_IFACE = "org.opensuse.Agama1.Issues"
private_constant :ISSUES_IFACE

# Returns the issues
#
# @return [Array<Issue>]
def issues
sources = [nil, Issue::Source::SYSTEM, Issue::Source::CONFIG]
severities = [Issue::Severity::WARN, Issue::Severity::ERROR]

dbus_object[ISSUES_IFACE]["All"].map do |dbus_issue|
Issue.new(dbus_issue[0],
details: dbus_issue[1],
source: sources[dbus_issue[2]],
severity: severities[dbus_issue[3]])
end
end

# Determines whether there are errors
#
# @return [Boolean]
def errors?
issues.any?(&:error?)
end
end
end
end
33 changes: 33 additions & 0 deletions service/lib/agama/dbus/interfaces.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# 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.

module Agama
module DBus
# Namespace for generic D-Bus interfaces
module Interfaces
end
end
end

require "agama/dbus/interfaces/issues"
require "agama/dbus/interfaces/progress"
require "agama/dbus/interfaces/service_status"
require "agama/dbus/interfaces/validation"
74 changes: 74 additions & 0 deletions service/lib/agama/dbus/interfaces/issues.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
# 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 "agama/issue"

module Agama
module DBus
module Interfaces
# Mixin to define the Issues D-Bus interface
#
# @note This mixin is expected to be included in a class that inherits from {DBus::BaseObject}
# and it requires a #issues method that returns an array of {Issue} objects.
module Issues
ISSUES_INTERFACE = "org.opensuse.Agama1.Issues"

# Issues with the D-Bus format
#
# @return [Array<Array(String, String, Integer, Integer)>] The description, details, source
# and severity of each issue.
# Source: 1 for system, 2 for config and 3 for unknown.
# Severity: 0 for warn and 1 for error.
def dbus_issues
issues.map do |issue|
source = case issue.source
when Agama::Issue::Source::SYSTEM
1
when Agama::Issue::Source::CONFIG
2
else
0
end
severity = issue.severity == Agama::Issue::Severity::WARN ? 0 : 1

[issue.description, issue.details.to_s, source, severity]
end
end

# Emits the signal for properties changed
def issues_properties_changed
dbus_properties_changed(ISSUES_INTERFACE,
interfaces_and_properties[ISSUES_INTERFACE], [])
end

def self.included(base)
base.class_eval do
dbus_interface ISSUES_INTERFACE do
# @see {#dbus_issues}
dbus_reader :dbus_issues, "a(ssuu)", dbus_name: "All"
end
end
end
end
end
end
end
35 changes: 21 additions & 14 deletions service/lib/agama/dbus/storage/manager.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,9 @@
require "yast"
require "agama/dbus/base_object"
require "agama/dbus/with_service_status"
require "agama/dbus/interfaces/issues"
require "agama/dbus/interfaces/progress"
require "agama/dbus/interfaces/service_status"
require "agama/dbus/interfaces/validation"
require "agama/dbus/storage/dasd_manager_interface"
require "agama/dbus/storage/proposal"
require "agama/dbus/storage/proposal_settings_converter"
Expand All @@ -43,9 +43,9 @@ class Manager < BaseObject
include WithISCSIAuth
include WithServiceStatus
include ::DBus::ObjectManager
include DBus::Interfaces::Issues
include DBus::Interfaces::Progress
include DBus::Interfaces::ServiceStatus
include DBus::Interfaces::Validation

PATH = "/org/opensuse/Agama/Storage1"
private_constant :PATH
Expand All @@ -57,6 +57,7 @@ class Manager < BaseObject
def initialize(backend, logger)
super(PATH, logger: logger)
@backend = backend
register_storage_callbacks
register_proposal_callbacks
register_progress_callbacks
register_service_status_callbacks
Expand All @@ -68,14 +69,18 @@ def initialize(backend, logger)
register_and_extend_dasd_callbacks
end

# List of issues, see {DBus::Interfaces::Issues}
#
# @return [Array<Agama::Issue>]
def issues
backend.issues
end

STORAGE_INTERFACE = "org.opensuse.Agama.Storage1"
private_constant :STORAGE_INTERFACE

def probe
busy_while do
backend.probe
storage_properties_changed
end
busy_while { backend.probe }
end

def install
Expand All @@ -90,7 +95,7 @@ def finish
#
# @return [Boolean]
def deprecated_system
backend.deprecated_system
backend.deprecated_system?
end

dbus_interface STORAGE_INTERFACE do
Expand Down Expand Up @@ -241,11 +246,15 @@ def proposal
backend.proposal
end

def register_storage_callbacks
backend.on_issues_change { issues_properties_changed }
backend.on_deprecated_system_change { storage_properties_changed }
end

def register_proposal_callbacks
proposal.on_calculate do
export_proposal
proposal_properties_changed
update_validation
end
end

Expand Down Expand Up @@ -278,12 +287,6 @@ def register_and_extend_dasd_callbacks
end
end

def deprecate_system
backend.deprecated_system = true
storage_properties_changed
update_validation
end

def storage_properties_changed
properties = interfaces_and_properties[STORAGE_INTERFACE]
dbus_properties_changed(STORAGE_INTERFACE, properties, [])
Expand All @@ -294,6 +297,10 @@ def proposal_properties_changed
dbus_properties_changed(PROPOSAL_CALCULATOR_INTERFACE, properties, [])
end

def deprecate_system
backend.deprecated_system = true
end

def export_proposal
@service.unexport(dbus_proposal) if dbus_proposal
@dbus_proposal = DBus::Storage::Proposal.new(proposal, logger)
Expand Down
Loading

0 comments on commit b1b9366

Please sign in to comment.