diff --git a/rust/agama-manager/src/service.rs b/rust/agama-manager/src/service.rs index 980f87e127..53caf35d3f 100644 --- a/rust/agama-manager/src/service.rs +++ b/rust/agama-manager/src/service.rs @@ -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 { + async fn is_service_available(&self, scope: Scope) -> Result { let is_empty = self .progress - .call(progress::message::IsEmpty::with_scope(Scope::Software)) + .call(progress::message::IsEmpty::with_scope(scope)) .await?; Ok(is_empty) } @@ -621,18 +621,33 @@ impl MessageHandler 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 { - 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() @@ -658,13 +673,23 @@ impl MessageHandler for Service { /// /// It includes user and default values. async fn handle(&mut self, _message: message::GetExtendedConfig) -> Result { - 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 @@ -673,17 +698,27 @@ impl MessageHandler 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? @@ -741,12 +776,18 @@ impl MessageHandler for Service { async fn handle(&mut self, _message: message::GetProposal) -> Result, 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 diff --git a/rust/package/agama.changes b/rust/package/agama.changes index 8e6e7a32f0..dcb285f5e8 100644 --- a/rust/package/agama.changes +++ b/rust/package/agama.changes @@ -1,3 +1,10 @@ +------------------------------------------------------------------- +Mon Feb 23 12:31:43 UTC 2026 - Michal Filka + +- 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