From b1e6c97942c5b65cd64f3a6661aa1189f300cfdd Mon Sep 17 00:00:00 2001 From: Orne Brocaar Date: Wed, 19 Feb 2025 09:34:17 +0000 Subject: [PATCH] Add get_ and update_device to fuota storage + add return_msg. The return_msg (text) field can be used to capture errors, e.g. when the end-device failed to setup the multicast-group. --- .../up.sql | 2 +- .../up.sql | 2 +- chirpstack/src/storage/fuota.rs | 43 ++++++++++++++++++- chirpstack/src/storage/schema_postgres.rs | 1 + chirpstack/src/storage/schema_sqlite.rs | 1 + 5 files changed, 46 insertions(+), 3 deletions(-) diff --git a/chirpstack/migrations_postgres/2025-01-21-093745_add_fuota_support/up.sql b/chirpstack/migrations_postgres/2025-01-21-093745_add_fuota_support/up.sql index 36decf57..b84d85fd 100644 --- a/chirpstack/migrations_postgres/2025-01-21-093745_add_fuota_support/up.sql +++ b/chirpstack/migrations_postgres/2025-01-21-093745_add_fuota_support/up.sql @@ -31,11 +31,11 @@ create table fuota_deployment_device ( dev_eui bytea not null references device on delete cascade, created_at timestamp with time zone not null, updated_at timestamp with time zone not null, - mc_group_setup_completed_at timestamp with time zone null, mc_session_completed_at timestamp with time zone null, frag_session_setup_completed_at timestamp with time zone null, frag_status_completed_at timestamp with time zone null, + return_msg text not null, primary key (fuota_deployment_id, dev_eui) ); diff --git a/chirpstack/migrations_sqlite/2025-01-27-100007_add_fuota_support/up.sql b/chirpstack/migrations_sqlite/2025-01-27-100007_add_fuota_support/up.sql index f6e6c589..2abc38b6 100644 --- a/chirpstack/migrations_sqlite/2025-01-27-100007_add_fuota_support/up.sql +++ b/chirpstack/migrations_sqlite/2025-01-27-100007_add_fuota_support/up.sql @@ -31,11 +31,11 @@ create table fuota_deployment_device ( dev_eui blob not null references device on delete cascade, created_at datetime not null, updated_at datetime not null, - mc_group_setup_completed_at datetime null, mc_session_completed_at datetime null, frag_session_setup_completed_at datetime null, frag_status_completed_at datetime null, + return_msg text not null, primary key (fuota_deployment_id, dev_eui) ); diff --git a/chirpstack/src/storage/fuota.rs b/chirpstack/src/storage/fuota.rs index 969dacf3..18966631 100644 --- a/chirpstack/src/storage/fuota.rs +++ b/chirpstack/src/storage/fuota.rs @@ -101,6 +101,7 @@ pub struct FuotaDeploymentDevice { pub mc_session_completed_at: Option>, pub frag_session_setup_completed_at: Option>, pub frag_status_completed_at: Option>, + pub return_msg: String, } impl Default for FuotaDeploymentDevice { @@ -116,6 +117,7 @@ impl Default for FuotaDeploymentDevice { mc_session_completed_at: None, frag_session_setup_completed_at: None, frag_status_completed_at: None, + return_msg: "".into(), } } } @@ -304,7 +306,7 @@ pub async fn add_devices(fuota_deployment_id: Uuid, dev_euis: Vec) -> Res let res = diesel::insert_into(fuota_deployment_device::table) .values(&FuotaDeploymentDevice { fuota_deployment_id: fuota_deployment_id.into(), - dev_eui: dev_eui, + dev_eui, ..Default::default() }) .execute(&mut get_async_db_conn().await?) @@ -349,6 +351,39 @@ pub async fn get_devices( .map_err(|e| Error::from_diesel(e, "".into())) } +pub async fn get_device( + fuota_deployment_id: Uuid, + dev_eui: EUI64, +) -> Result { + fuota_deployment_device::dsl::fuota_deployment_device + .find((&fields::Uuid::from(fuota_deployment_id), &dev_eui)) + .first(&mut get_async_db_conn().await?) + .await + .map_err(|e| Error::from_diesel(e, dev_eui.to_string())) +} + +pub async fn update_device(d: FuotaDeploymentDevice) -> Result { + let d: FuotaDeploymentDevice = diesel::update( + fuota_deployment_device::dsl::fuota_deployment_device + .find((&d.fuota_deployment_id, &d.dev_eui)), + ) + .set(( + fuota_deployment_device::updated_at.eq(Utc::now()), + fuota_deployment_device::mc_group_setup_completed_at.eq(&d.mc_group_setup_completed_at), + fuota_deployment_device::mc_session_completed_at.eq(&d.mc_session_completed_at), + fuota_deployment_device::frag_session_setup_completed_at + .eq(&d.frag_session_setup_completed_at), + fuota_deployment_device::frag_status_completed_at.eq(&d.frag_status_completed_at), + fuota_deployment_device::return_msg.eq(&d.return_msg), + )) + .get_result(&mut get_async_db_conn().await?) + .await + .map_err(|e| Error::from_diesel(e, d.dev_eui.to_string()))?; + + info!(fuota_deployment_id = %d.fuota_deployment_id, dev_eui = %d.dev_eui, "FUOTA deployment device updated"); + Ok(d) +} + pub async fn remove_devices(fuota_deployment_id: Uuid, dev_euis: Vec) -> Result<(), Error> { diesel::delete( fuota_deployment_device::table @@ -842,6 +877,12 @@ mod test { assert_eq!(dev.dev_eui, devices[0].dev_eui); assert_eq!(d.id, devices[0].fuota_deployment_id); + // get device + let mut fuota_d = get_device(d.id.into(), dev.dev_eui).await.unwrap(); + fuota_d.return_msg = "Error: kaboom".into(); + let fuota_d = update_device(fuota_d).await.unwrap(); + assert_eq!("Error: kaboom", fuota_d.return_msg); + // remove devices remove_devices(d.id.into(), vec![dev.dev_eui]) .await diff --git a/chirpstack/src/storage/schema_postgres.rs b/chirpstack/src/storage/schema_postgres.rs index 449ddafa..6cb64b6e 100644 --- a/chirpstack/src/storage/schema_postgres.rs +++ b/chirpstack/src/storage/schema_postgres.rs @@ -226,6 +226,7 @@ diesel::table! { mc_session_completed_at -> Nullable, frag_session_setup_completed_at -> Nullable, frag_status_completed_at -> Nullable, + return_msg -> Text, } } diff --git a/chirpstack/src/storage/schema_sqlite.rs b/chirpstack/src/storage/schema_sqlite.rs index 2d4af070..6df4a2f0 100644 --- a/chirpstack/src/storage/schema_sqlite.rs +++ b/chirpstack/src/storage/schema_sqlite.rs @@ -202,6 +202,7 @@ diesel::table! { mc_session_completed_at -> Nullable, frag_session_setup_completed_at -> Nullable, frag_status_completed_at -> Nullable, + return_msg -> Text, } }