Skip to content

Commit

Permalink
feat: convert device profile request to tedge json format
Browse files Browse the repository at this point in the history
Signed-off-by: Krzysztof Piotrowski <[email protected]>
  • Loading branch information
Ruadhri17 committed Aug 6, 2024
1 parent c0c5a47 commit 14eddc8
Show file tree
Hide file tree
Showing 5 changed files with 815 additions and 1 deletion.
32 changes: 32 additions & 0 deletions crates/core/tedge_api/src/device_profile.rs
Original file line number Diff line number Diff line change
Expand Up @@ -57,3 +57,35 @@ pub enum OperationPayload {
#[serde(rename = "payload")]
Config(ConfigInfo),
}

impl DeviceProfileCmdPayload {
pub fn add_firmware(&mut self, firmware: FirmwareInfo) {
let firmware_operation = DeviceProfileOperation {
operation: OperationType::FirmwareUpdate,
skip: false,
payload: OperationPayload::Firmware(firmware),
};

self.operations.push(firmware_operation);
}

pub fn add_software(&mut self, software: SoftwareInfo) {
let software_operation = DeviceProfileOperation {
operation: OperationType::SoftwareUpdate,
skip: false,
payload: OperationPayload::Software(software),
};

self.operations.push(software_operation);
}

pub fn add_config(&mut self, config: ConfigInfo) {
let config_operation = DeviceProfileOperation {
operation: OperationType::ConfigUpdate,
skip: false,
payload: OperationPayload::Config(config),
};

self.operations.push(config_operation);
}
}
13 changes: 12 additions & 1 deletion crates/extensions/c8y_mapper_ext/src/converter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -688,8 +688,19 @@ impl CumulocityConverter {
}
C8yDeviceControlOperation::DeviceProfile(request) => {
if self.config.capabilities.device_profile {
vec![]
if let Some(profile_name) = extras.get("profileName") {
self.convert_device_profile_request(
device_xid,
cmd_id,
request,
serde_json::from_value(profile_name.clone())?,
)?
} else {
error!("Received a c8y_DeviceProfile without a profile name");
vec![]
}
} else {
warn!("Received a c8y_DeviceProfile operation, however, device_profile feature is disabled");
vec![]
}
}
Expand Down
44 changes: 44 additions & 0 deletions crates/extensions/c8y_mapper_ext/src/operations/convert.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
use std::sync::Arc;

use c8y_api::json_c8y_deserializer::C8yDeviceProfile;
use c8y_api::json_c8y_deserializer::C8yDownloadConfigFile;
use c8y_api::json_c8y_deserializer::C8yFirmware;
use c8y_api::json_c8y_deserializer::C8yLogfileRequest;
Expand All @@ -13,6 +14,7 @@ use tedge_api::commands::ConfigUpdateCmdPayload;
use tedge_api::commands::FirmwareUpdateCmdPayload;
use tedge_api::commands::LogMetadata;
use tedge_api::commands::LogUploadCmdPayload;
use tedge_api::device_profile::DeviceProfileCmdPayload;
use tedge_api::entity_store::EntityExternalId;
use tedge_api::entity_store::EntityMetadata;
use tedge_api::mqtt_topics::Channel;
Expand Down Expand Up @@ -309,4 +311,46 @@ impl CumulocityConverter {

Ok(messages)
}

/// Convert c8y_DeviceProfile JSON over MQTT operation to ThinEdge device_profile command.
pub fn convert_device_profile_request(
&self,
device_xid: String,
cmd_id: String,
device_profile_request: C8yDeviceProfile,
profile_name: String,
) -> Result<Vec<MqttMessage>, CumulocityMapperError> {
let entity_xid: EntityExternalId = device_xid.into();

let target = self.entity_store.try_get_by_external_id(&entity_xid)?;

let channel = Channel::Command {
operation: OperationType::DeviceProfile,
cmd_id,
};
let topic = self.mqtt_schema.topic_for(&target.topic_id, &channel);

let mut request = DeviceProfileCmdPayload {
status: CommandStatus::Init,
name: profile_name,
operations: Vec::new(),
};

if let Some(firmware) = device_profile_request.firmware {
request.add_firmware(firmware.into());
}

if let Some(software) = device_profile_request.software {
request.add_software(software.try_into()?);
}

for config in device_profile_request.configuration {
request.add_config(config.into());
}

// Command messages must be retained
Ok(vec![
MqttMessage::new(&topic, request.to_json()).with_retain()
])
}
}
Loading

0 comments on commit 14eddc8

Please sign in to comment.