Skip to content

Commit 6d3b177

Browse files
committed
refactor: switch to EnvVarSet
1 parent c647423 commit 6d3b177

3 files changed

Lines changed: 54 additions & 39 deletions

File tree

rust/operator-binary/src/controller.rs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ use stackable_operator::{
5555
compute_conditions, operations::ClusterOperationsConditionBuilder,
5656
statefulset::StatefulSetConditionBuilder,
5757
},
58+
v2::builder::pod::container::EnvVarSet,
5859
};
5960
use strum::{EnumDiscriminants, IntoStaticStr};
6061

@@ -584,7 +585,7 @@ fn build_rolegroup_statefulset(
584585
trino_role: &TrinoRole,
585586
resolved_product_image: &ResolvedProductImage,
586587
role_group_ref: &RoleGroupRef<v1alpha1::TrinoCluster>,
587-
env_overrides: &BTreeMap<String, String>,
588+
env_overrides: &EnvVarSet,
588589
merged_config: &v1alpha1::TrinoConfig,
589590
trino_authentication_config: &TrinoAuthenticationConfig,
590591
catalogs: &[CatalogConfig],
@@ -668,11 +669,7 @@ fn build_rolegroup_statefulset(
668669
});
669670

670671
// Finally add the user defined envOverrides properties.
671-
env.extend(env_overrides.iter().map(|(k, v)| EnvVar {
672-
name: k.clone(),
673-
value: Some(v.clone()),
674-
..EnvVar::default()
675-
}));
672+
env.extend(env_overrides.clone());
676673

677674
let requested_secret_lifetime = merged_config
678675
.requested_secret_lifetime
@@ -1323,6 +1320,7 @@ mod tests {
13231320
cli::OperatorEnvironmentOptions, commons::networking::DomainName,
13241321
k8s_openapi::api::core::v1::ConfigMap, kube::runtime::reflector::ObjectRef,
13251322
role_utils::RoleGroupRef, utils::cluster_info::KubernetesClusterInfo,
1323+
v2::builder::pod::container::EnvVarName,
13261324
};
13271325

