Skip to content

Commit ef6a0bd

Browse files
committed
fix: error ranaming, shared test import, extract validated_role_group_config helper
1 parent cf7375f commit ef6a0bd

6 files changed

Lines changed: 94 additions & 98 deletions

File tree

rust/operator-binary/src/controller.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -698,3 +698,27 @@ pub fn error_policy(
698698
_ => Action::requeue(*Duration::from_secs(5)),
699699
}
700700
}
701+
702+
#[cfg(test)]
703+
pub(crate) mod test_support {
704+
use crate::{
705+
controller::dereference::DereferencedObjects,
706+
crd::authentication::{
707+
self, SupersetClientAuthenticationDetailsResolved, v1alpha1::FlaskRolesSyncMoment,
708+
},
709+
};
710+
711+
/// A [`DereferencedObjects`] with no authentication classes and no OPA config, for tests that
712+
/// build a `ValidatedCluster` without exercising the dereference step.
713+
pub(crate) fn default_dereferenced() -> DereferencedObjects {
714+
DereferencedObjects {
715+
authentication_config: SupersetClientAuthenticationDetailsResolved {
716+
authentication_classes_resolved: vec![],
717+
user_registration: true,
718+
user_registration_role: authentication::DEFAULT_USER_REGISTRATION_ROLE.to_string(),
719+
sync_roles_at: FlaskRolesSyncMoment::default(),
720+
},
721+
opa_config: None,
722+
}
723+
}
724+
}

