diff --git a/aziotctl/aziotctl-common/src/config/apply.rs b/aziotctl/aziotctl-common/src/config/apply.rs index 59c70f17..a5b1dce1 100644 --- a/aziotctl/aziotctl-common/src/config/apply.rs +++ b/aziotctl/aziotctl-common/src/config/apply.rs @@ -329,6 +329,7 @@ pub fn run( aziot_identityd_config::Provisioning { provisioning, + retry_seconds: None, local_gateway_hostname: parent_hostname, } }; diff --git a/identity/aziot-identityd-config/src/lib.rs b/identity/aziot-identityd-config/src/lib.rs index 925ec62c..68c18472 100644 --- a/identity/aziot-identityd-config/src/lib.rs +++ b/identity/aziot-identityd-config/src/lib.rs @@ -224,6 +224,9 @@ pub enum DpsAttestationMethod { pub struct Provisioning { pub local_gateway_hostname: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub retry_seconds: Option, + #[serde(flatten)] pub provisioning: ProvisioningType, } diff --git a/identity/aziot-identityd/src/lib.rs b/identity/aziot-identityd/src/lib.rs index 534f2cae..780dc478 100644 --- a/identity/aziot-identityd/src/lib.rs +++ b/identity/aziot-identityd/src/lib.rs @@ -138,20 +138,31 @@ pub async fn main( } // Attempt to reprovision the device. Failure to reprovision on startup means that provisioning - // with IoT Hub failed and no valid backup could be loaded. Treat this as a fatal error. + // with IoT Hub failed and no valid backup could be loaded. { let mut api = api.lock().await; - - if let Err(err) = api - .reprovision_device(auth::AuthId::LocalRoot, ReprovisionTrigger::Startup, None) - .await - { - log::error!( - "Failed to provision with IoT Hub, and no valid device backup was found: {}", - err - ); - - return Err(err.into()); + let retry_secs = api.settings.provisioning.retry_seconds.unwrap_or(0); + loop { + match api + .reprovision_device(auth::AuthId::LocalRoot, ReprovisionTrigger::Startup, None) + .await + { + Ok(_) => break, + Err(err) => { + let retry_msg = if retry_secs == 0 { + String::new() + } else { + format!(" Retrying in {retry_secs} seconds.") + }; + log::error!( + "Failed to provision with IoT Hub, and no valid device backup was found: {err}.{retry_msg}" + ); + if retry_secs == 0 { + return Err(err.into()); + } + tokio::time::sleep(std::time::Duration::from_secs(retry_secs)).await; + } + } } }