Skip to content

Commit f905635

Browse files
committed
refactor: remove raw cluster ref from kerberos and jvm
1 parent b90fe2c commit f905635

3 files changed

Lines changed: 57 additions & 66 deletions

File tree

rust/operator-binary/src/controller/build/jvm.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use stackable_operator::{
66

77
use crate::{
88
controller::build::kerberos::KRB5_CONFIG_PATH,
9-
crd::{AnyServiceConfig, CONFIG_DIR_NAME, JVM_SECURITY_PROPERTIES_FILE, v1alpha1},
9+
crd::{AnyServiceConfig, CONFIG_DIR_NAME, JVM_SECURITY_PROPERTIES_FILE},
1010
};
1111

1212
const JAVA_HEAP_FACTOR: f32 = 0.8;
@@ -49,14 +49,14 @@ pub fn construct_global_jvm_args(kerberos_enabled: bool) -> String {
4949
/// [`with_validated_config`](stackable_operator::v2::role_utils::with_validated_config). The
5050
/// operator-generated arguments below form the base that the user overrides are applied on top of.
5151
pub fn construct_role_specific_non_heap_jvm_args(
52-
hbase: &v1alpha1::HbaseCluster,
52+
kerberos_enabled: bool,
5353
merged_jvm_argument_overrides: &JvmArgumentOverrides,
5454
) -> String {
5555
let mut operator_generated = vec![format!(
5656
"-Djava.security.properties={CONFIG_DIR_NAME}/{JVM_SECURITY_PROPERTIES_FILE}"
5757
)];
5858

59-
if hbase.has_kerberos_enabled() {
59+
if kerberos_enabled {
6060
operator_generated.push(format!("-Djava.security.krb5.conf={KRB5_CONFIG_PATH}"));
6161
}
6262

rust/operator-binary/src/controller/build/kerberos.rs

Lines changed: 24 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::collections::BTreeMap;
22

3-
use snafu::{OptionExt, ResultExt, Snafu};
3+
use snafu::{ResultExt, Snafu};
44
use stackable_operator::{
55
builder::{
66
self,
@@ -11,14 +11,13 @@ use stackable_operator::{
1111
},
1212
},
1313
commons::secret_class::SecretClassVolumeProvisionParts,
14-
kube::{ResourceExt, runtime::reflector::ObjectRef},
1514
shared::time::Duration,
1615
utils::cluster_info::KubernetesClusterInfo,
1716
};
1817

1918
use crate::{
2019
controller::ValidatedCluster,
21-
crd::{TLS_STORE_DIR, TLS_STORE_PASSWORD, TLS_STORE_VOLUME_NAME, v1alpha1},
20+
crd::{TLS_STORE_DIR, TLS_STORE_PASSWORD, TLS_STORE_VOLUME_NAME},
2221
};
2322

2423
/// Mount path of the Kerberos secret volume (keytab + `krb5.conf`).
@@ -31,18 +30,13 @@ const KERBEROS_VOLUME_NAME: &str = "kerberos";
3130

3231
#[derive(Snafu, Debug)]
3332
pub enum Error {
34-
#[snafu(display("object {hbase} is missing namespace"))]
35-
ObjectMissingNamespace {
36-
hbase: ObjectRef<v1alpha1::HbaseCluster>,
37-
},
38-
39-
#[snafu(display("failed to add Kerberos secret volume"))]
40-
AddKerberosSecretVolume {
33+
#[snafu(display("failed to build Kerberos secret volume"))]
34+
BuildKerberosSecretVolume {
4135
source: stackable_operator::builder::pod::volume::SecretOperatorVolumeSourceBuilderError,
4236
},
4337

44-
#[snafu(display("failed to add TLS secret volume"))]
45-
AddTlsSecretVolume {
38+
#[snafu(display("failed to build TLS secret volume"))]
39+
BuildTlsSecretVolume {
4640
source: stackable_operator::builder::pod::volume::SecretOperatorVolumeSourceBuilderError,
4741
},
4842

@@ -56,14 +50,11 @@ pub enum Error {
5650
}
5751

5852
pub fn kerberos_config_properties(
59-
hbase: &v1alpha1::HbaseCluster,
53+
hbase_name: &str,
54+
hbase_namespace: &str,
6055
cluster_info: &KubernetesClusterInfo,
61-
) -> Result<BTreeMap<String, String>, Error> {
62-
if !hbase.has_kerberos_enabled() {
63-
return Ok(BTreeMap::new());
64-
}
65-
66-
let principal_host_part = principal_host_part(hbase, cluster_info)?;
56+
) -> BTreeMap<String, String> {
57+
let principal_host_part = principal_host_part(hbase_name, hbase_namespace, cluster_info);
6758

6859
let mut config = BTreeMap::from([
6960
// Kerberos settings
@@ -126,18 +117,15 @@ pub fn kerberos_config_properties(
126117
("hbase.rest.ssl.keystore.type".to_string(), "pkcs12".to_string()),
127118
]);
128119
config.extend(kerberos_principals(&principal_host_part));
129-
Ok(config)
120+
config
130121
}
131122

132123
pub fn kerberos_discovery_config_properties(
133-
hbase: &v1alpha1::HbaseCluster,
124+
hbase_name: &str,
125+
hbase_namespace: &str,
134126
cluster_info: &KubernetesClusterInfo,
135-
) -> Result<BTreeMap<String, String>, Error> {
136-
if !hbase.has_kerberos_enabled() {
137-
return Ok(BTreeMap::new());
138-
}
139-
140-
let principal_host_part = principal_host_part(hbase, cluster_info)?;
127+
) -> BTreeMap<String, String> {
128+
let principal_host_part = principal_host_part(hbase_name, hbase_namespace, cluster_info);
141129

142130
let mut config = BTreeMap::from([
143131
(
@@ -148,14 +136,10 @@ pub fn kerberos_discovery_config_properties(
148136
("hbase.ssl.enabled".to_string(), "true".to_string()),
149137
]);
150138
config.extend(kerberos_principals(&principal_host_part));
151-
Ok(config)
139+
config
152140
}
153141

154-
pub fn kerberos_ssl_server_settings(hbase: &v1alpha1::HbaseCluster) -> BTreeMap<String, String> {
155-
if !hbase.has_https_enabled() {
156-
return BTreeMap::new();
157-
}
158-
142+
pub fn kerberos_ssl_server_settings() -> BTreeMap<String, String> {
159143
let mut settings = truststore_settings("server");
160144
settings.extend([
161145
(
@@ -171,11 +155,7 @@ pub fn kerberos_ssl_server_settings(hbase: &v1alpha1::HbaseCluster) -> BTreeMap<
171155
settings
172156
}
173157

174-
pub fn kerberos_ssl_client_settings(hbase: &v1alpha1::HbaseCluster) -> BTreeMap<String, String> {
175-
if !hbase.has_https_enabled() {
176-
return BTreeMap::new();
177-
}
178-
158+
pub fn kerberos_ssl_client_settings() -> BTreeMap<String, String> {
179159
truststore_settings("client")
180160
}
181161

@@ -197,7 +177,7 @@ pub fn add_kerberos_pod_config(
197177
.with_kerberos_service_name(kerberos_service_name())
198178
.with_kerberos_service_name("HTTP")
199179
.build()
200-
.context(AddKerberosSecretVolumeSnafu)?;
180+
.context(BuildKerberosSecretVolumeSnafu)?;
201181
pb.add_volume(
202182
VolumeBuilder::new(KERBEROS_VOLUME_NAME)
203183
.ephemeral(kerberos_secret_operator_volume)
@@ -230,7 +210,7 @@ pub fn add_kerberos_pod_config(
230210
.with_tls_pkcs12_password(TLS_STORE_PASSWORD)
231211
.with_auto_tls_cert_lifetime(requested_secret_lifetime)
232212
.build()
233-
.context(AddTlsSecretVolumeSnafu)?,
213+
.context(BuildTlsSecretVolumeSnafu)?,
234214
)
235215
.build(),
236216
)
@@ -279,17 +259,12 @@ fn truststore_settings(role: &str) -> BTreeMap<String, String> {
279259
}
280260

281261
fn principal_host_part(
282-
hbase: &v1alpha1::HbaseCluster,
262+
hbase_name: &str,
263+
hbase_namespace: &str,
283264
cluster_info: &KubernetesClusterInfo,
284-
) -> Result<String, Error> {
285-
let hbase_name = hbase.name_any();
286-
let hbase_namespace = hbase.namespace().context(ObjectMissingNamespaceSnafu {
287-
hbase: ObjectRef::from_obj(hbase),
288-
})?;
265+
) -> String {
289266
let cluster_domain = &cluster_info.cluster_domain;
290-
Ok(format!(
291-
"{hbase_name}.{hbase_namespace}.svc.{cluster_domain}@${{env:KERBEROS_REALM}}"
292-
))
267+
format!("{hbase_name}.{hbase_namespace}.svc.{cluster_domain}@${{env:KERBEROS_REALM}}")
293268
}
294269

295270
/// We could have different service names depended on the role (e.g. "hbase-master", "hbase-regionserver" and

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

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ use crate::{
3131
build::{
3232
jvm::construct_role_specific_non_heap_jvm_args,
3333
kerberos::{
34-
self, kerberos_config_properties, kerberos_discovery_config_properties,
34+
kerberos_config_properties, kerberos_discovery_config_properties,
3535
kerberos_ssl_client_settings, kerberos_ssl_server_settings,
3636
},
3737
},
@@ -72,9 +72,6 @@ pub enum Error {
7272
role_group: String,
7373
},
7474

75-
#[snafu(display("failed to resolve kerberos config"))]
76-
AddKerberosConfig { source: kerberos::Error },
77-
7875
#[snafu(display("failed to validate logging configuration"))]
7976
ValidateLoggingConfig {
8077
source: stackable_operator::v2::product_logging::framework::Error,
@@ -216,17 +213,36 @@ pub fn validate_cluster(
216213
role_groups.insert(hbase_role, group_configs);
217214
}
218215

219-
let hbase_site_kerberos_config =
220-
kerberos_config_properties(hbase, cluster_info).context(AddKerberosConfigSnafu)?;
221-
let discovery_kerberos_config = kerberos_discovery_config_properties(hbase, cluster_info)
222-
.context(AddKerberosConfigSnafu)?;
223-
let ssl_server_settings = kerberos_ssl_server_settings(hbase);
224-
let ssl_client_settings = kerberos_ssl_client_settings(hbase);
225-
226216
let name = get_cluster_name(hbase).context(GetClusterIdentitySnafu)?;
227217
let namespace = get_namespace(hbase).context(GetClusterIdentitySnafu)?;
228218
let uid = get_uid(hbase).context(GetClusterIdentitySnafu)?;
229219

220+
let kerberos_enabled = hbase.has_kerberos_enabled();
221+
let https_enabled = hbase.has_https_enabled();
222+
223+
// Kerberos- and TLS-related properties, pre-resolved here so the build step stays a pure
224+
// function of `ValidatedCluster` (empty when the respective feature is disabled).
225+
let hbase_site_kerberos_config = if kerberos_enabled {
226+
kerberos_config_properties(name.as_ref(), namespace.as_ref(), cluster_info)
227+
} else {
228+
BTreeMap::new()
229+
};
230+
let discovery_kerberos_config = if kerberos_enabled {
231+
kerberos_discovery_config_properties(name.as_ref(), namespace.as_ref(), cluster_info)
232+
} else {
233+
BTreeMap::new()
234+
};
235+
let ssl_server_settings = if https_enabled {
236+
kerberos_ssl_server_settings()
237+
} else {
238+
BTreeMap::new()
239+
};
240+
let ssl_client_settings = if https_enabled {
241+
kerberos_ssl_client_settings()
242+
} else {
243+
BTreeMap::new()
244+
};
245+
230246
Ok(ValidatedCluster::new(
231247
name,
232248
namespace,
@@ -235,8 +251,8 @@ pub fn validate_cluster(
235251
ValidatedClusterConfig {
236252
zookeeper_connection_information: dereferenced_objects.zookeeper_connection_information,
237253
hbase_opa_config: dereferenced_objects.hbase_opa_config,
238-
kerberos_enabled: hbase.has_kerberos_enabled(),
239-
https_enabled: hbase.has_https_enabled(),
254+
kerberos_enabled,
255+
https_enabled,
240256
kerberos_secret_class: hbase.kerberos_secret_class(),
241257
https_secret_class: hbase.https_secret_class(),
242258
hdfs_config_map_name: hbase.spec.cluster_config.hdfs_config_map_name.clone(),
@@ -308,7 +324,7 @@ where
308324
} = validated.config;
309325

310326
let non_heap_jvm_args = construct_role_specific_non_heap_jvm_args(
311-
hbase,
327+
hbase.has_kerberos_enabled(),
312328
&product_specific_common_config.jvm_argument_overrides,
313329
);
314330

0 commit comments

Comments
 (0)