Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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