rust/operator-binary/src/controller/build/resource/config_map.rs

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -80,27 +80,10 @@ mod tests {
8080

8181
use super::*;
8282
use crate::{
83-
controller::{dereference::DereferencedObjects, validate::validate_cluster},
84-
crd::{
85-
authentication::{
86-
self, SupersetClientAuthenticationDetailsResolved, v1alpha1::FlaskRolesSyncMoment,
87-
},
88-
v1alpha1,
89-
},
83+
controller::{test_support::default_dereferenced, validate::validate_cluster},
84+
crd::v1alpha1,
9085
};
9186

92-
fn default_dereferenced() -> DereferencedObjects {
93-
DereferencedObjects {
94-
authentication_config: SupersetClientAuthenticationDetailsResolved {
95-
authentication_classes_resolved: vec![],
96-
user_registration: true,
97-
user_registration_role: authentication::DEFAULT_USER_REGISTRATION_ROLE.to_string(),
98-
sync_roles_at: FlaskRolesSyncMoment::default(),
99-
},
100-
opa_config: None,
101-
}
102-
}
103-
10487
/// The rolegroup ConfigMap carries `superset_config.py` and (for automatic logging)
10588
/// `log_config.py`, and omits `vector.yaml` while the Vector agent is disabled (the default).
10689
#[test]

rust/operator-binary/src/controller/build/resource/deployment.rs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,6 @@ pub enum Error {
4343
source: stackable_operator::builder::pod::Error,
4444
},
4545

46-
#[snafu(display("failed to build Metadata"))]
47-
MetadataBuild {
48-
source: stackable_operator::builder::meta::Error,
49-
},
50-
5146
#[snafu(display("failed to add needed volume"))]
5247
AddVolume {
5348
source: stackable_operator::builder::pod::Error,
@@ -71,7 +66,6 @@ pub fn build_rolegroup_deployment(
7166
rolegroup_config: &SupersetRoleGroupConfig,
7267
sa_name: &str,
7368
) -> Result<Deployment> {
74-
let resolved_product_image = &validated.image;
7569
let merged_config = &rolegroup_config.config;
7670

7771
let resource_names = validated.resource_names(superset_role, role_group_name);
@@ -101,7 +95,7 @@ pub fn build_rolegroup_deployment(
10195

10296
let mut pb = PodBuilder::new();
10397
pb.metadata(metadata)
104-
.image_pull_secrets_from_product_image(resolved_product_image)
98+
.image_pull_secrets_from_product_image(&validated.image)
10599
.security_context(
106100
PodSecurityContextBuilder::new()
107101
.fs_group(super::SECRET_OPERATOR_FS_GROUP) // Needed for secret-operator
@@ -151,7 +145,7 @@ pub fn build_rolegroup_deployment(
151145
&rolegroup_config.config.logging.superset_container,
152146
))
153147
.context(AddVolumeSnafu)?;
154-
pb.add_container(super::build_metrics_container(resolved_product_image));
148+
pb.add_container(super::build_metrics_container(&validated.image));
155149

156150
if let Some(vector_container) =
157151
super::build_vector_container(validated, superset_role, role_group_name, rolegroup_config)

rust/operator-binary/src/controller/build/resource/statefulset.rs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,6 @@ pub enum Error {
6464
source: stackable_operator::builder::pod::Error,
6565
},
6666

67-
#[snafu(display("failed to build Metadata"))]
68-
MetadataBuild {
69-
source: stackable_operator::builder::meta::Error,
70-
},
71-
7267
#[snafu(display("failed to add LDAP Volumes and VolumeMounts"))]
7368
AddLdapVolumesAndVolumeMounts {
7469
source: stackable_operator::crd::authentication::ldap::v1alpha1::Error,

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

Lines changed: 59 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ use crate::{
3232
dereference::DereferencedObjects,
3333
},
3434
crd::{
35-
SupersetRole,
35+
SupersetRole, SupersetRoleGroupType, SupersetRoleType,
3636
v1alpha1::{
3737
Container, SupersetCluster, SupersetConfig, SupersetConfigFragment,
3838
SupersetConfigOverrides, SupersetRoleConfig,
@@ -62,15 +62,16 @@ pub enum Error {
6262
source: stackable_operator::v2::controller_utils::Error,
6363
},
6464

65-
#[snafu(display("failed to resolve and merge config for role group {role_group}"))]
66-
FailedToResolveConfig {
65+
#[snafu(display("failed to validate the config for role group {role_group}"))]
66+
ValidateConfig {
6767
source: fragment::ValidationError,
68-
role_group: String,
68+
role_group: RoleGroupName,
6969
},
7070

71-
#[snafu(display("failed to parse environment variable name"))]
71+
#[snafu(display("invalid environment variable override name in role group {role_group}"))]
7272
ParseEnvVarName {
7373
source: stackable_operator::v2::macros::attributed_string_type::Error,
74+
role_group: RoleGroupName,
7475
},
7576

7677
#[snafu(display("invalid role group name {role_group}"))]
@@ -174,53 +175,19 @@ pub fn validate_cluster(
174175

175176
let mut group_configs = BTreeMap::new();
176177
for (rolegroup_name, rolegroup) in &resolved_role.role_groups {
177-
let validated_rg = with_validated_config::<
178-
SupersetConfig,
179-
GenericCommonConfig,
180-
SupersetConfigFragment,
181-
SupersetRoleConfig,
182-
SupersetConfigOverrides,
183-
>(rolegroup, resolved_role, &default_config)
184-
.with_context(|_| FailedToResolveConfigSnafu {
185-
role_group: rolegroup_name.clone(),
186-
})?;
187-
188-
let mut env_overrides = EnvVarSet::new();
189-
for (name, value) in validated_rg.config.env_overrides {
190-
env_overrides = env_overrides.with_value(
191-
&EnvVarName::from_str(&name).context(ParseEnvVarNameSnafu)?,
192-
value,
193-
);
194-
}
195-
196178
let role_group_name = RoleGroupName::from_str(rolegroup_name).with_context(|_| {
197179
ParseRoleGroupNameSnafu {
198180
role_group: rolegroup_name.clone(),
199181
}
200182
})?;
201-
202-
let logging = validate_logging(
203-
&validated_rg.config.config.logging,
183+
let validated_rg = validate_role_group_config(
184+
&role_group_name,
185+
rolegroup,
186+
resolved_role,
187+
&default_config,
204188
&vector_aggregator_config_map_name,
205189
)?;
206-
207-
group_configs.insert(
208-
role_group_name,
209-
SupersetRoleGroupConfig {
210-
replicas: validated_rg.replicas,
211-
config: ValidatedSupersetConfig::from_merged(
212-
validated_rg.config.config,
213-
logging,
214-
),
215-
config_overrides: validated_rg.config.config_overrides,
216-
env_overrides,
217-
cli_overrides: validated_rg.config.cli_overrides,
218-
pod_overrides: validated_rg.config.pod_overrides,
219-
product_specific_common_config: validated_rg
220-
.config
221-
.product_specific_common_config,
222-
},
223-
);
190+
group_configs.insert(role_group_name, validated_rg);
224191
}
225192

226193
role_groups.insert(role, group_configs);
@@ -252,6 +219,51 @@ pub fn validate_cluster(
252219
))
253220
}
254221

222+
/// Merges and validates one role group into a [`SupersetRoleGroupConfig`].
223+
fn validate_role_group_config(
224+
role_group_name: &RoleGroupName,
225+
role_group: &SupersetRoleGroupType,
226+
role: &SupersetRoleType,
227+
default_config: &SupersetConfigFragment,
228+
vector_aggregator_config_map_name: &Option<ConfigMapName>,
229+
) -> Result<SupersetRoleGroupConfig, Error> {
230+
let merged = with_validated_config::<
231+
SupersetConfig,
232+
GenericCommonConfig,
233+
SupersetConfigFragment,
234+
SupersetRoleConfig,
235+
SupersetConfigOverrides,
236+
>(role_group, role, default_config)
237+
.with_context(|_| ValidateConfigSnafu {
238+
role_group: role_group_name.clone(),
239+
})?;
240+
241+
let mut env_overrides = EnvVarSet::new();
242+
for (env_var_name, env_var_value) in merged.config.env_overrides {
243+
env_overrides = env_overrides.with_value(
244+
&EnvVarName::from_str(&env_var_name).with_context(|_| ParseEnvVarNameSnafu {
245+
role_group: role_group_name.clone(),
246+
})?,
247+
env_var_value,
248+
);
249+
}
250+
251+
let logging = validate_logging(
252+
&merged.config.config.logging,
253+
vector_aggregator_config_map_name,
254+
)?;
255+
256+
Ok(SupersetRoleGroupConfig {
257+
replicas: merged.replicas,
258+
config: ValidatedSupersetConfig::from_merged(merged.config.config, logging),
259+
config_overrides: merged.config.config_overrides,
260+
env_overrides,
261+
cli_overrides: merged.config.cli_overrides,
262+
pod_overrides: merged.config.pod_overrides,
263+
product_specific_common_config: merged.config.product_specific_common_config,
264+
})
265+
}
266+
255267
#[cfg(test)]
256268
mod tests {
257269

@@ -267,28 +279,10 @@ mod tests {
267279

268280
use super::{Error, validate_cluster, validate_logging};
269281
use crate::{
270-
controller::dereference::DereferencedObjects,
271-
crd::{
272-
SupersetRole,
273-
authentication::{
274-
self, SupersetClientAuthenticationDetailsResolved, v1alpha1::FlaskRolesSyncMoment,
275-
},
276-
v1alpha1,
277-
},
282+
controller::test_support::default_dereferenced,
283+
crd::{SupersetRole, v1alpha1},
278284
};
279285

280-
fn default_dereferenced() -> DereferencedObjects {
281-
DereferencedObjects {
282-
authentication_config: SupersetClientAuthenticationDetailsResolved {
283-
authentication_classes_resolved: vec![],
284-
user_registration: true,
285-
user_registration_role: authentication::DEFAULT_USER_REGISTRATION_ROLE.to_string(),
286-
sync_roles_at: FlaskRolesSyncMoment::default(),
287-
},
288-
opa_config: None,
289-
}
290-
}
291-
292286
/// Builds a [`Logging`] with automatic log configuration for the Superset and Vector containers.
293287
fn automatic_logging(enable_vector_agent: bool) -> Logging<v1alpha1::Container> {
294288
let automatic = || ContainerLogConfig {

rust/operator-binary/src/crd/mod.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use stackable_operator::{
1919
kube::{CustomResource, ResourceExt},
2020
memory::{BinaryMultiple, MemoryQuantity},
2121
product_logging::{self, spec::Logging},
22-
role_utils::{GenericRoleConfig, Role},
22+
role_utils::{GenericRoleConfig, Role, RoleGroup},
2323
schemars::{self, JsonSchema},
2424
shared::time::Duration,
2525
status::condition::{ClusterCondition, HasStatusCondition},
@@ -90,6 +90,12 @@ pub type SupersetRoleType = Role<
9090
GenericCommonConfig,
9191
>;
9292

93+
pub type SupersetRoleGroupType = RoleGroup<
94+
v1alpha1::SupersetConfigFragment,
95+
GenericCommonConfig,
96+
v1alpha1::SupersetConfigOverrides,
97+
>;
98+
9399
#[derive(Display, EnumIter, EnumString)]
94100
#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
95101
pub enum SupersetConfigOptions {

0 commit comments

Comments
 (0)