Skip to content

Commit 1b61308

Browse files
adwk67claude
andcommitted
refactor: move product image resolution from dereference to validate
Image resolution is a pure computation, not an I/O dereference, so it belongs in validate_cluster alongside the other config validation. This aligns with the pattern used by the trino and airflow operators. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 63744a2 commit 1b61308

3 files changed

Lines changed: 25 additions & 32 deletions

File tree

rust/operator-binary/src/controller.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -338,18 +338,18 @@ pub async fn reconcile_hive(
338338
let client = &ctx.client;
339339
let hive_namespace = hive.namespace().context(ObjectHasNoNamespaceSnafu)?;
340340

341-
let dereferenced = crate::controller::dereference::dereference(
342-
client,
341+
let dereferenced = crate::controller::dereference::dereference(client, hive)
342+
.await
343+
.context(DereferenceSnafu)?;
344+
345+
let validated = validate::validate_cluster(
343346
hive,
344347
CONTAINER_IMAGE_BASE_NAME,
345348
&ctx.operator_environment.image_repository,
346349
crate::built_info::PKG_VERSION,
350+
&ctx.product_config,
347351
)
348-
.await
349-
.context(DereferenceSnafu)?;
350-
351-
let validated = validate::validate_cluster(hive, &dereferenced, &ctx.product_config)
352-
.context(ValidateSnafu)?;
352+
.context(ValidateSnafu)?;
353353

354354
let mut cluster_resources = ClusterResources::new(
355355
APP_NAME,

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

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,12 @@
11
use snafu::{ResultExt, Snafu};
22
use stackable_operator::{
3-
commons::product_image_selection::{self, ResolvedProductImage},
4-
crd::s3,
5-
database_connections::drivers::jdbc::JdbcDatabaseConnectionDetails,
6-
kube::ResourceExt,
3+
crd::s3, database_connections::drivers::jdbc::JdbcDatabaseConnectionDetails, kube::ResourceExt,
74
};
85

96
use crate::{config::opa::HiveOpaConfig, crd::v1alpha1};
107

118
#[derive(Snafu, Debug)]
129
pub enum Error {
13-
#[snafu(display("failed to resolve product image"))]
14-
ResolveProductImage {
15-
source: product_image_selection::Error,
16-
},
17-
1810
#[snafu(display("object defines no namespace"))]
1911
ObjectHasNoNamespace,
2012

@@ -36,7 +28,6 @@ pub enum Error {
3628

3729
/// External references resolved during the dereference step.
3830
pub struct DereferencedObjects {
39-
pub resolved_product_image: ResolvedProductImage,
4031
pub s3_connection_spec: Option<s3::v1alpha1::ConnectionSpec>,
4132
pub metadata_database_connection_details: JdbcDatabaseConnectionDetails,
4233
pub hive_opa_config: Option<HiveOpaConfig>,
@@ -45,16 +36,7 @@ pub struct DereferencedObjects {
4536
pub async fn dereference(
4637
client: &stackable_operator::client::Client,
4738
hive: &v1alpha1::HiveCluster,
48-
image_base_name: &str,
49-
image_repository: &str,
50-
pkg_version: &str,
5139
) -> Result<DereferencedObjects, Error> {
52-
let resolved_product_image = hive
53-
.spec
54-
.image
55-
.resolve(image_base_name, image_repository, pkg_version)
56-
.context(ResolveProductImageSnafu)?;
57-
5840
let s3_connection_spec: Option<s3::v1alpha1::ConnectionSpec> =
5941
if let Some(s3) = &hive.spec.cluster_config.s3 {
6042
Some(
@@ -87,7 +69,6 @@ pub async fn dereference(
8769
};
8870

8971
Ok(DereferencedObjects {
90-
resolved_product_image,
9172
s3_connection_spec,
9273
metadata_database_connection_details,
9374
hive_opa_config,

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

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,23 @@ use std::{
66
use product_config::{ProductConfigManager, types::PropertyNameKind};
77
use snafu::{OptionExt, ResultExt, Snafu};
88
use stackable_operator::{
9-
commons::product_image_selection::ResolvedProductImage,
9+
commons::product_image_selection::{self, ResolvedProductImage},
1010
product_config_utils::{transform_all_roles_to_config, validate_all_roles_and_groups_config},
1111
role_utils::GenericRoleConfig,
1212
};
1313

14-
use super::dereference::DereferencedObjects;
1514
use crate::crd::{
1615
HIVE_SITE_XML, HiveRole, JVM_SECURITY_PROPERTIES_FILE, MetaStoreConfig,
1716
v1alpha1::{self, HiveMetastoreRoleConfig},
1817
};
1918

2019
#[derive(Snafu, Debug)]
2120
pub enum Error {
21+
#[snafu(display("failed to resolve product image"))]
22+
ResolveProductImage {
23+
source: product_image_selection::Error,
24+
},
25+
2226
#[snafu(display("object defines no metastore role"))]
2327
NoMetaStoreRole,
2428

@@ -61,13 +65,21 @@ pub struct ValidatedHiveCluster {
6165

6266
pub fn validate_cluster(
6367
hive: &v1alpha1::HiveCluster,
64-
dereferenced: &DereferencedObjects,
68+
image_base_name: &str,
69+
image_repository: &str,
70+
pkg_version: &str,
6571
product_config_manager: &ProductConfigManager,
6672
) -> Result<ValidatedHiveCluster, Error> {
73+
let resolved_product_image = hive
74+
.spec
75+
.image
76+
.resolve(image_base_name, image_repository, pkg_version)
77+
.context(ResolveProductImageSnafu)?;
78+
6779
let role = hive.spec.metastore.as_ref().context(NoMetaStoreRoleSnafu)?;
6880

6981
let validated_config = validate_all_roles_and_groups_config(
70-
&dereferenced.resolved_product_image.product_version,
82+
&resolved_product_image.product_version,
7183
&transform_all_roles_to_config(
7284
hive,
7385
&[(
@@ -137,7 +149,7 @@ pub fn validate_cluster(
137149
role_groups.insert(hive_role, group_configs);
138150

139151
Ok(ValidatedHiveCluster {
140-
image: dereferenced.resolved_product_image.clone(),
152+
image: resolved_product_image,
141153
role_groups,
142154
role_configs,
143155
})

0 commit comments

Comments
 (0)