Skip to content
Closed
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
77 changes: 59 additions & 18 deletions rust/agama-manager/src/service.rs
Original file line number Diff line number Diff line change
Expand Up @@ -569,13 +569,13 @@ impl Service {
Ok(())
}

/// Determines whether the software service is available.
/// Determines whether the service is available.
///
/// Consider the service as available if there is no pending progress.
async fn is_software_available(&self) -> Result<bool, Error> {
async fn is_service_available(&self, scope: Scope) -> Result<bool, Error> {
let is_empty = self
.progress
.call(progress::message::IsEmpty::with_scope(Scope::Software))
.call(progress::message::IsEmpty::with_scope(scope))
.await?;
Ok(is_empty)
}
Expand Down Expand Up @@ -621,18 +621,33 @@ impl MessageHandler<message::GetSystem> for Service {
let proxy = self.proxy.call(proxy::message::GetSystem).await?;
let l10n = self.l10n.call(l10n::message::GetSystem).await?;
let manager = self.system.clone();
let storage = self.storage.call(storage::message::GetSystem).await?;
let iscsi = self.iscsi.call(iscsi::message::GetSystem).await?;

let storage = if self.is_service_available(Scope::Storage).await? {
self.storage.call(storage::message::GetSystem).await?
} else {
Default::default()
};

let iscsi = if self.is_service_available(Scope::Storage).await? {
self.iscsi.call(iscsi::message::GetSystem).await?
} else {
None
};

let network = self.network.get_system().await?;

let s390 = if let Some(s390) = &self.s390 {
Comment thread
mchf marked this conversation as resolved.
Some(s390.call(s390::message::GetSystem).await?)
if self.is_service_available(Scope::Storage).await? {
Some(s390.call(s390::message::GetSystem).await?)
} else {
None
}
} else {
None
};

// If the software service is busy, it will not answer.
let software = if self.is_software_available().await? {
let software = if self.is_service_available(Scope::Software).await? {
self.software.call(software::message::GetSystem).await?
} else {
Default::default()
Expand All @@ -658,13 +673,23 @@ impl MessageHandler<message::GetExtendedConfig> for Service {
///
/// It includes user and default values.
async fn handle(&mut self, _message: message::GetExtendedConfig) -> Result<Config, Error> {
let bootloader = self
.bootloader
.call(bootloader::message::GetConfig)
.await?
.to_option();
let bootloader = if self.is_service_available(Scope::Storage).await? {
self.bootloader
.call(bootloader::message::GetConfig)
.await?
.to_option()
} else {
None
};

let hostname = self.hostname.call(hostname::message::GetConfig).await?;
let iscsi = self.iscsi.call(iscsi::message::GetConfig).await?;

let iscsi = if self.is_service_available(Scope::Storage).await? {
self.iscsi.call(iscsi::message::GetConfig).await?
} else {
None
};

let l10n = self.l10n.call(l10n::message::GetConfig).await?;
// FIXME: the security service might be busy asking some question, so it cannot answer.
// By now, let's consider that the whole security configuration is set by the user
Expand All @@ -673,17 +698,27 @@ impl MessageHandler<message::GetExtendedConfig> for Service {
let proxy = self.proxy.call(proxy::message::GetConfig).await?;
let questions = self.questions.call(question::message::GetConfig).await?;
let network = self.network.get_config().await?;
let storage = self.storage.call(storage::message::GetConfig).await?;

let storage = if self.is_service_available(Scope::Storage).await? {
self.storage.call(storage::message::GetConfig).await?
} else {
None
};

let users = self.users.call(users::message::GetConfig).await?;

let s390 = if let Some(s390) = &self.s390 {
Some(s390.call(s390::message::GetConfig).await?)
if self.is_service_available(Scope::Storage).await? {
Some(s390.call(s390::message::GetConfig).await?)
} else {
None
}
} else {
None
};

// If the software service is busy, it will not answer.
let software = if self.is_software_available().await? {
let software = if self.is_service_available(Scope::Software).await? {
Some(self.software.call(software::message::GetConfig).await?)
} else {
self.product_software_config().await?
Expand Down Expand Up @@ -741,12 +776,18 @@ impl MessageHandler<message::GetProposal> for Service {
async fn handle(&mut self, _message: message::GetProposal) -> Result<Option<Proposal>, Error> {
let hostname = self.hostname.call(hostname::message::GetProposal).await?;
let l10n = self.l10n.call(l10n::message::GetProposal).await?;
let storage = self.storage.call(storage::message::GetProposal).await?;

let storage = if self.is_service_available(Scope::Storage).await? {
self.storage.call(storage::message::GetProposal).await?
} else {
None
};

let network = self.network.get_proposal().await?;
let users = self.users.call(users::message::GetProposal).await?;

// If the software service is busy, it will not answer.
let software = if self.is_software_available().await? {
let software = if self.is_service_available(Scope::Software).await? {
self.software.call(software::message::GetProposal).await?
} else {
None
Expand Down
7 changes: 7 additions & 0 deletions rust/package/agama.changes
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
-------------------------------------------------------------------
Mon Feb 23 12:31:43 UTC 2026 - Michal Filka <mfilka@suse.com>

- bsc#1258466
- query storage service if it is available to avoid blocking in
cases like when disabled questions

-------------------------------------------------------------------
Fri Feb 20 10:20:10 UTC 2026 - Imobach Gonzalez Sosa <igonzalezsosa@suse.com>

Expand Down
Loading