summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Beyer <matthias.beyer@ifm.com>2022-05-15 11:09:44 +0200
committerMatthias Beyer <matthias.beyer@ifm.com>2022-05-17 14:28:00 +0200
commit9b8ffacd0b329444f9c3caf16c6708e038c0234a (patch)
tree0f5664412baf176639f6db1b2c4c20826301dbbb
parent5e358be9aeebd6ffa23dbb2f782049906880a231 (diff)
Add mockup of c8y plugin
Signed-off-by: Matthias Beyer <matthias.beyer@ifm.com>
-rw-r--r--Cargo.lock15
-rw-r--r--Cargo.toml1
-rw-r--r--plugins/plugin_c8y/Cargo.toml19
-rw-r--r--plugins/plugin_c8y/README.md5
-rw-r--r--plugins/plugin_c8y/src/builder.rs61
-rw-r--r--plugins/plugin_c8y/src/config.rs5
-rw-r--r--plugins/plugin_c8y/src/error.rs6
-rw-r--r--plugins/plugin_c8y/src/lib.rs9
-rw-r--r--plugins/plugin_c8y/src/plugin.rs66
9 files changed, 187 insertions, 0 deletions
diff --git a/Cargo.lock b/Cargo.lock
index cd02f8da..b59b6106 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2204,6 +2204,21 @@ dependencies = [
]
[[package]]
+name = "plugin_c8y"
+version = "0.1.0"
+dependencies = [
+ "async-trait",
+ "miette",
+ "plugin_mqtt",
+ "serde",
+ "tedge_api",
+ "tedge_lib",
+ "thiserror",
+ "toml",
+ "tracing",
+]
+
+[[package]]
name = "plugin_httpstop"
version = "0.1.0"
dependencies = [
diff --git a/Cargo.toml b/Cargo.toml
index 3285d1b7..ff12b5c5 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -6,6 +6,7 @@ members = [
"crates/core/tedge_api/tedge_config_derive",
"crates/tests/*",
"plugins/plugin_avg",
+ "plugins/plugin_c8y",
"plugins/plugin_httpstop",
"plugins/plugin_inotify",
"plugins/plugin_log",
diff --git a/plugins/plugin_c8y/Cargo.toml b/plugins/plugin_c8y/Cargo.toml
new file mode 100644
index 00000000..ae287b7e
--- /dev/null
+++ b/plugins/plugin_c8y/Cargo.toml
@@ -0,0 +1,19 @@
+[package]
+name = "plugin_c8y"
+version = "0.1.0"
+edition = "2021"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+async-trait = "0.1"
+miette = "4.4"
+thiserror = "1"
+serde = { version = "1", features = ["derive"] }
+tracing = "0.1"
+toml = "0.5"
+
+tedge_api = { path = "../../crates/core/tedge_api" }
+tedge_lib = { path = "../../crates/core/tedge_lib" }
+plugin_mqtt = { path = "../../plugins/plugin_mqtt" }
+
diff --git a/plugins/plugin_c8y/README.md b/plugins/plugin_c8y/README.md
new file mode 100644
index 00000000..ef7caea4
--- /dev/null
+++ b/plugins/plugin_c8y/README.md
@@ -0,0 +1,5 @@
+# plugin_c8y
+
+This plugin implements the interfacing with the c8y cloud.
+
+
diff --git a/plugins/plugin_c8y/src/builder.rs b/plugins/plugin_c8y/src/builder.rs
new file mode 100644
index 00000000..68d683f1
--- /dev/null
+++ b/plugins/plugin_c8y/src/builder.rs
@@ -0,0 +1,61 @@
+use async_trait::async_trait;
+use tedge_api::CancellationToken;
+use tedge_api::PluginBuilder;
+use tedge_api::PluginConfiguration;
+use tedge_api::PluginDirectory;
+use tedge_api::PluginError;
+use tedge_api::plugin::BuiltPlugin;
+use tedge_api::plugin::HandleTypes;
+use tedge_api::plugin::PluginExt;
+
+use crate::config::C8yConfig;
+use crate::plugin::C8yPlugin;
+
+pub struct C8yPluginBuilder;
+
+#[async_trait]
+impl<PD> PluginBuilder<PD> for C8yPluginBuilder
+where
+ PD: PluginDirectory,
+{
+ fn kind_name() -> &'static str {
+ "c8y"
+ }
+
+ fn kind_configuration() -> Option<tedge_api::ConfigDescription> {
+ Some(<C8yConfig as tedge_api::AsConfig>::as_config())
+ }
+
+ fn kind_message_types() -> HandleTypes
+ where
+ Self: Sized,
+ {
+ C8yPlugin::get_handled_types()
+ }
+
+ async fn verify_configuration(
+ &self,
+ config: &PluginConfiguration,
+ ) -> Result<(), tedge_api::error::PluginError> {
+ config
+ .clone()
+ .try_into()
+ .map(|_: C8yConfig| ())
+ .map_err(crate::error::Error::ConfigParseFailed)
+ .map_err(PluginError::from)
+ }
+
+ async fn instantiate(
+ &self,
+ config: PluginConfiguration,
+ _cancellation_token: CancellationToken,
+ _plugin_dir: &PD,
+ ) -> Result<BuiltPlugin, PluginError> {
+ let config = config
+ .try_into::<C8yConfig>()
+ .map_err(crate::error::Error::ConfigParseFailed)?;
+
+ Ok(C8yPlugin::new(config).finish())
+ }
+}
+
diff --git a/plugins/plugin_c8y/src/config.rs b/plugins/plugin_c8y/src/config.rs
new file mode 100644
index 00000000..7c9d2330
--- /dev/null
+++ b/plugins/plugin_c8y/src/config.rs
@@ -0,0 +1,5 @@
+#[derive(serde::Deserialize, Debug, tedge_api::Config)]
+pub struct C8yConfig {
+ // currently empty
+}
+
diff --git a/plugins/plugin_c8y/src/error.rs b/plugins/plugin_c8y/src/error.rs
new file mode 100644
index 00000000..682ded6e
--- /dev/null
+++ b/plugins/plugin_c8y/src/error.rs
@@ -0,0 +1,6 @@
+#[derive(Debug, miette::Diagnostic, thiserror::Error)]
+pub(crate) enum Error {
+ #[error("Failed to parse configuration")]
+ ConfigParseFailed(toml::de::Error),
+}
+
diff --git a/plugins/plugin_c8y/src/lib.rs b/plugins/plugin_c8y/src/lib.rs
new file mode 100644
index 00000000..8d9f600a
--- /dev/null
+++ b/plugins/plugin_c8y/src/lib.rs
@@ -0,0 +1,9 @@
+#![doc = include_str!("../README.md")]
+
+mod builder;
+mod config;
+mod error;
+mod plugin;
+
+pub use crate::builder::C8yPluginBuilder;
+pub use crate::plugin::C8yPlugin;
diff --git a/plugins/plugin_c8y/src/plugin.rs b/plugins/plugin_c8y/src/plugin.rs
new file mode 100644
index 00000000..31d104ca
--- /dev/null
+++ b/plugins/plugin_c8y/src/plugin.rs
@@ -0,0 +1,66 @@
+use async_trait::async_trait;
+
+use tedge_api::address::ReplySenderFor;
+use tedge_api::plugin::Handle;
+use tedge_api::Plugin;
+use tedge_api::PluginError;
+use tedge_lib::measurement::Measurement;
+use plugin_mqtt::IncomingMessage;
+
+use crate::config::C8yConfig;
+
+#[derive(Debug)]
+pub struct C8yPlugin {
+ config: C8yConfig,
+}
+
+impl C8yPlugin {
+ pub(crate) fn new(config: C8yConfig) -> Self {
+ Self {
+ config,
+ }
+ }
+}
+
+impl tedge_api::plugin::PluginDeclaration for C8yPlugin {
+ type HandledMessages = (IncomingMessage, Measurement);
+}
+
+#[async_trait]
+impl Plugin for C8yPlugin {
+ #[tracing::instrument(name = "plugin.c8y.start", skip(self))]
+ async fn start(&mut self) -> Result<(), PluginError> {
+ Ok(())
+ }
+
+ #[tracing::instrument(name = "plugin.c8y.shutdown", skip(self))]
+ async fn shutdown(&mut self) -> Result<(), PluginError> {
+ Ok(())
+ }
+}
+
+#[async_trait]
+impl Handle<Measurement> for C8yPlugin {
+ #[tracing::instrument(name = "plugin.c8y.handle_message", level = "trace")]
+ async fn handle_message(
+ &self,
+ _message: Measurement,
+ _sender: ReplySenderFor<Measurement>,
+ ) -> Result<(), PluginError> {
+ // TODO
+ Ok(())
+ }
+}
+
+#[async_trait]
+impl Handle<IncomingMessage> for C8yPlugin {
+ #[tracing::instrument(name = "plugin.c8y.handle_message", level = "trace")]
+ async fn handle_message(
+ &self,
+ _message: IncomingMessage,
+ _sender: ReplySenderFor<IncomingMessage>,
+ ) -> Result<(), PluginError> {
+ // TODO
+ Ok(())
+ }
+}