summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Beyer <matthias.beyer@ifm.com>2022-05-22 09:38:37 +0200
committerMatthias Beyer <matthias.beyer@ifm.com>2022-05-22 09:38:37 +0200
commit5505f333e138a5e4b81ba4d8c0f88be2dde0c20a (patch)
tree1c5175097d1cd1c61de5702b923aacfeb80aa482
parent7dc7b3a2abbd0d8b4e79307b5ee7bf0591629131 (diff)
parent35701fa3348a0c781d2069b40af69e6e68ce136d (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.rs6
-rw-r--r--plugins/plugin_mqtt_sm/src/error.rs3
-rw-r--r--plugins/plugin_mqtt_sm/src/plugin.rs15
-rw-r--r--plugins/plugin_sm_apt/src/error.rs3
-rw-r--r--plugins/plugin_sm_apt/src/plugin.rs12
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(())
}
}