diff options
author | Matthias Beyer <matthias.beyer@ifm.com> | 2022-05-22 09:38:37 +0200 |
---|---|---|
committer | Matthias Beyer <matthias.beyer@ifm.com> | 2022-05-22 09:38:37 +0200 |
commit | 5505f333e138a5e4b81ba4d8c0f88be2dde0c20a (patch) | |
tree | 1c5175097d1cd1c61de5702b923aacfeb80aa482 | |
parent | 7dc7b3a2abbd0d8b4e79307b5ee7bf0591629131 (diff) | |
parent | 35701fa3348a0c781d2069b40af69e6e68ce136d (diff) |
Merge branch 'feature/add_tedge_api/showcase-reply-sending' into feature/add_tedge_api/showcasefeature/add_tedge_api/showcase
-rw-r--r-- | crates/core/tedge_lib/src/sm.rs | 6 | ||||
-rw-r--r-- | plugins/plugin_mqtt_sm/src/error.rs | 3 | ||||
-rw-r--r-- | plugins/plugin_mqtt_sm/src/plugin.rs | 15 | ||||
-rw-r--r-- | plugins/plugin_sm_apt/src/error.rs | 3 | ||||
-rw-r--r-- | plugins/plugin_sm_apt/src/plugin.rs | 12 |
5 files changed, 34 insertions, 5 deletions
diff --git a/crates/core/tedge_lib/src/sm.rs b/crates/core/tedge_lib/src/sm.rs index 5c770d02..b543f2f1 100644 --- a/crates/core/tedge_lib/src/sm.rs +++ b/crates/core/tedge_lib/src/sm.rs @@ -24,6 +24,10 @@ pub mod request { impl tedge_api::Message for Install {} + impl tedge_api::plugin::AcceptsReplies for Install { + type Reply = crate::sm::response::InstallResponse; + } + /// Update a software by name #[derive(Debug, getset::Getters)] pub struct Update { @@ -77,7 +81,7 @@ pub mod response { impl tedge_api::Message for ListResponse {} - #[derive(Debug)] + #[derive(Debug, serde::Serialize)] pub enum InstallResponse { InstallProgress { package_name: String, diff --git a/plugins/plugin_mqtt_sm/src/error.rs b/plugins/plugin_mqtt_sm/src/error.rs index 2bf182fa..b69bdf9c 100644 --- a/plugins/plugin_mqtt_sm/src/error.rs +++ b/plugins/plugin_mqtt_sm/src/error.rs @@ -9,6 +9,9 @@ pub(crate) enum Error { #[error("Failed to serialize JSON payload")] SerError(serde_json::Error), + #[error("Error while waiting for reply")] + ReplyError(#[from] tedge_api::address::ReplyError), + #[error("Failed to send message")] SendFailed, } diff --git a/plugins/plugin_mqtt_sm/src/plugin.rs b/plugins/plugin_mqtt_sm/src/plugin.rs index 433c0b69..6597c406 100644 --- a/plugins/plugin_mqtt_sm/src/plugin.rs +++ b/plugins/plugin_mqtt_sm/src/plugin.rs @@ -80,9 +80,22 @@ impl Handle<IncomingMessage> for MqttSMPlugin { Ok(()) } SmRequest::Install { package_name } => { - self.target + let reply = self + .target .send_and_wait(tedge_lib::sm::request::Install::new(package_name)) .await + .map_err(|_| crate::error::Error::SendFailed)? + .wait_for_reply(std::time::Duration::from_secs(10)) // wait 10 secs for a reply + .await + .map_err(crate::error::Error::from)?; + + let buf = serde_json::to_string(&reply).map_err(crate::error::Error::SerError)?; + let buf = buf.as_bytes().to_vec(); + let msg = plugin_mqtt::OutgoingMessage::new(buf, self.response_topic.clone()); + + self.mqtt_addr + .send_and_wait(msg) + .await .map_err(|_| crate::error::Error::SendFailed)?; Ok(()) diff --git a/plugins/plugin_sm_apt/src/error.rs b/plugins/plugin_sm_apt/src/error.rs index 682ded6e..0d10c4ac 100644 --- a/plugins/plugin_sm_apt/src/error.rs +++ b/plugins/plugin_sm_apt/src/error.rs @@ -2,5 +2,8 @@ pub(crate) enum Error { #[error("Failed to parse configuration")] ConfigParseFailed(toml::de::Error), + + #[error("Failed to send reply")] + ReplySendingFailed, } diff --git a/plugins/plugin_sm_apt/src/plugin.rs b/plugins/plugin_sm_apt/src/plugin.rs index e8f29941..e4f78a03 100644 --- a/plugins/plugin_sm_apt/src/plugin.rs +++ b/plugins/plugin_sm_apt/src/plugin.rs @@ -3,11 +3,12 @@ use async_trait::async_trait; use tedge_api::plugin::Handle; use tedge_api::Plugin; use tedge_api::PluginError; -use tracing::trace; use tedge_lib::sm::request::Install; use tedge_lib::sm::request::List; use tedge_lib::sm::request::Uninstall; use tedge_lib::sm::request::Update; +use tedge_lib::sm::response::InstallResponse; +use tracing::trace; #[derive(Debug)] pub struct SmAptPlugin { @@ -41,13 +42,18 @@ impl Plugin for SmAptPlugin { #[async_trait] impl Handle<Install> for SmAptPlugin { - #[tracing::instrument(name = "plugin.sm_apt.handle_message.install", skip(self, _sender))] + #[tracing::instrument(name = "plugin.sm_apt.handle_message.install", skip(self, sender))] async fn handle_message( &self, message: Install, - _sender: tedge_api::address::ReplySenderFor<Install>, + sender: tedge_api::address::ReplySenderFor<Install>, ) -> Result<(), PluginError> { tracing::info!(package_name = %message.package_name(), "MOCK: Going to install software"); + sender + .reply(InstallResponse::InstallSucceeded { + package_name: message.package_name().clone(), + }) + .map_err(|_| crate::error::Error::ReplySendingFailed)?; Ok(()) } } |