diff --git a/sources/Cargo.lock b/sources/Cargo.lock index 040334500e5..8bb6b3b20d3 100644 --- a/sources/Cargo.lock +++ b/sources/Cargo.lock @@ -2567,15 +2567,21 @@ dependencies = [ "rand", "serde", "serde_json", + "settings-extension-autoscaling", "settings-extension-aws", + "settings-extension-bootstrap-containers", "settings-extension-cloudformation", "settings-extension-container-registry", + "settings-extension-container-runtime", "settings-extension-dns", "settings-extension-ecs", + "settings-extension-host-containers", "settings-extension-kernel", "settings-extension-metrics", "settings-extension-motd", + "settings-extension-network", "settings-extension-ntp", + "settings-extension-oci-defaults", "settings-extension-oci-hooks", "settings-extension-pki", "settings-extension-updates", @@ -3504,6 +3510,18 @@ dependencies = [ "tokio", ] +[[package]] +name = "settings-extension-autoscaling" +version = "0.1.0" +dependencies = [ + "bottlerocket-settings-sdk", + "env_logger", + "model-derive", + "modeled-types", + "serde", + "serde_json", +] + [[package]] name = "settings-extension-aws" version = "0.1.0" @@ -3516,6 +3534,18 @@ dependencies = [ "serde_json", ] +[[package]] +name = "settings-extension-bootstrap-containers" +version = "0.1.0" +dependencies = [ + "bottlerocket-settings-sdk", + "env_logger", + "model-derive", + "modeled-types", + "serde", + "serde_json", +] + [[package]] name = "settings-extension-cloudformation" version = "0.1.0" @@ -3540,6 +3570,18 @@ dependencies = [ "serde_json", ] +[[package]] +name = "settings-extension-container-runtime" +version = "0.1.0" +dependencies = [ + "bottlerocket-settings-sdk", + "env_logger", + "model-derive", + "modeled-types", + "serde", + "serde_json", +] + [[package]] name = "settings-extension-dns" version = "0.1.0" @@ -3564,6 +3606,18 @@ dependencies = [ "serde_json", ] +[[package]] +name = "settings-extension-host-containers" +version = "0.1.0" +dependencies = [ + "bottlerocket-settings-sdk", + "env_logger", + "model-derive", + "modeled-types", + "serde", + "serde_json", +] + [[package]] name = "settings-extension-kernel" version = "0.1.0" @@ -3598,6 +3652,19 @@ dependencies = [ "string_impls_for", ] +[[package]] +name = "settings-extension-network" +version = "0.1.0" +dependencies = [ + "bottlerocket-settings-sdk", + "env_logger", + "model-derive", + "modeled-types", + "serde", + "serde_json", + "snafu 0.7.5", +] + [[package]] name = "settings-extension-ntp" version = "0.1.0" @@ -3610,6 +3677,19 @@ dependencies = [ "serde_json", ] +[[package]] +name = "settings-extension-oci-defaults" +version = "0.1.0" +dependencies = [ + "bottlerocket-settings-sdk", + "env_logger", + "model-derive", + "modeled-types", + "serde", + "serde_json", + "toml", +] + [[package]] name = "settings-extension-oci-hooks" version = "0.1.0" diff --git a/sources/Cargo.toml b/sources/Cargo.toml index 3c9c709c1ff..14e8980234b 100644 --- a/sources/Cargo.toml +++ b/sources/Cargo.toml @@ -65,15 +65,21 @@ members = [ "models", + "settings-extensions/autoscaling", "settings-extensions/aws", + "settings-extensions/bootstrap-containers", "settings-extensions/cloudformation", "settings-extensions/container-registry", + "settings-extensions/container-runtime", "settings-extensions/dns", "settings-extensions/ecs", + "settings-extensions/host-containers", "settings-extensions/kernel", "settings-extensions/metrics", "settings-extensions/motd", + "settings-extensions/network", "settings-extensions/ntp", + "settings-extensions/oci-defaults", "settings-extensions/oci-hooks", "settings-extensions/pki", "settings-extensions/updates", diff --git a/sources/models/Cargo.toml b/sources/models/Cargo.toml index 72683aaaf53..2e39f365dcf 100644 --- a/sources/models/Cargo.toml +++ b/sources/models/Cargo.toml @@ -18,15 +18,21 @@ serde = { version = "1", features = ["derive"] } toml = "0.8" # settings extensions +settings-extension-autoscaling = { path = "../settings-extensions/autoscaling", version = "0.1" } settings-extension-aws = { path = "../settings-extensions/aws", version = "0.1" } +settings-extension-bootstrap-containers = { path = "../settings-extensions/bootstrap-containers", version = "0.1" } settings-extension-cloudformation = { path = "../settings-extensions/cloudformation", version = "0.1" } settings-extension-container-registry = { path = "../settings-extensions/container-registry", version = "0.1" } +settings-extension-container-runtime = { path = "../settings-extensions/container-runtime", version = "0.1" } settings-extension-dns = { path = "../settings-extensions/dns", version = "0.1" } settings-extension-ecs = { path = "../settings-extensions/ecs", version = "0.1" } +settings-extension-host-containers = { path = "../settings-extensions/host-containers", version = "0.1" } settings-extension-kernel = { path = "../settings-extensions/kernel", version = "0.1" } settings-extension-metrics = { path = "../settings-extensions/metrics", version = "0.1" } settings-extension-motd = { path = "../settings-extensions/motd", version = "0.1" } +settings-extension-network = { path = "../settings-extensions/network", version = "0.1" } settings-extension-ntp = { path = "../settings-extensions/ntp", version = "0.1" } +settings-extension-oci-defaults = { path = "../settings-extensions/oci-defaults", version = "0.1" } settings-extension-oci-hooks = { path = "../settings-extensions/oci-hooks", version = "0.1" } settings-extension-pki = { path = "../settings-extensions/pki", version = "0.1" } settings-extension-updates = { path = "../settings-extensions/updates", version = "0.1" } diff --git a/sources/models/src/aws-dev/mod.rs b/sources/models/src/aws-dev/mod.rs index d9e347d59c6..0bcae66ae5c 100644 --- a/sources/models/src/aws-dev/mod.rs +++ b/sources/models/src/aws-dev/mod.rs @@ -1,8 +1,6 @@ use model_derive::model; -use std::collections::HashMap; -use crate::{BootSettings, BootstrapContainer, HostContainer, NetworkSettings}; -use modeled_types::Identifier; +use crate::BootSettings; // Note: we have to use 'rename' here because the top-level Settings structure is the only one // that uses its name in serialization; internal structures use the field name that points to it @@ -10,10 +8,10 @@ use modeled_types::Identifier; struct Settings { motd: settings_extension_motd::MotdV1, updates: settings_extension_updates::UpdatesSettingsV1, - host_containers: HashMap, - bootstrap_containers: HashMap, + host_containers: settings_extension_host_containers::HostContainersSettingsV1, + bootstrap_containers: settings_extension_bootstrap_containers::BootstrapContainersSettingsV1, ntp: settings_extension_ntp::NtpSettingsV1, - network: NetworkSettings, + network: settings_extension_network::NetworkSettingsV1, kernel: settings_extension_kernel::KernelSettingsV1, boot: BootSettings, aws: settings_extension_aws::AwsSettingsV1, diff --git a/sources/models/src/aws-ecs-1-nvidia/mod.rs b/sources/models/src/aws-ecs-1-nvidia/mod.rs index 1635a56640f..6cdb1fe0abd 100644 --- a/sources/models/src/aws-ecs-1-nvidia/mod.rs +++ b/sources/models/src/aws-ecs-1-nvidia/mod.rs @@ -1,8 +1,4 @@ use model_derive::model; -use std::collections::HashMap; - -use crate::{AutoScalingSettings, BootstrapContainer, HostContainer, NetworkSettings, OciDefaults}; -use modeled_types::Identifier; // Note: we have to use 'rename' here because the top-level Settings structure is the only one // that uses its name in serialization; internal structures use the field name that points to it @@ -10,19 +6,19 @@ use modeled_types::Identifier; struct Settings { motd: settings_extension_motd::MotdV1, updates: settings_extension_updates::UpdatesSettingsV1, - host_containers: HashMap, - bootstrap_containers: HashMap, + host_containers: settings_extension_host_containers::HostContainersSettingsV1, + bootstrap_containers: settings_extension_bootstrap_containers::BootstrapContainersSettingsV1, ntp: settings_extension_ntp::NtpSettingsV1, - network: NetworkSettings, + network: settings_extension_network::NetworkSettingsV1, kernel: settings_extension_kernel::KernelSettingsV1, aws: settings_extension_aws::AwsSettingsV1, ecs: settings_extension_ecs::ECSSettingsV1, metrics: settings_extension_metrics::MetricsSettingsV1, pki: settings_extension_pki::PkiSettingsV1, container_registry: settings_extension_container_registry::RegistrySettingsV1, - oci_defaults: OciDefaults, + oci_defaults: settings_extension_oci_defaults::OciDefaultsV1, oci_hooks: settings_extension_oci_hooks::OciHooksSettingsV1, cloudformation: settings_extension_cloudformation::CloudFormationSettingsV1, - autoscaling: AutoScalingSettings, + autoscaling: settings_extension_autoscaling::AutoScalingSettingsV1, dns: settings_extension_dns::DnsSettingsV1, } diff --git a/sources/models/src/aws-ecs-1/mod.rs b/sources/models/src/aws-ecs-1/mod.rs index 1635a56640f..6cdb1fe0abd 100644 --- a/sources/models/src/aws-ecs-1/mod.rs +++ b/sources/models/src/aws-ecs-1/mod.rs @@ -1,8 +1,4 @@ use model_derive::model; -use std::collections::HashMap; - -use crate::{AutoScalingSettings, BootstrapContainer, HostContainer, NetworkSettings, OciDefaults}; -use modeled_types::Identifier; // Note: we have to use 'rename' here because the top-level Settings structure is the only one // that uses its name in serialization; internal structures use the field name that points to it @@ -10,19 +6,19 @@ use modeled_types::Identifier; struct Settings { motd: settings_extension_motd::MotdV1, updates: settings_extension_updates::UpdatesSettingsV1, - host_containers: HashMap, - bootstrap_containers: HashMap, + host_containers: settings_extension_host_containers::HostContainersSettingsV1, + bootstrap_containers: settings_extension_bootstrap_containers::BootstrapContainersSettingsV1, ntp: settings_extension_ntp::NtpSettingsV1, - network: NetworkSettings, + network: settings_extension_network::NetworkSettingsV1, kernel: settings_extension_kernel::KernelSettingsV1, aws: settings_extension_aws::AwsSettingsV1, ecs: settings_extension_ecs::ECSSettingsV1, metrics: settings_extension_metrics::MetricsSettingsV1, pki: settings_extension_pki::PkiSettingsV1, container_registry: settings_extension_container_registry::RegistrySettingsV1, - oci_defaults: OciDefaults, + oci_defaults: settings_extension_oci_defaults::OciDefaultsV1, oci_hooks: settings_extension_oci_hooks::OciHooksSettingsV1, cloudformation: settings_extension_cloudformation::CloudFormationSettingsV1, - autoscaling: AutoScalingSettings, + autoscaling: settings_extension_autoscaling::AutoScalingSettingsV1, dns: settings_extension_dns::DnsSettingsV1, } diff --git a/sources/models/src/aws-ecs-2-nvidia/mod.rs b/sources/models/src/aws-ecs-2-nvidia/mod.rs index 6d41cb1ecb2..01277416c0f 100644 --- a/sources/models/src/aws-ecs-2-nvidia/mod.rs +++ b/sources/models/src/aws-ecs-2-nvidia/mod.rs @@ -1,11 +1,6 @@ use model_derive::model; -use std::collections::HashMap; -use crate::{ - AutoScalingSettings, BootSettings, BootstrapContainer, HostContainer, NetworkSettings, - OciDefaults, -}; -use modeled_types::Identifier; +use crate::BootSettings; // Note: we have to use 'rename' here because the top-level Settings structure is the only one // that uses its name in serialization; internal structures use the field name that points to it @@ -13,10 +8,10 @@ use modeled_types::Identifier; struct Settings { motd: settings_extension_motd::MotdV1, updates: settings_extension_updates::UpdatesSettingsV1, - host_containers: HashMap, - bootstrap_containers: HashMap, + host_containers: settings_extension_host_containers::HostContainersSettingsV1, + bootstrap_containers: settings_extension_bootstrap_containers::BootstrapContainersSettingsV1, ntp: settings_extension_ntp::NtpSettingsV1, - network: NetworkSettings, + network: settings_extension_network::NetworkSettingsV1, kernel: settings_extension_kernel::KernelSettingsV1, boot: BootSettings, aws: settings_extension_aws::AwsSettingsV1, @@ -24,9 +19,9 @@ struct Settings { metrics: settings_extension_metrics::MetricsSettingsV1, pki: settings_extension_pki::PkiSettingsV1, container_registry: settings_extension_container_registry::RegistrySettingsV1, - oci_defaults: OciDefaults, + oci_defaults: settings_extension_oci_defaults::OciDefaultsV1, oci_hooks: settings_extension_oci_hooks::OciHooksSettingsV1, cloudformation: settings_extension_cloudformation::CloudFormationSettingsV1, - autoscaling: AutoScalingSettings, + autoscaling: settings_extension_autoscaling::AutoScalingSettingsV1, dns: settings_extension_dns::DnsSettingsV1, } diff --git a/sources/models/src/aws-ecs-2/mod.rs b/sources/models/src/aws-ecs-2/mod.rs index 6d41cb1ecb2..01277416c0f 100644 --- a/sources/models/src/aws-ecs-2/mod.rs +++ b/sources/models/src/aws-ecs-2/mod.rs @@ -1,11 +1,6 @@ use model_derive::model; -use std::collections::HashMap; -use crate::{ - AutoScalingSettings, BootSettings, BootstrapContainer, HostContainer, NetworkSettings, - OciDefaults, -}; -use modeled_types::Identifier; +use crate::BootSettings; // Note: we have to use 'rename' here because the top-level Settings structure is the only one // that uses its name in serialization; internal structures use the field name that points to it @@ -13,10 +8,10 @@ use modeled_types::Identifier; struct Settings { motd: settings_extension_motd::MotdV1, updates: settings_extension_updates::UpdatesSettingsV1, - host_containers: HashMap, - bootstrap_containers: HashMap, + host_containers: settings_extension_host_containers::HostContainersSettingsV1, + bootstrap_containers: settings_extension_bootstrap_containers::BootstrapContainersSettingsV1, ntp: settings_extension_ntp::NtpSettingsV1, - network: NetworkSettings, + network: settings_extension_network::NetworkSettingsV1, kernel: settings_extension_kernel::KernelSettingsV1, boot: BootSettings, aws: settings_extension_aws::AwsSettingsV1, @@ -24,9 +19,9 @@ struct Settings { metrics: settings_extension_metrics::MetricsSettingsV1, pki: settings_extension_pki::PkiSettingsV1, container_registry: settings_extension_container_registry::RegistrySettingsV1, - oci_defaults: OciDefaults, + oci_defaults: settings_extension_oci_defaults::OciDefaultsV1, oci_hooks: settings_extension_oci_hooks::OciHooksSettingsV1, cloudformation: settings_extension_cloudformation::CloudFormationSettingsV1, - autoscaling: AutoScalingSettings, + autoscaling: settings_extension_autoscaling::AutoScalingSettingsV1, dns: settings_extension_dns::DnsSettingsV1, } diff --git a/sources/models/src/aws-k8s-1.24-nvidia/mod.rs b/sources/models/src/aws-k8s-1.24-nvidia/mod.rs index d9b37c90764..473c050171d 100644 --- a/sources/models/src/aws-k8s-1.24-nvidia/mod.rs +++ b/sources/models/src/aws-k8s-1.24-nvidia/mod.rs @@ -1,11 +1,6 @@ -use crate::{ - AutoScalingSettings, BootSettings, BootstrapContainer, ContainerRuntimeSettings, HostContainer, - KubernetesSettings, NetworkSettings, OciDefaults, -}; -use modeled_types::Identifier; +use crate::{BootSettings, KubernetesSettings}; use model_derive::model; -use std::collections::HashMap; // Note: we have to use 'rename' here because the top-level Settings structure is the only one // that uses its name in serialization; internal structures use the field name that points to it @@ -14,20 +9,20 @@ struct Settings { motd: settings_extension_motd::MotdV1, kubernetes: KubernetesSettings, updates: settings_extension_updates::UpdatesSettingsV1, - host_containers: HashMap, - bootstrap_containers: HashMap, + host_containers: settings_extension_host_containers::HostContainersSettingsV1, + bootstrap_containers: settings_extension_bootstrap_containers::BootstrapContainersSettingsV1, ntp: settings_extension_ntp::NtpSettingsV1, - network: NetworkSettings, + network: settings_extension_network::NetworkSettingsV1, kernel: settings_extension_kernel::KernelSettingsV1, boot: BootSettings, aws: settings_extension_aws::AwsSettingsV1, metrics: settings_extension_metrics::MetricsSettingsV1, pki: settings_extension_pki::PkiSettingsV1, container_registry: settings_extension_container_registry::RegistrySettingsV1, - oci_defaults: OciDefaults, + oci_defaults: settings_extension_oci_defaults::OciDefaultsV1, oci_hooks: settings_extension_oci_hooks::OciHooksSettingsV1, cloudformation: settings_extension_cloudformation::CloudFormationSettingsV1, dns: settings_extension_dns::DnsSettingsV1, - container_runtime: ContainerRuntimeSettings, - autoscaling: AutoScalingSettings, + container_runtime: settings_extension_container_runtime::ContainerRuntimeSettingsV1, + autoscaling: settings_extension_autoscaling::AutoScalingSettingsV1, } diff --git a/sources/models/src/aws-k8s-1.24/mod.rs b/sources/models/src/aws-k8s-1.24/mod.rs index d9b37c90764..473c050171d 100644 --- a/sources/models/src/aws-k8s-1.24/mod.rs +++ b/sources/models/src/aws-k8s-1.24/mod.rs @@ -1,11 +1,6 @@ -use crate::{ - AutoScalingSettings, BootSettings, BootstrapContainer, ContainerRuntimeSettings, HostContainer, - KubernetesSettings, NetworkSettings, OciDefaults, -}; -use modeled_types::Identifier; +use crate::{BootSettings, KubernetesSettings}; use model_derive::model; -use std::collections::HashMap; // Note: we have to use 'rename' here because the top-level Settings structure is the only one // that uses its name in serialization; internal structures use the field name that points to it @@ -14,20 +9,20 @@ struct Settings { motd: settings_extension_motd::MotdV1, kubernetes: KubernetesSettings, updates: settings_extension_updates::UpdatesSettingsV1, - host_containers: HashMap, - bootstrap_containers: HashMap, + host_containers: settings_extension_host_containers::HostContainersSettingsV1, + bootstrap_containers: settings_extension_bootstrap_containers::BootstrapContainersSettingsV1, ntp: settings_extension_ntp::NtpSettingsV1, - network: NetworkSettings, + network: settings_extension_network::NetworkSettingsV1, kernel: settings_extension_kernel::KernelSettingsV1, boot: BootSettings, aws: settings_extension_aws::AwsSettingsV1, metrics: settings_extension_metrics::MetricsSettingsV1, pki: settings_extension_pki::PkiSettingsV1, container_registry: settings_extension_container_registry::RegistrySettingsV1, - oci_defaults: OciDefaults, + oci_defaults: settings_extension_oci_defaults::OciDefaultsV1, oci_hooks: settings_extension_oci_hooks::OciHooksSettingsV1, cloudformation: settings_extension_cloudformation::CloudFormationSettingsV1, dns: settings_extension_dns::DnsSettingsV1, - container_runtime: ContainerRuntimeSettings, - autoscaling: AutoScalingSettings, + container_runtime: settings_extension_container_runtime::ContainerRuntimeSettingsV1, + autoscaling: settings_extension_autoscaling::AutoScalingSettingsV1, } diff --git a/sources/models/src/aws-k8s-1.25-nvidia/mod.rs b/sources/models/src/aws-k8s-1.25-nvidia/mod.rs index d9b37c90764..473c050171d 100644 --- a/sources/models/src/aws-k8s-1.25-nvidia/mod.rs +++ b/sources/models/src/aws-k8s-1.25-nvidia/mod.rs @@ -1,11 +1,6 @@ -use crate::{ - AutoScalingSettings, BootSettings, BootstrapContainer, ContainerRuntimeSettings, HostContainer, - KubernetesSettings, NetworkSettings, OciDefaults, -}; -use modeled_types::Identifier; +use crate::{BootSettings, KubernetesSettings}; use model_derive::model; -use std::collections::HashMap; // Note: we have to use 'rename' here because the top-level Settings structure is the only one // that uses its name in serialization; internal structures use the field name that points to it @@ -14,20 +9,20 @@ struct Settings { motd: settings_extension_motd::MotdV1, kubernetes: KubernetesSettings, updates: settings_extension_updates::UpdatesSettingsV1, - host_containers: HashMap, - bootstrap_containers: HashMap, + host_containers: settings_extension_host_containers::HostContainersSettingsV1, + bootstrap_containers: settings_extension_bootstrap_containers::BootstrapContainersSettingsV1, ntp: settings_extension_ntp::NtpSettingsV1, - network: NetworkSettings, + network: settings_extension_network::NetworkSettingsV1, kernel: settings_extension_kernel::KernelSettingsV1, boot: BootSettings, aws: settings_extension_aws::AwsSettingsV1, metrics: settings_extension_metrics::MetricsSettingsV1, pki: settings_extension_pki::PkiSettingsV1, container_registry: settings_extension_container_registry::RegistrySettingsV1, - oci_defaults: OciDefaults, + oci_defaults: settings_extension_oci_defaults::OciDefaultsV1, oci_hooks: settings_extension_oci_hooks::OciHooksSettingsV1, cloudformation: settings_extension_cloudformation::CloudFormationSettingsV1, dns: settings_extension_dns::DnsSettingsV1, - container_runtime: ContainerRuntimeSettings, - autoscaling: AutoScalingSettings, + container_runtime: settings_extension_container_runtime::ContainerRuntimeSettingsV1, + autoscaling: settings_extension_autoscaling::AutoScalingSettingsV1, } diff --git a/sources/models/src/aws-k8s-1.25/mod.rs b/sources/models/src/aws-k8s-1.25/mod.rs index d9b37c90764..473c050171d 100644 --- a/sources/models/src/aws-k8s-1.25/mod.rs +++ b/sources/models/src/aws-k8s-1.25/mod.rs @@ -1,11 +1,6 @@ -use crate::{ - AutoScalingSettings, BootSettings, BootstrapContainer, ContainerRuntimeSettings, HostContainer, - KubernetesSettings, NetworkSettings, OciDefaults, -}; -use modeled_types::Identifier; +use crate::{BootSettings, KubernetesSettings}; use model_derive::model; -use std::collections::HashMap; // Note: we have to use 'rename' here because the top-level Settings structure is the only one // that uses its name in serialization; internal structures use the field name that points to it @@ -14,20 +9,20 @@ struct Settings { motd: settings_extension_motd::MotdV1, kubernetes: KubernetesSettings, updates: settings_extension_updates::UpdatesSettingsV1, - host_containers: HashMap, - bootstrap_containers: HashMap, + host_containers: settings_extension_host_containers::HostContainersSettingsV1, + bootstrap_containers: settings_extension_bootstrap_containers::BootstrapContainersSettingsV1, ntp: settings_extension_ntp::NtpSettingsV1, - network: NetworkSettings, + network: settings_extension_network::NetworkSettingsV1, kernel: settings_extension_kernel::KernelSettingsV1, boot: BootSettings, aws: settings_extension_aws::AwsSettingsV1, metrics: settings_extension_metrics::MetricsSettingsV1, pki: settings_extension_pki::PkiSettingsV1, container_registry: settings_extension_container_registry::RegistrySettingsV1, - oci_defaults: OciDefaults, + oci_defaults: settings_extension_oci_defaults::OciDefaultsV1, oci_hooks: settings_extension_oci_hooks::OciHooksSettingsV1, cloudformation: settings_extension_cloudformation::CloudFormationSettingsV1, dns: settings_extension_dns::DnsSettingsV1, - container_runtime: ContainerRuntimeSettings, - autoscaling: AutoScalingSettings, + container_runtime: settings_extension_container_runtime::ContainerRuntimeSettingsV1, + autoscaling: settings_extension_autoscaling::AutoScalingSettingsV1, } diff --git a/sources/models/src/aws-k8s-1.26-nvidia/mod.rs b/sources/models/src/aws-k8s-1.26-nvidia/mod.rs index d9b37c90764..473c050171d 100644 --- a/sources/models/src/aws-k8s-1.26-nvidia/mod.rs +++ b/sources/models/src/aws-k8s-1.26-nvidia/mod.rs @@ -1,11 +1,6 @@ -use crate::{ - AutoScalingSettings, BootSettings, BootstrapContainer, ContainerRuntimeSettings, HostContainer, - KubernetesSettings, NetworkSettings, OciDefaults, -}; -use modeled_types::Identifier; +use crate::{BootSettings, KubernetesSettings}; use model_derive::model; -use std::collections::HashMap; // Note: we have to use 'rename' here because the top-level Settings structure is the only one // that uses its name in serialization; internal structures use the field name that points to it @@ -14,20 +9,20 @@ struct Settings { motd: settings_extension_motd::MotdV1, kubernetes: KubernetesSettings, updates: settings_extension_updates::UpdatesSettingsV1, - host_containers: HashMap, - bootstrap_containers: HashMap, + host_containers: settings_extension_host_containers::HostContainersSettingsV1, + bootstrap_containers: settings_extension_bootstrap_containers::BootstrapContainersSettingsV1, ntp: settings_extension_ntp::NtpSettingsV1, - network: NetworkSettings, + network: settings_extension_network::NetworkSettingsV1, kernel: settings_extension_kernel::KernelSettingsV1, boot: BootSettings, aws: settings_extension_aws::AwsSettingsV1, metrics: settings_extension_metrics::MetricsSettingsV1, pki: settings_extension_pki::PkiSettingsV1, container_registry: settings_extension_container_registry::RegistrySettingsV1, - oci_defaults: OciDefaults, + oci_defaults: settings_extension_oci_defaults::OciDefaultsV1, oci_hooks: settings_extension_oci_hooks::OciHooksSettingsV1, cloudformation: settings_extension_cloudformation::CloudFormationSettingsV1, dns: settings_extension_dns::DnsSettingsV1, - container_runtime: ContainerRuntimeSettings, - autoscaling: AutoScalingSettings, + container_runtime: settings_extension_container_runtime::ContainerRuntimeSettingsV1, + autoscaling: settings_extension_autoscaling::AutoScalingSettingsV1, } diff --git a/sources/models/src/aws-k8s-1.26/mod.rs b/sources/models/src/aws-k8s-1.26/mod.rs index d9b37c90764..473c050171d 100644 --- a/sources/models/src/aws-k8s-1.26/mod.rs +++ b/sources/models/src/aws-k8s-1.26/mod.rs @@ -1,11 +1,6 @@ -use crate::{ - AutoScalingSettings, BootSettings, BootstrapContainer, ContainerRuntimeSettings, HostContainer, - KubernetesSettings, NetworkSettings, OciDefaults, -}; -use modeled_types::Identifier; +use crate::{BootSettings, KubernetesSettings}; use model_derive::model; -use std::collections::HashMap; // Note: we have to use 'rename' here because the top-level Settings structure is the only one // that uses its name in serialization; internal structures use the field name that points to it @@ -14,20 +9,20 @@ struct Settings { motd: settings_extension_motd::MotdV1, kubernetes: KubernetesSettings, updates: settings_extension_updates::UpdatesSettingsV1, - host_containers: HashMap, - bootstrap_containers: HashMap, + host_containers: settings_extension_host_containers::HostContainersSettingsV1, + bootstrap_containers: settings_extension_bootstrap_containers::BootstrapContainersSettingsV1, ntp: settings_extension_ntp::NtpSettingsV1, - network: NetworkSettings, + network: settings_extension_network::NetworkSettingsV1, kernel: settings_extension_kernel::KernelSettingsV1, boot: BootSettings, aws: settings_extension_aws::AwsSettingsV1, metrics: settings_extension_metrics::MetricsSettingsV1, pki: settings_extension_pki::PkiSettingsV1, container_registry: settings_extension_container_registry::RegistrySettingsV1, - oci_defaults: OciDefaults, + oci_defaults: settings_extension_oci_defaults::OciDefaultsV1, oci_hooks: settings_extension_oci_hooks::OciHooksSettingsV1, cloudformation: settings_extension_cloudformation::CloudFormationSettingsV1, dns: settings_extension_dns::DnsSettingsV1, - container_runtime: ContainerRuntimeSettings, - autoscaling: AutoScalingSettings, + container_runtime: settings_extension_container_runtime::ContainerRuntimeSettingsV1, + autoscaling: settings_extension_autoscaling::AutoScalingSettingsV1, } diff --git a/sources/models/src/aws-k8s-1.30-nvidia/mod.rs b/sources/models/src/aws-k8s-1.30-nvidia/mod.rs index d9b37c90764..473c050171d 100644 --- a/sources/models/src/aws-k8s-1.30-nvidia/mod.rs +++ b/sources/models/src/aws-k8s-1.30-nvidia/mod.rs @@ -1,11 +1,6 @@ -use crate::{ - AutoScalingSettings, BootSettings, BootstrapContainer, ContainerRuntimeSettings, HostContainer, - KubernetesSettings, NetworkSettings, OciDefaults, -}; -use modeled_types::Identifier; +use crate::{BootSettings, KubernetesSettings}; use model_derive::model; -use std::collections::HashMap; // Note: we have to use 'rename' here because the top-level Settings structure is the only one // that uses its name in serialization; internal structures use the field name that points to it @@ -14,20 +9,20 @@ struct Settings { motd: settings_extension_motd::MotdV1, kubernetes: KubernetesSettings, updates: settings_extension_updates::UpdatesSettingsV1, - host_containers: HashMap, - bootstrap_containers: HashMap, + host_containers: settings_extension_host_containers::HostContainersSettingsV1, + bootstrap_containers: settings_extension_bootstrap_containers::BootstrapContainersSettingsV1, ntp: settings_extension_ntp::NtpSettingsV1, - network: NetworkSettings, + network: settings_extension_network::NetworkSettingsV1, kernel: settings_extension_kernel::KernelSettingsV1, boot: BootSettings, aws: settings_extension_aws::AwsSettingsV1, metrics: settings_extension_metrics::MetricsSettingsV1, pki: settings_extension_pki::PkiSettingsV1, container_registry: settings_extension_container_registry::RegistrySettingsV1, - oci_defaults: OciDefaults, + oci_defaults: settings_extension_oci_defaults::OciDefaultsV1, oci_hooks: settings_extension_oci_hooks::OciHooksSettingsV1, cloudformation: settings_extension_cloudformation::CloudFormationSettingsV1, dns: settings_extension_dns::DnsSettingsV1, - container_runtime: ContainerRuntimeSettings, - autoscaling: AutoScalingSettings, + container_runtime: settings_extension_container_runtime::ContainerRuntimeSettingsV1, + autoscaling: settings_extension_autoscaling::AutoScalingSettingsV1, } diff --git a/sources/models/src/aws-k8s-1.30/mod.rs b/sources/models/src/aws-k8s-1.30/mod.rs index d9b37c90764..473c050171d 100644 --- a/sources/models/src/aws-k8s-1.30/mod.rs +++ b/sources/models/src/aws-k8s-1.30/mod.rs @@ -1,11 +1,6 @@ -use crate::{ - AutoScalingSettings, BootSettings, BootstrapContainer, ContainerRuntimeSettings, HostContainer, - KubernetesSettings, NetworkSettings, OciDefaults, -}; -use modeled_types::Identifier; +use crate::{BootSettings, KubernetesSettings}; use model_derive::model; -use std::collections::HashMap; // Note: we have to use 'rename' here because the top-level Settings structure is the only one // that uses its name in serialization; internal structures use the field name that points to it @@ -14,20 +9,20 @@ struct Settings { motd: settings_extension_motd::MotdV1, kubernetes: KubernetesSettings, updates: settings_extension_updates::UpdatesSettingsV1, - host_containers: HashMap, - bootstrap_containers: HashMap, + host_containers: settings_extension_host_containers::HostContainersSettingsV1, + bootstrap_containers: settings_extension_bootstrap_containers::BootstrapContainersSettingsV1, ntp: settings_extension_ntp::NtpSettingsV1, - network: NetworkSettings, + network: settings_extension_network::NetworkSettingsV1, kernel: settings_extension_kernel::KernelSettingsV1, boot: BootSettings, aws: settings_extension_aws::AwsSettingsV1, metrics: settings_extension_metrics::MetricsSettingsV1, pki: settings_extension_pki::PkiSettingsV1, container_registry: settings_extension_container_registry::RegistrySettingsV1, - oci_defaults: OciDefaults, + oci_defaults: settings_extension_oci_defaults::OciDefaultsV1, oci_hooks: settings_extension_oci_hooks::OciHooksSettingsV1, cloudformation: settings_extension_cloudformation::CloudFormationSettingsV1, dns: settings_extension_dns::DnsSettingsV1, - container_runtime: ContainerRuntimeSettings, - autoscaling: AutoScalingSettings, + container_runtime: settings_extension_container_runtime::ContainerRuntimeSettingsV1, + autoscaling: settings_extension_autoscaling::AutoScalingSettingsV1, } diff --git a/sources/models/src/metal-dev/mod.rs b/sources/models/src/metal-dev/mod.rs index 56dab248e57..6e56dc820da 100644 --- a/sources/models/src/metal-dev/mod.rs +++ b/sources/models/src/metal-dev/mod.rs @@ -1,8 +1,6 @@ use model_derive::model; -use std::collections::HashMap; -use crate::{BootSettings, BootstrapContainer, HostContainer, NetworkSettings}; -use modeled_types::Identifier; +use crate::BootSettings; // Note: we have to use 'rename' here because the top-level Settings structure is the only one // that uses its name in serialization; internal structures use the field name that points to it @@ -10,10 +8,10 @@ use modeled_types::Identifier; struct Settings { motd: settings_extension_motd::MotdV1, updates: settings_extension_updates::UpdatesSettingsV1, - host_containers: HashMap, - bootstrap_containers: HashMap, + host_containers: settings_extension_host_containers::HostContainersSettingsV1, + bootstrap_containers: settings_extension_bootstrap_containers::BootstrapContainersSettingsV1, ntp: settings_extension_ntp::NtpSettingsV1, - network: NetworkSettings, + network: settings_extension_network::NetworkSettingsV1, kernel: settings_extension_kernel::KernelSettingsV1, boot: BootSettings, metrics: settings_extension_metrics::MetricsSettingsV1, diff --git a/sources/models/src/metal-k8s-1.29/mod.rs b/sources/models/src/metal-k8s-1.29/mod.rs index 2aa169a638b..161224cb2c8 100644 --- a/sources/models/src/metal-k8s-1.29/mod.rs +++ b/sources/models/src/metal-k8s-1.29/mod.rs @@ -1,11 +1,6 @@ use model_derive::model; -use std::collections::HashMap; -use crate::{ - BootSettings, BootstrapContainer, ContainerRuntimeSettings, HostContainer, KubernetesSettings, - NetworkSettings, OciDefaults, -}; -use modeled_types::Identifier; +use crate::{BootSettings, KubernetesSettings}; // Note: we have to use 'rename' here because the top-level Settings structure is the only one // that uses its name in serialization; internal structures use the field name that points to it @@ -14,18 +9,18 @@ struct Settings { motd: settings_extension_motd::MotdV1, kubernetes: KubernetesSettings, updates: settings_extension_updates::UpdatesSettingsV1, - host_containers: HashMap, - bootstrap_containers: HashMap, + host_containers: settings_extension_host_containers::HostContainersSettingsV1, + bootstrap_containers: settings_extension_bootstrap_containers::BootstrapContainersSettingsV1, ntp: settings_extension_ntp::NtpSettingsV1, - network: NetworkSettings, + network: settings_extension_network::NetworkSettingsV1, kernel: settings_extension_kernel::KernelSettingsV1, boot: BootSettings, aws: settings_extension_aws::AwsSettingsV1, metrics: settings_extension_metrics::MetricsSettingsV1, pki: settings_extension_pki::PkiSettingsV1, container_registry: settings_extension_container_registry::RegistrySettingsV1, - oci_defaults: OciDefaults, + oci_defaults: settings_extension_oci_defaults::OciDefaultsV1, oci_hooks: settings_extension_oci_hooks::OciHooksSettingsV1, dns: settings_extension_dns::DnsSettingsV1, - container_runtime: ContainerRuntimeSettings, + container_runtime: settings_extension_container_runtime::ContainerRuntimeSettingsV1, } diff --git a/sources/models/src/vmware-dev/mod.rs b/sources/models/src/vmware-dev/mod.rs index 56dab248e57..6e56dc820da 100644 --- a/sources/models/src/vmware-dev/mod.rs +++ b/sources/models/src/vmware-dev/mod.rs @@ -1,8 +1,6 @@ use model_derive::model; -use std::collections::HashMap; -use crate::{BootSettings, BootstrapContainer, HostContainer, NetworkSettings}; -use modeled_types::Identifier; +use crate::BootSettings; // Note: we have to use 'rename' here because the top-level Settings structure is the only one // that uses its name in serialization; internal structures use the field name that points to it @@ -10,10 +8,10 @@ use modeled_types::Identifier; struct Settings { motd: settings_extension_motd::MotdV1, updates: settings_extension_updates::UpdatesSettingsV1, - host_containers: HashMap, - bootstrap_containers: HashMap, + host_containers: settings_extension_host_containers::HostContainersSettingsV1, + bootstrap_containers: settings_extension_bootstrap_containers::BootstrapContainersSettingsV1, ntp: settings_extension_ntp::NtpSettingsV1, - network: NetworkSettings, + network: settings_extension_network::NetworkSettingsV1, kernel: settings_extension_kernel::KernelSettingsV1, boot: BootSettings, metrics: settings_extension_metrics::MetricsSettingsV1, diff --git a/sources/models/src/vmware-k8s-1.30/mod.rs b/sources/models/src/vmware-k8s-1.30/mod.rs index 25b7dc85d5d..fd071915fe0 100644 --- a/sources/models/src/vmware-k8s-1.30/mod.rs +++ b/sources/models/src/vmware-k8s-1.30/mod.rs @@ -1,11 +1,6 @@ use model_derive::model; -use std::collections::HashMap; -use crate::{ - BootSettings, BootstrapContainer, ContainerRuntimeSettings, HostContainer, KubernetesSettings, - NetworkSettings, OciDefaults, -}; -use modeled_types::Identifier; +use crate::{BootSettings, KubernetesSettings}; // Note: we have to use 'rename' here because the top-level Settings structure is the only one // that uses its name in serialization; internal structures use the field name that points to it @@ -14,18 +9,18 @@ struct Settings { motd: settings_extension_motd::MotdV1, kubernetes: KubernetesSettings, updates: settings_extension_updates::UpdatesSettingsV1, - host_containers: HashMap, - bootstrap_containers: HashMap, + host_containers: settings_extension_host_containers::HostContainersSettingsV1, + bootstrap_containers: settings_extension_bootstrap_containers::BootstrapContainersSettingsV1, ntp: settings_extension_ntp::NtpSettingsV1, - network: NetworkSettings, + network: settings_extension_network::NetworkSettingsV1, kernel: settings_extension_kernel::KernelSettingsV1, aws: settings_extension_aws::AwsSettingsV1, boot: BootSettings, metrics: settings_extension_metrics::MetricsSettingsV1, pki: settings_extension_pki::PkiSettingsV1, container_registry: settings_extension_container_registry::RegistrySettingsV1, - oci_defaults: OciDefaults, + oci_defaults: settings_extension_oci_defaults::OciDefaultsV1, oci_hooks: settings_extension_oci_hooks::OciHooksSettingsV1, dns: settings_extension_dns::DnsSettingsV1, - container_runtime: ContainerRuntimeSettings, + container_runtime: settings_extension_container_runtime::ContainerRuntimeSettingsV1, } diff --git a/sources/settings-extensions/autoscaling/Cargo.toml b/sources/settings-extensions/autoscaling/Cargo.toml new file mode 100644 index 00000000000..7d5cbc8a56c --- /dev/null +++ b/sources/settings-extensions/autoscaling/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "settings-extension-autoscaling" +version = "0.1.0" +authors = ["Gaurav Sharma "] +license = "Apache-2.0 OR MIT" +edition = "2021" +publish = false + +[dependencies] +env_logger = "0.10" +modeled-types = { path = "../../models/modeled-types", version = "0.1" } +model-derive = { path = "../../models/model-derive", version = "0.1" } +serde = { version = "1", features = ["derive"] } +serde_json = "1" + +[dependencies.bottlerocket-settings-sdk] +git = "https://github.com/bottlerocket-os/bottlerocket-settings-sdk" +tag = "bottlerocket-settings-sdk-v0.1.0-alpha.2" +version = "0.1.0-alpha" diff --git a/sources/settings-extensions/autoscaling/autoscaling.toml b/sources/settings-extensions/autoscaling/autoscaling.toml new file mode 100644 index 00000000000..727dfb274cd --- /dev/null +++ b/sources/settings-extensions/autoscaling/autoscaling.toml @@ -0,0 +1,13 @@ +[extension] +supported-versions = [ + "v1" +] +default-version = "v1" + +[v1] +[v1.validation.cross-validates] + +[v1.templating] +helpers = [] + +[v1.generation.requires] diff --git a/sources/settings-extensions/autoscaling/src/lib.rs b/sources/settings-extensions/autoscaling/src/lib.rs new file mode 100644 index 00000000000..e1f8c390c25 --- /dev/null +++ b/sources/settings-extensions/autoscaling/src/lib.rs @@ -0,0 +1,68 @@ +/// Settings related to auto scaling groups. +use bottlerocket_settings_sdk::{GenerateResult, SettingsModel}; +use model_derive::model; +use std::convert::Infallible; + +#[model(impl_default = true)] +pub struct AutoScalingSettingsV1 { + should_wait: bool, +} + +type Result = std::result::Result; + +impl SettingsModel for AutoScalingSettingsV1 { + type PartialKind = Self; + type ErrorKind = Infallible; + + fn get_version() -> &'static str { + "v1" + } + + fn set(_current_value: Option, _target: Self) -> Result<()> { + // Set anything that can be parsed as AutoScalingSettingsV1. + Ok(()) + } + + fn generate( + existing_partial: Option, + _dependent_settings: Option, + ) -> Result> { + Ok(GenerateResult::Complete( + existing_partial.unwrap_or_default(), + )) + } + + fn validate(_value: Self, _validated_settings: Option) -> Result<()> { + // AutoScalingSettingsV1 is validated during deserialization. + Ok(()) + } +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn test_generate_autoscaling() { + assert_eq!( + AutoScalingSettingsV1::generate(None, None).unwrap(), + GenerateResult::Complete(AutoScalingSettingsV1 { should_wait: None }) + ) + } + + #[test] + fn test_serde_autoscaling() { + let test_json = r#"{"should-wait":true}"#; + + let autoscaling: AutoScalingSettingsV1 = serde_json::from_str(test_json).unwrap(); + assert_eq!( + autoscaling, + AutoScalingSettingsV1 { + should_wait: Some(true), + } + ); + + let results = serde_json::to_string(&autoscaling).unwrap(); + assert_eq!(results, test_json); + } +} diff --git a/sources/settings-extensions/autoscaling/src/main.rs b/sources/settings-extensions/autoscaling/src/main.rs new file mode 100644 index 00000000000..9c11c03a40f --- /dev/null +++ b/sources/settings-extensions/autoscaling/src/main.rs @@ -0,0 +1,18 @@ +use bottlerocket_settings_sdk::{BottlerocketSetting, NullMigratorExtensionBuilder}; +use settings_extension_autoscaling::AutoScalingSettingsV1; +use std::process::ExitCode; + +fn main() -> ExitCode { + env_logger::init(); + + match NullMigratorExtensionBuilder::with_name("autoscaling") + .with_models(vec![BottlerocketSetting::::model()]) + .build() + { + Ok(extension) => extension.run(), + Err(e) => { + println!("{}", e); + ExitCode::FAILURE + } + } +} diff --git a/sources/settings-extensions/bootstrap-containers/Cargo.toml b/sources/settings-extensions/bootstrap-containers/Cargo.toml new file mode 100644 index 00000000000..7b311a42396 --- /dev/null +++ b/sources/settings-extensions/bootstrap-containers/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "settings-extension-bootstrap-containers" +version = "0.1.0" +authors = ["Gaurav Sharma "] +license = "Apache-2.0 OR MIT" +edition = "2021" +publish = false + +[dependencies] +env_logger = "0.10" +modeled-types = { path = "../../models/modeled-types", version = "0.1" } +model-derive = { path = "../../models/model-derive", version = "0.1" } +serde = { version = "1", features = ["derive"] } +serde_json = "1" + +[dependencies.bottlerocket-settings-sdk] +git = "https://github.com/bottlerocket-os/bottlerocket-settings-sdk" +tag = "bottlerocket-settings-sdk-v0.1.0-alpha.2" +version = "0.1.0-alpha" diff --git a/sources/settings-extensions/bootstrap-containers/bootstrap-containers.toml b/sources/settings-extensions/bootstrap-containers/bootstrap-containers.toml new file mode 100644 index 00000000000..727dfb274cd --- /dev/null +++ b/sources/settings-extensions/bootstrap-containers/bootstrap-containers.toml @@ -0,0 +1,13 @@ +[extension] +supported-versions = [ + "v1" +] +default-version = "v1" + +[v1] +[v1.validation.cross-validates] + +[v1.templating] +helpers = [] + +[v1.generation.requires] diff --git a/sources/settings-extensions/bootstrap-containers/src/lib.rs b/sources/settings-extensions/bootstrap-containers/src/lib.rs new file mode 100644 index 00000000000..cfe7614fdc1 --- /dev/null +++ b/sources/settings-extensions/bootstrap-containers/src/lib.rs @@ -0,0 +1,137 @@ +/// Settings related to bootstrap containers. +use bottlerocket_settings_sdk::{GenerateResult, SettingsModel}; +use model_derive::model; +use modeled_types::{BootstrapContainerMode, Identifier, Url, ValidBase64}; +use serde::{Deserialize, Deserializer, Serialize, Serializer}; +use std::{collections::HashMap, convert::Infallible}; + +#[derive(Debug, Default, PartialEq)] +pub struct BootstrapContainersSettingsV1 { + pub bootstrap_containers: HashMap, +} + +// Custom serializer/deserializer added to maintain backwards +// compatibility with models created prior to settings extensions. +impl Serialize for BootstrapContainersSettingsV1 { + fn serialize(&self, serializer: S) -> std::result::Result + where + S: Serializer, + { + self.bootstrap_containers.serialize(serializer) + } +} + +impl<'de> Deserialize<'de> for BootstrapContainersSettingsV1 { + fn deserialize(deserializer: D) -> std::result::Result + where + D: Deserializer<'de>, + { + let bootstrap_containers = HashMap::deserialize(deserializer)?; + Ok(Self { + bootstrap_containers, + }) + } +} + +#[model(impl_default = true)] +struct BootstrapContainer { + source: Url, + mode: BootstrapContainerMode, + user_data: ValidBase64, + essential: bool, +} + +type Result = std::result::Result; + +impl SettingsModel for BootstrapContainersSettingsV1 { + type PartialKind = Self; + type ErrorKind = Infallible; + + fn get_version() -> &'static str { + "v1" + } + + fn set(_current_value: Option, _target: Self) -> Result<()> { + // Set anything that parses as BootstrapContainersSettingsV1. + Ok(()) + } + + fn generate( + existing_partial: Option, + _dependent_settings: Option, + ) -> Result> { + Ok(GenerateResult::Complete( + existing_partial.unwrap_or_default(), + )) + } + + fn validate(_value: Self, _validated_settings: Option) -> Result<()> { + // Validate anything that parses as BootstrapContainersSettingsV1. + Ok(()) + } +} + +#[cfg(test)] +mod test { + use super::*; + use serde_json::json; + + #[test] + fn test_generate_bootstrap_container_settings() { + let generated = BootstrapContainersSettingsV1::generate(None, None).unwrap(); + + assert_eq!( + generated, + GenerateResult::Complete(BootstrapContainersSettingsV1 { + bootstrap_containers: HashMap::new(), + }) + ) + } + + #[test] + fn test_serde_bootstrap_container() { + let test_json = json!({ + "mybootstrap": { + "source": "uri.to.container.in.oci-compatible-registry.example.com/foo:1.0.0", + "mode": "once", + "user-data": "dXNlcmRhdGE=", + "essential": true, + } + }); + + let test_json_str = test_json.to_string(); + + let bootstrap_containers: BootstrapContainersSettingsV1 = + serde_json::from_str(&test_json_str).unwrap(); + + let mut expected_bootstrap_container: HashMap = + HashMap::new(); + expected_bootstrap_container.insert( + Identifier::try_from("mybootstrap").unwrap(), + BootstrapContainer { + source: Some( + Url::try_from( + "uri.to.container.in.oci-compatible-registry.example.com/foo:1.0.0", + ) + .unwrap(), + ), + mode: Some(BootstrapContainerMode::try_from("once").unwrap()), + user_data: Some(ValidBase64::try_from("dXNlcmRhdGE=").unwrap()), + essential: Some(true), + }, + ); + + assert_eq!( + bootstrap_containers, + BootstrapContainersSettingsV1 { + bootstrap_containers: expected_bootstrap_container + } + ); + + let serialized_json: serde_json::Value = serde_json::to_string(&bootstrap_containers) + .map(|s| serde_json::from_str(&s).unwrap()) + .unwrap(); + + assert_eq!(serialized_json, test_json); + } +} diff --git a/sources/settings-extensions/bootstrap-containers/src/main.rs b/sources/settings-extensions/bootstrap-containers/src/main.rs new file mode 100644 index 00000000000..a85c55128b4 --- /dev/null +++ b/sources/settings-extensions/bootstrap-containers/src/main.rs @@ -0,0 +1,20 @@ +use bottlerocket_settings_sdk::{BottlerocketSetting, NullMigratorExtensionBuilder}; +use settings_extension_bootstrap_containers::BootstrapContainersSettingsV1; +use std::process::ExitCode; + +fn main() -> ExitCode { + env_logger::init(); + + match NullMigratorExtensionBuilder::with_name("bootstrap-containers") + .with_models(vec![ + BottlerocketSetting::::model(), + ]) + .build() + { + Ok(extension) => extension.run(), + Err(e) => { + println!("{}", e); + ExitCode::FAILURE + } + } +} diff --git a/sources/settings-extensions/container-runtime/Cargo.toml b/sources/settings-extensions/container-runtime/Cargo.toml new file mode 100644 index 00000000000..73bac22a353 --- /dev/null +++ b/sources/settings-extensions/container-runtime/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "settings-extension-container-runtime" +version = "0.1.0" +authors = ["Gaurav Sharma "] +license = "Apache-2.0 OR MIT" +edition = "2021" +publish = false + +[dependencies] +env_logger = "0.10" +modeled-types = { path = "../../models/modeled-types", version = "0.1" } +model-derive = { path = "../../models/model-derive", version = "0.1" } +serde = { version = "1", features = ["derive"] } +serde_json = "1" + +[dependencies.bottlerocket-settings-sdk] +git = "https://github.com/bottlerocket-os/bottlerocket-settings-sdk" +tag = "bottlerocket-settings-sdk-v0.1.0-alpha.2" +version = "0.1.0-alpha" diff --git a/sources/settings-extensions/container-runtime/container-runtime.toml b/sources/settings-extensions/container-runtime/container-runtime.toml new file mode 100644 index 00000000000..727dfb274cd --- /dev/null +++ b/sources/settings-extensions/container-runtime/container-runtime.toml @@ -0,0 +1,13 @@ +[extension] +supported-versions = [ + "v1" +] +default-version = "v1" + +[v1] +[v1.validation.cross-validates] + +[v1.templating] +helpers = [] + +[v1.generation.requires] diff --git a/sources/settings-extensions/container-runtime/src/lib.rs b/sources/settings-extensions/container-runtime/src/lib.rs new file mode 100644 index 00000000000..d47ec522de1 --- /dev/null +++ b/sources/settings-extensions/container-runtime/src/lib.rs @@ -0,0 +1,92 @@ +///Settings related to Container Runtime +use bottlerocket_settings_sdk::{GenerateResult, SettingsModel}; +use model_derive::model; +use std::convert::Infallible; + +#[model(impl_default = true)] +pub struct ContainerRuntimeSettingsV1 { + max_container_log_line_size: i32, + max_concurrent_downloads: i32, + enable_unprivileged_ports: bool, + enable_unprivileged_icmp: bool, +} + +type Result = std::result::Result; + +impl SettingsModel for ContainerRuntimeSettingsV1 { + type PartialKind = Self; + type ErrorKind = Infallible; + + fn get_version() -> &'static str { + "v1" + } + + fn set(_current_value: Option, _target: Self) -> Result<()> { + // Set anything that can be parsed as ContainerRuntimeSettingsV1. + Ok(()) + } + + fn generate( + existing_partial: Option, + _dependent_settings: Option, + ) -> Result> { + Ok(GenerateResult::Complete( + existing_partial.unwrap_or_default(), + )) + } + + fn validate(_value: Self, _validated_settings: Option) -> Result<()> { + // ContainerRuntimeSettingsV1 is validated during deserialization. + Ok(()) + } +} + +#[cfg(test)] +mod test { + use super::*; + use serde_json::json; + + #[test] + fn test_generate_container_runtime_settings() { + assert_eq!( + ContainerRuntimeSettingsV1::generate(None, None), + Ok(GenerateResult::Complete(ContainerRuntimeSettingsV1 { + max_container_log_line_size: None, + max_concurrent_downloads: None, + enable_unprivileged_ports: None, + enable_unprivileged_icmp: None, + })) + ) + } + + #[test] + fn test_serde_container_runtime() { + let test_json = json!({ + "max-container-log-line-size": 1024, + "max-concurrent-downloads": 5, + "enable-unprivileged-ports": true, + "enable-unprivileged-icmp": false + }); + + let test_json_str = test_json.to_string(); + + let container_runtime_settings: ContainerRuntimeSettingsV1 = + serde_json::from_str(&test_json_str).unwrap(); + + assert_eq!( + container_runtime_settings, + ContainerRuntimeSettingsV1 { + max_container_log_line_size: Some(1024), + max_concurrent_downloads: Some(5), + enable_unprivileged_ports: Some(true), + enable_unprivileged_icmp: Some(false), + } + ); + + let serialized_json: serde_json::Value = serde_json::to_string(&container_runtime_settings) + .map(|s| serde_json::from_str(&s).unwrap()) + .unwrap(); + + assert_eq!(serialized_json, test_json); + } +} diff --git a/sources/settings-extensions/container-runtime/src/main.rs b/sources/settings-extensions/container-runtime/src/main.rs new file mode 100644 index 00000000000..0a1b034a26e --- /dev/null +++ b/sources/settings-extensions/container-runtime/src/main.rs @@ -0,0 +1,20 @@ +use bottlerocket_settings_sdk::{BottlerocketSetting, NullMigratorExtensionBuilder}; +use settings_extension_container_runtime::ContainerRuntimeSettingsV1; +use std::process::ExitCode; + +fn main() -> ExitCode { + env_logger::init(); + + match NullMigratorExtensionBuilder::with_name("container-runtime") + .with_models(vec![ + BottlerocketSetting::::model(), + ]) + .build() + { + Ok(extension) => extension.run(), + Err(e) => { + println!("{}", e); + ExitCode::FAILURE + } + } +} diff --git a/sources/settings-extensions/host-containers/Cargo.toml b/sources/settings-extensions/host-containers/Cargo.toml new file mode 100644 index 00000000000..2b03d013286 --- /dev/null +++ b/sources/settings-extensions/host-containers/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "settings-extension-host-containers" +version = "0.1.0" +authors = ["Gaurav Sharma "] +edition = "2021" +license = "Apache-2.0 OR MIT" +publish = false + +[dependencies] +env_logger = "0.10" +modeled-types = { path = "../../models/modeled-types", version = "0.1" } +model-derive = { path = "../../models/model-derive", version = "0.1" } +serde = { version = "1", features = ["derive"] } +serde_json = "1" + +[dependencies.bottlerocket-settings-sdk] +git = "https://github.com/bottlerocket-os/bottlerocket-settings-sdk" +tag = "bottlerocket-settings-sdk-v0.1.0-alpha.2" +version = "0.1.0-alpha" diff --git a/sources/settings-extensions/host-containers/host-containers.toml b/sources/settings-extensions/host-containers/host-containers.toml new file mode 100644 index 00000000000..727dfb274cd --- /dev/null +++ b/sources/settings-extensions/host-containers/host-containers.toml @@ -0,0 +1,13 @@ +[extension] +supported-versions = [ + "v1" +] +default-version = "v1" + +[v1] +[v1.validation.cross-validates] + +[v1.templating] +helpers = [] + +[v1.generation.requires] diff --git a/sources/settings-extensions/host-containers/src/lib.rs b/sources/settings-extensions/host-containers/src/lib.rs new file mode 100644 index 00000000000..b52b9b340f3 --- /dev/null +++ b/sources/settings-extensions/host-containers/src/lib.rs @@ -0,0 +1,120 @@ +/// host-containers settings allow users to configure multiple host containers +use bottlerocket_settings_sdk::{GenerateResult, SettingsModel}; +use model_derive::model; +use modeled_types::{Identifier, Url, ValidBase64}; +use serde::{Deserialize, Deserializer, Serialize, Serializer}; +use std::collections::HashMap; +use std::convert::Infallible; + +#[derive(Debug, Default, PartialEq)] +pub struct HostContainersSettingsV1 { + pub host_containers: HashMap, +} + +// Custom serializer/deserializer added to maintain backwards +// compatibility with models created prior to settings extensions. +impl Serialize for HostContainersSettingsV1 { + fn serialize(&self, serializer: S) -> std::result::Result + where + S: Serializer, + { + self.host_containers.serialize(serializer) + } +} + +impl<'de> Deserialize<'de> for HostContainersSettingsV1 { + fn deserialize(deserializer: D) -> std::result::Result + where + D: Deserializer<'de>, + { + let host_containers = HashMap::deserialize(deserializer)?; + Ok(Self { host_containers }) + } +} + +#[model(impl_default = true)] +struct HostContainer { + source: Url, + enabled: bool, + superpowered: bool, + user_data: ValidBase64, +} + +type Result = std::result::Result; + +impl SettingsModel for HostContainersSettingsV1 { + type PartialKind = Self; + type ErrorKind = Infallible; + + fn get_version() -> &'static str { + "v1" + } + + fn set(_current_value: Option, _target: Self) -> Result<()> { + // Set anything that can be parsed as HostContainersSettingsV1. + Ok(()) + } + + fn generate( + existing_partial: Option, + _dependent_settings: Option, + ) -> Result> { + Ok(GenerateResult::Complete( + existing_partial.unwrap_or_default(), + )) + } + + fn validate(_value: Self, _validated_settings: Option) -> Result<()> { + // HostContainersSettingsV1 is validated during deserialization. + Ok(()) + } +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn test_generate_host_containers() { + let generated = HostContainersSettingsV1::generate(None, None).unwrap(); + + assert_eq!( + generated, + GenerateResult::Complete(HostContainersSettingsV1 { + host_containers: HashMap::new(), + }) + ) + } + + #[test] + fn test_serde_host_containers() { + let input_json = r#"{ + "foo": { + "source": "public.ecr.aws/example/example", + "enabled": true, + "superpowered": true, + "user-data": "Zm9vCg==" + } + }"#; + + let host_containers: HostContainersSettingsV1 = serde_json::from_str(input_json).unwrap(); + + let mut expected_host_containers: HashMap = HashMap::new(); + expected_host_containers.insert( + Identifier::try_from("foo").unwrap(), + HostContainer { + source: Some(Url::try_from("public.ecr.aws/example/example").unwrap()), + enabled: Some(true), + superpowered: Some(true), + user_data: Some(ValidBase64::try_from("Zm9vCg==").unwrap()), + }, + ); + + assert_eq!( + host_containers, + HostContainersSettingsV1 { + host_containers: expected_host_containers, + } + ); + } +} diff --git a/sources/settings-extensions/host-containers/src/main.rs b/sources/settings-extensions/host-containers/src/main.rs new file mode 100644 index 00000000000..e008c520552 --- /dev/null +++ b/sources/settings-extensions/host-containers/src/main.rs @@ -0,0 +1,20 @@ +use bottlerocket_settings_sdk::{BottlerocketSetting, NullMigratorExtensionBuilder}; +use settings_extension_host_containers::HostContainersSettingsV1; +use std::process::ExitCode; + +fn main() -> ExitCode { + env_logger::init(); + + match NullMigratorExtensionBuilder::with_name("host-containers") + .with_models(vec![ + BottlerocketSetting::::model(), + ]) + .build() + { + Ok(extension) => extension.run(), + Err(e) => { + println!("{}", e); + ExitCode::FAILURE + } + } +} diff --git a/sources/settings-extensions/network/Cargo.toml b/sources/settings-extensions/network/Cargo.toml new file mode 100644 index 00000000000..1c4ae62aef3 --- /dev/null +++ b/sources/settings-extensions/network/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "settings-extension-network" +version = "0.1.0" +authors = ["Gaurav Sharma "] +license = "Apache-2.0 OR MIT" +edition = "2021" +publish = false + +[dependencies] +env_logger = "0.10" +modeled-types = { path = "../../models/modeled-types", version = "0.1" } +model-derive = { path = "../../models/model-derive", version = "0.1" } +serde = { version = "1", features = ["derive"] } +serde_json = "1" +snafu = "0.7" + +[dependencies.bottlerocket-settings-sdk] +git = "https://github.com/bottlerocket-os/bottlerocket-settings-sdk" +tag = "bottlerocket-settings-sdk-v0.1.0-alpha.2" +version = "0.1.0-alpha" diff --git a/sources/settings-extensions/network/network.toml b/sources/settings-extensions/network/network.toml new file mode 100644 index 00000000000..727dfb274cd --- /dev/null +++ b/sources/settings-extensions/network/network.toml @@ -0,0 +1,13 @@ +[extension] +supported-versions = [ + "v1" +] +default-version = "v1" + +[v1] +[v1.validation.cross-validates] + +[v1.templating] +helpers = [] + +[v1.generation.requires] diff --git a/sources/settings-extensions/network/src/lib.rs b/sources/settings-extensions/network/src/lib.rs new file mode 100644 index 00000000000..1fc84df06f1 --- /dev/null +++ b/sources/settings-extensions/network/src/lib.rs @@ -0,0 +1,86 @@ +/// Settings related to networking configuration. +use bottlerocket_settings_sdk::{GenerateResult, SettingsModel}; +use model_derive::model; +use modeled_types::{EtcHostsEntries, SingleLineString, Url, ValidLinuxHostname}; +use std::convert::Infallible; + +#[model(impl_default = true)] +struct NetworkSettingsV1 { + hostname: ValidLinuxHostname, + hosts: EtcHostsEntries, + https_proxy: Url, + no_proxy: Vec, +} + +type Result = std::result::Result; + +impl SettingsModel for NetworkSettingsV1 { + type PartialKind = Self; + type ErrorKind = Infallible; + + fn get_version() -> &'static str { + "v1" + } + + fn set(_current_value: Option, _target: Self) -> Result<()> { + // Set anything that can be parsed as NetworkSettingsV1. + Ok(()) + } + + fn generate( + existing_partial: Option, + _dependent_settings: Option, + ) -> Result> { + Ok(GenerateResult::Complete( + existing_partial.unwrap_or_default(), + )) + } + + fn validate(_value: Self, _validated_settings: Option) -> Result<()> { + // NetworkSettingsV1 is validated during deserialization. + Ok(()) + } +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn test_generate_network_settings() { + assert_eq!( + NetworkSettingsV1::generate(None, None), + Ok(GenerateResult::Complete(NetworkSettingsV1 { + hostname: None, + hosts: None, + https_proxy: None, + no_proxy: None, + })) + ) + } + + #[test] + fn test_serde_network() { + let test_json = r#"{ + "hostname": "foo", + "hosts": [["127.0.0.1", ["localhost"]]], + "https-proxy": "https://example.net", + "no-proxy": ["foo"] + }"#; + + let network: NetworkSettingsV1 = serde_json::from_str(test_json).unwrap(); + + assert_eq!( + network, + NetworkSettingsV1 { + hostname: Some(ValidLinuxHostname::try_from("foo").unwrap()), + hosts: Some( + serde_json::from_str::(r#"[["127.0.0.1", ["localhost"]]]"#) + .unwrap() + ), + https_proxy: Some(Url::try_from("https://example.net").unwrap()), + no_proxy: Some(vec![SingleLineString::try_from("foo").unwrap()]), + } + ); + } +} diff --git a/sources/settings-extensions/network/src/main.rs b/sources/settings-extensions/network/src/main.rs new file mode 100644 index 00000000000..dce11d62d5b --- /dev/null +++ b/sources/settings-extensions/network/src/main.rs @@ -0,0 +1,18 @@ +use bottlerocket_settings_sdk::{BottlerocketSetting, NullMigratorExtensionBuilder}; +use settings_extension_network::NetworkSettingsV1; +use std::process::ExitCode; + +fn main() -> ExitCode { + env_logger::init(); + + match NullMigratorExtensionBuilder::with_name("network") + .with_models(vec![BottlerocketSetting::::model()]) + .build() + { + Ok(extension) => extension.run(), + Err(e) => { + println!("{}", e); + ExitCode::FAILURE + } + } +} diff --git a/sources/settings-extensions/oci-defaults/Cargo.toml b/sources/settings-extensions/oci-defaults/Cargo.toml new file mode 100644 index 00000000000..9324f4efceb --- /dev/null +++ b/sources/settings-extensions/oci-defaults/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "settings-extension-oci-defaults" +version = "0.1.0" +authors = ["Gaurav Sharma "] +license = "Apache-2.0 OR MIT" +edition = "2021" +publish = false + +[dependencies] +env_logger = "0.10" +modeled-types = { path = "../../models/modeled-types", version = "0.1" } +model-derive = { path = "../../models/model-derive", version = "0.1" } +serde = { version = "1", features = ["derive"] } +serde_json = "1" +toml = "0.8" + +[dependencies.bottlerocket-settings-sdk] +git = "https://github.com/bottlerocket-os/bottlerocket-settings-sdk" +tag = "bottlerocket-settings-sdk-v0.1.0-alpha.2" +version = "0.1.0-alpha" diff --git a/sources/settings-extensions/oci-defaults/oci-defaults.toml b/sources/settings-extensions/oci-defaults/oci-defaults.toml new file mode 100644 index 00000000000..727dfb274cd --- /dev/null +++ b/sources/settings-extensions/oci-defaults/oci-defaults.toml @@ -0,0 +1,13 @@ +[extension] +supported-versions = [ + "v1" +] +default-version = "v1" + +[v1] +[v1.validation.cross-validates] + +[v1.templating] +helpers = [] + +[v1.generation.requires] diff --git a/sources/settings-extensions/oci-defaults/src/de.rs b/sources/settings-extensions/oci-defaults/src/de.rs new file mode 100644 index 00000000000..7d4ec1c3ffb --- /dev/null +++ b/sources/settings-extensions/oci-defaults/src/de.rs @@ -0,0 +1,126 @@ +use serde::de::Error; +use serde::{Deserialize, Deserializer}; + +/// This specifies that any non negative i64 integer, -1, and "unlimited" +/// are the valid resource-limits. The hard-limit set to "unlimited" or -1 +/// and soft-limit set to "unlimited" or -1 are converted to u64::MAX in +/// the spec file for the container runtime which ultimately represents +/// unlimited for that resource +pub(crate) fn deserialize_limit<'de, D>(deserializer: D) -> Result +where + D: Deserializer<'de>, +{ + #[derive(Deserialize)] + #[serde(untagged)] + enum StringOrInt64 { + String(String), + Int(i64), + } + + match StringOrInt64::deserialize(deserializer)? { + StringOrInt64::String(s) => { + if s == "unlimited" { + Ok(-1) + } else { + Err(Error::custom(format!( + "Invalid rlimit {}, expected -1 to {} or \"unlimited\"", + s, + i64::MAX + ))) + } + } + StringOrInt64::Int(i) => { + if (-1..=i64::MAX).contains(&i) { + Ok(i) + } else { + Err(Error::custom(format!( + "Invalid rlimit {}, expected -1 to {} or \"unlimited\"", + i, + i64::MAX + ))) + } + } + } +} + +#[cfg(test)] +mod oci_default_resource_limit_tests { + use crate::OciDefaultsResourceLimitV1; + + #[test] + fn valid_any_integer_i_64() { + assert!(toml::from_str::( + r#" + hard-limit = 200000 + soft-limit = 10000 + "# + ) + .is_ok()); + } + + #[test] + fn valid_string_unlimited() { + assert!(toml::from_str::( + r#" + hard-limit = 'unlimited' + soft-limit = 10000 + "# + ) + .is_ok()); + } + + #[test] + fn valid_integer_i_64_max() { + assert!(toml::from_str::( + r#" + hard-limit = 9223372036854775807 + soft-limit = 10000 + "# + ) + .is_ok()); + } + + #[test] + fn valid_integer_minus_one() { + assert!(toml::from_str::( + r#" + hard-limit = -1 + soft-limit = 10000 + "# + ) + .is_ok()); + } + + #[test] + fn invalid_integer_greater_than_i_64_max() { + assert!(toml::from_str::( + r#" + hard-limit = 9223372036854775808 + soft-limit = 10000 + "# + ) + .is_err()); + } + + #[test] + fn invalid_minus_2() { + assert!(toml::from_str::( + r#" + hard-limit = -2 + soft-limit = 10000 + "# + ) + .is_err()); + } + + #[test] + fn invalid_string_abc() { + assert!(toml::from_str::( + r#" + hard-limit = 'abc' + soft-limit = 10000 + "# + ) + .is_err()); + } +} diff --git a/sources/settings-extensions/oci-defaults/src/lib.rs b/sources/settings-extensions/oci-defaults/src/lib.rs new file mode 100644 index 00000000000..2240b0cc4f7 --- /dev/null +++ b/sources/settings-extensions/oci-defaults/src/lib.rs @@ -0,0 +1,122 @@ +/// Settings related to orchestrated containers for overriding the OCI runtime spec defaults +mod de; + +use crate::de::deserialize_limit; +use bottlerocket_settings_sdk::{GenerateResult, SettingsModel}; +use model_derive::model; +use modeled_types::{OciDefaultsCapability, OciDefaultsResourceLimitType}; +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; +use std::convert::Infallible; + +///// OCI defaults specifies the default values that will be used in cri-base-json. +#[model(impl_default = true)] +struct OciDefaultsV1 { + capabilities: HashMap, + resource_limits: HashMap, +} + +///// The hard and soft limit values for an OCI defaults resource limit. +#[model(add_option = false)] +#[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, Ord, PartialOrd, PartialEq)] +struct OciDefaultsResourceLimitV1 { + #[serde(deserialize_with = "deserialize_limit")] + hard_limit: i64, + #[serde(deserialize_with = "deserialize_limit")] + soft_limit: i64, +} + +type Result = std::result::Result; + +impl SettingsModel for OciDefaultsV1 { + type PartialKind = Self; + type ErrorKind = Infallible; + + fn get_version() -> &'static str { + "v1" + } + + fn set(_current_value: Option, _target: Self) -> Result<()> { + // Set anything that can be parsed as OciDefaultsV1. + Ok(()) + } + + fn generate( + existing_partial: Option, + _dependent_settings: Option, + ) -> Result> { + Ok(GenerateResult::Complete( + existing_partial.unwrap_or_default(), + )) + } + + fn validate(_value: Self, _validated_settings: Option) -> Result<()> { + // OciDefaultsV1 is validated during deserialization. + Ok(()) + } +} + +#[cfg(test)] +mod test { + use super::*; + use serde_json::json; + use std::collections::HashMap; + + #[test] + fn test_generate_oci_defaults() { + assert_eq!( + OciDefaultsV1::generate(None, None), + Ok(GenerateResult::Complete(OciDefaultsV1 { + capabilities: None, + resource_limits: None, + })) + ) + } + + #[test] + fn test_serde_oci_defaults() { + let test_json = json!({ + "capabilities": { + "sys-admin": true, + "net-admin": false + }, + "resource-limits": { + "max-cpu-time": { + "hard-limit": 1000, + "soft-limit": 500 + } + } + }); + + let test_json_str = test_json.to_string(); + + let oci_defaults: OciDefaultsV1 = serde_json::from_str(&test_json_str).unwrap(); + + let mut expected_capabilities = HashMap::new(); + expected_capabilities.insert(OciDefaultsCapability::SysAdmin, true); + expected_capabilities.insert(OciDefaultsCapability::NetAdmin, false); + + let mut expected_resource_limits = HashMap::new(); + expected_resource_limits.insert( + OciDefaultsResourceLimitType::MaxCpuTime, + OciDefaultsResourceLimitV1 { + hard_limit: 1000, + soft_limit: 500, + }, + ); + + assert_eq!( + oci_defaults, + OciDefaultsV1 { + capabilities: Some(expected_capabilities), + resource_limits: Some(expected_resource_limits), + } + ); + + let serialized_json: serde_json::Value = serde_json::to_string(&oci_defaults) + .map(|s| serde_json::from_str(&s).unwrap()) + .unwrap(); + + assert_eq!(serialized_json, test_json); + } +} diff --git a/sources/settings-extensions/oci-defaults/src/main.rs b/sources/settings-extensions/oci-defaults/src/main.rs new file mode 100644 index 00000000000..f75ee51705c --- /dev/null +++ b/sources/settings-extensions/oci-defaults/src/main.rs @@ -0,0 +1,18 @@ +use bottlerocket_settings_sdk::{BottlerocketSetting, NullMigratorExtensionBuilder}; +use settings_extension_oci_defaults::OciDefaultsV1; +use std::process::ExitCode; + +fn main() -> ExitCode { + env_logger::init(); + + match NullMigratorExtensionBuilder::with_name("oci-defaults") + .with_models(vec![BottlerocketSetting::::model()]) + .build() + { + Ok(extension) => extension.run(), + Err(e) => { + println!("{}", e); + ExitCode::FAILURE + } + } +}