From 6cb2bd7c132d8522fe797958869b2fd648c5b46c Mon Sep 17 00:00:00 2001 From: suzusuzu Date: Wed, 30 Mar 2022 03:53:01 +0900 Subject: [PATCH 1/2] Fix old edgeAgent remaining --- edgelet/aziot-edged/src/watchdog.rs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/edgelet/aziot-edged/src/watchdog.rs b/edgelet/aziot-edged/src/watchdog.rs index 19e6c37a5f7..ad28dc5a5dc 100644 --- a/edgelet/aziot-edged/src/watchdog.rs +++ b/edgelet/aziot-edged/src/watchdog.rs @@ -24,6 +24,8 @@ pub(crate) async fn run_until_shutdown( let shutdown_loop = shutdown_rx.recv(); futures_util::pin_mut!(shutdown_loop); + remove_old_edge_runtime(&settings, &runtime).await?; + log::info!("Starting watchdog with 60 second period..."); loop { @@ -69,6 +71,21 @@ pub(crate) async fn run_until_shutdown( } } +async fn remove_old_edge_runtime( + settings: &edgelet_settings::docker::Settings, + runtime: &edgelet_docker::DockerModuleRuntime, +) -> Result<(), EdgedError> { + let agent_name = settings.agent().name(); + if runtime.get(agent_name).await.is_ok() { + log::info!("Remove old Edge runtime"); + runtime + .remove(agent_name) + .await + .map_err(|err| EdgedError::from_err("Failed to remove old Edge runtime", err))?; + } + Ok(()) +} + async fn watchdog( settings: &edgelet_settings::docker::Settings, device_info: &aziot_identity_common::AzureIoTSpec, From e8a21d88375143dc845cabd413846fa96b75aba4 Mon Sep 17 00:00:00 2001 From: suzusuzu Date: Sun, 3 Apr 2022 02:12:37 +0900 Subject: [PATCH 2/2] Remove old edgeAgent only if edgeAgent's config changes. --- edgelet/aziot-edged/src/watchdog.rs | 38 +++++++++++++++++++++------ edgelet/edgelet-docker/src/runtime.rs | 4 +++ 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/edgelet/aziot-edged/src/watchdog.rs b/edgelet/aziot-edged/src/watchdog.rs index ad28dc5a5dc..c0a8fbea979 100644 --- a/edgelet/aziot-edged/src/watchdog.rs +++ b/edgelet/aziot-edged/src/watchdog.rs @@ -1,6 +1,6 @@ // Copyright (c) Microsoft. All rights reserved. -use edgelet_core::ModuleRuntime; +use edgelet_core::{Module, ModuleRuntime}; use edgelet_settings::RuntimeSettings; use crate::error::Error as EdgedError; @@ -24,7 +24,7 @@ pub(crate) async fn run_until_shutdown( let shutdown_loop = shutdown_rx.recv(); futures_util::pin_mut!(shutdown_loop); - remove_old_edge_runtime(&settings, &runtime).await?; + remove_old_edge_runtime(&settings, device_info, &runtime, identity_client).await?; log::info!("Starting watchdog with 60 second period..."); @@ -73,16 +73,38 @@ pub(crate) async fn run_until_shutdown( async fn remove_old_edge_runtime( settings: &edgelet_settings::docker::Settings, + device_info: &aziot_identity_common::AzureIoTSpec, runtime: &edgelet_docker::DockerModuleRuntime, + identity_client: &aziot_identity_client_async::Client, ) -> Result<(), EdgedError> { + let gen_id = agent_gen_id(identity_client).await?; + let new_env = agent_env(gen_id, settings, device_info); + let agent_name = settings.agent().name(); - if runtime.get(agent_name).await.is_ok() { - log::info!("Remove old Edge runtime"); - runtime - .remove(agent_name) - .await - .map_err(|err| EdgedError::from_err("Failed to remove old Edge runtime", err))?; + if let Ok((module, _)) = runtime.get(agent_name).await { + let config = module.config(); + if let Some(envs) = config.create_options().env() { + for env in envs { + let env_split: Vec<&str> = env.split("=").collect(); + if env_split.len() != 2 { + continue; + } + let cur_key = env_split[0]; + let cur_value = env_split[1]; + if let Some(new_value) = new_env.get(cur_key) { + if new_value != cur_value { + // Remove old edgeAgent only if edgeAgent's config changes. + log::info!("Remove old Edge runtime"); + runtime.remove(agent_name).await.map_err(|err| { + EdgedError::from_err("Failed to remove old Edge runtime", err) + })?; + return Ok(()); + } + } + } + } } + Ok(()) } diff --git a/edgelet/edgelet-docker/src/runtime.rs b/edgelet/edgelet-docker/src/runtime.rs index d9538b0eb42..9d132e562a9 100644 --- a/edgelet/edgelet-docker/src/runtime.rs +++ b/edgelet/edgelet-docker/src/runtime.rs @@ -502,6 +502,10 @@ impl ModuleRuntime for DockerModuleRuntime { create_options.set_labels(btree_labels); } + + if let Some(env) = config.env() { + create_options.set_env(env.to_vec()); + } } let mut config = DockerConfig::new(