13281326
use super::*;
@@ -1646,7 +1644,10 @@ mod tests {
16461644

16471645
let env =
16481646
&validated_cluster.role_group_configs[&TrinoRole::Coordinator]["default"].env_overrides;
1649-
let value = |name: &str| env.get(name).cloned();
1647+
let value = |name: &str| {
1648+
env.get(&EnvVarName::from_str_unsafe(name))
1649+
.and_then(|env_var| env_var.value.clone())
1650+
};
16501651
assert_eq!(value("COMMON_VAR").as_deref(), Some("group-value"));
16511652
assert_eq!(value("GROUP_VAR").as_deref(), Some("group-value"));
16521653
assert_eq!(value("ROLE_VAR").as_deref(), Some("role-value"));

rust/operator-binary/src/controller/validate.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,10 @@ pub enum Error {
8181
role: String,
8282
},
8383

84-
#[snafu(display("failed to validate config fragment"))]
85-
InvalidConfigFragment {
86-
source: stackable_operator::config::fragment::ValidationError,
84+
#[snafu(display("failed to resolve and merge config for role group {role_group}"))]
85+
FailedToResolveConfig {
86+
source: crate::framework::role_utils::Error,
87+
role_group: String,
8788
},
8889
}
8990

@@ -264,7 +265,9 @@ pub fn validate(
264265
GenericRoleConfig,
265266
v1alpha1::TrinoConfigOverrides,
266267
>(rg, &role, &default_config)
267-
.context(InvalidConfigFragmentSnafu)?;
268+
.with_context(|_| FailedToResolveConfigSnafu {
269+
role_group: rg_name.clone(),
270+
})?;
268271
groups.insert(rg_name.clone(), validated_rg);
269272
}
270273
role_jvm_argument_overrides.insert(

rust/operator-binary/src/framework/role_utils.rs

Lines changed: 39 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
//! `smooth-operator` branch, with simplifications appropriate for trino-operator.
33
//!
44
//! Differences from upstream:
5-
//! - `env_overrides` is `HashMap<String, String>` instead of `EnvVarSet`.
65
//! - No `cli_overrides_to_vec` helper, `ResourceNames`, or service-account helpers.
76
//! - The `CommonConfig` (a.k.a. `product_specific_common_config`) does NOT need to
87
//! implement `Merge`. Upstream Trino uses `JavaCommonConfig`, which intentionally
@@ -15,9 +14,13 @@
1514
//! Replace with `stackable_operator::v2::role_utils::*` once upstream publishes
1615
//! the module.
1716
18-
use std::collections::BTreeMap;
17+
use std::{
18+
collections::{BTreeMap, HashMap},
19+
str::FromStr,
20+
};
1921

2022
use serde::Serialize;
23+
use snafu::{ResultExt, Snafu};
2124
use stackable_operator::{
2225
config::{
2326
fragment::{self, FromFragment},
@@ -26,19 +29,28 @@ use stackable_operator::{
2629
k8s_openapi::{DeepMerge, api::core::v1::PodTemplateSpec},
2730
role_utils::{Role, RoleGroup},
2831
schemars::JsonSchema,
32+
v2::builder::pod::container::{self, EnvVarName, EnvVarSet},
2933
};
3034

35+
#[derive(Snafu, Debug)]
36+
pub enum Error {
37+
#[snafu(display("failed to validate the role group config"))]
38+
ValidateConfig { source: fragment::ValidationError },
39+
40+
#[snafu(display("invalid environment variable override name"))]
41+
ParseEnvVarName { source: container::Error },
42+
}
43+
3144
/// Trino-friendly view of a validated, merged `RoleGroup`.
3245
///
3346
/// Mirrors `stackable_operator::v2::role_utils::RoleGroupConfig` on the
34-
/// `smooth-operator` branch, with `env_overrides: BTreeMap<String, String>`
35-
/// instead of the upstream `EnvVarSet`.
47+
/// `smooth-operator` branch.
3648
#[derive(Clone, Debug, PartialEq)]
3749
pub struct RoleGroupConfig<Config, CommonConfig, ConfigOverrides> {
3850
pub replicas: u16,
3951
pub config: Config,
4052
pub config_overrides: ConfigOverrides,
41-
pub env_overrides: BTreeMap<String, String>,
53+
pub env_overrides: EnvVarSet,
4254
pub cli_overrides: BTreeMap<String, String>,
4355
pub pod_overrides: PodTemplateSpec,
4456
pub product_specific_common_config: CommonConfig,
@@ -59,18 +71,16 @@ pub fn with_validated_config<ValidatedConfig, CommonConfig, Config, RoleConfig,
5971
role_group: &RoleGroup<Config, CommonConfig, ConfigOverrides>,
6072
role: &Role<Config, ConfigOverrides, RoleConfig, CommonConfig>,
6173
default_config: &Config,
62-
) -> Result<
63-
RoleGroupConfig<ValidatedConfig, CommonConfig, ConfigOverrides>,
64-
fragment::ValidationError,
65-
>
74+
) -> Result<RoleGroupConfig<ValidatedConfig, CommonConfig, ConfigOverrides>, Error>
6675
where
6776
ValidatedConfig: FromFragment<Fragment = Config>,
6877
CommonConfig: Clone + Default + JsonSchema + Serialize,
6978
Config: Clone + Merge,
7079
RoleConfig: Default + JsonSchema + Serialize,
7180
ConfigOverrides: Clone + Default + JsonSchema + Merge + Serialize,
7281
{
73-
let validated_config = validate_config(role_group, role, default_config)?;
82+
let validated_config =
83+
validate_config(role_group, role, default_config).context(ValidateConfigSnafu)?;
7484
Ok(RoleGroupConfig {
7585
replicas: role_group.replicas.unwrap_or(1),
7686
config: validated_config,
@@ -79,18 +89,9 @@ where
7989
role_group.config.config_overrides.clone(),
8090
),
8191
env_overrides: merged_env_overrides(
82-
role.config
83-
.env_overrides
84-
.iter()
85-
.map(|(k, v)| (k.clone(), v.clone()))
86-
.collect(),
87-
role_group
88-
.config
89-
.env_overrides
90-
.iter()
91-
.map(|(k, v)| (k.clone(), v.clone()))
92-
.collect(),
93-
),
92+
&role.config.env_overrides,
93+
&role_group.config.env_overrides,
94+
)?,
9495
cli_overrides: merged_cli_overrides(
9596
role.config.cli_overrides.clone(),
9697
role_group.config.cli_overrides.clone(),
@@ -129,12 +130,22 @@ where
129130
}
130131

131132
fn merged_env_overrides(
132-
role_env_overrides: BTreeMap<String, String>,
133-
role_group_env_overrides: BTreeMap<String, String>,
134-
) -> BTreeMap<String, String> {
135-
let mut merged = role_env_overrides;
136-
merged.extend(role_group_env_overrides);
137-
merged
133+
role_env_overrides: &HashMap<String, String>,
134+
role_group_env_overrides: &HashMap<String, String>,
135+
) -> Result<EnvVarSet, Error> {
136+
// Process the role first, then the role group, so that role-group overrides win on key
137+
// collisions (`EnvVarSet::with_value` overrides earlier entries with the same name).
138+
let mut env_overrides = EnvVarSet::new();
139+
for (name, value) in role_env_overrides
140+
.iter()
141+
.chain(role_group_env_overrides.iter())
142+
{
143+
env_overrides = env_overrides.with_value(
144+
&EnvVarName::from_str(name).context(ParseEnvVarNameSnafu)?,
145+
value.clone(),
146+
);
147+
}
148+
Ok(env_overrides)
138149
}
139150

140151
fn merged_cli_overrides(

0 commit comments

Comments
 (0)