Skip to content

Commit d07775a

Browse files
authored
Merge pull request #2405 from albinsuresh/refactor/tedge-plugins-init-use-file-util-move_file
Tedge ops plugins init logic use async move_file
2 parents f2c7c61 + a7e018d commit d07775a

File tree

6 files changed

+49
-30
lines changed

6 files changed

+49
-30
lines changed

crates/extensions/tedge_config_manager/src/lib.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ mod tests;
77

88
use actor::*;
99
pub use config::*;
10-
use std::fs::rename;
1110
use std::path::PathBuf;
1211
use tedge_actors::futures::channel::mpsc;
1312
use tedge_actors::Builder;
@@ -25,7 +24,9 @@ use tedge_mqtt_ext::MqttMessage;
2524
use tedge_mqtt_ext::TopicFilter;
2625
use tedge_utils::file::create_directory_with_defaults;
2726
use tedge_utils::file::create_file_with_defaults;
27+
use tedge_utils::file::move_file;
2828
use tedge_utils::file::FileError;
29+
use tedge_utils::file::PermissionEntry;
2930

3031
/// An instance of the config manager
3132
///
@@ -41,7 +42,7 @@ pub struct ConfigManagerBuilder {
4142
}
4243

4344
impl ConfigManagerBuilder {
44-
pub fn try_new(
45+
pub async fn try_new(
4546
config: ConfigManagerConfig,
4647
mqtt: &mut impl ServiceProvider<MqttMessage, MqttMessage, TopicFilter>,
4748
fs_notify: &mut impl MessageSource<FsWatchEvent, PathBuf>,
@@ -52,7 +53,7 @@ impl ConfigManagerBuilder {
5253
>,
5354
uploader_actor: &mut impl ServiceProvider<ConfigUploadRequest, ConfigUploadResult, NoConfig>,
5455
) -> Result<Self, FileError> {
55-
Self::init(&config)?;
56+
Self::init(&config).await?;
5657

5758
let plugin_config = PluginConfig::new(config.plugin_config_path.as_path());
5859

@@ -88,7 +89,7 @@ impl ConfigManagerBuilder {
8889
})
8990
}
9091

91-
pub fn init(config: &ConfigManagerConfig) -> Result<(), FileError> {
92+
pub async fn init(config: &ConfigManagerConfig) -> Result<(), FileError> {
9293
if config.plugin_config_path.exists() {
9394
return Ok(());
9495
}
@@ -101,7 +102,12 @@ impl ConfigManagerBuilder {
101102
.join("c8y")
102103
.join("c8y-configuration-plugin.toml");
103104
if legacy_plugin_config.exists() {
104-
rename(legacy_plugin_config, &config.plugin_config_path)?;
105+
move_file(
106+
legacy_plugin_config,
107+
&config.plugin_config_path,
108+
PermissionEntry::default(),
109+
)
110+
.await?;
105111
return Ok(());
106112
}
107113

crates/extensions/tedge_config_manager/src/tests.rs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ fn prepare() -> Result<TempTedgeDir, anyhow::Error> {
5959
}
6060

6161
#[allow(clippy::type_complexity)]
62-
fn new_config_manager_builder(
62+
async fn new_config_manager_builder(
6363
temp_dir: &Path,
6464
) -> (
6565
ConfigManagerBuilder,
@@ -100,6 +100,7 @@ fn new_config_manager_builder(
100100
&mut downloader_builder,
101101
&mut uploader_builder,
102102
)
103+
.await
103104
.unwrap();
104105

105106
(
@@ -111,15 +112,16 @@ fn new_config_manager_builder(
111112
)
112113
}
113114

114-
fn spawn_config_manager_actor(
115+
async fn spawn_config_manager_actor(
115116
temp_dir: &Path,
116117
) -> (
117118
MqttMessageBox,
118119
SimpleMessageBox<NoMessage, FsWatchEvent>,
119120
DownloaderMessageBox,
120121
UploaderMessageBox,
121122
) {
122-
let (actor_builder, mqtt, fs, downloader, uploader) = new_config_manager_builder(temp_dir);
123+
let (actor_builder, mqtt, fs, downloader, uploader) =
124+
new_config_manager_builder(temp_dir).await;
123125
let actor = actor_builder.build();
124126
tokio::spawn(async move { actor.run().await });
125127
(mqtt, fs, downloader, uploader)
@@ -128,7 +130,7 @@ fn spawn_config_manager_actor(
128130
#[tokio::test]
129131
async fn config_manager_reloads_config_types() -> Result<(), anyhow::Error> {
130132
let tempdir = prepare()?;
131-
let (mut mqtt, _fs, _downloader, _uploader) = spawn_config_manager_actor(tempdir.path());
133+
let (mut mqtt, _fs, _downloader, _uploader) = spawn_config_manager_actor(tempdir.path()).await;
132134

133135
let config_snapshot_reload_topic = Topic::new_unchecked("te/device/main///cmd/config_snapshot");
134136
let config_update_reload_topic = Topic::new_unchecked("te/device/main///cmd/config_update");
@@ -161,7 +163,8 @@ async fn config_manager_reloads_config_types() -> Result<(), anyhow::Error> {
161163
#[tokio::test]
162164
async fn config_manager_uploads_snapshot() -> Result<(), anyhow::Error> {
163165
let tempdir = prepare()?;
164-
let (mut mqtt, _fs, _downloader, mut uploader) = spawn_config_manager_actor(tempdir.path());
166+
let (mut mqtt, _fs, _downloader, mut uploader) =
167+
spawn_config_manager_actor(tempdir.path()).await;
165168

166169
let config_topic = Topic::new_unchecked("te/device/main///cmd/config_snapshot/1234");
167170

@@ -224,7 +227,8 @@ async fn config_manager_uploads_snapshot() -> Result<(), anyhow::Error> {
224227
#[tokio::test]
225228
async fn config_manager_download_update() -> Result<(), anyhow::Error> {
226229
let tempdir = prepare()?;
227-
let (mut mqtt, _fs, mut downloader, _uploader) = spawn_config_manager_actor(tempdir.path());
230+
let (mut mqtt, _fs, mut downloader, _uploader) =
231+
spawn_config_manager_actor(tempdir.path()).await;
228232

229233
let config_topic = Topic::new_unchecked("te/device/main///cmd/config_update/1234");
230234

@@ -289,7 +293,7 @@ async fn config_manager_download_update() -> Result<(), anyhow::Error> {
289293
#[tokio::test]
290294
async fn request_config_snapshot_that_does_not_exist() -> Result<(), anyhow::Error> {
291295
let tempdir = prepare()?;
292-
let (mut mqtt, _fs, _downloader, _uploader) = spawn_config_manager_actor(tempdir.path());
296+
let (mut mqtt, _fs, _downloader, _uploader) = spawn_config_manager_actor(tempdir.path()).await;
293297

294298
let config_topic = Topic::new_unchecked("te/device/main///cmd/config_snapshot/1234");
295299

@@ -335,7 +339,7 @@ async fn request_config_snapshot_that_does_not_exist() -> Result<(), anyhow::Err
335339
#[tokio::test]
336340
async fn ignore_topic_for_another_device() -> Result<(), anyhow::Error> {
337341
let tempdir = prepare()?;
338-
let (mut mqtt, _fs, _downloader, _uploader) = spawn_config_manager_actor(tempdir.path());
342+
let (mut mqtt, _fs, _downloader, _uploader) = spawn_config_manager_actor(tempdir.path()).await;
339343

340344
// Check for child device topic
341345
let another_device_topic = Topic::new_unchecked("te/device/child01///cmd/config-snapshot/1234");
@@ -363,7 +367,7 @@ async fn ignore_topic_for_another_device() -> Result<(), anyhow::Error> {
363367
#[tokio::test]
364368
async fn send_incorrect_payload() -> Result<(), anyhow::Error> {
365369
let tempdir = prepare()?;
366-
let (mut mqtt, _fs, _downloader, _uploader) = spawn_config_manager_actor(tempdir.path());
370+
let (mut mqtt, _fs, _downloader, _uploader) = spawn_config_manager_actor(tempdir.path()).await;
367371

368372
let config_topic = Topic::new_unchecked("te/device/main///cmd/config_snapshot/1234");
369373

crates/extensions/tedge_log_manager/src/lib.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ mod tests;
88
pub use actor::*;
99
pub use config::*;
1010
use log_manager::LogPluginConfig;
11-
use std::fs::rename;
1211
use std::path::PathBuf;
1312
use tedge_actors::adapt;
1413
use tedge_actors::Builder;
@@ -27,7 +26,9 @@ use tedge_file_system_ext::FsWatchEvent;
2726
use tedge_mqtt_ext::*;
2827
use tedge_utils::file::create_directory_with_defaults;
2928
use tedge_utils::file::create_file_with_defaults;
29+
use tedge_utils::file::move_file;
3030
use tedge_utils::file::FileError;
31+
use tedge_utils::file::PermissionEntry;
3132

3233
/// This is an actor builder.
3334
pub struct LogManagerBuilder {
@@ -39,13 +40,13 @@ pub struct LogManagerBuilder {
3940
}
4041

4142
impl LogManagerBuilder {
42-
pub fn try_new(
43+
pub async fn try_new(
4344
config: LogManagerConfig,
4445
mqtt: &mut impl ServiceProvider<MqttMessage, MqttMessage, TopicFilter>,
4546
fs_notify: &mut impl MessageSource<FsWatchEvent, PathBuf>,
4647
uploader_actor: &mut impl ServiceProvider<LogUploadRequest, LogUploadResult, NoConfig>,
4748
) -> Result<Self, FileError> {
48-
Self::init(&config)?;
49+
Self::init(&config).await?;
4950
let plugin_config = LogPluginConfig::new(&config.plugin_config_path);
5051

5152
let box_builder = SimpleMessageBoxBuilder::new("Log Manager", 16);
@@ -70,7 +71,7 @@ impl LogManagerBuilder {
7071
})
7172
}
7273

73-
pub fn init(config: &LogManagerConfig) -> Result<(), FileError> {
74+
pub async fn init(config: &LogManagerConfig) -> Result<(), FileError> {
7475
if config.plugin_config_path.exists() {
7576
return Ok(());
7677
}
@@ -80,7 +81,12 @@ impl LogManagerBuilder {
8081

8182
let legacy_plugin_config = config.config_dir.join("c8y").join("c8y-log-plugin.toml");
8283
if legacy_plugin_config.exists() {
83-
rename(legacy_plugin_config, &config.plugin_config_path)?;
84+
move_file(
85+
legacy_plugin_config,
86+
&config.plugin_config_path,
87+
PermissionEntry::default(),
88+
)
89+
.await?;
8490
return Ok(());
8591
}
8692

crates/extensions/tedge_log_manager/src/tests.rs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ fn prepare() -> Result<TempTedgeDir, anyhow::Error> {
7979
/// Create a log manager actor builder
8080
/// along two boxes to exchange MQTT and HTTP messages with the log actor
8181
#[allow(clippy::type_complexity)]
82-
fn new_log_manager_builder(
82+
async fn new_log_manager_builder(
8383
temp_dir: &Path,
8484
) -> (
8585
LogManagerBuilder,
@@ -108,6 +108,7 @@ fn new_log_manager_builder(
108108
&mut fs_watcher_builder,
109109
&mut uploader_builder,
110110
)
111+
.await
111112
.unwrap();
112113

113114
(
@@ -119,14 +120,14 @@ fn new_log_manager_builder(
119120
}
120121

121122
/// Spawn a log manager actor and return 2 boxes to exchange MQTT and HTTP messages with it
122-
fn spawn_log_manager_actor(
123+
async fn spawn_log_manager_actor(
123124
temp_dir: &Path,
124125
) -> (
125126
MqttMessageBox,
126127
SimpleMessageBox<NoMessage, FsWatchEvent>,
127128
UploaderMessageBox,
128129
) {
129-
let (actor_builder, mqtt, fs, uploader) = new_log_manager_builder(temp_dir);
130+
let (actor_builder, mqtt, fs, uploader) = new_log_manager_builder(temp_dir).await;
130131
let actor = actor_builder.build();
131132
tokio::spawn(async move { actor.run().await });
132133
(mqtt, fs, uploader)
@@ -135,7 +136,7 @@ fn spawn_log_manager_actor(
135136
#[tokio::test]
136137
async fn log_manager_reloads_log_types() -> Result<(), anyhow::Error> {
137138
let tempdir = prepare()?;
138-
let (mut mqtt, _fs, _uploader) = spawn_log_manager_actor(tempdir.path());
139+
let (mut mqtt, _fs, _uploader) = spawn_log_manager_actor(tempdir.path()).await;
139140

140141
let log_reload_topic = Topic::new_unchecked("te/device/main///cmd/log_upload");
141142

@@ -156,7 +157,7 @@ async fn log_manager_reloads_log_types() -> Result<(), anyhow::Error> {
156157
#[tokio::test]
157158
async fn log_manager_upload_log_files_on_request() -> Result<(), anyhow::Error> {
158159
let tempdir = prepare()?;
159-
let (mut mqtt, _fs, mut uploader) = spawn_log_manager_actor(tempdir.path());
160+
let (mut mqtt, _fs, mut uploader) = spawn_log_manager_actor(tempdir.path()).await;
160161

161162
let logfile_topic = Topic::new_unchecked("te/device/main///cmd/log_upload/1234");
162163

@@ -220,7 +221,7 @@ async fn log_manager_upload_log_files_on_request() -> Result<(), anyhow::Error>
220221
#[tokio::test]
221222
async fn request_logtype_that_does_not_exist() -> Result<(), anyhow::Error> {
222223
let tempdir = prepare()?;
223-
let (mut mqtt, _fs, _uploader) = spawn_log_manager_actor(tempdir.path());
224+
let (mut mqtt, _fs, _uploader) = spawn_log_manager_actor(tempdir.path()).await;
224225

225226
let logfile_topic = Topic::new_unchecked("te/device/main///cmd/log_upload/1234");
226227

@@ -267,7 +268,7 @@ async fn request_logtype_that_does_not_exist() -> Result<(), anyhow::Error> {
267268
#[tokio::test]
268269
async fn ignore_topic_for_another_device() -> Result<(), anyhow::Error> {
269270
let tempdir = prepare()?;
270-
let (mut mqtt, _http, _fs) = spawn_log_manager_actor(tempdir.path());
271+
let (mut mqtt, _http, _fs) = spawn_log_manager_actor(tempdir.path()).await;
271272

272273
// Check for child device topic
273274
let another_device_topic = Topic::new_unchecked("te/device/child01///cmd/log_upload/1234");
@@ -297,7 +298,7 @@ async fn ignore_topic_for_another_device() -> Result<(), anyhow::Error> {
297298
#[tokio::test]
298299
async fn send_incorrect_payload() -> Result<(), anyhow::Error> {
299300
let tempdir = prepare()?;
300-
let (mut mqtt, _fs, _uploader) = spawn_log_manager_actor(tempdir.path());
301+
let (mut mqtt, _fs, _uploader) = spawn_log_manager_actor(tempdir.path()).await;
301302

302303
let logfile_topic = Topic::new_unchecked("te/device/main///cmd/log_upload/1234");
303304

@@ -326,7 +327,7 @@ async fn send_incorrect_payload() -> Result<(), anyhow::Error> {
326327
#[tokio::test]
327328
async fn read_log_from_file_that_does_not_exist() -> Result<(), anyhow::Error> {
328329
let tempdir = prepare()?;
329-
let (mut mqtt, _fs, _uploader) = spawn_log_manager_actor(tempdir.path());
330+
let (mut mqtt, _fs, _uploader) = spawn_log_manager_actor(tempdir.path()).await;
330331

331332
let logfile_topic = Topic::new_unchecked("te/device/main///cmd/log_upload/1234");
332333

plugins/tedge_configuration_plugin/src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,8 @@ async fn run_with(
141141
&mut fs_watch_actor,
142142
&mut downloader_actor,
143143
&mut uploader_actor,
144-
)?;
144+
)
145+
.await?;
145146

146147
// Shutdown on SIGINT
147148
let signal_actor = SignalActor::builder(&runtime.get_handle());

plugins/tedge_log_plugin/src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,8 @@ async fn run_with(
132132
&mut mqtt_actor,
133133
&mut fs_watch_actor,
134134
&mut uploader_actor,
135-
)?;
135+
)
136+
.await?;
136137

137138
// Shutdown on SIGINT
138139
let signal_actor = SignalActor::builder(&runtime.get_handle());

0 commit comments

Comments
 (0)