From 1f808ea07980990feceff8969a393cfef3934cd5 Mon Sep 17 00:00:00 2001 From: Zac Mrowicki Date: Fri, 10 Nov 2023 21:11:35 +0000 Subject: [PATCH 01/41] early-boot-config: Move main executable to src/bin Move `main.rs` to `src/bin/early-boot-config.rs`, and make the corresponding changes. Add a lib.rs and make the appropriate changes to visibility. Also make sure `early-boot-config` is the only binary build from this package, as the user data providers will be built and packaged separately. --- packages/os/os.spec | 6 +++++- sources/api/early-boot-config/build.rs | 2 +- .../src/{main.rs => bin/early-boot-config.rs} | 6 +----- sources/api/early-boot-config/src/lib.rs | 6 ++++++ sources/api/early-boot-config/src/provider.rs | 8 ++++---- sources/api/early-boot-config/src/provider/aws.rs | 2 +- sources/api/early-boot-config/src/provider/metal.rs | 2 +- sources/api/early-boot-config/src/provider/vmware.rs | 2 +- sources/api/early-boot-config/src/settings.rs | 6 +++--- 9 files changed, 23 insertions(+), 17 deletions(-) rename sources/api/early-boot-config/src/{main.rs => bin/early-boot-config.rs} (98%) create mode 100644 sources/api/early-boot-config/src/lib.rs diff --git a/packages/os/os.spec b/packages/os/os.spec index d4af73474b1..ddc2f254113 100644 --- a/packages/os/os.spec +++ b/packages/os/os.spec @@ -336,7 +336,6 @@ static_pid="$!" echo "** Output from non-static builds:" %cargo_build --manifest-path %{_builddir}/sources/Cargo.toml \ -p apiserver \ - -p early-boot-config \ -p netdog \ -p sundog \ -p schnauzer \ @@ -365,6 +364,11 @@ echo "** Output from non-static builds:" %{?with_nvidia_flavor: -p driverdog} \ %{nil} +# Build just the early-boot-config binary and not the user data providers, as +# they are built and packaged separately +%cargo_build --manifest-path %{_builddir}/sources/Cargo.toml \ + -p early-boot-config --bin early-boot-config + # Wait for static builds from the background, if they're not already done. set +e; wait "${static_pid}"; static_rc="${?}"; set -e echo -e "\n** Output from static builds:" diff --git a/sources/api/early-boot-config/build.rs b/sources/api/early-boot-config/build.rs index 8f095b023e6..43ad2c8bde5 100644 --- a/sources/api/early-boot-config/build.rs +++ b/sources/api/early-boot-config/build.rs @@ -15,5 +15,5 @@ fn main() { }; variant.emit_cfgs(); - generate_readme::from_main().unwrap(); + generate_readme::from_file("src/bin/early-boot-config.rs").unwrap(); } diff --git a/sources/api/early-boot-config/src/main.rs b/sources/api/early-boot-config/src/bin/early-boot-config.rs similarity index 98% rename from sources/api/early-boot-config/src/main.rs rename to sources/api/early-boot-config/src/bin/early-boot-config.rs index ad95e5e64a2..87aa4b4a0f3 100644 --- a/sources/api/early-boot-config/src/main.rs +++ b/sources/api/early-boot-config/src/bin/early-boot-config.rs @@ -13,17 +13,13 @@ Currently, Amazon EC2 is supported through the IMDSv1 HTTP API. Data will be ta #[macro_use] extern crate log; +use early_boot_config::provider::{Platform, PlatformDataProvider}; use simplelog::{Config as LogConfig, LevelFilter, SimpleLogger}; use snafu::{ensure, ResultExt}; use std::fs; use std::str::FromStr; use std::{env, process}; -mod compression; -mod provider; -mod settings; -use crate::provider::{Platform, PlatformDataProvider}; - // TODO // Tests! diff --git a/sources/api/early-boot-config/src/lib.rs b/sources/api/early-boot-config/src/lib.rs new file mode 100644 index 00000000000..4877a2b039b --- /dev/null +++ b/sources/api/early-boot-config/src/lib.rs @@ -0,0 +1,6 @@ +#[macro_use] +extern crate log; + +mod compression; +pub mod provider; +pub mod settings; diff --git a/sources/api/early-boot-config/src/provider.rs b/sources/api/early-boot-config/src/provider.rs index 198e683982b..56f9033b8a1 100644 --- a/sources/api/early-boot-config/src/provider.rs +++ b/sources/api/early-boot-config/src/provider.rs @@ -8,21 +8,21 @@ mod local_file; #[cfg(variant_platform = "aws")] mod aws; #[cfg(variant_platform = "aws")] -pub(crate) use aws::AwsDataProvider as Platform; +pub use aws::AwsDataProvider as Platform; #[cfg(variant_platform = "vmware")] mod vmware; #[cfg(variant_platform = "vmware")] -pub(crate) use vmware::VmwareDataProvider as Platform; +pub use vmware::VmwareDataProvider as Platform; #[cfg(variant_platform = "metal")] mod metal; #[cfg(variant_platform = "metal")] -pub(crate) use metal::MetalDataProvider as Platform; +pub use metal::MetalDataProvider as Platform; /// Support for new platforms can be added by implementing this trait. #[async_trait] -pub(crate) trait PlatformDataProvider { +pub trait PlatformDataProvider { /// You should return a list of SettingsJson, representing the settings changes you want to /// send to the API. /// diff --git a/sources/api/early-boot-config/src/provider/aws.rs b/sources/api/early-boot-config/src/provider/aws.rs index ccb2fd7ab41..d77f9fc4653 100644 --- a/sources/api/early-boot-config/src/provider/aws.rs +++ b/sources/api/early-boot-config/src/provider/aws.rs @@ -12,7 +12,7 @@ use std::path::Path; use crate::provider::local_file; /// Unit struct for AWS so we can implement the PlatformDataProvider trait. -pub(crate) struct AwsDataProvider; +pub struct AwsDataProvider; impl AwsDataProvider { const IDENTITY_DOCUMENT_FILE: &'static str = "/etc/early-boot-config/identity-document"; diff --git a/sources/api/early-boot-config/src/provider/metal.rs b/sources/api/early-boot-config/src/provider/metal.rs index ab73a04e233..64740ea3979 100644 --- a/sources/api/early-boot-config/src/provider/metal.rs +++ b/sources/api/early-boot-config/src/provider/metal.rs @@ -6,7 +6,7 @@ use async_trait::async_trait; use crate::provider::local_file; -pub(crate) struct MetalDataProvider; +pub struct MetalDataProvider; #[async_trait] impl PlatformDataProvider for MetalDataProvider { diff --git a/sources/api/early-boot-config/src/provider/vmware.rs b/sources/api/early-boot-config/src/provider/vmware.rs index c3f1e758052..02a37a18e10 100644 --- a/sources/api/early-boot-config/src/provider/vmware.rs +++ b/sources/api/early-boot-config/src/provider/vmware.rs @@ -18,7 +18,7 @@ use std::str; use crate::provider::local_file; -pub(crate) struct VmwareDataProvider; +pub struct VmwareDataProvider; impl VmwareDataProvider { // This program expects that the CD-ROM is already mounted. Mounting happens elsewhere in a diff --git a/sources/api/early-boot-config/src/settings.rs b/sources/api/early-boot-config/src/settings.rs index 7a07f31ec64..2caedde8fe5 100644 --- a/sources/api/early-boot-config/src/settings.rs +++ b/sources/api/early-boot-config/src/settings.rs @@ -6,9 +6,9 @@ use snafu::{OptionExt, ResultExt}; /// SettingsJson represents a change that a provider would like to make in the API. #[derive(Debug)] -pub(crate) struct SettingsJson { - pub(crate) json: String, - pub(crate) desc: String, +pub struct SettingsJson { + pub json: String, + pub desc: String, } impl SettingsJson { From a4a4493d9dd30f654077879b2e9053370a12737e Mon Sep 17 00:00:00 2001 From: Zac Mrowicki Date: Fri, 17 Nov 2023 21:35:02 +0000 Subject: [PATCH 02/41] early-boot-config: Move to env_logger to handle logging Move away from SimpleLogger to env_logger for log handling. User data provider binaries will not contain any arg parsing logic in order to keep them as slim and streamlined as possible. As such, they will use env_logger in order to set log level via environment variable rather than flag. Rather than have two logging implementations, standardize on env_logger. `early-boot-config` is still configured to log to stdout, and defaults to the "info" log level as before --- sources/Cargo.lock | 1 + sources/api/early-boot-config/Cargo.toml | 1 + .../early-boot-config/src/bin/early-boot-config.rs | 11 ++++++++--- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/sources/Cargo.lock b/sources/Cargo.lock index 8b7268bdb06..5722e722594 100644 --- a/sources/Cargo.lock +++ b/sources/Cargo.lock @@ -1694,6 +1694,7 @@ dependencies = [ "base64", "bottlerocket-variant", "constants", + "env_logger", "flate2", "generate-readme", "hex-literal", diff --git a/sources/api/early-boot-config/Cargo.toml b/sources/api/early-boot-config/Cargo.toml index cb66f78fb70..9605c5e6aff 100644 --- a/sources/api/early-boot-config/Cargo.toml +++ b/sources/api/early-boot-config/Cargo.toml @@ -14,6 +14,7 @@ apiclient = { path = "../apiclient", version = "0.1" } async-trait = "0.1" base64 = "0.21" constants = { path = "../../constants", version = "0.1" } +env_logger = "0.10" flate2 = { version = "1", default-features = false, features = ["rust_backend"] } http = "0.2" imdsclient = { path = "../../imdsclient", version = "0.1" } diff --git a/sources/api/early-boot-config/src/bin/early-boot-config.rs b/sources/api/early-boot-config/src/bin/early-boot-config.rs index 87aa4b4a0f3..4a9d2b49856 100644 --- a/sources/api/early-boot-config/src/bin/early-boot-config.rs +++ b/sources/api/early-boot-config/src/bin/early-boot-config.rs @@ -14,7 +14,8 @@ Currently, Amazon EC2 is supported through the IMDSv1 HTTP API. Data will be ta extern crate log; use early_boot_config::provider::{Platform, PlatformDataProvider}; -use simplelog::{Config as LogConfig, LevelFilter, SimpleLogger}; +use env_logger::{Target, WriteStyle}; +use log::LevelFilter; use snafu::{ensure, ResultExt}; use std::fs; use std::str::FromStr; @@ -94,8 +95,12 @@ async fn run() -> Result<()> { // Parse and store the args passed to the program let args = parse_args(env::args()); - // SimpleLogger will send errors to stderr and anything less to stdout. - SimpleLogger::init(args.log_level, LogConfig::default()).context(error::LoggerSnafu)?; + env_logger::Builder::new() + .filter_level(args.log_level) + .format_module_path(false) + .target(Target::Stdout) + .write_style(WriteStyle::Never) + .init(); info!("early-boot-config started"); From 176f0b7a4dd95e67e9b2dcf359a48d782afb4aa9 Mon Sep 17 00:00:00 2001 From: Zac Mrowicki Date: Mon, 20 Nov 2023 17:59:55 +0000 Subject: [PATCH 03/41] early-boot-config: Add trait and common functions for user data provider Adds a trait that all user data providers must implement. Also adds a few common functions for user data providers: logging setup, reading user data from file, and a function to handle running a user data provider using the aforementioned trait, requiring `SettingsJson` to be serializable. --- sources/api/early-boot-config/src/lib.rs | 3 + sources/api/early-boot-config/src/provider.rs | 101 +++++++++++++++++- sources/api/early-boot-config/src/settings.rs | 2 +- 3 files changed, 103 insertions(+), 3 deletions(-) diff --git a/sources/api/early-boot-config/src/lib.rs b/sources/api/early-boot-config/src/lib.rs index 4877a2b039b..b95be8a3776 100644 --- a/sources/api/early-boot-config/src/lib.rs +++ b/sources/api/early-boot-config/src/lib.rs @@ -4,3 +4,6 @@ extern crate log; mod compression; pub mod provider; pub mod settings; + +/// The environment variable used to set log level for env_logger +pub const LOG_LEVEL_ENV_VAR: &str = "EARLY_BOOT_CONFIG_LOG_LEVEL"; diff --git a/sources/api/early-boot-config/src/provider.rs b/sources/api/early-boot-config/src/provider.rs index 56f9033b8a1..ece1521a261 100644 --- a/sources/api/early-boot-config/src/provider.rs +++ b/sources/api/early-boot-config/src/provider.rs @@ -1,9 +1,14 @@ //! The provider module owns the `PlatformDataProvider` trait +mod local_file; +use crate::compression::expand_file_maybe; use crate::settings::SettingsJson; +use crate::LOG_LEVEL_ENV_VAR; use async_trait::async_trait; - -mod local_file; +use env_logger::{Env, Target, WriteStyle}; +use snafu::ResultExt; +use std::path::Path; +use std::process::ExitCode; #[cfg(variant_platform = "aws")] mod aws; @@ -32,3 +37,95 @@ pub trait PlatformDataProvider { &self, ) -> std::result::Result, Box>; } + +/// Support for user data providers can be added by implementing this trait, and adding an +/// additional binary using the implementor and common functions below. +#[async_trait] +pub trait UserDataProvider { + /// Optionally return a SettingsJson object if user data is found, representing the settings to + /// send to the API. + async fn user_data( + &self, + ) -> std::result::Result, Box>; +} + +/// Run a user data provider, returning the proper exit code and errors, and if successful, +/// printing its JSON to stdout. +pub async fn run_userdata_provider(provider: &impl UserDataProvider) -> ExitCode { + let (exit_code, output) = match provider.user_data().await { + Ok(Some(user_data)) => match serde_json::to_string(&user_data) { + Ok(json) => (ExitCode::SUCCESS, json), + Err(e) => ( + ExitCode::FAILURE, + format!("Failed to serialize user data as JSON: {}", e), + ), + }, + Ok(None) => (ExitCode::SUCCESS, String::new()), + Err(e) => (ExitCode::FAILURE, format!("{}", e)), + }; + + println!("{}", output); + exit_code +} + +/// Convenience function to set up logging for provider binaries. +/// +/// Since provider binaries return their output to early-boot-config on stdout, we want to make +/// sure all logging happens to stderr. For debugging purposes, the binaries' log level may be +/// configured via environment variable. +pub fn setup_provider_logging() { + // Filter at info level by default unless configured via environment variable + let log_level = Env::default().filter_or(LOG_LEVEL_ENV_VAR, "info"); + env_logger::Builder::from_env(log_level) + .format_module_path(false) + .target(Target::Stderr) + .write_style(WriteStyle::Never) + .init() +} + +/// Read user data from a given path, decompressing if necessary +fn user_data_from_file>( + path: P, +) -> std::result::Result, Box> { + let path = path.as_ref(); + + if !path.exists() { + info!("{} does not exist, not using it", path.display()); + return Ok(None); + } + info!("'{}' exists, using it", path.display()); + + // Read the file, decompressing it if compressed. + let user_data_str = expand_file_maybe(path).context(error::InputFileReadSnafu { path })?; + + if user_data_str.is_empty() { + warn!("{} exists but is empty", path.display()); + return Ok(None); + } + + trace!("Received user data: {}", user_data_str); + let desc = format!("user data from {}", path.display()); + let json = SettingsJson::from_toml_str(&user_data_str, desc) + .context(error::SettingsToJSONSnafu { from: path })?; + + Ok(Some(json)) +} + +mod error { + use snafu::Snafu; + use std::io; + use std::path::PathBuf; + + #[derive(Debug, Snafu)] + #[snafu(visibility(pub(super)))] + pub(crate) enum Error { + #[snafu(display("Unable to read input file '{}': {}", path.display(), source))] + InputFileRead { path: PathBuf, source: io::Error }, + + #[snafu(display("Unable to serialize settings from {}: {}", from.display(), source))] + SettingsToJSON { + from: PathBuf, + source: crate::settings::Error, + }, + } +} diff --git a/sources/api/early-boot-config/src/settings.rs b/sources/api/early-boot-config/src/settings.rs index 2caedde8fe5..01428f2235e 100644 --- a/sources/api/early-boot-config/src/settings.rs +++ b/sources/api/early-boot-config/src/settings.rs @@ -5,7 +5,7 @@ use serde::Serialize; use snafu::{OptionExt, ResultExt}; /// SettingsJson represents a change that a provider would like to make in the API. -#[derive(Debug)] +#[derive(Debug, Serialize)] pub struct SettingsJson { pub json: String, pub desc: String, From 4ec61d80cf7c62754be7abe1b9cf88d6c808ba81 Mon Sep 17 00:00:00 2001 From: Zac Mrowicki Date: Tue, 5 Dec 2023 23:36:15 +0000 Subject: [PATCH 04/41] Add 'early-boot-config' package and variant dependency Moves `early-boot-config` to its own package, and adds the package dependency to all the variants. --- packages/early-boot-config/Cargo.toml | 21 +++++++++++ .../early-boot-config.service | 0 .../early-boot-config/early-boot-config.spec | 36 +++++++++++++++++++ packages/os/os.spec | 26 +++----------- variants/Cargo.lock | 36 +++++++++++++++++++ variants/aws-dev/Cargo.toml | 2 ++ variants/aws-ecs-1-nvidia/Cargo.toml | 2 ++ variants/aws-ecs-1/Cargo.toml | 2 ++ variants/aws-ecs-2-nvidia/Cargo.toml | 2 ++ variants/aws-ecs-2/Cargo.toml | 2 ++ variants/aws-k8s-1.23-nvidia/Cargo.toml | 2 ++ variants/aws-k8s-1.23/Cargo.toml | 2 ++ variants/aws-k8s-1.24-nvidia/Cargo.toml | 2 ++ variants/aws-k8s-1.24/Cargo.toml | 2 ++ variants/aws-k8s-1.25-nvidia/Cargo.toml | 2 ++ variants/aws-k8s-1.25/Cargo.toml | 2 ++ variants/aws-k8s-1.26-nvidia/Cargo.toml | 2 ++ variants/aws-k8s-1.26/Cargo.toml | 2 ++ variants/aws-k8s-1.27-nvidia/Cargo.toml | 2 ++ variants/aws-k8s-1.27/Cargo.toml | 2 ++ variants/aws-k8s-1.28-nvidia/Cargo.toml | 2 ++ variants/aws-k8s-1.28/Cargo.toml | 2 ++ variants/metal-dev/Cargo.toml | 2 ++ variants/metal-k8s-1.25/Cargo.toml | 2 ++ variants/metal-k8s-1.26/Cargo.toml | 2 ++ variants/metal-k8s-1.27/Cargo.toml | 2 ++ variants/metal-k8s-1.28/Cargo.toml | 2 ++ variants/metal-k8s-1.29/Cargo.toml | 2 ++ variants/vmware-dev/Cargo.toml | 2 ++ variants/vmware-k8s-1.25/Cargo.toml | 2 ++ variants/vmware-k8s-1.26/Cargo.toml | 2 ++ variants/vmware-k8s-1.27/Cargo.toml | 2 ++ variants/vmware-k8s-1.28/Cargo.toml | 2 ++ variants/vmware-k8s-1.29/Cargo.toml | 2 ++ 34 files changed, 156 insertions(+), 21 deletions(-) create mode 100644 packages/early-boot-config/Cargo.toml rename packages/{os => early-boot-config}/early-boot-config.service (100%) create mode 100644 packages/early-boot-config/early-boot-config.spec diff --git a/packages/early-boot-config/Cargo.toml b/packages/early-boot-config/Cargo.toml new file mode 100644 index 00000000000..e3eb88f784b --- /dev/null +++ b/packages/early-boot-config/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "early-boot-config" +version = "0.1.0" +edition = "2021" +publish = false +build = "../build.rs" + +[lib] +path = "../packages.rs" + +[package.metadata.build-package] +source-groups = [ + "api/early-boot-config", +] + +# RPM BuildRequires +[build-dependencies] +glibc = { path = "../glibc" } + +# RPM Requires +[dependencies] diff --git a/packages/os/early-boot-config.service b/packages/early-boot-config/early-boot-config.service similarity index 100% rename from packages/os/early-boot-config.service rename to packages/early-boot-config/early-boot-config.service diff --git a/packages/early-boot-config/early-boot-config.spec b/packages/early-boot-config/early-boot-config.spec new file mode 100644 index 00000000000..a527eb8da21 --- /dev/null +++ b/packages/early-boot-config/early-boot-config.spec @@ -0,0 +1,36 @@ +%global _cross_first_party 1 +%undefine _debugsource_packages + +Name: %{_cross_os}early-boot-config +Version: 0.0 +Release: 0%{?dist} +Summary: early-boot-config +License: Apache-2.0 OR MIT +URL: https://github.com/bottlerocket-os/bottlerocket + +Source100: early-boot-config.service + +BuildRequires: %{_cross_os}glibc-devel + +%description +%{summary}. + +%prep +%setup -T -c +%cargo_prep + +%build +%cargo_build --manifest-path %{_builddir}/sources/Cargo.toml \ + -p early-boot-config --bin early-boot-config + +%install +install -d %{buildroot}%{_cross_bindir} +install -p -m 0755 ${HOME}/.cache/%{__cargo_target}/release/early-boot-config %{buildroot}%{_cross_bindir} + +install -d %{buildroot}%{_cross_unitdir} +install -p -m 0644 %{S:100} %{buildroot}%{_cross_unitdir} + + +%files +%{_cross_bindir}/early-boot-config +%{_cross_unitdir}/early-boot-config.service diff --git a/packages/os/os.spec b/packages/os/os.spec index ddc2f254113..47d9c1640ed 100644 --- a/packages/os/os.spec +++ b/packages/os/os.spec @@ -40,7 +40,6 @@ Source19: host-containers-toml # 1xx sources: systemd units Source100: apiserver.service -Source101: early-boot-config.service Source102: sundog.service Source103: storewolf.service Source105: settings-applier.service @@ -87,7 +86,6 @@ Requires: %{_cross_os}bootstrap-containers Requires: %{_cross_os}bork Requires: %{_cross_os}corndog Requires: %{_cross_os}certdog -Requires: %{_cross_os}early-boot-config Requires: %{_cross_os}ghostdog Requires: %{_cross_os}host-containers Requires: %{_cross_os}logdog @@ -136,11 +134,6 @@ Summary: Bottlerocket API client %description -n %{_cross_os}apiclient %{summary}. -%package -n %{_cross_os}early-boot-config -Summary: Bottlerocket userdata configuration system -%description -n %{_cross_os}early-boot-config -%{summary}. - %package -n %{_cross_os}netdog Summary: Bottlerocket network configuration helper %if %{with systemd_networkd} @@ -364,11 +357,6 @@ echo "** Output from non-static builds:" %{?with_nvidia_flavor: -p driverdog} \ %{nil} -# Build just the early-boot-config binary and not the user data providers, as -# they are built and packaged separately -%cargo_build --manifest-path %{_builddir}/sources/Cargo.toml \ - -p early-boot-config --bin early-boot-config - # Wait for static builds from the background, if they're not already done. set +e; wait "${static_pid}"; static_rc="${?}"; set -e echo -e "\n** Output from static builds:" @@ -381,7 +369,7 @@ fi install -d %{buildroot}%{_cross_bindir} for p in \ apiserver \ - early-boot-config netdog sundog schnauzer schnauzer-v2 bork \ + netdog sundog schnauzer schnauzer-v2 bork \ corndog thar-be-settings thar-be-updates host-containers \ storewolf settings-committer \ migrator prairiedog certdog \ @@ -474,10 +462,10 @@ install -p -m 0644 %{S:5} %{S:6} %{S:7} %{S:8} %{S:14} %{S:15} %{S:16} %{S:17} % install -d %{buildroot}%{_cross_unitdir} install -p -m 0644 \ - %{S:100} %{S:101} %{S:102} %{S:103} %{S:105} \ - %{S:106} %{S:107} %{S:110} %{S:111} %{S:112} \ - %{S:113} %{S:114} %{S:118} %{S:119} %{S:122} \ - %{S:123} \ + %{S:100} %{S:102} %{S:103} %{S:105} \ + %{S:106} %{S:107} %{S:110} %{S:111} \ + %{S:112} %{S:113} %{S:114} %{S:118} \ + %{S:119} %{S:122} %{S:123} \ %{buildroot}%{_cross_unitdir} %if %{with systemd_networkd} @@ -542,10 +530,6 @@ install -p -m 0644 %{S:400} %{S:401} %{S:402} %{buildroot}%{_cross_licensedir} %files -n %{_cross_os}apiclient %{_cross_bindir}/apiclient -%files -n %{_cross_os}early-boot-config -%{_cross_bindir}/early-boot-config -%{_cross_unitdir}/early-boot-config.service - %files -n %{_cross_os}netdog %{_cross_bindir}/netdog %{_cross_tmpfilesdir}/netdog.conf diff --git a/variants/Cargo.lock b/variants/Cargo.lock index a295fe578d9..22f50acc589 100644 --- a/variants/Cargo.lock +++ b/variants/Cargo.lock @@ -24,6 +24,7 @@ dependencies = [ "docker-cli", "docker-engine", "docker-init", + "early-boot-config", "iputils", "kernel-6_1", "login", @@ -38,6 +39,7 @@ dependencies = [ "docker-cli", "docker-engine", "docker-init", + "early-boot-config", "ecs-agent", "kernel-5_10", "release", @@ -50,6 +52,7 @@ dependencies = [ "docker-cli", "docker-engine", "docker-init", + "early-boot-config", "ecs-agent", "ecs-gpu-init", "kernel-5_10", @@ -65,6 +68,7 @@ dependencies = [ "docker-cli", "docker-engine", "docker-init", + "early-boot-config", "ecs-agent", "kernel-6_1", "release", @@ -77,6 +81,7 @@ dependencies = [ "docker-cli", "docker-engine", "docker-init", + "early-boot-config", "ecs-agent", "ecs-gpu-init", "kernel-6_1", @@ -99,6 +104,7 @@ dependencies = [ "aws-iam-authenticator", "cni", "cni-plugins", + "early-boot-config", "kernel-5_10", "kubernetes-1_23", "release", @@ -111,6 +117,7 @@ dependencies = [ "aws-iam-authenticator", "cni", "cni-plugins", + "early-boot-config", "kernel-5_10", "kmod-5_10-nvidia", "kubernetes-1_23", @@ -126,6 +133,7 @@ dependencies = [ "aws-iam-authenticator", "cni", "cni-plugins", + "early-boot-config", "kernel-5_15", "kubernetes-1_24", "release", @@ -138,6 +146,7 @@ dependencies = [ "aws-iam-authenticator", "cni", "cni-plugins", + "early-boot-config", "kernel-5_15", "kmod-5_15-nvidia", "kubernetes-1_24", @@ -153,6 +162,7 @@ dependencies = [ "aws-iam-authenticator", "cni", "cni-plugins", + "early-boot-config", "kernel-5_15", "kubernetes-1_25", "release", @@ -165,6 +175,7 @@ dependencies = [ "aws-iam-authenticator", "cni", "cni-plugins", + "early-boot-config", "kernel-5_15", "kmod-5_15-nvidia", "kubernetes-1_25", @@ -180,6 +191,7 @@ dependencies = [ "aws-iam-authenticator", "cni", "cni-plugins", + "early-boot-config", "kernel-5_15", "kubernetes-1_26", "release", @@ -192,6 +204,7 @@ dependencies = [ "aws-iam-authenticator", "cni", "cni-plugins", + "early-boot-config", "kernel-5_15", "kmod-5_15-nvidia", "kubernetes-1_26", @@ -207,6 +220,7 @@ dependencies = [ "aws-iam-authenticator", "cni", "cni-plugins", + "early-boot-config", "kernel-5_15", "kubernetes-1_27", "release", @@ -219,6 +233,7 @@ dependencies = [ "aws-iam-authenticator", "cni", "cni-plugins", + "early-boot-config", "kernel-5_15", "kmod-5_15-nvidia", "kubernetes-1_27", @@ -234,6 +249,7 @@ dependencies = [ "aws-iam-authenticator", "cni", "cni-plugins", + "early-boot-config", "kernel-6_1", "kubernetes-1_28", "release", @@ -246,6 +262,7 @@ dependencies = [ "aws-iam-authenticator", "cni", "cni-plugins", + "early-boot-config", "kernel-6_1", "kmod-6_1-nvidia", "kubernetes-1_28", @@ -436,6 +453,13 @@ dependencies = [ "util-linux", ] +[[package]] +name = "early-boot-config" +version = "0.1.0" +dependencies = [ + "glibc", +] + [[package]] name = "ecr-credential-provider" version = "0.1.0" @@ -974,6 +998,7 @@ dependencies = [ "docker-cli", "docker-engine", "docker-init", + "early-boot-config", "iputils", "kernel-6_1", "linux-firmware", @@ -989,6 +1014,7 @@ dependencies = [ "aws-iam-authenticator", "cni", "cni-plugins", + "early-boot-config", "kernel-5_15", "kubernetes-1_25", "linux-firmware", @@ -1002,6 +1028,7 @@ dependencies = [ "aws-iam-authenticator", "cni", "cni-plugins", + "early-boot-config", "kernel-5_15", "kubernetes-1_26", "linux-firmware", @@ -1015,6 +1042,7 @@ dependencies = [ "aws-iam-authenticator", "cni", "cni-plugins", + "early-boot-config", "kernel-5_15", "kubernetes-1_27", "linux-firmware", @@ -1028,6 +1056,7 @@ dependencies = [ "aws-iam-authenticator", "cni", "cni-plugins", + "early-boot-config", "kernel-6_1", "kubernetes-1_28", "release", @@ -1040,6 +1069,7 @@ dependencies = [ "aws-iam-authenticator", "cni", "cni-plugins", + "early-boot-config", "kernel-6_1", "kubernetes-1_29", "release", @@ -1219,6 +1249,7 @@ dependencies = [ "docker-cli", "docker-engine", "docker-init", + "early-boot-config", "iputils", "kernel-6_1", "login", @@ -1233,6 +1264,7 @@ version = "0.1.0" dependencies = [ "cni", "cni-plugins", + "early-boot-config", "kernel-5_15", "kubernetes-1_25", "open-vm-tools", @@ -1245,6 +1277,7 @@ version = "0.1.0" dependencies = [ "cni", "cni-plugins", + "early-boot-config", "kernel-5_15", "kubernetes-1_26", "open-vm-tools", @@ -1257,6 +1290,7 @@ version = "0.1.0" dependencies = [ "cni", "cni-plugins", + "early-boot-config", "kernel-5_15", "kubernetes-1_27", "open-vm-tools", @@ -1269,6 +1303,7 @@ version = "0.1.0" dependencies = [ "cni", "cni-plugins", + "early-boot-config", "kernel-6_1", "kubernetes-1_28", "open-vm-tools", @@ -1281,6 +1316,7 @@ version = "0.1.0" dependencies = [ "cni", "cni-plugins", + "early-boot-config", "kernel-6_1", "kubernetes-1_29", "open-vm-tools", diff --git a/variants/aws-dev/Cargo.toml b/variants/aws-dev/Cargo.toml index bfa9456c43c..d149c0b3bc1 100644 --- a/variants/aws-dev/Cargo.toml +++ b/variants/aws-dev/Cargo.toml @@ -26,6 +26,7 @@ kernel-parameters = [ ] included-packages = [ # core + "early-boot-config", "release", "kernel-6.1", # docker @@ -44,6 +45,7 @@ path = "../variants.rs" [build-dependencies] # core +early-boot-config = { path = "../../packages/early-boot-config" } release = { path = "../../packages/release" } kernel-6_1 = { path = "../../packages/kernel-6.1" } # docker diff --git a/variants/aws-ecs-1-nvidia/Cargo.toml b/variants/aws-ecs-1-nvidia/Cargo.toml index 015f348d414..b1506f605a8 100644 --- a/variants/aws-ecs-1-nvidia/Cargo.toml +++ b/variants/aws-ecs-1-nvidia/Cargo.toml @@ -18,6 +18,7 @@ kernel-parameters = [ ] included-packages = [ # core + "early-boot-config", "release", "kernel-5.10", # docker @@ -37,6 +38,7 @@ path = "../variants.rs" [build-dependencies] # core +early-boot-config = { path = "../../packages/early-boot-config" } release = { path = "../../packages/release" } kernel-5_10 = { path = "../../packages/kernel-5.10" } # docker diff --git a/variants/aws-ecs-1/Cargo.toml b/variants/aws-ecs-1/Cargo.toml index 3d53e68b097..412e37fb182 100644 --- a/variants/aws-ecs-1/Cargo.toml +++ b/variants/aws-ecs-1/Cargo.toml @@ -15,6 +15,7 @@ kernel-parameters = [ ] included-packages = [ # core + "early-boot-config", "release", "kernel-5.10", # docker @@ -30,6 +31,7 @@ path = "../variants.rs" [build-dependencies] # core +early-boot-config = { path = "../../packages/early-boot-config" } release = { path = "../../packages/release" } kernel-5_10 = { path = "../../packages/kernel-5.10" } # docker diff --git a/variants/aws-ecs-2-nvidia/Cargo.toml b/variants/aws-ecs-2-nvidia/Cargo.toml index 2ace1284361..c9b91f3bf8d 100644 --- a/variants/aws-ecs-2-nvidia/Cargo.toml +++ b/variants/aws-ecs-2-nvidia/Cargo.toml @@ -18,6 +18,7 @@ os-image-size-gib = 4 [package.metadata.build-variant] included-packages = [ # core + "early-boot-config", "release", "kernel-6.1", # docker @@ -45,6 +46,7 @@ path = "../variants.rs" [build-dependencies] # core +early-boot-config = { path = "../../packages/early-boot-config" } release = { path = "../../packages/release" } kernel-6_1 = { path = "../../packages/kernel-6.1" } # docker diff --git a/variants/aws-ecs-2/Cargo.toml b/variants/aws-ecs-2/Cargo.toml index d307bb3abc5..8e49d1b37bc 100644 --- a/variants/aws-ecs-2/Cargo.toml +++ b/variants/aws-ecs-2/Cargo.toml @@ -17,6 +17,7 @@ systemd-networkd = true [package.metadata.build-variant] included-packages = [ # core + "early-boot-config", "release", "kernel-6.1", # docker @@ -39,6 +40,7 @@ path = "../variants.rs" [build-dependencies] # core +early-boot-config = { path = "../../packages/early-boot-config" } release = { path = "../../packages/release" } kernel-6_1 = { path = "../../packages/kernel-6.1" } # docker diff --git a/variants/aws-k8s-1.23-nvidia/Cargo.toml b/variants/aws-k8s-1.23-nvidia/Cargo.toml index 71dad8886d4..6151c47653d 100644 --- a/variants/aws-k8s-1.23-nvidia/Cargo.toml +++ b/variants/aws-k8s-1.23-nvidia/Cargo.toml @@ -20,6 +20,7 @@ included-packages = [ "aws-iam-authenticator", "cni", "cni-plugins", + "early-boot-config", "kernel-5.10", "kubelet-1.23", "release", @@ -42,6 +43,7 @@ path = "../variants.rs" aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } +early-boot-config = { path = "../../packages/early-boot-config" } kernel-5_10 = { path = "../../packages/kernel-5.10" } kubernetes-1_23 = { path = "../../packages/kubernetes-1.23" } release = { path = "../../packages/release" } diff --git a/variants/aws-k8s-1.23/Cargo.toml b/variants/aws-k8s-1.23/Cargo.toml index 60cb5dbbf8e..3d4151e6035 100644 --- a/variants/aws-k8s-1.23/Cargo.toml +++ b/variants/aws-k8s-1.23/Cargo.toml @@ -17,6 +17,7 @@ included-packages = [ "aws-iam-authenticator", "cni", "cni-plugins", + "early-boot-config", "kernel-5.10", "kubelet-1.23", "release", @@ -36,6 +37,7 @@ path = "../variants.rs" aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } +early-boot-config = { path = "../../packages/early-boot-config" } kernel-5_10 = { path = "../../packages/kernel-5.10" } kubernetes-1_23= { path = "../../packages/kubernetes-1.23" } release = { path = "../../packages/release" } diff --git a/variants/aws-k8s-1.24-nvidia/Cargo.toml b/variants/aws-k8s-1.24-nvidia/Cargo.toml index 6f3bc8a1233..59d79573d7c 100644 --- a/variants/aws-k8s-1.24-nvidia/Cargo.toml +++ b/variants/aws-k8s-1.24-nvidia/Cargo.toml @@ -20,6 +20,7 @@ included-packages = [ "aws-iam-authenticator", "cni", "cni-plugins", + "early-boot-config", "kernel-5.15", "kubelet-1.24", "release", @@ -42,6 +43,7 @@ path = "../variants.rs" aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } +early-boot-config = { path = "../../packages/early-boot-config" } kernel-5_15 = { path = "../../packages/kernel-5.15" } kubernetes-1_24 = { path = "../../packages/kubernetes-1.24" } release = { path = "../../packages/release" } diff --git a/variants/aws-k8s-1.24/Cargo.toml b/variants/aws-k8s-1.24/Cargo.toml index 8d9298896a0..463c7c0ad95 100644 --- a/variants/aws-k8s-1.24/Cargo.toml +++ b/variants/aws-k8s-1.24/Cargo.toml @@ -17,6 +17,7 @@ included-packages = [ "aws-iam-authenticator", "cni", "cni-plugins", + "early-boot-config", "kernel-5.15", "kubelet-1.24", "release", @@ -36,6 +37,7 @@ path = "../variants.rs" aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } +early-boot-config = { path = "../../packages/early-boot-config" } kernel-5_15 = { path = "../../packages/kernel-5.15" } kubernetes-1_24= { path = "../../packages/kubernetes-1.24" } release = { path = "../../packages/release" } diff --git a/variants/aws-k8s-1.25-nvidia/Cargo.toml b/variants/aws-k8s-1.25-nvidia/Cargo.toml index 9e59896d1a8..282f1ae77d2 100644 --- a/variants/aws-k8s-1.25-nvidia/Cargo.toml +++ b/variants/aws-k8s-1.25-nvidia/Cargo.toml @@ -20,6 +20,7 @@ included-packages = [ "aws-iam-authenticator", "cni", "cni-plugins", + "early-boot-config", "kernel-5.15", "kubelet-1.25", "release", @@ -42,6 +43,7 @@ path = "../variants.rs" aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } +early-boot-config = { path = "../../packages/early-boot-config" } kernel-5_15 = { path = "../../packages/kernel-5.15" } kubernetes-1_25 = { path = "../../packages/kubernetes-1.25" } release = { path = "../../packages/release" } diff --git a/variants/aws-k8s-1.25/Cargo.toml b/variants/aws-k8s-1.25/Cargo.toml index 4eeb4a2614c..7b5414e7f22 100644 --- a/variants/aws-k8s-1.25/Cargo.toml +++ b/variants/aws-k8s-1.25/Cargo.toml @@ -17,6 +17,7 @@ included-packages = [ "aws-iam-authenticator", "cni", "cni-plugins", + "early-boot-config", "kernel-5.15", "kubelet-1.25", "release", @@ -36,6 +37,7 @@ path = "../variants.rs" aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } +early-boot-config = { path = "../../packages/early-boot-config" } kernel-5_15 = { path = "../../packages/kernel-5.15" } kubernetes-1_25 = { path = "../../packages/kubernetes-1.25" } release = { path = "../../packages/release" } diff --git a/variants/aws-k8s-1.26-nvidia/Cargo.toml b/variants/aws-k8s-1.26-nvidia/Cargo.toml index dadd6b69c54..078bcc25c29 100644 --- a/variants/aws-k8s-1.26-nvidia/Cargo.toml +++ b/variants/aws-k8s-1.26-nvidia/Cargo.toml @@ -21,6 +21,7 @@ included-packages = [ "aws-iam-authenticator", "cni", "cni-plugins", + "early-boot-config", "kernel-5.15", "kubelet-1.26", "release", @@ -43,6 +44,7 @@ path = "../variants.rs" aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } +early-boot-config = { path = "../../packages/early-boot-config" } kernel-5_15 = { path = "../../packages/kernel-5.15" } kubernetes-1_26 = { path = "../../packages/kubernetes-1.26" } release = { path = "../../packages/release" } diff --git a/variants/aws-k8s-1.26/Cargo.toml b/variants/aws-k8s-1.26/Cargo.toml index fc9ec230f3e..9593329cb67 100644 --- a/variants/aws-k8s-1.26/Cargo.toml +++ b/variants/aws-k8s-1.26/Cargo.toml @@ -18,6 +18,7 @@ included-packages = [ "aws-iam-authenticator", "cni", "cni-plugins", + "early-boot-config", "kernel-5.15", "kubelet-1.26", "release", @@ -37,6 +38,7 @@ path = "../variants.rs" aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } +early-boot-config = { path = "../../packages/early-boot-config" } kernel-5_15 = { path = "../../packages/kernel-5.15" } kubernetes-1_26 = { path = "../../packages/kubernetes-1.26" } release = { path = "../../packages/release" } diff --git a/variants/aws-k8s-1.27-nvidia/Cargo.toml b/variants/aws-k8s-1.27-nvidia/Cargo.toml index f15ab848b62..b3c9333cb6d 100644 --- a/variants/aws-k8s-1.27-nvidia/Cargo.toml +++ b/variants/aws-k8s-1.27-nvidia/Cargo.toml @@ -21,6 +21,7 @@ included-packages = [ "aws-iam-authenticator", "cni", "cni-plugins", + "early-boot-config", "kernel-5.15", "kubelet-1.27", "release", @@ -43,6 +44,7 @@ path = "../variants.rs" aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } +early-boot-config = { path = "../../packages/early-boot-config" } kernel-5_15 = { path = "../../packages/kernel-5.15" } kubernetes-1_27 = { path = "../../packages/kubernetes-1.27" } release = { path = "../../packages/release" } diff --git a/variants/aws-k8s-1.27/Cargo.toml b/variants/aws-k8s-1.27/Cargo.toml index eff3ed053f6..65a40768df1 100644 --- a/variants/aws-k8s-1.27/Cargo.toml +++ b/variants/aws-k8s-1.27/Cargo.toml @@ -18,6 +18,7 @@ included-packages = [ "aws-iam-authenticator", "cni", "cni-plugins", + "early-boot-config", "kernel-5.15", "kubelet-1.27", "release", @@ -37,6 +38,7 @@ path = "../variants.rs" aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } +early-boot-config = { path = "../../packages/early-boot-config" } kernel-5_15 = { path = "../../packages/kernel-5.15" } kubernetes-1_27 = { path = "../../packages/kubernetes-1.27" } release = { path = "../../packages/release" } diff --git a/variants/aws-k8s-1.28-nvidia/Cargo.toml b/variants/aws-k8s-1.28-nvidia/Cargo.toml index 4a740cef9c2..e57c961fd5d 100644 --- a/variants/aws-k8s-1.28-nvidia/Cargo.toml +++ b/variants/aws-k8s-1.28-nvidia/Cargo.toml @@ -22,6 +22,7 @@ systemd-networkd = true [package.metadata.build-variant] included-packages = [ # core + "early-boot-config", "release", "kernel-6.1", # k8s @@ -47,6 +48,7 @@ path = "../variants.rs" [build-dependencies] # core +early-boot-config = { path = "../../packages/early-boot-config" } release = { path = "../../packages/release" } kernel-6_1 = { path = "../../packages/kernel-6.1" } # k8s diff --git a/variants/aws-k8s-1.28/Cargo.toml b/variants/aws-k8s-1.28/Cargo.toml index 676cd9a428b..4fbc8f00b67 100644 --- a/variants/aws-k8s-1.28/Cargo.toml +++ b/variants/aws-k8s-1.28/Cargo.toml @@ -19,6 +19,7 @@ systemd-networkd = true [package.metadata.build-variant] included-packages = [ # core + "early-boot-config", "release", "kernel-6.1", # k8s @@ -40,6 +41,7 @@ path = "../variants.rs" [build-dependencies] # core +early-boot-config = { path = "../../packages/early-boot-config" } release = { path = "../../packages/release" } kernel-6_1 = { path = "../../packages/kernel-6.1" } # k8s diff --git a/variants/metal-dev/Cargo.toml b/variants/metal-dev/Cargo.toml index 553d40f28bd..5359c635619 100644 --- a/variants/metal-dev/Cargo.toml +++ b/variants/metal-dev/Cargo.toml @@ -25,6 +25,7 @@ kernel-parameters = [ ] included-packages = [ # core + "early-boot-config", "release", "kernel-6.1", "linux-firmware", @@ -44,6 +45,7 @@ path = "../variants.rs" [build-dependencies] # core +early-boot-config = { path = "../../packages/early-boot-config" } release = { path = "../../packages/release" } kernel-6_1 = { path = "../../packages/kernel-6.1" } linux-firmware = { path = "../../packages/linux-firmware" } diff --git a/variants/metal-k8s-1.25/Cargo.toml b/variants/metal-k8s-1.25/Cargo.toml index 30b640cab20..41fef445221 100644 --- a/variants/metal-k8s-1.25/Cargo.toml +++ b/variants/metal-k8s-1.25/Cargo.toml @@ -27,6 +27,7 @@ included-packages = [ "aws-iam-authenticator", "cni", "cni-plugins", + "early-boot-config", "kernel-5.15", "linux-firmware", "kubelet-1.25", @@ -40,6 +41,7 @@ path = "../variants.rs" aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } +early-boot-config = { path = "../../packages/early-boot-config" } kernel-5_15 = { path = "../../packages/kernel-5.15" } linux-firmware = { path = "../../packages/linux-firmware" } kubernetes-1_25 = { path = "../../packages/kubernetes-1.25" } diff --git a/variants/metal-k8s-1.26/Cargo.toml b/variants/metal-k8s-1.26/Cargo.toml index 7bb5402a953..f5b52f3565d 100644 --- a/variants/metal-k8s-1.26/Cargo.toml +++ b/variants/metal-k8s-1.26/Cargo.toml @@ -28,6 +28,7 @@ included-packages = [ "aws-iam-authenticator", "cni", "cni-plugins", + "early-boot-config", "kernel-5.15", "linux-firmware", "kubelet-1.26", @@ -41,6 +42,7 @@ path = "../variants.rs" aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } +early-boot-config = { path = "../../packages/early-boot-config" } kernel-5_15 = { path = "../../packages/kernel-5.15" } linux-firmware = { path = "../../packages/linux-firmware" } kubernetes-1_26 = { path = "../../packages/kubernetes-1.26" } diff --git a/variants/metal-k8s-1.27/Cargo.toml b/variants/metal-k8s-1.27/Cargo.toml index aadc1fe333a..3e5bb8fef9c 100644 --- a/variants/metal-k8s-1.27/Cargo.toml +++ b/variants/metal-k8s-1.27/Cargo.toml @@ -28,6 +28,7 @@ included-packages = [ "aws-iam-authenticator", "cni", "cni-plugins", + "early-boot-config", "kernel-5.15", "linux-firmware", "kubelet-1.27", @@ -41,6 +42,7 @@ path = "../variants.rs" aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } +early-boot-config = { path = "../../packages/early-boot-config" } kernel-5_15 = { path = "../../packages/kernel-5.15" } linux-firmware = { path = "../../packages/linux-firmware" } kubernetes-1_27 = { path = "../../packages/kubernetes-1.27" } diff --git a/variants/metal-k8s-1.28/Cargo.toml b/variants/metal-k8s-1.28/Cargo.toml index d299e0252ee..7b94283dd20 100644 --- a/variants/metal-k8s-1.28/Cargo.toml +++ b/variants/metal-k8s-1.28/Cargo.toml @@ -29,6 +29,7 @@ kernel-parameters = [ ] included-packages = [ # core + "early-boot-config", "release", "kernel-6.1", # k8s @@ -43,6 +44,7 @@ path = "../variants.rs" [build-dependencies] # core +early-boot-config = { path = "../../packages/early-boot-config" } release = { path = "../../packages/release" } kernel-6_1 = { path = "../../packages/kernel-6.1" } # k8s diff --git a/variants/metal-k8s-1.29/Cargo.toml b/variants/metal-k8s-1.29/Cargo.toml index 467e223fbad..834802f2eb8 100644 --- a/variants/metal-k8s-1.29/Cargo.toml +++ b/variants/metal-k8s-1.29/Cargo.toml @@ -36,6 +36,7 @@ included-packages = [ "cni", "cni-plugins", "kubelet-1.29", + "early-boot-config", ] [lib] @@ -50,3 +51,4 @@ aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } kubernetes-1_29 = { path = "../../packages/kubernetes-1.29" } +early-boot-config = { path = "../../packages/early-boot-config" } diff --git a/variants/vmware-dev/Cargo.toml b/variants/vmware-dev/Cargo.toml index 2dec382d40f..4ccb51dfa83 100644 --- a/variants/vmware-dev/Cargo.toml +++ b/variants/vmware-dev/Cargo.toml @@ -30,6 +30,7 @@ kernel-parameters = [ ] included-packages = [ # core + "early-boot-config", "release", "kernel-6.1", "open-vm-tools", @@ -49,6 +50,7 @@ path = "../variants.rs" [build-dependencies] # core +early-boot-config = { path = "../../packages/early-boot-config" } release = { path = "../../packages/release" } kernel-6_1 = { path = "../../packages/kernel-6.1" } open-vm-tools = { path = "../../packages/open-vm-tools" } diff --git a/variants/vmware-k8s-1.25/Cargo.toml b/variants/vmware-k8s-1.25/Cargo.toml index 37a148980a1..5b6e46a7a12 100644 --- a/variants/vmware-k8s-1.25/Cargo.toml +++ b/variants/vmware-k8s-1.25/Cargo.toml @@ -29,6 +29,7 @@ kernel-parameters = [ included-packages = [ "cni", "cni-plugins", + "early-boot-config", "kernel-5.15", "kubelet-1.25", "open-vm-tools", @@ -41,6 +42,7 @@ path = "../variants.rs" [build-dependencies] cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } +early-boot-config = { path = "../../packages/early-boot-config" } kernel-5_15 = { path = "../../packages/kernel-5.15" } kubernetes-1_25 = { path = "../../packages/kubernetes-1.25" } open-vm-tools = { path = "../../packages/open-vm-tools" } diff --git a/variants/vmware-k8s-1.26/Cargo.toml b/variants/vmware-k8s-1.26/Cargo.toml index 0ba194b0f33..4b94fa8447f 100644 --- a/variants/vmware-k8s-1.26/Cargo.toml +++ b/variants/vmware-k8s-1.26/Cargo.toml @@ -30,6 +30,7 @@ kernel-parameters = [ included-packages = [ "cni", "cni-plugins", + "early-boot-config", "kernel-5.15", "kubelet-1.26", "open-vm-tools", @@ -42,6 +43,7 @@ path = "../variants.rs" [build-dependencies] cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } +early-boot-config = { path = "../../packages/early-boot-config" } kernel-5_15 = { path = "../../packages/kernel-5.15" } kubernetes-1_26 = { path = "../../packages/kubernetes-1.26" } open-vm-tools = { path = "../../packages/open-vm-tools" } diff --git a/variants/vmware-k8s-1.27/Cargo.toml b/variants/vmware-k8s-1.27/Cargo.toml index 422ec9ddbdf..27083a247c2 100644 --- a/variants/vmware-k8s-1.27/Cargo.toml +++ b/variants/vmware-k8s-1.27/Cargo.toml @@ -30,6 +30,7 @@ kernel-parameters = [ included-packages = [ "cni", "cni-plugins", + "early-boot-config", "kernel-5.15", "kubelet-1.27", "open-vm-tools", @@ -42,6 +43,7 @@ path = "../variants.rs" [build-dependencies] cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } +early-boot-config = { path = "../../packages/early-boot-config" } kernel-5_15 = { path = "../../packages/kernel-5.15" } kubernetes-1_27 = { path = "../../packages/kubernetes-1.27" } open-vm-tools = { path = "../../packages/open-vm-tools" } diff --git a/variants/vmware-k8s-1.28/Cargo.toml b/variants/vmware-k8s-1.28/Cargo.toml index b0bae19e4b3..c64ba6dbccc 100644 --- a/variants/vmware-k8s-1.28/Cargo.toml +++ b/variants/vmware-k8s-1.28/Cargo.toml @@ -32,6 +32,7 @@ kernel-parameters = [ ] included-packages = [ # core + "early-boot-config", "release", "kernel-6.1", # k8s @@ -47,6 +48,7 @@ path = "../variants.rs" [build-dependencies] # core +early-boot-config = { path = "../../packages/early-boot-config" } release = { path = "../../packages/release" } kernel-6_1 = { path = "../../packages/kernel-6.1" } # k8s diff --git a/variants/vmware-k8s-1.29/Cargo.toml b/variants/vmware-k8s-1.29/Cargo.toml index 71fa80abb92..fa4ee8e41c6 100644 --- a/variants/vmware-k8s-1.29/Cargo.toml +++ b/variants/vmware-k8s-1.29/Cargo.toml @@ -39,6 +39,7 @@ included-packages = [ "cni-plugins", "kubelet-1.29", # vmware + "early-boot-config", "open-vm-tools", ] @@ -54,4 +55,5 @@ cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } kubernetes-1_29 = { path = "../../packages/kubernetes-1.29" } # vmware +early-boot-config = { path = "../../packages/early-boot-config" } open-vm-tools = { path = "../../packages/open-vm-tools" } From f0261d1cd3ba250d10795fba9f14b23fa900a945 Mon Sep 17 00:00:00 2001 From: Zac Mrowicki Date: Mon, 20 Nov 2023 20:27:31 +0000 Subject: [PATCH 05/41] early-boot-config: Add local defaults user data provider Adds a standalone user data provider binary specifically for gathering data from the local defaults file `/local/user_data_defaults.toml`. The binary is meant to be run by the main `early-boot-config` executable. It logs to stderr, as it returns a `SettingsJson` object on stdout in the case of success. It returns an error and non-zero exit code in the case of failure. --- sources/api/early-boot-config/Cargo.toml | 4 ++++ .../src/bin/user-data-providers/local_defaults.rs | 8 ++++++++ sources/api/early-boot-config/src/provider.rs | 2 ++ .../src/provider/local_defaults.rs | 15 +++++++++++++++ 4 files changed, 29 insertions(+) create mode 100644 sources/api/early-boot-config/src/bin/user-data-providers/local_defaults.rs create mode 100644 sources/api/early-boot-config/src/provider/local_defaults.rs diff --git a/sources/api/early-boot-config/Cargo.toml b/sources/api/early-boot-config/Cargo.toml index 9605c5e6aff..cdd5ed1bf76 100644 --- a/sources/api/early-boot-config/Cargo.toml +++ b/sources/api/early-boot-config/Cargo.toml @@ -9,6 +9,10 @@ build = "build.rs" # Don't rebuild crate just because of changes to README. exclude = ["README.md"] +[[bin]] +name = "local-defaults-provider" +path = "src/bin/user-data-providers/local_defaults.rs" + [dependencies] apiclient = { path = "../apiclient", version = "0.1" } async-trait = "0.1" diff --git a/sources/api/early-boot-config/src/bin/user-data-providers/local_defaults.rs b/sources/api/early-boot-config/src/bin/user-data-providers/local_defaults.rs new file mode 100644 index 00000000000..66e80efbe60 --- /dev/null +++ b/sources/api/early-boot-config/src/bin/user-data-providers/local_defaults.rs @@ -0,0 +1,8 @@ +use early_boot_config::provider::{run_userdata_provider, setup_provider_logging, LocalDefaults}; +use std::process::ExitCode; + +#[tokio::main] +async fn main() -> ExitCode { + setup_provider_logging(); + run_userdata_provider(&LocalDefaults).await +} diff --git a/sources/api/early-boot-config/src/provider.rs b/sources/api/early-boot-config/src/provider.rs index ece1521a261..a80fdfc5d6c 100644 --- a/sources/api/early-boot-config/src/provider.rs +++ b/sources/api/early-boot-config/src/provider.rs @@ -1,4 +1,5 @@ //! The provider module owns the `PlatformDataProvider` trait +mod local_defaults; mod local_file; use crate::compression::expand_file_maybe; @@ -6,6 +7,7 @@ use crate::settings::SettingsJson; use crate::LOG_LEVEL_ENV_VAR; use async_trait::async_trait; use env_logger::{Env, Target, WriteStyle}; +pub use local_defaults::LocalDefaults; use snafu::ResultExt; use std::path::Path; use std::process::ExitCode; diff --git a/sources/api/early-boot-config/src/provider/local_defaults.rs b/sources/api/early-boot-config/src/provider/local_defaults.rs new file mode 100644 index 00000000000..47edacb6619 --- /dev/null +++ b/sources/api/early-boot-config/src/provider/local_defaults.rs @@ -0,0 +1,15 @@ +/// Site-local defaults +use super::{user_data_from_file, UserDataProvider}; +use crate::settings::SettingsJson; +use async_trait::async_trait; + +const LOCAL_DEFAULTS_FILE: &str = "/local/user-data-defaults.toml"; + +pub struct LocalDefaults; + +#[async_trait] +impl UserDataProvider for LocalDefaults { + async fn user_data(&self) -> Result, Box> { + user_data_from_file(LOCAL_DEFAULTS_FILE) + } +} From 026dd2a4b5651bd9f6c1c12fadf11b3978ceb5b2 Mon Sep 17 00:00:00 2001 From: Zac Mrowicki Date: Mon, 20 Nov 2023 20:58:13 +0000 Subject: [PATCH 06/41] packages: Add 'early-boot-config-local-defaults' package Adds a new package for the `local-defaults` user data provider. The package includes 2 subpackages, a '*-client' package which includes just the binary, and a '*-provider' package which symlinks the binary to the .d directory in which `early-boot-config` will look for providers. The default prefix in the '*-provider' packages is '10-' to place it first in the order. --- .../Cargo.toml | 21 ++++++++ .../early-boot-config-local-defaults.spec | 54 +++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 packages/early-boot-config-local-defaults/Cargo.toml create mode 100644 packages/early-boot-config-local-defaults/early-boot-config-local-defaults.spec diff --git a/packages/early-boot-config-local-defaults/Cargo.toml b/packages/early-boot-config-local-defaults/Cargo.toml new file mode 100644 index 00000000000..3e3bc2c2109 --- /dev/null +++ b/packages/early-boot-config-local-defaults/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "early-boot-config-local-defaults" +version = "0.1.0" +edition = "2021" +publish = false +build = "../build.rs" + +[lib] +path = "../packages.rs" + +[package.metadata.build-package] +source-groups = [ + "api/early-boot-config", +] + +# RPM BuildRequires +[build-dependencies] +glibc = { path = "../glibc" } + +# RPM Requires +[dependencies] diff --git a/packages/early-boot-config-local-defaults/early-boot-config-local-defaults.spec b/packages/early-boot-config-local-defaults/early-boot-config-local-defaults.spec new file mode 100644 index 00000000000..88bec9ac145 --- /dev/null +++ b/packages/early-boot-config-local-defaults/early-boot-config-local-defaults.spec @@ -0,0 +1,54 @@ +%global _cross_first_party 1 +%undefine _debugsource_packages + +%global user_data_provider local-defaults + +Name: %{_cross_os}early-boot-config-%{user_data_provider} +Version: 0.0 +Release: 0%{?dist} +Summary: %{user_data_provider}-provider +License: Apache-2.0 OR MIT +URL: https://github.com/bottlerocket-os/bottlerocket + +BuildRequires: %{_cross_os}glibc-devel + +%description +%{summary}. + +# Includes just the user data provider binary +%package -n %{_cross_os}local-defaults-user-data-client +Summary: Local defaults user data client +%description -n %{_cross_os}local-defaults-user-data-client +%{summary}. + +# Symlinks the binary to the appropriate .d directory as 10- +%package -n %{_cross_os}local-defaults-user-data-provider +Summary: Local defaults user data provider config +%description -n %{_cross_os}local-defaults-user-data-provider +%{summary}. + +%prep +%setup -T -c +%cargo_prep + +%build +%cargo_build --manifest-path %{_builddir}/sources/Cargo.toml \ + -p early-boot-config --bin %{user_data_provider}-provider + +%install +install -d %{buildroot}%{_cross_libexecdir}/early-boot-config/bin +install -p -m 0755 \ + ${HOME}/.cache/%{__cargo_target}/release/%{user_data_provider}-provider \ + %{buildroot}%{_cross_libexecdir}/early-boot-config/bin + +install -d %{buildroot}%{_cross_datadir}/early-boot-config/data-providers.d +ln -sf \ + ../../../libexec/early-boot-config/bin/%{user_data_provider}-provider \ + %{buildroot}%{_cross_datadir}/early-boot-config/data-providers.d/10-%{user_data_provider} + + +%files -n %{_cross_os}local-defaults-user-data-client +%{_cross_libexecdir}/early-boot-config/bin/%{user_data_provider}-provider + +%files -n %{_cross_os}local-defaults-user-data-provider +%{_cross_datadir}/early-boot-config/data-providers.d/10-%{user_data_provider} From 26bad4e95b85c2c672ab92e6ee63c9bfeb5f54d5 Mon Sep 17 00:00:00 2001 From: Zac Mrowicki Date: Mon, 20 Nov 2023 21:56:27 +0000 Subject: [PATCH 07/41] early-boot-config: Add local user data provider Adds a standalone user data provider binary specifically for gathering data from the file `/var/lib/bottlerocket/user-data.toml`. The binary is meant to be run by the main `early-boot-config` executable. It logs to stderr, as it returns a `SettingsJson` object on stdout in the case of success. It returns an error and non-zero exit code in the case of failure. --- sources/api/early-boot-config/Cargo.toml | 4 ++++ .../bin/user-data-providers/local_user_data.rs | 8 ++++++++ sources/api/early-boot-config/src/provider.rs | 2 ++ .../src/provider/local_user_data.rs | 15 +++++++++++++++ 4 files changed, 29 insertions(+) create mode 100644 sources/api/early-boot-config/src/bin/user-data-providers/local_user_data.rs create mode 100644 sources/api/early-boot-config/src/provider/local_user_data.rs diff --git a/sources/api/early-boot-config/Cargo.toml b/sources/api/early-boot-config/Cargo.toml index cdd5ed1bf76..1b0fa432704 100644 --- a/sources/api/early-boot-config/Cargo.toml +++ b/sources/api/early-boot-config/Cargo.toml @@ -13,6 +13,10 @@ exclude = ["README.md"] name = "local-defaults-provider" path = "src/bin/user-data-providers/local_defaults.rs" +[[bin]] +name = "local-user-data-provider" +path = "src/bin/user-data-providers/local_user_data.rs" + [dependencies] apiclient = { path = "../apiclient", version = "0.1" } async-trait = "0.1" diff --git a/sources/api/early-boot-config/src/bin/user-data-providers/local_user_data.rs b/sources/api/early-boot-config/src/bin/user-data-providers/local_user_data.rs new file mode 100644 index 00000000000..09de0462d69 --- /dev/null +++ b/sources/api/early-boot-config/src/bin/user-data-providers/local_user_data.rs @@ -0,0 +1,8 @@ +use early_boot_config::provider::{run_userdata_provider, setup_provider_logging, LocalUserData}; +use std::process::ExitCode; + +#[tokio::main] +async fn main() -> ExitCode { + setup_provider_logging(); + run_userdata_provider(&LocalUserData).await +} diff --git a/sources/api/early-boot-config/src/provider.rs b/sources/api/early-boot-config/src/provider.rs index a80fdfc5d6c..243f75de88d 100644 --- a/sources/api/early-boot-config/src/provider.rs +++ b/sources/api/early-boot-config/src/provider.rs @@ -1,6 +1,7 @@ //! The provider module owns the `PlatformDataProvider` trait mod local_defaults; mod local_file; +mod local_user_data; use crate::compression::expand_file_maybe; use crate::settings::SettingsJson; @@ -8,6 +9,7 @@ use crate::LOG_LEVEL_ENV_VAR; use async_trait::async_trait; use env_logger::{Env, Target, WriteStyle}; pub use local_defaults::LocalDefaults; +pub use local_user_data::LocalUserData; use snafu::ResultExt; use std::path::Path; use std::process::ExitCode; diff --git a/sources/api/early-boot-config/src/provider/local_user_data.rs b/sources/api/early-boot-config/src/provider/local_user_data.rs new file mode 100644 index 00000000000..02c73e311f3 --- /dev/null +++ b/sources/api/early-boot-config/src/provider/local_user_data.rs @@ -0,0 +1,15 @@ +/// Local user data file +use super::{user_data_from_file, UserDataProvider}; +use crate::settings::SettingsJson; +use async_trait::async_trait; + +const LOCAL_USER_DATA: &str = "/var/lib/bottlerocket/user-data.toml"; + +pub struct LocalUserData; + +#[async_trait] +impl UserDataProvider for LocalUserData { + async fn user_data(&self) -> Result, Box> { + user_data_from_file(LOCAL_USER_DATA) + } +} From 3bfa34ff245f48293c9d8917a86d228e8a42f1b7 Mon Sep 17 00:00:00 2001 From: Zac Mrowicki Date: Mon, 20 Nov 2023 22:02:56 +0000 Subject: [PATCH 08/41] packages: Add 'early-boot-config-local' package Adds a new package for the `local-user-data` provider. The package includes 2 subpackages, a '*-client' package which includes just the binary, and a '*-provider' package which symlinks the binary to the .d directory in which `early-boot-config` will look for providers. The default prefix in the '*-provider' package is '20-' to place it second in order. --- packages/early-boot-config-local/Cargo.toml | 21 ++++++++ .../early-boot-config-local.spec | 54 +++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 packages/early-boot-config-local/Cargo.toml create mode 100644 packages/early-boot-config-local/early-boot-config-local.spec diff --git a/packages/early-boot-config-local/Cargo.toml b/packages/early-boot-config-local/Cargo.toml new file mode 100644 index 00000000000..26e22c5497d --- /dev/null +++ b/packages/early-boot-config-local/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "early-boot-config-local" +version = "0.1.0" +edition = "2021" +publish = false +build = "../build.rs" + +[lib] +path = "../packages.rs" + +[package.metadata.build-package] +source-groups = [ + "api/early-boot-config", +] + +# RPM BuildRequires +[build-dependencies] +glibc = { path = "../glibc" } + +# RPM Requires +[dependencies] diff --git a/packages/early-boot-config-local/early-boot-config-local.spec b/packages/early-boot-config-local/early-boot-config-local.spec new file mode 100644 index 00000000000..192017d58e0 --- /dev/null +++ b/packages/early-boot-config-local/early-boot-config-local.spec @@ -0,0 +1,54 @@ +%global _cross_first_party 1 +%undefine _debugsource_packages + +%global user_data_provider local + +Name: %{_cross_os}early-boot-config-%{user_data_provider} +Version: 0.0 +Release: 0%{?dist} +Summary: %{user_data_provider}-provider +License: Apache-2.0 OR MIT +URL: https://github.com/bottlerocket-os/bottlerocket + +BuildRequires: %{_cross_os}glibc-devel + +%description +%{summary}. + +# Includes just the user data provider binary +%package -n %{_cross_os}local-user-data-client +Summary: Local user data client +%description -n %{_cross_os}local-user-data-client +%{summary}. + +# Symlinks the binary to the appropriate .d directory as 20- +%package -n %{_cross_os}local-user-data-provider +Summary: Local user data provider config +%description -n %{_cross_os}local-user-data-provider +%{summary}. + +%prep +%setup -T -c +%cargo_prep + +%build +%cargo_build --manifest-path %{_builddir}/sources/Cargo.toml \ + -p early-boot-config --bin %{user_data_provider}-user-data-provider + +%install +install -d %{buildroot}%{_cross_libexecdir}/early-boot-config/bin +install -p -m 0755 \ + ${HOME}/.cache/%{__cargo_target}/release/%{user_data_provider}-user-data-provider \ + %{buildroot}%{_cross_libexecdir}/early-boot-config/bin + +install -d %{buildroot}%{_cross_datadir}/early-boot-config/data-providers.d +ln -sf \ + ../../../libexec/early-boot-config/bin/%{user_data_provider}-user-data-provider \ + %{buildroot}%{_cross_datadir}/early-boot-config/data-providers.d/20-%{user_data_provider} + + +%files -n %{_cross_os}local-user-data-client +%{_cross_libexecdir}/early-boot-config/bin/%{user_data_provider}-user-data-provider + +%files -n %{_cross_os}local-user-data-provider +%{_cross_datadir}/early-boot-config/data-providers.d/20-%{user_data_provider} From 3e86c8b4453136c41017069cd0a72f6fd3112dca Mon Sep 17 00:00:00 2001 From: Zac Mrowicki Date: Mon, 20 Nov 2023 23:34:59 +0000 Subject: [PATCH 09/41] early-boot-config: Add EC2 identity doc data provider Adds a standalone data provider binary specifically for gathering data from the EC2 identity document. The binary is meant to be run by the main `early-boot-config` executable. It logs to stderr, as it returns a `SettingsJson` object on stdout in the case of success. It returns an error and non-zero exit code in the case of failure. --- sources/api/early-boot-config/Cargo.toml | 4 + .../user-data-providers/ec2_identity_doc.rs | 8 ++ sources/api/early-boot-config/src/provider.rs | 2 + .../src/provider/ec2_identity_doc.rs | 108 ++++++++++++++++++ 4 files changed, 122 insertions(+) create mode 100644 sources/api/early-boot-config/src/bin/user-data-providers/ec2_identity_doc.rs create mode 100644 sources/api/early-boot-config/src/provider/ec2_identity_doc.rs diff --git a/sources/api/early-boot-config/Cargo.toml b/sources/api/early-boot-config/Cargo.toml index 1b0fa432704..0339a685442 100644 --- a/sources/api/early-boot-config/Cargo.toml +++ b/sources/api/early-boot-config/Cargo.toml @@ -17,6 +17,10 @@ path = "src/bin/user-data-providers/local_defaults.rs" name = "local-user-data-provider" path = "src/bin/user-data-providers/local_user_data.rs" +[[bin]] +name = "ec2-identity-doc-provider" +path = "src/bin/user-data-providers/ec2_identity_doc.rs" + [dependencies] apiclient = { path = "../apiclient", version = "0.1" } async-trait = "0.1" diff --git a/sources/api/early-boot-config/src/bin/user-data-providers/ec2_identity_doc.rs b/sources/api/early-boot-config/src/bin/user-data-providers/ec2_identity_doc.rs new file mode 100644 index 00000000000..f540c66c05c --- /dev/null +++ b/sources/api/early-boot-config/src/bin/user-data-providers/ec2_identity_doc.rs @@ -0,0 +1,8 @@ +use early_boot_config::provider::{run_userdata_provider, setup_provider_logging, Ec2IdentityDoc}; +use std::process::ExitCode; + +#[tokio::main] +async fn main() -> ExitCode { + setup_provider_logging(); + run_userdata_provider(&Ec2IdentityDoc).await +} diff --git a/sources/api/early-boot-config/src/provider.rs b/sources/api/early-boot-config/src/provider.rs index 243f75de88d..ff8764c0ffa 100644 --- a/sources/api/early-boot-config/src/provider.rs +++ b/sources/api/early-boot-config/src/provider.rs @@ -1,4 +1,5 @@ //! The provider module owns the `PlatformDataProvider` trait +mod ec2_identity_doc; mod local_defaults; mod local_file; mod local_user_data; @@ -7,6 +8,7 @@ use crate::compression::expand_file_maybe; use crate::settings::SettingsJson; use crate::LOG_LEVEL_ENV_VAR; use async_trait::async_trait; +pub use ec2_identity_doc::Ec2IdentityDoc; use env_logger::{Env, Target, WriteStyle}; pub use local_defaults::LocalDefaults; pub use local_user_data::LocalUserData; diff --git a/sources/api/early-boot-config/src/provider/ec2_identity_doc.rs b/sources/api/early-boot-config/src/provider/ec2_identity_doc.rs new file mode 100644 index 00000000000..39b00eb2233 --- /dev/null +++ b/sources/api/early-boot-config/src/provider/ec2_identity_doc.rs @@ -0,0 +1,108 @@ +/// EC2 Identity Document +use super::UserDataProvider; +use crate::settings::SettingsJson; +use async_trait::async_trait; +use imdsclient::ImdsClient; +use serde_json::json; +use snafu::{OptionExt, ResultExt}; +use std::{fs, path::Path}; + +const IDENTITY_DOCUMENT_FILE: &str = "/etc/early-boot-config/identity-document"; +const FALLBACK_REGION: &str = "us-east-1"; + +pub struct Ec2IdentityDoc; + +impl Ec2IdentityDoc { + async fn fetch_region() -> Result { + let region = if Path::new(IDENTITY_DOCUMENT_FILE).exists() { + info!("'{}' exists, using it", IDENTITY_DOCUMENT_FILE); + let data = + fs::read_to_string(IDENTITY_DOCUMENT_FILE).context(error::InputFileReadSnafu { + path: IDENTITY_DOCUMENT_FILE, + })?; + let iid: serde_json::Value = + serde_json::from_str(&data).context(error::DeserializeJsonSnafu)?; + + iid.get("region") + .context(error::IdentityDocMissingDataSnafu { missing: "region" })? + .as_str() + .context(error::WrongTypeSnafu { + field_name: "region", + expected_type: "string", + })? + .to_owned() + } else { + info!("Using IMDS for region"); + let mut client = ImdsClient::new(); + + client + .fetch_region() + .await + .context(error::ImdsRequestSnafu)? + .unwrap_or_else(|| FALLBACK_REGION.to_owned()) + }; + + Ok(region) + } +} + +#[async_trait] +impl UserDataProvider for Ec2IdentityDoc { + async fn user_data( + &self, + ) -> std::result::Result, Box> { + let region = Self::fetch_region().await?; + + trace!( + "Retrieved region from instance identity document: {}", + region + ); + let val = json!({ "aws": {"region": region} }); + let json = SettingsJson::from_val(&val, "EC2 instance identity document").context( + error::SettingsToJSONSnafu { + from: "instance identity document", + }, + )?; + + Ok(Some(json)) + } +} + +mod error { + use snafu::Snafu; + use std::io; + use std::path::PathBuf; + + #[derive(Debug, Snafu)] + #[snafu(visibility(pub(super)))] + pub(crate) enum Error { + #[snafu(display("Error deserializing from JSON: {}", source))] + DeserializeJson { source: serde_json::error::Error }, + + #[snafu(display("Instance identity document missing {}", missing))] + IdentityDocMissingData { missing: String }, + + #[snafu(display("Unable to read input file '{}': {}", path.display(), source))] + InputFileRead { path: PathBuf, source: io::Error }, + + #[snafu(display("IMDS request failed: {}", source))] + ImdsRequest { source: imdsclient::Error }, + + #[snafu(display("Unable to serialize settings from {}: {}", from, source))] + SettingsToJSON { + from: String, + source: crate::settings::Error, + }, + + #[snafu(display( + "Wrong type while deserializing, expected '{}' to be type '{}'", + field_name, + expected_type + ))] + WrongType { + field_name: &'static str, + expected_type: &'static str, + }, + } +} +type Result = std::result::Result; From 19d3b4f94d3a089dc45bb679bc345e3283e80c66 Mon Sep 17 00:00:00 2001 From: Zac Mrowicki Date: Tue, 21 Nov 2023 18:13:52 +0000 Subject: [PATCH 10/41] packages: Add 'early-boot-config-ec2-identity-doc' package Adds a new package for the 'ec2-identity-doc' data provider. The package includes 2 subpackages, a '*-client' package which includes just the binary, and a '*-provider' package which symlinks the binary to the .d directory in which `early-boot-config` will look for providers. The default prefix in the '*-provider' package is '30-' to place it third in order. --- .../Cargo.toml | 21 ++++++++ .../early-boot-config-ec2-identity-doc.spec | 54 +++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 packages/early-boot-config-ec2-identity-doc/Cargo.toml create mode 100644 packages/early-boot-config-ec2-identity-doc/early-boot-config-ec2-identity-doc.spec diff --git a/packages/early-boot-config-ec2-identity-doc/Cargo.toml b/packages/early-boot-config-ec2-identity-doc/Cargo.toml new file mode 100644 index 00000000000..495af1f3fe3 --- /dev/null +++ b/packages/early-boot-config-ec2-identity-doc/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "early-boot-config-ec2-identity-doc" +version = "0.1.0" +edition = "2021" +publish = false +build = "../build.rs" + +[lib] +path = "../packages.rs" + +[package.metadata.build-package] +source-groups = [ + "api/early-boot-config", +] + +# RPM BuildRequires +[build-dependencies] +glibc = { path = "../glibc" } + +# RPM Requires +[dependencies] diff --git a/packages/early-boot-config-ec2-identity-doc/early-boot-config-ec2-identity-doc.spec b/packages/early-boot-config-ec2-identity-doc/early-boot-config-ec2-identity-doc.spec new file mode 100644 index 00000000000..089c8999785 --- /dev/null +++ b/packages/early-boot-config-ec2-identity-doc/early-boot-config-ec2-identity-doc.spec @@ -0,0 +1,54 @@ +%global _cross_first_party 1 +%undefine _debugsource_packages + +%global user_data_provider ec2-identity-doc + +Name: %{_cross_os}early-boot-config-%{user_data_provider} +Version: 0.0 +Release: 0%{?dist} +Summary: %{user_data_provider}-provider +License: Apache-2.0 OR MIT +URL: https://github.com/bottlerocket-os/bottlerocket + +BuildRequires: %{_cross_os}glibc-devel + +%description +%{summary}. + +# Includes just the user data provider binary +%package -n %{_cross_os}ec2-identity-doc-user-data-client +Summary: EC2 identity doc user data client +%description -n %{_cross_os}ec2-identity-doc-user-data-client +%{summary}. + +# Symlinks the binary to the appropriate .d directory as 30- +%package -n %{_cross_os}ec2-identity-doc-user-data-provider +Summary: EC2 identity doc user data provider config +%description -n %{_cross_os}ec2-identity-doc-user-data-provider +%{summary}. + +%prep +%setup -T -c +%cargo_prep + +%build +%cargo_build --manifest-path %{_builddir}/sources/Cargo.toml \ + -p early-boot-config --bin %{user_data_provider}-provider + +%install +install -d %{buildroot}%{_cross_libexecdir}/early-boot-config/bin +install -p -m 0755 \ + ${HOME}/.cache/%{__cargo_target}/release/%{user_data_provider}-provider \ + %{buildroot}%{_cross_libexecdir}/early-boot-config/bin + +install -d %{buildroot}%{_cross_datadir}/early-boot-config/data-providers.d +ln -sf \ + ../../../libexec/early-boot-config/bin/%{user_data_provider}-provider \ + %{buildroot}%{_cross_datadir}/early-boot-config/data-providers.d/30-%{user_data_provider} + + +%files -n %{_cross_os}ec2-identity-doc-user-data-client +%{_cross_libexecdir}/early-boot-config/bin/%{user_data_provider}-provider + +%files -n %{_cross_os}ec2-identity-doc-user-data-provider +%{_cross_datadir}/early-boot-config/data-providers.d/30-%{user_data_provider} From 8676aadcb113d2b377b4670908daafa9cc6c4dbc Mon Sep 17 00:00:00 2001 From: Zac Mrowicki Date: Tue, 21 Nov 2023 18:50:27 +0000 Subject: [PATCH 11/41] early-boot-config: Add VMware CD-ROM user data provider Adds a standalone user data provider binary specifically to handle VMware's ability to pass userdata via CD-ROM. The binary is meant to be run by the main `early-boot-config` executable. It logs to stderr , as it returns a `SettingsJson` object on stdout in the case of success. It returns an error and non-zero exit code in the case of failure. --- sources/api/early-boot-config/Cargo.toml | 4 + .../bin/user-data-providers/vmware_cd_rom.rs | 8 + sources/api/early-boot-config/src/provider.rs | 2 + .../src/provider/vmware_cd_rom.rs | 239 ++++++++++++++++++ 4 files changed, 253 insertions(+) create mode 100644 sources/api/early-boot-config/src/bin/user-data-providers/vmware_cd_rom.rs create mode 100644 sources/api/early-boot-config/src/provider/vmware_cd_rom.rs diff --git a/sources/api/early-boot-config/Cargo.toml b/sources/api/early-boot-config/Cargo.toml index 0339a685442..d74b4c35d42 100644 --- a/sources/api/early-boot-config/Cargo.toml +++ b/sources/api/early-boot-config/Cargo.toml @@ -21,6 +21,10 @@ path = "src/bin/user-data-providers/local_user_data.rs" name = "ec2-identity-doc-provider" path = "src/bin/user-data-providers/ec2_identity_doc.rs" +[[bin]] +name = "vmware-cd-rom-provider" +path = "src/bin/user-data-providers/vmware_cd_rom.rs" + [dependencies] apiclient = { path = "../apiclient", version = "0.1" } async-trait = "0.1" diff --git a/sources/api/early-boot-config/src/bin/user-data-providers/vmware_cd_rom.rs b/sources/api/early-boot-config/src/bin/user-data-providers/vmware_cd_rom.rs new file mode 100644 index 00000000000..ec13ff130e6 --- /dev/null +++ b/sources/api/early-boot-config/src/bin/user-data-providers/vmware_cd_rom.rs @@ -0,0 +1,8 @@ +use early_boot_config::provider::{run_userdata_provider, setup_provider_logging, VmwareCdRom}; +use std::process::ExitCode; + +#[tokio::main] +async fn main() -> ExitCode { + setup_provider_logging(); + run_userdata_provider(&VmwareCdRom).await +} diff --git a/sources/api/early-boot-config/src/provider.rs b/sources/api/early-boot-config/src/provider.rs index ff8764c0ffa..7fa605fde74 100644 --- a/sources/api/early-boot-config/src/provider.rs +++ b/sources/api/early-boot-config/src/provider.rs @@ -3,6 +3,7 @@ mod ec2_identity_doc; mod local_defaults; mod local_file; mod local_user_data; +mod vmware_cd_rom; use crate::compression::expand_file_maybe; use crate::settings::SettingsJson; @@ -15,6 +16,7 @@ pub use local_user_data::LocalUserData; use snafu::ResultExt; use std::path::Path; use std::process::ExitCode; +pub use vmware_cd_rom::VmwareCdRom; #[cfg(variant_platform = "aws")] mod aws; diff --git a/sources/api/early-boot-config/src/provider/vmware_cd_rom.rs b/sources/api/early-boot-config/src/provider/vmware_cd_rom.rs new file mode 100644 index 00000000000..2250cb8756d --- /dev/null +++ b/sources/api/early-boot-config/src/provider/vmware_cd_rom.rs @@ -0,0 +1,239 @@ +/// VMWare CD-ROM +use super::UserDataProvider; +use crate::compression::{expand_file_maybe, expand_slice_maybe, OptionalCompressionReader}; +use crate::settings::SettingsJson; +use async_trait::async_trait; +use serde::Deserialize; +use snafu::{ensure, ResultExt}; +use std::ffi::OsStr; +use std::fs::File; +use std::io::BufReader; +use std::path::{Path, PathBuf}; + +// This program expects that the CD-ROM is already mounted. Mounting happens elsewhere in a +// systemd unit file +const CD_ROM_MOUNT: &str = "/media/cdrom"; +// A mounted CD-ROM may contain an OVF file or a user-supplied file named `user-data` +const USER_DATA_FILENAMES: [&str; 5] = [ + "user-data", + "ovf-env.xml", + "OVF-ENV.XML", + "ovf_env.xml", + "OVF_ENV.XML", +]; + +pub struct VmwareCdRom; + +impl VmwareCdRom { + // Using USER_DATA_FILENAMES, determine if any exist and if so, only 1 exists + fn user_data_path() -> Result> { + let mut user_data_files = USER_DATA_FILENAMES + .iter() + .map(|filename| Path::new(CD_ROM_MOUNT).join(filename)) + .filter(|file| file.exists()); + + let user_data_file = match user_data_files.next() { + Some(file) => file, + None => return Ok(None), + }; + + ensure!( + user_data_files.next().is_none(), + error::UserDataFileCountSnafu { + place: CD_ROM_MOUNT + } + ); + + Ok(Some(user_data_file)) + } + /// Read and base64 decode user data contained in an OVF file + // In VMware, user data is supplied to the host via an XML file. Within + // the XML file, there is a `PropertySection` that contains `Property` elements + // with attributes. User data is base64 encoded inside a `Property` element with + // the attribute "user-data". + // + fn ovf_user_data>(path: P) -> Result { + let path = path.as_ref(); + let file = File::open(path).context(error::InputFileReadSnafu { path })?; + let reader = OptionalCompressionReader::new(BufReader::new(file)); + + // Deserialize the OVF file, dropping everything we don't care about + let ovf: Environment = + serde_xml_rs::from_reader(reader).context(error::XmlDeserializeSnafu { path })?; + + // We have seen the keys in the `Property` section be "namespaced" like "oe:key" or + // "of:key". Since we aren't trying to validate the schema beyond the presence of the + // elements we care about, we can ignore the namespacing. An example of this type of + // namespacing can be found in the unit test sample data. `serde_xml_rs` effectively + // ignores these namespaces and returns "key" / "value": + // https://github.com/Rreverser/serde-xml-rs/issues/64#issuecomment=540448434 + let mut base64_str = String::new(); + let user_data_key = "user-data"; + for property in ovf.property_section.properties { + if property.key == user_data_key { + base64_str = property.value; + break; + } + } + + // Base64 decode the &str + let decoded_bytes = base64::decode(base64_str).context(error::Base64DecodeSnafu { + what: "OVF user data", + })?; + + // Decompress the data if it's compressed + let decoded = expand_slice_maybe(&decoded_bytes).context(error::DecompressionSnafu { + what: "OVF user data", + })?; + + Ok(decoded) + } +} + +#[async_trait] +impl UserDataProvider for VmwareCdRom { + async fn user_data( + &self, + ) -> std::result::Result, Box> { + // Given the list of acceptable filenames, ensure only 1 exists and parse + // it for user data + info!("Attempting to retrieve user data from mounted CD-ROM"); + let user_data_file = match Self::user_data_path()? { + Some(path) => path, + None => return Ok(None), + }; + + // XML files require extra processing, while a user-supplied file should already be in TOML + // format + info!("'{}' exists, using it", user_data_file.display()); + let user_data_str = match user_data_file.extension().and_then(OsStr::to_str) { + Some("xml") | Some("XML") => Self::ovf_user_data(&user_data_file)?, + // Since we only look for a specific list of file names, we should never find a file + // with an extension we don't understand. + Some(_) => unreachable!(), + None => { + // Read the file, decompressing it if compressed. + expand_file_maybe(&user_data_file).context(error::InputFileReadSnafu { + path: &user_data_file, + })? + } + }; + + if user_data_str.is_empty() { + warn!("{} exists but is empty", user_data_file.display()); + return Ok(None); + } + + // User data could be 700MB compressed! Eek! :) + if user_data_str.len() <= 2048 { + trace!("Received user data: {}", user_data_str); + } else { + trace!( + "Received long user data, starts with: {}", + // (this isn't perfect because chars aren't grapheme clusters, but will error + // toward printing the whole input, which is fine) + String::from_iter(user_data_str.chars().take(2048)) + ); + } + + let json = SettingsJson::from_toml_str(&user_data_str, "CD-ROM").context( + error::SettingsToJsonSnafu { + from: user_data_file.display().to_string(), + }, + )?; + + Ok(Some(json)) + } +} + +// =^..^= =^..^= =^..^= =^..^= + +// Minimal expected structure for an OVF file with user data +#[derive(Debug, Deserialize)] +struct Environment { + #[serde(rename = "PropertySection", default)] + pub property_section: PropertySection, +} + +#[derive(Default, Debug, Deserialize)] +struct PropertySection { + #[serde(rename = "Property", default)] + pub properties: Vec, +} + +#[derive(Debug, Deserialize)] +struct Property { + pub key: String, + pub value: String, +} + +// =^..^= =^..^= =^..^= =^..^= + +mod error { + use snafu::Snafu; + use std::io; + use std::path::PathBuf; + + #[derive(Debug, Snafu)] + #[snafu(visibility(pub(super)))] + pub(crate) enum Error { + #[snafu(display("Unable to decode base64 in {}: '{}'", what, source))] + Base64Decode { + what: String, + source: base64::DecodeError, + }, + + #[snafu(display("Failed to decompress {}: {}", what, source))] + Decompression { what: String, source: io::Error }, + + #[snafu(display("Unable to read input file '{}': {}", path.display(), source))] + InputFileRead { path: PathBuf, source: io::Error }, + + #[snafu(display("Unable to deserialize XML from: '{}': {}", path.display(), source))] + XmlDeserialize { + path: PathBuf, + source: serde_xml_rs::Error, + }, + + #[snafu(display("Unable to serialize settings from {}: {}", from, source))] + SettingsToJson { + from: String, + source: crate::settings::Error, + }, + + #[snafu(display("Found multiple user data files in '{}', expected 1", place))] + UserDataFileCount { place: String }, + } +} + +type Result = std::result::Result; + +#[cfg(test)] +mod test { + use super::*; + use std::path::PathBuf; + + fn test_data() -> PathBuf { + PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("test_data") + } + + #[test] + fn test_read_xml_user_data_namespaced_keys() { + let xml = test_data().join("namespaced_keys.xml"); + let expected_user_data = "settings.motd = \"hello\""; + + let actual_user_data = VmwareCdRom::ovf_user_data(xml).unwrap(); + + assert_eq!(actual_user_data, expected_user_data) + } + + #[test] + fn test_read_xml_user_data() { + let xml = test_data().join("ovf-env.xml"); + let expected_user_data = "settings.motd = \"hello\""; + + let actual_user_data = VmwareCdRom::ovf_user_data(xml).unwrap(); + + assert_eq!(actual_user_data, expected_user_data) + } +} From 2448bc6eed51784724cbae542f74e2722bcccc02 Mon Sep 17 00:00:00 2001 From: Zac Mrowicki Date: Tue, 21 Nov 2023 20:42:12 +0000 Subject: [PATCH 12/41] packages: Add 'early-boot-config-vmware-cd-rom' package Adds a new package for the `vmware-cd-rom` provider. The package includes 2 subpackages, a '*-client' package which includes just the binary, and a '*-provider' package which symlinks the binary to the .d directory in which `early-boot-config` will look for providers. The default prefix in the '*-provider' package is '30-' to place it third in order. --- .../Cargo.toml | 21 ++++++++ .../early-boot-config-vmware-cd-rom.spec | 54 +++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 packages/early-boot-config-vmware-cd-rom/Cargo.toml create mode 100644 packages/early-boot-config-vmware-cd-rom/early-boot-config-vmware-cd-rom.spec diff --git a/packages/early-boot-config-vmware-cd-rom/Cargo.toml b/packages/early-boot-config-vmware-cd-rom/Cargo.toml new file mode 100644 index 00000000000..aceb1fde738 --- /dev/null +++ b/packages/early-boot-config-vmware-cd-rom/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "early-boot-config-vmware-cd-rom" +version = "0.1.0" +edition = "2021" +publish = false +build = "../build.rs" + +[lib] +path = "../packages.rs" + +[package.metadata.build-package] +source-groups = [ + "api/early-boot-config", +] + +# RPM BuildRequires +[build-dependencies] +glibc = { path = "../glibc" } + +# RPM Requires +[dependencies] diff --git a/packages/early-boot-config-vmware-cd-rom/early-boot-config-vmware-cd-rom.spec b/packages/early-boot-config-vmware-cd-rom/early-boot-config-vmware-cd-rom.spec new file mode 100644 index 00000000000..19d4f002572 --- /dev/null +++ b/packages/early-boot-config-vmware-cd-rom/early-boot-config-vmware-cd-rom.spec @@ -0,0 +1,54 @@ +%global _cross_first_party 1 +%undefine _debugsource_packages + +%global user_data_provider vmware-cd-rom + +Name: %{_cross_os}early-boot-config-%{user_data_provider} +Version: 0.0 +Release: 0%{?dist} +Summary: %{user_data_provider}-provider +License: Apache-2.0 OR MIT +URL: https://github.com/bottlerocket-os/bottlerocket + +BuildRequires: %{_cross_os}glibc-devel + +%description +%{summary}. + +# Includes just the user data provider binary +%package -n %{_cross_os}vmware-cd-rom-user-data-client +Summary: VMware CD-ROM user data client +%description -n %{_cross_os}vmware-cd-rom-user-data-client +%{summary}. + +# Symlinks the binary to the appropriate .d directory as 30- +%package -n %{_cross_os}vmware-cd-rom-user-data-provider +Summary: VMware CD-ROM user data provider config +%description -n %{_cross_os}vmware-cd-rom-user-data-provider +%{summary}. + +%prep +%setup -T -c +%cargo_prep + +%build +%cargo_build --manifest-path %{_builddir}/sources/Cargo.toml \ + -p early-boot-config --bin %{user_data_provider}-provider + +%install +install -d %{buildroot}%{_cross_libexecdir}/early-boot-config/bin +install -p -m 0755 \ + ${HOME}/.cache/%{__cargo_target}/release/%{user_data_provider}-provider \ + %{buildroot}%{_cross_libexecdir}/early-boot-config/bin + +install -d %{buildroot}%{_cross_datadir}/early-boot-config/data-providers.d +ln -sf \ + ../../../libexec/early-boot-config/bin/%{user_data_provider}-provider \ + %{buildroot}%{_cross_datadir}/early-boot-config/data-providers.d/30-%{user_data_provider} + + +%files -n %{_cross_os}vmware-cd-rom-user-data-client +%{_cross_libexecdir}/early-boot-config/bin/%{user_data_provider}-provider + +%files -n %{_cross_os}vmware-cd-rom-user-data-provider +%{_cross_datadir}/early-boot-config/data-providers.d/30-%{user_data_provider} From bc3926d6d825d9d01dba83eab6437b93ae8b82ed Mon Sep 17 00:00:00 2001 From: Zac Mrowicki Date: Tue, 21 Nov 2023 21:21:58 +0000 Subject: [PATCH 13/41] early-boot-config: Add EC2 IMDS user data provider Adds a standalone user data provider binary specifically for EC2 IMDS. The binary is meant to be run by the main `early-boot-config` executable. It logs to stderr, as it returns a `SettingsJson` object on stdout in the case of success. It returns an error and non-zero exit code in the case of failure. --- sources/api/early-boot-config/Cargo.toml | 4 ++ .../src/bin/user-data-providers/ec2_imds.rs | 8 +++ sources/api/early-boot-config/src/provider.rs | 2 + .../src/provider/ec2_imds.rs | 65 +++++++++++++++++++ 4 files changed, 79 insertions(+) create mode 100644 sources/api/early-boot-config/src/bin/user-data-providers/ec2_imds.rs create mode 100644 sources/api/early-boot-config/src/provider/ec2_imds.rs diff --git a/sources/api/early-boot-config/Cargo.toml b/sources/api/early-boot-config/Cargo.toml index d74b4c35d42..19e5b3f533c 100644 --- a/sources/api/early-boot-config/Cargo.toml +++ b/sources/api/early-boot-config/Cargo.toml @@ -17,6 +17,10 @@ path = "src/bin/user-data-providers/local_defaults.rs" name = "local-user-data-provider" path = "src/bin/user-data-providers/local_user_data.rs" +[[bin]] +name = "ec2-imds-provider" +path = "src/bin/user-data-providers/ec2_imds.rs" + [[bin]] name = "ec2-identity-doc-provider" path = "src/bin/user-data-providers/ec2_identity_doc.rs" diff --git a/sources/api/early-boot-config/src/bin/user-data-providers/ec2_imds.rs b/sources/api/early-boot-config/src/bin/user-data-providers/ec2_imds.rs new file mode 100644 index 00000000000..2fc1c3848c9 --- /dev/null +++ b/sources/api/early-boot-config/src/bin/user-data-providers/ec2_imds.rs @@ -0,0 +1,8 @@ +use early_boot_config::provider::{run_userdata_provider, setup_provider_logging, Ec2Imds}; +use std::process::ExitCode; + +#[tokio::main] +async fn main() -> ExitCode { + setup_provider_logging(); + run_userdata_provider(&Ec2Imds).await +} diff --git a/sources/api/early-boot-config/src/provider.rs b/sources/api/early-boot-config/src/provider.rs index 7fa605fde74..d1691f1bc35 100644 --- a/sources/api/early-boot-config/src/provider.rs +++ b/sources/api/early-boot-config/src/provider.rs @@ -1,5 +1,6 @@ //! The provider module owns the `PlatformDataProvider` trait mod ec2_identity_doc; +mod ec2_imds; mod local_defaults; mod local_file; mod local_user_data; @@ -10,6 +11,7 @@ use crate::settings::SettingsJson; use crate::LOG_LEVEL_ENV_VAR; use async_trait::async_trait; pub use ec2_identity_doc::Ec2IdentityDoc; +pub use ec2_imds::Ec2Imds; use env_logger::{Env, Target, WriteStyle}; pub use local_defaults::LocalDefaults; pub use local_user_data::LocalUserData; diff --git a/sources/api/early-boot-config/src/provider/ec2_imds.rs b/sources/api/early-boot-config/src/provider/ec2_imds.rs new file mode 100644 index 00000000000..0d023b7576f --- /dev/null +++ b/sources/api/early-boot-config/src/provider/ec2_imds.rs @@ -0,0 +1,65 @@ +/// EC2 Instance Metadata Service +use super::UserDataProvider; +use crate::compression::expand_slice_maybe; +use crate::settings::SettingsJson; +use async_trait::async_trait; +use imdsclient::ImdsClient; +use snafu::ResultExt; + +pub struct Ec2Imds; + +#[async_trait] +impl UserDataProvider for Ec2Imds { + async fn user_data( + &self, + ) -> std::result::Result, Box> { + let mut client = ImdsClient::new(); + + info!("Fetching user data from IMDS"); + let user_data_raw = match client + .fetch_userdata() + .await + .context(error::ImdsRequestSnafu)? + { + Some(user_data_raw) => user_data_raw, + None => return Ok(None), + }; + + let user_data_str = expand_slice_maybe(&user_data_raw) + .context(error::DecompressionSnafu { what: "user data" })?; + + if user_data_str.trim().is_empty() { + warn!("No user data found via IMDS"); + return Ok(None); + } + + trace!("Received user data: {}", user_data_str); + let json = SettingsJson::from_toml_str(&user_data_str, "EC2 IMDS").context( + error::SettingsToJSONSnafu { + from: "instance user data", + }, + )?; + Ok(Some(json)) + } +} + +mod error { + use snafu::Snafu; + use std::io; + + #[derive(Debug, Snafu)] + #[snafu(visibility(pub(super)))] + pub(crate) enum Error { + #[snafu(display("Failed to decompress {}: {}", what, source))] + Decompression { what: String, source: io::Error }, + + #[snafu(display("IMDS request failed: {}", source))] + ImdsRequest { source: imdsclient::Error }, + + #[snafu(display("Unable to serialize settings from {}: {}", from, source))] + SettingsToJSON { + from: String, + source: crate::settings::Error, + }, + } +} From e231b9f482ff35e8b85efc538db23dc05473ccdd Mon Sep 17 00:00:00 2001 From: Zac Mrowicki Date: Tue, 21 Nov 2023 21:29:59 +0000 Subject: [PATCH 14/41] packages: Add 'early-boot-config-ec2-imds' package Adds a new package for the `ec2-imds` user data provider. The package includes 2 subpackages, a '*-client' package which includes just the binary, and a '*-provider' package which symlinks the binary to the .d diredtory in which `early-boot-config` will look for providers. The default prefix in the '*-provider' package is '40-' do place it fourth in order. --- .../early-boot-config-ec2-imds/Cargo.toml | 21 ++++++++ .../early-boot-config-ec2-imds.spec | 54 +++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 packages/early-boot-config-ec2-imds/Cargo.toml create mode 100644 packages/early-boot-config-ec2-imds/early-boot-config-ec2-imds.spec diff --git a/packages/early-boot-config-ec2-imds/Cargo.toml b/packages/early-boot-config-ec2-imds/Cargo.toml new file mode 100644 index 00000000000..2909a93df85 --- /dev/null +++ b/packages/early-boot-config-ec2-imds/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "early-boot-config-ec2-imds" +version = "0.1.0" +edition = "2021" +publish = false +build = "../build.rs" + +[lib] +path = "../packages.rs" + +[package.metadata.build-package] +source-groups = [ + "api/early-boot-config", +] + +# RPM BuildRequires +[build-dependencies] +glibc = { path = "../glibc" } + +# RPM Requires +[dependencies] diff --git a/packages/early-boot-config-ec2-imds/early-boot-config-ec2-imds.spec b/packages/early-boot-config-ec2-imds/early-boot-config-ec2-imds.spec new file mode 100644 index 00000000000..db961390d6c --- /dev/null +++ b/packages/early-boot-config-ec2-imds/early-boot-config-ec2-imds.spec @@ -0,0 +1,54 @@ +%global _cross_first_party 1 +%undefine _debugsource_packages + +%global user_data_provider ec2-imds + +Name: %{_cross_os}early-boot-config-%{user_data_provider} +Version: 0.0 +Release: 0%{?dist} +Summary: %{user_data_provider}-provider +License: Apache-2.0 OR MIT +URL: https://github.com/bottlerocket-os/bottlerocket + +BuildRequires: %{_cross_os}glibc-devel + +%description +%{summary}. + +# Includes just the user data provider binary +%package -n %{_cross_os}ec2-imds-user-data-client +Summary: EC2 IMDS user data client +%description -n %{_cross_os}ec2-imds-user-data-client +%{summary}. + +# Symlinks the binary to the appropriate .d directory as 40- +%package -n %{_cross_os}ec2-imds-user-data-provider +Summary: EC2 IMDS user data provider config +%description -n %{_cross_os}ec2-imds-user-data-provider +%{summary}. + +%prep +%setup -T -c +%cargo_prep + +%build +%cargo_build --manifest-path %{_builddir}/sources/Cargo.toml \ + -p early-boot-config --bin %{user_data_provider}-provider + +%install +install -d %{buildroot}%{_cross_libexecdir}/early-boot-config/bin +install -p -m 0755 \ + ${HOME}/.cache/%{__cargo_target}/release/%{user_data_provider}-provider \ + %{buildroot}%{_cross_libexecdir}/early-boot-config/bin + +install -d %{buildroot}%{_cross_datadir}/early-boot-config/data-providers.d +ln -sf \ + ../../../libexec/early-boot-config/bin/%{user_data_provider}-provider \ + %{buildroot}%{_cross_datadir}/early-boot-config/data-providers.d/40-%{user_data_provider} + + +%files -n %{_cross_os}ec2-imds-user-data-client +%{_cross_libexecdir}/early-boot-config/bin/%{user_data_provider}-provider + +%files -n %{_cross_os}ec2-imds-user-data-provider +%{_cross_datadir}/early-boot-config/data-providers.d/40-%{user_data_provider} From 9358ee5e4e27570d6a733196caea25fbb262cb77 Mon Sep 17 00:00:00 2001 From: Zac Mrowicki Date: Tue, 21 Nov 2023 22:08:33 +0000 Subject: [PATCH 15/41] early-boot-config: Add VMware guestinfo user data provider Adds a standalone user data provider binary specifically for VMware's guestinfo interface. The binary is meant to be run by the main `early-boot-config` executable. It logs to stderr, as it returns a `SettingsJson` object on stdout in the case of success. It returns an error and non-zero exit code in the case of failure. --- sources/api/early-boot-config/Cargo.toml | 4 + .../user-data-providers/vmware_guestinfo.rs | 8 + sources/api/early-boot-config/src/provider.rs | 4 + .../src/provider/vmware_guestinfo.rs | 193 ++++++++++++++++++ 4 files changed, 209 insertions(+) create mode 100644 sources/api/early-boot-config/src/bin/user-data-providers/vmware_guestinfo.rs create mode 100644 sources/api/early-boot-config/src/provider/vmware_guestinfo.rs diff --git a/sources/api/early-boot-config/Cargo.toml b/sources/api/early-boot-config/Cargo.toml index 19e5b3f533c..3a8d51f440f 100644 --- a/sources/api/early-boot-config/Cargo.toml +++ b/sources/api/early-boot-config/Cargo.toml @@ -29,6 +29,10 @@ path = "src/bin/user-data-providers/ec2_identity_doc.rs" name = "vmware-cd-rom-provider" path = "src/bin/user-data-providers/vmware_cd_rom.rs" +[[bin]] +name = "vmware-guestinfo-provider" +path = "src/bin/user-data-providers/vmware_guestinfo.rs" + [dependencies] apiclient = { path = "../apiclient", version = "0.1" } async-trait = "0.1" diff --git a/sources/api/early-boot-config/src/bin/user-data-providers/vmware_guestinfo.rs b/sources/api/early-boot-config/src/bin/user-data-providers/vmware_guestinfo.rs new file mode 100644 index 00000000000..e2b1420fc77 --- /dev/null +++ b/sources/api/early-boot-config/src/bin/user-data-providers/vmware_guestinfo.rs @@ -0,0 +1,8 @@ +use early_boot_config::provider::{run_userdata_provider, setup_provider_logging, VmwareGuestinfo}; +use std::process::ExitCode; + +#[tokio::main] +async fn main() -> ExitCode { + setup_provider_logging(); + run_userdata_provider(&VmwareGuestinfo).await +} diff --git a/sources/api/early-boot-config/src/provider.rs b/sources/api/early-boot-config/src/provider.rs index d1691f1bc35..f7a47875238 100644 --- a/sources/api/early-boot-config/src/provider.rs +++ b/sources/api/early-boot-config/src/provider.rs @@ -5,6 +5,8 @@ mod local_defaults; mod local_file; mod local_user_data; mod vmware_cd_rom; +#[cfg(target_arch = "x86_64")] +mod vmware_guestinfo; use crate::compression::expand_file_maybe; use crate::settings::SettingsJson; @@ -19,6 +21,8 @@ use snafu::ResultExt; use std::path::Path; use std::process::ExitCode; pub use vmware_cd_rom::VmwareCdRom; +#[cfg(target_arch = "x86_64")] +pub use vmware_guestinfo::VmwareGuestinfo; #[cfg(variant_platform = "aws")] mod aws; diff --git a/sources/api/early-boot-config/src/provider/vmware_guestinfo.rs b/sources/api/early-boot-config/src/provider/vmware_guestinfo.rs new file mode 100644 index 00000000000..b76f0f93331 --- /dev/null +++ b/sources/api/early-boot-config/src/provider/vmware_guestinfo.rs @@ -0,0 +1,193 @@ +/// VMWare guestinfo +use super::UserDataProvider; +use crate::{compression::OptionalCompressionReader, settings::SettingsJson}; +use async_trait::async_trait; +use serde::Deserialize; +use snafu::{ensure, ResultExt}; +use std::io::{Cursor, Read}; + +// The fields in which user data and its encoding are stored in guestinfo +const GUESTINFO_USERDATA: &str = "guestinfo.userdata"; +const GUESTINFO_USERDATA_ENCODING: &str = "guestinfo.userdata.encoding"; + +pub struct VmwareGuestinfo; + +impl VmwareGuestinfo { + /// Fetch the user data's encoding from guestinfo. + // `guestinfo.userdata.encoding` informs us how to handle the data in the + // `guestinfo.userdata` field + fn fetch_encoding() -> Result { + let maybe_encoding = Self::backdoor_get_bytes(GUESTINFO_USERDATA_ENCODING)?; + let user_data_encoding: UserDataEncoding = match maybe_encoding { + Some(val) => { + let encoding_str = String::from_utf8(val).context(error::InvalidUtf8Snafu { + what: GUESTINFO_USERDATA_ENCODING, + })?; + info!("Found user data encoding: {}", encoding_str); + + serde_plain::from_str(&encoding_str).context(error::UnknownEncodingSnafu { + encoding: encoding_str, + })? + } + + // The cloudinit VMware guestinfo data provider assumes any user data without an + // associated encoding means raw data is being passed. We will follow suit here. + None => { + warn!( + "'{}' unset, assuming raw user data", + GUESTINFO_USERDATA_ENCODING + ); + UserDataEncoding::Raw + } + }; + + Ok(user_data_encoding) + } + + /// Request a key's value from guestinfo + fn backdoor_get_bytes(key: &str) -> Result>> { + // Probe and access the VMware backdoor. `kernel lockdown(7)` may block "privileged" + // mode because of its use of `iopl()`; the 5.15 kernels have it disabled regardless + // of lockdown mode. If this fails, fall back to "unprivileged" access without first + // requesting access to the relevant IO ports. KVM and VMware both have them special- + // cased in their emulation to not raise an exception to the guest OS and things + // should work out. + let mut backdoor = vmw_backdoor::probe_backdoor_privileged() + .or_else(|e| { + debug!( + "Unable to access guestinfo via privileged mode, using unprivileged: {}", + e + ); + vmw_backdoor::probe_backdoor() + }) + .context(error::BackdoorSnafu { + op: "probe and acquire access", + })?; + + let mut erpc = backdoor + .open_enhanced_chan() + .context(error::BackdoorSnafu { + op: "open eRPC channel", + })?; + + erpc.get_guestinfo(key.as_bytes()) + .context(error::GuestInfoSnafu { what: key }) + } +} + +#[async_trait] +impl UserDataProvider for VmwareGuestinfo { + async fn user_data( + &self, + ) -> std::result::Result, Box> { + info!("Attempting to retrieve user data via guestinfo interface"); + + // It would be extremely odd to get here and not be on VMware, but check anyway + ensure!(vmw_backdoor::is_vmware_cpu(), error::NotVmwareSnafu); + + let user_data_encoding = Self::fetch_encoding()?; + let user_data_bytes = match Self::backdoor_get_bytes(GUESTINFO_USERDATA)? { + Some(val) => val, + None => return Ok(None), + }; + + let user_data_string = match user_data_encoding { + // gzip+base64 is gzip'ed user data that is base64 encoded + UserDataEncoding::Base64 | UserDataEncoding::GzipBase64 => { + info!("Decoding user data"); + let mut reader = Cursor::new(user_data_bytes); + let decoder = base64::read::DecoderReader::new(&mut reader, base64::STANDARD); + + // Decompresses the data if it is gzip'ed + let mut output = String::new(); + let mut compression_reader = OptionalCompressionReader::new(decoder); + compression_reader.read_to_string(&mut output).context( + error::DecompressionSnafu { + what: "guestinfo user data", + }, + )?; + output + } + + UserDataEncoding::Raw => { + String::from_utf8(user_data_bytes).context(error::InvalidUtf8Snafu { + what: GUESTINFO_USERDATA, + })? + } + }; + + let json = SettingsJson::from_toml_str(user_data_string, "guestinfo") + .context(error::SettingsToJsonSnafu { from: "guestinfo" })?; + Ok(Some(json)) + } +} + +// =^..^= =^..^= =^..^= =^..^= + +// Acceptable user data encodings +// When case-insensitive de/serialization is finalized, that's what we would want to use +// here instead of aliases: https://github.com/serde-rs/serde/pull/1902 +#[derive(Debug, Deserialize)] +enum UserDataEncoding { + #[serde(alias = "b64")] + #[serde(alias = "B64")] + #[serde(alias = "base64")] + Base64, + #[serde(alias = "gz+b64")] + #[serde(alias = "Gz+B64")] + #[serde(alias = "gzip+base64")] + #[serde(alias = "Gzip+Base64")] + GzipBase64, + Raw, +} + +// =^..^= =^..^= =^..^= =^..^= + +mod error { + use snafu::Snafu; + use std::io; + + #[derive(Debug, Snafu)] + #[snafu(visibility(pub(super)))] + pub(crate) enum Error { + #[snafu(display("VMware backdoor: failed to '{}': '{}'", op, source))] + Backdoor { + op: String, + source: vmw_backdoor::VmwError, + }, + + #[snafu(display("Failed to decompress {}: {}", what, source))] + Decompression { what: String, source: io::Error }, + + #[snafu(display("Failed to fetch key '{}' from guestinfo: {}", what, source))] + GuestInfo { + what: String, + source: vmw_backdoor::VmwError, + }, + + #[snafu(display("'{}' contains invalid utf-8: {}", what, source))] + InvalidUtf8 { + what: String, + source: std::string::FromUtf8Error, + }, + + #[snafu(display( + "Unable to read user data from guestinfo, this is not a VMware virtual CPU" + ))] + NotVmware, + + #[snafu(display("Unable to serialize settings from {}: {}", from, source))] + SettingsToJson { + from: String, + source: crate::settings::Error, + }, + + #[snafu(display("Unknown user data encoding: '{}': {}", encoding, source))] + UnknownEncoding { + encoding: String, + source: serde_plain::Error, + }, + } +} + +type Result = std::result::Result; From c9be43a52713e65b9dff2367216cfbcdb18bd202 Mon Sep 17 00:00:00 2001 From: Zac Mrowicki Date: Wed, 22 Nov 2023 16:45:42 +0000 Subject: [PATCH 16/41] packages: Add 'early-boot-config-vmware-guestinfo' package Adds a new package for the `vmware-guestinfo` user data provider. The package includes 2 subpackages, a '*-client' package which includes just the binary, and a '*-provider' package which symlinks the binary to the .d directory in which `early-boot-config` will look for providers. The default prefix in the '*-provider' is '40-' to place it fourth in order. --- .../Cargo.toml | 21 ++++++++ .../early-boot-config-vmware-guestinfo.spec | 54 +++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 packages/early-boot-config-vmware-guestinfo/Cargo.toml create mode 100644 packages/early-boot-config-vmware-guestinfo/early-boot-config-vmware-guestinfo.spec diff --git a/packages/early-boot-config-vmware-guestinfo/Cargo.toml b/packages/early-boot-config-vmware-guestinfo/Cargo.toml new file mode 100644 index 00000000000..28d9b602b5a --- /dev/null +++ b/packages/early-boot-config-vmware-guestinfo/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "early-boot-config-vmware-guestinfo" +version = "0.1.0" +edition = "2021" +publish = false +build = "../build.rs" + +[lib] +path = "../packages.rs" + +[package.metadata.build-package] +source-groups = [ + "api/early-boot-config", +] + +# RPM BuildRequires +[build-dependencies] +glibc = { path = "../glibc" } + +# RPM Requires +[dependencies] diff --git a/packages/early-boot-config-vmware-guestinfo/early-boot-config-vmware-guestinfo.spec b/packages/early-boot-config-vmware-guestinfo/early-boot-config-vmware-guestinfo.spec new file mode 100644 index 00000000000..8d4a95a324f --- /dev/null +++ b/packages/early-boot-config-vmware-guestinfo/early-boot-config-vmware-guestinfo.spec @@ -0,0 +1,54 @@ +%global _cross_first_party 1 +%undefine _debugsource_packages + +%global user_data_provider vmware-guestinfo + +Name: %{_cross_os}early-boot-confi-%{user_data_provider} +Version: 0.0 +Release: 0%{?dist} +Summary: %{user_data_provider}-provider +License: Apache-2.0 OR MIT +URL: https://github.com/bottlerocket-os/bottlerocket + +BuildRequires: %{_cross_os}glibc-devel + +%description +%{summary}. + +# Includes just the user data provider binary +%package -n %{_cross_os}vmware-guestinfo-user-data-client +Summary: VMWare guestinfo user data client +%description -n %{_cross_os}vmware-guestinfo-user-data-client +%{summary}. + +# Symlinks the binary to the appropriate .d directory as 40- +%package -n %{_cross_os}vmware-guestinfo-user-data-provider +Summary: VMWare guestinfo user data provider config +%description -n %{_cross_os}vmware-guestinfo-user-data-provider +%{summary}. + +%prep +%setup -T -c +%cargo_prep + +%build +%cargo_build --manifest-path %{_builddir}/sources/Cargo.toml \ + -p early-boot-config --bin %{user_data_provider}-provider + +%install +install -d %{buildroot}%{_cross_libexecdir}/early-boot-config/bin +install -p -m 0755 \ + ${HOME}/.cache/%{__cargo_target}/release/%{user_data_provider}-provider \ + %{buildroot}%{_cross_libexecdir}/early-boot-config/bin + +install -d %{buildroot}%{_cross_datadir}/early-boot-config/data-providers.d +ln -sf \ + ../../../libexec/early-boot-config/bin/%{user_data_provider}-provider \ + %{buildroot}%{_cross_datadir}/early-boot-config/data-providers.d/40-%{user_data_provider} + + +%files -n %{_cross_os}vmware-guestinfo-user-data-client +%{_cross_libexecdir}/early-boot-config/bin/%{user_data_provider}-provider + +%files -n %{_cross_os}vmware-guestinfo-user-data-provider +%{_cross_datadir}/early-boot-config/data-providers.d/40-%{user_data_provider} From 56f0b81aecd7bceec81c22c212a11319f839a76a Mon Sep 17 00:00:00 2001 From: Zac Mrowicki Date: Wed, 22 Nov 2023 16:53:59 +0000 Subject: [PATCH 17/41] early-boot-config: Add local overrides user data provider Adds a standalone data provider binary specifically for the local overrides file `/local/user-data-overrides.toml`. The binary is meant to be run by the main `early-boot-config` executable. It logs to stderr, as it returns a `SettingsJson` object on stdout in the case of success. It returns an error and non-zero exit code in the case of failure. --- sources/api/early-boot-config/Cargo.toml | 4 ++++ .../bin/user-data-providers/local_overrides.rs | 8 ++++++++ sources/api/early-boot-config/src/provider.rs | 2 ++ .../src/provider/local_overrides.rs | 17 +++++++++++++++++ 4 files changed, 31 insertions(+) create mode 100644 sources/api/early-boot-config/src/bin/user-data-providers/local_overrides.rs create mode 100644 sources/api/early-boot-config/src/provider/local_overrides.rs diff --git a/sources/api/early-boot-config/Cargo.toml b/sources/api/early-boot-config/Cargo.toml index 3a8d51f440f..79376922c79 100644 --- a/sources/api/early-boot-config/Cargo.toml +++ b/sources/api/early-boot-config/Cargo.toml @@ -13,6 +13,10 @@ exclude = ["README.md"] name = "local-defaults-provider" path = "src/bin/user-data-providers/local_defaults.rs" +[[bin]] +name = "local-overrides-provider" +path = "src/bin/user-data-providers/local_overrides.rs" + [[bin]] name = "local-user-data-provider" path = "src/bin/user-data-providers/local_user_data.rs" diff --git a/sources/api/early-boot-config/src/bin/user-data-providers/local_overrides.rs b/sources/api/early-boot-config/src/bin/user-data-providers/local_overrides.rs new file mode 100644 index 00000000000..ba259b113b2 --- /dev/null +++ b/sources/api/early-boot-config/src/bin/user-data-providers/local_overrides.rs @@ -0,0 +1,8 @@ +use early_boot_config::provider::{run_userdata_provider, setup_provider_logging, LocalOverrides}; +use std::process::ExitCode; + +#[tokio::main] +async fn main() -> ExitCode { + setup_provider_logging(); + run_userdata_provider(&LocalOverrides).await +} diff --git a/sources/api/early-boot-config/src/provider.rs b/sources/api/early-boot-config/src/provider.rs index f7a47875238..65e01015548 100644 --- a/sources/api/early-boot-config/src/provider.rs +++ b/sources/api/early-boot-config/src/provider.rs @@ -3,6 +3,7 @@ mod ec2_identity_doc; mod ec2_imds; mod local_defaults; mod local_file; +mod local_overrides; mod local_user_data; mod vmware_cd_rom; #[cfg(target_arch = "x86_64")] @@ -16,6 +17,7 @@ pub use ec2_identity_doc::Ec2IdentityDoc; pub use ec2_imds::Ec2Imds; use env_logger::{Env, Target, WriteStyle}; pub use local_defaults::LocalDefaults; +pub use local_overrides::LocalOverrides; pub use local_user_data::LocalUserData; use snafu::ResultExt; use std::path::Path; diff --git a/sources/api/early-boot-config/src/provider/local_overrides.rs b/sources/api/early-boot-config/src/provider/local_overrides.rs new file mode 100644 index 00000000000..a11c1db1dd8 --- /dev/null +++ b/sources/api/early-boot-config/src/provider/local_overrides.rs @@ -0,0 +1,17 @@ +/// Site-local overrides +use super::{user_data_from_file, UserDataProvider}; +use crate::settings::SettingsJson; +use async_trait::async_trait; + +const LOCAL_OVERRIDES: &str = "/local/user-data-overrides.toml"; + +pub struct LocalOverrides; + +#[async_trait] +impl UserDataProvider for LocalOverrides { + async fn user_data( + &self, + ) -> std::result::Result, Box> { + user_data_from_file(LOCAL_OVERRIDES) + } +} From 7ce9c7b2a36c27fb11fde4a7e8acd63150df447d Mon Sep 17 00:00:00 2001 From: Zac Mrowicki Date: Wed, 22 Nov 2023 18:30:09 +0000 Subject: [PATCH 18/41] packages: Add 'early-boot-config-local-overrides' package Adds a new package for the `local-overrides` user data provider. The package includes 2 subpackages, a '*-client' package which includes just the binary, and a '*-provider' package which symlinks the binary to the .d directory in which `early-boot-config` will look for providers. The default prefix in the '*-provider' package is '50-' to place it fifth in order. --- .../Cargo.toml | 21 ++++++++ .../early-boot-config-local-overrides.spec | 54 +++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 packages/early-boot-config-local-overrides/Cargo.toml create mode 100644 packages/early-boot-config-local-overrides/early-boot-config-local-overrides.spec diff --git a/packages/early-boot-config-local-overrides/Cargo.toml b/packages/early-boot-config-local-overrides/Cargo.toml new file mode 100644 index 00000000000..7fa9fd13515 --- /dev/null +++ b/packages/early-boot-config-local-overrides/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "early-boot-config-local-overrides" +version = "0.1.0" +edition = "2021" +publish = false +build = "../build.rs" + +[lib] +path = "../packages.rs" + +[package.metadata.build-package] +source-groups = [ + "api/early-boot-config", +] + +# RPM BuildRequires +[build-dependencies] +glibc = { path = "../glibc" } + +# RPM Requires +[dependencies] diff --git a/packages/early-boot-config-local-overrides/early-boot-config-local-overrides.spec b/packages/early-boot-config-local-overrides/early-boot-config-local-overrides.spec new file mode 100644 index 00000000000..47e58bde03b --- /dev/null +++ b/packages/early-boot-config-local-overrides/early-boot-config-local-overrides.spec @@ -0,0 +1,54 @@ +%global _cross_first_party 1 +%undefine _debugsource_packages + +%global user_data_provider local-overrides + +Name: %{_cross_os}early-boot-config-%{user_data_provider} +Version: 0.0 +Release: 0%{?dist} +Summary: %{user_data_provider}-provider +License: Apache-2.0 OR MIT +URL: https://github.com/bottlerocket-os/bottlerocket + +BuildRequires: %{_cross_os}glibc-devel + +%description +%{summary}. + +# Includes just the user data provider binary +%package -n %{_cross_os}local-overrides-user-data-client +Summary: Local overrides user data client +%description -n %{_cross_os}local-overrides-user-data-client +%{summary}. + +# Symlinks the binary to the appropriate .d directory as 50- +%package -n %{_cross_os}local-overrides-user-data-provider +Summary: Local overrides user data provider config +%description -n %{_cross_os}local-overrides-user-data-provider +%{summary}. + +%prep +%setup -T -c +%cargo_prep + +%build +%cargo_build --manifest-path %{_builddir}/sources/Cargo.toml \ + -p early-boot-config --bin %{user_data_provider}-provider + +%install +install -d %{buildroot}%{_cross_libexecdir}/early-boot-config/bin +install -p -m 0755 \ + ${HOME}/.cache/%{__cargo_target}/release/%{user_data_provider}-provider \ + %{buildroot}%{_cross_libexecdir}/early-boot-config/bin + +install -d %{buildroot}%{_cross_datadir}/early-boot-config/data-providers.d +ln -sf \ + ../../../libexec/early-boot-config/bin/%{user_data_provider}-provider \ + %{buildroot}%{_cross_datadir}/early-boot-config/data-providers.d/50-%{user_data_provider} + + +%files -n %{_cross_os}local-overrides-user-data-client +%{_cross_libexecdir}/early-boot-config/bin/%{user_data_provider}-provider + +%files -n %{_cross_os}local-overrides-user-data-provider +%{_cross_datadir}/early-boot-config/data-providers.d/50-%{user_data_provider} From dfa71c4024c8ac34a38c00496baa58d1a17c5376 Mon Sep 17 00:00:00 2001 From: Zac Mrowicki Date: Mon, 27 Nov 2023 22:21:51 +0000 Subject: [PATCH 19/41] packages: Add 'early-boot-config-providers' metapackage Add a metapackage 'user-data-providers' which groups the required user data providers for AWS, VMware, and metal variants. Each variant is represented by a subpackage that a variant definition may pull in. The ordering of providers is handled by the provider package and mirrors the current ordering. --- .../early-boot-config-providers/Cargo.toml | 21 +++++ .../early-boot-config-providers.spec | 92 +++++++++++++++++++ 2 files changed, 113 insertions(+) create mode 100644 packages/early-boot-config-providers/Cargo.toml create mode 100644 packages/early-boot-config-providers/early-boot-config-providers.spec diff --git a/packages/early-boot-config-providers/Cargo.toml b/packages/early-boot-config-providers/Cargo.toml new file mode 100644 index 00000000000..4cd441e3e9a --- /dev/null +++ b/packages/early-boot-config-providers/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "early-boot-config-providers" +version = "0.1.0" +edition = "2021" +publish = false +build = "../build.rs" + +[lib] +path = "../packages.rs" + +[package.metadata.build-package] +source-groups = [ + "api/early-boot-config", +] + +# RPM BuildRequires +[build-dependencies] +glibc = { path = "../glibc" } + +# RPM Requires +[dependencies] diff --git a/packages/early-boot-config-providers/early-boot-config-providers.spec b/packages/early-boot-config-providers/early-boot-config-providers.spec new file mode 100644 index 00000000000..39ba7e28784 --- /dev/null +++ b/packages/early-boot-config-providers/early-boot-config-providers.spec @@ -0,0 +1,92 @@ +%global _cross_first_party 1 +%undefine _debugsource_packages + +Name: %{_cross_os}early-boot-config-providers +Version: 0.0 +Release: 0%{?dist} +Summary: Platform user data providers +License: Apache-2.0 OR MIT +URL: https://github.com/bottlerocket-os/bottlerocket + +Requires: %{_cross_os}local-defaults-user-data-client +Requires: %{_cross_os}local-defaults-user-data-provider +Requires: %{_cross_os}local-user-data-client +Requires: %{_cross_os}local-user-data-provider +Requires: %{_cross_os}local-overrides-user-data-client +Requires: %{_cross_os}local-overrides-user-data-provider +Requires: %{_cross_os}ec2-identity-doc-user-data-client +Requires: %{_cross_os}ec2-identity-doc-user-data-provider +Requires: %{_cross_os}ec2-imds-user-data-client +Requires: %{_cross_os}ec2-imds-user-data-provider +Requires: %{_cross_os}vmware-cd-rom-user-data-client +Requires: %{_cross_os}vmware-cd-rom-user-data-provider +Requires: %{_cross_os}vmware-guestinfo-user-data-client +Requires: %{_cross_os}vmware-guestinfo-user-data-provider + +%description +%{summary}. + +# AWS's user data source ordering is as follows: +# - local defaults file +# - local user data file +# - EC2 instance identity doc +# - EC2 IMDS +# - local overrides file +%package -n %{_cross_os}aws-data-providers +Summary: User data providers for AWS variants +Requires: %{_cross_os}local-defaults-user-data-client +Requires: %{_cross_os}local-defaults-user-data-provider +Requires: %{_cross_os}local-user-data-client +Requires: %{_cross_os}local-user-data-provider +Requires: %{_cross_os}ec2-identity-doc-user-data-client +Requires: %{_cross_os}ec2-identity-doc-user-data-provider +Requires: %{_cross_os}ec2-imds-user-data-client +Requires: %{_cross_os}ec2-imds-user-data-provider +Requires: %{_cross_os}local-overrides-user-data-client +Requires: %{_cross_os}local-overrides-user-data-provider +%description -n %{_cross_os}aws-data-providers +%{summary}. + +# VMware's user data source ordering is as follows: +# - local defaults file +# - local user data file +# - CD-ROM OVF +# - guestinfo interface +# - local overrides file +%package -n %{_cross_os}vmware-data-providers +Summary: User data providers for VMware variants +Requires: %{_cross_os}local-defaults-user-data-client +Requires: %{_cross_os}local-defaults-user-data-provider +Requires: %{_cross_os}local-user-data-client +Requires: %{_cross_os}local-user-data-provider +Requires: %{_cross_os}vmware-cd-rom-user-data-client +Requires: %{_cross_os}vmware-cd-rom-user-data-provider +Requires: %{_cross_os}vmware-guestinfo-user-data-client +Requires: %{_cross_os}vmware-guestinfo-user-data-provider +Requires: %{_cross_os}local-overrides-user-data-client +Requires: %{_cross_os}local-overrides-user-data-provider +%description -n %{_cross_os}vmware-data-providers +%{summary}. + +# Metal user data source ordering is as follows: +# - local defaults file +# - local user data file +# - local overrides file +%package -n %{_cross_os}metal-data-providers +Summary: User data providers for metal variants +Requires: %{_cross_os}local-defaults-user-data-client +Requires: %{_cross_os}local-defaults-user-data-provider +Requires: %{_cross_os}local-user-data-client +Requires: %{_cross_os}local-user-data-provider +Requires: %{_cross_os}local-overrides-user-data-client +Requires: %{_cross_os}local-overrides-user-data-provider +%description -n %{_cross_os}metal-data-providers +%{summary}. + +%prep +%setup -T -c +%build +%install +%files -n %{_cross_os}aws-data-providers +%files -n %{_cross_os}vmware-data-providers +%files -n %{_cross_os}metal-data-providers From 8dd092d64cdec0cb97ab6147818e3c984be56429 Mon Sep 17 00:00:00 2001 From: Zac Mrowicki Date: Fri, 1 Dec 2023 19:17:59 +0000 Subject: [PATCH 20/41] early-boot-config: Add logic to find and execute user provider binaries Adds the logic to find and execute user data provider binaries in the proper order. Provider logs will be forwarded to assist in any troubleshooting necessary. The `SettingsJson` object forms the contract between `early-boot-config` and the provider binaries. Previously this object store user data as a serialized string. Since provider binaries serialize this object to stdout, user data is now stored as a serde_json::Value to avoid "double-serializing" the JSON. --- sources/Cargo.lock | 1 + sources/api/early-boot-config/Cargo.toml | 1 + sources/api/early-boot-config/README.md | 8 +- .../src/bin/early-boot-config.rs | 185 ++++++++++++++---- sources/api/early-boot-config/src/settings.rs | 8 +- 5 files changed, 157 insertions(+), 46 deletions(-) diff --git a/sources/Cargo.lock b/sources/Cargo.lock index 5722e722594..96b0f8917e4 100644 --- a/sources/Cargo.lock +++ b/sources/Cargo.lock @@ -1712,6 +1712,7 @@ dependencies = [ "tokio", "toml", "vmw_backdoor", + "walkdir", ] [[package]] diff --git a/sources/api/early-boot-config/Cargo.toml b/sources/api/early-boot-config/Cargo.toml index 79376922c79..689f55494a0 100644 --- a/sources/api/early-boot-config/Cargo.toml +++ b/sources/api/early-boot-config/Cargo.toml @@ -56,6 +56,7 @@ simplelog = "0.12" snafu = "0.8" tokio = { version = "~1.32", default-features = false, features = ["macros", "rt-multi-thread"] } # LTS toml = "0.8" +walkdir = "2.4" [target.'cfg(target_arch = "x86_64")'.dependencies] # vmw_backdoor includes x86_64 assembly, prevent it from building for ARM diff --git a/sources/api/early-boot-config/README.md b/sources/api/early-boot-config/README.md index ff36da7ce26..0ac0cf67bbd 100644 --- a/sources/api/early-boot-config/README.md +++ b/sources/api/early-boot-config/README.md @@ -4,13 +4,11 @@ Current version: 0.1.0 ## Introduction -early-boot-config sends provider-specific platform data to the Bottlerocket API. +early-boot-config sends user data to the Bottlerocket API. -For most providers this means configuration from user data and platform metadata, taken from -something like an instance metadata service. +Variants include their required user data provider binaries via packages. early-boot-config discovers these binaries at runtime in /usr/share/early-boot-config/data-providers.d and runs them in order, sending any user data found to the API. -Currently, Amazon EC2 is supported through the IMDSv1 HTTP API. Data will be taken from files in -/etc/early-boot-config instead, if available, for testing purposes. +User data provider binaries each implement the ability to obtain user data from a single source. Sources include local files, AWS Instance Metadata Service (IMDS), among others. ## Colophon diff --git a/sources/api/early-boot-config/src/bin/early-boot-config.rs b/sources/api/early-boot-config/src/bin/early-boot-config.rs index 4a9d2b49856..b6981e1ac75 100644 --- a/sources/api/early-boot-config/src/bin/early-boot-config.rs +++ b/sources/api/early-boot-config/src/bin/early-boot-config.rs @@ -1,25 +1,27 @@ /*! # Introduction -early-boot-config sends provider-specific platform data to the Bottlerocket API. +early-boot-config sends user data to the Bottlerocket API. -For most providers this means configuration from user data and platform metadata, taken from -something like an instance metadata service. +Variants include their required user data provider binaries via packages. early-boot-config discovers these binaries at runtime in /usr/share/early-boot-config/data-providers.d and runs them in order, sending any user data found to the API. -Currently, Amazon EC2 is supported through the IMDSv1 HTTP API. Data will be taken from files in -/etc/early-boot-config instead, if available, for testing purposes. +User data provider binaries each implement the ability to obtain user data from a single source. Sources include local files, AWS Instance Metadata Service (IMDS), among others. */ #[macro_use] extern crate log; -use early_boot_config::provider::{Platform, PlatformDataProvider}; +use early_boot_config::settings::SettingsJson; +use early_boot_config::LOG_LEVEL_ENV_VAR; use env_logger::{Target, WriteStyle}; use log::LevelFilter; use snafu::{ensure, ResultExt}; use std::fs; -use std::str::FromStr; +use std::path::{Path, PathBuf}; +use std::str::{self, FromStr}; use std::{env, process}; +use tokio::process::Command as AsyncCommand; +use walkdir::WalkDir; // TODO // Tests! @@ -28,6 +30,8 @@ use std::{env, process}; // ConditionPathExists that will prevent it from running again if this file exists. // We create it after running successfully. const MARKER_FILE: &str = "/var/lib/bottlerocket/early-boot-config.ran"; +/// The directory containing user data provider binaries +const PROVIDERS_DIR: &str = "/usr/share/early-boot-config/data-providers.d"; /// Store the args we receive on the command line #[derive(Debug)] @@ -91,6 +95,85 @@ fn parse_args(args: env::Args) -> Args { } } +/// Gather user data providers to run in order +fn gather_providers() -> Result> { + Ok(WalkDir::new(PROVIDERS_DIR) + .max_depth(1) + .min_depth(1) + .sort_by_file_name() + .into_iter() + .collect::, _>>()? + .into_iter() + .filter(|f| f.path().is_symlink()) + .map(|f| f.into_path()) + .collect()) +} + +/// Run a user data provider binary, forwarding its logs +async fn run_provider

(log_level: &LevelFilter, provider: P) -> Result +where + P: AsRef, +{ + let provider = provider.as_ref(); + let result = AsyncCommand::new(provider) + .env(LOG_LEVEL_ENV_VAR, log_level.as_str()) + .output() + .await + .context(error::CommandFailureSnafu { + provider: &provider, + })?; + + // Regardless of provider status, log its output + let provider_name = provider + .file_name() + .unwrap_or(provider.as_os_str()) + .to_string_lossy(); + let provider_logs = String::from_utf8_lossy(&result.stderr); + for line in provider_logs.lines() { + info!("Provider '{}': {}", provider_name, line); + } + + ensure!( + result.status.success(), + error::ProviderFailureSnafu { + provider: &provider, + } + ); + + Ok(result) +} + +/// Submit user data to the API +async fn submit_user_data(socket_path: S, user_data: serde_json::Value) -> Result<()> +where + S: AsRef, +{ + let socket_path = socket_path.as_ref(); + let uri = &format!( + "{}?tx={}", + constants::API_SETTINGS_URI, + constants::LAUNCH_TRANSACTION + ); + let method = "PATCH"; + trace!("Request body: {}", user_data); + + let (code, response_body) = + apiclient::raw_request(socket_path, uri, method, Some(user_data.to_string())) + .await + .context(error::APIRequestSnafu { method, uri })?; + + ensure!( + code.is_success(), + error::ResponseSnafu { + method, + uri, + code, + response_body, + } + ); + Ok(()) +} + async fn run() -> Result<()> { // Parse and store the args passed to the program let args = parse_args(env::args()); @@ -104,39 +187,34 @@ async fn run() -> Result<()> { info!("early-boot-config started"); - info!("Retrieving platform-specific data"); - let uri = &format!( - "{}?tx={}", - constants::API_SETTINGS_URI, - constants::LAUNCH_TRANSACTION - ); - let method = "PATCH"; - for settings_json in Platform - .platform_data() - .await - .context(error::ProviderSnafu)? - { - // Don't send an empty request to the API - if settings_json.json.is_empty() { - warn!("{} was empty", settings_json.desc); + info!("Gathering user data providers"); + let providers = gather_providers()?; + for provider in providers { + debug!("Found '{}', running it...", provider.display()); + let result = run_provider(&args.log_level, &provider).await?; + + // User data providers output a serialized `SettingsJson` if they are successful in finding + // user data at their respective source. Output will be empty otherwise. + // + // Read into a string first to ensure UTF8 and strip any whitespace/newlines + let output_raw = str::from_utf8(&result.stdout) + .context(error::ProviderOutputSnafu { + provider: &provider, + })? + .trim() + .to_string(); + trace!("Provider '{}' output: {}", &provider.display(), &output_raw); + + if output_raw.is_empty() { + info!("No user data found via {}", &provider.display()); continue; } - info!("Sending {} to API", settings_json.desc); - trace!("Request body: {}", settings_json.json); - let (code, response_body) = - apiclient::raw_request(&args.socket_path, uri, method, Some(settings_json.json)) - .await - .context(error::APIRequestSnafu { method, uri })?; - ensure!( - code.is_success(), - error::ResponseSnafu { - method, - uri, - code, - response_body, - } - ); + let output: SettingsJson = + serde_json::from_str(&output_raw).context(error::ProviderJsonSnafu { provider })?; + + info!("Found user data via {}, sending to API", output.desc); + submit_user_data(&args.socket_path, output.json).await?; } fs::write(MARKER_FILE, "").unwrap_or_else(|e| { @@ -161,8 +239,10 @@ async fn main() { } mod error { + use crate::PROVIDERS_DIR; use http::StatusCode; use snafu::Snafu; + use std::path::PathBuf; #[derive(Debug, Snafu)] #[snafu(visibility(pub(super)))] @@ -175,9 +255,34 @@ mod error { source: Box, }, + #[snafu(display("Failed to start provider '{}': {}", provider.display(), source))] + CommandFailure { + provider: PathBuf, + source: std::io::Error, + }, + #[snafu(display("Provider error: {}", source))] Provider { source: Box }, + #[snafu(display("Provider '{}' failed", provider.display()))] + ProviderFailure { provider: PathBuf }, + + #[snafu(display( + "Error deserializing provider output as JSON from {}: '{}'", + provider.display(), + source, + ))] + ProviderJson { + provider: PathBuf, + source: serde_json::Error, + }, + + #[snafu(display("Invalid (non-utf8) output from provider '{}': {}", provider.display(), source))] + ProviderOutput { + provider: PathBuf, + source: std::str::Utf8Error, + }, + #[snafu(display("Error {} when {}ing '{}': {}", code, method, uri, response_body))] Response { method: String, @@ -188,6 +293,12 @@ mod error { #[snafu(display("Logger setup error: {}", source))] Logger { source: log::SetLoggerError }, + + #[snafu( + display("Unable to walk providers directory '{}': {}", PROVIDERS_DIR, source), + context(false) + )] + WalkDir { source: walkdir::Error }, } } diff --git a/sources/api/early-boot-config/src/settings.rs b/sources/api/early-boot-config/src/settings.rs index 01428f2235e..461e6f9eb8c 100644 --- a/sources/api/early-boot-config/src/settings.rs +++ b/sources/api/early-boot-config/src/settings.rs @@ -1,13 +1,13 @@ //! The settings module owns the `SettingsJson` struct which contains the JSON settings data being //! sent to the API. -use serde::Serialize; +use serde::{Deserialize, Serialize}; use snafu::{OptionExt, ResultExt}; /// SettingsJson represents a change that a provider would like to make in the API. -#[derive(Debug, Serialize)] +#[derive(Debug, Serialize, Deserialize)] pub struct SettingsJson { - pub json: String, + pub json: serde_json::Value, pub desc: String, } @@ -23,7 +23,7 @@ impl SettingsJson { S: Into, { Ok(Self { - json: serde_json::to_string(&data).context(error::SettingsToJSONSnafu)?, + json: serde_json::to_value(data).context(error::SettingsToJSONSnafu)?, desc: desc.into(), }) } From afe76a806d945ba47de0d9beba38eb1b2c017ed5 Mon Sep 17 00:00:00 2001 From: Zac Mrowicki Date: Fri, 1 Dec 2023 20:47:25 +0000 Subject: [PATCH 21/41] early-boot-config: Remove platform-specific conditional compilation Remove platform-specific modules and the conditional compilation used to pull them in. This has been replaced by the previously added user data provider modules and their associated binaries. --- sources/Cargo.lock | 1 - sources/api/early-boot-config/Cargo.toml | 1 - sources/api/early-boot-config/build.rs | 16 - sources/api/early-boot-config/src/provider.rs | 31 +- .../api/early-boot-config/src/provider/aws.rs | 195 -------- .../src/provider/local_file.rs | 64 --- .../early-boot-config/src/provider/metal.rs | 49 -- .../early-boot-config/src/provider/vmware.rs | 443 ------------------ .../src/provider/vmware_cd_rom.rs | 9 +- .../src/provider/vmware_guestinfo.rs | 5 +- 10 files changed, 11 insertions(+), 803 deletions(-) delete mode 100644 sources/api/early-boot-config/src/provider/aws.rs delete mode 100644 sources/api/early-boot-config/src/provider/local_file.rs delete mode 100644 sources/api/early-boot-config/src/provider/metal.rs delete mode 100644 sources/api/early-boot-config/src/provider/vmware.rs diff --git a/sources/Cargo.lock b/sources/Cargo.lock index 96b0f8917e4..b1187d0c26d 100644 --- a/sources/Cargo.lock +++ b/sources/Cargo.lock @@ -1692,7 +1692,6 @@ dependencies = [ "apiclient", "async-trait", "base64", - "bottlerocket-variant", "constants", "env_logger", "flate2", diff --git a/sources/api/early-boot-config/Cargo.toml b/sources/api/early-boot-config/Cargo.toml index 689f55494a0..efd5d59729d 100644 --- a/sources/api/early-boot-config/Cargo.toml +++ b/sources/api/early-boot-config/Cargo.toml @@ -63,7 +63,6 @@ walkdir = "2.4" vmw_backdoor = "0.2" [build-dependencies] -bottlerocket-variant = { version = "0.1", path = "../../bottlerocket-variant" } generate-readme = { version = "0.1", path = "../../generate-readme" } [dev-dependencies] diff --git a/sources/api/early-boot-config/build.rs b/sources/api/early-boot-config/build.rs index 43ad2c8bde5..93ce5521990 100644 --- a/sources/api/early-boot-config/build.rs +++ b/sources/api/early-boot-config/build.rs @@ -1,19 +1,3 @@ -use bottlerocket_variant::{Variant, VARIANT_ENV}; - fn main() { - let variant = match Variant::from_env() { - Ok(variant) => variant, - Err(e) => { - eprintln!( - "For local builds, you must set the '{}' environment variable so we know \ - which data provider to build. Valid values are the directories in \ - models/src/variants/, for example 'aws-ecs-1': {}", - VARIANT_ENV, e, - ); - std::process::exit(1); - } - }; - variant.emit_cfgs(); - generate_readme::from_file("src/bin/early-boot-config.rs").unwrap(); } diff --git a/sources/api/early-boot-config/src/provider.rs b/sources/api/early-boot-config/src/provider.rs index 65e01015548..66774579841 100644 --- a/sources/api/early-boot-config/src/provider.rs +++ b/sources/api/early-boot-config/src/provider.rs @@ -1,8 +1,7 @@ -//! The provider module owns the `PlatformDataProvider` trait +//! The provider module owns the `UserDataProvider` trait mod ec2_identity_doc; mod ec2_imds; mod local_defaults; -mod local_file; mod local_overrides; mod local_user_data; mod vmware_cd_rom; @@ -26,34 +25,6 @@ pub use vmware_cd_rom::VmwareCdRom; #[cfg(target_arch = "x86_64")] pub use vmware_guestinfo::VmwareGuestinfo; -#[cfg(variant_platform = "aws")] -mod aws; -#[cfg(variant_platform = "aws")] -pub use aws::AwsDataProvider as Platform; - -#[cfg(variant_platform = "vmware")] -mod vmware; -#[cfg(variant_platform = "vmware")] -pub use vmware::VmwareDataProvider as Platform; - -#[cfg(variant_platform = "metal")] -mod metal; -#[cfg(variant_platform = "metal")] -pub use metal::MetalDataProvider as Platform; - -/// Support for new platforms can be added by implementing this trait. -#[async_trait] -pub trait PlatformDataProvider { - /// You should return a list of SettingsJson, representing the settings changes you want to - /// send to the API. - /// - /// This is a list so that handling multiple data sources within a platform can feel more - /// natural; you can also send all changes in one entry if you like. - async fn platform_data( - &self, - ) -> std::result::Result, Box>; -} - /// Support for user data providers can be added by implementing this trait, and adding an /// additional binary using the implementor and common functions below. #[async_trait] diff --git a/sources/api/early-boot-config/src/provider/aws.rs b/sources/api/early-boot-config/src/provider/aws.rs deleted file mode 100644 index d77f9fc4653..00000000000 --- a/sources/api/early-boot-config/src/provider/aws.rs +++ /dev/null @@ -1,195 +0,0 @@ -//! The aws module implements the `PlatformDataProvider` trait for gathering userdata on AWS. - -use super::{PlatformDataProvider, SettingsJson}; -use crate::compression::expand_slice_maybe; -use async_trait::async_trait; -use imdsclient::ImdsClient; -use serde_json::json; -use snafu::{OptionExt, ResultExt}; -use std::fs; -use std::path::Path; - -use crate::provider::local_file; - -/// Unit struct for AWS so we can implement the PlatformDataProvider trait. -pub struct AwsDataProvider; - -impl AwsDataProvider { - const IDENTITY_DOCUMENT_FILE: &'static str = "/etc/early-boot-config/identity-document"; - const FALLBACK_REGION: &'static str = "us-east-1"; - - /// Fetches user data, which is expected to be in TOML form and contain a `[settings]` section, - /// returning a SettingsJson representing the inside of that section. - async fn user_data(client: &mut ImdsClient) -> Result> { - let user_data_raw = match client - .fetch_userdata() - .await - .context(error::ImdsRequestSnafu)? - { - Some(user_data_raw) => user_data_raw, - None => return Ok(None), - }; - let user_data_str = expand_slice_maybe(&user_data_raw) - .context(error::DecompressionSnafu { what: "user data" })?; - trace!("Received user data: {}", user_data_str); - - // Return early to prevent parsing an empty string - if user_data_str.trim().is_empty() { - return Ok(None); - } - - let json = SettingsJson::from_toml_str(&user_data_str, "user data").context( - error::SettingsToJSONSnafu { - from: "instance user data", - }, - )?; - Ok(Some(json)) - } - - /// Fetches the instance identity, returning a SettingsJson representing the values from the - /// document which we'd like to send to the API - currently just region. - async fn identity_document(client: &mut ImdsClient) -> Result> { - let desc = "instance identity document"; - let file = Self::IDENTITY_DOCUMENT_FILE; - - let region = if Path::new(file).exists() { - info!("{} found at {}, using it", desc, file); - let data = - fs::read_to_string(file).context(error::InputFileReadSnafu { path: file })?; - let iid: serde_json::Value = - serde_json::from_str(&data).context(error::DeserializeJsonSnafu)?; - iid.get("region") - .context(error::IdentityDocMissingDataSnafu { missing: "region" })? - .as_str() - .context(error::WrongTypeSnafu { - field_name: "region", - expected_type: "string", - })? - .to_owned() - } else { - client - .fetch_region() - .await - .context(error::ImdsRequestSnafu)? - .unwrap_or_else(|| Self::FALLBACK_REGION.to_owned()) - }; - trace!( - "Retrieved region from instance identity document: {}", - region - ); - - let val = json!({ "aws": {"region": region} }); - - let json = SettingsJson::from_val(&val, desc).context(error::SettingsToJSONSnafu { - from: "instance identity document", - })?; - Ok(Some(json)) - } -} - -#[async_trait] -impl PlatformDataProvider for AwsDataProvider { - /// Return settings changes from the instance identity document and user data. - async fn platform_data( - &self, - ) -> std::result::Result, Box> { - let mut output = Vec::new(); - - let mut client = ImdsClient::new(); - - // First read from any site-local defaults. For AWS, these would come from the second EBS - // volume, which may be a custom snapshot with settings and cached container images that - // is used across all variants. Placing it first gives user data from IMDS a chance to - // override any settings that don't make sense for this variant. - match local_file::user_data_defaults()? { - Some(s) => output.push(s), - None => info!( - "No user data found via site defaults file: {}", - local_file::USER_DATA_DEFAULTS_FILE - ), - } - - // Next, read from any user-data specific to this install. For AWS, these would come from - // the first EBS volume containing the OS root filesystem and the private settings - // fileystem. It's less convenient to store settings here since the corresponding snapshot - // changes with every new version, but still possible. - match local_file::user_data()? { - Some(s) => output.push(s), - None => info!( - "No user data found via local file: {}", - local_file::USER_DATA_FILE - ), - } - - // Instance identity doc next, so the user has a chance to override - match Self::identity_document(&mut client).await? { - Some(s) => output.push(s), - None => warn!("No instance identity document found."), - } - - // Optional user-specified configuration / overrides - match Self::user_data(&mut client).await? { - Some(s) => output.push(s), - None => warn!("No user data found."), - } - - // Finally, apply any site-local overrides. For AWS, these again come from the second EBS - // volume. This file is placed last so that it takes precedence over any other source of - // configuration. It's useful for mandatory settings that must always be present. - match local_file::user_data_overrides()? { - Some(s) => output.push(s), - None => info!( - "No user data found via site overrides file: {}", - local_file::USER_DATA_OVERRIDES_FILE - ), - } - - Ok(output) - } -} - -mod error { - use snafu::Snafu; - use std::io; - use std::path::PathBuf; - - #[derive(Debug, Snafu)] - #[snafu(visibility(pub(super)))] - pub(crate) enum Error { - #[snafu(display("Failed to decompress {}: {}", what, source))] - Decompression { what: String, source: io::Error }, - - #[snafu(display("Error deserializing from JSON: {}", source))] - DeserializeJson { source: serde_json::error::Error }, - - #[snafu(display("Instance identity document missing {}", missing))] - IdentityDocMissingData { missing: String }, - - #[snafu(display("IMDS client failed: {}", source))] - ImdsClient { source: imdsclient::Error }, - - #[snafu(display("Unable to read input file '{}': {}", path.display(), source))] - InputFileRead { path: PathBuf, source: io::Error }, - - #[snafu(display("IMDS request failed: {}", source))] - ImdsRequest { source: imdsclient::Error }, - - #[snafu(display("Unable to serialize settings from {}: {}", from, source))] - SettingsToJSON { - from: String, - source: crate::settings::Error, - }, - - #[snafu(display( - "Wrong type while deserializing, expected '{}' to be type '{}'", - field_name, - expected_type - ))] - WrongType { - field_name: &'static str, - expected_type: &'static str, - }, - } -} - -type Result = std::result::Result; diff --git a/sources/api/early-boot-config/src/provider/local_file.rs b/sources/api/early-boot-config/src/provider/local_file.rs deleted file mode 100644 index 3518bcaf9a5..00000000000 --- a/sources/api/early-boot-config/src/provider/local_file.rs +++ /dev/null @@ -1,64 +0,0 @@ -//! The local_file module provides a method for gathering userdata from local file - -use super::SettingsJson; -use crate::compression::expand_file_maybe; -use snafu::ResultExt; -use std::path::Path; - -pub(crate) const USER_DATA_FILE: &str = "/var/lib/bottlerocket/user-data.toml"; -pub(crate) const USER_DATA_DEFAULTS_FILE: &str = "/local/user-data-defaults.toml"; -pub(crate) const USER_DATA_OVERRIDES_FILE: &str = "/local/user-data-overrides.toml"; - -pub(crate) fn user_data() -> std::result::Result, Box> { - read_from_file(USER_DATA_FILE) -} - -pub(crate) fn user_data_defaults( -) -> std::result::Result, Box> { - read_from_file(USER_DATA_DEFAULTS_FILE) -} - -pub(crate) fn user_data_overrides( -) -> std::result::Result, Box> { - read_from_file(USER_DATA_OVERRIDES_FILE) -} - -fn read_from_file( - path: &str, -) -> std::result::Result, Box> { - if !Path::new(path).exists() { - return Ok(None); - } - info!("'{path}' exists, using it"); - - // Read the file, decompressing it if compressed. - let user_data_str = expand_file_maybe(path).context(error::InputFileReadSnafu { path })?; - - if user_data_str.is_empty() { - return Ok(None); - } - - let json = SettingsJson::from_toml_str(&user_data_str, "user data") - .context(error::SettingsToJSONSnafu { from: path })?; - - Ok(Some(json)) -} - -mod error { - use snafu::Snafu; - use std::io; - use std::path::PathBuf; - - #[derive(Debug, Snafu)] - #[snafu(visibility(pub(super)))] - pub(crate) enum Error { - #[snafu(display("Unable to read input file '{}': {}", path.display(), source))] - InputFileRead { path: PathBuf, source: io::Error }, - - #[snafu(display("Unable to serialize settings from {}: {}", from, source))] - SettingsToJSON { - from: String, - source: crate::settings::Error, - }, - } -} diff --git a/sources/api/early-boot-config/src/provider/metal.rs b/sources/api/early-boot-config/src/provider/metal.rs deleted file mode 100644 index 64740ea3979..00000000000 --- a/sources/api/early-boot-config/src/provider/metal.rs +++ /dev/null @@ -1,49 +0,0 @@ -//! The metal module implements the `PlatformDataProvider` trait for gathering userdata on bare -//! metal. - -use super::{PlatformDataProvider, SettingsJson}; -use async_trait::async_trait; - -use crate::provider::local_file; - -pub struct MetalDataProvider; - -#[async_trait] -impl PlatformDataProvider for MetalDataProvider { - async fn platform_data( - &self, - ) -> std::result::Result, Box> { - let mut output = Vec::new(); - - // First read from any site-local defaults. It's unlikely that this file will exist, since - // for bare metal provisioning these settings could just be written to the main user data - // file, but this is consistent with other platforms. - match local_file::user_data_defaults()? { - Some(s) => output.push(s), - None => info!( - "No user data found via site defaults file: {}", - local_file::USER_DATA_DEFAULTS_FILE - ), - } - - // This is the main file where we expect settings, so warn if they're not found. - match local_file::user_data()? { - Some(s) => output.push(s), - None => warn!( - "No user data found via local file: {}", - local_file::USER_DATA_FILE - ), - } - - // Finally, apply any site-local overrides. - match local_file::user_data_overrides()? { - Some(s) => output.push(s), - None => info!( - "No user data found via site overrides file: {}", - local_file::USER_DATA_OVERRIDES_FILE - ), - } - - Ok(output) - } -} diff --git a/sources/api/early-boot-config/src/provider/vmware.rs b/sources/api/early-boot-config/src/provider/vmware.rs deleted file mode 100644 index 02a37a18e10..00000000000 --- a/sources/api/early-boot-config/src/provider/vmware.rs +++ /dev/null @@ -1,443 +0,0 @@ -//! The vmware module implements the `PlatformDataProvider` trait for gathering userdata on VMware -//! via mounted CDRom or the guestinfo interface - -use super::{PlatformDataProvider, SettingsJson}; -use crate::compression::{expand_file_maybe, expand_slice_maybe, OptionalCompressionReader}; -use async_trait::async_trait; -use base64::Engine; -use serde::Deserialize; -use snafu::{ensure, ResultExt}; -use std::ffi::OsStr; -use std::fs::File; -use std::io::BufReader; -use std::io::Cursor; -use std::io::Read; -use std::iter::FromIterator; -use std::path::Path; -use std::str; - -use crate::provider::local_file; - -pub struct VmwareDataProvider; - -impl VmwareDataProvider { - // This program expects that the CD-ROM is already mounted. Mounting happens elsewhere in a - // systemd unit file - const CD_ROM_MOUNT: &'static str = "/media/cdrom"; - // A mounted CD-ROM may contain an OVF file or a user-supplied file named `user-data` - const USER_DATA_FILENAMES: [&'static str; 5] = [ - "user-data", - "ovf-env.xml", - "OVF-ENV.XML", - "ovf_env.xml", - "OVF_ENV.XML", - ]; - - // The fields in which user data and its encoding are stored in guestinfo - const GUESTINFO_USERDATA: &'static str = "guestinfo.userdata"; - const GUESTINFO_USERDATA_ENCODING: &'static str = "guestinfo.userdata.encoding"; - - /// Read and decode user data from files via mounted CD-ROM - fn cdrom_user_data() -> Result> { - // Given the list of acceptable filenames, ensure only 1 exists and parse - // it for user data - info!("Attempting to retrieve user data from mounted CD-ROM"); - let mut user_data_files = Self::USER_DATA_FILENAMES - .iter() - .map(|filename| Path::new(Self::CD_ROM_MOUNT).join(filename)) - .filter(|file| file.exists()); - - let user_data_file = match user_data_files.next() { - Some(file) => file, - None => return Ok(None), - }; - - ensure!( - user_data_files.next().is_none(), - error::UserDataFileCountSnafu { - place: Self::CD_ROM_MOUNT - } - ); - - // XML files require extra processing, while a user-supplied file should already be in TOML - // format - info!("'{}' exists, using it", user_data_file.display()); - let user_data_str = match user_data_file.extension().and_then(OsStr::to_str) { - Some("xml") | Some("XML") => Self::ovf_user_data(&user_data_file)?, - // Since we only look for a specific list of file names, we should never find a file - // with an extension we don't understand. - Some(_) => unreachable!(), - None => { - // Read the file, decompressing it if compressed. - expand_file_maybe(&user_data_file).context(error::InputFileReadSnafu { - path: &user_data_file, - })? - } - }; - - if user_data_str.is_empty() { - return Ok(None); - } - - // User data could be 700MB compressed! Eek! :) - if user_data_str.len() <= 2048 { - trace!("Received user data: {}", user_data_str); - } else { - trace!( - "Received long user data, starts with: {}", - // (this isn't perfect because chars aren't grapheme clusters, but will error - // toward printing the whole input, which is fine) - String::from_iter(user_data_str.chars().take(2048)) - ); - } - - let json = SettingsJson::from_toml_str(&user_data_str, "user data from CD-ROM").context( - error::SettingsToJsonSnafu { - from: user_data_file.display().to_string(), - }, - )?; - - Ok(Some(json)) - } - - /// Read and base64 decode user data contained in an OVF file - // In VMware, user data is supplied to the host via an XML file. Within - // the XML file, there is a `PropertySection` that contains `Property` elements - // with attributes. User data is base64 encoded inside a `Property` element with - // the attribute "user-data". - // - fn ovf_user_data>(path: P) -> Result { - let path = path.as_ref(); - let file = File::open(path).context(error::InputFileReadSnafu { path })?; - let reader = OptionalCompressionReader::new(BufReader::new(file)); - - // Deserialize the OVF file, dropping everything we don't care about - let ovf: Environment = - serde_xml_rs::from_reader(reader).context(error::XmlDeserializeSnafu { path })?; - - // We have seen the keys in the `Property` section be "namespaced" like "oe:key" or - // "of:key". Since we aren't trying to validate the schema beyond the presence of the - // elements we care about, we can ignore the namespacing. An example of this type of - // namespacing can be found in the unit test sample data. `serde_xml_rs` effectively - // ignores these namespaces and returns "key" / "value": - // https://github.com/Rreverser/serde-xml-rs/issues/64#issuecomment=540448434 - let mut base64_str = String::new(); - let user_data_key = "user-data"; - for property in ovf.property_section.properties { - if property.key == user_data_key { - base64_str = property.value; - break; - } - } - - // Base64 decode the &str - let decoded_bytes = base64::engine::general_purpose::STANDARD - .decode(base64_str) - .context(error::Base64DecodeSnafu { - what: "OVF user data", - })?; - - // Decompress the data if it's compressed - let decoded = expand_slice_maybe(&decoded_bytes).context(error::DecompressionSnafu { - what: "OVF user data", - })?; - - Ok(decoded) - } - - /// Read and decode user data based on values retrieved from the guestinfo interface - fn guestinfo_user_data() -> Result> { - info!("Attempting to retrieve user data via guestinfo interface"); - - // It would be extremely odd to get here and not be on VMware, but check anyway - ensure!(vmw_backdoor::is_vmware_cpu(), error::NotVmwareSnafu); - - // `guestinfo.userdata.encoding` informs us how to handle the data in the - // `guestinfo.userdata` field - let maybe_encoding = Self::backdoor_get_bytes(Self::GUESTINFO_USERDATA_ENCODING)?; - let user_data_encoding: UserDataEncoding = match maybe_encoding { - Some(val) => { - let encoding_str = String::from_utf8(val).context(error::InvalidUtf8Snafu { - what: Self::GUESTINFO_USERDATA_ENCODING, - })?; - info!("Found user data encoding: {}", encoding_str); - - serde_plain::from_str(&encoding_str).context(error::UnknownEncodingSnafu { - encoding: encoding_str, - })? - } - - // The cloudinit VMware guestinfo data provider assumes any user data without an - // associated encoding means raw data is being passed. We will follow suit here. - None => { - warn!( - "'{}' unset, assuming raw user data", - Self::GUESTINFO_USERDATA_ENCODING - ); - UserDataEncoding::Raw - } - }; - - let user_data_bytes = match Self::backdoor_get_bytes(Self::GUESTINFO_USERDATA)? { - Some(val) => val, - None => return Ok(None), - }; - - let user_data_string = match user_data_encoding { - // gzip+base64 is gzip'ed user data that is base64 encoded - UserDataEncoding::Base64 | UserDataEncoding::GzipBase64 => { - info!("Decoding user data"); - let mut reader = Cursor::new(user_data_bytes); - let decoder = base64::read::DecoderReader::new( - &mut reader, - &base64::engine::general_purpose::STANDARD, - ); - - // Decompresses the data if it is gzip'ed - let mut output = String::new(); - let mut compression_reader = OptionalCompressionReader::new(decoder); - compression_reader.read_to_string(&mut output).context( - error::DecompressionSnafu { - what: "guestinfo user data", - }, - )?; - output - } - - UserDataEncoding::Raw => { - String::from_utf8(user_data_bytes).context(error::InvalidUtf8Snafu { - what: Self::GUESTINFO_USERDATA, - })? - } - }; - - let json = SettingsJson::from_toml_str(user_data_string, "user data from guestinfo") - .context(error::SettingsToJsonSnafu { from: "guestinfo" })?; - Ok(Some(json)) - } - - /// Request a key's value from guestinfo - fn backdoor_get_bytes(key: &str) -> Result>> { - // Probe and access the VMware backdoor. `kernel lockdown(7)` may block "privileged" - // mode because of its use of `iopl()`; the 5.15 kernels have it disabled regardless - // of lockdown mode. If this fails, fall back to "unprivileged" access without first - // requesting access to the relevant IO ports. KVM and VMware both have them special- - // cased in their emulation to not raise an exception to the guest OS and things - // should work out. - let mut backdoor = vmw_backdoor::probe_backdoor_privileged() - .or_else(|e| { - debug!( - "Unable to access guestinfo via privileged mode, using unprivileged: {}", - e - ); - vmw_backdoor::probe_backdoor() - }) - .context(error::BackdoorSnafu { - op: "probe and acquire access", - })?; - - let mut erpc = backdoor - .open_enhanced_chan() - .context(error::BackdoorSnafu { - op: "open eRPC channel", - })?; - - erpc.get_guestinfo(key.as_bytes()) - .context(error::GuestInfoSnafu { what: key }) - } -} - -#[async_trait] -impl PlatformDataProvider for VmwareDataProvider { - async fn platform_data( - &self, - ) -> std::result::Result, Box> { - let mut output = Vec::new(); - - // First read from any site-local defaults. It's unlikely that this file will exist, but - // this is consistent with other platforms. - match local_file::user_data_defaults()? { - Some(s) => output.push(s), - None => info!( - "No user data found via site defaults file: {}", - local_file::USER_DATA_DEFAULTS_FILE - ), - } - - // Attempt to read from a local file next. This comes from the private settings filesystem - // rather than the data storage filesystem, and is also unlikely to exist. - match local_file::user_data()? { - Some(s) => output.push(s), - None => info!( - "No user data found via local file: {}", - local_file::USER_DATA_FILE - ), - } - - // Then look at the CD-ROM for user data. This isn't the preferred method of supplying user - // data, but might still be used. - match Self::cdrom_user_data()? { - Some(s) => output.push(s), - None => info!("No user data found via CD-ROM"), - } - - // Now, check guestinfo which is the preferred method. If it's populated, it will override - // any earlier settings found. - match Self::guestinfo_user_data()? { - Some(s) => output.push(s), - None => warn!("No user data found via guestinfo"), - } - - // Finally, apply any site-local overrides. It's unlikely to exist but again, this is - // consistent with other platforms. - match local_file::user_data_overrides()? { - Some(s) => output.push(s), - None => info!( - "No user data found via site overrides file: {}", - local_file::USER_DATA_OVERRIDES_FILE - ), - } - - Ok(output) - } -} - -// =^..^= =^..^= =^..^= =^..^= - -// Acceptable user data encodings -// When case-insensitive de/serialization is finalized, that's what we would want to use -// here instead of aliases: https://github.com/serde-rs/serde/pull/1902 -#[derive(Debug, Deserialize)] -enum UserDataEncoding { - #[serde(alias = "b64")] - #[serde(alias = "B64")] - #[serde(alias = "base64")] - Base64, - #[serde(alias = "gz+b64")] - #[serde(alias = "Gz+B64")] - #[serde(alias = "gzip+base64")] - #[serde(alias = "Gzip+Base64")] - GzipBase64, - Raw, -} - -// =^..^= =^..^= =^..^= =^..^= - -// Minimal expected structure for an OVF file with user data -#[derive(Debug, Deserialize)] -struct Environment { - #[serde(rename = "PropertySection", default)] - pub property_section: PropertySection, -} - -#[derive(Default, Debug, Deserialize)] -struct PropertySection { - #[serde(rename = "Property", default)] - pub properties: Vec, -} - -#[derive(Debug, Deserialize)] -struct Property { - pub key: String, - pub value: String, -} - -// =^..^= =^..^= =^..^= =^..^= - -mod error { - use snafu::Snafu; - use std::io; - use std::path::PathBuf; - - #[derive(Debug, Snafu)] - #[snafu(visibility(pub(super)))] - pub(crate) enum Error { - #[snafu(display("VMware backdoor: failed to '{}': '{}'", op, source))] - Backdoor { - op: String, - source: vmw_backdoor::VmwError, - }, - - #[snafu(display("Unable to decode base64 in {}: '{}'", what, source))] - Base64Decode { - what: String, - source: base64::DecodeError, - }, - - #[snafu(display("Failed to decompress {}: {}", what, source))] - Decompression { what: String, source: io::Error }, - - #[snafu(display("Failed to fetch key '{}' from guestinfo: {}", what, source))] - GuestInfo { - what: String, - source: vmw_backdoor::VmwError, - }, - - #[snafu(display("Unable to read input file '{}': {}", path.display(), source))] - InputFileRead { path: PathBuf, source: io::Error }, - - #[snafu(display("'{}' contains invalid utf-8: {}", what, source))] - InvalidUtf8 { - what: String, - source: std::string::FromUtf8Error, - }, - - #[snafu(display( - "Unable to read user data from guestinfo, this is not a VMware virtual CPU" - ))] - NotVmware, - - #[snafu(display("Unable to serialize settings from {}: {}", from, source))] - SettingsToJson { - from: String, - source: crate::settings::Error, - }, - - #[snafu(display("Unknown user data encoding: '{}': {}", encoding, source))] - UnknownEncoding { - encoding: String, - source: serde_plain::Error, - }, - - #[snafu(display("Found multiple user data files in '{}', expected 1", place))] - UserDataFileCount { place: String }, - - #[snafu(display("Unable to deserialize XML from: '{}': {}", path.display(), source))] - XmlDeserialize { - path: PathBuf, - source: serde_xml_rs::Error, - }, - } -} - -type Result = std::result::Result; - -#[cfg(test)] -mod test { - use super::*; - use std::path::PathBuf; - - fn test_data() -> PathBuf { - PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("test_data") - } - - #[test] - fn test_read_xml_user_data_namespaced_keys() { - let xml = test_data().join("namespaced_keys.xml"); - let expected_user_data = "settings.motd = \"hello\""; - - let actual_user_data = VmwareDataProvider::ovf_user_data(xml).unwrap(); - - assert_eq!(actual_user_data, expected_user_data) - } - - #[test] - fn test_read_xml_user_data() { - let xml = test_data().join("ovf-env.xml"); - let expected_user_data = "settings.motd = \"hello\""; - - let actual_user_data = VmwareDataProvider::ovf_user_data(xml).unwrap(); - - assert_eq!(actual_user_data, expected_user_data) - } -} diff --git a/sources/api/early-boot-config/src/provider/vmware_cd_rom.rs b/sources/api/early-boot-config/src/provider/vmware_cd_rom.rs index 2250cb8756d..87e0e14fbb1 100644 --- a/sources/api/early-boot-config/src/provider/vmware_cd_rom.rs +++ b/sources/api/early-boot-config/src/provider/vmware_cd_rom.rs @@ -3,6 +3,7 @@ use super::UserDataProvider; use crate::compression::{expand_file_maybe, expand_slice_maybe, OptionalCompressionReader}; use crate::settings::SettingsJson; use async_trait::async_trait; +use base64::Engine; use serde::Deserialize; use snafu::{ensure, ResultExt}; use std::ffi::OsStr; @@ -77,9 +78,11 @@ impl VmwareCdRom { } // Base64 decode the &str - let decoded_bytes = base64::decode(base64_str).context(error::Base64DecodeSnafu { - what: "OVF user data", - })?; + let decoded_bytes = base64::engine::general_purpose::STANDARD + .decode(base64_str) + .context(error::Base64DecodeSnafu { + what: "OVF user data", + })?; // Decompress the data if it's compressed let decoded = expand_slice_maybe(&decoded_bytes).context(error::DecompressionSnafu { diff --git a/sources/api/early-boot-config/src/provider/vmware_guestinfo.rs b/sources/api/early-boot-config/src/provider/vmware_guestinfo.rs index b76f0f93331..4d94f7cf9cd 100644 --- a/sources/api/early-boot-config/src/provider/vmware_guestinfo.rs +++ b/sources/api/early-boot-config/src/provider/vmware_guestinfo.rs @@ -96,7 +96,10 @@ impl UserDataProvider for VmwareGuestinfo { UserDataEncoding::Base64 | UserDataEncoding::GzipBase64 => { info!("Decoding user data"); let mut reader = Cursor::new(user_data_bytes); - let decoder = base64::read::DecoderReader::new(&mut reader, base64::STANDARD); + let decoder = base64::read::DecoderReader::new( + &mut reader, + &base64::engine::general_purpose::STANDARD, + ); // Decompresses the data if it is gzip'ed let mut output = String::new(); From cf64c40e88e60402047565d86996e600ec83627f Mon Sep 17 00:00:00 2001 From: Zac Mrowicki Date: Fri, 1 Dec 2023 22:23:00 +0000 Subject: [PATCH 22/41] variants: Add user data providers to all variants Add the proper user data providers packages to all variants. --- variants/Cargo.lock | 218 ++++++++++++++++++++++++ variants/aws-dev/Cargo.toml | 7 + variants/aws-ecs-1-nvidia/Cargo.toml | 7 + variants/aws-ecs-1/Cargo.toml | 7 + variants/aws-ecs-2-nvidia/Cargo.toml | 7 + variants/aws-ecs-2/Cargo.toml | 7 + variants/aws-k8s-1.23-nvidia/Cargo.toml | 7 + variants/aws-k8s-1.23/Cargo.toml | 7 + variants/aws-k8s-1.24-nvidia/Cargo.toml | 7 + variants/aws-k8s-1.24/Cargo.toml | 7 + variants/aws-k8s-1.25-nvidia/Cargo.toml | 7 + variants/aws-k8s-1.25/Cargo.toml | 7 + variants/aws-k8s-1.26-nvidia/Cargo.toml | 7 + variants/aws-k8s-1.26/Cargo.toml | 7 + variants/aws-k8s-1.27-nvidia/Cargo.toml | 7 + variants/aws-k8s-1.27/Cargo.toml | 7 + variants/aws-k8s-1.28-nvidia/Cargo.toml | 7 + variants/aws-k8s-1.28/Cargo.toml | 7 + variants/metal-dev/Cargo.toml | 5 + variants/metal-k8s-1.25/Cargo.toml | 5 + variants/metal-k8s-1.26/Cargo.toml | 5 + variants/metal-k8s-1.27/Cargo.toml | 5 + variants/metal-k8s-1.28/Cargo.toml | 5 + variants/metal-k8s-1.29/Cargo.toml | 5 + variants/vmware-dev/Cargo.toml | 7 + variants/vmware-k8s-1.25/Cargo.toml | 7 + variants/vmware-k8s-1.26/Cargo.toml | 7 + variants/vmware-k8s-1.27/Cargo.toml | 7 + variants/vmware-k8s-1.28/Cargo.toml | 7 + variants/vmware-k8s-1.29/Cargo.toml | 7 + 30 files changed, 409 insertions(+) diff --git a/variants/Cargo.lock b/variants/Cargo.lock index 22f50acc589..dde5d93facc 100644 --- a/variants/Cargo.lock +++ b/variants/Cargo.lock @@ -25,6 +25,12 @@ dependencies = [ "docker-engine", "docker-init", "early-boot-config", + "early-boot-config-ec2-identity-doc", + "early-boot-config-ec2-imds", + "early-boot-config-local", + "early-boot-config-local-defaults", + "early-boot-config-local-overrides", + "early-boot-config-providers", "iputils", "kernel-6_1", "login", @@ -40,6 +46,12 @@ dependencies = [ "docker-engine", "docker-init", "early-boot-config", + "early-boot-config-ec2-identity-doc", + "early-boot-config-ec2-imds", + "early-boot-config-local", + "early-boot-config-local-defaults", + "early-boot-config-local-overrides", + "early-boot-config-providers", "ecs-agent", "kernel-5_10", "release", @@ -53,6 +65,12 @@ dependencies = [ "docker-engine", "docker-init", "early-boot-config", + "early-boot-config-ec2-identity-doc", + "early-boot-config-ec2-imds", + "early-boot-config-local", + "early-boot-config-local-defaults", + "early-boot-config-local-overrides", + "early-boot-config-providers", "ecs-agent", "ecs-gpu-init", "kernel-5_10", @@ -69,6 +87,12 @@ dependencies = [ "docker-engine", "docker-init", "early-boot-config", + "early-boot-config-ec2-identity-doc", + "early-boot-config-ec2-imds", + "early-boot-config-local", + "early-boot-config-local-defaults", + "early-boot-config-local-overrides", + "early-boot-config-providers", "ecs-agent", "kernel-6_1", "release", @@ -82,6 +106,12 @@ dependencies = [ "docker-engine", "docker-init", "early-boot-config", + "early-boot-config-ec2-identity-doc", + "early-boot-config-ec2-imds", + "early-boot-config-local", + "early-boot-config-local-defaults", + "early-boot-config-local-overrides", + "early-boot-config-providers", "ecs-agent", "ecs-gpu-init", "kernel-6_1", @@ -105,6 +135,12 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", + "early-boot-config-ec2-identity-doc", + "early-boot-config-ec2-imds", + "early-boot-config-local", + "early-boot-config-local-defaults", + "early-boot-config-local-overrides", + "early-boot-config-providers", "kernel-5_10", "kubernetes-1_23", "release", @@ -118,6 +154,12 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", + "early-boot-config-ec2-identity-doc", + "early-boot-config-ec2-imds", + "early-boot-config-local", + "early-boot-config-local-defaults", + "early-boot-config-local-overrides", + "early-boot-config-providers", "kernel-5_10", "kmod-5_10-nvidia", "kubernetes-1_23", @@ -134,6 +176,12 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", + "early-boot-config-ec2-identity-doc", + "early-boot-config-ec2-imds", + "early-boot-config-local", + "early-boot-config-local-defaults", + "early-boot-config-local-overrides", + "early-boot-config-providers", "kernel-5_15", "kubernetes-1_24", "release", @@ -147,6 +195,12 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", + "early-boot-config-ec2-identity-doc", + "early-boot-config-ec2-imds", + "early-boot-config-local", + "early-boot-config-local-defaults", + "early-boot-config-local-overrides", + "early-boot-config-providers", "kernel-5_15", "kmod-5_15-nvidia", "kubernetes-1_24", @@ -163,6 +217,12 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", + "early-boot-config-ec2-identity-doc", + "early-boot-config-ec2-imds", + "early-boot-config-local", + "early-boot-config-local-defaults", + "early-boot-config-local-overrides", + "early-boot-config-providers", "kernel-5_15", "kubernetes-1_25", "release", @@ -176,6 +236,12 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", + "early-boot-config-ec2-identity-doc", + "early-boot-config-ec2-imds", + "early-boot-config-local", + "early-boot-config-local-defaults", + "early-boot-config-local-overrides", + "early-boot-config-providers", "kernel-5_15", "kmod-5_15-nvidia", "kubernetes-1_25", @@ -192,6 +258,12 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", + "early-boot-config-ec2-identity-doc", + "early-boot-config-ec2-imds", + "early-boot-config-local", + "early-boot-config-local-defaults", + "early-boot-config-local-overrides", + "early-boot-config-providers", "kernel-5_15", "kubernetes-1_26", "release", @@ -205,6 +277,12 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", + "early-boot-config-ec2-identity-doc", + "early-boot-config-ec2-imds", + "early-boot-config-local", + "early-boot-config-local-defaults", + "early-boot-config-local-overrides", + "early-boot-config-providers", "kernel-5_15", "kmod-5_15-nvidia", "kubernetes-1_26", @@ -221,6 +299,12 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", + "early-boot-config-ec2-identity-doc", + "early-boot-config-ec2-imds", + "early-boot-config-local", + "early-boot-config-local-defaults", + "early-boot-config-local-overrides", + "early-boot-config-providers", "kernel-5_15", "kubernetes-1_27", "release", @@ -234,6 +318,12 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", + "early-boot-config-ec2-identity-doc", + "early-boot-config-ec2-imds", + "early-boot-config-local", + "early-boot-config-local-defaults", + "early-boot-config-local-overrides", + "early-boot-config-providers", "kernel-5_15", "kmod-5_15-nvidia", "kubernetes-1_27", @@ -250,6 +340,12 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", + "early-boot-config-ec2-identity-doc", + "early-boot-config-ec2-imds", + "early-boot-config-local", + "early-boot-config-local-defaults", + "early-boot-config-local-overrides", + "early-boot-config-providers", "kernel-6_1", "kubernetes-1_28", "release", @@ -263,6 +359,12 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", + "early-boot-config-ec2-identity-doc", + "early-boot-config-ec2-imds", + "early-boot-config-local", + "early-boot-config-local-defaults", + "early-boot-config-local-overrides", + "early-boot-config-providers", "kernel-6_1", "kmod-6_1-nvidia", "kubernetes-1_28", @@ -460,6 +562,62 @@ dependencies = [ "glibc", ] +[[package]] +name = "early-boot-config-ec2-identity-doc" +version = "0.1.0" +dependencies = [ + "glibc", +] + +[[package]] +name = "early-boot-config-ec2-imds" +version = "0.1.0" +dependencies = [ + "glibc", +] + +[[package]] +name = "early-boot-config-local" +version = "0.1.0" +dependencies = [ + "glibc", +] + +[[package]] +name = "early-boot-config-local-defaults" +version = "0.1.0" +dependencies = [ + "glibc", +] + +[[package]] +name = "early-boot-config-local-overrides" +version = "0.1.0" +dependencies = [ + "glibc", +] + +[[package]] +name = "early-boot-config-providers" +version = "0.1.0" +dependencies = [ + "glibc", +] + +[[package]] +name = "early-boot-config-vmware-cd-rom" +version = "0.1.0" +dependencies = [ + "glibc", +] + +[[package]] +name = "early-boot-config-vmware-guestinfo" +version = "0.1.0" +dependencies = [ + "glibc", +] + [[package]] name = "ecr-credential-provider" version = "0.1.0" @@ -999,6 +1157,10 @@ dependencies = [ "docker-engine", "docker-init", "early-boot-config", + "early-boot-config-local", + "early-boot-config-local-defaults", + "early-boot-config-local-overrides", + "early-boot-config-providers", "iputils", "kernel-6_1", "linux-firmware", @@ -1015,6 +1177,10 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", + "early-boot-config-local", + "early-boot-config-local-defaults", + "early-boot-config-local-overrides", + "early-boot-config-providers", "kernel-5_15", "kubernetes-1_25", "linux-firmware", @@ -1029,6 +1195,10 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", + "early-boot-config-local", + "early-boot-config-local-defaults", + "early-boot-config-local-overrides", + "early-boot-config-providers", "kernel-5_15", "kubernetes-1_26", "linux-firmware", @@ -1043,6 +1213,10 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", + "early-boot-config-local", + "early-boot-config-local-defaults", + "early-boot-config-local-overrides", + "early-boot-config-providers", "kernel-5_15", "kubernetes-1_27", "linux-firmware", @@ -1057,6 +1231,10 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", + "early-boot-config-local", + "early-boot-config-local-defaults", + "early-boot-config-local-overrides", + "early-boot-config-providers", "kernel-6_1", "kubernetes-1_28", "release", @@ -1070,6 +1248,10 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", + "early-boot-config-local", + "early-boot-config-local-defaults", + "early-boot-config-local-overrides", + "early-boot-config-providers", "kernel-6_1", "kubernetes-1_29", "release", @@ -1250,6 +1432,12 @@ dependencies = [ "docker-engine", "docker-init", "early-boot-config", + "early-boot-config-local", + "early-boot-config-local-defaults", + "early-boot-config-local-overrides", + "early-boot-config-providers", + "early-boot-config-vmware-cd-rom", + "early-boot-config-vmware-guestinfo", "iputils", "kernel-6_1", "login", @@ -1265,6 +1453,12 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", + "early-boot-config-local", + "early-boot-config-local-defaults", + "early-boot-config-local-overrides", + "early-boot-config-providers", + "early-boot-config-vmware-cd-rom", + "early-boot-config-vmware-guestinfo", "kernel-5_15", "kubernetes-1_25", "open-vm-tools", @@ -1278,6 +1472,12 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", + "early-boot-config-local", + "early-boot-config-local-defaults", + "early-boot-config-local-overrides", + "early-boot-config-providers", + "early-boot-config-vmware-cd-rom", + "early-boot-config-vmware-guestinfo", "kernel-5_15", "kubernetes-1_26", "open-vm-tools", @@ -1291,6 +1491,12 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", + "early-boot-config-local", + "early-boot-config-local-defaults", + "early-boot-config-local-overrides", + "early-boot-config-providers", + "early-boot-config-vmware-cd-rom", + "early-boot-config-vmware-guestinfo", "kernel-5_15", "kubernetes-1_27", "open-vm-tools", @@ -1304,6 +1510,12 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", + "early-boot-config-local", + "early-boot-config-local-defaults", + "early-boot-config-local-overrides", + "early-boot-config-providers", + "early-boot-config-vmware-cd-rom", + "early-boot-config-vmware-guestinfo", "kernel-6_1", "kubernetes-1_28", "open-vm-tools", @@ -1317,6 +1529,12 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", + "early-boot-config-local", + "early-boot-config-local-defaults", + "early-boot-config-local-overrides", + "early-boot-config-providers", + "early-boot-config-vmware-cd-rom", + "early-boot-config-vmware-guestinfo", "kernel-6_1", "kubernetes-1_29", "open-vm-tools", diff --git a/variants/aws-dev/Cargo.toml b/variants/aws-dev/Cargo.toml index d149c0b3bc1..b8b606ddaeb 100644 --- a/variants/aws-dev/Cargo.toml +++ b/variants/aws-dev/Cargo.toml @@ -29,6 +29,7 @@ included-packages = [ "early-boot-config", "release", "kernel-6.1", + "aws-data-providers", # docker "docker-cli", "docker-engine", @@ -46,6 +47,12 @@ path = "../variants.rs" [build-dependencies] # core early-boot-config = { path = "../../packages/early-boot-config" } +early-boot-config-ec2-identity-doc = { path = "../../packages/early-boot-config-ec2-identity-doc" } +early-boot-config-ec2-imds = { path = "../../packages/early-boot-config-ec2-imds" } +early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } +early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } +early-boot-config-local = { path = "../../packages/early-boot-config-local" } +early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } release = { path = "../../packages/release" } kernel-6_1 = { path = "../../packages/kernel-6.1" } # docker diff --git a/variants/aws-ecs-1-nvidia/Cargo.toml b/variants/aws-ecs-1-nvidia/Cargo.toml index b1506f605a8..5bf6c677065 100644 --- a/variants/aws-ecs-1-nvidia/Cargo.toml +++ b/variants/aws-ecs-1-nvidia/Cargo.toml @@ -21,6 +21,7 @@ included-packages = [ "early-boot-config", "release", "kernel-5.10", + "aws-data-providers", # docker "docker-cli", "docker-engine", @@ -39,6 +40,12 @@ path = "../variants.rs" [build-dependencies] # core early-boot-config = { path = "../../packages/early-boot-config" } +early-boot-config-ec2-identity-doc = { path = "../../packages/early-boot-config-ec2-identity-doc" } +early-boot-config-ec2-imds = { path = "../../packages/early-boot-config-ec2-imds" } +early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } +early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } +early-boot-config-local = { path = "../../packages/early-boot-config-local" } +early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } release = { path = "../../packages/release" } kernel-5_10 = { path = "../../packages/kernel-5.10" } # docker diff --git a/variants/aws-ecs-1/Cargo.toml b/variants/aws-ecs-1/Cargo.toml index 412e37fb182..10f26981e39 100644 --- a/variants/aws-ecs-1/Cargo.toml +++ b/variants/aws-ecs-1/Cargo.toml @@ -18,6 +18,7 @@ included-packages = [ "early-boot-config", "release", "kernel-5.10", + "aws-data-providers", # docker "docker-cli", "docker-engine", @@ -32,6 +33,12 @@ path = "../variants.rs" [build-dependencies] # core early-boot-config = { path = "../../packages/early-boot-config" } +early-boot-config-ec2-identity-doc = { path = "../../packages/early-boot-config-ec2-identity-doc" } +early-boot-config-ec2-imds = { path = "../../packages/early-boot-config-ec2-imds" } +early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } +early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } +early-boot-config-local = { path = "../../packages/early-boot-config-local" } +early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } release = { path = "../../packages/release" } kernel-5_10 = { path = "../../packages/kernel-5.10" } # docker diff --git a/variants/aws-ecs-2-nvidia/Cargo.toml b/variants/aws-ecs-2-nvidia/Cargo.toml index c9b91f3bf8d..b18810aff99 100644 --- a/variants/aws-ecs-2-nvidia/Cargo.toml +++ b/variants/aws-ecs-2-nvidia/Cargo.toml @@ -21,6 +21,7 @@ included-packages = [ "early-boot-config", "release", "kernel-6.1", + "aws-data-providers", # docker "docker-cli", "docker-engine", @@ -47,6 +48,12 @@ path = "../variants.rs" [build-dependencies] # core early-boot-config = { path = "../../packages/early-boot-config" } +early-boot-config-ec2-identity-doc = { path = "../../packages/early-boot-config-ec2-identity-doc" } +early-boot-config-ec2-imds = { path = "../../packages/early-boot-config-ec2-imds" } +early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } +early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } +early-boot-config-local = { path = "../../packages/early-boot-config-local" } +early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } release = { path = "../../packages/release" } kernel-6_1 = { path = "../../packages/kernel-6.1" } # docker diff --git a/variants/aws-ecs-2/Cargo.toml b/variants/aws-ecs-2/Cargo.toml index 8e49d1b37bc..914c54e59a3 100644 --- a/variants/aws-ecs-2/Cargo.toml +++ b/variants/aws-ecs-2/Cargo.toml @@ -20,6 +20,7 @@ included-packages = [ "early-boot-config", "release", "kernel-6.1", + "aws-data-providers", # docker "docker-cli", "docker-engine", @@ -41,6 +42,12 @@ path = "../variants.rs" [build-dependencies] # core early-boot-config = { path = "../../packages/early-boot-config" } +early-boot-config-ec2-identity-doc = { path = "../../packages/early-boot-config-ec2-identity-doc" } +early-boot-config-ec2-imds = { path = "../../packages/early-boot-config-ec2-imds" } +early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } +early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } +early-boot-config-local = { path = "../../packages/early-boot-config-local" } +early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } release = { path = "../../packages/release" } kernel-6_1 = { path = "../../packages/kernel-6.1" } # docker diff --git a/variants/aws-k8s-1.23-nvidia/Cargo.toml b/variants/aws-k8s-1.23-nvidia/Cargo.toml index 6151c47653d..224d5c54804 100644 --- a/variants/aws-k8s-1.23-nvidia/Cargo.toml +++ b/variants/aws-k8s-1.23-nvidia/Cargo.toml @@ -17,6 +17,7 @@ grub-set-private-var = true [package.metadata.build-variant] included-packages = [ + "aws-data-providers", "aws-iam-authenticator", "cni", "cni-plugins", @@ -44,6 +45,12 @@ aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } early-boot-config = { path = "../../packages/early-boot-config" } +early-boot-config-ec2-identity-doc = { path = "../../packages/early-boot-config-ec2-identity-doc" } +early-boot-config-ec2-imds = { path = "../../packages/early-boot-config-ec2-imds" } +early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } +early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } +early-boot-config-local = { path = "../../packages/early-boot-config-local" } +early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } kernel-5_10 = { path = "../../packages/kernel-5.10" } kubernetes-1_23 = { path = "../../packages/kubernetes-1.23" } release = { path = "../../packages/release" } diff --git a/variants/aws-k8s-1.23/Cargo.toml b/variants/aws-k8s-1.23/Cargo.toml index 3d4151e6035..4faff4d5811 100644 --- a/variants/aws-k8s-1.23/Cargo.toml +++ b/variants/aws-k8s-1.23/Cargo.toml @@ -14,6 +14,7 @@ grub-set-private-var = true [package.metadata.build-variant] included-packages = [ + "aws-data-providers", "aws-iam-authenticator", "cni", "cni-plugins", @@ -38,6 +39,12 @@ aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } early-boot-config = { path = "../../packages/early-boot-config" } +early-boot-config-ec2-identity-doc = { path = "../../packages/early-boot-config-ec2-identity-doc" } +early-boot-config-ec2-imds = { path = "../../packages/early-boot-config-ec2-imds" } +early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } +early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } +early-boot-config-local = { path = "../../packages/early-boot-config-local" } +early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } kernel-5_10 = { path = "../../packages/kernel-5.10" } kubernetes-1_23= { path = "../../packages/kubernetes-1.23" } release = { path = "../../packages/release" } diff --git a/variants/aws-k8s-1.24-nvidia/Cargo.toml b/variants/aws-k8s-1.24-nvidia/Cargo.toml index 59d79573d7c..95c7bdd44ff 100644 --- a/variants/aws-k8s-1.24-nvidia/Cargo.toml +++ b/variants/aws-k8s-1.24-nvidia/Cargo.toml @@ -17,6 +17,7 @@ grub-set-private-var = true [package.metadata.build-variant] included-packages = [ + "aws-data-providers", "aws-iam-authenticator", "cni", "cni-plugins", @@ -44,6 +45,12 @@ aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } early-boot-config = { path = "../../packages/early-boot-config" } +early-boot-config-ec2-identity-doc = { path = "../../packages/early-boot-config-ec2-identity-doc" } +early-boot-config-ec2-imds = { path = "../../packages/early-boot-config-ec2-imds" } +early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } +early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } +early-boot-config-local = { path = "../../packages/early-boot-config-local" } +early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } kernel-5_15 = { path = "../../packages/kernel-5.15" } kubernetes-1_24 = { path = "../../packages/kubernetes-1.24" } release = { path = "../../packages/release" } diff --git a/variants/aws-k8s-1.24/Cargo.toml b/variants/aws-k8s-1.24/Cargo.toml index 463c7c0ad95..907101f8884 100644 --- a/variants/aws-k8s-1.24/Cargo.toml +++ b/variants/aws-k8s-1.24/Cargo.toml @@ -14,6 +14,7 @@ grub-set-private-var = true [package.metadata.build-variant] included-packages = [ + "aws-data-providers", "aws-iam-authenticator", "cni", "cni-plugins", @@ -38,6 +39,12 @@ aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } early-boot-config = { path = "../../packages/early-boot-config" } +early-boot-config-ec2-identity-doc = { path = "../../packages/early-boot-config-ec2-identity-doc" } +early-boot-config-ec2-imds = { path = "../../packages/early-boot-config-ec2-imds" } +early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } +early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } +early-boot-config-local = { path = "../../packages/early-boot-config-local" } +early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } kernel-5_15 = { path = "../../packages/kernel-5.15" } kubernetes-1_24= { path = "../../packages/kubernetes-1.24" } release = { path = "../../packages/release" } diff --git a/variants/aws-k8s-1.25-nvidia/Cargo.toml b/variants/aws-k8s-1.25-nvidia/Cargo.toml index 282f1ae77d2..825833669ba 100644 --- a/variants/aws-k8s-1.25-nvidia/Cargo.toml +++ b/variants/aws-k8s-1.25-nvidia/Cargo.toml @@ -17,6 +17,7 @@ grub-set-private-var = true [package.metadata.build-variant] included-packages = [ + "aws-data-providers", "aws-iam-authenticator", "cni", "cni-plugins", @@ -44,6 +45,12 @@ aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } early-boot-config = { path = "../../packages/early-boot-config" } +early-boot-config-ec2-identity-doc = { path = "../../packages/early-boot-config-ec2-identity-doc" } +early-boot-config-ec2-imds = { path = "../../packages/early-boot-config-ec2-imds" } +early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } +early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } +early-boot-config-local = { path = "../../packages/early-boot-config-local" } +early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } kernel-5_15 = { path = "../../packages/kernel-5.15" } kubernetes-1_25 = { path = "../../packages/kubernetes-1.25" } release = { path = "../../packages/release" } diff --git a/variants/aws-k8s-1.25/Cargo.toml b/variants/aws-k8s-1.25/Cargo.toml index 7b5414e7f22..1ef9b0636bd 100644 --- a/variants/aws-k8s-1.25/Cargo.toml +++ b/variants/aws-k8s-1.25/Cargo.toml @@ -14,6 +14,7 @@ grub-set-private-var = true [package.metadata.build-variant] included-packages = [ + "aws-data-providers", "aws-iam-authenticator", "cni", "cni-plugins", @@ -38,6 +39,12 @@ aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } early-boot-config = { path = "../../packages/early-boot-config" } +early-boot-config-ec2-identity-doc = { path = "../../packages/early-boot-config-ec2-identity-doc" } +early-boot-config-ec2-imds = { path = "../../packages/early-boot-config-ec2-imds" } +early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } +early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } +early-boot-config-local = { path = "../../packages/early-boot-config-local" } +early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } kernel-5_15 = { path = "../../packages/kernel-5.15" } kubernetes-1_25 = { path = "../../packages/kubernetes-1.25" } release = { path = "../../packages/release" } diff --git a/variants/aws-k8s-1.26-nvidia/Cargo.toml b/variants/aws-k8s-1.26-nvidia/Cargo.toml index 078bcc25c29..6119502c18a 100644 --- a/variants/aws-k8s-1.26-nvidia/Cargo.toml +++ b/variants/aws-k8s-1.26-nvidia/Cargo.toml @@ -18,6 +18,7 @@ unified-cgroup-hierarchy = true [package.metadata.build-variant] included-packages = [ + "aws-data-providers", "aws-iam-authenticator", "cni", "cni-plugins", @@ -45,6 +46,12 @@ aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } early-boot-config = { path = "../../packages/early-boot-config" } +early-boot-config-ec2-identity-doc = { path = "../../packages/early-boot-config-ec2-identity-doc" } +early-boot-config-ec2-imds = { path = "../../packages/early-boot-config-ec2-imds" } +early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } +early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } +early-boot-config-local = { path = "../../packages/early-boot-config-local" } +early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } kernel-5_15 = { path = "../../packages/kernel-5.15" } kubernetes-1_26 = { path = "../../packages/kubernetes-1.26" } release = { path = "../../packages/release" } diff --git a/variants/aws-k8s-1.26/Cargo.toml b/variants/aws-k8s-1.26/Cargo.toml index 9593329cb67..89cca808bb6 100644 --- a/variants/aws-k8s-1.26/Cargo.toml +++ b/variants/aws-k8s-1.26/Cargo.toml @@ -15,6 +15,7 @@ unified-cgroup-hierarchy = true [package.metadata.build-variant] included-packages = [ + "aws-data-providers", "aws-iam-authenticator", "cni", "cni-plugins", @@ -39,6 +40,12 @@ aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } early-boot-config = { path = "../../packages/early-boot-config" } +early-boot-config-ec2-identity-doc = { path = "../../packages/early-boot-config-ec2-identity-doc" } +early-boot-config-ec2-imds = { path = "../../packages/early-boot-config-ec2-imds" } +early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } +early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } +early-boot-config-local = { path = "../../packages/early-boot-config-local" } +early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } kernel-5_15 = { path = "../../packages/kernel-5.15" } kubernetes-1_26 = { path = "../../packages/kubernetes-1.26" } release = { path = "../../packages/release" } diff --git a/variants/aws-k8s-1.27-nvidia/Cargo.toml b/variants/aws-k8s-1.27-nvidia/Cargo.toml index b3c9333cb6d..f7001cb208b 100644 --- a/variants/aws-k8s-1.27-nvidia/Cargo.toml +++ b/variants/aws-k8s-1.27-nvidia/Cargo.toml @@ -18,6 +18,7 @@ unified-cgroup-hierarchy = true [package.metadata.build-variant] included-packages = [ + "aws-data-providers", "aws-iam-authenticator", "cni", "cni-plugins", @@ -45,6 +46,12 @@ aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } early-boot-config = { path = "../../packages/early-boot-config" } +early-boot-config-ec2-identity-doc = { path = "../../packages/early-boot-config-ec2-identity-doc" } +early-boot-config-ec2-imds = { path = "../../packages/early-boot-config-ec2-imds" } +early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } +early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } +early-boot-config-local = { path = "../../packages/early-boot-config-local" } +early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } kernel-5_15 = { path = "../../packages/kernel-5.15" } kubernetes-1_27 = { path = "../../packages/kubernetes-1.27" } release = { path = "../../packages/release" } diff --git a/variants/aws-k8s-1.27/Cargo.toml b/variants/aws-k8s-1.27/Cargo.toml index 65a40768df1..a69859bc365 100644 --- a/variants/aws-k8s-1.27/Cargo.toml +++ b/variants/aws-k8s-1.27/Cargo.toml @@ -15,6 +15,7 @@ unified-cgroup-hierarchy = true [package.metadata.build-variant] included-packages = [ + "aws-data-providers", "aws-iam-authenticator", "cni", "cni-plugins", @@ -39,6 +40,12 @@ aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } early-boot-config = { path = "../../packages/early-boot-config" } +early-boot-config-ec2-identity-doc = { path = "../../packages/early-boot-config-ec2-identity-doc" } +early-boot-config-ec2-imds = { path = "../../packages/early-boot-config-ec2-imds" } +early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } +early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } +early-boot-config-local = { path = "../../packages/early-boot-config-local" } +early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } kernel-5_15 = { path = "../../packages/kernel-5.15" } kubernetes-1_27 = { path = "../../packages/kubernetes-1.27" } release = { path = "../../packages/release" } diff --git a/variants/aws-k8s-1.28-nvidia/Cargo.toml b/variants/aws-k8s-1.28-nvidia/Cargo.toml index e57c961fd5d..27e4bd492bd 100644 --- a/variants/aws-k8s-1.28-nvidia/Cargo.toml +++ b/variants/aws-k8s-1.28-nvidia/Cargo.toml @@ -25,6 +25,7 @@ included-packages = [ "early-boot-config", "release", "kernel-6.1", + "aws-data-providers", # k8s "cni", "cni-plugins", @@ -49,6 +50,12 @@ path = "../variants.rs" [build-dependencies] # core early-boot-config = { path = "../../packages/early-boot-config" } +early-boot-config-ec2-identity-doc = { path = "../../packages/early-boot-config-ec2-identity-doc" } +early-boot-config-ec2-imds = { path = "../../packages/early-boot-config-ec2-imds" } +early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } +early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } +early-boot-config-local = { path = "../../packages/early-boot-config-local" } +early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } release = { path = "../../packages/release" } kernel-6_1 = { path = "../../packages/kernel-6.1" } # k8s diff --git a/variants/aws-k8s-1.28/Cargo.toml b/variants/aws-k8s-1.28/Cargo.toml index 4fbc8f00b67..837233ba1f6 100644 --- a/variants/aws-k8s-1.28/Cargo.toml +++ b/variants/aws-k8s-1.28/Cargo.toml @@ -22,6 +22,7 @@ included-packages = [ "early-boot-config", "release", "kernel-6.1", + "aws-data-providers", # k8s "cni", "cni-plugins", @@ -42,6 +43,12 @@ path = "../variants.rs" [build-dependencies] # core early-boot-config = { path = "../../packages/early-boot-config" } +early-boot-config-ec2-identity-doc = { path = "../../packages/early-boot-config-ec2-identity-doc" } +early-boot-config-ec2-imds = { path = "../../packages/early-boot-config-ec2-imds" } +early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } +early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } +early-boot-config-local = { path = "../../packages/early-boot-config-local" } +early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } release = { path = "../../packages/release" } kernel-6_1 = { path = "../../packages/kernel-6.1" } # k8s diff --git a/variants/metal-dev/Cargo.toml b/variants/metal-dev/Cargo.toml index 5359c635619..ad464e4113e 100644 --- a/variants/metal-dev/Cargo.toml +++ b/variants/metal-dev/Cargo.toml @@ -29,6 +29,7 @@ included-packages = [ "release", "kernel-6.1", "linux-firmware", + "metal-data-providers", # docker "docker-cli", "docker-engine", @@ -46,6 +47,10 @@ path = "../variants.rs" [build-dependencies] # core early-boot-config = { path = "../../packages/early-boot-config" } +early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } +early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } +early-boot-config-local = { path = "../../packages/early-boot-config-local" } +early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } release = { path = "../../packages/release" } kernel-6_1 = { path = "../../packages/kernel-6.1" } linux-firmware = { path = "../../packages/linux-firmware" } diff --git a/variants/metal-k8s-1.25/Cargo.toml b/variants/metal-k8s-1.25/Cargo.toml index 41fef445221..11163cbdd30 100644 --- a/variants/metal-k8s-1.25/Cargo.toml +++ b/variants/metal-k8s-1.25/Cargo.toml @@ -31,6 +31,7 @@ included-packages = [ "kernel-5.15", "linux-firmware", "kubelet-1.25", + "metal-data-providers", "release", ] @@ -42,6 +43,10 @@ aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } early-boot-config = { path = "../../packages/early-boot-config" } +early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } +early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } +early-boot-config-local = { path = "../../packages/early-boot-config-local" } +early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } kernel-5_15 = { path = "../../packages/kernel-5.15" } linux-firmware = { path = "../../packages/linux-firmware" } kubernetes-1_25 = { path = "../../packages/kubernetes-1.25" } diff --git a/variants/metal-k8s-1.26/Cargo.toml b/variants/metal-k8s-1.26/Cargo.toml index f5b52f3565d..83123d3eb2e 100644 --- a/variants/metal-k8s-1.26/Cargo.toml +++ b/variants/metal-k8s-1.26/Cargo.toml @@ -32,6 +32,7 @@ included-packages = [ "kernel-5.15", "linux-firmware", "kubelet-1.26", + "metal-data-providers", "release", ] @@ -43,6 +44,10 @@ aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } early-boot-config = { path = "../../packages/early-boot-config" } +early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } +early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } +early-boot-config-local = { path = "../../packages/early-boot-config-local" } +early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } kernel-5_15 = { path = "../../packages/kernel-5.15" } linux-firmware = { path = "../../packages/linux-firmware" } kubernetes-1_26 = { path = "../../packages/kubernetes-1.26" } diff --git a/variants/metal-k8s-1.27/Cargo.toml b/variants/metal-k8s-1.27/Cargo.toml index 3e5bb8fef9c..ad56e47eec4 100644 --- a/variants/metal-k8s-1.27/Cargo.toml +++ b/variants/metal-k8s-1.27/Cargo.toml @@ -32,6 +32,7 @@ included-packages = [ "kernel-5.15", "linux-firmware", "kubelet-1.27", + "metal-data-providers", "release", ] @@ -43,6 +44,10 @@ aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } early-boot-config = { path = "../../packages/early-boot-config" } +early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } +early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } +early-boot-config-local = { path = "../../packages/early-boot-config-local" } +early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } kernel-5_15 = { path = "../../packages/kernel-5.15" } linux-firmware = { path = "../../packages/linux-firmware" } kubernetes-1_27 = { path = "../../packages/kubernetes-1.27" } diff --git a/variants/metal-k8s-1.28/Cargo.toml b/variants/metal-k8s-1.28/Cargo.toml index 7b94283dd20..c93e9b6da55 100644 --- a/variants/metal-k8s-1.28/Cargo.toml +++ b/variants/metal-k8s-1.28/Cargo.toml @@ -32,6 +32,7 @@ included-packages = [ "early-boot-config", "release", "kernel-6.1", + "metal-data-providers", # k8s "aws-iam-authenticator", "cni", @@ -45,6 +46,10 @@ path = "../variants.rs" [build-dependencies] # core early-boot-config = { path = "../../packages/early-boot-config" } +early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } +early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } +early-boot-config-local = { path = "../../packages/early-boot-config-local" } +early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } release = { path = "../../packages/release" } kernel-6_1 = { path = "../../packages/kernel-6.1" } # k8s diff --git a/variants/metal-k8s-1.29/Cargo.toml b/variants/metal-k8s-1.29/Cargo.toml index 834802f2eb8..22f82639320 100644 --- a/variants/metal-k8s-1.29/Cargo.toml +++ b/variants/metal-k8s-1.29/Cargo.toml @@ -37,6 +37,7 @@ included-packages = [ "cni-plugins", "kubelet-1.29", "early-boot-config", + "metal-data-providers", ] [lib] @@ -52,3 +53,7 @@ cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } kubernetes-1_29 = { path = "../../packages/kubernetes-1.29" } early-boot-config = { path = "../../packages/early-boot-config" } +early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } +early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } +early-boot-config-local = { path = "../../packages/early-boot-config-local" } +early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } diff --git a/variants/vmware-dev/Cargo.toml b/variants/vmware-dev/Cargo.toml index 4ccb51dfa83..ff21e7d3f02 100644 --- a/variants/vmware-dev/Cargo.toml +++ b/variants/vmware-dev/Cargo.toml @@ -34,6 +34,7 @@ included-packages = [ "release", "kernel-6.1", "open-vm-tools", + "vmware-data-providers", # docker "docker-cli", "docker-engine", @@ -51,6 +52,12 @@ path = "../variants.rs" [build-dependencies] # core early-boot-config = { path = "../../packages/early-boot-config" } +early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } +early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } +early-boot-config-local = { path = "../../packages/early-boot-config-local" } +early-boot-config-vmware-cd-rom = { path = "../../packages/early-boot-config-vmware-cd-rom" } +early-boot-config-vmware-guestinfo = { path = "../../packages/early-boot-config-vmware-guestinfo" } +early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } release = { path = "../../packages/release" } kernel-6_1 = { path = "../../packages/kernel-6.1" } open-vm-tools = { path = "../../packages/open-vm-tools" } diff --git a/variants/vmware-k8s-1.25/Cargo.toml b/variants/vmware-k8s-1.25/Cargo.toml index 5b6e46a7a12..995a0f47ea7 100644 --- a/variants/vmware-k8s-1.25/Cargo.toml +++ b/variants/vmware-k8s-1.25/Cargo.toml @@ -34,6 +34,7 @@ included-packages = [ "kubelet-1.25", "open-vm-tools", "release", + "vmware-data-providers", ] [lib] @@ -43,6 +44,12 @@ path = "../variants.rs" cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } early-boot-config = { path = "../../packages/early-boot-config" } +early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } +early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } +early-boot-config-local = { path = "../../packages/early-boot-config-local" } +early-boot-config-vmware-cd-rom = { path = "../../packages/early-boot-config-vmware-cd-rom" } +early-boot-config-vmware-guestinfo = { path = "../../packages/early-boot-config-vmware-guestinfo" } +early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } kernel-5_15 = { path = "../../packages/kernel-5.15" } kubernetes-1_25 = { path = "../../packages/kubernetes-1.25" } open-vm-tools = { path = "../../packages/open-vm-tools" } diff --git a/variants/vmware-k8s-1.26/Cargo.toml b/variants/vmware-k8s-1.26/Cargo.toml index 4b94fa8447f..6a127eabb77 100644 --- a/variants/vmware-k8s-1.26/Cargo.toml +++ b/variants/vmware-k8s-1.26/Cargo.toml @@ -35,6 +35,7 @@ included-packages = [ "kubelet-1.26", "open-vm-tools", "release", + "vmware-data-providers", ] [lib] @@ -44,6 +45,12 @@ path = "../variants.rs" cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } early-boot-config = { path = "../../packages/early-boot-config" } +early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } +early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } +early-boot-config-local = { path = "../../packages/early-boot-config-local" } +early-boot-config-vmware-cd-rom = { path = "../../packages/early-boot-config-vmware-cd-rom" } +early-boot-config-vmware-guestinfo = { path = "../../packages/early-boot-config-vmware-guestinfo" } +early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } kernel-5_15 = { path = "../../packages/kernel-5.15" } kubernetes-1_26 = { path = "../../packages/kubernetes-1.26" } open-vm-tools = { path = "../../packages/open-vm-tools" } diff --git a/variants/vmware-k8s-1.27/Cargo.toml b/variants/vmware-k8s-1.27/Cargo.toml index 27083a247c2..9f17ecbf320 100644 --- a/variants/vmware-k8s-1.27/Cargo.toml +++ b/variants/vmware-k8s-1.27/Cargo.toml @@ -35,6 +35,7 @@ included-packages = [ "kubelet-1.27", "open-vm-tools", "release", + "vmware-data-providers", ] [lib] @@ -44,6 +45,12 @@ path = "../variants.rs" cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } early-boot-config = { path = "../../packages/early-boot-config" } +early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } +early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } +early-boot-config-local = { path = "../../packages/early-boot-config-local" } +early-boot-config-vmware-cd-rom = { path = "../../packages/early-boot-config-vmware-cd-rom" } +early-boot-config-vmware-guestinfo = { path = "../../packages/early-boot-config-vmware-guestinfo" } +early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } kernel-5_15 = { path = "../../packages/kernel-5.15" } kubernetes-1_27 = { path = "../../packages/kubernetes-1.27" } open-vm-tools = { path = "../../packages/open-vm-tools" } diff --git a/variants/vmware-k8s-1.28/Cargo.toml b/variants/vmware-k8s-1.28/Cargo.toml index c64ba6dbccc..58c45a4182d 100644 --- a/variants/vmware-k8s-1.28/Cargo.toml +++ b/variants/vmware-k8s-1.28/Cargo.toml @@ -35,6 +35,7 @@ included-packages = [ "early-boot-config", "release", "kernel-6.1", + "vmware-data-providers", # k8s "cni", "cni-plugins", @@ -49,6 +50,12 @@ path = "../variants.rs" [build-dependencies] # core early-boot-config = { path = "../../packages/early-boot-config" } +early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } +early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } +early-boot-config-local = { path = "../../packages/early-boot-config-local" } +early-boot-config-vmware-cd-rom = { path = "../../packages/early-boot-config-vmware-cd-rom" } +early-boot-config-vmware-guestinfo = { path = "../../packages/early-boot-config-vmware-guestinfo" } +early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } release = { path = "../../packages/release" } kernel-6_1 = { path = "../../packages/kernel-6.1" } # k8s diff --git a/variants/vmware-k8s-1.29/Cargo.toml b/variants/vmware-k8s-1.29/Cargo.toml index fa4ee8e41c6..d2e0ea9ada1 100644 --- a/variants/vmware-k8s-1.29/Cargo.toml +++ b/variants/vmware-k8s-1.29/Cargo.toml @@ -41,6 +41,7 @@ included-packages = [ # vmware "early-boot-config", "open-vm-tools", + "vmware-data-providers", ] [lib] @@ -56,4 +57,10 @@ cni-plugins = { path = "../../packages/cni-plugins" } kubernetes-1_29 = { path = "../../packages/kubernetes-1.29" } # vmware early-boot-config = { path = "../../packages/early-boot-config" } +early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } +early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } +early-boot-config-local = { path = "../../packages/early-boot-config-local" } +early-boot-config-vmware-cd-rom = { path = "../../packages/early-boot-config-vmware-cd-rom" } +early-boot-config-vmware-guestinfo = { path = "../../packages/early-boot-config-vmware-guestinfo" } +early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } open-vm-tools = { path = "../../packages/open-vm-tools" } From 244b0b212b96cb3ef026ab43e356880c41b99394 Mon Sep 17 00:00:00 2001 From: Sam Berning Date: Wed, 21 Feb 2024 01:30:48 +0000 Subject: [PATCH 23/41] early-boot-config: run providers in parallel Signed-off-by: Sam Berning --- .../src/bin/early-boot-config.rs | 45 ++++++++++++++----- 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/sources/api/early-boot-config/src/bin/early-boot-config.rs b/sources/api/early-boot-config/src/bin/early-boot-config.rs index b6981e1ac75..d487bd16f4b 100644 --- a/sources/api/early-boot-config/src/bin/early-boot-config.rs +++ b/sources/api/early-boot-config/src/bin/early-boot-config.rs @@ -19,7 +19,7 @@ use snafu::{ensure, ResultExt}; use std::fs; use std::path::{Path, PathBuf}; use std::str::{self, FromStr}; -use std::{env, process}; +use std::{env, io, process}; use tokio::process::Command as AsyncCommand; use walkdir::WalkDir; @@ -109,38 +109,42 @@ fn gather_providers() -> Result> { .collect()) } -/// Run a user data provider binary, forwarding its logs -async fn run_provider

(log_level: &LevelFilter, provider: P) -> Result +/// Run a user data provider binary +async fn run_provider

(log_level: &LevelFilter, provider: P) -> io::Result where P: AsRef, { let provider = provider.as_ref(); - let result = AsyncCommand::new(provider) + AsyncCommand::new(provider) .env(LOG_LEVEL_ENV_VAR, log_level.as_str()) .output() .await - .context(error::CommandFailureSnafu { - provider: &provider, - })?; +} +/// Check that a user data provider succeeded and forward its logs +fn check_provider_status

(provider: P, output: &process::Output) -> Result<()> +where + P: AsRef, +{ + let provider = provider.as_ref(); // Regardless of provider status, log its output let provider_name = provider .file_name() .unwrap_or(provider.as_os_str()) .to_string_lossy(); - let provider_logs = String::from_utf8_lossy(&result.stderr); + let provider_logs = String::from_utf8_lossy(&output.stderr); for line in provider_logs.lines() { info!("Provider '{}': {}", provider_name, line); } ensure!( - result.status.success(), + output.status.success(), error::ProviderFailureSnafu { provider: &provider, } ); - Ok(result) + Ok(()) } /// Submit user data to the API @@ -188,10 +192,24 @@ async fn run() -> Result<()> { info!("early-boot-config started"); info!("Gathering user data providers"); + let mut threads = Vec::new(); let providers = gather_providers()?; for provider in providers { - debug!("Found '{}', running it...", provider.display()); - let result = run_provider(&args.log_level, &provider).await?; + threads.push(( + provider.clone(), + tokio::spawn(async move { run_provider(&args.log_level, &provider).await }), + )); + } + + for (provider, handle) in threads { + let result = + handle + .await + .context(error::ThreadSnafu)? + .context(error::CommandFailureSnafu { + provider: provider.clone(), + })?; + check_provider_status(&provider, &result)?; // User data providers output a serialized `SettingsJson` if they are successful in finding // user data at their respective source. Output will be empty otherwise. @@ -291,6 +309,9 @@ mod error { response_body: String, }, + #[snafu(display("Thread execution error: {}", source))] + Thread { source: tokio::task::JoinError }, + #[snafu(display("Logger setup error: {}", source))] Logger { source: log::SetLoggerError }, From 260e278721534c02a29731343f92abe860bbb545 Mon Sep 17 00:00:00 2001 From: Sam Berning Date: Tue, 27 Feb 2024 23:20:54 +0000 Subject: [PATCH 24/41] early-boot-config: create dummy vmware-guestinfo provider for arm Signed-off-by: Sam Berning --- .../src/bin/user-data-providers/vmware_guestinfo.rs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/sources/api/early-boot-config/src/bin/user-data-providers/vmware_guestinfo.rs b/sources/api/early-boot-config/src/bin/user-data-providers/vmware_guestinfo.rs index e2b1420fc77..c55cbbfefe6 100644 --- a/sources/api/early-boot-config/src/bin/user-data-providers/vmware_guestinfo.rs +++ b/sources/api/early-boot-config/src/bin/user-data-providers/vmware_guestinfo.rs @@ -1,8 +1,17 @@ +#[cfg(target_arch = "x86_64")] use early_boot_config::provider::{run_userdata_provider, setup_provider_logging, VmwareGuestinfo}; use std::process::ExitCode; #[tokio::main] async fn main() -> ExitCode { - setup_provider_logging(); - run_userdata_provider(&VmwareGuestinfo).await + #[cfg(target_arch = "x86_64")] + { + setup_provider_logging(); + run_userdata_provider(&VmwareGuestinfo).await + } + #[cfg(not(target_arch = "x86_64"))] + { + println!(""); + ExitCode::SUCCESS + } } From 77daf4d9cf615f8c2c80a71ec04a56b4fe021815 Mon Sep 17 00:00:00 2001 From: Sam Berning Date: Fri, 23 Feb 2024 23:09:46 +0000 Subject: [PATCH 25/41] packages: combine early-boot-config into one package Signed-off-by: Sam Berning --- .../Cargo.toml | 21 ---- .../early-boot-config-ec2-identity-doc.spec | 54 ---------- .../early-boot-config-ec2-imds/Cargo.toml | 21 ---- .../early-boot-config-ec2-imds.spec | 54 ---------- .../Cargo.toml | 21 ---- .../early-boot-config-local-defaults.spec | 54 ---------- .../Cargo.toml | 21 ---- .../early-boot-config-local-overrides.spec | 54 ---------- packages/early-boot-config-local/Cargo.toml | 21 ---- .../early-boot-config-local.spec | 54 ---------- .../early-boot-config-providers/Cargo.toml | 21 ---- .../early-boot-config-providers.spec | 92 ----------------- .../Cargo.toml | 21 ---- .../early-boot-config-vmware-cd-rom.spec | 54 ---------- .../Cargo.toml | 21 ---- .../early-boot-config-vmware-guestinfo.spec | 54 ---------- .../early-boot-config/early-boot-config.spec | 98 ++++++++++++++++++- 17 files changed, 96 insertions(+), 640 deletions(-) delete mode 100644 packages/early-boot-config-ec2-identity-doc/Cargo.toml delete mode 100644 packages/early-boot-config-ec2-identity-doc/early-boot-config-ec2-identity-doc.spec delete mode 100644 packages/early-boot-config-ec2-imds/Cargo.toml delete mode 100644 packages/early-boot-config-ec2-imds/early-boot-config-ec2-imds.spec delete mode 100644 packages/early-boot-config-local-defaults/Cargo.toml delete mode 100644 packages/early-boot-config-local-defaults/early-boot-config-local-defaults.spec delete mode 100644 packages/early-boot-config-local-overrides/Cargo.toml delete mode 100644 packages/early-boot-config-local-overrides/early-boot-config-local-overrides.spec delete mode 100644 packages/early-boot-config-local/Cargo.toml delete mode 100644 packages/early-boot-config-local/early-boot-config-local.spec delete mode 100644 packages/early-boot-config-providers/Cargo.toml delete mode 100644 packages/early-boot-config-providers/early-boot-config-providers.spec delete mode 100644 packages/early-boot-config-vmware-cd-rom/Cargo.toml delete mode 100644 packages/early-boot-config-vmware-cd-rom/early-boot-config-vmware-cd-rom.spec delete mode 100644 packages/early-boot-config-vmware-guestinfo/Cargo.toml delete mode 100644 packages/early-boot-config-vmware-guestinfo/early-boot-config-vmware-guestinfo.spec diff --git a/packages/early-boot-config-ec2-identity-doc/Cargo.toml b/packages/early-boot-config-ec2-identity-doc/Cargo.toml deleted file mode 100644 index 495af1f3fe3..00000000000 --- a/packages/early-boot-config-ec2-identity-doc/Cargo.toml +++ /dev/null @@ -1,21 +0,0 @@ -[package] -name = "early-boot-config-ec2-identity-doc" -version = "0.1.0" -edition = "2021" -publish = false -build = "../build.rs" - -[lib] -path = "../packages.rs" - -[package.metadata.build-package] -source-groups = [ - "api/early-boot-config", -] - -# RPM BuildRequires -[build-dependencies] -glibc = { path = "../glibc" } - -# RPM Requires -[dependencies] diff --git a/packages/early-boot-config-ec2-identity-doc/early-boot-config-ec2-identity-doc.spec b/packages/early-boot-config-ec2-identity-doc/early-boot-config-ec2-identity-doc.spec deleted file mode 100644 index 089c8999785..00000000000 --- a/packages/early-boot-config-ec2-identity-doc/early-boot-config-ec2-identity-doc.spec +++ /dev/null @@ -1,54 +0,0 @@ -%global _cross_first_party 1 -%undefine _debugsource_packages - -%global user_data_provider ec2-identity-doc - -Name: %{_cross_os}early-boot-config-%{user_data_provider} -Version: 0.0 -Release: 0%{?dist} -Summary: %{user_data_provider}-provider -License: Apache-2.0 OR MIT -URL: https://github.com/bottlerocket-os/bottlerocket - -BuildRequires: %{_cross_os}glibc-devel - -%description -%{summary}. - -# Includes just the user data provider binary -%package -n %{_cross_os}ec2-identity-doc-user-data-client -Summary: EC2 identity doc user data client -%description -n %{_cross_os}ec2-identity-doc-user-data-client -%{summary}. - -# Symlinks the binary to the appropriate .d directory as 30- -%package -n %{_cross_os}ec2-identity-doc-user-data-provider -Summary: EC2 identity doc user data provider config -%description -n %{_cross_os}ec2-identity-doc-user-data-provider -%{summary}. - -%prep -%setup -T -c -%cargo_prep - -%build -%cargo_build --manifest-path %{_builddir}/sources/Cargo.toml \ - -p early-boot-config --bin %{user_data_provider}-provider - -%install -install -d %{buildroot}%{_cross_libexecdir}/early-boot-config/bin -install -p -m 0755 \ - ${HOME}/.cache/%{__cargo_target}/release/%{user_data_provider}-provider \ - %{buildroot}%{_cross_libexecdir}/early-boot-config/bin - -install -d %{buildroot}%{_cross_datadir}/early-boot-config/data-providers.d -ln -sf \ - ../../../libexec/early-boot-config/bin/%{user_data_provider}-provider \ - %{buildroot}%{_cross_datadir}/early-boot-config/data-providers.d/30-%{user_data_provider} - - -%files -n %{_cross_os}ec2-identity-doc-user-data-client -%{_cross_libexecdir}/early-boot-config/bin/%{user_data_provider}-provider - -%files -n %{_cross_os}ec2-identity-doc-user-data-provider -%{_cross_datadir}/early-boot-config/data-providers.d/30-%{user_data_provider} diff --git a/packages/early-boot-config-ec2-imds/Cargo.toml b/packages/early-boot-config-ec2-imds/Cargo.toml deleted file mode 100644 index 2909a93df85..00000000000 --- a/packages/early-boot-config-ec2-imds/Cargo.toml +++ /dev/null @@ -1,21 +0,0 @@ -[package] -name = "early-boot-config-ec2-imds" -version = "0.1.0" -edition = "2021" -publish = false -build = "../build.rs" - -[lib] -path = "../packages.rs" - -[package.metadata.build-package] -source-groups = [ - "api/early-boot-config", -] - -# RPM BuildRequires -[build-dependencies] -glibc = { path = "../glibc" } - -# RPM Requires -[dependencies] diff --git a/packages/early-boot-config-ec2-imds/early-boot-config-ec2-imds.spec b/packages/early-boot-config-ec2-imds/early-boot-config-ec2-imds.spec deleted file mode 100644 index db961390d6c..00000000000 --- a/packages/early-boot-config-ec2-imds/early-boot-config-ec2-imds.spec +++ /dev/null @@ -1,54 +0,0 @@ -%global _cross_first_party 1 -%undefine _debugsource_packages - -%global user_data_provider ec2-imds - -Name: %{_cross_os}early-boot-config-%{user_data_provider} -Version: 0.0 -Release: 0%{?dist} -Summary: %{user_data_provider}-provider -License: Apache-2.0 OR MIT -URL: https://github.com/bottlerocket-os/bottlerocket - -BuildRequires: %{_cross_os}glibc-devel - -%description -%{summary}. - -# Includes just the user data provider binary -%package -n %{_cross_os}ec2-imds-user-data-client -Summary: EC2 IMDS user data client -%description -n %{_cross_os}ec2-imds-user-data-client -%{summary}. - -# Symlinks the binary to the appropriate .d directory as 40- -%package -n %{_cross_os}ec2-imds-user-data-provider -Summary: EC2 IMDS user data provider config -%description -n %{_cross_os}ec2-imds-user-data-provider -%{summary}. - -%prep -%setup -T -c -%cargo_prep - -%build -%cargo_build --manifest-path %{_builddir}/sources/Cargo.toml \ - -p early-boot-config --bin %{user_data_provider}-provider - -%install -install -d %{buildroot}%{_cross_libexecdir}/early-boot-config/bin -install -p -m 0755 \ - ${HOME}/.cache/%{__cargo_target}/release/%{user_data_provider}-provider \ - %{buildroot}%{_cross_libexecdir}/early-boot-config/bin - -install -d %{buildroot}%{_cross_datadir}/early-boot-config/data-providers.d -ln -sf \ - ../../../libexec/early-boot-config/bin/%{user_data_provider}-provider \ - %{buildroot}%{_cross_datadir}/early-boot-config/data-providers.d/40-%{user_data_provider} - - -%files -n %{_cross_os}ec2-imds-user-data-client -%{_cross_libexecdir}/early-boot-config/bin/%{user_data_provider}-provider - -%files -n %{_cross_os}ec2-imds-user-data-provider -%{_cross_datadir}/early-boot-config/data-providers.d/40-%{user_data_provider} diff --git a/packages/early-boot-config-local-defaults/Cargo.toml b/packages/early-boot-config-local-defaults/Cargo.toml deleted file mode 100644 index 3e3bc2c2109..00000000000 --- a/packages/early-boot-config-local-defaults/Cargo.toml +++ /dev/null @@ -1,21 +0,0 @@ -[package] -name = "early-boot-config-local-defaults" -version = "0.1.0" -edition = "2021" -publish = false -build = "../build.rs" - -[lib] -path = "../packages.rs" - -[package.metadata.build-package] -source-groups = [ - "api/early-boot-config", -] - -# RPM BuildRequires -[build-dependencies] -glibc = { path = "../glibc" } - -# RPM Requires -[dependencies] diff --git a/packages/early-boot-config-local-defaults/early-boot-config-local-defaults.spec b/packages/early-boot-config-local-defaults/early-boot-config-local-defaults.spec deleted file mode 100644 index 88bec9ac145..00000000000 --- a/packages/early-boot-config-local-defaults/early-boot-config-local-defaults.spec +++ /dev/null @@ -1,54 +0,0 @@ -%global _cross_first_party 1 -%undefine _debugsource_packages - -%global user_data_provider local-defaults - -Name: %{_cross_os}early-boot-config-%{user_data_provider} -Version: 0.0 -Release: 0%{?dist} -Summary: %{user_data_provider}-provider -License: Apache-2.0 OR MIT -URL: https://github.com/bottlerocket-os/bottlerocket - -BuildRequires: %{_cross_os}glibc-devel - -%description -%{summary}. - -# Includes just the user data provider binary -%package -n %{_cross_os}local-defaults-user-data-client -Summary: Local defaults user data client -%description -n %{_cross_os}local-defaults-user-data-client -%{summary}. - -# Symlinks the binary to the appropriate .d directory as 10- -%package -n %{_cross_os}local-defaults-user-data-provider -Summary: Local defaults user data provider config -%description -n %{_cross_os}local-defaults-user-data-provider -%{summary}. - -%prep -%setup -T -c -%cargo_prep - -%build -%cargo_build --manifest-path %{_builddir}/sources/Cargo.toml \ - -p early-boot-config --bin %{user_data_provider}-provider - -%install -install -d %{buildroot}%{_cross_libexecdir}/early-boot-config/bin -install -p -m 0755 \ - ${HOME}/.cache/%{__cargo_target}/release/%{user_data_provider}-provider \ - %{buildroot}%{_cross_libexecdir}/early-boot-config/bin - -install -d %{buildroot}%{_cross_datadir}/early-boot-config/data-providers.d -ln -sf \ - ../../../libexec/early-boot-config/bin/%{user_data_provider}-provider \ - %{buildroot}%{_cross_datadir}/early-boot-config/data-providers.d/10-%{user_data_provider} - - -%files -n %{_cross_os}local-defaults-user-data-client -%{_cross_libexecdir}/early-boot-config/bin/%{user_data_provider}-provider - -%files -n %{_cross_os}local-defaults-user-data-provider -%{_cross_datadir}/early-boot-config/data-providers.d/10-%{user_data_provider} diff --git a/packages/early-boot-config-local-overrides/Cargo.toml b/packages/early-boot-config-local-overrides/Cargo.toml deleted file mode 100644 index 7fa9fd13515..00000000000 --- a/packages/early-boot-config-local-overrides/Cargo.toml +++ /dev/null @@ -1,21 +0,0 @@ -[package] -name = "early-boot-config-local-overrides" -version = "0.1.0" -edition = "2021" -publish = false -build = "../build.rs" - -[lib] -path = "../packages.rs" - -[package.metadata.build-package] -source-groups = [ - "api/early-boot-config", -] - -# RPM BuildRequires -[build-dependencies] -glibc = { path = "../glibc" } - -# RPM Requires -[dependencies] diff --git a/packages/early-boot-config-local-overrides/early-boot-config-local-overrides.spec b/packages/early-boot-config-local-overrides/early-boot-config-local-overrides.spec deleted file mode 100644 index 47e58bde03b..00000000000 --- a/packages/early-boot-config-local-overrides/early-boot-config-local-overrides.spec +++ /dev/null @@ -1,54 +0,0 @@ -%global _cross_first_party 1 -%undefine _debugsource_packages - -%global user_data_provider local-overrides - -Name: %{_cross_os}early-boot-config-%{user_data_provider} -Version: 0.0 -Release: 0%{?dist} -Summary: %{user_data_provider}-provider -License: Apache-2.0 OR MIT -URL: https://github.com/bottlerocket-os/bottlerocket - -BuildRequires: %{_cross_os}glibc-devel - -%description -%{summary}. - -# Includes just the user data provider binary -%package -n %{_cross_os}local-overrides-user-data-client -Summary: Local overrides user data client -%description -n %{_cross_os}local-overrides-user-data-client -%{summary}. - -# Symlinks the binary to the appropriate .d directory as 50- -%package -n %{_cross_os}local-overrides-user-data-provider -Summary: Local overrides user data provider config -%description -n %{_cross_os}local-overrides-user-data-provider -%{summary}. - -%prep -%setup -T -c -%cargo_prep - -%build -%cargo_build --manifest-path %{_builddir}/sources/Cargo.toml \ - -p early-boot-config --bin %{user_data_provider}-provider - -%install -install -d %{buildroot}%{_cross_libexecdir}/early-boot-config/bin -install -p -m 0755 \ - ${HOME}/.cache/%{__cargo_target}/release/%{user_data_provider}-provider \ - %{buildroot}%{_cross_libexecdir}/early-boot-config/bin - -install -d %{buildroot}%{_cross_datadir}/early-boot-config/data-providers.d -ln -sf \ - ../../../libexec/early-boot-config/bin/%{user_data_provider}-provider \ - %{buildroot}%{_cross_datadir}/early-boot-config/data-providers.d/50-%{user_data_provider} - - -%files -n %{_cross_os}local-overrides-user-data-client -%{_cross_libexecdir}/early-boot-config/bin/%{user_data_provider}-provider - -%files -n %{_cross_os}local-overrides-user-data-provider -%{_cross_datadir}/early-boot-config/data-providers.d/50-%{user_data_provider} diff --git a/packages/early-boot-config-local/Cargo.toml b/packages/early-boot-config-local/Cargo.toml deleted file mode 100644 index 26e22c5497d..00000000000 --- a/packages/early-boot-config-local/Cargo.toml +++ /dev/null @@ -1,21 +0,0 @@ -[package] -name = "early-boot-config-local" -version = "0.1.0" -edition = "2021" -publish = false -build = "../build.rs" - -[lib] -path = "../packages.rs" - -[package.metadata.build-package] -source-groups = [ - "api/early-boot-config", -] - -# RPM BuildRequires -[build-dependencies] -glibc = { path = "../glibc" } - -# RPM Requires -[dependencies] diff --git a/packages/early-boot-config-local/early-boot-config-local.spec b/packages/early-boot-config-local/early-boot-config-local.spec deleted file mode 100644 index 192017d58e0..00000000000 --- a/packages/early-boot-config-local/early-boot-config-local.spec +++ /dev/null @@ -1,54 +0,0 @@ -%global _cross_first_party 1 -%undefine _debugsource_packages - -%global user_data_provider local - -Name: %{_cross_os}early-boot-config-%{user_data_provider} -Version: 0.0 -Release: 0%{?dist} -Summary: %{user_data_provider}-provider -License: Apache-2.0 OR MIT -URL: https://github.com/bottlerocket-os/bottlerocket - -BuildRequires: %{_cross_os}glibc-devel - -%description -%{summary}. - -# Includes just the user data provider binary -%package -n %{_cross_os}local-user-data-client -Summary: Local user data client -%description -n %{_cross_os}local-user-data-client -%{summary}. - -# Symlinks the binary to the appropriate .d directory as 20- -%package -n %{_cross_os}local-user-data-provider -Summary: Local user data provider config -%description -n %{_cross_os}local-user-data-provider -%{summary}. - -%prep -%setup -T -c -%cargo_prep - -%build -%cargo_build --manifest-path %{_builddir}/sources/Cargo.toml \ - -p early-boot-config --bin %{user_data_provider}-user-data-provider - -%install -install -d %{buildroot}%{_cross_libexecdir}/early-boot-config/bin -install -p -m 0755 \ - ${HOME}/.cache/%{__cargo_target}/release/%{user_data_provider}-user-data-provider \ - %{buildroot}%{_cross_libexecdir}/early-boot-config/bin - -install -d %{buildroot}%{_cross_datadir}/early-boot-config/data-providers.d -ln -sf \ - ../../../libexec/early-boot-config/bin/%{user_data_provider}-user-data-provider \ - %{buildroot}%{_cross_datadir}/early-boot-config/data-providers.d/20-%{user_data_provider} - - -%files -n %{_cross_os}local-user-data-client -%{_cross_libexecdir}/early-boot-config/bin/%{user_data_provider}-user-data-provider - -%files -n %{_cross_os}local-user-data-provider -%{_cross_datadir}/early-boot-config/data-providers.d/20-%{user_data_provider} diff --git a/packages/early-boot-config-providers/Cargo.toml b/packages/early-boot-config-providers/Cargo.toml deleted file mode 100644 index 4cd441e3e9a..00000000000 --- a/packages/early-boot-config-providers/Cargo.toml +++ /dev/null @@ -1,21 +0,0 @@ -[package] -name = "early-boot-config-providers" -version = "0.1.0" -edition = "2021" -publish = false -build = "../build.rs" - -[lib] -path = "../packages.rs" - -[package.metadata.build-package] -source-groups = [ - "api/early-boot-config", -] - -# RPM BuildRequires -[build-dependencies] -glibc = { path = "../glibc" } - -# RPM Requires -[dependencies] diff --git a/packages/early-boot-config-providers/early-boot-config-providers.spec b/packages/early-boot-config-providers/early-boot-config-providers.spec deleted file mode 100644 index 39ba7e28784..00000000000 --- a/packages/early-boot-config-providers/early-boot-config-providers.spec +++ /dev/null @@ -1,92 +0,0 @@ -%global _cross_first_party 1 -%undefine _debugsource_packages - -Name: %{_cross_os}early-boot-config-providers -Version: 0.0 -Release: 0%{?dist} -Summary: Platform user data providers -License: Apache-2.0 OR MIT -URL: https://github.com/bottlerocket-os/bottlerocket - -Requires: %{_cross_os}local-defaults-user-data-client -Requires: %{_cross_os}local-defaults-user-data-provider -Requires: %{_cross_os}local-user-data-client -Requires: %{_cross_os}local-user-data-provider -Requires: %{_cross_os}local-overrides-user-data-client -Requires: %{_cross_os}local-overrides-user-data-provider -Requires: %{_cross_os}ec2-identity-doc-user-data-client -Requires: %{_cross_os}ec2-identity-doc-user-data-provider -Requires: %{_cross_os}ec2-imds-user-data-client -Requires: %{_cross_os}ec2-imds-user-data-provider -Requires: %{_cross_os}vmware-cd-rom-user-data-client -Requires: %{_cross_os}vmware-cd-rom-user-data-provider -Requires: %{_cross_os}vmware-guestinfo-user-data-client -Requires: %{_cross_os}vmware-guestinfo-user-data-provider - -%description -%{summary}. - -# AWS's user data source ordering is as follows: -# - local defaults file -# - local user data file -# - EC2 instance identity doc -# - EC2 IMDS -# - local overrides file -%package -n %{_cross_os}aws-data-providers -Summary: User data providers for AWS variants -Requires: %{_cross_os}local-defaults-user-data-client -Requires: %{_cross_os}local-defaults-user-data-provider -Requires: %{_cross_os}local-user-data-client -Requires: %{_cross_os}local-user-data-provider -Requires: %{_cross_os}ec2-identity-doc-user-data-client -Requires: %{_cross_os}ec2-identity-doc-user-data-provider -Requires: %{_cross_os}ec2-imds-user-data-client -Requires: %{_cross_os}ec2-imds-user-data-provider -Requires: %{_cross_os}local-overrides-user-data-client -Requires: %{_cross_os}local-overrides-user-data-provider -%description -n %{_cross_os}aws-data-providers -%{summary}. - -# VMware's user data source ordering is as follows: -# - local defaults file -# - local user data file -# - CD-ROM OVF -# - guestinfo interface -# - local overrides file -%package -n %{_cross_os}vmware-data-providers -Summary: User data providers for VMware variants -Requires: %{_cross_os}local-defaults-user-data-client -Requires: %{_cross_os}local-defaults-user-data-provider -Requires: %{_cross_os}local-user-data-client -Requires: %{_cross_os}local-user-data-provider -Requires: %{_cross_os}vmware-cd-rom-user-data-client -Requires: %{_cross_os}vmware-cd-rom-user-data-provider -Requires: %{_cross_os}vmware-guestinfo-user-data-client -Requires: %{_cross_os}vmware-guestinfo-user-data-provider -Requires: %{_cross_os}local-overrides-user-data-client -Requires: %{_cross_os}local-overrides-user-data-provider -%description -n %{_cross_os}vmware-data-providers -%{summary}. - -# Metal user data source ordering is as follows: -# - local defaults file -# - local user data file -# - local overrides file -%package -n %{_cross_os}metal-data-providers -Summary: User data providers for metal variants -Requires: %{_cross_os}local-defaults-user-data-client -Requires: %{_cross_os}local-defaults-user-data-provider -Requires: %{_cross_os}local-user-data-client -Requires: %{_cross_os}local-user-data-provider -Requires: %{_cross_os}local-overrides-user-data-client -Requires: %{_cross_os}local-overrides-user-data-provider -%description -n %{_cross_os}metal-data-providers -%{summary}. - -%prep -%setup -T -c -%build -%install -%files -n %{_cross_os}aws-data-providers -%files -n %{_cross_os}vmware-data-providers -%files -n %{_cross_os}metal-data-providers diff --git a/packages/early-boot-config-vmware-cd-rom/Cargo.toml b/packages/early-boot-config-vmware-cd-rom/Cargo.toml deleted file mode 100644 index aceb1fde738..00000000000 --- a/packages/early-boot-config-vmware-cd-rom/Cargo.toml +++ /dev/null @@ -1,21 +0,0 @@ -[package] -name = "early-boot-config-vmware-cd-rom" -version = "0.1.0" -edition = "2021" -publish = false -build = "../build.rs" - -[lib] -path = "../packages.rs" - -[package.metadata.build-package] -source-groups = [ - "api/early-boot-config", -] - -# RPM BuildRequires -[build-dependencies] -glibc = { path = "../glibc" } - -# RPM Requires -[dependencies] diff --git a/packages/early-boot-config-vmware-cd-rom/early-boot-config-vmware-cd-rom.spec b/packages/early-boot-config-vmware-cd-rom/early-boot-config-vmware-cd-rom.spec deleted file mode 100644 index 19d4f002572..00000000000 --- a/packages/early-boot-config-vmware-cd-rom/early-boot-config-vmware-cd-rom.spec +++ /dev/null @@ -1,54 +0,0 @@ -%global _cross_first_party 1 -%undefine _debugsource_packages - -%global user_data_provider vmware-cd-rom - -Name: %{_cross_os}early-boot-config-%{user_data_provider} -Version: 0.0 -Release: 0%{?dist} -Summary: %{user_data_provider}-provider -License: Apache-2.0 OR MIT -URL: https://github.com/bottlerocket-os/bottlerocket - -BuildRequires: %{_cross_os}glibc-devel - -%description -%{summary}. - -# Includes just the user data provider binary -%package -n %{_cross_os}vmware-cd-rom-user-data-client -Summary: VMware CD-ROM user data client -%description -n %{_cross_os}vmware-cd-rom-user-data-client -%{summary}. - -# Symlinks the binary to the appropriate .d directory as 30- -%package -n %{_cross_os}vmware-cd-rom-user-data-provider -Summary: VMware CD-ROM user data provider config -%description -n %{_cross_os}vmware-cd-rom-user-data-provider -%{summary}. - -%prep -%setup -T -c -%cargo_prep - -%build -%cargo_build --manifest-path %{_builddir}/sources/Cargo.toml \ - -p early-boot-config --bin %{user_data_provider}-provider - -%install -install -d %{buildroot}%{_cross_libexecdir}/early-boot-config/bin -install -p -m 0755 \ - ${HOME}/.cache/%{__cargo_target}/release/%{user_data_provider}-provider \ - %{buildroot}%{_cross_libexecdir}/early-boot-config/bin - -install -d %{buildroot}%{_cross_datadir}/early-boot-config/data-providers.d -ln -sf \ - ../../../libexec/early-boot-config/bin/%{user_data_provider}-provider \ - %{buildroot}%{_cross_datadir}/early-boot-config/data-providers.d/30-%{user_data_provider} - - -%files -n %{_cross_os}vmware-cd-rom-user-data-client -%{_cross_libexecdir}/early-boot-config/bin/%{user_data_provider}-provider - -%files -n %{_cross_os}vmware-cd-rom-user-data-provider -%{_cross_datadir}/early-boot-config/data-providers.d/30-%{user_data_provider} diff --git a/packages/early-boot-config-vmware-guestinfo/Cargo.toml b/packages/early-boot-config-vmware-guestinfo/Cargo.toml deleted file mode 100644 index 28d9b602b5a..00000000000 --- a/packages/early-boot-config-vmware-guestinfo/Cargo.toml +++ /dev/null @@ -1,21 +0,0 @@ -[package] -name = "early-boot-config-vmware-guestinfo" -version = "0.1.0" -edition = "2021" -publish = false -build = "../build.rs" - -[lib] -path = "../packages.rs" - -[package.metadata.build-package] -source-groups = [ - "api/early-boot-config", -] - -# RPM BuildRequires -[build-dependencies] -glibc = { path = "../glibc" } - -# RPM Requires -[dependencies] diff --git a/packages/early-boot-config-vmware-guestinfo/early-boot-config-vmware-guestinfo.spec b/packages/early-boot-config-vmware-guestinfo/early-boot-config-vmware-guestinfo.spec deleted file mode 100644 index 8d4a95a324f..00000000000 --- a/packages/early-boot-config-vmware-guestinfo/early-boot-config-vmware-guestinfo.spec +++ /dev/null @@ -1,54 +0,0 @@ -%global _cross_first_party 1 -%undefine _debugsource_packages - -%global user_data_provider vmware-guestinfo - -Name: %{_cross_os}early-boot-confi-%{user_data_provider} -Version: 0.0 -Release: 0%{?dist} -Summary: %{user_data_provider}-provider -License: Apache-2.0 OR MIT -URL: https://github.com/bottlerocket-os/bottlerocket - -BuildRequires: %{_cross_os}glibc-devel - -%description -%{summary}. - -# Includes just the user data provider binary -%package -n %{_cross_os}vmware-guestinfo-user-data-client -Summary: VMWare guestinfo user data client -%description -n %{_cross_os}vmware-guestinfo-user-data-client -%{summary}. - -# Symlinks the binary to the appropriate .d directory as 40- -%package -n %{_cross_os}vmware-guestinfo-user-data-provider -Summary: VMWare guestinfo user data provider config -%description -n %{_cross_os}vmware-guestinfo-user-data-provider -%{summary}. - -%prep -%setup -T -c -%cargo_prep - -%build -%cargo_build --manifest-path %{_builddir}/sources/Cargo.toml \ - -p early-boot-config --bin %{user_data_provider}-provider - -%install -install -d %{buildroot}%{_cross_libexecdir}/early-boot-config/bin -install -p -m 0755 \ - ${HOME}/.cache/%{__cargo_target}/release/%{user_data_provider}-provider \ - %{buildroot}%{_cross_libexecdir}/early-boot-config/bin - -install -d %{buildroot}%{_cross_datadir}/early-boot-config/data-providers.d -ln -sf \ - ../../../libexec/early-boot-config/bin/%{user_data_provider}-provider \ - %{buildroot}%{_cross_datadir}/early-boot-config/data-providers.d/40-%{user_data_provider} - - -%files -n %{_cross_os}vmware-guestinfo-user-data-client -%{_cross_libexecdir}/early-boot-config/bin/%{user_data_provider}-provider - -%files -n %{_cross_os}vmware-guestinfo-user-data-provider -%{_cross_datadir}/early-boot-config/data-providers.d/40-%{user_data_provider} diff --git a/packages/early-boot-config/early-boot-config.spec b/packages/early-boot-config/early-boot-config.spec index a527eb8da21..5f39f126332 100644 --- a/packages/early-boot-config/early-boot-config.spec +++ b/packages/early-boot-config/early-boot-config.spec @@ -15,13 +15,64 @@ BuildRequires: %{_cross_os}glibc-devel %description %{summary}. +%package -n %{_cross_os}early-boot-config-common +Summary: early-boot-config binary +%description -n %{_cross_os}early-boot-config-common +%{summary}. + +%package -n %{_cross_os}early-boot-config-data-providers +Summary: early-boot-config data providers directory +%description -n %{_cross_os}early-boot-config-data-providers +%{summary}. + +%package -n %{_cross_os}early-boot-config-local +Summary: local-provider +Requires: %{_cross_os}early-boot-config-data-providers +%description -n %{_cross_os}early-boot-config-local +%{summary}. + +%package -n %{_cross_os}early-boot-config-aws +Summary: early-boot-config package for AWS +Provides: %{_cross_os}early-boot-config +Requires: %{_cross_os}early-boot-config-common +Requires: %{_cross_os}early-boot-config-data-providers +Requires: %{_cross_os}early-boot-config-local +%description -n %{_cross_os}early-boot-config-aws +%{summary}. + +%package -n %{_cross_os}early-boot-config-vmware +Summary: early-boot-config package for vmware +Provides: %{_cross_os}early-boot-config +Requires: %{_cross_os}early-boot-config-common +Requires: %{_cross_os}early-boot-config-data-providers +Requires: %{_cross_os}early-boot-config-local +%description -n %{_cross_os}early-boot-config-vmware +%{summary}. + +%package -n %{_cross_os}early-boot-config-metal +Summary: early-boot-config package for metal +Provides: %{_cross_os}early-boot-config +Requires: %{_cross_os}early-boot-config-common +Requires: %{_cross_os}early-boot-config-data-providers +Requires: %{_cross_os}early-boot-config-local +%description -n %{_cross_os}early-boot-config-metal +%{summary}. + %prep %setup -T -c %cargo_prep %build %cargo_build --manifest-path %{_builddir}/sources/Cargo.toml \ - -p early-boot-config --bin early-boot-config + -p early-boot-config \ + --bin early-boot-config \ + --bin ec2-identity-doc-provider \ + --bin ec2-imds-provider \ + --bin local-user-data-provider \ + --bin local-defaults-provider \ + --bin local-overrides-provider \ + --bin vmware-cd-rom-provider \ + --bin vmware-guestinfo-provider %install install -d %{buildroot}%{_cross_bindir} @@ -30,7 +81,50 @@ install -p -m 0755 ${HOME}/.cache/%{__cargo_target}/release/early-boot-config %{ install -d %{buildroot}%{_cross_unitdir} install -p -m 0644 %{S:100} %{buildroot}%{_cross_unitdir} +install -d %{buildroot}%{_cross_libexecdir}/early-boot-config/bin +install -p -m 0755 \ + ${HOME}/.cache/%{__cargo_target}/release/ec2-identity-doc-provider \ + ${HOME}/.cache/%{__cargo_target}/release/ec2-imds-provider \ + ${HOME}/.cache/%{__cargo_target}/release/local-user-data-provider \ + ${HOME}/.cache/%{__cargo_target}/release/local-defaults-provider \ + ${HOME}/.cache/%{__cargo_target}/release/local-overrides-provider \ + ${HOME}/.cache/%{__cargo_target}/release/vmware-cd-rom-provider \ + ${HOME}/.cache/%{__cargo_target}/release/vmware-guestinfo-provider \ + %{buildroot}%{_cross_libexecdir}/early-boot-config/bin + +install -d %{buildroot}%{_cross_datadir}/early-boot-config/data-providers.d + +%post -n %{_cross_os}early-boot-config-aws -p +posix.symlink("../../../libexec/early-boot-config/bin/ec2-identity-doc-provider", "%{_cross_datadir}/early-boot-config/data-providers.d/30-ec2-identity-doc") +posix.symlink("../../../libexec/early-boot-config/bin/ec2-imds-provider", "%{_cross_datadir}/early-boot-config/data-providers.d/40-ec2-imds") + +%post -n %{_cross_os}early-boot-config-local -p +posix.symlink("../../../libexec/early-boot-config/bin/local-user-data-provider", "%{_cross_datadir}/early-boot-config/data-providers.d/20-local-user-data") +posix.symlink("../../../libexec/early-boot-config/bin/local-defaults-provider", "%{_cross_datadir}/early-boot-config/data-providers.d/10-local-defaults") +posix.symlink("../../../libexec/early-boot-config/bin/local-overrides-provider", "%{_cross_datadir}/early-boot-config/data-providers.d/50-local-overrides") + +%post -n %{_cross_os}early-boot-config-vmware -p +posix.symlink("../../../libexec/early-boot-config/bin/vmware-cd-rom-provider", "%{_cross_datadir}/early-boot-config/data-providers.d/30-vmware-cd-rom") +posix.symlink("../../../libexec/early-boot-config/bin/vmware-guestinfo-provider", "%{_cross_datadir}/early-boot-config/data-providers.d/40-vmware-guestinfo") -%files +%files -n %{_cross_os}early-boot-config-common %{_cross_bindir}/early-boot-config %{_cross_unitdir}/early-boot-config.service + +%files -n %{_cross_os}early-boot-config-data-providers +%dir %{_cross_datadir}/early-boot-config/data-providers.d + +%files -n %{_cross_os}early-boot-config-local +%{_cross_libexecdir}/early-boot-config/bin/local-user-data-provider +%{_cross_libexecdir}/early-boot-config/bin/local-defaults-provider +%{_cross_libexecdir}/early-boot-config/bin/local-overrides-provider + +%files -n %{_cross_os}early-boot-config-aws +%{_cross_libexecdir}/early-boot-config/bin/ec2-identity-doc-provider +%{_cross_libexecdir}/early-boot-config/bin/ec2-imds-provider + +%files -n %{_cross_os}early-boot-config-vmware +%{_cross_libexecdir}/early-boot-config/bin/vmware-cd-rom-provider +%{_cross_libexecdir}/early-boot-config/bin/vmware-guestinfo-provider + +%files -n %{_cross_os}early-boot-config-metal From 23667e52714e8e1df87db8689cbe3cd39987c2fa Mon Sep 17 00:00:00 2001 From: Sam Berning Date: Fri, 23 Feb 2024 23:10:36 +0000 Subject: [PATCH 26/41] variants: use new early-boot-config in all variants Signed-off-by: Sam Berning --- variants/Cargo.lock | 220 +----------------------- variants/aws-dev/Cargo.toml | 11 +- variants/aws-ecs-1-nvidia/Cargo.toml | 11 +- variants/aws-ecs-1/Cargo.toml | 11 +- variants/aws-ecs-2-nvidia/Cargo.toml | 11 +- variants/aws-ecs-2/Cargo.toml | 11 +- variants/aws-k8s-1.23-nvidia/Cargo.toml | 11 +- variants/aws-k8s-1.23/Cargo.toml | 11 +- variants/aws-k8s-1.24-nvidia/Cargo.toml | 11 +- variants/aws-k8s-1.24/Cargo.toml | 11 +- variants/aws-k8s-1.25-nvidia/Cargo.toml | 11 +- variants/aws-k8s-1.25/Cargo.toml | 11 +- variants/aws-k8s-1.26-nvidia/Cargo.toml | 11 +- variants/aws-k8s-1.26/Cargo.toml | 11 +- variants/aws-k8s-1.27-nvidia/Cargo.toml | 11 +- variants/aws-k8s-1.27/Cargo.toml | 11 +- variants/aws-k8s-1.28-nvidia/Cargo.toml | 11 +- variants/aws-k8s-1.28/Cargo.toml | 11 +- variants/aws-k8s-1.29-nvidia/Cargo.toml | 2 + variants/aws-k8s-1.29/Cargo.toml | 2 + variants/metal-dev/Cargo.toml | 9 +- variants/metal-k8s-1.25/Cargo.toml | 9 +- variants/metal-k8s-1.26/Cargo.toml | 9 +- variants/metal-k8s-1.27/Cargo.toml | 9 +- variants/metal-k8s-1.28/Cargo.toml | 9 +- variants/metal-k8s-1.29/Cargo.toml | 9 +- variants/vmware-dev/Cargo.toml | 11 +- variants/vmware-k8s-1.25/Cargo.toml | 11 +- variants/vmware-k8s-1.26/Cargo.toml | 11 +- variants/vmware-k8s-1.27/Cargo.toml | 11 +- variants/vmware-k8s-1.28/Cargo.toml | 11 +- variants/vmware-k8s-1.29/Cargo.toml | 11 +- 32 files changed, 64 insertions(+), 467 deletions(-) diff --git a/variants/Cargo.lock b/variants/Cargo.lock index dde5d93facc..5fd9b58d2d9 100644 --- a/variants/Cargo.lock +++ b/variants/Cargo.lock @@ -25,12 +25,6 @@ dependencies = [ "docker-engine", "docker-init", "early-boot-config", - "early-boot-config-ec2-identity-doc", - "early-boot-config-ec2-imds", - "early-boot-config-local", - "early-boot-config-local-defaults", - "early-boot-config-local-overrides", - "early-boot-config-providers", "iputils", "kernel-6_1", "login", @@ -46,12 +40,6 @@ dependencies = [ "docker-engine", "docker-init", "early-boot-config", - "early-boot-config-ec2-identity-doc", - "early-boot-config-ec2-imds", - "early-boot-config-local", - "early-boot-config-local-defaults", - "early-boot-config-local-overrides", - "early-boot-config-providers", "ecs-agent", "kernel-5_10", "release", @@ -65,12 +53,6 @@ dependencies = [ "docker-engine", "docker-init", "early-boot-config", - "early-boot-config-ec2-identity-doc", - "early-boot-config-ec2-imds", - "early-boot-config-local", - "early-boot-config-local-defaults", - "early-boot-config-local-overrides", - "early-boot-config-providers", "ecs-agent", "ecs-gpu-init", "kernel-5_10", @@ -87,12 +69,6 @@ dependencies = [ "docker-engine", "docker-init", "early-boot-config", - "early-boot-config-ec2-identity-doc", - "early-boot-config-ec2-imds", - "early-boot-config-local", - "early-boot-config-local-defaults", - "early-boot-config-local-overrides", - "early-boot-config-providers", "ecs-agent", "kernel-6_1", "release", @@ -106,12 +82,6 @@ dependencies = [ "docker-engine", "docker-init", "early-boot-config", - "early-boot-config-ec2-identity-doc", - "early-boot-config-ec2-imds", - "early-boot-config-local", - "early-boot-config-local-defaults", - "early-boot-config-local-overrides", - "early-boot-config-providers", "ecs-agent", "ecs-gpu-init", "kernel-6_1", @@ -135,12 +105,6 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", - "early-boot-config-ec2-identity-doc", - "early-boot-config-ec2-imds", - "early-boot-config-local", - "early-boot-config-local-defaults", - "early-boot-config-local-overrides", - "early-boot-config-providers", "kernel-5_10", "kubernetes-1_23", "release", @@ -154,12 +118,6 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", - "early-boot-config-ec2-identity-doc", - "early-boot-config-ec2-imds", - "early-boot-config-local", - "early-boot-config-local-defaults", - "early-boot-config-local-overrides", - "early-boot-config-providers", "kernel-5_10", "kmod-5_10-nvidia", "kubernetes-1_23", @@ -176,12 +134,6 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", - "early-boot-config-ec2-identity-doc", - "early-boot-config-ec2-imds", - "early-boot-config-local", - "early-boot-config-local-defaults", - "early-boot-config-local-overrides", - "early-boot-config-providers", "kernel-5_15", "kubernetes-1_24", "release", @@ -195,12 +147,6 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", - "early-boot-config-ec2-identity-doc", - "early-boot-config-ec2-imds", - "early-boot-config-local", - "early-boot-config-local-defaults", - "early-boot-config-local-overrides", - "early-boot-config-providers", "kernel-5_15", "kmod-5_15-nvidia", "kubernetes-1_24", @@ -217,12 +163,6 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", - "early-boot-config-ec2-identity-doc", - "early-boot-config-ec2-imds", - "early-boot-config-local", - "early-boot-config-local-defaults", - "early-boot-config-local-overrides", - "early-boot-config-providers", "kernel-5_15", "kubernetes-1_25", "release", @@ -236,12 +176,6 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", - "early-boot-config-ec2-identity-doc", - "early-boot-config-ec2-imds", - "early-boot-config-local", - "early-boot-config-local-defaults", - "early-boot-config-local-overrides", - "early-boot-config-providers", "kernel-5_15", "kmod-5_15-nvidia", "kubernetes-1_25", @@ -258,12 +192,6 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", - "early-boot-config-ec2-identity-doc", - "early-boot-config-ec2-imds", - "early-boot-config-local", - "early-boot-config-local-defaults", - "early-boot-config-local-overrides", - "early-boot-config-providers", "kernel-5_15", "kubernetes-1_26", "release", @@ -277,12 +205,6 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", - "early-boot-config-ec2-identity-doc", - "early-boot-config-ec2-imds", - "early-boot-config-local", - "early-boot-config-local-defaults", - "early-boot-config-local-overrides", - "early-boot-config-providers", "kernel-5_15", "kmod-5_15-nvidia", "kubernetes-1_26", @@ -299,12 +221,6 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", - "early-boot-config-ec2-identity-doc", - "early-boot-config-ec2-imds", - "early-boot-config-local", - "early-boot-config-local-defaults", - "early-boot-config-local-overrides", - "early-boot-config-providers", "kernel-5_15", "kubernetes-1_27", "release", @@ -318,12 +234,6 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", - "early-boot-config-ec2-identity-doc", - "early-boot-config-ec2-imds", - "early-boot-config-local", - "early-boot-config-local-defaults", - "early-boot-config-local-overrides", - "early-boot-config-providers", "kernel-5_15", "kmod-5_15-nvidia", "kubernetes-1_27", @@ -340,12 +250,6 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", - "early-boot-config-ec2-identity-doc", - "early-boot-config-ec2-imds", - "early-boot-config-local", - "early-boot-config-local-defaults", - "early-boot-config-local-overrides", - "early-boot-config-providers", "kernel-6_1", "kubernetes-1_28", "release", @@ -359,12 +263,6 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", - "early-boot-config-ec2-identity-doc", - "early-boot-config-ec2-imds", - "early-boot-config-local", - "early-boot-config-local-defaults", - "early-boot-config-local-overrides", - "early-boot-config-providers", "kernel-6_1", "kmod-6_1-nvidia", "kubernetes-1_28", @@ -380,6 +278,7 @@ dependencies = [ "aws-iam-authenticator", "cni", "cni-plugins", + "early-boot-config", "kernel-6_1", "kubernetes-1_29", "release", @@ -392,6 +291,7 @@ dependencies = [ "aws-iam-authenticator", "cni", "cni-plugins", + "early-boot-config", "kernel-6_1", "kmod-6_1-nvidia", "kubernetes-1_29", @@ -562,62 +462,6 @@ dependencies = [ "glibc", ] -[[package]] -name = "early-boot-config-ec2-identity-doc" -version = "0.1.0" -dependencies = [ - "glibc", -] - -[[package]] -name = "early-boot-config-ec2-imds" -version = "0.1.0" -dependencies = [ - "glibc", -] - -[[package]] -name = "early-boot-config-local" -version = "0.1.0" -dependencies = [ - "glibc", -] - -[[package]] -name = "early-boot-config-local-defaults" -version = "0.1.0" -dependencies = [ - "glibc", -] - -[[package]] -name = "early-boot-config-local-overrides" -version = "0.1.0" -dependencies = [ - "glibc", -] - -[[package]] -name = "early-boot-config-providers" -version = "0.1.0" -dependencies = [ - "glibc", -] - -[[package]] -name = "early-boot-config-vmware-cd-rom" -version = "0.1.0" -dependencies = [ - "glibc", -] - -[[package]] -name = "early-boot-config-vmware-guestinfo" -version = "0.1.0" -dependencies = [ - "glibc", -] - [[package]] name = "ecr-credential-provider" version = "0.1.0" @@ -1157,10 +1001,6 @@ dependencies = [ "docker-engine", "docker-init", "early-boot-config", - "early-boot-config-local", - "early-boot-config-local-defaults", - "early-boot-config-local-overrides", - "early-boot-config-providers", "iputils", "kernel-6_1", "linux-firmware", @@ -1177,10 +1017,6 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", - "early-boot-config-local", - "early-boot-config-local-defaults", - "early-boot-config-local-overrides", - "early-boot-config-providers", "kernel-5_15", "kubernetes-1_25", "linux-firmware", @@ -1195,10 +1031,6 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", - "early-boot-config-local", - "early-boot-config-local-defaults", - "early-boot-config-local-overrides", - "early-boot-config-providers", "kernel-5_15", "kubernetes-1_26", "linux-firmware", @@ -1213,10 +1045,6 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", - "early-boot-config-local", - "early-boot-config-local-defaults", - "early-boot-config-local-overrides", - "early-boot-config-providers", "kernel-5_15", "kubernetes-1_27", "linux-firmware", @@ -1231,10 +1059,6 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", - "early-boot-config-local", - "early-boot-config-local-defaults", - "early-boot-config-local-overrides", - "early-boot-config-providers", "kernel-6_1", "kubernetes-1_28", "release", @@ -1248,10 +1072,6 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", - "early-boot-config-local", - "early-boot-config-local-defaults", - "early-boot-config-local-overrides", - "early-boot-config-providers", "kernel-6_1", "kubernetes-1_29", "release", @@ -1432,12 +1252,6 @@ dependencies = [ "docker-engine", "docker-init", "early-boot-config", - "early-boot-config-local", - "early-boot-config-local-defaults", - "early-boot-config-local-overrides", - "early-boot-config-providers", - "early-boot-config-vmware-cd-rom", - "early-boot-config-vmware-guestinfo", "iputils", "kernel-6_1", "login", @@ -1453,12 +1267,6 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", - "early-boot-config-local", - "early-boot-config-local-defaults", - "early-boot-config-local-overrides", - "early-boot-config-providers", - "early-boot-config-vmware-cd-rom", - "early-boot-config-vmware-guestinfo", "kernel-5_15", "kubernetes-1_25", "open-vm-tools", @@ -1472,12 +1280,6 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", - "early-boot-config-local", - "early-boot-config-local-defaults", - "early-boot-config-local-overrides", - "early-boot-config-providers", - "early-boot-config-vmware-cd-rom", - "early-boot-config-vmware-guestinfo", "kernel-5_15", "kubernetes-1_26", "open-vm-tools", @@ -1491,12 +1293,6 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", - "early-boot-config-local", - "early-boot-config-local-defaults", - "early-boot-config-local-overrides", - "early-boot-config-providers", - "early-boot-config-vmware-cd-rom", - "early-boot-config-vmware-guestinfo", "kernel-5_15", "kubernetes-1_27", "open-vm-tools", @@ -1510,12 +1306,6 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", - "early-boot-config-local", - "early-boot-config-local-defaults", - "early-boot-config-local-overrides", - "early-boot-config-providers", - "early-boot-config-vmware-cd-rom", - "early-boot-config-vmware-guestinfo", "kernel-6_1", "kubernetes-1_28", "open-vm-tools", @@ -1529,12 +1319,6 @@ dependencies = [ "cni", "cni-plugins", "early-boot-config", - "early-boot-config-local", - "early-boot-config-local-defaults", - "early-boot-config-local-overrides", - "early-boot-config-providers", - "early-boot-config-vmware-cd-rom", - "early-boot-config-vmware-guestinfo", "kernel-6_1", "kubernetes-1_29", "open-vm-tools", diff --git a/variants/aws-dev/Cargo.toml b/variants/aws-dev/Cargo.toml index b8b606ddaeb..9f6f0172c2a 100644 --- a/variants/aws-dev/Cargo.toml +++ b/variants/aws-dev/Cargo.toml @@ -26,10 +26,9 @@ kernel-parameters = [ ] included-packages = [ # core - "early-boot-config", + "early-boot-config-aws", "release", "kernel-6.1", - "aws-data-providers", # docker "docker-cli", "docker-engine", @@ -46,14 +45,8 @@ path = "../variants.rs" [build-dependencies] # core -early-boot-config = { path = "../../packages/early-boot-config" } -early-boot-config-ec2-identity-doc = { path = "../../packages/early-boot-config-ec2-identity-doc" } -early-boot-config-ec2-imds = { path = "../../packages/early-boot-config-ec2-imds" } -early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } -early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } -early-boot-config-local = { path = "../../packages/early-boot-config-local" } -early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } release = { path = "../../packages/release" } +early-boot-config = { path = "../../packages/early-boot-config" } kernel-6_1 = { path = "../../packages/kernel-6.1" } # docker docker-cli = { path = "../../packages/docker-cli" } diff --git a/variants/aws-ecs-1-nvidia/Cargo.toml b/variants/aws-ecs-1-nvidia/Cargo.toml index 5bf6c677065..d58ad538e31 100644 --- a/variants/aws-ecs-1-nvidia/Cargo.toml +++ b/variants/aws-ecs-1-nvidia/Cargo.toml @@ -18,10 +18,9 @@ kernel-parameters = [ ] included-packages = [ # core - "early-boot-config", + "early-boot-config-aws", "release", "kernel-5.10", - "aws-data-providers", # docker "docker-cli", "docker-engine", @@ -39,14 +38,8 @@ path = "../variants.rs" [build-dependencies] # core -early-boot-config = { path = "../../packages/early-boot-config" } -early-boot-config-ec2-identity-doc = { path = "../../packages/early-boot-config-ec2-identity-doc" } -early-boot-config-ec2-imds = { path = "../../packages/early-boot-config-ec2-imds" } -early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } -early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } -early-boot-config-local = { path = "../../packages/early-boot-config-local" } -early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } release = { path = "../../packages/release" } +early-boot-config = { path = "../../packages/early-boot-config" } kernel-5_10 = { path = "../../packages/kernel-5.10" } # docker docker-cli = { path = "../../packages/docker-cli" } diff --git a/variants/aws-ecs-1/Cargo.toml b/variants/aws-ecs-1/Cargo.toml index 10f26981e39..24e3d3303c0 100644 --- a/variants/aws-ecs-1/Cargo.toml +++ b/variants/aws-ecs-1/Cargo.toml @@ -15,10 +15,9 @@ kernel-parameters = [ ] included-packages = [ # core - "early-boot-config", + "early-boot-config-aws", "release", "kernel-5.10", - "aws-data-providers", # docker "docker-cli", "docker-engine", @@ -32,14 +31,8 @@ path = "../variants.rs" [build-dependencies] # core -early-boot-config = { path = "../../packages/early-boot-config" } -early-boot-config-ec2-identity-doc = { path = "../../packages/early-boot-config-ec2-identity-doc" } -early-boot-config-ec2-imds = { path = "../../packages/early-boot-config-ec2-imds" } -early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } -early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } -early-boot-config-local = { path = "../../packages/early-boot-config-local" } -early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } release = { path = "../../packages/release" } +early-boot-config = { path = "../../packages/early-boot-config" } kernel-5_10 = { path = "../../packages/kernel-5.10" } # docker docker-cli = { path = "../../packages/docker-cli" } diff --git a/variants/aws-ecs-2-nvidia/Cargo.toml b/variants/aws-ecs-2-nvidia/Cargo.toml index b18810aff99..cba049b55b5 100644 --- a/variants/aws-ecs-2-nvidia/Cargo.toml +++ b/variants/aws-ecs-2-nvidia/Cargo.toml @@ -18,10 +18,9 @@ os-image-size-gib = 4 [package.metadata.build-variant] included-packages = [ # core - "early-boot-config", + "early-boot-config-aws", "release", "kernel-6.1", - "aws-data-providers", # docker "docker-cli", "docker-engine", @@ -47,14 +46,8 @@ path = "../variants.rs" [build-dependencies] # core -early-boot-config = { path = "../../packages/early-boot-config" } -early-boot-config-ec2-identity-doc = { path = "../../packages/early-boot-config-ec2-identity-doc" } -early-boot-config-ec2-imds = { path = "../../packages/early-boot-config-ec2-imds" } -early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } -early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } -early-boot-config-local = { path = "../../packages/early-boot-config-local" } -early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } release = { path = "../../packages/release" } +early-boot-config = { path = "../../packages/early-boot-config" } kernel-6_1 = { path = "../../packages/kernel-6.1" } # docker docker-cli = { path = "../../packages/docker-cli" } diff --git a/variants/aws-ecs-2/Cargo.toml b/variants/aws-ecs-2/Cargo.toml index 914c54e59a3..7feeeba9c92 100644 --- a/variants/aws-ecs-2/Cargo.toml +++ b/variants/aws-ecs-2/Cargo.toml @@ -17,10 +17,9 @@ systemd-networkd = true [package.metadata.build-variant] included-packages = [ # core - "early-boot-config", + "early-boot-config-aws", "release", "kernel-6.1", - "aws-data-providers", # docker "docker-cli", "docker-engine", @@ -41,14 +40,8 @@ path = "../variants.rs" [build-dependencies] # core -early-boot-config = { path = "../../packages/early-boot-config" } -early-boot-config-ec2-identity-doc = { path = "../../packages/early-boot-config-ec2-identity-doc" } -early-boot-config-ec2-imds = { path = "../../packages/early-boot-config-ec2-imds" } -early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } -early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } -early-boot-config-local = { path = "../../packages/early-boot-config-local" } -early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } release = { path = "../../packages/release" } +early-boot-config = { path = "../../packages/early-boot-config" } kernel-6_1 = { path = "../../packages/kernel-6.1" } # docker docker-cli = { path = "../../packages/docker-cli" } diff --git a/variants/aws-k8s-1.23-nvidia/Cargo.toml b/variants/aws-k8s-1.23-nvidia/Cargo.toml index 224d5c54804..c4bcd82847c 100644 --- a/variants/aws-k8s-1.23-nvidia/Cargo.toml +++ b/variants/aws-k8s-1.23-nvidia/Cargo.toml @@ -17,11 +17,10 @@ grub-set-private-var = true [package.metadata.build-variant] included-packages = [ - "aws-data-providers", "aws-iam-authenticator", "cni", "cni-plugins", - "early-boot-config", + "early-boot-config-aws", "kernel-5.10", "kubelet-1.23", "release", @@ -44,16 +43,10 @@ path = "../variants.rs" aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } -early-boot-config = { path = "../../packages/early-boot-config" } -early-boot-config-ec2-identity-doc = { path = "../../packages/early-boot-config-ec2-identity-doc" } -early-boot-config-ec2-imds = { path = "../../packages/early-boot-config-ec2-imds" } -early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } -early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } -early-boot-config-local = { path = "../../packages/early-boot-config-local" } -early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } kernel-5_10 = { path = "../../packages/kernel-5.10" } kubernetes-1_23 = { path = "../../packages/kubernetes-1.23" } release = { path = "../../packages/release" } +early-boot-config = { path = "../../packages/early-boot-config" } nvidia-container-toolkit = { path = "../../packages/nvidia-container-toolkit" } nvidia-k8s-device-plugin = { path = "../../packages/nvidia-k8s-device-plugin" } kmod-5_10-nvidia = { path = "../../packages/kmod-5.10-nvidia" } diff --git a/variants/aws-k8s-1.23/Cargo.toml b/variants/aws-k8s-1.23/Cargo.toml index 4faff4d5811..dbb8a141076 100644 --- a/variants/aws-k8s-1.23/Cargo.toml +++ b/variants/aws-k8s-1.23/Cargo.toml @@ -14,11 +14,10 @@ grub-set-private-var = true [package.metadata.build-variant] included-packages = [ - "aws-data-providers", "aws-iam-authenticator", "cni", "cni-plugins", - "early-boot-config", + "early-boot-config-aws", "kernel-5.10", "kubelet-1.23", "release", @@ -38,13 +37,7 @@ path = "../variants.rs" aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } -early-boot-config = { path = "../../packages/early-boot-config" } -early-boot-config-ec2-identity-doc = { path = "../../packages/early-boot-config-ec2-identity-doc" } -early-boot-config-ec2-imds = { path = "../../packages/early-boot-config-ec2-imds" } -early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } -early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } -early-boot-config-local = { path = "../../packages/early-boot-config-local" } -early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } kernel-5_10 = { path = "../../packages/kernel-5.10" } kubernetes-1_23= { path = "../../packages/kubernetes-1.23" } release = { path = "../../packages/release" } +early-boot-config = { path = "../../packages/early-boot-config" } diff --git a/variants/aws-k8s-1.24-nvidia/Cargo.toml b/variants/aws-k8s-1.24-nvidia/Cargo.toml index 95c7bdd44ff..433e21093bb 100644 --- a/variants/aws-k8s-1.24-nvidia/Cargo.toml +++ b/variants/aws-k8s-1.24-nvidia/Cargo.toml @@ -17,11 +17,10 @@ grub-set-private-var = true [package.metadata.build-variant] included-packages = [ - "aws-data-providers", "aws-iam-authenticator", "cni", "cni-plugins", - "early-boot-config", + "early-boot-config-aws", "kernel-5.15", "kubelet-1.24", "release", @@ -44,16 +43,10 @@ path = "../variants.rs" aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } -early-boot-config = { path = "../../packages/early-boot-config" } -early-boot-config-ec2-identity-doc = { path = "../../packages/early-boot-config-ec2-identity-doc" } -early-boot-config-ec2-imds = { path = "../../packages/early-boot-config-ec2-imds" } -early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } -early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } -early-boot-config-local = { path = "../../packages/early-boot-config-local" } -early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } kernel-5_15 = { path = "../../packages/kernel-5.15" } kubernetes-1_24 = { path = "../../packages/kubernetes-1.24" } release = { path = "../../packages/release" } +early-boot-config = { path = "../../packages/early-boot-config" } nvidia-container-toolkit = { path = "../../packages/nvidia-container-toolkit" } nvidia-k8s-device-plugin = { path = "../../packages/nvidia-k8s-device-plugin" } kmod-5_15-nvidia = { path = "../../packages/kmod-5.15-nvidia" } diff --git a/variants/aws-k8s-1.24/Cargo.toml b/variants/aws-k8s-1.24/Cargo.toml index 907101f8884..a4b0eed7ec1 100644 --- a/variants/aws-k8s-1.24/Cargo.toml +++ b/variants/aws-k8s-1.24/Cargo.toml @@ -14,11 +14,10 @@ grub-set-private-var = true [package.metadata.build-variant] included-packages = [ - "aws-data-providers", "aws-iam-authenticator", "cni", "cni-plugins", - "early-boot-config", + "early-boot-config-aws", "kernel-5.15", "kubelet-1.24", "release", @@ -38,13 +37,7 @@ path = "../variants.rs" aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } -early-boot-config = { path = "../../packages/early-boot-config" } -early-boot-config-ec2-identity-doc = { path = "../../packages/early-boot-config-ec2-identity-doc" } -early-boot-config-ec2-imds = { path = "../../packages/early-boot-config-ec2-imds" } -early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } -early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } -early-boot-config-local = { path = "../../packages/early-boot-config-local" } -early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } kernel-5_15 = { path = "../../packages/kernel-5.15" } kubernetes-1_24= { path = "../../packages/kubernetes-1.24" } release = { path = "../../packages/release" } +early-boot-config = { path = "../../packages/early-boot-config" } diff --git a/variants/aws-k8s-1.25-nvidia/Cargo.toml b/variants/aws-k8s-1.25-nvidia/Cargo.toml index 825833669ba..46813dd3f8d 100644 --- a/variants/aws-k8s-1.25-nvidia/Cargo.toml +++ b/variants/aws-k8s-1.25-nvidia/Cargo.toml @@ -17,11 +17,10 @@ grub-set-private-var = true [package.metadata.build-variant] included-packages = [ - "aws-data-providers", "aws-iam-authenticator", "cni", "cni-plugins", - "early-boot-config", + "early-boot-config-aws", "kernel-5.15", "kubelet-1.25", "release", @@ -44,16 +43,10 @@ path = "../variants.rs" aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } -early-boot-config = { path = "../../packages/early-boot-config" } -early-boot-config-ec2-identity-doc = { path = "../../packages/early-boot-config-ec2-identity-doc" } -early-boot-config-ec2-imds = { path = "../../packages/early-boot-config-ec2-imds" } -early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } -early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } -early-boot-config-local = { path = "../../packages/early-boot-config-local" } -early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } kernel-5_15 = { path = "../../packages/kernel-5.15" } kubernetes-1_25 = { path = "../../packages/kubernetes-1.25" } release = { path = "../../packages/release" } +early-boot-config = { path = "../../packages/early-boot-config" } nvidia-container-toolkit = { path = "../../packages/nvidia-container-toolkit" } nvidia-k8s-device-plugin = { path = "../../packages/nvidia-k8s-device-plugin" } kmod-5_15-nvidia = { path = "../../packages/kmod-5.15-nvidia" } diff --git a/variants/aws-k8s-1.25/Cargo.toml b/variants/aws-k8s-1.25/Cargo.toml index 1ef9b0636bd..437baa928d7 100644 --- a/variants/aws-k8s-1.25/Cargo.toml +++ b/variants/aws-k8s-1.25/Cargo.toml @@ -14,11 +14,10 @@ grub-set-private-var = true [package.metadata.build-variant] included-packages = [ - "aws-data-providers", "aws-iam-authenticator", "cni", "cni-plugins", - "early-boot-config", + "early-boot-config-aws", "kernel-5.15", "kubelet-1.25", "release", @@ -38,13 +37,7 @@ path = "../variants.rs" aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } -early-boot-config = { path = "../../packages/early-boot-config" } -early-boot-config-ec2-identity-doc = { path = "../../packages/early-boot-config-ec2-identity-doc" } -early-boot-config-ec2-imds = { path = "../../packages/early-boot-config-ec2-imds" } -early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } -early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } -early-boot-config-local = { path = "../../packages/early-boot-config-local" } -early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } kernel-5_15 = { path = "../../packages/kernel-5.15" } kubernetes-1_25 = { path = "../../packages/kubernetes-1.25" } release = { path = "../../packages/release" } +early-boot-config = { path = "../../packages/early-boot-config" } diff --git a/variants/aws-k8s-1.26-nvidia/Cargo.toml b/variants/aws-k8s-1.26-nvidia/Cargo.toml index 6119502c18a..eac05aa97be 100644 --- a/variants/aws-k8s-1.26-nvidia/Cargo.toml +++ b/variants/aws-k8s-1.26-nvidia/Cargo.toml @@ -18,11 +18,10 @@ unified-cgroup-hierarchy = true [package.metadata.build-variant] included-packages = [ - "aws-data-providers", "aws-iam-authenticator", "cni", "cni-plugins", - "early-boot-config", + "early-boot-config-aws", "kernel-5.15", "kubelet-1.26", "release", @@ -45,16 +44,10 @@ path = "../variants.rs" aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } -early-boot-config = { path = "../../packages/early-boot-config" } -early-boot-config-ec2-identity-doc = { path = "../../packages/early-boot-config-ec2-identity-doc" } -early-boot-config-ec2-imds = { path = "../../packages/early-boot-config-ec2-imds" } -early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } -early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } -early-boot-config-local = { path = "../../packages/early-boot-config-local" } -early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } kernel-5_15 = { path = "../../packages/kernel-5.15" } kubernetes-1_26 = { path = "../../packages/kubernetes-1.26" } release = { path = "../../packages/release" } +early-boot-config = { path = "../../packages/early-boot-config" } nvidia-container-toolkit = { path = "../../packages/nvidia-container-toolkit" } nvidia-k8s-device-plugin = { path = "../../packages/nvidia-k8s-device-plugin" } kmod-5_15-nvidia = { path = "../../packages/kmod-5.15-nvidia" } diff --git a/variants/aws-k8s-1.26/Cargo.toml b/variants/aws-k8s-1.26/Cargo.toml index 89cca808bb6..c7857aef34c 100644 --- a/variants/aws-k8s-1.26/Cargo.toml +++ b/variants/aws-k8s-1.26/Cargo.toml @@ -15,11 +15,10 @@ unified-cgroup-hierarchy = true [package.metadata.build-variant] included-packages = [ - "aws-data-providers", "aws-iam-authenticator", "cni", "cni-plugins", - "early-boot-config", + "early-boot-config-aws", "kernel-5.15", "kubelet-1.26", "release", @@ -39,13 +38,7 @@ path = "../variants.rs" aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } -early-boot-config = { path = "../../packages/early-boot-config" } -early-boot-config-ec2-identity-doc = { path = "../../packages/early-boot-config-ec2-identity-doc" } -early-boot-config-ec2-imds = { path = "../../packages/early-boot-config-ec2-imds" } -early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } -early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } -early-boot-config-local = { path = "../../packages/early-boot-config-local" } -early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } kernel-5_15 = { path = "../../packages/kernel-5.15" } kubernetes-1_26 = { path = "../../packages/kubernetes-1.26" } release = { path = "../../packages/release" } +early-boot-config = { path = "../../packages/early-boot-config" } diff --git a/variants/aws-k8s-1.27-nvidia/Cargo.toml b/variants/aws-k8s-1.27-nvidia/Cargo.toml index f7001cb208b..6fcb991ec68 100644 --- a/variants/aws-k8s-1.27-nvidia/Cargo.toml +++ b/variants/aws-k8s-1.27-nvidia/Cargo.toml @@ -18,11 +18,10 @@ unified-cgroup-hierarchy = true [package.metadata.build-variant] included-packages = [ - "aws-data-providers", "aws-iam-authenticator", "cni", "cni-plugins", - "early-boot-config", + "early-boot-config-aws", "kernel-5.15", "kubelet-1.27", "release", @@ -45,16 +44,10 @@ path = "../variants.rs" aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } -early-boot-config = { path = "../../packages/early-boot-config" } -early-boot-config-ec2-identity-doc = { path = "../../packages/early-boot-config-ec2-identity-doc" } -early-boot-config-ec2-imds = { path = "../../packages/early-boot-config-ec2-imds" } -early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } -early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } -early-boot-config-local = { path = "../../packages/early-boot-config-local" } -early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } kernel-5_15 = { path = "../../packages/kernel-5.15" } kubernetes-1_27 = { path = "../../packages/kubernetes-1.27" } release = { path = "../../packages/release" } +early-boot-config = { path = "../../packages/early-boot-config" } nvidia-container-toolkit = { path = "../../packages/nvidia-container-toolkit" } nvidia-k8s-device-plugin = { path = "../../packages/nvidia-k8s-device-plugin" } kmod-5_15-nvidia = { path = "../../packages/kmod-5.15-nvidia" } diff --git a/variants/aws-k8s-1.27/Cargo.toml b/variants/aws-k8s-1.27/Cargo.toml index a69859bc365..ec30f1dec1c 100644 --- a/variants/aws-k8s-1.27/Cargo.toml +++ b/variants/aws-k8s-1.27/Cargo.toml @@ -15,11 +15,10 @@ unified-cgroup-hierarchy = true [package.metadata.build-variant] included-packages = [ - "aws-data-providers", "aws-iam-authenticator", "cni", "cni-plugins", - "early-boot-config", + "early-boot-config-aws", "kernel-5.15", "kubelet-1.27", "release", @@ -39,13 +38,7 @@ path = "../variants.rs" aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } -early-boot-config = { path = "../../packages/early-boot-config" } -early-boot-config-ec2-identity-doc = { path = "../../packages/early-boot-config-ec2-identity-doc" } -early-boot-config-ec2-imds = { path = "../../packages/early-boot-config-ec2-imds" } -early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } -early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } -early-boot-config-local = { path = "../../packages/early-boot-config-local" } -early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } kernel-5_15 = { path = "../../packages/kernel-5.15" } kubernetes-1_27 = { path = "../../packages/kubernetes-1.27" } release = { path = "../../packages/release" } +early-boot-config = { path = "../../packages/early-boot-config" } diff --git a/variants/aws-k8s-1.28-nvidia/Cargo.toml b/variants/aws-k8s-1.28-nvidia/Cargo.toml index 27e4bd492bd..7c5a38c16da 100644 --- a/variants/aws-k8s-1.28-nvidia/Cargo.toml +++ b/variants/aws-k8s-1.28-nvidia/Cargo.toml @@ -22,10 +22,9 @@ systemd-networkd = true [package.metadata.build-variant] included-packages = [ # core - "early-boot-config", + "early-boot-config-aws", "release", "kernel-6.1", - "aws-data-providers", # k8s "cni", "cni-plugins", @@ -49,14 +48,8 @@ path = "../variants.rs" [build-dependencies] # core -early-boot-config = { path = "../../packages/early-boot-config" } -early-boot-config-ec2-identity-doc = { path = "../../packages/early-boot-config-ec2-identity-doc" } -early-boot-config-ec2-imds = { path = "../../packages/early-boot-config-ec2-imds" } -early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } -early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } -early-boot-config-local = { path = "../../packages/early-boot-config-local" } -early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } release = { path = "../../packages/release" } +early-boot-config = { path = "../../packages/early-boot-config" } kernel-6_1 = { path = "../../packages/kernel-6.1" } # k8s cni = { path = "../../packages/cni" } diff --git a/variants/aws-k8s-1.28/Cargo.toml b/variants/aws-k8s-1.28/Cargo.toml index 837233ba1f6..91e12ce1fa1 100644 --- a/variants/aws-k8s-1.28/Cargo.toml +++ b/variants/aws-k8s-1.28/Cargo.toml @@ -19,10 +19,9 @@ systemd-networkd = true [package.metadata.build-variant] included-packages = [ # core - "early-boot-config", + "early-boot-config-aws", "release", "kernel-6.1", - "aws-data-providers", # k8s "cni", "cni-plugins", @@ -42,14 +41,8 @@ path = "../variants.rs" [build-dependencies] # core -early-boot-config = { path = "../../packages/early-boot-config" } -early-boot-config-ec2-identity-doc = { path = "../../packages/early-boot-config-ec2-identity-doc" } -early-boot-config-ec2-imds = { path = "../../packages/early-boot-config-ec2-imds" } -early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } -early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } -early-boot-config-local = { path = "../../packages/early-boot-config-local" } -early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } release = { path = "../../packages/release" } +early-boot-config = { path = "../../packages/early-boot-config" } kernel-6_1 = { path = "../../packages/kernel-6.1" } # k8s cni = { path = "../../packages/cni" } diff --git a/variants/aws-k8s-1.29-nvidia/Cargo.toml b/variants/aws-k8s-1.29-nvidia/Cargo.toml index 7c68653464d..dbf31001316 100644 --- a/variants/aws-k8s-1.29-nvidia/Cargo.toml +++ b/variants/aws-k8s-1.29-nvidia/Cargo.toml @@ -22,6 +22,7 @@ systemd-networkd = true [package.metadata.build-variant] included-packages = [ # core + "early-boot-config-aws", "release", "kernel-6.1", # k8s @@ -48,6 +49,7 @@ path = "../variants.rs" [build-dependencies] # core release = { path = "../../packages/release" } +early-boot-config = { path = "../../packages/early-boot-config" } kernel-6_1 = { path = "../../packages/kernel-6.1" } # k8s cni = { path = "../../packages/cni" } diff --git a/variants/aws-k8s-1.29/Cargo.toml b/variants/aws-k8s-1.29/Cargo.toml index 84dbe5be152..2d43eef51f4 100644 --- a/variants/aws-k8s-1.29/Cargo.toml +++ b/variants/aws-k8s-1.29/Cargo.toml @@ -19,6 +19,7 @@ systemd-networkd = true [package.metadata.build-variant] included-packages = [ # core + "early-boot-config-aws", "release", "kernel-6.1", # k8s @@ -41,6 +42,7 @@ path = "../variants.rs" [build-dependencies] # core release = { path = "../../packages/release" } +early-boot-config = { path = "../../packages/early-boot-config" } kernel-6_1 = { path = "../../packages/kernel-6.1" } # k8s cni = { path = "../../packages/cni" } diff --git a/variants/metal-dev/Cargo.toml b/variants/metal-dev/Cargo.toml index ad464e4113e..03ba98bb834 100644 --- a/variants/metal-dev/Cargo.toml +++ b/variants/metal-dev/Cargo.toml @@ -25,11 +25,10 @@ kernel-parameters = [ ] included-packages = [ # core - "early-boot-config", + "early-boot-config-metal", "release", "kernel-6.1", "linux-firmware", - "metal-data-providers", # docker "docker-cli", "docker-engine", @@ -46,12 +45,8 @@ path = "../variants.rs" [build-dependencies] # core -early-boot-config = { path = "../../packages/early-boot-config" } -early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } -early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } -early-boot-config-local = { path = "../../packages/early-boot-config-local" } -early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } release = { path = "../../packages/release" } +early-boot-config = { path = "../../packages/early-boot-config" } kernel-6_1 = { path = "../../packages/kernel-6.1" } linux-firmware = { path = "../../packages/linux-firmware" } # docker diff --git a/variants/metal-k8s-1.25/Cargo.toml b/variants/metal-k8s-1.25/Cargo.toml index 11163cbdd30..164fa0754a6 100644 --- a/variants/metal-k8s-1.25/Cargo.toml +++ b/variants/metal-k8s-1.25/Cargo.toml @@ -27,11 +27,10 @@ included-packages = [ "aws-iam-authenticator", "cni", "cni-plugins", - "early-boot-config", + "early-boot-config-metal", "kernel-5.15", "linux-firmware", "kubelet-1.25", - "metal-data-providers", "release", ] @@ -42,12 +41,8 @@ path = "../variants.rs" aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } -early-boot-config = { path = "../../packages/early-boot-config" } -early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } -early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } -early-boot-config-local = { path = "../../packages/early-boot-config-local" } -early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } kernel-5_15 = { path = "../../packages/kernel-5.15" } linux-firmware = { path = "../../packages/linux-firmware" } kubernetes-1_25 = { path = "../../packages/kubernetes-1.25" } release = { path = "../../packages/release" } +early-boot-config = { path = "../../packages/early-boot-config" } diff --git a/variants/metal-k8s-1.26/Cargo.toml b/variants/metal-k8s-1.26/Cargo.toml index 83123d3eb2e..608f015a877 100644 --- a/variants/metal-k8s-1.26/Cargo.toml +++ b/variants/metal-k8s-1.26/Cargo.toml @@ -28,11 +28,10 @@ included-packages = [ "aws-iam-authenticator", "cni", "cni-plugins", - "early-boot-config", + "early-boot-config-metal", "kernel-5.15", "linux-firmware", "kubelet-1.26", - "metal-data-providers", "release", ] @@ -43,12 +42,8 @@ path = "../variants.rs" aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } -early-boot-config = { path = "../../packages/early-boot-config" } -early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } -early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } -early-boot-config-local = { path = "../../packages/early-boot-config-local" } -early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } kernel-5_15 = { path = "../../packages/kernel-5.15" } linux-firmware = { path = "../../packages/linux-firmware" } kubernetes-1_26 = { path = "../../packages/kubernetes-1.26" } release = { path = "../../packages/release" } +early-boot-config = { path = "../../packages/early-boot-config" } diff --git a/variants/metal-k8s-1.27/Cargo.toml b/variants/metal-k8s-1.27/Cargo.toml index ad56e47eec4..480d81a23a8 100644 --- a/variants/metal-k8s-1.27/Cargo.toml +++ b/variants/metal-k8s-1.27/Cargo.toml @@ -28,11 +28,10 @@ included-packages = [ "aws-iam-authenticator", "cni", "cni-plugins", - "early-boot-config", + "early-boot-config-metal", "kernel-5.15", "linux-firmware", "kubelet-1.27", - "metal-data-providers", "release", ] @@ -43,12 +42,8 @@ path = "../variants.rs" aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } -early-boot-config = { path = "../../packages/early-boot-config" } -early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } -early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } -early-boot-config-local = { path = "../../packages/early-boot-config-local" } -early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } kernel-5_15 = { path = "../../packages/kernel-5.15" } linux-firmware = { path = "../../packages/linux-firmware" } kubernetes-1_27 = { path = "../../packages/kubernetes-1.27" } release = { path = "../../packages/release" } +early-boot-config = { path = "../../packages/early-boot-config" } diff --git a/variants/metal-k8s-1.28/Cargo.toml b/variants/metal-k8s-1.28/Cargo.toml index c93e9b6da55..585a66bdb83 100644 --- a/variants/metal-k8s-1.28/Cargo.toml +++ b/variants/metal-k8s-1.28/Cargo.toml @@ -29,10 +29,9 @@ kernel-parameters = [ ] included-packages = [ # core - "early-boot-config", + "early-boot-config-metal", "release", "kernel-6.1", - "metal-data-providers", # k8s "aws-iam-authenticator", "cni", @@ -45,12 +44,8 @@ path = "../variants.rs" [build-dependencies] # core -early-boot-config = { path = "../../packages/early-boot-config" } -early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } -early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } -early-boot-config-local = { path = "../../packages/early-boot-config-local" } -early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } release = { path = "../../packages/release" } +early-boot-config = { path = "../../packages/early-boot-config" } kernel-6_1 = { path = "../../packages/kernel-6.1" } # k8s aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } diff --git a/variants/metal-k8s-1.29/Cargo.toml b/variants/metal-k8s-1.29/Cargo.toml index 22f82639320..ddac943fa11 100644 --- a/variants/metal-k8s-1.29/Cargo.toml +++ b/variants/metal-k8s-1.29/Cargo.toml @@ -36,8 +36,7 @@ included-packages = [ "cni", "cni-plugins", "kubelet-1.29", - "early-boot-config", - "metal-data-providers", + "early-boot-config-metal", ] [lib] @@ -46,14 +45,10 @@ path = "../variants.rs" [build-dependencies] # core release = { path = "../../packages/release" } +early-boot-config = { path = "../../packages/early-boot-config" } kernel-6_1 = { path = "../../packages/kernel-6.1" } # k8s aws-iam-authenticator = { path = "../../packages/aws-iam-authenticator" } cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } kubernetes-1_29 = { path = "../../packages/kubernetes-1.29" } -early-boot-config = { path = "../../packages/early-boot-config" } -early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } -early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } -early-boot-config-local = { path = "../../packages/early-boot-config-local" } -early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } diff --git a/variants/vmware-dev/Cargo.toml b/variants/vmware-dev/Cargo.toml index ff21e7d3f02..4c82413b15e 100644 --- a/variants/vmware-dev/Cargo.toml +++ b/variants/vmware-dev/Cargo.toml @@ -30,11 +30,10 @@ kernel-parameters = [ ] included-packages = [ # core - "early-boot-config", + "early-boot-config-vmware", "release", "kernel-6.1", "open-vm-tools", - "vmware-data-providers", # docker "docker-cli", "docker-engine", @@ -51,14 +50,8 @@ path = "../variants.rs" [build-dependencies] # core -early-boot-config = { path = "../../packages/early-boot-config" } -early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } -early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } -early-boot-config-local = { path = "../../packages/early-boot-config-local" } -early-boot-config-vmware-cd-rom = { path = "../../packages/early-boot-config-vmware-cd-rom" } -early-boot-config-vmware-guestinfo = { path = "../../packages/early-boot-config-vmware-guestinfo" } -early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } release = { path = "../../packages/release" } +early-boot-config = { path = "../../packages/early-boot-config" } kernel-6_1 = { path = "../../packages/kernel-6.1" } open-vm-tools = { path = "../../packages/open-vm-tools" } # docker diff --git a/variants/vmware-k8s-1.25/Cargo.toml b/variants/vmware-k8s-1.25/Cargo.toml index 995a0f47ea7..82784b69081 100644 --- a/variants/vmware-k8s-1.25/Cargo.toml +++ b/variants/vmware-k8s-1.25/Cargo.toml @@ -29,12 +29,11 @@ kernel-parameters = [ included-packages = [ "cni", "cni-plugins", - "early-boot-config", + "early-boot-config-vmware", "kernel-5.15", "kubelet-1.25", "open-vm-tools", "release", - "vmware-data-providers", ] [lib] @@ -43,14 +42,8 @@ path = "../variants.rs" [build-dependencies] cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } -early-boot-config = { path = "../../packages/early-boot-config" } -early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } -early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } -early-boot-config-local = { path = "../../packages/early-boot-config-local" } -early-boot-config-vmware-cd-rom = { path = "../../packages/early-boot-config-vmware-cd-rom" } -early-boot-config-vmware-guestinfo = { path = "../../packages/early-boot-config-vmware-guestinfo" } -early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } kernel-5_15 = { path = "../../packages/kernel-5.15" } kubernetes-1_25 = { path = "../../packages/kubernetes-1.25" } open-vm-tools = { path = "../../packages/open-vm-tools" } release = { path = "../../packages/release" } +early-boot-config = { path = "../../packages/early-boot-config" } diff --git a/variants/vmware-k8s-1.26/Cargo.toml b/variants/vmware-k8s-1.26/Cargo.toml index 6a127eabb77..74817c8f4f1 100644 --- a/variants/vmware-k8s-1.26/Cargo.toml +++ b/variants/vmware-k8s-1.26/Cargo.toml @@ -30,12 +30,11 @@ kernel-parameters = [ included-packages = [ "cni", "cni-plugins", - "early-boot-config", + "early-boot-config-vmware", "kernel-5.15", "kubelet-1.26", "open-vm-tools", "release", - "vmware-data-providers", ] [lib] @@ -44,14 +43,8 @@ path = "../variants.rs" [build-dependencies] cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } -early-boot-config = { path = "../../packages/early-boot-config" } -early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } -early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } -early-boot-config-local = { path = "../../packages/early-boot-config-local" } -early-boot-config-vmware-cd-rom = { path = "../../packages/early-boot-config-vmware-cd-rom" } -early-boot-config-vmware-guestinfo = { path = "../../packages/early-boot-config-vmware-guestinfo" } -early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } kernel-5_15 = { path = "../../packages/kernel-5.15" } kubernetes-1_26 = { path = "../../packages/kubernetes-1.26" } open-vm-tools = { path = "../../packages/open-vm-tools" } release = { path = "../../packages/release" } +early-boot-config = { path = "../../packages/early-boot-config" } diff --git a/variants/vmware-k8s-1.27/Cargo.toml b/variants/vmware-k8s-1.27/Cargo.toml index 9f17ecbf320..1a4a670fe66 100644 --- a/variants/vmware-k8s-1.27/Cargo.toml +++ b/variants/vmware-k8s-1.27/Cargo.toml @@ -30,12 +30,11 @@ kernel-parameters = [ included-packages = [ "cni", "cni-plugins", - "early-boot-config", + "early-boot-config-vmware", "kernel-5.15", "kubelet-1.27", "open-vm-tools", "release", - "vmware-data-providers", ] [lib] @@ -44,14 +43,8 @@ path = "../variants.rs" [build-dependencies] cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } -early-boot-config = { path = "../../packages/early-boot-config" } -early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } -early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } -early-boot-config-local = { path = "../../packages/early-boot-config-local" } -early-boot-config-vmware-cd-rom = { path = "../../packages/early-boot-config-vmware-cd-rom" } -early-boot-config-vmware-guestinfo = { path = "../../packages/early-boot-config-vmware-guestinfo" } -early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } kernel-5_15 = { path = "../../packages/kernel-5.15" } kubernetes-1_27 = { path = "../../packages/kubernetes-1.27" } open-vm-tools = { path = "../../packages/open-vm-tools" } release = { path = "../../packages/release" } +early-boot-config = { path = "../../packages/early-boot-config" } diff --git a/variants/vmware-k8s-1.28/Cargo.toml b/variants/vmware-k8s-1.28/Cargo.toml index 58c45a4182d..3ad3cbce7af 100644 --- a/variants/vmware-k8s-1.28/Cargo.toml +++ b/variants/vmware-k8s-1.28/Cargo.toml @@ -32,10 +32,9 @@ kernel-parameters = [ ] included-packages = [ # core - "early-boot-config", + "early-boot-config-vmware", "release", "kernel-6.1", - "vmware-data-providers", # k8s "cni", "cni-plugins", @@ -49,14 +48,8 @@ path = "../variants.rs" [build-dependencies] # core -early-boot-config = { path = "../../packages/early-boot-config" } -early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } -early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } -early-boot-config-local = { path = "../../packages/early-boot-config-local" } -early-boot-config-vmware-cd-rom = { path = "../../packages/early-boot-config-vmware-cd-rom" } -early-boot-config-vmware-guestinfo = { path = "../../packages/early-boot-config-vmware-guestinfo" } -early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } release = { path = "../../packages/release" } +early-boot-config = { path = "../../packages/early-boot-config" } kernel-6_1 = { path = "../../packages/kernel-6.1" } # k8s cni = { path = "../../packages/cni" } diff --git a/variants/vmware-k8s-1.29/Cargo.toml b/variants/vmware-k8s-1.29/Cargo.toml index d2e0ea9ada1..470169e61d8 100644 --- a/variants/vmware-k8s-1.29/Cargo.toml +++ b/variants/vmware-k8s-1.29/Cargo.toml @@ -39,9 +39,8 @@ included-packages = [ "cni-plugins", "kubelet-1.29", # vmware - "early-boot-config", + "early-boot-config-vmware", "open-vm-tools", - "vmware-data-providers", ] [lib] @@ -50,17 +49,11 @@ path = "../variants.rs" [build-dependencies] # core release = { path = "../../packages/release" } +early-boot-config = { path = "../../packages/early-boot-config" } kernel-6_1 = { path = "../../packages/kernel-6.1" } # k8s cni = { path = "../../packages/cni" } cni-plugins = { path = "../../packages/cni-plugins" } kubernetes-1_29 = { path = "../../packages/kubernetes-1.29" } # vmware -early-boot-config = { path = "../../packages/early-boot-config" } -early-boot-config-local-defaults = { path = "../../packages/early-boot-config-local-defaults" } -early-boot-config-local-overrides = { path = "../../packages/early-boot-config-local-overrides" } -early-boot-config-local = { path = "../../packages/early-boot-config-local" } -early-boot-config-vmware-cd-rom = { path = "../../packages/early-boot-config-vmware-cd-rom" } -early-boot-config-vmware-guestinfo = { path = "../../packages/early-boot-config-vmware-guestinfo" } -early-boot-config-providers = { path = "../../packages/early-boot-config-providers" } open-vm-tools = { path = "../../packages/open-vm-tools" } From 9b3372e59c06569ae7ccf1e56c510d655212ae9b Mon Sep 17 00:00:00 2001 From: Sam Berning Date: Wed, 28 Feb 2024 01:46:35 +0000 Subject: [PATCH 27/41] early-boot-config: create user-data-provider library Signed-off-by: Sam Berning --- sources/Cargo.lock | 28 +++ sources/Cargo.toml | 1 + sources/api/user-data-provider/Cargo.toml | 41 ++++ sources/api/user-data-provider/README.md | 13 ++ sources/api/user-data-provider/README.tpl | 9 + sources/api/user-data-provider/build.rs | 3 + .../api/user-data-provider/src/compression.rs | 192 ++++++++++++++++++ sources/api/user-data-provider/src/lib.rs | 17 ++ .../api/user-data-provider/src/provider.rs | 102 ++++++++++ .../api/user-data-provider/src/settings.rs | 75 +++++++ 10 files changed, 481 insertions(+) create mode 100644 sources/api/user-data-provider/Cargo.toml create mode 100644 sources/api/user-data-provider/README.md create mode 100644 sources/api/user-data-provider/README.tpl create mode 100644 sources/api/user-data-provider/build.rs create mode 100644 sources/api/user-data-provider/src/compression.rs create mode 100644 sources/api/user-data-provider/src/lib.rs create mode 100644 sources/api/user-data-provider/src/provider.rs create mode 100644 sources/api/user-data-provider/src/settings.rs diff --git a/sources/Cargo.lock b/sources/Cargo.lock index b1187d0c26d..08284acf0e5 100644 --- a/sources/Cargo.lock +++ b/sources/Cargo.lock @@ -4699,6 +4699,34 @@ version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" +[[package]] +name = "user-data-provider" +version = "0.1.0" +dependencies = [ + "apiclient", + "async-trait", + "base64 0.13.1", + "constants", + "env_logger", + "flate2", + "generate-readme", + "hex-literal", + "http", + "imdsclient", + "lazy_static", + "log", + "retry-read", + "serde", + "serde-xml-rs", + "serde_json", + "serde_plain", + "snafu", + "tokio", + "toml 0.5.11", + "vmw_backdoor", + "walkdir", +] + [[package]] name = "utf-8" version = "0.7.6" diff --git a/sources/Cargo.toml b/sources/Cargo.toml index 80a16d2398e..3b9b0138c56 100644 --- a/sources/Cargo.toml +++ b/sources/Cargo.toml @@ -23,6 +23,7 @@ members = [ "api/migration/migration-helpers", "api/shibaken", "api/prairiedog", + "api/user-data-provider", # "api/migration/migrations/vX.Y.Z/..." # (all previous migrations archived; add new ones after this line) diff --git a/sources/api/user-data-provider/Cargo.toml b/sources/api/user-data-provider/Cargo.toml new file mode 100644 index 00000000000..233ee8d8a2c --- /dev/null +++ b/sources/api/user-data-provider/Cargo.toml @@ -0,0 +1,41 @@ +[package] +name = "user-data-provider" +version = "0.1.0" +authors = ["Zac Mrowicki ", "Sam Berning Result { + let mut output = String::new(); + let mut reader = OptionalCompressionReader::new(Cursor::new(input)); + reader.read_to_string(&mut output)?; + Ok(output) +} + +/// This helper takes the path to a file containing UTF-8 text, which can optionally be compressed, +/// and returns an uncompressed string of all its contents. File reads are done through BufReader. +pub fn expand_file_maybe

(path: P) -> Result +where + P: AsRef, +{ + let path = path.as_ref(); + let file = File::open(path)?; + let mut output = String::new(); + let mut reader = OptionalCompressionReader::new(BufReader::new(file)); + reader.read_to_string(&mut output)?; + Ok(output) +} + +// =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= + +/// This type lets you wrap a `Read` whose data may or may not be compressed, and its `read()` +/// calls will uncompress the data if needed. +pub struct OptionalCompressionReader(CompressionType); + +/// This represents the type of compression we've detected within a `Read`, or `Unknown` if we +/// haven't yet read any bytes to be able to detect it. +enum CompressionType { + /// This represents the starting state of the reader before we've read the magic bytes and + /// detected any compression. + /// + /// We need ownership of the `Read` to construct one of the variants below, so we use an + /// `Option` to allow `take`ing the value out, even if we only have a &mut reference in the + /// `read` implementation. This is safe because detection is a one-time process and we know we + /// construct this with Some value. + Unknown(Option), + + /// We haven't found recognizable compression. + None(Peek), + + /// We found gzip compression. + Gz(Box>>), +} + +/// `Peek` lets us read the starting bytes (the "magic") of an input `Read` but maintain those +/// bytes in an internal buffer. We Take the number of bytes we read (to handle reads shorter than +/// MAGIC_LEN) and Chain them together with the rest of the input, to represent the full input. +type Peek = Chain>, T>; + +impl OptionalCompressionReader { + /// Build a new `OptionalCompressionReader` before we know the input compression type. + pub fn new(input: R) -> Self { + Self(CompressionType::Unknown(Some(input))) + } +} + +/// Implement `Read` by checking whether we've detected compression type yet, and if not, detecting +/// it and then replacing ourselves with the appropriate type so we can continue reading. +impl Read for OptionalCompressionReader { + fn read(&mut self, buf: &mut [u8]) -> Result { + match self.0 { + CompressionType::Unknown(ref mut input) => { + // Take ownership of our `Read` object so we can store it in a new variant. + let mut reader = input.take().expect( + "OptionalCompressionReader constructed with None input; programming error", + ); + + // Read the "magic" that tells us the compression type. + let mut magic = [0u8; MAGIC_LEN]; + let count = reader.retry_read(&mut magic)?; + + // We need to return all of the bytes, but we just consumed MAGIC_LEN of them. + // This chains together those initial bytes with the remainder so we have them all. + let magic_read = Cursor::new(magic).take(count as u64); + let full_input = magic_read.chain(reader); + + // Detect compression type based on the magic bytes. + if count == MAGIC_LEN && magic == GZ_MAGIC { + // Use a gzip decoder if gzip compressed. + self.0 = CompressionType::Gz(Box::new(GzDecoder::new(full_input))) + } else { + // We couldn't detect any compression; just read the input. + self.0 = CompressionType::None(full_input) + } + + // We've replaced Unknown with a known compression type; defer to that for reading. + self.read(buf) + } + + // After initial detection, we just perform standard reads on the reader we prepared. + CompressionType::None(ref mut r) => r.read(buf), + CompressionType::Gz(ref mut r) => r.read(buf), + } + } +} + +// =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= + +#[cfg(test)] +mod test { + use super::*; + use hex_literal::hex; + use lazy_static::lazy_static; + use std::io::Cursor; + + lazy_static! { + /// Some plain text strings and their gzip encodings. + static ref DATA: &'static [(&'static str, &'static [u8])] = &[ + ("", &hex!("1f8b 0808 3863 3960 0003 656d 7074 7900 0300 0000 0000 0000 0000")), + ("4", &hex!("1f8b 0808 6f63 3960 0003 666f 7572 0033 0100 381b b6f3 0100 0000")), + ("42", &hex!("1f8b 0808 7c6b 3960 0003 616e 7377 6572 0033 3102 0088 b024 3202 0000 00")), + ("hi there", &hex!("1f8b 0808 d24f 3960 0003 6869 7468 6572 6500 cbc8 5428 c948 2d4a 0500 ec76 a3e3 0800 0000")), + ]; + } + + #[test] + fn test_plain() { + for (plain, _gz) in *DATA { + let input = Cursor::new(plain); + let mut output = String::new(); + OptionalCompressionReader::new(input) + .read_to_string(&mut output) + .unwrap(); + assert_eq!(output, *plain); + } + } + + #[test] + fn test_gz() { + for (plain, gz) in *DATA { + let input = Cursor::new(gz); + let mut output = String::new(); + OptionalCompressionReader::new(input) + .read_to_string(&mut output) + .unwrap(); + assert_eq!(output, *plain); + } + } + + #[test] + fn test_helper_plain() { + for (plain, _gz) in *DATA { + assert_eq!(expand_slice_maybe(plain.as_bytes()).unwrap(), *plain); + } + } + + #[test] + fn test_helper_gz() { + for (plain, gz) in *DATA { + assert_eq!(expand_slice_maybe(gz).unwrap(), *plain); + } + } + + #[test] + fn test_magic_prefix() { + // Confirm that if we give a prefix of valid magic, but not the whole thing, we just get + // that input back. + let input = Cursor::new(&[0x1f]); + let mut output = Vec::new(); + let count = OptionalCompressionReader::new(input) + .read_to_end(&mut output) + .unwrap(); + assert_eq!(count, 1); + assert_eq!(output, &[0x1f]); + } +} diff --git a/sources/api/user-data-provider/src/lib.rs b/sources/api/user-data-provider/src/lib.rs new file mode 100644 index 00000000000..63c6f4d9aef --- /dev/null +++ b/sources/api/user-data-provider/src/lib.rs @@ -0,0 +1,17 @@ +/*! +# Introduction + +user-data-provider defines the interface of the user data provider binaries used by early-boot-config. + +User data provider binaries can also be easily created using the UserDataProvider trait and logging functions defined by this crate. +*/ + +#[macro_use] +extern crate log; + +pub mod compression; +pub mod provider; +pub mod settings; + +/// The environment variable used to set log level for env_logger +pub const LOG_LEVEL_ENV_VAR: &str = "EARLY_BOOT_CONFIG_LOG_LEVEL"; diff --git a/sources/api/user-data-provider/src/provider.rs b/sources/api/user-data-provider/src/provider.rs new file mode 100644 index 00000000000..ee63db3003f --- /dev/null +++ b/sources/api/user-data-provider/src/provider.rs @@ -0,0 +1,102 @@ +//! The provider module owns the `UserDataProvider` trait + +use crate::compression::expand_file_maybe; +use crate::settings::SettingsJson; +use crate::LOG_LEVEL_ENV_VAR; +use async_trait::async_trait; +use env_logger::{Env, Target, WriteStyle}; +use snafu::ResultExt; +use std::path::Path; +use std::process::ExitCode; + +/// Support for user data providers can be added by implementing this trait, and adding an +/// additional binary using the implementor and common functions below. +#[async_trait] +pub trait UserDataProvider { + /// Optionally return a SettingsJson object if user data is found, representing the settings to + /// send to the API. + async fn user_data( + &self, + ) -> std::result::Result, Box>; +} + +/// Run a user data provider, returning the proper exit code and errors, and if successful, +/// printing its JSON to stdout. +pub async fn run_userdata_provider(provider: &impl UserDataProvider) -> ExitCode { + let (exit_code, output) = match provider.user_data().await { + Ok(Some(user_data)) => match serde_json::to_string(&user_data) { + Ok(json) => (ExitCode::SUCCESS, json), + Err(e) => ( + ExitCode::FAILURE, + format!("Failed to serialize user data as JSON: {}", e), + ), + }, + Ok(None) => (ExitCode::SUCCESS, String::new()), + Err(e) => (ExitCode::FAILURE, format!("{}", e)), + }; + + println!("{}", output); + exit_code +} + +/// Convenience function to set up logging for provider binaries. +/// +/// Since provider binaries return their output to early-boot-config on stdout, we want to make +/// sure all logging happens to stderr. For debugging purposes, the binaries' log level may be +/// configured via environment variable. +pub fn setup_provider_logging() { + // Filter at info level by default unless configured via environment variable + let log_level = Env::default().filter_or(LOG_LEVEL_ENV_VAR, "info"); + env_logger::Builder::from_env(log_level) + .format_module_path(false) + .target(Target::Stderr) + .write_style(WriteStyle::Never) + .init() +} + +/// Read user data from a given path, decompressing if necessary +pub fn user_data_from_file>( + path: P, +) -> std::result::Result, Box> { + let path = path.as_ref(); + + if !path.exists() { + info!("{} does not exist, not using it", path.display()); + return Ok(None); + } + info!("'{}' exists, using it", path.display()); + + // Read the file, decompressing it if compressed. + let user_data_str = expand_file_maybe(path).context(error::InputFileReadSnafu { path })?; + + if user_data_str.is_empty() { + warn!("{} exists but is empty", path.display()); + return Ok(None); + } + + trace!("Received user data: {}", user_data_str); + let desc = format!("user data from {}", path.display()); + let json = SettingsJson::from_toml_str(&user_data_str, desc) + .context(error::SettingsToJSONSnafu { from: path })?; + + Ok(Some(json)) +} + +mod error { + use snafu::Snafu; + use std::io; + use std::path::PathBuf; + + #[derive(Debug, Snafu)] + #[snafu(visibility(pub(super)))] + pub enum Error { + #[snafu(display("Unable to read input file '{}': {}", path.display(), source))] + InputFileRead { path: PathBuf, source: io::Error }, + + #[snafu(display("Unable to serialize settings from {}: {}", from.display(), source))] + SettingsToJSON { + from: PathBuf, + source: crate::settings::Error, + }, + } +} diff --git a/sources/api/user-data-provider/src/settings.rs b/sources/api/user-data-provider/src/settings.rs new file mode 100644 index 00000000000..5abd31d679f --- /dev/null +++ b/sources/api/user-data-provider/src/settings.rs @@ -0,0 +1,75 @@ +//! The settings module owns the `SettingsJson` struct which contains the JSON settings data being +//! sent to the API. + +use serde::{Deserialize, Serialize}; +use snafu::{OptionExt, ResultExt}; + +/// SettingsJson represents a change that a provider would like to make in the API. +#[derive(Debug, Serialize, Deserialize)] +pub struct SettingsJson { + pub json: serde_json::Value, + pub desc: String, +} + +impl SettingsJson { + /// Construct a SettingsJson from a serializable object and a description of that object, + /// which is used for logging. + /// + /// The serializable object is typically something like a toml::Value or serde_json::Value, + /// since they can be easily deserialized from text input in the platform, and manipulated as + /// desired. + pub fn from_val(data: &impl Serialize, desc: S) -> Result + where + S: Into, + { + Ok(Self { + json: serde_json::to_value(data).context(error::SettingsToJSONSnafu)?, + desc: desc.into(), + }) + } + + /// Construct a SettingsJson from a string containing TOML-formatted data and a description of + /// the object, which is used for logging. + /// + /// This method takes care of the easy-to-miss task of removing the outer `settings` layer from + /// the TOML data before it gets submitted to the API. + pub fn from_toml_str(data: S1, desc: S2) -> Result + where + S1: AsRef, + S2: Into, + { + let mut val: toml::Value = + toml::from_str(data.as_ref()).context(error::TOMLUserDataParseSnafu)?; + let table = val + .as_table_mut() + .context(error::UserDataNotTomlTableSnafu)?; + let inner = table + .remove("settings") + .context(error::UserDataMissingSettingsSnafu)?; + + SettingsJson::from_val(&inner, desc) + } +} + +mod error { + use snafu::Snafu; + + #[derive(Debug, Snafu)] + #[snafu(visibility(pub(crate)))] + pub enum Error { + #[snafu(display("Error serializing settings to JSON: {}", source))] + SettingsToJSON { source: serde_json::error::Error }, + + #[snafu(display("Error parsing TOML user data: {}", source))] + TOMLUserDataParse { source: toml::de::Error }, + + #[snafu(display("TOML data did not contain 'settings' section"))] + UserDataMissingSettings, + + #[snafu(display("Data is not a TOML table"))] + UserDataNotTomlTable, + } +} + +pub use error::Error; +type Result = std::result::Result; From fce15d765030e4513540962127860844da8556dd Mon Sep 17 00:00:00 2001 From: Sam Berning Date: Wed, 28 Feb 2024 02:05:55 +0000 Subject: [PATCH 28/41] early-boot-config: use user-data-provider interface in providers Signed-off-by: Sam Berning --- sources/Cargo.lock | 1 + sources/api/early-boot-config/Cargo.toml | 1 + .../src/bin/early-boot-config.rs | 4 +- .../user-data-providers/ec2_identity_doc.rs | 3 +- .../src/bin/user-data-providers/ec2_imds.rs | 3 +- .../bin/user-data-providers/local_defaults.rs | 3 +- .../user-data-providers/local_overrides.rs | 3 +- .../user-data-providers/local_user_data.rs | 3 +- .../bin/user-data-providers/vmware_cd_rom.rs | 3 +- .../user-data-providers/vmware_guestinfo.rs | 4 +- .../api/early-boot-config/src/compression.rs | 192 ------------------ sources/api/early-boot-config/src/lib.rs | 2 - sources/api/early-boot-config/src/provider.rs | 8 +- .../src/provider/ec2_identity_doc.rs | 6 +- .../src/provider/ec2_imds.rs | 8 +- .../src/provider/local_defaults.rs | 4 +- .../src/provider/local_overrides.rs | 4 +- .../src/provider/local_user_data.rs | 4 +- .../src/provider/vmware_cd_rom.rs | 10 +- .../src/provider/vmware_guestinfo.rs | 6 +- sources/api/early-boot-config/src/settings.rs | 75 ------- 21 files changed, 45 insertions(+), 302 deletions(-) delete mode 100644 sources/api/early-boot-config/src/compression.rs delete mode 100644 sources/api/early-boot-config/src/settings.rs diff --git a/sources/Cargo.lock b/sources/Cargo.lock index 08284acf0e5..788e93fc3c5 100644 --- a/sources/Cargo.lock +++ b/sources/Cargo.lock @@ -1710,6 +1710,7 @@ dependencies = [ "snafu 0.8.2", "tokio", "toml", + "user-data-provider", "vmw_backdoor", "walkdir", ] diff --git a/sources/api/early-boot-config/Cargo.toml b/sources/api/early-boot-config/Cargo.toml index efd5d59729d..3e0753731d5 100644 --- a/sources/api/early-boot-config/Cargo.toml +++ b/sources/api/early-boot-config/Cargo.toml @@ -56,6 +56,7 @@ simplelog = "0.12" snafu = "0.8" tokio = { version = "~1.32", default-features = false, features = ["macros", "rt-multi-thread"] } # LTS toml = "0.8" +user-data-provider = { path = "../user-data-provider", version = "0.1" } walkdir = "2.4" [target.'cfg(target_arch = "x86_64")'.dependencies] diff --git a/sources/api/early-boot-config/src/bin/early-boot-config.rs b/sources/api/early-boot-config/src/bin/early-boot-config.rs index d487bd16f4b..5b45961ce67 100644 --- a/sources/api/early-boot-config/src/bin/early-boot-config.rs +++ b/sources/api/early-boot-config/src/bin/early-boot-config.rs @@ -11,8 +11,8 @@ User data provider binaries each implement the ability to obtain user data from #[macro_use] extern crate log; -use early_boot_config::settings::SettingsJson; -use early_boot_config::LOG_LEVEL_ENV_VAR; +use user_data_provider::settings::SettingsJson; +use user_data_provider::LOG_LEVEL_ENV_VAR; use env_logger::{Target, WriteStyle}; use log::LevelFilter; use snafu::{ensure, ResultExt}; diff --git a/sources/api/early-boot-config/src/bin/user-data-providers/ec2_identity_doc.rs b/sources/api/early-boot-config/src/bin/user-data-providers/ec2_identity_doc.rs index f540c66c05c..d226df0f477 100644 --- a/sources/api/early-boot-config/src/bin/user-data-providers/ec2_identity_doc.rs +++ b/sources/api/early-boot-config/src/bin/user-data-providers/ec2_identity_doc.rs @@ -1,5 +1,6 @@ -use early_boot_config::provider::{run_userdata_provider, setup_provider_logging, Ec2IdentityDoc}; +use early_boot_config::provider::Ec2IdentityDoc; use std::process::ExitCode; +use user_data_provider::provider::{run_userdata_provider, setup_provider_logging}; #[tokio::main] async fn main() -> ExitCode { diff --git a/sources/api/early-boot-config/src/bin/user-data-providers/ec2_imds.rs b/sources/api/early-boot-config/src/bin/user-data-providers/ec2_imds.rs index 2fc1c3848c9..fc10e170e07 100644 --- a/sources/api/early-boot-config/src/bin/user-data-providers/ec2_imds.rs +++ b/sources/api/early-boot-config/src/bin/user-data-providers/ec2_imds.rs @@ -1,5 +1,6 @@ -use early_boot_config::provider::{run_userdata_provider, setup_provider_logging, Ec2Imds}; +use early_boot_config::provider::Ec2Imds; use std::process::ExitCode; +use user_data_provider::provider::{run_userdata_provider, setup_provider_logging}; #[tokio::main] async fn main() -> ExitCode { diff --git a/sources/api/early-boot-config/src/bin/user-data-providers/local_defaults.rs b/sources/api/early-boot-config/src/bin/user-data-providers/local_defaults.rs index 66e80efbe60..94680fbdff3 100644 --- a/sources/api/early-boot-config/src/bin/user-data-providers/local_defaults.rs +++ b/sources/api/early-boot-config/src/bin/user-data-providers/local_defaults.rs @@ -1,5 +1,6 @@ -use early_boot_config::provider::{run_userdata_provider, setup_provider_logging, LocalDefaults}; +use early_boot_config::provider::LocalDefaults; use std::process::ExitCode; +use user_data_provider::provider::{run_userdata_provider, setup_provider_logging}; #[tokio::main] async fn main() -> ExitCode { diff --git a/sources/api/early-boot-config/src/bin/user-data-providers/local_overrides.rs b/sources/api/early-boot-config/src/bin/user-data-providers/local_overrides.rs index ba259b113b2..8780357ec9f 100644 --- a/sources/api/early-boot-config/src/bin/user-data-providers/local_overrides.rs +++ b/sources/api/early-boot-config/src/bin/user-data-providers/local_overrides.rs @@ -1,5 +1,6 @@ -use early_boot_config::provider::{run_userdata_provider, setup_provider_logging, LocalOverrides}; +use early_boot_config::provider::LocalOverrides; use std::process::ExitCode; +use user_data_provider::provider::{run_userdata_provider, setup_provider_logging}; #[tokio::main] async fn main() -> ExitCode { diff --git a/sources/api/early-boot-config/src/bin/user-data-providers/local_user_data.rs b/sources/api/early-boot-config/src/bin/user-data-providers/local_user_data.rs index 09de0462d69..238941c99f8 100644 --- a/sources/api/early-boot-config/src/bin/user-data-providers/local_user_data.rs +++ b/sources/api/early-boot-config/src/bin/user-data-providers/local_user_data.rs @@ -1,5 +1,6 @@ -use early_boot_config::provider::{run_userdata_provider, setup_provider_logging, LocalUserData}; +use early_boot_config::provider::LocalUserData; use std::process::ExitCode; +use user_data_provider::provider::{run_userdata_provider, setup_provider_logging}; #[tokio::main] async fn main() -> ExitCode { diff --git a/sources/api/early-boot-config/src/bin/user-data-providers/vmware_cd_rom.rs b/sources/api/early-boot-config/src/bin/user-data-providers/vmware_cd_rom.rs index ec13ff130e6..7809f339f1c 100644 --- a/sources/api/early-boot-config/src/bin/user-data-providers/vmware_cd_rom.rs +++ b/sources/api/early-boot-config/src/bin/user-data-providers/vmware_cd_rom.rs @@ -1,5 +1,6 @@ -use early_boot_config::provider::{run_userdata_provider, setup_provider_logging, VmwareCdRom}; +use early_boot_config::provider::VmwareCdRom; use std::process::ExitCode; +use user_data_provider::provider::{run_userdata_provider, setup_provider_logging}; #[tokio::main] async fn main() -> ExitCode { diff --git a/sources/api/early-boot-config/src/bin/user-data-providers/vmware_guestinfo.rs b/sources/api/early-boot-config/src/bin/user-data-providers/vmware_guestinfo.rs index c55cbbfefe6..6c81ab6fd7b 100644 --- a/sources/api/early-boot-config/src/bin/user-data-providers/vmware_guestinfo.rs +++ b/sources/api/early-boot-config/src/bin/user-data-providers/vmware_guestinfo.rs @@ -1,6 +1,8 @@ #[cfg(target_arch = "x86_64")] -use early_boot_config::provider::{run_userdata_provider, setup_provider_logging, VmwareGuestinfo}; +use early_boot_config::provider::VmwareGuestinfo; use std::process::ExitCode; +#[cfg(target_arch = "x86_64")] +use user_data_provider::provider::{run_userdata_provider, setup_provider_logging}; #[tokio::main] async fn main() -> ExitCode { diff --git a/sources/api/early-boot-config/src/compression.rs b/sources/api/early-boot-config/src/compression.rs deleted file mode 100644 index e5be458acd6..00000000000 --- a/sources/api/early-boot-config/src/compression.rs +++ /dev/null @@ -1,192 +0,0 @@ -//! This module supports reading from an input source that could be compressed or plain text. -//! -//! Currently gzip compression is supported. - -use flate2::read::GzDecoder; -use retry_read::RetryRead; -use std::fs::File; -use std::io::{BufReader, Chain, Cursor, Read, Result, Take}; -use std::path::Path; - -/// "File magic" that indicates file type is stored in a few bytes at the start at the start of the -/// data. For now we only need two bytes for gzip, but if adding new formats, we'd need to read -/// more. (The simplest approach may be to read the max length for any format we need and compare -/// the appropriate prefix length.) -/// https://en.wikipedia.org/wiki/List_of_file_signatures -const MAGIC_LEN: usize = 2; - -// We currently only support gzip, but it shouldn't be hard to add more. -/// These bytes are at the start of any gzip-compressed data. -const GZ_MAGIC: [u8; 2] = [0x1f, 0x8b]; - -/// This helper takes a slice of bytes representing UTF-8 text, which can optionally be -/// compressed, and returns an uncompressed string. -#[allow(dead_code)] -pub fn expand_slice_maybe(input: &[u8]) -> Result { - let mut output = String::new(); - let mut reader = OptionalCompressionReader::new(Cursor::new(input)); - reader.read_to_string(&mut output)?; - Ok(output) -} - -/// This helper takes the path to a file containing UTF-8 text, which can optionally be compressed, -/// and returns an uncompressed string of all its contents. File reads are done through BufReader. -pub fn expand_file_maybe

(path: P) -> Result -where - P: AsRef, -{ - let path = path.as_ref(); - let file = File::open(path)?; - let mut output = String::new(); - let mut reader = OptionalCompressionReader::new(BufReader::new(file)); - reader.read_to_string(&mut output)?; - Ok(output) -} - -// =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= - -/// This type lets you wrap a `Read` whose data may or may not be compressed, and its `read()` -/// calls will uncompress the data if needed. -pub struct OptionalCompressionReader(CompressionType); - -/// This represents the type of compression we've detected within a `Read`, or `Unknown` if we -/// haven't yet read any bytes to be able to detect it. -enum CompressionType { - /// This represents the starting state of the reader before we've read the magic bytes and - /// detected any compression. - /// - /// We need ownership of the `Read` to construct one of the variants below, so we use an - /// `Option` to allow `take`ing the value out, even if we only have a &mut reference in the - /// `read` implementation. This is safe because detection is a one-time process and we know we - /// construct this with Some value. - Unknown(Option), - - /// We haven't found recognizable compression. - None(Peek), - - /// We found gzip compression. - Gz(Box>>), -} - -/// `Peek` lets us read the starting bytes (the "magic") of an input `Read` but maintain those -/// bytes in an internal buffer. We Take the number of bytes we read (to handle reads shorter than -/// MAGIC_LEN) and Chain them together with the rest of the input, to represent the full input. -type Peek = Chain>, T>; - -impl OptionalCompressionReader { - /// Build a new `OptionalCompressionReader` before we know the input compression type. - pub fn new(input: R) -> Self { - Self(CompressionType::Unknown(Some(input))) - } -} - -/// Implement `Read` by checking whether we've detected compression type yet, and if not, detecting -/// it and then replacing ourselves with the appropriate type so we can continue reading. -impl Read for OptionalCompressionReader { - fn read(&mut self, buf: &mut [u8]) -> Result { - match self.0 { - CompressionType::Unknown(ref mut input) => { - // Take ownership of our `Read` object so we can store it in a new variant. - let mut reader = input.take().expect( - "OptionalCompressionReader constructed with None input; programming error", - ); - - // Read the "magic" that tells us the compression type. - let mut magic = [0u8; MAGIC_LEN]; - let count = reader.retry_read(&mut magic)?; - - // We need to return all of the bytes, but we just consumed MAGIC_LEN of them. - // This chains together those initial bytes with the remainder so we have them all. - let magic_read = Cursor::new(magic).take(count as u64); - let full_input = magic_read.chain(reader); - - // Detect compression type based on the magic bytes. - if count == MAGIC_LEN && magic == GZ_MAGIC { - // Use a gzip decoder if gzip compressed. - self.0 = CompressionType::Gz(Box::new(GzDecoder::new(full_input))) - } else { - // We couldn't detect any compression; just read the input. - self.0 = CompressionType::None(full_input) - } - - // We've replaced Unknown with a known compression type; defer to that for reading. - self.read(buf) - } - - // After initial detection, we just perform standard reads on the reader we prepared. - CompressionType::None(ref mut r) => r.read(buf), - CompressionType::Gz(ref mut r) => r.read(buf), - } - } -} - -// =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= =^..^= - -#[cfg(test)] -mod test { - use super::*; - use hex_literal::hex; - use lazy_static::lazy_static; - use std::io::Cursor; - - lazy_static! { - /// Some plain text strings and their gzip encodings. - static ref DATA: &'static [(&'static str, &'static [u8])] = &[ - ("", &hex!("1f8b 0808 3863 3960 0003 656d 7074 7900 0300 0000 0000 0000 0000")), - ("4", &hex!("1f8b 0808 6f63 3960 0003 666f 7572 0033 0100 381b b6f3 0100 0000")), - ("42", &hex!("1f8b 0808 7c6b 3960 0003 616e 7377 6572 0033 3102 0088 b024 3202 0000 00")), - ("hi there", &hex!("1f8b 0808 d24f 3960 0003 6869 7468 6572 6500 cbc8 5428 c948 2d4a 0500 ec76 a3e3 0800 0000")), - ]; - } - - #[test] - fn test_plain() { - for (plain, _gz) in *DATA { - let input = Cursor::new(plain); - let mut output = String::new(); - OptionalCompressionReader::new(input) - .read_to_string(&mut output) - .unwrap(); - assert_eq!(output, *plain); - } - } - - #[test] - fn test_gz() { - for (plain, gz) in *DATA { - let input = Cursor::new(gz); - let mut output = String::new(); - OptionalCompressionReader::new(input) - .read_to_string(&mut output) - .unwrap(); - assert_eq!(output, *plain); - } - } - - #[test] - fn test_helper_plain() { - for (plain, _gz) in *DATA { - assert_eq!(expand_slice_maybe(plain.as_bytes()).unwrap(), *plain); - } - } - - #[test] - fn test_helper_gz() { - for (plain, gz) in *DATA { - assert_eq!(expand_slice_maybe(gz).unwrap(), *plain); - } - } - - #[test] - fn test_magic_prefix() { - // Confirm that if we give a prefix of valid magic, but not the whole thing, we just get - // that input back. - let input = Cursor::new(&[0x1f]); - let mut output = Vec::new(); - let count = OptionalCompressionReader::new(input) - .read_to_end(&mut output) - .unwrap(); - assert_eq!(count, 1); - assert_eq!(output, &[0x1f]); - } -} diff --git a/sources/api/early-boot-config/src/lib.rs b/sources/api/early-boot-config/src/lib.rs index b95be8a3776..4a79b3f4b6e 100644 --- a/sources/api/early-boot-config/src/lib.rs +++ b/sources/api/early-boot-config/src/lib.rs @@ -1,9 +1,7 @@ #[macro_use] extern crate log; -mod compression; pub mod provider; -pub mod settings; /// The environment variable used to set log level for env_logger pub const LOG_LEVEL_ENV_VAR: &str = "EARLY_BOOT_CONFIG_LOG_LEVEL"; diff --git a/sources/api/early-boot-config/src/provider.rs b/sources/api/early-boot-config/src/provider.rs index 66774579841..5e054737abf 100644 --- a/sources/api/early-boot-config/src/provider.rs +++ b/sources/api/early-boot-config/src/provider.rs @@ -8,9 +8,9 @@ mod vmware_cd_rom; #[cfg(target_arch = "x86_64")] mod vmware_guestinfo; -use crate::compression::expand_file_maybe; -use crate::settings::SettingsJson; -use crate::LOG_LEVEL_ENV_VAR; +use user_data_provider::compression::expand_file_maybe; +use user_data_provider::settings::SettingsJson; +use user_data_provider::LOG_LEVEL_ENV_VAR; use async_trait::async_trait; pub use ec2_identity_doc::Ec2IdentityDoc; pub use ec2_imds::Ec2Imds; @@ -112,7 +112,7 @@ mod error { #[snafu(display("Unable to serialize settings from {}: {}", from.display(), source))] SettingsToJSON { from: PathBuf, - source: crate::settings::Error, + source: user_data_provider::settings::Error, }, } } diff --git a/sources/api/early-boot-config/src/provider/ec2_identity_doc.rs b/sources/api/early-boot-config/src/provider/ec2_identity_doc.rs index 39b00eb2233..9ea30065ce1 100644 --- a/sources/api/early-boot-config/src/provider/ec2_identity_doc.rs +++ b/sources/api/early-boot-config/src/provider/ec2_identity_doc.rs @@ -1,11 +1,11 @@ /// EC2 Identity Document -use super::UserDataProvider; -use crate::settings::SettingsJson; use async_trait::async_trait; use imdsclient::ImdsClient; use serde_json::json; use snafu::{OptionExt, ResultExt}; use std::{fs, path::Path}; +use user_data_provider::provider::UserDataProvider; +use user_data_provider::settings::SettingsJson; const IDENTITY_DOCUMENT_FILE: &str = "/etc/early-boot-config/identity-document"; const FALLBACK_REGION: &str = "us-east-1"; @@ -91,7 +91,7 @@ mod error { #[snafu(display("Unable to serialize settings from {}: {}", from, source))] SettingsToJSON { from: String, - source: crate::settings::Error, + source: user_data_provider::settings::Error, }, #[snafu(display( diff --git a/sources/api/early-boot-config/src/provider/ec2_imds.rs b/sources/api/early-boot-config/src/provider/ec2_imds.rs index 0d023b7576f..293fa19dde4 100644 --- a/sources/api/early-boot-config/src/provider/ec2_imds.rs +++ b/sources/api/early-boot-config/src/provider/ec2_imds.rs @@ -1,10 +1,10 @@ /// EC2 Instance Metadata Service -use super::UserDataProvider; -use crate::compression::expand_slice_maybe; -use crate::settings::SettingsJson; use async_trait::async_trait; use imdsclient::ImdsClient; use snafu::ResultExt; +use user_data_provider::compression::expand_slice_maybe; +use user_data_provider::provider::UserDataProvider; +use user_data_provider::settings::SettingsJson; pub struct Ec2Imds; @@ -59,7 +59,7 @@ mod error { #[snafu(display("Unable to serialize settings from {}: {}", from, source))] SettingsToJSON { from: String, - source: crate::settings::Error, + source: user_data_provider::settings::Error, }, } } diff --git a/sources/api/early-boot-config/src/provider/local_defaults.rs b/sources/api/early-boot-config/src/provider/local_defaults.rs index 47edacb6619..8cd5f90f879 100644 --- a/sources/api/early-boot-config/src/provider/local_defaults.rs +++ b/sources/api/early-boot-config/src/provider/local_defaults.rs @@ -1,7 +1,7 @@ /// Site-local defaults -use super::{user_data_from_file, UserDataProvider}; -use crate::settings::SettingsJson; use async_trait::async_trait; +use user_data_provider::provider::{user_data_from_file, UserDataProvider}; +use user_data_provider::settings::SettingsJson; const LOCAL_DEFAULTS_FILE: &str = "/local/user-data-defaults.toml"; diff --git a/sources/api/early-boot-config/src/provider/local_overrides.rs b/sources/api/early-boot-config/src/provider/local_overrides.rs index a11c1db1dd8..dde4019f2ac 100644 --- a/sources/api/early-boot-config/src/provider/local_overrides.rs +++ b/sources/api/early-boot-config/src/provider/local_overrides.rs @@ -1,7 +1,7 @@ /// Site-local overrides -use super::{user_data_from_file, UserDataProvider}; -use crate::settings::SettingsJson; use async_trait::async_trait; +use user_data_provider::provider::{user_data_from_file, UserDataProvider}; +use user_data_provider::settings::SettingsJson; const LOCAL_OVERRIDES: &str = "/local/user-data-overrides.toml"; diff --git a/sources/api/early-boot-config/src/provider/local_user_data.rs b/sources/api/early-boot-config/src/provider/local_user_data.rs index 02c73e311f3..32f2b48c3c3 100644 --- a/sources/api/early-boot-config/src/provider/local_user_data.rs +++ b/sources/api/early-boot-config/src/provider/local_user_data.rs @@ -1,7 +1,7 @@ /// Local user data file -use super::{user_data_from_file, UserDataProvider}; -use crate::settings::SettingsJson; use async_trait::async_trait; +use user_data_provider::provider::{user_data_from_file, UserDataProvider}; +use user_data_provider::settings::SettingsJson; const LOCAL_USER_DATA: &str = "/var/lib/bottlerocket/user-data.toml"; diff --git a/sources/api/early-boot-config/src/provider/vmware_cd_rom.rs b/sources/api/early-boot-config/src/provider/vmware_cd_rom.rs index 87e0e14fbb1..2bde5e30d05 100644 --- a/sources/api/early-boot-config/src/provider/vmware_cd_rom.rs +++ b/sources/api/early-boot-config/src/provider/vmware_cd_rom.rs @@ -1,7 +1,4 @@ /// VMWare CD-ROM -use super::UserDataProvider; -use crate::compression::{expand_file_maybe, expand_slice_maybe, OptionalCompressionReader}; -use crate::settings::SettingsJson; use async_trait::async_trait; use base64::Engine; use serde::Deserialize; @@ -10,6 +7,11 @@ use std::ffi::OsStr; use std::fs::File; use std::io::BufReader; use std::path::{Path, PathBuf}; +use user_data_provider::compression::{ + expand_file_maybe, expand_slice_maybe, OptionalCompressionReader, +}; +use user_data_provider::provider::UserDataProvider; +use user_data_provider::settings::SettingsJson; // This program expects that the CD-ROM is already mounted. Mounting happens elsewhere in a // systemd unit file @@ -201,7 +203,7 @@ mod error { #[snafu(display("Unable to serialize settings from {}: {}", from, source))] SettingsToJson { from: String, - source: crate::settings::Error, + source: user_data_provider::settings::Error, }, #[snafu(display("Found multiple user data files in '{}', expected 1", place))] diff --git a/sources/api/early-boot-config/src/provider/vmware_guestinfo.rs b/sources/api/early-boot-config/src/provider/vmware_guestinfo.rs index 4d94f7cf9cd..ddf849688ee 100644 --- a/sources/api/early-boot-config/src/provider/vmware_guestinfo.rs +++ b/sources/api/early-boot-config/src/provider/vmware_guestinfo.rs @@ -1,6 +1,6 @@ /// VMWare guestinfo -use super::UserDataProvider; -use crate::{compression::OptionalCompressionReader, settings::SettingsJson}; +use user_data_provider::provider::UserDataProvider; +use user_data_provider::{compression::OptionalCompressionReader, settings::SettingsJson}; use async_trait::async_trait; use serde::Deserialize; use snafu::{ensure, ResultExt}; @@ -182,7 +182,7 @@ mod error { #[snafu(display("Unable to serialize settings from {}: {}", from, source))] SettingsToJson { from: String, - source: crate::settings::Error, + source: user_data_provider::settings::Error, }, #[snafu(display("Unknown user data encoding: '{}': {}", encoding, source))] diff --git a/sources/api/early-boot-config/src/settings.rs b/sources/api/early-boot-config/src/settings.rs deleted file mode 100644 index 461e6f9eb8c..00000000000 --- a/sources/api/early-boot-config/src/settings.rs +++ /dev/null @@ -1,75 +0,0 @@ -//! The settings module owns the `SettingsJson` struct which contains the JSON settings data being -//! sent to the API. - -use serde::{Deserialize, Serialize}; -use snafu::{OptionExt, ResultExt}; - -/// SettingsJson represents a change that a provider would like to make in the API. -#[derive(Debug, Serialize, Deserialize)] -pub struct SettingsJson { - pub json: serde_json::Value, - pub desc: String, -} - -impl SettingsJson { - /// Construct a SettingsJson from a serializable object and a description of that object, - /// which is used for logging. - /// - /// The serializable object is typically something like a toml::Value or serde_json::Value, - /// since they can be easily deserialized from text input in the platform, and manipulated as - /// desired. - pub(crate) fn from_val(data: &impl Serialize, desc: S) -> Result - where - S: Into, - { - Ok(Self { - json: serde_json::to_value(data).context(error::SettingsToJSONSnafu)?, - desc: desc.into(), - }) - } - - /// Construct a SettingsJson from a string containing TOML-formatted data and a description of - /// the object, which is used for logging. - /// - /// This method takes care of the easy-to-miss task of removing the outer `settings` layer from - /// the TOML data before it gets submitted to the API. - pub(crate) fn from_toml_str(data: S1, desc: S2) -> Result - where - S1: AsRef, - S2: Into, - { - let mut val: toml::Value = - toml::from_str(data.as_ref()).context(error::TOMLUserDataParseSnafu)?; - let table = val - .as_table_mut() - .context(error::UserDataNotTomlTableSnafu)?; - let inner = table - .remove("settings") - .context(error::UserDataMissingSettingsSnafu)?; - - SettingsJson::from_val(&inner, desc) - } -} - -mod error { - use snafu::Snafu; - - #[derive(Debug, Snafu)] - #[snafu(visibility(pub(crate)))] - pub(crate) enum Error { - #[snafu(display("Error serializing settings to JSON: {}", source))] - SettingsToJSON { source: serde_json::error::Error }, - - #[snafu(display("Error parsing TOML user data: {}", source))] - TOMLUserDataParse { source: toml::de::Error }, - - #[snafu(display("TOML data did not contain 'settings' section"))] - UserDataMissingSettings, - - #[snafu(display("Data is not a TOML table"))] - UserDataNotTomlTable, - } -} - -pub(crate) use error::Error; -type Result = std::result::Result; From 78f6caddbd481e6416d6f8b17af8ef1d664a27c1 Mon Sep 17 00:00:00 2001 From: Sam Berning Date: Wed, 28 Feb 2024 20:08:58 +0000 Subject: [PATCH 29/41] user-data-providers: create standalone vmware providers Signed-off-by: Sam Berning --- packages/early-boot-config/Cargo.toml | 3 ++ .../early-boot-config/early-boot-config.spec | 25 ++++++++++++---- sources/Cargo.lock | 29 +++++++++++++++++++ sources/Cargo.toml | 3 ++ .../user-data-providers/vmware_guestinfo.rs | 19 ------------ sources/api/early-boot-config/src/provider.rs | 6 ---- .../vmware-cd-rom/Cargo.toml | 19 ++++++++++++ .../vmware-cd-rom/src/lib.rs} | 3 ++ .../vmware-cd-rom/src/main.rs} | 2 +- .../test_data/namespaced_keys.xml | 0 .../vmware-cd-rom}/test_data/ovf-env.xml | 0 .../vmware-guestinfo/Cargo.toml | 20 +++++++++++++ .../vmware-guestinfo/src/lib.rs} | 7 +++-- .../vmware-guestinfo/src/main.rs | 9 ++++++ 14 files changed, 112 insertions(+), 33 deletions(-) delete mode 100644 sources/api/early-boot-config/src/bin/user-data-providers/vmware_guestinfo.rs create mode 100644 sources/user-data-providers/vmware-cd-rom/Cargo.toml rename sources/{api/early-boot-config/src/provider/vmware_cd_rom.rs => user-data-providers/vmware-cd-rom/src/lib.rs} (99%) rename sources/{api/early-boot-config/src/bin/user-data-providers/vmware_cd_rom.rs => user-data-providers/vmware-cd-rom/src/main.rs} (82%) rename sources/{api/early-boot-config => user-data-providers/vmware-cd-rom}/test_data/namespaced_keys.xml (100%) rename sources/{api/early-boot-config => user-data-providers/vmware-cd-rom}/test_data/ovf-env.xml (100%) create mode 100644 sources/user-data-providers/vmware-guestinfo/Cargo.toml rename sources/{api/early-boot-config/src/provider/vmware_guestinfo.rs => user-data-providers/vmware-guestinfo/src/lib.rs} (99%) create mode 100644 sources/user-data-providers/vmware-guestinfo/src/main.rs diff --git a/packages/early-boot-config/Cargo.toml b/packages/early-boot-config/Cargo.toml index e3eb88f784b..5e93ce1639e 100644 --- a/packages/early-boot-config/Cargo.toml +++ b/packages/early-boot-config/Cargo.toml @@ -11,6 +11,9 @@ path = "../packages.rs" [package.metadata.build-package] source-groups = [ "api/early-boot-config", + + "user-data-providers/vmware-cd-rom", + "user-data-providers/vmware-guestinfo", ] # RPM BuildRequires diff --git a/packages/early-boot-config/early-boot-config.spec b/packages/early-boot-config/early-boot-config.spec index 5f39f126332..5447bfc6c20 100644 --- a/packages/early-boot-config/early-boot-config.spec +++ b/packages/early-boot-config/early-boot-config.spec @@ -40,6 +40,7 @@ Requires: %{_cross_os}early-boot-config-local %description -n %{_cross_os}early-boot-config-aws %{summary}. +%ifarch x86_64 %package -n %{_cross_os}early-boot-config-vmware Summary: early-boot-config package for vmware Provides: %{_cross_os}early-boot-config @@ -48,6 +49,7 @@ Requires: %{_cross_os}early-boot-config-data-providers Requires: %{_cross_os}early-boot-config-local %description -n %{_cross_os}early-boot-config-vmware %{summary}. +%endif %package -n %{_cross_os}early-boot-config-metal Summary: early-boot-config package for metal @@ -71,8 +73,12 @@ Requires: %{_cross_os}early-boot-config-local --bin local-user-data-provider \ --bin local-defaults-provider \ --bin local-overrides-provider \ - --bin vmware-cd-rom-provider \ - --bin vmware-guestinfo-provider + +%ifarch x86_64 +%cargo_build --manifest-path %{_builddir}/sources/Cargo.toml \ + -p vmware-cd-rom-user-data-provider \ + -p vmware-guestinfo-user-data-provider +%endif %install install -d %{buildroot}%{_cross_bindir} @@ -88,9 +94,14 @@ install -p -m 0755 \ ${HOME}/.cache/%{__cargo_target}/release/local-user-data-provider \ ${HOME}/.cache/%{__cargo_target}/release/local-defaults-provider \ ${HOME}/.cache/%{__cargo_target}/release/local-overrides-provider \ + %{buildroot}%{_cross_libexecdir}/early-boot-config/bin + +%ifarch x86_64 +install -p -m 0755 \ ${HOME}/.cache/%{__cargo_target}/release/vmware-cd-rom-provider \ - ${HOME}/.cache/%{__cargo_target}/release/vmware-guestinfo-provider \ + ${HOME}/.cache/%{__cargo_target}/release/vmware-guestinfo-user-data-provider \ %{buildroot}%{_cross_libexecdir}/early-boot-config/bin +%endif install -d %{buildroot}%{_cross_datadir}/early-boot-config/data-providers.d @@ -103,9 +114,11 @@ posix.symlink("../../../libexec/early-boot-config/bin/local-user-data-provider", posix.symlink("../../../libexec/early-boot-config/bin/local-defaults-provider", "%{_cross_datadir}/early-boot-config/data-providers.d/10-local-defaults") posix.symlink("../../../libexec/early-boot-config/bin/local-overrides-provider", "%{_cross_datadir}/early-boot-config/data-providers.d/50-local-overrides") +%ifarch x86_64 %post -n %{_cross_os}early-boot-config-vmware -p posix.symlink("../../../libexec/early-boot-config/bin/vmware-cd-rom-provider", "%{_cross_datadir}/early-boot-config/data-providers.d/30-vmware-cd-rom") -posix.symlink("../../../libexec/early-boot-config/bin/vmware-guestinfo-provider", "%{_cross_datadir}/early-boot-config/data-providers.d/40-vmware-guestinfo") +posix.symlink("../../../libexec/early-boot-config/bin/vmware-guestinfo-user-data-provider", "%{_cross_datadir}/early-boot-config/data-providers.d/40-vmware-guestinfo") +%endif %files -n %{_cross_os}early-boot-config-common %{_cross_bindir}/early-boot-config @@ -123,8 +136,10 @@ posix.symlink("../../../libexec/early-boot-config/bin/vmware-guestinfo-provider" %{_cross_libexecdir}/early-boot-config/bin/ec2-identity-doc-provider %{_cross_libexecdir}/early-boot-config/bin/ec2-imds-provider +%ifarch x86_64 %files -n %{_cross_os}early-boot-config-vmware %{_cross_libexecdir}/early-boot-config/bin/vmware-cd-rom-provider -%{_cross_libexecdir}/early-boot-config/bin/vmware-guestinfo-provider +%{_cross_libexecdir}/early-boot-config/bin/vmware-guestinfo-user-data-provider +%endif %files -n %{_cross_os}early-boot-config-metal diff --git a/sources/Cargo.lock b/sources/Cargo.lock index 788e93fc3c5..a9a145b6a93 100644 --- a/sources/Cargo.lock +++ b/sources/Cargo.lock @@ -4766,6 +4766,35 @@ dependencies = [ "thiserror", ] +[[package]] +name = "vmware-cd-rom-user-data-provider" +version = "0.1.0" +dependencies = [ + "async-trait", + "base64 0.13.1", + "log", + "serde", + "serde-xml-rs", + "snafu", + "tokio", + "user-data-provider", +] + +[[package]] +name = "vmware-guestinfo-user-data-provider" +version = "0.1.0" +dependencies = [ + "async-trait", + "base64 0.13.1", + "log", + "serde", + "serde_plain", + "snafu", + "tokio", + "user-data-provider", + "vmw_backdoor", +] + [[package]] name = "vsimd" version = "0.8.0" diff --git a/sources/Cargo.toml b/sources/Cargo.toml index 3b9b0138c56..ff78fc56276 100644 --- a/sources/Cargo.toml +++ b/sources/Cargo.toml @@ -120,6 +120,9 @@ members = [ "updater/update_metadata", "updater/updog", + "user-data-providers/vmware-cd-rom", + "user-data-providers/vmware-guestinfo", + "constants", "shimpei", diff --git a/sources/api/early-boot-config/src/bin/user-data-providers/vmware_guestinfo.rs b/sources/api/early-boot-config/src/bin/user-data-providers/vmware_guestinfo.rs deleted file mode 100644 index 6c81ab6fd7b..00000000000 --- a/sources/api/early-boot-config/src/bin/user-data-providers/vmware_guestinfo.rs +++ /dev/null @@ -1,19 +0,0 @@ -#[cfg(target_arch = "x86_64")] -use early_boot_config::provider::VmwareGuestinfo; -use std::process::ExitCode; -#[cfg(target_arch = "x86_64")] -use user_data_provider::provider::{run_userdata_provider, setup_provider_logging}; - -#[tokio::main] -async fn main() -> ExitCode { - #[cfg(target_arch = "x86_64")] - { - setup_provider_logging(); - run_userdata_provider(&VmwareGuestinfo).await - } - #[cfg(not(target_arch = "x86_64"))] - { - println!(""); - ExitCode::SUCCESS - } -} diff --git a/sources/api/early-boot-config/src/provider.rs b/sources/api/early-boot-config/src/provider.rs index 5e054737abf..3d9474c7dc3 100644 --- a/sources/api/early-boot-config/src/provider.rs +++ b/sources/api/early-boot-config/src/provider.rs @@ -4,9 +4,6 @@ mod ec2_imds; mod local_defaults; mod local_overrides; mod local_user_data; -mod vmware_cd_rom; -#[cfg(target_arch = "x86_64")] -mod vmware_guestinfo; use user_data_provider::compression::expand_file_maybe; use user_data_provider::settings::SettingsJson; @@ -21,9 +18,6 @@ pub use local_user_data::LocalUserData; use snafu::ResultExt; use std::path::Path; use std::process::ExitCode; -pub use vmware_cd_rom::VmwareCdRom; -#[cfg(target_arch = "x86_64")] -pub use vmware_guestinfo::VmwareGuestinfo; /// Support for user data providers can be added by implementing this trait, and adding an /// additional binary using the implementor and common functions below. diff --git a/sources/user-data-providers/vmware-cd-rom/Cargo.toml b/sources/user-data-providers/vmware-cd-rom/Cargo.toml new file mode 100644 index 00000000000..3137df1f615 --- /dev/null +++ b/sources/user-data-providers/vmware-cd-rom/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "vmware-cd-rom-user-data-provider" +version = "0.1.0" +authors = ["Zac Mrowicki ", "Sam Berning "] +edition = "2021" +license = "Apache-2.0 OR MIT" +publish = false + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +async-trait = "0.1" +base64 = "0.13" +log = "0.4" +serde = { version = "1", features = ["derive"] } +serde-xml-rs = "0.6" +snafu = "0.7" +tokio = { version = "~1.32", default-features = false, features = ["process", "macros", "rt-multi-thread"] } # LTS +user-data-provider = { path = "../../api/user-data-provider", version = "0.1" } diff --git a/sources/api/early-boot-config/src/provider/vmware_cd_rom.rs b/sources/user-data-providers/vmware-cd-rom/src/lib.rs similarity index 99% rename from sources/api/early-boot-config/src/provider/vmware_cd_rom.rs rename to sources/user-data-providers/vmware-cd-rom/src/lib.rs index 2bde5e30d05..4776d99fe07 100644 --- a/sources/api/early-boot-config/src/provider/vmware_cd_rom.rs +++ b/sources/user-data-providers/vmware-cd-rom/src/lib.rs @@ -1,4 +1,7 @@ /// VMWare CD-ROM +#[macro_use] +extern crate log; + use async_trait::async_trait; use base64::Engine; use serde::Deserialize; diff --git a/sources/api/early-boot-config/src/bin/user-data-providers/vmware_cd_rom.rs b/sources/user-data-providers/vmware-cd-rom/src/main.rs similarity index 82% rename from sources/api/early-boot-config/src/bin/user-data-providers/vmware_cd_rom.rs rename to sources/user-data-providers/vmware-cd-rom/src/main.rs index 7809f339f1c..39735e5d3f2 100644 --- a/sources/api/early-boot-config/src/bin/user-data-providers/vmware_cd_rom.rs +++ b/sources/user-data-providers/vmware-cd-rom/src/main.rs @@ -1,6 +1,6 @@ -use early_boot_config::provider::VmwareCdRom; use std::process::ExitCode; use user_data_provider::provider::{run_userdata_provider, setup_provider_logging}; +use vmware_cd_rom_user_data_provider::VmwareCdRom; #[tokio::main] async fn main() -> ExitCode { diff --git a/sources/api/early-boot-config/test_data/namespaced_keys.xml b/sources/user-data-providers/vmware-cd-rom/test_data/namespaced_keys.xml similarity index 100% rename from sources/api/early-boot-config/test_data/namespaced_keys.xml rename to sources/user-data-providers/vmware-cd-rom/test_data/namespaced_keys.xml diff --git a/sources/api/early-boot-config/test_data/ovf-env.xml b/sources/user-data-providers/vmware-cd-rom/test_data/ovf-env.xml similarity index 100% rename from sources/api/early-boot-config/test_data/ovf-env.xml rename to sources/user-data-providers/vmware-cd-rom/test_data/ovf-env.xml diff --git a/sources/user-data-providers/vmware-guestinfo/Cargo.toml b/sources/user-data-providers/vmware-guestinfo/Cargo.toml new file mode 100644 index 00000000000..2fc4b8eca94 --- /dev/null +++ b/sources/user-data-providers/vmware-guestinfo/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "vmware-guestinfo-user-data-provider" +version = "0.1.0" +authors = ["Zac Mrowicki ", "Sam Berning "] +edition = "2021" +license = "Apache-2.0 OR MIT" +publish = false + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +async-trait = "0.1" +base64 = "0.13" +log = "0.4" +serde = { version = "1", features = ["derive"] } +serde_plain = "1" +snafu = "0.7" +tokio = { version = "~1.32", default-features = false, features = ["process", "macros", "rt-multi-thread"] } # LTS +user-data-provider = { path = "../../api/user-data-provider", version = "0.1" } +vmw_backdoor = "0.2" diff --git a/sources/api/early-boot-config/src/provider/vmware_guestinfo.rs b/sources/user-data-providers/vmware-guestinfo/src/lib.rs similarity index 99% rename from sources/api/early-boot-config/src/provider/vmware_guestinfo.rs rename to sources/user-data-providers/vmware-guestinfo/src/lib.rs index ddf849688ee..86be52fade6 100644 --- a/sources/api/early-boot-config/src/provider/vmware_guestinfo.rs +++ b/sources/user-data-providers/vmware-guestinfo/src/lib.rs @@ -1,10 +1,13 @@ /// VMWare guestinfo -use user_data_provider::provider::UserDataProvider; -use user_data_provider::{compression::OptionalCompressionReader, settings::SettingsJson}; +#[macro_use] +extern crate log; + use async_trait::async_trait; use serde::Deserialize; use snafu::{ensure, ResultExt}; use std::io::{Cursor, Read}; +use user_data_provider::provider::UserDataProvider; +use user_data_provider::{compression::OptionalCompressionReader, settings::SettingsJson}; // The fields in which user data and its encoding are stored in guestinfo const GUESTINFO_USERDATA: &str = "guestinfo.userdata"; diff --git a/sources/user-data-providers/vmware-guestinfo/src/main.rs b/sources/user-data-providers/vmware-guestinfo/src/main.rs new file mode 100644 index 00000000000..2b0f0144a12 --- /dev/null +++ b/sources/user-data-providers/vmware-guestinfo/src/main.rs @@ -0,0 +1,9 @@ +use std::process::ExitCode; +use user_data_provider::provider::{run_userdata_provider, setup_provider_logging}; +use vmware_guestinfo_user_data_provider::VmwareGuestinfo; + +#[tokio::main] +async fn main() -> ExitCode { + setup_provider_logging(); + run_userdata_provider(&VmwareGuestinfo).await +} From d804277028e01e5eaf1b02cc376667cc0660e9da Mon Sep 17 00:00:00 2001 From: Sam Berning Date: Wed, 28 Feb 2024 22:27:19 +0000 Subject: [PATCH 30/41] user-data-providers: creates standalone local providers Signed-off-by: Sam Berning --- packages/early-boot-config/Cargo.toml | 3 ++ .../early-boot-config/early-boot-config.spec | 36 ++++++++++--------- sources/Cargo.lock | 27 ++++++++++++++ sources/Cargo.toml | 3 ++ sources/api/early-boot-config/src/provider.rs | 6 ---- .../local-defaults/Cargo.toml | 14 ++++++++ .../local-defaults/src/lib.rs} | 0 .../local-defaults/src/main.rs} | 2 +- .../user-data-providers/local-file/Cargo.toml | 14 ++++++++ .../local-file/src/lib.rs} | 0 .../local-file/src/main.rs} | 2 +- .../local-overrides/Cargo.toml | 14 ++++++++ .../local-overrides/src/lib.rs} | 0 .../local-overrides/src/main.rs} | 2 +- 14 files changed, 98 insertions(+), 25 deletions(-) create mode 100644 sources/user-data-providers/local-defaults/Cargo.toml rename sources/{api/early-boot-config/src/provider/local_defaults.rs => user-data-providers/local-defaults/src/lib.rs} (100%) rename sources/{api/early-boot-config/src/bin/user-data-providers/local_defaults.rs => user-data-providers/local-defaults/src/main.rs} (81%) create mode 100644 sources/user-data-providers/local-file/Cargo.toml rename sources/{api/early-boot-config/src/provider/local_user_data.rs => user-data-providers/local-file/src/lib.rs} (100%) rename sources/{api/early-boot-config/src/bin/user-data-providers/local_user_data.rs => user-data-providers/local-file/src/main.rs} (82%) create mode 100644 sources/user-data-providers/local-overrides/Cargo.toml rename sources/{api/early-boot-config/src/provider/local_overrides.rs => user-data-providers/local-overrides/src/lib.rs} (100%) rename sources/{api/early-boot-config/src/bin/user-data-providers/local_overrides.rs => user-data-providers/local-overrides/src/main.rs} (80%) diff --git a/packages/early-boot-config/Cargo.toml b/packages/early-boot-config/Cargo.toml index 5e93ce1639e..768fa07d031 100644 --- a/packages/early-boot-config/Cargo.toml +++ b/packages/early-boot-config/Cargo.toml @@ -12,6 +12,9 @@ path = "../packages.rs" source-groups = [ "api/early-boot-config", + "user-data-providers/local-defaults", + "user-data-providers/local-file", + "user-data-providers/local-overrides", "user-data-providers/vmware-cd-rom", "user-data-providers/vmware-guestinfo", ] diff --git a/packages/early-boot-config/early-boot-config.spec b/packages/early-boot-config/early-boot-config.spec index 5447bfc6c20..942e07db3ad 100644 --- a/packages/early-boot-config/early-boot-config.spec +++ b/packages/early-boot-config/early-boot-config.spec @@ -69,12 +69,16 @@ Requires: %{_cross_os}early-boot-config-local -p early-boot-config \ --bin early-boot-config \ --bin ec2-identity-doc-provider \ - --bin ec2-imds-provider \ - --bin local-user-data-provider \ - --bin local-defaults-provider \ - --bin local-overrides-provider \ + --bin ec2-imds-provider + +# build local file user data providers +%cargo_build --manifest-path %{_builddir}/sources/Cargo.toml \ + -p local-defaults-user-data-provider \ + -p local-file-user-data-provider \ + -p local-overrides-user-data-provider %ifarch x86_64 +# build vmware user data providers %cargo_build --manifest-path %{_builddir}/sources/Cargo.toml \ -p vmware-cd-rom-user-data-provider \ -p vmware-guestinfo-user-data-provider @@ -91,14 +95,14 @@ install -d %{buildroot}%{_cross_libexecdir}/early-boot-config/bin install -p -m 0755 \ ${HOME}/.cache/%{__cargo_target}/release/ec2-identity-doc-provider \ ${HOME}/.cache/%{__cargo_target}/release/ec2-imds-provider \ - ${HOME}/.cache/%{__cargo_target}/release/local-user-data-provider \ - ${HOME}/.cache/%{__cargo_target}/release/local-defaults-provider \ - ${HOME}/.cache/%{__cargo_target}/release/local-overrides-provider \ + ${HOME}/.cache/%{__cargo_target}/release/local-defaults-user-data-provider \ + ${HOME}/.cache/%{__cargo_target}/release/local-file-user-data-provider \ + ${HOME}/.cache/%{__cargo_target}/release/local-overrides-user-data-provider \ %{buildroot}%{_cross_libexecdir}/early-boot-config/bin %ifarch x86_64 install -p -m 0755 \ - ${HOME}/.cache/%{__cargo_target}/release/vmware-cd-rom-provider \ + ${HOME}/.cache/%{__cargo_target}/release/vmware-cd-rom-user-data-provider \ ${HOME}/.cache/%{__cargo_target}/release/vmware-guestinfo-user-data-provider \ %{buildroot}%{_cross_libexecdir}/early-boot-config/bin %endif @@ -110,13 +114,13 @@ posix.symlink("../../../libexec/early-boot-config/bin/ec2-identity-doc-provider" posix.symlink("../../../libexec/early-boot-config/bin/ec2-imds-provider", "%{_cross_datadir}/early-boot-config/data-providers.d/40-ec2-imds") %post -n %{_cross_os}early-boot-config-local -p -posix.symlink("../../../libexec/early-boot-config/bin/local-user-data-provider", "%{_cross_datadir}/early-boot-config/data-providers.d/20-local-user-data") -posix.symlink("../../../libexec/early-boot-config/bin/local-defaults-provider", "%{_cross_datadir}/early-boot-config/data-providers.d/10-local-defaults") -posix.symlink("../../../libexec/early-boot-config/bin/local-overrides-provider", "%{_cross_datadir}/early-boot-config/data-providers.d/50-local-overrides") +posix.symlink("../../../libexec/early-boot-config/bin/local-defaults-user-data-provider", "%{_cross_datadir}/early-boot-config/data-providers.d/10-local-defaults") +posix.symlink("../../../libexec/early-boot-config/bin/local-file-user-data-provider", "%{_cross_datadir}/early-boot-config/data-providers.d/20-local-user-data") +posix.symlink("../../../libexec/early-boot-config/bin/local-overrides-user-data-provider", "%{_cross_datadir}/early-boot-config/data-providers.d/50-local-overrides") %ifarch x86_64 %post -n %{_cross_os}early-boot-config-vmware -p -posix.symlink("../../../libexec/early-boot-config/bin/vmware-cd-rom-provider", "%{_cross_datadir}/early-boot-config/data-providers.d/30-vmware-cd-rom") +posix.symlink("../../../libexec/early-boot-config/bin/vmware-cd-rom-user-data-provider", "%{_cross_datadir}/early-boot-config/data-providers.d/30-vmware-cd-rom") posix.symlink("../../../libexec/early-boot-config/bin/vmware-guestinfo-user-data-provider", "%{_cross_datadir}/early-boot-config/data-providers.d/40-vmware-guestinfo") %endif @@ -128,9 +132,9 @@ posix.symlink("../../../libexec/early-boot-config/bin/vmware-guestinfo-user-data %dir %{_cross_datadir}/early-boot-config/data-providers.d %files -n %{_cross_os}early-boot-config-local -%{_cross_libexecdir}/early-boot-config/bin/local-user-data-provider -%{_cross_libexecdir}/early-boot-config/bin/local-defaults-provider -%{_cross_libexecdir}/early-boot-config/bin/local-overrides-provider +%{_cross_libexecdir}/early-boot-config/bin/local-file-user-data-provider +%{_cross_libexecdir}/early-boot-config/bin/local-defaults-user-data-provider +%{_cross_libexecdir}/early-boot-config/bin/local-overrides-user-data-provider %files -n %{_cross_os}early-boot-config-aws %{_cross_libexecdir}/early-boot-config/bin/ec2-identity-doc-provider @@ -138,7 +142,7 @@ posix.symlink("../../../libexec/early-boot-config/bin/vmware-guestinfo-user-data %ifarch x86_64 %files -n %{_cross_os}early-boot-config-vmware -%{_cross_libexecdir}/early-boot-config/bin/vmware-cd-rom-provider +%{_cross_libexecdir}/early-boot-config/bin/vmware-cd-rom-user-data-provider %{_cross_libexecdir}/early-boot-config/bin/vmware-guestinfo-user-data-provider %endif diff --git a/sources/Cargo.lock b/sources/Cargo.lock index a9a145b6a93..dbb4b9fac9e 100644 --- a/sources/Cargo.lock +++ b/sources/Cargo.lock @@ -2453,6 +2453,33 @@ dependencies = [ "local-waker", ] +[[package]] +name = "local-defaults-user-data-provider" +version = "0.1.0" +dependencies = [ + "async-trait", + "tokio", + "user-data-provider", +] + +[[package]] +name = "local-file-user-data-provider" +version = "0.1.0" +dependencies = [ + "async-trait", + "tokio", + "user-data-provider", +] + +[[package]] +name = "local-overrides-user-data-provider" +version = "0.1.0" +dependencies = [ + "async-trait", + "tokio", + "user-data-provider", +] + [[package]] name = "local-waker" version = "0.1.4" diff --git a/sources/Cargo.toml b/sources/Cargo.toml index ff78fc56276..ca00bfdf859 100644 --- a/sources/Cargo.toml +++ b/sources/Cargo.toml @@ -120,6 +120,9 @@ members = [ "updater/update_metadata", "updater/updog", + "user-data-providers/local-defaults", + "user-data-providers/local-file", + "user-data-providers/local-overrides", "user-data-providers/vmware-cd-rom", "user-data-providers/vmware-guestinfo", diff --git a/sources/api/early-boot-config/src/provider.rs b/sources/api/early-boot-config/src/provider.rs index 3d9474c7dc3..359c0a1fc8a 100644 --- a/sources/api/early-boot-config/src/provider.rs +++ b/sources/api/early-boot-config/src/provider.rs @@ -1,9 +1,6 @@ //! The provider module owns the `UserDataProvider` trait mod ec2_identity_doc; mod ec2_imds; -mod local_defaults; -mod local_overrides; -mod local_user_data; use user_data_provider::compression::expand_file_maybe; use user_data_provider::settings::SettingsJson; @@ -12,9 +9,6 @@ use async_trait::async_trait; pub use ec2_identity_doc::Ec2IdentityDoc; pub use ec2_imds::Ec2Imds; use env_logger::{Env, Target, WriteStyle}; -pub use local_defaults::LocalDefaults; -pub use local_overrides::LocalOverrides; -pub use local_user_data::LocalUserData; use snafu::ResultExt; use std::path::Path; use std::process::ExitCode; diff --git a/sources/user-data-providers/local-defaults/Cargo.toml b/sources/user-data-providers/local-defaults/Cargo.toml new file mode 100644 index 00000000000..760c1cd9a4a --- /dev/null +++ b/sources/user-data-providers/local-defaults/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "local-defaults-user-data-provider" +version = "0.1.0" +authors = ["Zac Mrowicki ", "Sam Berning "] +edition = "2021" +license = "Apache-2.0 OR MIT" +publish = false + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +async-trait = "0.1" +tokio = { version = "~1.32", default-features = false, features = ["process", "macros", "rt-multi-thread"] } # LTS +user-data-provider = { path = "../../api/user-data-provider", version = "0.1" } diff --git a/sources/api/early-boot-config/src/provider/local_defaults.rs b/sources/user-data-providers/local-defaults/src/lib.rs similarity index 100% rename from sources/api/early-boot-config/src/provider/local_defaults.rs rename to sources/user-data-providers/local-defaults/src/lib.rs diff --git a/sources/api/early-boot-config/src/bin/user-data-providers/local_defaults.rs b/sources/user-data-providers/local-defaults/src/main.rs similarity index 81% rename from sources/api/early-boot-config/src/bin/user-data-providers/local_defaults.rs rename to sources/user-data-providers/local-defaults/src/main.rs index 94680fbdff3..235acb07f3c 100644 --- a/sources/api/early-boot-config/src/bin/user-data-providers/local_defaults.rs +++ b/sources/user-data-providers/local-defaults/src/main.rs @@ -1,4 +1,4 @@ -use early_boot_config::provider::LocalDefaults; +use local_defaults_user_data_provider::LocalDefaults; use std::process::ExitCode; use user_data_provider::provider::{run_userdata_provider, setup_provider_logging}; diff --git a/sources/user-data-providers/local-file/Cargo.toml b/sources/user-data-providers/local-file/Cargo.toml new file mode 100644 index 00000000000..13a21777cbe --- /dev/null +++ b/sources/user-data-providers/local-file/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "local-file-user-data-provider" +version = "0.1.0" +authors = ["Zac Mrowicki ", "Sam Berning "] +edition = "2021" +license = "Apache-2.0 OR MIT" +publish = false + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +async-trait = "0.1" +tokio = { version = "~1.32", default-features = false, features = ["process", "macros", "rt-multi-thread"] } # LTS +user-data-provider = { path = "../../api/user-data-provider", version = "0.1" } diff --git a/sources/api/early-boot-config/src/provider/local_user_data.rs b/sources/user-data-providers/local-file/src/lib.rs similarity index 100% rename from sources/api/early-boot-config/src/provider/local_user_data.rs rename to sources/user-data-providers/local-file/src/lib.rs diff --git a/sources/api/early-boot-config/src/bin/user-data-providers/local_user_data.rs b/sources/user-data-providers/local-file/src/main.rs similarity index 82% rename from sources/api/early-boot-config/src/bin/user-data-providers/local_user_data.rs rename to sources/user-data-providers/local-file/src/main.rs index 238941c99f8..858616d7607 100644 --- a/sources/api/early-boot-config/src/bin/user-data-providers/local_user_data.rs +++ b/sources/user-data-providers/local-file/src/main.rs @@ -1,4 +1,4 @@ -use early_boot_config::provider::LocalUserData; +use local_file_user_data_provider::LocalUserData; use std::process::ExitCode; use user_data_provider::provider::{run_userdata_provider, setup_provider_logging}; diff --git a/sources/user-data-providers/local-overrides/Cargo.toml b/sources/user-data-providers/local-overrides/Cargo.toml new file mode 100644 index 00000000000..79fc9756bde --- /dev/null +++ b/sources/user-data-providers/local-overrides/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "local-overrides-user-data-provider" +version = "0.1.0" +authors = ["Zac Mrowicki ", "Sam Berning "] +edition = "2021" +license = "Apache-2.0 OR MIT" +publish = false + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +async-trait = "0.1" +tokio = { version = "~1.32", default-features = false, features = ["process", "macros", "rt-multi-thread"] } # LTS +user-data-provider = { path = "../../api/user-data-provider", version = "0.1" } diff --git a/sources/api/early-boot-config/src/provider/local_overrides.rs b/sources/user-data-providers/local-overrides/src/lib.rs similarity index 100% rename from sources/api/early-boot-config/src/provider/local_overrides.rs rename to sources/user-data-providers/local-overrides/src/lib.rs diff --git a/sources/api/early-boot-config/src/bin/user-data-providers/local_overrides.rs b/sources/user-data-providers/local-overrides/src/main.rs similarity index 80% rename from sources/api/early-boot-config/src/bin/user-data-providers/local_overrides.rs rename to sources/user-data-providers/local-overrides/src/main.rs index 8780357ec9f..84b6003b195 100644 --- a/sources/api/early-boot-config/src/bin/user-data-providers/local_overrides.rs +++ b/sources/user-data-providers/local-overrides/src/main.rs @@ -1,4 +1,4 @@ -use early_boot_config::provider::LocalOverrides; +use local_overrides_user_data_provider::LocalOverrides; use std::process::ExitCode; use user_data_provider::provider::{run_userdata_provider, setup_provider_logging}; From 0b1a4b2611bd52dda2daec145c08899ece3a5723 Mon Sep 17 00:00:00 2001 From: Sam Berning Date: Wed, 28 Feb 2024 22:49:12 +0000 Subject: [PATCH 31/41] user-data-providers: create standalone aws providers Signed-off-by: Sam Berning --- packages/early-boot-config/Cargo.toml | 2 ++ .../early-boot-config/early-boot-config.spec | 21 +++++++++------- sources/Cargo.lock | 25 +++++++++++++++++++ sources/Cargo.toml | 2 ++ sources/api/early-boot-config/src/provider.rs | 4 --- .../ec2-identity-doc/Cargo.toml | 18 +++++++++++++ .../ec2-identity-doc/src/lib.rs} | 3 +++ .../ec2-identity-doc/src/main.rs} | 2 +- .../user-data-providers/ec2-imds/Cargo.toml | 17 +++++++++++++ .../ec2-imds/src/lib.rs} | 3 +++ .../ec2-imds/src/main.rs} | 2 +- 11 files changed, 84 insertions(+), 15 deletions(-) create mode 100644 sources/user-data-providers/ec2-identity-doc/Cargo.toml rename sources/{api/early-boot-config/src/provider/ec2_identity_doc.rs => user-data-providers/ec2-identity-doc/src/lib.rs} (99%) rename sources/{api/early-boot-config/src/bin/user-data-providers/ec2_identity_doc.rs => user-data-providers/ec2-identity-doc/src/main.rs} (80%) create mode 100644 sources/user-data-providers/ec2-imds/Cargo.toml rename sources/{api/early-boot-config/src/provider/ec2_imds.rs => user-data-providers/ec2-imds/src/lib.rs} (98%) rename sources/{api/early-boot-config/src/bin/user-data-providers/ec2_imds.rs => user-data-providers/ec2-imds/src/main.rs} (84%) diff --git a/packages/early-boot-config/Cargo.toml b/packages/early-boot-config/Cargo.toml index 768fa07d031..d2006410144 100644 --- a/packages/early-boot-config/Cargo.toml +++ b/packages/early-boot-config/Cargo.toml @@ -12,6 +12,8 @@ path = "../packages.rs" source-groups = [ "api/early-boot-config", + "user-data-providers/ec2-identity-doc", + "user-data-providers/ec2-imds", "user-data-providers/local-defaults", "user-data-providers/local-file", "user-data-providers/local-overrides", diff --git a/packages/early-boot-config/early-boot-config.spec b/packages/early-boot-config/early-boot-config.spec index 942e07db3ad..aacf140fa4d 100644 --- a/packages/early-boot-config/early-boot-config.spec +++ b/packages/early-boot-config/early-boot-config.spec @@ -67,9 +67,12 @@ Requires: %{_cross_os}early-boot-config-local %build %cargo_build --manifest-path %{_builddir}/sources/Cargo.toml \ -p early-boot-config \ - --bin early-boot-config \ - --bin ec2-identity-doc-provider \ - --bin ec2-imds-provider + --bin early-boot-config + +# build aws user data providers +%cargo_build --manifest-path %{_builddir}/sources/Cargo.toml \ + -p ec2-identity-doc-user-data-provider \ + -p ec2-imds-user-data-provider # build local file user data providers %cargo_build --manifest-path %{_builddir}/sources/Cargo.toml \ @@ -93,8 +96,8 @@ install -p -m 0644 %{S:100} %{buildroot}%{_cross_unitdir} install -d %{buildroot}%{_cross_libexecdir}/early-boot-config/bin install -p -m 0755 \ - ${HOME}/.cache/%{__cargo_target}/release/ec2-identity-doc-provider \ - ${HOME}/.cache/%{__cargo_target}/release/ec2-imds-provider \ + ${HOME}/.cache/%{__cargo_target}/release/ec2-identity-doc-user-data-provider \ + ${HOME}/.cache/%{__cargo_target}/release/ec2-imds-user-data-provider \ ${HOME}/.cache/%{__cargo_target}/release/local-defaults-user-data-provider \ ${HOME}/.cache/%{__cargo_target}/release/local-file-user-data-provider \ ${HOME}/.cache/%{__cargo_target}/release/local-overrides-user-data-provider \ @@ -110,8 +113,8 @@ install -p -m 0755 \ install -d %{buildroot}%{_cross_datadir}/early-boot-config/data-providers.d %post -n %{_cross_os}early-boot-config-aws -p -posix.symlink("../../../libexec/early-boot-config/bin/ec2-identity-doc-provider", "%{_cross_datadir}/early-boot-config/data-providers.d/30-ec2-identity-doc") -posix.symlink("../../../libexec/early-boot-config/bin/ec2-imds-provider", "%{_cross_datadir}/early-boot-config/data-providers.d/40-ec2-imds") +posix.symlink("../../../libexec/early-boot-config/bin/ec2-identity-doc-user-data-provider", "%{_cross_datadir}/early-boot-config/data-providers.d/30-ec2-identity-doc") +posix.symlink("../../../libexec/early-boot-config/bin/ec2-imds-user-data-provider", "%{_cross_datadir}/early-boot-config/data-providers.d/40-ec2-imds") %post -n %{_cross_os}early-boot-config-local -p posix.symlink("../../../libexec/early-boot-config/bin/local-defaults-user-data-provider", "%{_cross_datadir}/early-boot-config/data-providers.d/10-local-defaults") @@ -137,8 +140,8 @@ posix.symlink("../../../libexec/early-boot-config/bin/vmware-guestinfo-user-data %{_cross_libexecdir}/early-boot-config/bin/local-overrides-user-data-provider %files -n %{_cross_os}early-boot-config-aws -%{_cross_libexecdir}/early-boot-config/bin/ec2-identity-doc-provider -%{_cross_libexecdir}/early-boot-config/bin/ec2-imds-provider +%{_cross_libexecdir}/early-boot-config/bin/ec2-identity-doc-user-data-provider +%{_cross_libexecdir}/early-boot-config/bin/ec2-imds-user-data-provider %ifarch x86_64 %files -n %{_cross_os}early-boot-config-vmware diff --git a/sources/Cargo.lock b/sources/Cargo.lock index dbb4b9fac9e..e06f509f2a7 100644 --- a/sources/Cargo.lock +++ b/sources/Cargo.lock @@ -1715,6 +1715,31 @@ dependencies = [ "walkdir", ] +[[package]] +name = "ec2-identity-doc-user-data-provider" +version = "0.1.0" +dependencies = [ + "async-trait", + "imdsclient", + "log", + "serde_json", + "snafu", + "tokio", + "user-data-provider", +] + +[[package]] +name = "ec2-imds-user-data-provider" +version = "0.1.0" +dependencies = [ + "async-trait", + "imdsclient", + "log", + "snafu", + "tokio", + "user-data-provider", +] + [[package]] name = "either" version = "1.10.0" diff --git a/sources/Cargo.toml b/sources/Cargo.toml index ca00bfdf859..e6cfa705fce 100644 --- a/sources/Cargo.toml +++ b/sources/Cargo.toml @@ -120,6 +120,8 @@ members = [ "updater/update_metadata", "updater/updog", + "user-data-providers/ec2-identity-doc", + "user-data-providers/ec2-imds", "user-data-providers/local-defaults", "user-data-providers/local-file", "user-data-providers/local-overrides", diff --git a/sources/api/early-boot-config/src/provider.rs b/sources/api/early-boot-config/src/provider.rs index 359c0a1fc8a..ddf3642be00 100644 --- a/sources/api/early-boot-config/src/provider.rs +++ b/sources/api/early-boot-config/src/provider.rs @@ -1,13 +1,9 @@ //! The provider module owns the `UserDataProvider` trait -mod ec2_identity_doc; -mod ec2_imds; use user_data_provider::compression::expand_file_maybe; use user_data_provider::settings::SettingsJson; use user_data_provider::LOG_LEVEL_ENV_VAR; use async_trait::async_trait; -pub use ec2_identity_doc::Ec2IdentityDoc; -pub use ec2_imds::Ec2Imds; use env_logger::{Env, Target, WriteStyle}; use snafu::ResultExt; use std::path::Path; diff --git a/sources/user-data-providers/ec2-identity-doc/Cargo.toml b/sources/user-data-providers/ec2-identity-doc/Cargo.toml new file mode 100644 index 00000000000..ed7de315e61 --- /dev/null +++ b/sources/user-data-providers/ec2-identity-doc/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "ec2-identity-doc-user-data-provider" +version = "0.1.0" +authors = ["Zac Mrowicki ", "Sam Berning "] +edition = "2021" +license = "Apache-2.0 OR MIT" +publish = false + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +async-trait = "0.1" +imdsclient = { path = "../../imdsclient", version = "0.1" } +log = "0.4" +serde_json = "1" +snafu = "0.7" +tokio = { version = "~1.32", default-features = false, features = ["process", "macros", "rt-multi-thread"] } # LTS +user-data-provider = { path = "../../api/user-data-provider", version = "0.1" } diff --git a/sources/api/early-boot-config/src/provider/ec2_identity_doc.rs b/sources/user-data-providers/ec2-identity-doc/src/lib.rs similarity index 99% rename from sources/api/early-boot-config/src/provider/ec2_identity_doc.rs rename to sources/user-data-providers/ec2-identity-doc/src/lib.rs index 9ea30065ce1..33e883fd383 100644 --- a/sources/api/early-boot-config/src/provider/ec2_identity_doc.rs +++ b/sources/user-data-providers/ec2-identity-doc/src/lib.rs @@ -1,4 +1,7 @@ /// EC2 Identity Document +#[macro_use] +extern crate log; + use async_trait::async_trait; use imdsclient::ImdsClient; use serde_json::json; diff --git a/sources/api/early-boot-config/src/bin/user-data-providers/ec2_identity_doc.rs b/sources/user-data-providers/ec2-identity-doc/src/main.rs similarity index 80% rename from sources/api/early-boot-config/src/bin/user-data-providers/ec2_identity_doc.rs rename to sources/user-data-providers/ec2-identity-doc/src/main.rs index d226df0f477..4d1fde96a9d 100644 --- a/sources/api/early-boot-config/src/bin/user-data-providers/ec2_identity_doc.rs +++ b/sources/user-data-providers/ec2-identity-doc/src/main.rs @@ -1,4 +1,4 @@ -use early_boot_config::provider::Ec2IdentityDoc; +use ec2_identity_doc_user_data_provider::Ec2IdentityDoc; use std::process::ExitCode; use user_data_provider::provider::{run_userdata_provider, setup_provider_logging}; diff --git a/sources/user-data-providers/ec2-imds/Cargo.toml b/sources/user-data-providers/ec2-imds/Cargo.toml new file mode 100644 index 00000000000..cfb31624719 --- /dev/null +++ b/sources/user-data-providers/ec2-imds/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "ec2-imds-user-data-provider" +version = "0.1.0" +authors = ["Zac Mrowicki ", "Sam Berning "] +edition = "2021" +license = "Apache-2.0 OR MIT" +publish = false + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +async-trait = "0.1" +imdsclient = { path = "../../imdsclient", version = "0.1" } +log = "0.4" +snafu = "0.7" +tokio = { version = "~1.32", default-features = false, features = ["process", "macros", "rt-multi-thread"] } # LTS +user-data-provider = { path = "../../api/user-data-provider", version = "0.1" } diff --git a/sources/api/early-boot-config/src/provider/ec2_imds.rs b/sources/user-data-providers/ec2-imds/src/lib.rs similarity index 98% rename from sources/api/early-boot-config/src/provider/ec2_imds.rs rename to sources/user-data-providers/ec2-imds/src/lib.rs index 293fa19dde4..7c4d3f29de7 100644 --- a/sources/api/early-boot-config/src/provider/ec2_imds.rs +++ b/sources/user-data-providers/ec2-imds/src/lib.rs @@ -1,4 +1,7 @@ /// EC2 Instance Metadata Service +#[macro_use] +extern crate log; + use async_trait::async_trait; use imdsclient::ImdsClient; use snafu::ResultExt; diff --git a/sources/api/early-boot-config/src/bin/user-data-providers/ec2_imds.rs b/sources/user-data-providers/ec2-imds/src/main.rs similarity index 84% rename from sources/api/early-boot-config/src/bin/user-data-providers/ec2_imds.rs rename to sources/user-data-providers/ec2-imds/src/main.rs index fc10e170e07..4db3f413711 100644 --- a/sources/api/early-boot-config/src/bin/user-data-providers/ec2_imds.rs +++ b/sources/user-data-providers/ec2-imds/src/main.rs @@ -1,4 +1,4 @@ -use early_boot_config::provider::Ec2Imds; +use ec2_imds_user_data_provider::Ec2Imds; use std::process::ExitCode; use user_data_provider::provider::{run_userdata_provider, setup_provider_logging}; From aa26b7419ee92b6b30af05e12dd8d5fe03213ec5 Mon Sep 17 00:00:00 2001 From: Sam Berning Date: Wed, 28 Feb 2024 23:20:29 +0000 Subject: [PATCH 32/41] early-boot-config: remove providers Signed-off-by: Sam Berning --- sources/Cargo.lock | 5 - sources/api/early-boot-config/Cargo.toml | 42 +------- sources/api/early-boot-config/build.rs | 2 +- sources/api/early-boot-config/src/lib.rs | 7 -- .../src/{bin/early-boot-config.rs => main.rs} | 4 +- sources/api/early-boot-config/src/provider.rs | 102 ------------------ 6 files changed, 4 insertions(+), 158 deletions(-) delete mode 100644 sources/api/early-boot-config/src/lib.rs rename sources/api/early-boot-config/src/{bin/early-boot-config.rs => main.rs} (100%) delete mode 100644 sources/api/early-boot-config/src/provider.rs diff --git a/sources/Cargo.lock b/sources/Cargo.lock index e06f509f2a7..e86e66f1609 100644 --- a/sources/Cargo.lock +++ b/sources/Cargo.lock @@ -1694,16 +1694,12 @@ dependencies = [ "base64", "constants", "env_logger", - "flate2", "generate-readme", "hex-literal", "http 0.2.12", "imdsclient", "lazy_static", "log", - "retry-read", - "serde", - "serde-xml-rs", "serde_json", "serde_plain", "simplelog", @@ -1711,7 +1707,6 @@ dependencies = [ "tokio", "toml", "user-data-provider", - "vmw_backdoor", "walkdir", ] diff --git a/sources/api/early-boot-config/Cargo.toml b/sources/api/early-boot-config/Cargo.toml index 3e0753731d5..d8502ed921e 100644 --- a/sources/api/early-boot-config/Cargo.toml +++ b/sources/api/early-boot-config/Cargo.toml @@ -9,63 +9,23 @@ build = "build.rs" # Don't rebuild crate just because of changes to README. exclude = ["README.md"] -[[bin]] -name = "local-defaults-provider" -path = "src/bin/user-data-providers/local_defaults.rs" - -[[bin]] -name = "local-overrides-provider" -path = "src/bin/user-data-providers/local_overrides.rs" - -[[bin]] -name = "local-user-data-provider" -path = "src/bin/user-data-providers/local_user_data.rs" - -[[bin]] -name = "ec2-imds-provider" -path = "src/bin/user-data-providers/ec2_imds.rs" - -[[bin]] -name = "ec2-identity-doc-provider" -path = "src/bin/user-data-providers/ec2_identity_doc.rs" - -[[bin]] -name = "vmware-cd-rom-provider" -path = "src/bin/user-data-providers/vmware_cd_rom.rs" - -[[bin]] -name = "vmware-guestinfo-provider" -path = "src/bin/user-data-providers/vmware_guestinfo.rs" - [dependencies] apiclient = { path = "../apiclient", version = "0.1" } async-trait = "0.1" base64 = "0.21" constants = { path = "../../constants", version = "0.1" } env_logger = "0.10" -flate2 = { version = "1", default-features = false, features = ["rust_backend"] } http = "0.2" -imdsclient = { path = "../../imdsclient", version = "0.1" } log = "0.4" -retry-read = { path = "../../retry-read", version = "0.1" } -serde = { version = "1", features = ["derive"] } serde_json = "1" serde_plain = "1" serde-xml-rs = "0.6" simplelog = "0.12" snafu = "0.8" -tokio = { version = "~1.32", default-features = false, features = ["macros", "rt-multi-thread"] } # LTS +tokio = { version = "~1.32", default-features = false, features = ["process", "macros", "rt-multi-thread"] } # LTS toml = "0.8" user-data-provider = { path = "../user-data-provider", version = "0.1" } walkdir = "2.4" -[target.'cfg(target_arch = "x86_64")'.dependencies] -# vmw_backdoor includes x86_64 assembly, prevent it from building for ARM -vmw_backdoor = "0.2" - [build-dependencies] generate-readme = { version = "0.1", path = "../../generate-readme" } - -[dev-dependencies] -hex-literal = "0.3" -lazy_static = "1" diff --git a/sources/api/early-boot-config/build.rs b/sources/api/early-boot-config/build.rs index 93ce5521990..4764f5719ee 100644 --- a/sources/api/early-boot-config/build.rs +++ b/sources/api/early-boot-config/build.rs @@ -1,3 +1,3 @@ fn main() { - generate_readme::from_file("src/bin/early-boot-config.rs").unwrap(); + generate_readme::from_file("src/main.rs").unwrap(); } diff --git a/sources/api/early-boot-config/src/lib.rs b/sources/api/early-boot-config/src/lib.rs deleted file mode 100644 index 4a79b3f4b6e..00000000000 --- a/sources/api/early-boot-config/src/lib.rs +++ /dev/null @@ -1,7 +0,0 @@ -#[macro_use] -extern crate log; - -pub mod provider; - -/// The environment variable used to set log level for env_logger -pub const LOG_LEVEL_ENV_VAR: &str = "EARLY_BOOT_CONFIG_LOG_LEVEL"; diff --git a/sources/api/early-boot-config/src/bin/early-boot-config.rs b/sources/api/early-boot-config/src/main.rs similarity index 100% rename from sources/api/early-boot-config/src/bin/early-boot-config.rs rename to sources/api/early-boot-config/src/main.rs index 5b45961ce67..85cf20c45ea 100644 --- a/sources/api/early-boot-config/src/bin/early-boot-config.rs +++ b/sources/api/early-boot-config/src/main.rs @@ -11,8 +11,6 @@ User data provider binaries each implement the ability to obtain user data from #[macro_use] extern crate log; -use user_data_provider::settings::SettingsJson; -use user_data_provider::LOG_LEVEL_ENV_VAR; use env_logger::{Target, WriteStyle}; use log::LevelFilter; use snafu::{ensure, ResultExt}; @@ -21,6 +19,8 @@ use std::path::{Path, PathBuf}; use std::str::{self, FromStr}; use std::{env, io, process}; use tokio::process::Command as AsyncCommand; +use user_data_provider::settings::SettingsJson; +use user_data_provider::LOG_LEVEL_ENV_VAR; use walkdir::WalkDir; // TODO diff --git a/sources/api/early-boot-config/src/provider.rs b/sources/api/early-boot-config/src/provider.rs deleted file mode 100644 index ddf3642be00..00000000000 --- a/sources/api/early-boot-config/src/provider.rs +++ /dev/null @@ -1,102 +0,0 @@ -//! The provider module owns the `UserDataProvider` trait - -use user_data_provider::compression::expand_file_maybe; -use user_data_provider::settings::SettingsJson; -use user_data_provider::LOG_LEVEL_ENV_VAR; -use async_trait::async_trait; -use env_logger::{Env, Target, WriteStyle}; -use snafu::ResultExt; -use std::path::Path; -use std::process::ExitCode; - -/// Support for user data providers can be added by implementing this trait, and adding an -/// additional binary using the implementor and common functions below. -#[async_trait] -pub trait UserDataProvider { - /// Optionally return a SettingsJson object if user data is found, representing the settings to - /// send to the API. - async fn user_data( - &self, - ) -> std::result::Result, Box>; -} - -/// Run a user data provider, returning the proper exit code and errors, and if successful, -/// printing its JSON to stdout. -pub async fn run_userdata_provider(provider: &impl UserDataProvider) -> ExitCode { - let (exit_code, output) = match provider.user_data().await { - Ok(Some(user_data)) => match serde_json::to_string(&user_data) { - Ok(json) => (ExitCode::SUCCESS, json), - Err(e) => ( - ExitCode::FAILURE, - format!("Failed to serialize user data as JSON: {}", e), - ), - }, - Ok(None) => (ExitCode::SUCCESS, String::new()), - Err(e) => (ExitCode::FAILURE, format!("{}", e)), - }; - - println!("{}", output); - exit_code -} - -/// Convenience function to set up logging for provider binaries. -/// -/// Since provider binaries return their output to early-boot-config on stdout, we want to make -/// sure all logging happens to stderr. For debugging purposes, the binaries' log level may be -/// configured via environment variable. -pub fn setup_provider_logging() { - // Filter at info level by default unless configured via environment variable - let log_level = Env::default().filter_or(LOG_LEVEL_ENV_VAR, "info"); - env_logger::Builder::from_env(log_level) - .format_module_path(false) - .target(Target::Stderr) - .write_style(WriteStyle::Never) - .init() -} - -/// Read user data from a given path, decompressing if necessary -fn user_data_from_file>( - path: P, -) -> std::result::Result, Box> { - let path = path.as_ref(); - - if !path.exists() { - info!("{} does not exist, not using it", path.display()); - return Ok(None); - } - info!("'{}' exists, using it", path.display()); - - // Read the file, decompressing it if compressed. - let user_data_str = expand_file_maybe(path).context(error::InputFileReadSnafu { path })?; - - if user_data_str.is_empty() { - warn!("{} exists but is empty", path.display()); - return Ok(None); - } - - trace!("Received user data: {}", user_data_str); - let desc = format!("user data from {}", path.display()); - let json = SettingsJson::from_toml_str(&user_data_str, desc) - .context(error::SettingsToJSONSnafu { from: path })?; - - Ok(Some(json)) -} - -mod error { - use snafu::Snafu; - use std::io; - use std::path::PathBuf; - - #[derive(Debug, Snafu)] - #[snafu(visibility(pub(super)))] - pub(crate) enum Error { - #[snafu(display("Unable to read input file '{}': {}", path.display(), source))] - InputFileRead { path: PathBuf, source: io::Error }, - - #[snafu(display("Unable to serialize settings from {}: {}", from.display(), source))] - SettingsToJSON { - from: PathBuf, - source: user_data_provider::settings::Error, - }, - } -} From b8e367ea81b8bdee74d70cd08761c4481ff2a222 Mon Sep 17 00:00:00 2001 From: Sam Berning Date: Wed, 6 Mar 2024 02:08:50 +0000 Subject: [PATCH 33/41] early-boot-config: move out from under api Signed-off-by: Sam Berning --- packages/early-boot-config/Cargo.toml | 17 +- sources/Cargo.lock | 157 +++++++++--------- sources/Cargo.toml | 21 +-- .../early-boot-config-provider}/Cargo.toml | 15 +- .../early-boot-config-provider}/README.md | 2 +- .../early-boot-config-provider}/README.tpl | 0 .../early-boot-config-provider}/build.rs | 0 .../src/compression.rs | 0 .../early-boot-config-provider}/src/lib.rs | 0 .../src/provider.rs | 0 .../src/settings.rs | 0 .../early-boot-config/.gitignore | 0 .../early-boot-config/Cargo.toml | 4 +- .../early-boot-config/README.md | 0 .../early-boot-config/README.tpl | 0 .../early-boot-config/build.rs | 0 .../early-boot-config/src/main.rs | 4 +- .../ec2-identity-doc/Cargo.toml | 6 +- .../ec2-identity-doc/src/lib.rs | 6 +- .../ec2-identity-doc/src/main.rs | 2 +- .../user-data-providers/ec2-imds/Cargo.toml | 6 +- .../user-data-providers/ec2-imds/src/lib.rs | 8 +- .../user-data-providers/ec2-imds/src/main.rs | 2 +- .../local-defaults/Cargo.toml | 4 +- .../local-defaults/src/lib.rs | 4 +- .../local-defaults/src/main.rs | 2 +- .../user-data-providers/local-file/Cargo.toml | 4 +- .../user-data-providers/local-file/src/lib.rs | 4 +- .../local-file/src/main.rs | 2 +- .../local-overrides/Cargo.toml | 4 +- .../local-overrides/src/lib.rs | 4 +- .../local-overrides/src/main.rs | 2 +- .../vmware-cd-rom/Cargo.toml | 4 +- .../vmware-cd-rom/src/lib.rs | 12 +- .../vmware-cd-rom/src/main.rs | 2 +- .../test_data/namespaced_keys.xml | 0 .../vmware-cd-rom/test_data/ovf-env.xml | 0 .../vmware-guestinfo/Cargo.toml | 4 +- .../vmware-guestinfo/src/lib.rs | 6 +- .../vmware-guestinfo/src/main.rs | 2 +- 40 files changed, 144 insertions(+), 166 deletions(-) rename sources/{api/user-data-provider => early-boot-config/early-boot-config-provider}/Cargo.toml (57%) rename sources/{api/user-data-provider => early-boot-config/early-boot-config-provider}/README.md (93%) rename sources/{api/user-data-provider => early-boot-config/early-boot-config-provider}/README.tpl (100%) rename sources/{api/user-data-provider => early-boot-config/early-boot-config-provider}/build.rs (100%) rename sources/{api/user-data-provider => early-boot-config/early-boot-config-provider}/src/compression.rs (100%) rename sources/{api/user-data-provider => early-boot-config/early-boot-config-provider}/src/lib.rs (100%) rename sources/{api/user-data-provider => early-boot-config/early-boot-config-provider}/src/provider.rs (100%) rename sources/{api/user-data-provider => early-boot-config/early-boot-config-provider}/src/settings.rs (100%) rename sources/{api => early-boot-config}/early-boot-config/.gitignore (100%) rename sources/{api => early-boot-config}/early-boot-config/Cargo.toml (83%) rename sources/{api => early-boot-config}/early-boot-config/README.md (100%) rename sources/{api => early-boot-config}/early-boot-config/README.tpl (100%) rename sources/{api => early-boot-config}/early-boot-config/build.rs (100%) rename sources/{api => early-boot-config}/early-boot-config/src/main.rs (98%) rename sources/{ => early-boot-config}/user-data-providers/ec2-identity-doc/Cargo.toml (63%) rename sources/{ => early-boot-config}/user-data-providers/ec2-identity-doc/src/lib.rs (94%) rename sources/{ => early-boot-config}/user-data-providers/ec2-identity-doc/src/main.rs (69%) rename sources/{ => early-boot-config}/user-data-providers/ec2-imds/Cargo.toml (62%) rename sources/{ => early-boot-config}/user-data-providers/ec2-imds/src/lib.rs (87%) rename sources/{ => early-boot-config}/user-data-providers/ec2-imds/src/main.rs (67%) rename sources/{ => early-boot-config}/user-data-providers/local-defaults/Cargo.toml (67%) rename sources/{ => early-boot-config}/user-data-providers/local-defaults/src/lib.rs (71%) rename sources/{ => early-boot-config}/user-data-providers/local-defaults/src/main.rs (69%) rename sources/{ => early-boot-config}/user-data-providers/local-file/Cargo.toml (67%) rename sources/{ => early-boot-config}/user-data-providers/local-file/src/lib.rs (71%) rename sources/{ => early-boot-config}/user-data-providers/local-file/src/main.rs (69%) rename sources/{ => early-boot-config}/user-data-providers/local-overrides/Cargo.toml (67%) rename sources/{ => early-boot-config}/user-data-providers/local-overrides/src/lib.rs (73%) rename sources/{ => early-boot-config}/user-data-providers/local-overrides/src/main.rs (69%) rename sources/{ => early-boot-config}/user-data-providers/vmware-cd-rom/Cargo.toml (73%) rename sources/{ => early-boot-config}/user-data-providers/vmware-cd-rom/src/lib.rs (97%) rename sources/{ => early-boot-config}/user-data-providers/vmware-cd-rom/src/main.rs (69%) rename sources/{ => early-boot-config}/user-data-providers/vmware-cd-rom/test_data/namespaced_keys.xml (100%) rename sources/{ => early-boot-config}/user-data-providers/vmware-cd-rom/test_data/ovf-env.xml (100%) rename sources/{ => early-boot-config}/user-data-providers/vmware-guestinfo/Cargo.toml (73%) rename sources/{ => early-boot-config}/user-data-providers/vmware-guestinfo/src/lib.rs (96%) rename sources/{ => early-boot-config}/user-data-providers/vmware-guestinfo/src/main.rs (70%) diff --git a/packages/early-boot-config/Cargo.toml b/packages/early-boot-config/Cargo.toml index d2006410144..39f8fb89356 100644 --- a/packages/early-boot-config/Cargo.toml +++ b/packages/early-boot-config/Cargo.toml @@ -10,15 +10,16 @@ path = "../packages.rs" [package.metadata.build-package] source-groups = [ - "api/early-boot-config", + "early-boot-config/early-boot-config", + "early-boot-config/early-boot-config-provider", - "user-data-providers/ec2-identity-doc", - "user-data-providers/ec2-imds", - "user-data-providers/local-defaults", - "user-data-providers/local-file", - "user-data-providers/local-overrides", - "user-data-providers/vmware-cd-rom", - "user-data-providers/vmware-guestinfo", + "early-boot-config/user-data-providers/ec2-identity-doc", + "early-boot-config/user-data-providers/ec2-imds", + "early-boot-config/user-data-providers/local-defaults", + "early-boot-config/user-data-providers/local-file", + "early-boot-config/user-data-providers/local-overrides", + "early-boot-config/user-data-providers/vmware-cd-rom", + "early-boot-config/user-data-providers/vmware-guestinfo", ] # RPM BuildRequires diff --git a/sources/Cargo.lock b/sources/Cargo.lock index e86e66f1609..409bb92cec3 100644 --- a/sources/Cargo.lock +++ b/sources/Cargo.lock @@ -55,7 +55,7 @@ dependencies = [ "actix-service", "actix-utils", "ahash", - "base64", + "base64 0.21.7", "bitflags 2.4.2", "bytes", "bytestring", @@ -347,7 +347,7 @@ checksum = "0952808a6c2afd1aa8947271f3a60f1a6763c7b912d210184c5149b5cf147247" name = "apiclient" version = "0.1.0" dependencies = [ - "base64", + "base64 0.21.7", "constants", "datastore", "futures", @@ -371,7 +371,7 @@ dependencies = [ "snafu 0.8.2", "tokio", "tokio-tungstenite", - "toml", + "toml 0.8.12", "unindent", "url", ] @@ -403,7 +403,7 @@ dependencies = [ "snafu 0.8.2", "thar-be-updates", "tokio", - "toml", + "toml 0.8.12", ] [[package]] @@ -990,6 +990,12 @@ dependencies = [ "rustc-demangle", ] +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + [[package]] name = "base64" version = "0.21.7" @@ -1253,7 +1259,7 @@ dependencies = [ "percent-encoding", "regex", "serde", - "toml", + "toml 0.8.12", ] [[package]] @@ -1267,7 +1273,7 @@ name = "certdog" version = "0.1.0" dependencies = [ "argh", - "base64", + "base64 0.21.7", "constants", "generate-readme", "log", @@ -1276,7 +1282,7 @@ dependencies = [ "simplelog", "snafu 0.8.2", "tempfile", - "toml", + "toml 0.8.12", "x509-parser", ] @@ -1314,7 +1320,7 @@ dependencies = [ "simplelog", "snafu 0.8.2", "tokio", - "toml", + "toml 0.8.12", ] [[package]] @@ -1416,7 +1422,7 @@ dependencies = [ "serde_json", "simplelog", "snafu 0.8.2", - "toml", + "toml 0.8.12", ] [[package]] @@ -1578,7 +1584,7 @@ dependencies = [ "serde", "serde_json", "snafu 0.8.2", - "toml", + "toml 0.8.12", "walkdir", ] @@ -1676,7 +1682,7 @@ dependencies = [ "simplelog", "snafu 0.8.2", "tempfile", - "toml", + "toml 0.8.12", ] [[package]] @@ -1691,36 +1697,52 @@ version = "0.1.0" dependencies = [ "apiclient", "async-trait", - "base64", + "base64 0.21.7", "constants", + "early-boot-config-provider", "env_logger", "generate-readme", - "hex-literal", "http 0.2.12", - "imdsclient", - "lazy_static", "log", + "serde-xml-rs", "serde_json", "serde_plain", "simplelog", "snafu 0.8.2", "tokio", - "toml", - "user-data-provider", + "toml 0.8.12", "walkdir", ] +[[package]] +name = "early-boot-config-provider" +version = "0.1.0" +dependencies = [ + "async-trait", + "env_logger", + "flate2", + "generate-readme", + "hex-literal", + "lazy_static", + "log", + "retry-read", + "serde", + "serde_json", + "snafu 0.7.5", + "toml 0.5.11", +] + [[package]] name = "ec2-identity-doc-user-data-provider" version = "0.1.0" dependencies = [ "async-trait", + "early-boot-config-provider", "imdsclient", "log", "serde_json", - "snafu", + "snafu 0.7.5", "tokio", - "user-data-provider", ] [[package]] @@ -1728,11 +1750,11 @@ name = "ec2-imds-user-data-provider" version = "0.1.0" dependencies = [ "async-trait", + "early-boot-config-provider", "imdsclient", "log", - "snafu", + "snafu 0.7.5", "tokio", - "user-data-provider", ] [[package]] @@ -2064,7 +2086,7 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06683b93020a07e3dbcf5f8c0f6d40080d725bea7936fc01ad345c01b97dc270" dependencies = [ - "base64", + "base64 0.21.7", "bytes", "headers-core", "http 0.2.12", @@ -2125,7 +2147,7 @@ dependencies = [ name = "host-containers" version = "0.1.0" dependencies = [ - "base64", + "base64 0.21.7", "constants", "generate-readme", "log", @@ -2134,7 +2156,7 @@ dependencies = [ "simplelog", "snafu 0.8.2", "tempfile", - "toml", + "toml 0.8.12", ] [[package]] @@ -2478,8 +2500,8 @@ name = "local-defaults-user-data-provider" version = "0.1.0" dependencies = [ "async-trait", + "early-boot-config-provider", "tokio", - "user-data-provider", ] [[package]] @@ -2487,8 +2509,8 @@ name = "local-file-user-data-provider" version = "0.1.0" dependencies = [ "async-trait", + "early-boot-config-provider", "tokio", - "user-data-provider", ] [[package]] @@ -2496,8 +2518,8 @@ name = "local-overrides-user-data-provider" version = "0.1.0" dependencies = [ "async-trait", + "early-boot-config-provider", "tokio", - "user-data-provider", ] [[package]] @@ -2598,7 +2620,7 @@ name = "merge-toml" version = "0.1.0" dependencies = [ "snafu 0.8.2", - "toml", + "toml 0.8.12", ] [[package]] @@ -2616,7 +2638,7 @@ dependencies = [ "simplelog", "snafu 0.8.2", "tempfile", - "toml", + "toml 0.8.12", "url", ] @@ -2710,7 +2732,7 @@ dependencies = [ name = "modeled-types" version = "0.1.0" dependencies = [ - "base64", + "base64 0.21.7", "generate-readme", "indexmap 2.2.5", "lazy_static", @@ -2747,7 +2769,7 @@ dependencies = [ "settings-extension-motd", "settings-extension-ntp", "settings-extension-updates", - "toml", + "toml 0.8.12", ] [[package]] @@ -2775,7 +2797,7 @@ dependencies = [ "tempfile", "tokio", "tokio-retry", - "toml", + "toml 0.8.12", ] [[package]] @@ -3036,7 +3058,7 @@ version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b8fcc794035347fb64beda2d3b462595dd2753e3f268d89c5aae77e8cf2c310" dependencies = [ - "base64", + "base64 0.21.7", "serde", ] @@ -3193,7 +3215,7 @@ dependencies = [ "signpost", "simplelog", "snafu 0.8.2", - "toml", + "toml 0.8.12", ] [[package]] @@ -3415,7 +3437,7 @@ version = "0.11.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78bf93c4af7a8bb7d879d51cebe797356ff10ae8516ace542b5182d9dcac10b2" dependencies = [ - "base64", + "base64 0.21.7", "bytes", "encoding_rs", "futures-core", @@ -3541,7 +3563,7 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "base64", + "base64 0.21.7", ] [[package]] @@ -3608,7 +3630,7 @@ dependencies = [ "apiclient", "argh", "async-trait", - "base64", + "base64 0.21.7", "bottlerocket-release", "cached", "constants", @@ -3632,7 +3654,7 @@ dependencies = [ "simplelog", "snafu 0.8.2", "tokio", - "toml", + "toml 0.8.12", "url", ] @@ -3904,7 +3926,7 @@ name = "shibaken" version = "0.1.0" dependencies = [ "argh", - "base64", + "base64 0.21.7", "generate-readme", "imdsclient", "log", @@ -3914,7 +3936,7 @@ dependencies = [ "snafu 0.8.2", "tempfile", "tokio", - "toml", + "toml 0.8.12", ] [[package]] @@ -4058,7 +4080,7 @@ checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" name = "static-pods" version = "0.1.0" dependencies = [ - "base64", + "base64 0.21.7", "bottlerocket-variant", "constants", "generate-readme", @@ -4087,7 +4109,7 @@ dependencies = [ "semver", "simplelog", "snafu 0.8.2", - "toml", + "toml 0.8.12", "walkdir", ] @@ -4280,7 +4302,7 @@ dependencies = [ "simplelog", "snafu 0.8.2", "tempfile", - "toml", + "toml 0.8.12", "update_metadata", ] @@ -4468,6 +4490,15 @@ dependencies = [ "tracing", ] +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + [[package]] name = "toml" version = "0.8.12" @@ -4689,7 +4720,7 @@ dependencies = [ "serde_json", "serde_plain", "snafu 0.8.2", - "toml", + "toml 0.8.12", ] [[package]] @@ -4717,7 +4748,7 @@ dependencies = [ "tempfile", "tokio", "tokio-util", - "toml", + "toml 0.8.12", "tough", "update_metadata", "url", @@ -4747,34 +4778,6 @@ version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" -[[package]] -name = "user-data-provider" -version = "0.1.0" -dependencies = [ - "apiclient", - "async-trait", - "base64 0.13.1", - "constants", - "env_logger", - "flate2", - "generate-readme", - "hex-literal", - "http", - "imdsclient", - "lazy_static", - "log", - "retry-read", - "serde", - "serde-xml-rs", - "serde_json", - "serde_plain", - "snafu", - "tokio", - "toml 0.5.11", - "vmw_backdoor", - "walkdir", -] - [[package]] name = "utf-8" version = "0.7.6" @@ -4819,12 +4822,12 @@ version = "0.1.0" dependencies = [ "async-trait", "base64 0.13.1", + "early-boot-config-provider", "log", "serde", "serde-xml-rs", - "snafu", + "snafu 0.7.5", "tokio", - "user-data-provider", ] [[package]] @@ -4833,12 +4836,12 @@ version = "0.1.0" dependencies = [ "async-trait", "base64 0.13.1", + "early-boot-config-provider", "log", "serde", "serde_plain", - "snafu", + "snafu 0.7.5", "tokio", - "user-data-provider", "vmw_backdoor", ] diff --git a/sources/Cargo.toml b/sources/Cargo.toml index e6cfa705fce..2488993e9aa 100644 --- a/sources/Cargo.toml +++ b/sources/Cargo.toml @@ -8,7 +8,6 @@ members = [ "api/certdog", "api/corndog", "api/datastore", - "api/early-boot-config", "api/netdog", "api/sundog", "api/schnauzer", @@ -23,7 +22,6 @@ members = [ "api/migration/migration-helpers", "api/shibaken", "api/prairiedog", - "api/user-data-provider", # "api/migration/migrations/vX.Y.Z/..." # (all previous migrations archived; add new ones after this line) @@ -92,6 +90,17 @@ members = [ "driverdog", + "early-boot-config/early-boot-config", + "early-boot-config/early-boot-config-provider", + + "early-boot-config/user-data-providers/ec2-identity-doc", + "early-boot-config/user-data-providers/ec2-imds", + "early-boot-config/user-data-providers/local-defaults", + "early-boot-config/user-data-providers/local-file", + "early-boot-config/user-data-providers/local-overrides", + "early-boot-config/user-data-providers/vmware-cd-rom", + "early-boot-config/user-data-providers/vmware-guestinfo", + "generate-readme", "ghostdog", @@ -120,14 +129,6 @@ members = [ "updater/update_metadata", "updater/updog", - "user-data-providers/ec2-identity-doc", - "user-data-providers/ec2-imds", - "user-data-providers/local-defaults", - "user-data-providers/local-file", - "user-data-providers/local-overrides", - "user-data-providers/vmware-cd-rom", - "user-data-providers/vmware-guestinfo", - "constants", "shimpei", diff --git a/sources/api/user-data-provider/Cargo.toml b/sources/early-boot-config/early-boot-config-provider/Cargo.toml similarity index 57% rename from sources/api/user-data-provider/Cargo.toml rename to sources/early-boot-config/early-boot-config-provider/Cargo.toml index 233ee8d8a2c..09017531ffd 100644 --- a/sources/api/user-data-provider/Cargo.toml +++ b/sources/early-boot-config/early-boot-config-provider/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "user-data-provider" +name = "early-boot-config-provider" version = "0.1.0" authors = ["Zac Mrowicki ", "Sam Berning ExitCode { diff --git a/sources/user-data-providers/ec2-imds/Cargo.toml b/sources/early-boot-config/user-data-providers/ec2-imds/Cargo.toml similarity index 62% rename from sources/user-data-providers/ec2-imds/Cargo.toml rename to sources/early-boot-config/user-data-providers/ec2-imds/Cargo.toml index cfb31624719..49059012b81 100644 --- a/sources/user-data-providers/ec2-imds/Cargo.toml +++ b/sources/early-boot-config/user-data-providers/ec2-imds/Cargo.toml @@ -6,12 +6,10 @@ edition = "2021" license = "Apache-2.0 OR MIT" publish = false -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [dependencies] async-trait = "0.1" -imdsclient = { path = "../../imdsclient", version = "0.1" } +imdsclient = { path = "../../../imdsclient", version = "0.1" } log = "0.4" snafu = "0.7" tokio = { version = "~1.32", default-features = false, features = ["process", "macros", "rt-multi-thread"] } # LTS -user-data-provider = { path = "../../api/user-data-provider", version = "0.1" } +early-boot-config-provider = { path = "../../early-boot-config-provider", version = "0.1" } diff --git a/sources/user-data-providers/ec2-imds/src/lib.rs b/sources/early-boot-config/user-data-providers/ec2-imds/src/lib.rs similarity index 87% rename from sources/user-data-providers/ec2-imds/src/lib.rs rename to sources/early-boot-config/user-data-providers/ec2-imds/src/lib.rs index 7c4d3f29de7..b2bfff34026 100644 --- a/sources/user-data-providers/ec2-imds/src/lib.rs +++ b/sources/early-boot-config/user-data-providers/ec2-imds/src/lib.rs @@ -3,11 +3,11 @@ extern crate log; use async_trait::async_trait; +use early_boot_config_provider::compression::expand_slice_maybe; +use early_boot_config_provider::provider::UserDataProvider; +use early_boot_config_provider::settings::SettingsJson; use imdsclient::ImdsClient; use snafu::ResultExt; -use user_data_provider::compression::expand_slice_maybe; -use user_data_provider::provider::UserDataProvider; -use user_data_provider::settings::SettingsJson; pub struct Ec2Imds; @@ -62,7 +62,7 @@ mod error { #[snafu(display("Unable to serialize settings from {}: {}", from, source))] SettingsToJSON { from: String, - source: user_data_provider::settings::Error, + source: early_boot_config_provider::settings::Error, }, } } diff --git a/sources/user-data-providers/ec2-imds/src/main.rs b/sources/early-boot-config/user-data-providers/ec2-imds/src/main.rs similarity index 67% rename from sources/user-data-providers/ec2-imds/src/main.rs rename to sources/early-boot-config/user-data-providers/ec2-imds/src/main.rs index 4db3f413711..b1254e52fb6 100644 --- a/sources/user-data-providers/ec2-imds/src/main.rs +++ b/sources/early-boot-config/user-data-providers/ec2-imds/src/main.rs @@ -1,6 +1,6 @@ +use early_boot_config_provider::provider::{run_userdata_provider, setup_provider_logging}; use ec2_imds_user_data_provider::Ec2Imds; use std::process::ExitCode; -use user_data_provider::provider::{run_userdata_provider, setup_provider_logging}; #[tokio::main] async fn main() -> ExitCode { diff --git a/sources/user-data-providers/local-defaults/Cargo.toml b/sources/early-boot-config/user-data-providers/local-defaults/Cargo.toml similarity index 67% rename from sources/user-data-providers/local-defaults/Cargo.toml rename to sources/early-boot-config/user-data-providers/local-defaults/Cargo.toml index 760c1cd9a4a..5135cd4d422 100644 --- a/sources/user-data-providers/local-defaults/Cargo.toml +++ b/sources/early-boot-config/user-data-providers/local-defaults/Cargo.toml @@ -6,9 +6,7 @@ edition = "2021" license = "Apache-2.0 OR MIT" publish = false -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [dependencies] async-trait = "0.1" tokio = { version = "~1.32", default-features = false, features = ["process", "macros", "rt-multi-thread"] } # LTS -user-data-provider = { path = "../../api/user-data-provider", version = "0.1" } +early-boot-config-provider = { path = "../../early-boot-config-provider", version = "0.1" } diff --git a/sources/user-data-providers/local-defaults/src/lib.rs b/sources/early-boot-config/user-data-providers/local-defaults/src/lib.rs similarity index 71% rename from sources/user-data-providers/local-defaults/src/lib.rs rename to sources/early-boot-config/user-data-providers/local-defaults/src/lib.rs index 8cd5f90f879..beb9ea5e4ce 100644 --- a/sources/user-data-providers/local-defaults/src/lib.rs +++ b/sources/early-boot-config/user-data-providers/local-defaults/src/lib.rs @@ -1,7 +1,7 @@ /// Site-local defaults use async_trait::async_trait; -use user_data_provider::provider::{user_data_from_file, UserDataProvider}; -use user_data_provider::settings::SettingsJson; +use early_boot_config_provider::provider::{user_data_from_file, UserDataProvider}; +use early_boot_config_provider::settings::SettingsJson; const LOCAL_DEFAULTS_FILE: &str = "/local/user-data-defaults.toml"; diff --git a/sources/user-data-providers/local-defaults/src/main.rs b/sources/early-boot-config/user-data-providers/local-defaults/src/main.rs similarity index 69% rename from sources/user-data-providers/local-defaults/src/main.rs rename to sources/early-boot-config/user-data-providers/local-defaults/src/main.rs index 235acb07f3c..510b052a31e 100644 --- a/sources/user-data-providers/local-defaults/src/main.rs +++ b/sources/early-boot-config/user-data-providers/local-defaults/src/main.rs @@ -1,6 +1,6 @@ +use early_boot_config_provider::provider::{run_userdata_provider, setup_provider_logging}; use local_defaults_user_data_provider::LocalDefaults; use std::process::ExitCode; -use user_data_provider::provider::{run_userdata_provider, setup_provider_logging}; #[tokio::main] async fn main() -> ExitCode { diff --git a/sources/user-data-providers/local-file/Cargo.toml b/sources/early-boot-config/user-data-providers/local-file/Cargo.toml similarity index 67% rename from sources/user-data-providers/local-file/Cargo.toml rename to sources/early-boot-config/user-data-providers/local-file/Cargo.toml index 13a21777cbe..5b372e69895 100644 --- a/sources/user-data-providers/local-file/Cargo.toml +++ b/sources/early-boot-config/user-data-providers/local-file/Cargo.toml @@ -6,9 +6,7 @@ edition = "2021" license = "Apache-2.0 OR MIT" publish = false -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [dependencies] async-trait = "0.1" tokio = { version = "~1.32", default-features = false, features = ["process", "macros", "rt-multi-thread"] } # LTS -user-data-provider = { path = "../../api/user-data-provider", version = "0.1" } +early-boot-config-provider = { path = "../../early-boot-config-provider", version = "0.1" } diff --git a/sources/user-data-providers/local-file/src/lib.rs b/sources/early-boot-config/user-data-providers/local-file/src/lib.rs similarity index 71% rename from sources/user-data-providers/local-file/src/lib.rs rename to sources/early-boot-config/user-data-providers/local-file/src/lib.rs index 32f2b48c3c3..e0383b4effd 100644 --- a/sources/user-data-providers/local-file/src/lib.rs +++ b/sources/early-boot-config/user-data-providers/local-file/src/lib.rs @@ -1,7 +1,7 @@ /// Local user data file use async_trait::async_trait; -use user_data_provider::provider::{user_data_from_file, UserDataProvider}; -use user_data_provider::settings::SettingsJson; +use early_boot_config_provider::provider::{user_data_from_file, UserDataProvider}; +use early_boot_config_provider::settings::SettingsJson; const LOCAL_USER_DATA: &str = "/var/lib/bottlerocket/user-data.toml"; diff --git a/sources/user-data-providers/local-file/src/main.rs b/sources/early-boot-config/user-data-providers/local-file/src/main.rs similarity index 69% rename from sources/user-data-providers/local-file/src/main.rs rename to sources/early-boot-config/user-data-providers/local-file/src/main.rs index 858616d7607..1e2afc2d4eb 100644 --- a/sources/user-data-providers/local-file/src/main.rs +++ b/sources/early-boot-config/user-data-providers/local-file/src/main.rs @@ -1,6 +1,6 @@ +use early_boot_config_provider::provider::{run_userdata_provider, setup_provider_logging}; use local_file_user_data_provider::LocalUserData; use std::process::ExitCode; -use user_data_provider::provider::{run_userdata_provider, setup_provider_logging}; #[tokio::main] async fn main() -> ExitCode { diff --git a/sources/user-data-providers/local-overrides/Cargo.toml b/sources/early-boot-config/user-data-providers/local-overrides/Cargo.toml similarity index 67% rename from sources/user-data-providers/local-overrides/Cargo.toml rename to sources/early-boot-config/user-data-providers/local-overrides/Cargo.toml index 79fc9756bde..426afd2108a 100644 --- a/sources/user-data-providers/local-overrides/Cargo.toml +++ b/sources/early-boot-config/user-data-providers/local-overrides/Cargo.toml @@ -6,9 +6,7 @@ edition = "2021" license = "Apache-2.0 OR MIT" publish = false -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [dependencies] async-trait = "0.1" tokio = { version = "~1.32", default-features = false, features = ["process", "macros", "rt-multi-thread"] } # LTS -user-data-provider = { path = "../../api/user-data-provider", version = "0.1" } +early-boot-config-provider = { path = "../../early-boot-config-provider", version = "0.1" } diff --git a/sources/user-data-providers/local-overrides/src/lib.rs b/sources/early-boot-config/user-data-providers/local-overrides/src/lib.rs similarity index 73% rename from sources/user-data-providers/local-overrides/src/lib.rs rename to sources/early-boot-config/user-data-providers/local-overrides/src/lib.rs index dde4019f2ac..73174ee06c7 100644 --- a/sources/user-data-providers/local-overrides/src/lib.rs +++ b/sources/early-boot-config/user-data-providers/local-overrides/src/lib.rs @@ -1,7 +1,7 @@ /// Site-local overrides use async_trait::async_trait; -use user_data_provider::provider::{user_data_from_file, UserDataProvider}; -use user_data_provider::settings::SettingsJson; +use early_boot_config_provider::provider::{user_data_from_file, UserDataProvider}; +use early_boot_config_provider::settings::SettingsJson; const LOCAL_OVERRIDES: &str = "/local/user-data-overrides.toml"; diff --git a/sources/user-data-providers/local-overrides/src/main.rs b/sources/early-boot-config/user-data-providers/local-overrides/src/main.rs similarity index 69% rename from sources/user-data-providers/local-overrides/src/main.rs rename to sources/early-boot-config/user-data-providers/local-overrides/src/main.rs index 84b6003b195..051c5fb6ae7 100644 --- a/sources/user-data-providers/local-overrides/src/main.rs +++ b/sources/early-boot-config/user-data-providers/local-overrides/src/main.rs @@ -1,6 +1,6 @@ +use early_boot_config_provider::provider::{run_userdata_provider, setup_provider_logging}; use local_overrides_user_data_provider::LocalOverrides; use std::process::ExitCode; -use user_data_provider::provider::{run_userdata_provider, setup_provider_logging}; #[tokio::main] async fn main() -> ExitCode { diff --git a/sources/user-data-providers/vmware-cd-rom/Cargo.toml b/sources/early-boot-config/user-data-providers/vmware-cd-rom/Cargo.toml similarity index 73% rename from sources/user-data-providers/vmware-cd-rom/Cargo.toml rename to sources/early-boot-config/user-data-providers/vmware-cd-rom/Cargo.toml index 3137df1f615..299d4c618f3 100644 --- a/sources/user-data-providers/vmware-cd-rom/Cargo.toml +++ b/sources/early-boot-config/user-data-providers/vmware-cd-rom/Cargo.toml @@ -6,8 +6,6 @@ edition = "2021" license = "Apache-2.0 OR MIT" publish = false -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [dependencies] async-trait = "0.1" base64 = "0.13" @@ -16,4 +14,4 @@ serde = { version = "1", features = ["derive"] } serde-xml-rs = "0.6" snafu = "0.7" tokio = { version = "~1.32", default-features = false, features = ["process", "macros", "rt-multi-thread"] } # LTS -user-data-provider = { path = "../../api/user-data-provider", version = "0.1" } +early-boot-config-provider = { path = "../../early-boot-config-provider", version = "0.1" } diff --git a/sources/user-data-providers/vmware-cd-rom/src/lib.rs b/sources/early-boot-config/user-data-providers/vmware-cd-rom/src/lib.rs similarity index 97% rename from sources/user-data-providers/vmware-cd-rom/src/lib.rs rename to sources/early-boot-config/user-data-providers/vmware-cd-rom/src/lib.rs index 4776d99fe07..85f5baecbad 100644 --- a/sources/user-data-providers/vmware-cd-rom/src/lib.rs +++ b/sources/early-boot-config/user-data-providers/vmware-cd-rom/src/lib.rs @@ -4,17 +4,17 @@ extern crate log; use async_trait::async_trait; use base64::Engine; +use early_boot_config_provider::compression::{ + expand_file_maybe, expand_slice_maybe, OptionalCompressionReader, +}; +use early_boot_config_provider::provider::UserDataProvider; +use early_boot_config_provider::settings::SettingsJson; use serde::Deserialize; use snafu::{ensure, ResultExt}; use std::ffi::OsStr; use std::fs::File; use std::io::BufReader; use std::path::{Path, PathBuf}; -use user_data_provider::compression::{ - expand_file_maybe, expand_slice_maybe, OptionalCompressionReader, -}; -use user_data_provider::provider::UserDataProvider; -use user_data_provider::settings::SettingsJson; // This program expects that the CD-ROM is already mounted. Mounting happens elsewhere in a // systemd unit file @@ -206,7 +206,7 @@ mod error { #[snafu(display("Unable to serialize settings from {}: {}", from, source))] SettingsToJson { from: String, - source: user_data_provider::settings::Error, + source: early_boot_config_provider::settings::Error, }, #[snafu(display("Found multiple user data files in '{}', expected 1", place))] diff --git a/sources/user-data-providers/vmware-cd-rom/src/main.rs b/sources/early-boot-config/user-data-providers/vmware-cd-rom/src/main.rs similarity index 69% rename from sources/user-data-providers/vmware-cd-rom/src/main.rs rename to sources/early-boot-config/user-data-providers/vmware-cd-rom/src/main.rs index 39735e5d3f2..e66c7d3edf4 100644 --- a/sources/user-data-providers/vmware-cd-rom/src/main.rs +++ b/sources/early-boot-config/user-data-providers/vmware-cd-rom/src/main.rs @@ -1,5 +1,5 @@ +use early_boot_config_provider::provider::{run_userdata_provider, setup_provider_logging}; use std::process::ExitCode; -use user_data_provider::provider::{run_userdata_provider, setup_provider_logging}; use vmware_cd_rom_user_data_provider::VmwareCdRom; #[tokio::main] diff --git a/sources/user-data-providers/vmware-cd-rom/test_data/namespaced_keys.xml b/sources/early-boot-config/user-data-providers/vmware-cd-rom/test_data/namespaced_keys.xml similarity index 100% rename from sources/user-data-providers/vmware-cd-rom/test_data/namespaced_keys.xml rename to sources/early-boot-config/user-data-providers/vmware-cd-rom/test_data/namespaced_keys.xml diff --git a/sources/user-data-providers/vmware-cd-rom/test_data/ovf-env.xml b/sources/early-boot-config/user-data-providers/vmware-cd-rom/test_data/ovf-env.xml similarity index 100% rename from sources/user-data-providers/vmware-cd-rom/test_data/ovf-env.xml rename to sources/early-boot-config/user-data-providers/vmware-cd-rom/test_data/ovf-env.xml diff --git a/sources/user-data-providers/vmware-guestinfo/Cargo.toml b/sources/early-boot-config/user-data-providers/vmware-guestinfo/Cargo.toml similarity index 73% rename from sources/user-data-providers/vmware-guestinfo/Cargo.toml rename to sources/early-boot-config/user-data-providers/vmware-guestinfo/Cargo.toml index 2fc4b8eca94..63ce4ce62b9 100644 --- a/sources/user-data-providers/vmware-guestinfo/Cargo.toml +++ b/sources/early-boot-config/user-data-providers/vmware-guestinfo/Cargo.toml @@ -6,8 +6,6 @@ edition = "2021" license = "Apache-2.0 OR MIT" publish = false -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [dependencies] async-trait = "0.1" base64 = "0.13" @@ -16,5 +14,5 @@ serde = { version = "1", features = ["derive"] } serde_plain = "1" snafu = "0.7" tokio = { version = "~1.32", default-features = false, features = ["process", "macros", "rt-multi-thread"] } # LTS -user-data-provider = { path = "../../api/user-data-provider", version = "0.1" } +early-boot-config-provider = { path = "../../early-boot-config-provider", version = "0.1" } vmw_backdoor = "0.2" diff --git a/sources/user-data-providers/vmware-guestinfo/src/lib.rs b/sources/early-boot-config/user-data-providers/vmware-guestinfo/src/lib.rs similarity index 96% rename from sources/user-data-providers/vmware-guestinfo/src/lib.rs rename to sources/early-boot-config/user-data-providers/vmware-guestinfo/src/lib.rs index 86be52fade6..2e83269db03 100644 --- a/sources/user-data-providers/vmware-guestinfo/src/lib.rs +++ b/sources/early-boot-config/user-data-providers/vmware-guestinfo/src/lib.rs @@ -3,11 +3,11 @@ extern crate log; use async_trait::async_trait; +use early_boot_config_provider::provider::UserDataProvider; +use early_boot_config_provider::{compression::OptionalCompressionReader, settings::SettingsJson}; use serde::Deserialize; use snafu::{ensure, ResultExt}; use std::io::{Cursor, Read}; -use user_data_provider::provider::UserDataProvider; -use user_data_provider::{compression::OptionalCompressionReader, settings::SettingsJson}; // The fields in which user data and its encoding are stored in guestinfo const GUESTINFO_USERDATA: &str = "guestinfo.userdata"; @@ -185,7 +185,7 @@ mod error { #[snafu(display("Unable to serialize settings from {}: {}", from, source))] SettingsToJson { from: String, - source: user_data_provider::settings::Error, + source: early_boot_config_provider::settings::Error, }, #[snafu(display("Unknown user data encoding: '{}': {}", encoding, source))] diff --git a/sources/user-data-providers/vmware-guestinfo/src/main.rs b/sources/early-boot-config/user-data-providers/vmware-guestinfo/src/main.rs similarity index 70% rename from sources/user-data-providers/vmware-guestinfo/src/main.rs rename to sources/early-boot-config/user-data-providers/vmware-guestinfo/src/main.rs index 2b0f0144a12..a727d3bd687 100644 --- a/sources/user-data-providers/vmware-guestinfo/src/main.rs +++ b/sources/early-boot-config/user-data-providers/vmware-guestinfo/src/main.rs @@ -1,5 +1,5 @@ +use early_boot_config_provider::provider::{run_userdata_provider, setup_provider_logging}; use std::process::ExitCode; -use user_data_provider::provider::{run_userdata_provider, setup_provider_logging}; use vmware_guestinfo_user_data_provider::VmwareGuestinfo; #[tokio::main] From c5038de8a7dce6a917f843415b83f9061aedd58e Mon Sep 17 00:00:00 2001 From: Sam Berning Date: Wed, 6 Mar 2024 02:38:55 +0000 Subject: [PATCH 34/41] user-data-providers: add READMEs to each provider Signed-off-by: Sam Berning --- sources/Cargo.lock | 7 +++++++ .../early-boot-config-provider/README.md | 2 +- .../early-boot-config-provider/src/lib.rs | 2 +- .../early-boot-config/user-data-providers/README.md | 11 +++++++++++ .../user-data-providers/ec2-identity-doc/Cargo.toml | 6 ++++++ .../user-data-providers/ec2-identity-doc/README.md | 9 +++++++++ .../user-data-providers/ec2-identity-doc/README.tpl | 9 +++++++++ .../user-data-providers/ec2-identity-doc/build.rs | 3 +++ .../user-data-providers/ec2-imds/Cargo.toml | 6 ++++++ .../user-data-providers/ec2-imds/README.md | 9 +++++++++ .../user-data-providers/ec2-imds/README.tpl | 9 +++++++++ .../user-data-providers/ec2-imds/build.rs | 3 +++ .../user-data-providers/local-defaults/Cargo.toml | 6 ++++++ .../user-data-providers/local-defaults/README.md | 9 +++++++++ .../user-data-providers/local-defaults/README.tpl | 9 +++++++++ .../user-data-providers/local-defaults/build.rs | 3 +++ .../user-data-providers/local-file/Cargo.toml | 6 ++++++ .../user-data-providers/local-file/README.md | 9 +++++++++ .../user-data-providers/local-file/README.tpl | 9 +++++++++ .../user-data-providers/local-file/build.rs | 3 +++ .../user-data-providers/local-overrides/Cargo.toml | 6 ++++++ .../user-data-providers/local-overrides/README.md | 9 +++++++++ .../user-data-providers/local-overrides/README.tpl | 9 +++++++++ .../user-data-providers/local-overrides/build.rs | 3 +++ .../user-data-providers/vmware-cd-rom/Cargo.toml | 6 ++++++ .../user-data-providers/vmware-cd-rom/README.md | 9 +++++++++ .../user-data-providers/vmware-cd-rom/README.tpl | 9 +++++++++ .../user-data-providers/vmware-cd-rom/build.rs | 3 +++ .../user-data-providers/vmware-guestinfo/Cargo.toml | 6 ++++++ .../user-data-providers/vmware-guestinfo/README.md | 9 +++++++++ .../user-data-providers/vmware-guestinfo/README.tpl | 9 +++++++++ .../user-data-providers/vmware-guestinfo/build.rs | 3 +++ 32 files changed, 209 insertions(+), 2 deletions(-) create mode 100644 sources/early-boot-config/user-data-providers/README.md create mode 100644 sources/early-boot-config/user-data-providers/ec2-identity-doc/README.md create mode 100644 sources/early-boot-config/user-data-providers/ec2-identity-doc/README.tpl create mode 100644 sources/early-boot-config/user-data-providers/ec2-identity-doc/build.rs create mode 100644 sources/early-boot-config/user-data-providers/ec2-imds/README.md create mode 100644 sources/early-boot-config/user-data-providers/ec2-imds/README.tpl create mode 100644 sources/early-boot-config/user-data-providers/ec2-imds/build.rs create mode 100644 sources/early-boot-config/user-data-providers/local-defaults/README.md create mode 100644 sources/early-boot-config/user-data-providers/local-defaults/README.tpl create mode 100644 sources/early-boot-config/user-data-providers/local-defaults/build.rs create mode 100644 sources/early-boot-config/user-data-providers/local-file/README.md create mode 100644 sources/early-boot-config/user-data-providers/local-file/README.tpl create mode 100644 sources/early-boot-config/user-data-providers/local-file/build.rs create mode 100644 sources/early-boot-config/user-data-providers/local-overrides/README.md create mode 100644 sources/early-boot-config/user-data-providers/local-overrides/README.tpl create mode 100644 sources/early-boot-config/user-data-providers/local-overrides/build.rs create mode 100644 sources/early-boot-config/user-data-providers/vmware-cd-rom/README.md create mode 100644 sources/early-boot-config/user-data-providers/vmware-cd-rom/README.tpl create mode 100644 sources/early-boot-config/user-data-providers/vmware-cd-rom/build.rs create mode 100644 sources/early-boot-config/user-data-providers/vmware-guestinfo/README.md create mode 100644 sources/early-boot-config/user-data-providers/vmware-guestinfo/README.tpl create mode 100644 sources/early-boot-config/user-data-providers/vmware-guestinfo/build.rs diff --git a/sources/Cargo.lock b/sources/Cargo.lock index 409bb92cec3..b8aa211cdf2 100644 --- a/sources/Cargo.lock +++ b/sources/Cargo.lock @@ -1738,6 +1738,7 @@ version = "0.1.0" dependencies = [ "async-trait", "early-boot-config-provider", + "generate-readme", "imdsclient", "log", "serde_json", @@ -1751,6 +1752,7 @@ version = "0.1.0" dependencies = [ "async-trait", "early-boot-config-provider", + "generate-readme", "imdsclient", "log", "snafu 0.7.5", @@ -2501,6 +2503,7 @@ version = "0.1.0" dependencies = [ "async-trait", "early-boot-config-provider", + "generate-readme", "tokio", ] @@ -2510,6 +2513,7 @@ version = "0.1.0" dependencies = [ "async-trait", "early-boot-config-provider", + "generate-readme", "tokio", ] @@ -2519,6 +2523,7 @@ version = "0.1.0" dependencies = [ "async-trait", "early-boot-config-provider", + "generate-readme", "tokio", ] @@ -4823,6 +4828,7 @@ dependencies = [ "async-trait", "base64 0.13.1", "early-boot-config-provider", + "generate-readme", "log", "serde", "serde-xml-rs", @@ -4837,6 +4843,7 @@ dependencies = [ "async-trait", "base64 0.13.1", "early-boot-config-provider", + "generate-readme", "log", "serde", "serde_plain", diff --git a/sources/early-boot-config/early-boot-config-provider/README.md b/sources/early-boot-config/early-boot-config-provider/README.md index 944b079e6f9..2816787ed60 100644 --- a/sources/early-boot-config/early-boot-config-provider/README.md +++ b/sources/early-boot-config/early-boot-config-provider/README.md @@ -4,7 +4,7 @@ Current version: 0.1.0 ## Introduction -user-data-provider defines the interface of the user data provider binaries used by early-boot-config. +early-boot-config-provider defines the interface of the user data provider binaries used by early-boot-config. User data provider binaries can also be easily created using the UserDataProvider trait and logging functions defined by this crate. diff --git a/sources/early-boot-config/early-boot-config-provider/src/lib.rs b/sources/early-boot-config/early-boot-config-provider/src/lib.rs index 63c6f4d9aef..c99c01b6dc6 100644 --- a/sources/early-boot-config/early-boot-config-provider/src/lib.rs +++ b/sources/early-boot-config/early-boot-config-provider/src/lib.rs @@ -1,7 +1,7 @@ /*! # Introduction -user-data-provider defines the interface of the user data provider binaries used by early-boot-config. +early-boot-config-provider defines the interface of the user data provider binaries used by early-boot-config. User data provider binaries can also be easily created using the UserDataProvider trait and logging functions defined by this crate. */ diff --git a/sources/early-boot-config/user-data-providers/README.md b/sources/early-boot-config/user-data-providers/README.md new file mode 100644 index 00000000000..a8cc7c174de --- /dev/null +++ b/sources/early-boot-config/user-data-providers/README.md @@ -0,0 +1,11 @@ +# user-data-providers + +## Introduction + +user-data-providers contains the user data provider binaries used by early-boot-config to set settings on boot. These binaries implement the interface defined in early-boot-config-provider. + +When installed, these binaries should be linked to in `/usr/libexec/early-boot-config/data-providers.d/`. The binaries will be executed by early-boot-config in order based on the two numbers at the start of the link name, e.g.: + +1. `10-local-defaults` +2. `20-local-file` +3. `99-local-overrides` diff --git a/sources/early-boot-config/user-data-providers/ec2-identity-doc/Cargo.toml b/sources/early-boot-config/user-data-providers/ec2-identity-doc/Cargo.toml index fc4e8ef8740..4c3e03f1dd6 100644 --- a/sources/early-boot-config/user-data-providers/ec2-identity-doc/Cargo.toml +++ b/sources/early-boot-config/user-data-providers/ec2-identity-doc/Cargo.toml @@ -5,6 +5,9 @@ authors = ["Zac Mrowicki ", "Sam Berning ", "Sam Berning ", "Sam Berning ", "Sam Berning ", "Sam Berning ", "Sam Berning ", "Sam Berning Date: Wed, 6 Mar 2024 03:12:43 +0000 Subject: [PATCH 35/41] early-boot-config: move data-providers.d to /usr/libexec Signed-off-by: Sam Berning --- .../early-boot-config/early-boot-config.spec | 121 ++++++++++-------- .../early-boot-config/README.md | 2 +- .../early-boot-config/src/main.rs | 4 +- 3 files changed, 69 insertions(+), 58 deletions(-) diff --git a/packages/early-boot-config/early-boot-config.spec b/packages/early-boot-config/early-boot-config.spec index aacf140fa4d..ca7b2e0b122 100644 --- a/packages/early-boot-config/early-boot-config.spec +++ b/packages/early-boot-config/early-boot-config.spec @@ -15,48 +15,35 @@ BuildRequires: %{_cross_os}glibc-devel %description %{summary}. -%package -n %{_cross_os}early-boot-config-common -Summary: early-boot-config binary -%description -n %{_cross_os}early-boot-config-common -%{summary}. - -%package -n %{_cross_os}early-boot-config-data-providers -Summary: early-boot-config data providers directory -%description -n %{_cross_os}early-boot-config-data-providers -%{summary}. - %package -n %{_cross_os}early-boot-config-local Summary: local-provider -Requires: %{_cross_os}early-boot-config-data-providers + %description -n %{_cross_os}early-boot-config-local %{summary}. %package -n %{_cross_os}early-boot-config-aws Summary: early-boot-config package for AWS -Provides: %{_cross_os}early-boot-config -Requires: %{_cross_os}early-boot-config-common -Requires: %{_cross_os}early-boot-config-data-providers +Requires: %{name} Requires: %{_cross_os}early-boot-config-local + %description -n %{_cross_os}early-boot-config-aws %{summary}. %ifarch x86_64 %package -n %{_cross_os}early-boot-config-vmware Summary: early-boot-config package for vmware -Provides: %{_cross_os}early-boot-config -Requires: %{_cross_os}early-boot-config-common -Requires: %{_cross_os}early-boot-config-data-providers +Requires: %{name} Requires: %{_cross_os}early-boot-config-local + %description -n %{_cross_os}early-boot-config-vmware %{summary}. %endif %package -n %{_cross_os}early-boot-config-metal Summary: early-boot-config package for metal -Provides: %{_cross_os}early-boot-config -Requires: %{_cross_os}early-boot-config-common -Requires: %{_cross_os}early-boot-config-data-providers +Requires: %{name} Requires: %{_cross_os}early-boot-config-local + %description -n %{_cross_os}early-boot-config-metal %{summary}. @@ -66,8 +53,7 @@ Requires: %{_cross_os}early-boot-config-local %build %cargo_build --manifest-path %{_builddir}/sources/Cargo.toml \ - -p early-boot-config \ - --bin early-boot-config + -p early-boot-config # build aws user data providers %cargo_build --manifest-path %{_builddir}/sources/Cargo.toml \ @@ -87,66 +73,91 @@ Requires: %{_cross_os}early-boot-config-local -p vmware-guestinfo-user-data-provider %endif +%global cargo_outdir %{getenv:HOME}/.cache/%{__cargo_target}/release +%global early_boot_config_bindir %{_cross_libexecdir}/early-boot-config/bin +%global early_boot_config_provider_dir %{_cross_libexecdir}/early-boot-config/data-providers.d + %install install -d %{buildroot}%{_cross_bindir} -install -p -m 0755 ${HOME}/.cache/%{__cargo_target}/release/early-boot-config %{buildroot}%{_cross_bindir} +install -p -m 0755 %{cargo_outdir}/early-boot-config %{buildroot}%{_cross_bindir} install -d %{buildroot}%{_cross_unitdir} install -p -m 0644 %{S:100} %{buildroot}%{_cross_unitdir} -install -d %{buildroot}%{_cross_libexecdir}/early-boot-config/bin +install -d %{buildroot}%{early_boot_config_bindir} install -p -m 0755 \ - ${HOME}/.cache/%{__cargo_target}/release/ec2-identity-doc-user-data-provider \ - ${HOME}/.cache/%{__cargo_target}/release/ec2-imds-user-data-provider \ - ${HOME}/.cache/%{__cargo_target}/release/local-defaults-user-data-provider \ - ${HOME}/.cache/%{__cargo_target}/release/local-file-user-data-provider \ - ${HOME}/.cache/%{__cargo_target}/release/local-overrides-user-data-provider \ - %{buildroot}%{_cross_libexecdir}/early-boot-config/bin + %{cargo_outdir}/ec2-identity-doc-user-data-provider \ + %{cargo_outdir}/ec2-imds-user-data-provider \ + %{cargo_outdir}/local-defaults-user-data-provider \ + %{cargo_outdir}/local-file-user-data-provider \ + %{cargo_outdir}/local-overrides-user-data-provider \ + %{buildroot}%{early_boot_config_bindir} %ifarch x86_64 install -p -m 0755 \ - ${HOME}/.cache/%{__cargo_target}/release/vmware-cd-rom-user-data-provider \ - ${HOME}/.cache/%{__cargo_target}/release/vmware-guestinfo-user-data-provider \ - %{buildroot}%{_cross_libexecdir}/early-boot-config/bin + %{cargo_outdir}/vmware-cd-rom-user-data-provider \ + %{cargo_outdir}/vmware-guestinfo-user-data-provider \ + %{buildroot}%{early_boot_config_bindir} %endif -install -d %{buildroot}%{_cross_datadir}/early-boot-config/data-providers.d +install -d %{buildroot}%{early_boot_config_provider_dir} + +ln -rs \ + %{buildroot}%{early_boot_config_bindir}/ec2-identity-doc-user-data-provider \ + %{buildroot}%{early_boot_config_provider_dir}/30-ec2-identity-doc + +ln -rs \ + %{buildroot}%{early_boot_config_bindir}/ec2-imds-user-data-provider \ + %{buildroot}%{early_boot_config_provider_dir}/40-ec2-imds -%post -n %{_cross_os}early-boot-config-aws -p -posix.symlink("../../../libexec/early-boot-config/bin/ec2-identity-doc-user-data-provider", "%{_cross_datadir}/early-boot-config/data-providers.d/30-ec2-identity-doc") -posix.symlink("../../../libexec/early-boot-config/bin/ec2-imds-user-data-provider", "%{_cross_datadir}/early-boot-config/data-providers.d/40-ec2-imds") +ln -rs \ + %{buildroot}%{early_boot_config_bindir}/local-defaults-user-data-provider \ + %{buildroot}%{early_boot_config_provider_dir}/10-local-defaults -%post -n %{_cross_os}early-boot-config-local -p -posix.symlink("../../../libexec/early-boot-config/bin/local-defaults-user-data-provider", "%{_cross_datadir}/early-boot-config/data-providers.d/10-local-defaults") -posix.symlink("../../../libexec/early-boot-config/bin/local-file-user-data-provider", "%{_cross_datadir}/early-boot-config/data-providers.d/20-local-user-data") -posix.symlink("../../../libexec/early-boot-config/bin/local-overrides-user-data-provider", "%{_cross_datadir}/early-boot-config/data-providers.d/50-local-overrides") +ln -rs \ + %{buildroot}%{early_boot_config_bindir}/local-file-user-data-provider \ + %{buildroot}%{early_boot_config_provider_dir}/20-local-user-data + +ln -rs \ + %{buildroot}%{early_boot_config_bindir}/local-overrides-user-data-provider \ + %{buildroot}%{early_boot_config_provider_dir}/99-local-overrides %ifarch x86_64 -%post -n %{_cross_os}early-boot-config-vmware -p -posix.symlink("../../../libexec/early-boot-config/bin/vmware-cd-rom-user-data-provider", "%{_cross_datadir}/early-boot-config/data-providers.d/30-vmware-cd-rom") -posix.symlink("../../../libexec/early-boot-config/bin/vmware-guestinfo-user-data-provider", "%{_cross_datadir}/early-boot-config/data-providers.d/40-vmware-guestinfo") +ln -rs \ + %{buildroot}%{early_boot_config_bindir}/vmware-cd-rom-user-data-provider \ + %{buildroot}%{early_boot_config_provider_dir}/30-vmware-cd-rom + +ln -rs \ + %{buildroot}%{early_boot_config_bindir}/vmware-guestinfo-user-data-provider \ + %{buildroot}%{early_boot_config_provider_dir}/40-vmware-guestinfo %endif -%files -n %{_cross_os}early-boot-config-common +%files %{_cross_bindir}/early-boot-config %{_cross_unitdir}/early-boot-config.service - -%files -n %{_cross_os}early-boot-config-data-providers -%dir %{_cross_datadir}/early-boot-config/data-providers.d +%dir %{early_boot_config_provider_dir} %files -n %{_cross_os}early-boot-config-local -%{_cross_libexecdir}/early-boot-config/bin/local-file-user-data-provider -%{_cross_libexecdir}/early-boot-config/bin/local-defaults-user-data-provider -%{_cross_libexecdir}/early-boot-config/bin/local-overrides-user-data-provider +%{early_boot_config_bindir}/local-defaults-user-data-provider +%{early_boot_config_bindir}/local-file-user-data-provider +%{early_boot_config_bindir}/local-overrides-user-data-provider +%{early_boot_config_provider_dir}/10-local-defaults +%{early_boot_config_provider_dir}/20-local-user-data +%{early_boot_config_provider_dir}/99-local-overrides %files -n %{_cross_os}early-boot-config-aws -%{_cross_libexecdir}/early-boot-config/bin/ec2-identity-doc-user-data-provider -%{_cross_libexecdir}/early-boot-config/bin/ec2-imds-user-data-provider +%{early_boot_config_bindir}/ec2-identity-doc-user-data-provider +%{early_boot_config_bindir}/ec2-imds-user-data-provider +%{early_boot_config_provider_dir}/30-ec2-identity-doc +%{early_boot_config_provider_dir}/40-ec2-imds %ifarch x86_64 %files -n %{_cross_os}early-boot-config-vmware -%{_cross_libexecdir}/early-boot-config/bin/vmware-cd-rom-user-data-provider -%{_cross_libexecdir}/early-boot-config/bin/vmware-guestinfo-user-data-provider +%{early_boot_config_bindir}/vmware-cd-rom-user-data-provider +%{early_boot_config_bindir}/vmware-guestinfo-user-data-provider +%{early_boot_config_provider_dir}/30-vmware-cd-rom +%{early_boot_config_provider_dir}/40-vmware-guestinfo %endif +# There are no metal-specific providers, just dependencies like the local file providers. %files -n %{_cross_os}early-boot-config-metal diff --git a/sources/early-boot-config/early-boot-config/README.md b/sources/early-boot-config/early-boot-config/README.md index 0ac0cf67bbd..c2313a4812c 100644 --- a/sources/early-boot-config/early-boot-config/README.md +++ b/sources/early-boot-config/early-boot-config/README.md @@ -6,7 +6,7 @@ Current version: 0.1.0 early-boot-config sends user data to the Bottlerocket API. -Variants include their required user data provider binaries via packages. early-boot-config discovers these binaries at runtime in /usr/share/early-boot-config/data-providers.d and runs them in order, sending any user data found to the API. +Variants include their required user data provider binaries via packages. early-boot-config discovers these binaries at runtime in /usr/libexec/early-boot-config/data-providers.d and runs them in order, sending any user data found to the API. User data provider binaries each implement the ability to obtain user data from a single source. Sources include local files, AWS Instance Metadata Service (IMDS), among others. diff --git a/sources/early-boot-config/early-boot-config/src/main.rs b/sources/early-boot-config/early-boot-config/src/main.rs index d88b0219408..3e2629e2f47 100644 --- a/sources/early-boot-config/early-boot-config/src/main.rs +++ b/sources/early-boot-config/early-boot-config/src/main.rs @@ -3,7 +3,7 @@ early-boot-config sends user data to the Bottlerocket API. -Variants include their required user data provider binaries via packages. early-boot-config discovers these binaries at runtime in /usr/share/early-boot-config/data-providers.d and runs them in order, sending any user data found to the API. +Variants include their required user data provider binaries via packages. early-boot-config discovers these binaries at runtime in /usr/libexec/early-boot-config/data-providers.d and runs them in order, sending any user data found to the API. User data provider binaries each implement the ability to obtain user data from a single source. Sources include local files, AWS Instance Metadata Service (IMDS), among others. */ @@ -31,7 +31,7 @@ use walkdir::WalkDir; // We create it after running successfully. const MARKER_FILE: &str = "/var/lib/bottlerocket/early-boot-config.ran"; /// The directory containing user data provider binaries -const PROVIDERS_DIR: &str = "/usr/share/early-boot-config/data-providers.d"; +const PROVIDERS_DIR: &str = "/usr/libexec/early-boot-config/data-providers.d"; /// Store the args we receive on the command line #[derive(Debug)] From bd87f16c0bc747563def852eace0b7a8115b19d5 Mon Sep 17 00:00:00 2001 From: Sam Berning Date: Thu, 29 Feb 2024 23:17:41 +0000 Subject: [PATCH 36/41] early-boot-config: print error message on provider failure Signed-off-by: Sam Berning --- sources/early-boot-config/early-boot-config/src/main.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/sources/early-boot-config/early-boot-config/src/main.rs b/sources/early-boot-config/early-boot-config/src/main.rs index 3e2629e2f47..990f52f28cb 100644 --- a/sources/early-boot-config/early-boot-config/src/main.rs +++ b/sources/early-boot-config/early-boot-config/src/main.rs @@ -141,6 +141,7 @@ where output.status.success(), error::ProviderFailureSnafu { provider: &provider, + message: String::from_utf8_lossy(&output.stdout), } ); @@ -282,8 +283,11 @@ mod error { #[snafu(display("Provider error: {}", source))] Provider { source: Box }, - #[snafu(display("Provider '{}' failed", provider.display()))] - ProviderFailure { provider: PathBuf }, + #[snafu(display("Provider '{}' failed: {}", provider.display(), message))] + ProviderFailure { + provider: PathBuf, + message: String, + }, #[snafu(display( "Error deserializing provider output as JSON from {}: '{}'", From 75111aca468b5a79dcbff36280ac5043b237b0ee Mon Sep 17 00:00:00 2001 From: Sam Berning Date: Wed, 6 Mar 2024 23:24:00 +0000 Subject: [PATCH 37/41] user-data-providers: remove async where not necessary Signed-off-by: Sam Berning --- sources/Cargo.lock | 109 +++++++----------- .../early-boot-config-provider/Cargo.toml | 4 +- .../src/provider.rs | 19 ++- .../ec2-identity-doc/Cargo.toml | 2 +- .../ec2-identity-doc/src/lib.rs | 4 +- .../ec2-identity-doc/src/main.rs | 6 +- .../user-data-providers/ec2-imds/Cargo.toml | 2 +- .../user-data-providers/ec2-imds/src/lib.rs | 4 +- .../user-data-providers/ec2-imds/src/main.rs | 6 +- .../local-defaults/Cargo.toml | 2 - .../local-defaults/src/lib.rs | 4 +- .../local-defaults/src/main.rs | 9 +- .../user-data-providers/local-file/Cargo.toml | 2 - .../user-data-providers/local-file/src/lib.rs | 4 +- .../local-file/src/main.rs | 9 +- .../local-overrides/Cargo.toml | 2 - .../local-overrides/src/lib.rs | 6 +- .../local-overrides/src/main.rs | 9 +- .../vmware-cd-rom/Cargo.toml | 6 +- .../vmware-cd-rom/src/lib.rs | 6 +- .../vmware-cd-rom/src/main.rs | 9 +- .../vmware-guestinfo/Cargo.toml | 6 +- .../vmware-guestinfo/src/lib.rs | 4 +- .../vmware-guestinfo/src/main.rs | 9 +- 24 files changed, 105 insertions(+), 138 deletions(-) diff --git a/sources/Cargo.lock b/sources/Cargo.lock index b8aa211cdf2..c0f1ae6da62 100644 --- a/sources/Cargo.lock +++ b/sources/Cargo.lock @@ -55,7 +55,7 @@ dependencies = [ "actix-service", "actix-utils", "ahash", - "base64 0.21.7", + "base64", "bitflags 2.4.2", "bytes", "bytestring", @@ -347,7 +347,7 @@ checksum = "0952808a6c2afd1aa8947271f3a60f1a6763c7b912d210184c5149b5cf147247" name = "apiclient" version = "0.1.0" dependencies = [ - "base64 0.21.7", + "base64", "constants", "datastore", "futures", @@ -371,7 +371,7 @@ dependencies = [ "snafu 0.8.2", "tokio", "tokio-tungstenite", - "toml 0.8.12", + "toml", "unindent", "url", ] @@ -403,7 +403,7 @@ dependencies = [ "snafu 0.8.2", "thar-be-updates", "tokio", - "toml 0.8.12", + "toml", ] [[package]] @@ -990,12 +990,6 @@ dependencies = [ "rustc-demangle", ] -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - [[package]] name = "base64" version = "0.21.7" @@ -1259,7 +1253,7 @@ dependencies = [ "percent-encoding", "regex", "serde", - "toml 0.8.12", + "toml", ] [[package]] @@ -1273,7 +1267,7 @@ name = "certdog" version = "0.1.0" dependencies = [ "argh", - "base64 0.21.7", + "base64", "constants", "generate-readme", "log", @@ -1282,7 +1276,7 @@ dependencies = [ "simplelog", "snafu 0.8.2", "tempfile", - "toml 0.8.12", + "toml", "x509-parser", ] @@ -1320,7 +1314,7 @@ dependencies = [ "simplelog", "snafu 0.8.2", "tokio", - "toml 0.8.12", + "toml", ] [[package]] @@ -1422,7 +1416,7 @@ dependencies = [ "serde_json", "simplelog", "snafu 0.8.2", - "toml 0.8.12", + "toml", ] [[package]] @@ -1584,7 +1578,7 @@ dependencies = [ "serde", "serde_json", "snafu 0.8.2", - "toml 0.8.12", + "toml", "walkdir", ] @@ -1682,7 +1676,7 @@ dependencies = [ "simplelog", "snafu 0.8.2", "tempfile", - "toml 0.8.12", + "toml", ] [[package]] @@ -1697,7 +1691,7 @@ version = "0.1.0" dependencies = [ "apiclient", "async-trait", - "base64 0.21.7", + "base64", "constants", "early-boot-config-provider", "env_logger", @@ -1710,7 +1704,7 @@ dependencies = [ "simplelog", "snafu 0.8.2", "tokio", - "toml 0.8.12", + "toml", "walkdir", ] @@ -1728,8 +1722,8 @@ dependencies = [ "retry-read", "serde", "serde_json", - "snafu 0.7.5", - "toml 0.5.11", + "snafu 0.8.2", + "toml", ] [[package]] @@ -1742,7 +1736,7 @@ dependencies = [ "imdsclient", "log", "serde_json", - "snafu 0.7.5", + "snafu 0.8.2", "tokio", ] @@ -1755,7 +1749,7 @@ dependencies = [ "generate-readme", "imdsclient", "log", - "snafu 0.7.5", + "snafu 0.8.2", "tokio", ] @@ -2088,7 +2082,7 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06683b93020a07e3dbcf5f8c0f6d40080d725bea7936fc01ad345c01b97dc270" dependencies = [ - "base64 0.21.7", + "base64", "bytes", "headers-core", "http 0.2.12", @@ -2149,7 +2143,7 @@ dependencies = [ name = "host-containers" version = "0.1.0" dependencies = [ - "base64 0.21.7", + "base64", "constants", "generate-readme", "log", @@ -2158,7 +2152,7 @@ dependencies = [ "simplelog", "snafu 0.8.2", "tempfile", - "toml 0.8.12", + "toml", ] [[package]] @@ -2501,30 +2495,24 @@ dependencies = [ name = "local-defaults-user-data-provider" version = "0.1.0" dependencies = [ - "async-trait", "early-boot-config-provider", "generate-readme", - "tokio", ] [[package]] name = "local-file-user-data-provider" version = "0.1.0" dependencies = [ - "async-trait", "early-boot-config-provider", "generate-readme", - "tokio", ] [[package]] name = "local-overrides-user-data-provider" version = "0.1.0" dependencies = [ - "async-trait", "early-boot-config-provider", "generate-readme", - "tokio", ] [[package]] @@ -2625,7 +2613,7 @@ name = "merge-toml" version = "0.1.0" dependencies = [ "snafu 0.8.2", - "toml 0.8.12", + "toml", ] [[package]] @@ -2643,7 +2631,7 @@ dependencies = [ "simplelog", "snafu 0.8.2", "tempfile", - "toml 0.8.12", + "toml", "url", ] @@ -2737,7 +2725,7 @@ dependencies = [ name = "modeled-types" version = "0.1.0" dependencies = [ - "base64 0.21.7", + "base64", "generate-readme", "indexmap 2.2.5", "lazy_static", @@ -2774,7 +2762,7 @@ dependencies = [ "settings-extension-motd", "settings-extension-ntp", "settings-extension-updates", - "toml 0.8.12", + "toml", ] [[package]] @@ -2802,7 +2790,7 @@ dependencies = [ "tempfile", "tokio", "tokio-retry", - "toml 0.8.12", + "toml", ] [[package]] @@ -3063,7 +3051,7 @@ version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b8fcc794035347fb64beda2d3b462595dd2753e3f268d89c5aae77e8cf2c310" dependencies = [ - "base64 0.21.7", + "base64", "serde", ] @@ -3220,7 +3208,7 @@ dependencies = [ "signpost", "simplelog", "snafu 0.8.2", - "toml 0.8.12", + "toml", ] [[package]] @@ -3442,7 +3430,7 @@ version = "0.11.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78bf93c4af7a8bb7d879d51cebe797356ff10ae8516ace542b5182d9dcac10b2" dependencies = [ - "base64 0.21.7", + "base64", "bytes", "encoding_rs", "futures-core", @@ -3568,7 +3556,7 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "base64 0.21.7", + "base64", ] [[package]] @@ -3635,7 +3623,7 @@ dependencies = [ "apiclient", "argh", "async-trait", - "base64 0.21.7", + "base64", "bottlerocket-release", "cached", "constants", @@ -3659,7 +3647,7 @@ dependencies = [ "simplelog", "snafu 0.8.2", "tokio", - "toml 0.8.12", + "toml", "url", ] @@ -3931,7 +3919,7 @@ name = "shibaken" version = "0.1.0" dependencies = [ "argh", - "base64 0.21.7", + "base64", "generate-readme", "imdsclient", "log", @@ -3941,7 +3929,7 @@ dependencies = [ "snafu 0.8.2", "tempfile", "tokio", - "toml 0.8.12", + "toml", ] [[package]] @@ -4085,7 +4073,7 @@ checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" name = "static-pods" version = "0.1.0" dependencies = [ - "base64 0.21.7", + "base64", "bottlerocket-variant", "constants", "generate-readme", @@ -4114,7 +4102,7 @@ dependencies = [ "semver", "simplelog", "snafu 0.8.2", - "toml 0.8.12", + "toml", "walkdir", ] @@ -4307,7 +4295,7 @@ dependencies = [ "simplelog", "snafu 0.8.2", "tempfile", - "toml 0.8.12", + "toml", "update_metadata", ] @@ -4495,15 +4483,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "toml" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" -dependencies = [ - "serde", -] - [[package]] name = "toml" version = "0.8.12" @@ -4725,7 +4704,7 @@ dependencies = [ "serde_json", "serde_plain", "snafu 0.8.2", - "toml 0.8.12", + "toml", ] [[package]] @@ -4753,7 +4732,7 @@ dependencies = [ "tempfile", "tokio", "tokio-util", - "toml 0.8.12", + "toml", "tough", "update_metadata", "url", @@ -4825,30 +4804,26 @@ dependencies = [ name = "vmware-cd-rom-user-data-provider" version = "0.1.0" dependencies = [ - "async-trait", - "base64 0.13.1", + "base64", "early-boot-config-provider", "generate-readme", "log", "serde", "serde-xml-rs", - "snafu 0.7.5", - "tokio", + "snafu 0.8.2", ] [[package]] name = "vmware-guestinfo-user-data-provider" version = "0.1.0" dependencies = [ - "async-trait", - "base64 0.13.1", + "base64", "early-boot-config-provider", "generate-readme", "log", "serde", "serde_plain", - "snafu 0.7.5", - "tokio", + "snafu 0.8.2", "vmw_backdoor", ] diff --git a/sources/early-boot-config/early-boot-config-provider/Cargo.toml b/sources/early-boot-config/early-boot-config-provider/Cargo.toml index 09017531ffd..001c93dc4f6 100644 --- a/sources/early-boot-config/early-boot-config-provider/Cargo.toml +++ b/sources/early-boot-config/early-boot-config-provider/Cargo.toml @@ -17,8 +17,8 @@ log = "0.4" retry-read = { path = "../../retry-read", version = "0.1" } serde = { version = "1", features = ["derive"] } serde_json = "1" -snafu = "0.7" -toml = "0.5" +snafu = "0.8" +toml = "0.8" [build-dependencies] generate-readme = { version = "0.1", path = "../../generate-readme" } diff --git a/sources/early-boot-config/early-boot-config-provider/src/provider.rs b/sources/early-boot-config/early-boot-config-provider/src/provider.rs index ee63db3003f..ad3386a8c34 100644 --- a/sources/early-boot-config/early-boot-config-provider/src/provider.rs +++ b/sources/early-boot-config/early-boot-config-provider/src/provider.rs @@ -11,19 +11,27 @@ use std::process::ExitCode; /// Support for user data providers can be added by implementing this trait, and adding an /// additional binary using the implementor and common functions below. -#[async_trait] pub trait UserDataProvider { /// Optionally return a SettingsJson object if user data is found, representing the settings to /// send to the API. + fn user_data(&self) -> std::result::Result, Box>; +} + +/// This trait is the same as UserDataProvider, but it allows for async data sources, such as IMDS. +#[async_trait] +pub trait AsyncUserDataProvider { async fn user_data( &self, ) -> std::result::Result, Box>; } -/// Run a user data provider, returning the proper exit code and errors, and if successful, -/// printing its JSON to stdout. -pub async fn run_userdata_provider(provider: &impl UserDataProvider) -> ExitCode { - let (exit_code, output) = match provider.user_data().await { +/// Provides the standard output format of a user data provider. Takes a result returned by a user +/// data provider, checks for errors, and returns the proper exit code. If the user data was +/// returned successfully, this will print its JSON to stdout. +pub fn print_userdata_output( + user_data: std::result::Result, Box>, +) -> ExitCode { + let (exit_code, output) = match user_data { Ok(Some(user_data)) => match serde_json::to_string(&user_data) { Ok(json) => (ExitCode::SUCCESS, json), Err(e) => ( @@ -34,7 +42,6 @@ pub async fn run_userdata_provider(provider: &impl UserDataProvider) -> ExitCode Ok(None) => (ExitCode::SUCCESS, String::new()), Err(e) => (ExitCode::FAILURE, format!("{}", e)), }; - println!("{}", output); exit_code } diff --git a/sources/early-boot-config/user-data-providers/ec2-identity-doc/Cargo.toml b/sources/early-boot-config/user-data-providers/ec2-identity-doc/Cargo.toml index 4c3e03f1dd6..0f4195fe3bd 100644 --- a/sources/early-boot-config/user-data-providers/ec2-identity-doc/Cargo.toml +++ b/sources/early-boot-config/user-data-providers/ec2-identity-doc/Cargo.toml @@ -14,7 +14,7 @@ async-trait = "0.1" imdsclient = { path = "../../../imdsclient", version = "0.1" } log = "0.4" serde_json = "1" -snafu = "0.7" +snafu = "0.8" tokio = { version = "~1.32", default-features = false, features = ["process", "macros", "rt-multi-thread"] } # LTS early-boot-config-provider = { path = "../../early-boot-config-provider", version = "0.1" } diff --git a/sources/early-boot-config/user-data-providers/ec2-identity-doc/src/lib.rs b/sources/early-boot-config/user-data-providers/ec2-identity-doc/src/lib.rs index 1e3e4495319..73bde5901ab 100644 --- a/sources/early-boot-config/user-data-providers/ec2-identity-doc/src/lib.rs +++ b/sources/early-boot-config/user-data-providers/ec2-identity-doc/src/lib.rs @@ -3,7 +3,7 @@ extern crate log; use async_trait::async_trait; -use early_boot_config_provider::provider::UserDataProvider; +use early_boot_config_provider::provider::AsyncUserDataProvider; use early_boot_config_provider::settings::SettingsJson; use imdsclient::ImdsClient; use serde_json::json; @@ -50,7 +50,7 @@ impl Ec2IdentityDoc { } #[async_trait] -impl UserDataProvider for Ec2IdentityDoc { +impl AsyncUserDataProvider for Ec2IdentityDoc { async fn user_data( &self, ) -> std::result::Result, Box> { diff --git a/sources/early-boot-config/user-data-providers/ec2-identity-doc/src/main.rs b/sources/early-boot-config/user-data-providers/ec2-identity-doc/src/main.rs index 8f63853d53c..006be9fdf5d 100644 --- a/sources/early-boot-config/user-data-providers/ec2-identity-doc/src/main.rs +++ b/sources/early-boot-config/user-data-providers/ec2-identity-doc/src/main.rs @@ -1,9 +1,11 @@ -use early_boot_config_provider::provider::{run_userdata_provider, setup_provider_logging}; +use early_boot_config_provider::provider::{ + print_userdata_output, setup_provider_logging, AsyncUserDataProvider, +}; use ec2_identity_doc_user_data_provider::Ec2IdentityDoc; use std::process::ExitCode; #[tokio::main] async fn main() -> ExitCode { setup_provider_logging(); - run_userdata_provider(&Ec2IdentityDoc).await + print_userdata_output(Ec2IdentityDoc.user_data().await) } diff --git a/sources/early-boot-config/user-data-providers/ec2-imds/Cargo.toml b/sources/early-boot-config/user-data-providers/ec2-imds/Cargo.toml index ab796f273dd..143a4c9ffbc 100644 --- a/sources/early-boot-config/user-data-providers/ec2-imds/Cargo.toml +++ b/sources/early-boot-config/user-data-providers/ec2-imds/Cargo.toml @@ -13,7 +13,7 @@ exclude = ["README.md"] async-trait = "0.1" imdsclient = { path = "../../../imdsclient", version = "0.1" } log = "0.4" -snafu = "0.7" +snafu = "0.8" tokio = { version = "~1.32", default-features = false, features = ["process", "macros", "rt-multi-thread"] } # LTS early-boot-config-provider = { path = "../../early-boot-config-provider", version = "0.1" } diff --git a/sources/early-boot-config/user-data-providers/ec2-imds/src/lib.rs b/sources/early-boot-config/user-data-providers/ec2-imds/src/lib.rs index b2bfff34026..1b8214dd6c3 100644 --- a/sources/early-boot-config/user-data-providers/ec2-imds/src/lib.rs +++ b/sources/early-boot-config/user-data-providers/ec2-imds/src/lib.rs @@ -4,7 +4,7 @@ extern crate log; use async_trait::async_trait; use early_boot_config_provider::compression::expand_slice_maybe; -use early_boot_config_provider::provider::UserDataProvider; +use early_boot_config_provider::provider::AsyncUserDataProvider; use early_boot_config_provider::settings::SettingsJson; use imdsclient::ImdsClient; use snafu::ResultExt; @@ -12,7 +12,7 @@ use snafu::ResultExt; pub struct Ec2Imds; #[async_trait] -impl UserDataProvider for Ec2Imds { +impl AsyncUserDataProvider for Ec2Imds { async fn user_data( &self, ) -> std::result::Result, Box> { diff --git a/sources/early-boot-config/user-data-providers/ec2-imds/src/main.rs b/sources/early-boot-config/user-data-providers/ec2-imds/src/main.rs index b1254e52fb6..83807c894b4 100644 --- a/sources/early-boot-config/user-data-providers/ec2-imds/src/main.rs +++ b/sources/early-boot-config/user-data-providers/ec2-imds/src/main.rs @@ -1,9 +1,11 @@ -use early_boot_config_provider::provider::{run_userdata_provider, setup_provider_logging}; +use early_boot_config_provider::provider::{ + print_userdata_output, setup_provider_logging, AsyncUserDataProvider, +}; use ec2_imds_user_data_provider::Ec2Imds; use std::process::ExitCode; #[tokio::main] async fn main() -> ExitCode { setup_provider_logging(); - run_userdata_provider(&Ec2Imds).await + print_userdata_output(Ec2Imds.user_data().await) } diff --git a/sources/early-boot-config/user-data-providers/local-defaults/Cargo.toml b/sources/early-boot-config/user-data-providers/local-defaults/Cargo.toml index 900ec35cc11..16baaf400bd 100644 --- a/sources/early-boot-config/user-data-providers/local-defaults/Cargo.toml +++ b/sources/early-boot-config/user-data-providers/local-defaults/Cargo.toml @@ -10,8 +10,6 @@ build = "build.rs" exclude = ["README.md"] [dependencies] -async-trait = "0.1" -tokio = { version = "~1.32", default-features = false, features = ["process", "macros", "rt-multi-thread"] } # LTS early-boot-config-provider = { path = "../../early-boot-config-provider", version = "0.1" } [build-dependencies] diff --git a/sources/early-boot-config/user-data-providers/local-defaults/src/lib.rs b/sources/early-boot-config/user-data-providers/local-defaults/src/lib.rs index beb9ea5e4ce..84dd80e7271 100644 --- a/sources/early-boot-config/user-data-providers/local-defaults/src/lib.rs +++ b/sources/early-boot-config/user-data-providers/local-defaults/src/lib.rs @@ -1,5 +1,4 @@ /// Site-local defaults -use async_trait::async_trait; use early_boot_config_provider::provider::{user_data_from_file, UserDataProvider}; use early_boot_config_provider::settings::SettingsJson; @@ -7,9 +6,8 @@ const LOCAL_DEFAULTS_FILE: &str = "/local/user-data-defaults.toml"; pub struct LocalDefaults; -#[async_trait] impl UserDataProvider for LocalDefaults { - async fn user_data(&self) -> Result, Box> { + fn user_data(&self) -> Result, Box> { user_data_from_file(LOCAL_DEFAULTS_FILE) } } diff --git a/sources/early-boot-config/user-data-providers/local-defaults/src/main.rs b/sources/early-boot-config/user-data-providers/local-defaults/src/main.rs index 510b052a31e..1f826f72221 100644 --- a/sources/early-boot-config/user-data-providers/local-defaults/src/main.rs +++ b/sources/early-boot-config/user-data-providers/local-defaults/src/main.rs @@ -1,9 +1,10 @@ -use early_boot_config_provider::provider::{run_userdata_provider, setup_provider_logging}; +use early_boot_config_provider::provider::{ + print_userdata_output, setup_provider_logging, UserDataProvider, +}; use local_defaults_user_data_provider::LocalDefaults; use std::process::ExitCode; -#[tokio::main] -async fn main() -> ExitCode { +fn main() -> ExitCode { setup_provider_logging(); - run_userdata_provider(&LocalDefaults).await + print_userdata_output(LocalDefaults.user_data()) } diff --git a/sources/early-boot-config/user-data-providers/local-file/Cargo.toml b/sources/early-boot-config/user-data-providers/local-file/Cargo.toml index 387f7b47393..16f7d63185a 100644 --- a/sources/early-boot-config/user-data-providers/local-file/Cargo.toml +++ b/sources/early-boot-config/user-data-providers/local-file/Cargo.toml @@ -10,8 +10,6 @@ build = "build.rs" exclude = ["README.md"] [dependencies] -async-trait = "0.1" -tokio = { version = "~1.32", default-features = false, features = ["process", "macros", "rt-multi-thread"] } # LTS early-boot-config-provider = { path = "../../early-boot-config-provider", version = "0.1" } [build-dependencies] diff --git a/sources/early-boot-config/user-data-providers/local-file/src/lib.rs b/sources/early-boot-config/user-data-providers/local-file/src/lib.rs index e0383b4effd..1e0854ee1d2 100644 --- a/sources/early-boot-config/user-data-providers/local-file/src/lib.rs +++ b/sources/early-boot-config/user-data-providers/local-file/src/lib.rs @@ -1,5 +1,4 @@ /// Local user data file -use async_trait::async_trait; use early_boot_config_provider::provider::{user_data_from_file, UserDataProvider}; use early_boot_config_provider::settings::SettingsJson; @@ -7,9 +6,8 @@ const LOCAL_USER_DATA: &str = "/var/lib/bottlerocket/user-data.toml"; pub struct LocalUserData; -#[async_trait] impl UserDataProvider for LocalUserData { - async fn user_data(&self) -> Result, Box> { + fn user_data(&self) -> Result, Box> { user_data_from_file(LOCAL_USER_DATA) } } diff --git a/sources/early-boot-config/user-data-providers/local-file/src/main.rs b/sources/early-boot-config/user-data-providers/local-file/src/main.rs index 1e2afc2d4eb..0a9aa357a98 100644 --- a/sources/early-boot-config/user-data-providers/local-file/src/main.rs +++ b/sources/early-boot-config/user-data-providers/local-file/src/main.rs @@ -1,9 +1,10 @@ -use early_boot_config_provider::provider::{run_userdata_provider, setup_provider_logging}; +use early_boot_config_provider::provider::{ + print_userdata_output, setup_provider_logging, UserDataProvider, +}; use local_file_user_data_provider::LocalUserData; use std::process::ExitCode; -#[tokio::main] -async fn main() -> ExitCode { +fn main() -> ExitCode { setup_provider_logging(); - run_userdata_provider(&LocalUserData).await + print_userdata_output(LocalUserData.user_data()) } diff --git a/sources/early-boot-config/user-data-providers/local-overrides/Cargo.toml b/sources/early-boot-config/user-data-providers/local-overrides/Cargo.toml index 8d0db4999dc..36fb4386ac2 100644 --- a/sources/early-boot-config/user-data-providers/local-overrides/Cargo.toml +++ b/sources/early-boot-config/user-data-providers/local-overrides/Cargo.toml @@ -10,8 +10,6 @@ build = "build.rs" exclude = ["README.md"] [dependencies] -async-trait = "0.1" -tokio = { version = "~1.32", default-features = false, features = ["process", "macros", "rt-multi-thread"] } # LTS early-boot-config-provider = { path = "../../early-boot-config-provider", version = "0.1" } [build-dependencies] diff --git a/sources/early-boot-config/user-data-providers/local-overrides/src/lib.rs b/sources/early-boot-config/user-data-providers/local-overrides/src/lib.rs index 73174ee06c7..06fa9869215 100644 --- a/sources/early-boot-config/user-data-providers/local-overrides/src/lib.rs +++ b/sources/early-boot-config/user-data-providers/local-overrides/src/lib.rs @@ -1,5 +1,4 @@ /// Site-local overrides -use async_trait::async_trait; use early_boot_config_provider::provider::{user_data_from_file, UserDataProvider}; use early_boot_config_provider::settings::SettingsJson; @@ -7,11 +6,8 @@ const LOCAL_OVERRIDES: &str = "/local/user-data-overrides.toml"; pub struct LocalOverrides; -#[async_trait] impl UserDataProvider for LocalOverrides { - async fn user_data( - &self, - ) -> std::result::Result, Box> { + fn user_data(&self) -> std::result::Result, Box> { user_data_from_file(LOCAL_OVERRIDES) } } diff --git a/sources/early-boot-config/user-data-providers/local-overrides/src/main.rs b/sources/early-boot-config/user-data-providers/local-overrides/src/main.rs index 051c5fb6ae7..751c3e8dc50 100644 --- a/sources/early-boot-config/user-data-providers/local-overrides/src/main.rs +++ b/sources/early-boot-config/user-data-providers/local-overrides/src/main.rs @@ -1,9 +1,10 @@ -use early_boot_config_provider::provider::{run_userdata_provider, setup_provider_logging}; +use early_boot_config_provider::provider::{ + print_userdata_output, setup_provider_logging, UserDataProvider, +}; use local_overrides_user_data_provider::LocalOverrides; use std::process::ExitCode; -#[tokio::main] -async fn main() -> ExitCode { +fn main() -> ExitCode { setup_provider_logging(); - run_userdata_provider(&LocalOverrides).await + print_userdata_output(LocalOverrides.user_data()) } diff --git a/sources/early-boot-config/user-data-providers/vmware-cd-rom/Cargo.toml b/sources/early-boot-config/user-data-providers/vmware-cd-rom/Cargo.toml index 09c6a5fc97c..785593cafe7 100644 --- a/sources/early-boot-config/user-data-providers/vmware-cd-rom/Cargo.toml +++ b/sources/early-boot-config/user-data-providers/vmware-cd-rom/Cargo.toml @@ -10,13 +10,11 @@ build = "build.rs" exclude = ["README.md"] [dependencies] -async-trait = "0.1" -base64 = "0.13" +base64 = "0.21" log = "0.4" serde = { version = "1", features = ["derive"] } serde-xml-rs = "0.6" -snafu = "0.7" -tokio = { version = "~1.32", default-features = false, features = ["process", "macros", "rt-multi-thread"] } # LTS +snafu = "0.8" early-boot-config-provider = { path = "../../early-boot-config-provider", version = "0.1" } [build-dependencies] diff --git a/sources/early-boot-config/user-data-providers/vmware-cd-rom/src/lib.rs b/sources/early-boot-config/user-data-providers/vmware-cd-rom/src/lib.rs index 85f5baecbad..b945946213a 100644 --- a/sources/early-boot-config/user-data-providers/vmware-cd-rom/src/lib.rs +++ b/sources/early-boot-config/user-data-providers/vmware-cd-rom/src/lib.rs @@ -2,7 +2,6 @@ #[macro_use] extern crate log; -use async_trait::async_trait; use base64::Engine; use early_boot_config_provider::compression::{ expand_file_maybe, expand_slice_maybe, OptionalCompressionReader, @@ -98,11 +97,8 @@ impl VmwareCdRom { } } -#[async_trait] impl UserDataProvider for VmwareCdRom { - async fn user_data( - &self, - ) -> std::result::Result, Box> { + fn user_data(&self) -> std::result::Result, Box> { // Given the list of acceptable filenames, ensure only 1 exists and parse // it for user data info!("Attempting to retrieve user data from mounted CD-ROM"); diff --git a/sources/early-boot-config/user-data-providers/vmware-cd-rom/src/main.rs b/sources/early-boot-config/user-data-providers/vmware-cd-rom/src/main.rs index e66c7d3edf4..0fbf47a47ec 100644 --- a/sources/early-boot-config/user-data-providers/vmware-cd-rom/src/main.rs +++ b/sources/early-boot-config/user-data-providers/vmware-cd-rom/src/main.rs @@ -1,9 +1,10 @@ -use early_boot_config_provider::provider::{run_userdata_provider, setup_provider_logging}; +use early_boot_config_provider::provider::{ + print_userdata_output, setup_provider_logging, UserDataProvider, +}; use std::process::ExitCode; use vmware_cd_rom_user_data_provider::VmwareCdRom; -#[tokio::main] -async fn main() -> ExitCode { +fn main() -> ExitCode { setup_provider_logging(); - run_userdata_provider(&VmwareCdRom).await + print_userdata_output(VmwareCdRom.user_data()) } diff --git a/sources/early-boot-config/user-data-providers/vmware-guestinfo/Cargo.toml b/sources/early-boot-config/user-data-providers/vmware-guestinfo/Cargo.toml index 429870d7612..69c495b9d06 100644 --- a/sources/early-boot-config/user-data-providers/vmware-guestinfo/Cargo.toml +++ b/sources/early-boot-config/user-data-providers/vmware-guestinfo/Cargo.toml @@ -10,13 +10,11 @@ build = "build.rs" exclude = ["README.md"] [dependencies] -async-trait = "0.1" -base64 = "0.13" +base64 = "0.21" log = "0.4" serde = { version = "1", features = ["derive"] } serde_plain = "1" -snafu = "0.7" -tokio = { version = "~1.32", default-features = false, features = ["process", "macros", "rt-multi-thread"] } # LTS +snafu = "0.8" early-boot-config-provider = { path = "../../early-boot-config-provider", version = "0.1" } vmw_backdoor = "0.2" diff --git a/sources/early-boot-config/user-data-providers/vmware-guestinfo/src/lib.rs b/sources/early-boot-config/user-data-providers/vmware-guestinfo/src/lib.rs index 2e83269db03..9a56d789e14 100644 --- a/sources/early-boot-config/user-data-providers/vmware-guestinfo/src/lib.rs +++ b/sources/early-boot-config/user-data-providers/vmware-guestinfo/src/lib.rs @@ -2,7 +2,6 @@ #[macro_use] extern crate log; -use async_trait::async_trait; use early_boot_config_provider::provider::UserDataProvider; use early_boot_config_provider::{compression::OptionalCompressionReader, settings::SettingsJson}; use serde::Deserialize; @@ -78,9 +77,8 @@ impl VmwareGuestinfo { } } -#[async_trait] impl UserDataProvider for VmwareGuestinfo { - async fn user_data( + fn user_data( &self, ) -> std::result::Result, Box> { info!("Attempting to retrieve user data via guestinfo interface"); diff --git a/sources/early-boot-config/user-data-providers/vmware-guestinfo/src/main.rs b/sources/early-boot-config/user-data-providers/vmware-guestinfo/src/main.rs index a727d3bd687..df39b7d435f 100644 --- a/sources/early-boot-config/user-data-providers/vmware-guestinfo/src/main.rs +++ b/sources/early-boot-config/user-data-providers/vmware-guestinfo/src/main.rs @@ -1,9 +1,10 @@ -use early_boot_config_provider::provider::{run_userdata_provider, setup_provider_logging}; +use early_boot_config_provider::provider::{ + print_userdata_output, setup_provider_logging, UserDataProvider, +}; use std::process::ExitCode; use vmware_guestinfo_user_data_provider::VmwareGuestinfo; -#[tokio::main] -async fn main() -> ExitCode { +fn main() -> ExitCode { setup_provider_logging(); - run_userdata_provider(&VmwareGuestinfo).await + print_userdata_output(VmwareGuestinfo.user_data()) } From d46af4fa6e509e80bf1aeefa7713f1fb69480242 Mon Sep 17 00:00:00 2001 From: Sam Berning Date: Tue, 19 Mar 2024 00:52:34 +0000 Subject: [PATCH 38/41] user-data-providers: add info to READMEs Signed-off-by: Sam Berning --- .../user-data-providers/ec2-identity-doc/Cargo.toml | 1 - .../user-data-providers/ec2-identity-doc/README.md | 4 ++++ .../user-data-providers/ec2-identity-doc/src/main.rs | 8 ++++++++ .../user-data-providers/ec2-imds/Cargo.toml | 1 - .../user-data-providers/ec2-imds/README.md | 2 ++ .../user-data-providers/ec2-imds/src/main.rs | 6 ++++++ .../user-data-providers/local-defaults/Cargo.toml | 1 - .../user-data-providers/local-defaults/README.md | 2 ++ .../user-data-providers/local-defaults/src/main.rs | 6 ++++++ .../user-data-providers/local-file/Cargo.toml | 1 - .../user-data-providers/local-file/README.md | 2 ++ .../user-data-providers/local-file/src/main.rs | 6 ++++++ .../user-data-providers/local-overrides/Cargo.toml | 1 - .../user-data-providers/local-overrides/README.md | 2 ++ .../user-data-providers/local-overrides/src/main.rs | 6 ++++++ .../user-data-providers/vmware-cd-rom/Cargo.toml | 1 - .../user-data-providers/vmware-cd-rom/README.md | 2 ++ .../user-data-providers/vmware-cd-rom/src/main.rs | 6 ++++++ .../user-data-providers/vmware-guestinfo/Cargo.toml | 1 - .../user-data-providers/vmware-guestinfo/README.md | 2 ++ .../user-data-providers/vmware-guestinfo/src/main.rs | 6 ++++++ 21 files changed, 60 insertions(+), 7 deletions(-) diff --git a/sources/early-boot-config/user-data-providers/ec2-identity-doc/Cargo.toml b/sources/early-boot-config/user-data-providers/ec2-identity-doc/Cargo.toml index 0f4195fe3bd..65caef016da 100644 --- a/sources/early-boot-config/user-data-providers/ec2-identity-doc/Cargo.toml +++ b/sources/early-boot-config/user-data-providers/ec2-identity-doc/Cargo.toml @@ -5,7 +5,6 @@ authors = ["Zac Mrowicki ", "Sam Berning ", "Sam Berning ", "Sam Berning ", "Sam Berning ", "Sam Berning ", "Sam Berning ", "Sam Berning Date: Wed, 20 Mar 2024 20:58:44 +0000 Subject: [PATCH 39/41] user-data-providers: conditionally compile vmware guestinfo for x86 only Signed-off-by: Sam Berning --- .../vmware-cd-rom/README.md | 2 +- .../vmware-cd-rom/src/lib.rs | 2 +- .../vmware-cd-rom/src/main.rs | 2 +- .../vmware-guestinfo/Cargo.toml | 3 + .../vmware-guestinfo/README.md | 2 +- .../vmware-guestinfo/src/lib.rs | 201 +----------------- .../vmware-guestinfo/src/main.rs | 2 +- .../vmware-guestinfo/src/not_x86_64.rs | 11 + .../vmware-guestinfo/src/x86_64.rs | 192 +++++++++++++++++ 9 files changed, 220 insertions(+), 197 deletions(-) create mode 100644 sources/early-boot-config/user-data-providers/vmware-guestinfo/src/not_x86_64.rs create mode 100644 sources/early-boot-config/user-data-providers/vmware-guestinfo/src/x86_64.rs diff --git a/sources/early-boot-config/user-data-providers/vmware-cd-rom/README.md b/sources/early-boot-config/user-data-providers/vmware-cd-rom/README.md index 73e010eb72a..69b75bd9dde 100644 --- a/sources/early-boot-config/user-data-providers/vmware-cd-rom/README.md +++ b/sources/early-boot-config/user-data-providers/vmware-cd-rom/README.md @@ -4,7 +4,7 @@ Current version: 0.1.0 ## Introduction -User data provider binary that fetches user data provided via CD-ROM to a VMWare VM. +User data provider binary that fetches user data provided via CD-ROM to a VMware VM. ## Colophon diff --git a/sources/early-boot-config/user-data-providers/vmware-cd-rom/src/lib.rs b/sources/early-boot-config/user-data-providers/vmware-cd-rom/src/lib.rs index b945946213a..4bd06056a32 100644 --- a/sources/early-boot-config/user-data-providers/vmware-cd-rom/src/lib.rs +++ b/sources/early-boot-config/user-data-providers/vmware-cd-rom/src/lib.rs @@ -1,4 +1,4 @@ -/// VMWare CD-ROM +/// VMware CD-ROM #[macro_use] extern crate log; diff --git a/sources/early-boot-config/user-data-providers/vmware-cd-rom/src/main.rs b/sources/early-boot-config/user-data-providers/vmware-cd-rom/src/main.rs index 39a4cd6e250..a91792ee755 100644 --- a/sources/early-boot-config/user-data-providers/vmware-cd-rom/src/main.rs +++ b/sources/early-boot-config/user-data-providers/vmware-cd-rom/src/main.rs @@ -1,7 +1,7 @@ /*! # Introduction -User data provider binary that fetches user data provided via CD-ROM to a VMWare VM. +User data provider binary that fetches user data provided via CD-ROM to a VMware VM. */ use early_boot_config_provider::provider::{ diff --git a/sources/early-boot-config/user-data-providers/vmware-guestinfo/Cargo.toml b/sources/early-boot-config/user-data-providers/vmware-guestinfo/Cargo.toml index 63af0210af8..8b88aafc0ca 100644 --- a/sources/early-boot-config/user-data-providers/vmware-guestinfo/Cargo.toml +++ b/sources/early-boot-config/user-data-providers/vmware-guestinfo/Cargo.toml @@ -15,6 +15,9 @@ serde = { version = "1", features = ["derive"] } serde_plain = "1" snafu = "0.8" early-boot-config-provider = { path = "../../early-boot-config-provider", version = "0.1" } + +[target.'cfg(target_arch = "x86_64")'.dependencies] +# vmw_backdoor includes x86_64 assembly, prevent it from building for ARM vmw_backdoor = "0.2" [build-dependencies] diff --git a/sources/early-boot-config/user-data-providers/vmware-guestinfo/README.md b/sources/early-boot-config/user-data-providers/vmware-guestinfo/README.md index 06528524527..2f9fbc974b8 100644 --- a/sources/early-boot-config/user-data-providers/vmware-guestinfo/README.md +++ b/sources/early-boot-config/user-data-providers/vmware-guestinfo/README.md @@ -4,7 +4,7 @@ Current version: 0.1.0 ## Introduction -User data provider binary used to fetch user data provided via VMWare guestinfo. +User data provider binary used to fetch user data provided via VMware guestinfo. ## Colophon diff --git a/sources/early-boot-config/user-data-providers/vmware-guestinfo/src/lib.rs b/sources/early-boot-config/user-data-providers/vmware-guestinfo/src/lib.rs index 9a56d789e14..921eb1eaf73 100644 --- a/sources/early-boot-config/user-data-providers/vmware-guestinfo/src/lib.rs +++ b/sources/early-boot-config/user-data-providers/vmware-guestinfo/src/lib.rs @@ -1,197 +1,14 @@ -/// VMWare guestinfo -#[macro_use] +/// VMware guestinfo extern crate log; -use early_boot_config_provider::provider::UserDataProvider; -use early_boot_config_provider::{compression::OptionalCompressionReader, settings::SettingsJson}; -use serde::Deserialize; -use snafu::{ensure, ResultExt}; -use std::io::{Cursor, Read}; +#[cfg(target_arch = "x86_64")] +mod x86_64; -// The fields in which user data and its encoding are stored in guestinfo -const GUESTINFO_USERDATA: &str = "guestinfo.userdata"; -const GUESTINFO_USERDATA_ENCODING: &str = "guestinfo.userdata.encoding"; +#[cfg(not(target_arch = "x86_64"))] +mod not_x86_64; -pub struct VmwareGuestinfo; +#[cfg(target_arch = "x86_64")] +pub use x86_64::*; -impl VmwareGuestinfo { - /// Fetch the user data's encoding from guestinfo. - // `guestinfo.userdata.encoding` informs us how to handle the data in the - // `guestinfo.userdata` field - fn fetch_encoding() -> Result { - let maybe_encoding = Self::backdoor_get_bytes(GUESTINFO_USERDATA_ENCODING)?; - let user_data_encoding: UserDataEncoding = match maybe_encoding { - Some(val) => { - let encoding_str = String::from_utf8(val).context(error::InvalidUtf8Snafu { - what: GUESTINFO_USERDATA_ENCODING, - })?; - info!("Found user data encoding: {}", encoding_str); - - serde_plain::from_str(&encoding_str).context(error::UnknownEncodingSnafu { - encoding: encoding_str, - })? - } - - // The cloudinit VMware guestinfo data provider assumes any user data without an - // associated encoding means raw data is being passed. We will follow suit here. - None => { - warn!( - "'{}' unset, assuming raw user data", - GUESTINFO_USERDATA_ENCODING - ); - UserDataEncoding::Raw - } - }; - - Ok(user_data_encoding) - } - - /// Request a key's value from guestinfo - fn backdoor_get_bytes(key: &str) -> Result>> { - // Probe and access the VMware backdoor. `kernel lockdown(7)` may block "privileged" - // mode because of its use of `iopl()`; the 5.15 kernels have it disabled regardless - // of lockdown mode. If this fails, fall back to "unprivileged" access without first - // requesting access to the relevant IO ports. KVM and VMware both have them special- - // cased in their emulation to not raise an exception to the guest OS and things - // should work out. - let mut backdoor = vmw_backdoor::probe_backdoor_privileged() - .or_else(|e| { - debug!( - "Unable to access guestinfo via privileged mode, using unprivileged: {}", - e - ); - vmw_backdoor::probe_backdoor() - }) - .context(error::BackdoorSnafu { - op: "probe and acquire access", - })?; - - let mut erpc = backdoor - .open_enhanced_chan() - .context(error::BackdoorSnafu { - op: "open eRPC channel", - })?; - - erpc.get_guestinfo(key.as_bytes()) - .context(error::GuestInfoSnafu { what: key }) - } -} - -impl UserDataProvider for VmwareGuestinfo { - fn user_data( - &self, - ) -> std::result::Result, Box> { - info!("Attempting to retrieve user data via guestinfo interface"); - - // It would be extremely odd to get here and not be on VMware, but check anyway - ensure!(vmw_backdoor::is_vmware_cpu(), error::NotVmwareSnafu); - - let user_data_encoding = Self::fetch_encoding()?; - let user_data_bytes = match Self::backdoor_get_bytes(GUESTINFO_USERDATA)? { - Some(val) => val, - None => return Ok(None), - }; - - let user_data_string = match user_data_encoding { - // gzip+base64 is gzip'ed user data that is base64 encoded - UserDataEncoding::Base64 | UserDataEncoding::GzipBase64 => { - info!("Decoding user data"); - let mut reader = Cursor::new(user_data_bytes); - let decoder = base64::read::DecoderReader::new( - &mut reader, - &base64::engine::general_purpose::STANDARD, - ); - - // Decompresses the data if it is gzip'ed - let mut output = String::new(); - let mut compression_reader = OptionalCompressionReader::new(decoder); - compression_reader.read_to_string(&mut output).context( - error::DecompressionSnafu { - what: "guestinfo user data", - }, - )?; - output - } - - UserDataEncoding::Raw => { - String::from_utf8(user_data_bytes).context(error::InvalidUtf8Snafu { - what: GUESTINFO_USERDATA, - })? - } - }; - - let json = SettingsJson::from_toml_str(user_data_string, "guestinfo") - .context(error::SettingsToJsonSnafu { from: "guestinfo" })?; - Ok(Some(json)) - } -} - -// =^..^= =^..^= =^..^= =^..^= - -// Acceptable user data encodings -// When case-insensitive de/serialization is finalized, that's what we would want to use -// here instead of aliases: https://github.com/serde-rs/serde/pull/1902 -#[derive(Debug, Deserialize)] -enum UserDataEncoding { - #[serde(alias = "b64")] - #[serde(alias = "B64")] - #[serde(alias = "base64")] - Base64, - #[serde(alias = "gz+b64")] - #[serde(alias = "Gz+B64")] - #[serde(alias = "gzip+base64")] - #[serde(alias = "Gzip+Base64")] - GzipBase64, - Raw, -} - -// =^..^= =^..^= =^..^= =^..^= - -mod error { - use snafu::Snafu; - use std::io; - - #[derive(Debug, Snafu)] - #[snafu(visibility(pub(super)))] - pub(crate) enum Error { - #[snafu(display("VMware backdoor: failed to '{}': '{}'", op, source))] - Backdoor { - op: String, - source: vmw_backdoor::VmwError, - }, - - #[snafu(display("Failed to decompress {}: {}", what, source))] - Decompression { what: String, source: io::Error }, - - #[snafu(display("Failed to fetch key '{}' from guestinfo: {}", what, source))] - GuestInfo { - what: String, - source: vmw_backdoor::VmwError, - }, - - #[snafu(display("'{}' contains invalid utf-8: {}", what, source))] - InvalidUtf8 { - what: String, - source: std::string::FromUtf8Error, - }, - - #[snafu(display( - "Unable to read user data from guestinfo, this is not a VMware virtual CPU" - ))] - NotVmware, - - #[snafu(display("Unable to serialize settings from {}: {}", from, source))] - SettingsToJson { - from: String, - source: early_boot_config_provider::settings::Error, - }, - - #[snafu(display("Unknown user data encoding: '{}': {}", encoding, source))] - UnknownEncoding { - encoding: String, - source: serde_plain::Error, - }, - } -} - -type Result = std::result::Result; +#[cfg(not(target_arch = "x86_64"))] +pub use not_x86_64::*; diff --git a/sources/early-boot-config/user-data-providers/vmware-guestinfo/src/main.rs b/sources/early-boot-config/user-data-providers/vmware-guestinfo/src/main.rs index 603534a4b44..5d9136061ac 100644 --- a/sources/early-boot-config/user-data-providers/vmware-guestinfo/src/main.rs +++ b/sources/early-boot-config/user-data-providers/vmware-guestinfo/src/main.rs @@ -1,7 +1,7 @@ /*! # Introduction -User data provider binary used to fetch user data provided via VMWare guestinfo. +User data provider binary used to fetch user data provided via VMware guestinfo. */ use early_boot_config_provider::provider::{ diff --git a/sources/early-boot-config/user-data-providers/vmware-guestinfo/src/not_x86_64.rs b/sources/early-boot-config/user-data-providers/vmware-guestinfo/src/not_x86_64.rs new file mode 100644 index 00000000000..44b3978d65e --- /dev/null +++ b/sources/early-boot-config/user-data-providers/vmware-guestinfo/src/not_x86_64.rs @@ -0,0 +1,11 @@ +use early_boot_config_provider::provider::UserDataProvider; +use early_boot_config_provider::settings::SettingsJson; + +pub struct VmwareGuestinfo; + +impl UserDataProvider for VmwareGuestinfo { + #[allow(dead_code)] + fn user_data(&self) -> std::result::Result, Box> { + unimplemented!() + } +} diff --git a/sources/early-boot-config/user-data-providers/vmware-guestinfo/src/x86_64.rs b/sources/early-boot-config/user-data-providers/vmware-guestinfo/src/x86_64.rs new file mode 100644 index 00000000000..ade8e79df94 --- /dev/null +++ b/sources/early-boot-config/user-data-providers/vmware-guestinfo/src/x86_64.rs @@ -0,0 +1,192 @@ +use early_boot_config_provider::provider::UserDataProvider; +use early_boot_config_provider::{compression::OptionalCompressionReader, settings::SettingsJson}; +use log::*; +use serde::Deserialize; +use snafu::{ensure, ResultExt}; +use std::io::{Cursor, Read}; + +// The fields in which user data and its encoding are stored in guestinfo +const GUESTINFO_USERDATA: &str = "guestinfo.userdata"; +const GUESTINFO_USERDATA_ENCODING: &str = "guestinfo.userdata.encoding"; + +pub struct VmwareGuestinfo; + +impl VmwareGuestinfo { + /// Fetch the user data's encoding from guestinfo. + // `guestinfo.userdata.encoding` informs us how to handle the data in the + // `guestinfo.userdata` field + fn fetch_encoding() -> Result { + let maybe_encoding = Self::backdoor_get_bytes(GUESTINFO_USERDATA_ENCODING)?; + let user_data_encoding: UserDataEncoding = match maybe_encoding { + Some(val) => { + let encoding_str = String::from_utf8(val).context(error::InvalidUtf8Snafu { + what: GUESTINFO_USERDATA_ENCODING, + })?; + info!("Found user data encoding: {}", encoding_str); + + serde_plain::from_str(&encoding_str).context(error::UnknownEncodingSnafu { + encoding: encoding_str, + })? + } + + // The cloudinit VMware guestinfo data provider assumes any user data without an + // associated encoding means raw data is being passed. We will follow suit here. + None => { + warn!( + "'{}' unset, assuming raw user data", + GUESTINFO_USERDATA_ENCODING + ); + UserDataEncoding::Raw + } + }; + + Ok(user_data_encoding) + } + + /// Request a key's value from guestinfo + fn backdoor_get_bytes(key: &str) -> Result>> { + // Probe and access the VMware backdoor. `kernel lockdown(7)` may block "privileged" + // mode because of its use of `iopl()`; the 5.15 kernels have it disabled regardless + // of lockdown mode. If this fails, fall back to "unprivileged" access without first + // requesting access to the relevant IO ports. KVM and VMware both have them special- + // cased in their emulation to not raise an exception to the guest OS and things + // should work out. + let mut backdoor = vmw_backdoor::probe_backdoor_privileged() + .or_else(|e| { + debug!( + "Unable to access guestinfo via privileged mode, using unprivileged: {}", + e + ); + vmw_backdoor::probe_backdoor() + }) + .context(error::BackdoorSnafu { + op: "probe and acquire access", + })?; + + let mut erpc = backdoor + .open_enhanced_chan() + .context(error::BackdoorSnafu { + op: "open eRPC channel", + })?; + + erpc.get_guestinfo(key.as_bytes()) + .context(error::GuestInfoSnafu { what: key }) + } +} + +impl UserDataProvider for VmwareGuestinfo { + fn user_data(&self) -> std::result::Result, Box> { + info!("Attempting to retrieve user data via guestinfo interface"); + + // It would be extremely odd to get here and not be on VMware, but check anyway + ensure!(vmw_backdoor::is_vmware_cpu(), error::NotVmwareSnafu); + + let user_data_encoding = Self::fetch_encoding()?; + let user_data_bytes = match Self::backdoor_get_bytes(GUESTINFO_USERDATA)? { + Some(val) => val, + None => return Ok(None), + }; + + let user_data_string = match user_data_encoding { + // gzip+base64 is gzip'ed user data that is base64 encoded + UserDataEncoding::Base64 | UserDataEncoding::GzipBase64 => { + info!("Decoding user data"); + let mut reader = Cursor::new(user_data_bytes); + let decoder = base64::read::DecoderReader::new( + &mut reader, + &base64::engine::general_purpose::STANDARD, + ); + + // Decompresses the data if it is gzip'ed + let mut output = String::new(); + let mut compression_reader = OptionalCompressionReader::new(decoder); + compression_reader.read_to_string(&mut output).context( + error::DecompressionSnafu { + what: "guestinfo user data", + }, + )?; + output + } + + UserDataEncoding::Raw => { + String::from_utf8(user_data_bytes).context(error::InvalidUtf8Snafu { + what: GUESTINFO_USERDATA, + })? + } + }; + + let json = SettingsJson::from_toml_str(user_data_string, "guestinfo") + .context(error::SettingsToJsonSnafu { from: "guestinfo" })?; + Ok(Some(json)) + } +} + +// =^..^= =^..^= =^..^= =^..^= + +// Acceptable user data encodings +// When case-insensitive de/serialization is finalized, that's what we would want to use +// here instead of aliases: https://github.com/serde-rs/serde/pull/1902 +#[derive(Debug, Deserialize)] +enum UserDataEncoding { + #[serde(alias = "b64")] + #[serde(alias = "B64")] + #[serde(alias = "base64")] + Base64, + #[serde(alias = "gz+b64")] + #[serde(alias = "Gz+B64")] + #[serde(alias = "gzip+base64")] + #[serde(alias = "Gzip+Base64")] + GzipBase64, + Raw, +} + +// =^..^= =^..^= =^..^= =^..^= + +mod error { + use snafu::Snafu; + use std::io; + + #[derive(Debug, Snafu)] + #[snafu(visibility(pub(super)))] + pub(crate) enum Error { + #[snafu(display("VMware backdoor: failed to '{}': '{}'", op, source))] + Backdoor { + op: String, + source: vmw_backdoor::VmwError, + }, + + #[snafu(display("Failed to decompress {}: {}", what, source))] + Decompression { what: String, source: io::Error }, + + #[snafu(display("Failed to fetch key '{}' from guestinfo: {}", what, source))] + GuestInfo { + what: String, + source: vmw_backdoor::VmwError, + }, + + #[snafu(display("'{}' contains invalid utf-8: {}", what, source))] + InvalidUtf8 { + what: String, + source: std::string::FromUtf8Error, + }, + + #[snafu(display( + "Unable to read user data from guestinfo, this is not a VMware virtual CPU" + ))] + NotVmware, + + #[snafu(display("Unable to serialize settings from {}: {}", from, source))] + SettingsToJson { + from: String, + source: early_boot_config_provider::settings::Error, + }, + + #[snafu(display("Unknown user data encoding: '{}': {}", encoding, source))] + UnknownEncoding { + encoding: String, + source: serde_plain::Error, + }, + } +} + +type Result = std::result::Result; From 03ed7fe749a31976d977c661377faa3ff7ecfc0d Mon Sep 17 00:00:00 2001 From: Sam Berning Date: Wed, 20 Mar 2024 20:59:45 +0000 Subject: [PATCH 40/41] early-boot-config: build all providers in parallel Signed-off-by: Sam Berning --- .../early-boot-config/early-boot-config.spec | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/packages/early-boot-config/early-boot-config.spec b/packages/early-boot-config/early-boot-config.spec index ca7b2e0b122..c0b44d16365 100644 --- a/packages/early-boot-config/early-boot-config.spec +++ b/packages/early-boot-config/early-boot-config.spec @@ -53,25 +53,17 @@ Requires: %{_cross_os}early-boot-config-local %build %cargo_build --manifest-path %{_builddir}/sources/Cargo.toml \ - -p early-boot-config - -# build aws user data providers -%cargo_build --manifest-path %{_builddir}/sources/Cargo.toml \ + -p early-boot-config \ -p ec2-identity-doc-user-data-provider \ - -p ec2-imds-user-data-provider - -# build local file user data providers -%cargo_build --manifest-path %{_builddir}/sources/Cargo.toml \ + -p ec2-imds-user-data-provider \ -p local-defaults-user-data-provider \ -p local-file-user-data-provider \ - -p local-overrides-user-data-provider - + -p local-overrides-user-data-provider \ %ifarch x86_64 -# build vmware user data providers -%cargo_build --manifest-path %{_builddir}/sources/Cargo.toml \ -p vmware-cd-rom-user-data-provider \ - -p vmware-guestinfo-user-data-provider + -p vmware-guestinfo-user-data-provider \ %endif + %{nil} %global cargo_outdir %{getenv:HOME}/.cache/%{__cargo_target}/release %global early_boot_config_bindir %{_cross_libexecdir}/early-boot-config/bin From e38f848ebaf0a873a8c7c2b2a2dc4375b6f144dc Mon Sep 17 00:00:00 2001 From: Sam Berning Date: Wed, 20 Mar 2024 21:00:39 +0000 Subject: [PATCH 41/41] early-boot-config: backtick filepath in doc comment Signed-off-by: Sam Berning --- sources/early-boot-config/early-boot-config/README.md | 2 +- .../early-boot-config/early-boot-config/src/main.rs | 10 ++-------- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/sources/early-boot-config/early-boot-config/README.md b/sources/early-boot-config/early-boot-config/README.md index c2313a4812c..f82ddc3392f 100644 --- a/sources/early-boot-config/early-boot-config/README.md +++ b/sources/early-boot-config/early-boot-config/README.md @@ -6,7 +6,7 @@ Current version: 0.1.0 early-boot-config sends user data to the Bottlerocket API. -Variants include their required user data provider binaries via packages. early-boot-config discovers these binaries at runtime in /usr/libexec/early-boot-config/data-providers.d and runs them in order, sending any user data found to the API. +Variants include their required user data provider binaries via packages. early-boot-config discovers these binaries at runtime in `/usr/libexec/early-boot-config/data-providers.d` and runs them in order, sending any user data found to the API. User data provider binaries each implement the ability to obtain user data from a single source. Sources include local files, AWS Instance Metadata Service (IMDS), among others. diff --git a/sources/early-boot-config/early-boot-config/src/main.rs b/sources/early-boot-config/early-boot-config/src/main.rs index 990f52f28cb..42a3520b46d 100644 --- a/sources/early-boot-config/early-boot-config/src/main.rs +++ b/sources/early-boot-config/early-boot-config/src/main.rs @@ -3,7 +3,7 @@ early-boot-config sends user data to the Bottlerocket API. -Variants include their required user data provider binaries via packages. early-boot-config discovers these binaries at runtime in /usr/libexec/early-boot-config/data-providers.d and runs them in order, sending any user data found to the API. +Variants include their required user data provider binaries via packages. early-boot-config discovers these binaries at runtime in `/usr/libexec/early-boot-config/data-providers.d` and runs them in order, sending any user data found to the API. User data provider binaries each implement the ability to obtain user data from a single source. Sources include local files, AWS Instance Metadata Service (IMDS), among others. */ @@ -23,9 +23,6 @@ use std::{env, io, process}; use tokio::process::Command as AsyncCommand; use walkdir::WalkDir; -// TODO -// Tests! - // We only want to run early-boot-config once, at first boot. Our systemd unit file has a // ConditionPathExists that will prevent it from running again if this file exists. // We create it after running successfully. @@ -284,10 +281,7 @@ mod error { Provider { source: Box }, #[snafu(display("Provider '{}' failed: {}", provider.display(), message))] - ProviderFailure { - provider: PathBuf, - message: String, - }, + ProviderFailure { provider: PathBuf, message: String }, #[snafu(display( "Error deserializing provider output as JSON from {}: '{}'",