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
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
2022use serde:: Serialize ;
23+ use snafu:: { ResultExt , Snafu } ;
2124use 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 ) ]
3749pub 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 >
6675where
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,
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
131132fn 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
140151fn merged_cli_overrides (
0 commit comments