From 46d625f7ca0470b29460c3eda1f62a6ac4713861 Mon Sep 17 00:00:00 2001 From: PradeepKiruvale Date: Thu, 18 Aug 2022 16:23:54 +0530 Subject: Restart of tedge-mapper-c8y is recreating deleted child devices (#1344) * Create external device only after alarm message sync Signed-off-by: Pradeep Kumar K J --- crates/core/tedge_mapper/src/c8y/converter.rs | 27 +++++++++++++++------------ crates/core/tedge_mapper/src/c8y/tests.rs | 2 +- 2 files changed, 16 insertions(+), 13 deletions(-) (limited to 'crates/core/tedge_mapper/src') diff --git a/crates/core/tedge_mapper/src/c8y/converter.rs b/crates/core/tedge_mapper/src/c8y/converter.rs index 12f3ec3c..03123697 100644 --- a/crates/core/tedge_mapper/src/c8y/converter.rs +++ b/crates/core/tedge_mapper/src/c8y/converter.rs @@ -274,20 +274,23 @@ where ) -> Result, ConversionError> { if topic.name.starts_with("tedge/alarms") { let mut mqtt_messages: Vec = Vec::new(); - let topic_split: Vec<&str> = topic.name.split('/').collect(); - if topic_split.len() == 5 { - let child_id = topic_split[4]; - // Create a child device, if it does not exists already - if !child_id.is_empty() && !self.children.contains(child_id) { - self.children.insert(child_id.to_string()); - mqtt_messages.push(Message::new( - &Topic::new_unchecked(SMARTREST_PUBLISH_TOPIC), - format!("101,{child_id},{child_id},thin-edge.io-child"), - )); - } - } self.size_threshold.validate(message)?; let mut messages = self.alarm_converter.try_convert_alarm(message)?; + if !messages.is_empty() { + // When there is some messages to be sent on behalf of a child device, + // this child device must be declared first, if not done yet + let topic_split: Vec<&str> = topic.name.split('/').collect(); + if topic_split.len() == 5 { + let child_id = topic_split[4]; + if !child_id.is_empty() && !self.children.contains(child_id) { + self.children.insert(child_id.to_string()); + mqtt_messages.push(Message::new( + &Topic::new_unchecked(SMARTREST_PUBLISH_TOPIC), + format!("101,{child_id},{child_id},thin-edge.io-child"), + )); + } + } + } mqtt_messages.append(&mut messages); Ok(mqtt_messages) } else if topic.name.starts_with(INTERNAL_ALARMS_TOPIC) { diff --git a/crates/core/tedge_mapper/src/c8y/tests.rs b/crates/core/tedge_mapper/src/c8y/tests.rs index 2d37ce87..e72f9eed 100644 --- a/crates/core/tedge_mapper/src/c8y/tests.rs +++ b/crates/core/tedge_mapper/src/c8y/tests.rs @@ -681,7 +681,7 @@ async fn test_sync_child_alarms() { let alarm_message = Message::new(&Topic::new_unchecked(alarm_topic), alarm_payload); // During the sync phase, alarms are not converted immediately, but only cached to be synced later - assert_eq!(converter.convert(&alarm_message).await.len(), 1); + assert!(converter.convert(&alarm_message).await.is_empty()); let non_alarm_topic = "tedge/measurements/external_sensor"; let non_alarm_payload = r#"{"temp": 1}"#; -- cgit v1.2.3