Skip to content

Commit a2d26c1

Browse files
committed
refactor: add namespace, ui to ValidatedCluster, cleanup raw ZkCluster references
1 parent 7d41396 commit a2d26c1

6 files changed

Lines changed: 178 additions & 111 deletions

File tree

rust/operator-binary/src/config/jvm.rs

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

77
use crate::crd::{
88
JMX_METRICS_PORT, LoggingFramework, STACKABLE_CONFIG_DIR, STACKABLE_LOG_CONFIG_DIR,
9-
ZookeeperServerRoleType,
10-
v1alpha1::{ZookeeperCluster, ZookeeperConfig},
9+
ZookeeperServerRoleType, logging_framework, v1alpha1::ZookeeperConfig,
1110
};
1211

1312
const JAVA_HEAP_FACTOR: f32 = 0.8;
@@ -37,12 +36,11 @@ pub enum Error {
3736

3837
/// All JVM arguments.
3938
fn construct_jvm_args(
40-
zk: &ZookeeperCluster,
4139
role: &ZookeeperServerRoleType,
4240
role_group: &str,
4341
product_version: &str,
4442
) -> Result<Vec<String>, Error> {
45-
let logging_framework = zk.logging_framework(product_version);
43+
let logging_framework = logging_framework(product_version);
4644

4745
let jvm_args = vec![
4846
format!("-Djava.security.properties={STACKABLE_CONFIG_DIR}/{JVM_SECURITY_PROPERTIES_FILE}"),
@@ -72,12 +70,11 @@ fn construct_jvm_args(
7270
/// Arguments that go into `SERVER_JVMFLAGS`, so *not* the heap settings (which you can get using
7371
/// [`construct_zk_server_heap_env`]).
7472
pub fn construct_non_heap_jvm_args(
75-
zk: &ZookeeperCluster,
7673
role: &ZookeeperServerRoleType,
7774
role_group: &str,
7875
product_version: &str,
7976
) -> Result<String, Error> {
80-
let mut jvm_args = construct_jvm_args(zk, role, role_group, product_version)?;
77+
let mut jvm_args = construct_jvm_args(role, role_group, product_version)?;
8178
jvm_args.retain(|arg| !is_heap_jvm_argument(arg));
8279

8380
Ok(jvm_args.join(" "))
@@ -110,7 +107,7 @@ fn is_heap_jvm_argument(jvm_argument: &str) -> bool {
110107
#[cfg(test)]
111108
mod tests {
112109
use super::*;
113-
use crate::crd::ZookeeperRole;
110+
use crate::crd::{ZookeeperRole, v1alpha1::ZookeeperCluster};
114111

115112
#[test]
116113
fn test_construct_jvm_arguments_defaults() {
@@ -128,13 +125,9 @@ mod tests {
128125
replicas: 1
129126
"#;
130127
let (zookeeper, merged_config, role, rolegroup) = construct_boilerplate(input);
131-
let non_heap_jvm_args = construct_non_heap_jvm_args(
132-
&zookeeper,
133-
&role,
134-
&rolegroup,
135-
zookeeper.spec.image.product_version(),
136-
)
137-
.expect("test: function must pass");
128+
let non_heap_jvm_args =
129+
construct_non_heap_jvm_args(&role, &rolegroup, zookeeper.spec.image.product_version())
130+
.expect("test: function must pass");
138131
let zk_server_heap_env =
139132
construct_zk_server_heap_env(&merged_config).expect("test: function must pass");
140133

@@ -180,13 +173,9 @@ mod tests {
180173
- -Dhttps.proxyPort=1234
181174
"#;
182175
let (zookeeper, merged_config, role, rolegroup) = construct_boilerplate(input);
183-
let non_heap_jvm_args = construct_non_heap_jvm_args(
184-
&zookeeper,
185-
&role,
186-
&rolegroup,
187-
zookeeper.spec.image.product_version(),
188-
)
189-
.expect("test: function must pass");
176+
let non_heap_jvm_args =
177+
construct_non_heap_jvm_args(&role, &rolegroup, zookeeper.spec.image.product_version())
178+
.expect("test: function must pass");
190179
let zk_server_heap_env =
191180
construct_zk_server_heap_env(&merged_config).expect("test: function must pass");
192181

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

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -448,22 +448,23 @@ impl ZookeeperPodRef {
448448
}
449449
}
450450

451-
impl v1alpha1::ZookeeperCluster {
452-
pub fn logging_framework(&self, product_version: &str) -> LoggingFramework {
453-
let zookeeper_versions_with_log4j = [
454-
"1.", "2.", "3.0.", "3.1.", "3.2.", "3.3.", "3.4.", "3.5.", "3.6.", "3.7.",
455-
];
456-
457-
if zookeeper_versions_with_log4j
458-
.into_iter()
459-
.any(|prefix| product_version.starts_with(prefix))
460-
{
461-
LoggingFramework::LOG4J
462-
} else {
463-
LoggingFramework::LOGBACK
464-
}
451+
/// Returns the [`LoggingFramework`] used by the given ZooKeeper `product_version`.
452+
pub fn logging_framework(product_version: &str) -> LoggingFramework {
453+
let zookeeper_versions_with_log4j = [
454+
"1.", "2.", "3.0.", "3.1.", "3.2.", "3.3.", "3.4.", "3.5.", "3.6.", "3.7.",
455+
];
456+
457+
if zookeeper_versions_with_log4j
458+
.into_iter()
459+
.any(|prefix| product_version.starts_with(prefix))
460+
{
461+
LoggingFramework::LOG4J
462+
} else {
463+
LoggingFramework::LOGBACK
465464
}
465+
}
466466

467+
impl v1alpha1::ZookeeperCluster {
467468
/// The fully-qualified domain name of the role-level [Listener]
468469
///
469470
/// [Listener]: stackable_operator::crd::listener::v1alpha1::Listener

rust/operator-binary/src/zk_controller.rs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -377,10 +377,8 @@ pub async fn reconcile_zk(
377377
.context(BuildServiceSnafu)?;
378378
let rg_configmap = build::config_map::build_server_rolegroup_config_map(
379379
&validated_cluster,
380-
&zk_role,
381380
&rolegroup,
382381
rolegroup_config,
383-
zk,
384382
)
385383
.context(BuildRoleGroupConfigMapSnafu {
386384
rolegroup: rolegroup.clone(),
@@ -453,7 +451,7 @@ pub async fn reconcile_zk(
453451
// We don't /need/ stability, but it's still nice to avoid spurious changes where possible.
454452
let mut discovery_hash = FnvHasher::with_key(0);
455453
let discovery_cm = build::discovery::build_discovery_configmap(
456-
zk,
454+
&validated_cluster,
457455
ZK_CONTROLLER_NAME,
458456
applied_listener,
459457
None,
@@ -679,7 +677,6 @@ fn build_server_rolegroup_statefulset(
679677
.add_env_var(
680678
"SERVER_JVMFLAGS",
681679
construct_non_heap_jvm_args(
682-
zk,
683680
role,
684681
&rolegroup_ref.role_group,
685682
&resolved_product_image.product_version,
@@ -898,8 +895,11 @@ pub fn error_policy(
898895
#[cfg(test)]
899896
mod tests {
900897
use stackable_operator::{
901-
commons::networking::DomainName, k8s_openapi::api::core::v1::ConfigMap,
902-
role_utils::JavaCommonConfig, utils::cluster_info::KubernetesClusterInfo,
898+
commons::networking::DomainName,
899+
k8s_openapi::api::core::v1::ConfigMap,
900+
role_utils::JavaCommonConfig,
901+
utils::cluster_info::KubernetesClusterInfo,
902+
v2::controller_utils::{get_cluster_name, get_namespace, get_uid},
903903
};
904904

905905
use super::*;
@@ -1054,7 +1054,7 @@ mod tests {
10541054
fn build_config_map(zookeeper_yaml: &str) -> ConfigMap {
10551055
let mut zookeeper: v1alpha1::ZookeeperCluster =
10561056
serde_yaml::from_str(zookeeper_yaml).expect("illegal test input");
1057-
zookeeper.metadata.uid = Some("42".to_owned());
1057+
zookeeper.metadata.uid = Some("c27b3971-ca72-42c1-80a4-abdfc1db0ddd".to_owned());
10581058
zookeeper.metadata.namespace = Some("default".to_owned());
10591059
let cluster_info = KubernetesClusterInfo {
10601060
cluster_domain: DomainName::try_from("cluster.local").unwrap(),
@@ -1100,25 +1100,25 @@ mod tests {
11001100
})
11011101
.collect();
11021102

1103-
let validated_cluster = ValidatedCluster {
1104-
name: zookeeper.name_any(),
1103+
let validated_cluster = ValidatedCluster::new(
1104+
get_cluster_name(&zookeeper).unwrap(),
1105+
get_namespace(&zookeeper).unwrap(),
1106+
get_uid(&zookeeper).unwrap(),
11051107
image,
1106-
cluster_config: ValidatedClusterConfig {
1108+
ValidatedClusterConfig {
11071109
zookeeper_security,
11081110
server_addresses,
11091111
},
11101112
role_group_configs,
1111-
};
1113+
);
11121114

11131115
let rolegroup_ref = zookeeper.server_rolegroup_ref("default");
11141116
let rolegroup_config = &validated_cluster.role_group_configs[&zk_role]["default"];
11151117

11161118
build::config_map::build_server_rolegroup_config_map(
11171119
&validated_cluster,
1118-
&zk_role,
11191120
&rolegroup_ref,
11201121
rolegroup_config,
1121-
&zookeeper,
11221122
)
11231123
.unwrap()
11241124
}

rust/operator-binary/src/zk_controller/build/config_map.rs

Lines changed: 16 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,14 @@ use stackable_operator::{
1212
builder::{configmap::ConfigMapBuilder, meta::ObjectMetaBuilder},
1313
k8s_openapi::api::core::v1::ConfigMap,
1414
role_utils::RoleGroupRef,
15-
v2::config_file_writer::{PropertiesWriterError, to_java_properties_string},
15+
v2::{
16+
builder::meta::ownerreference_from_resource,
17+
config_file_writer::{PropertiesWriterError, to_java_properties_string},
18+
},
1619
};
1720

1821
use crate::{
19-
crd::{ZookeeperRole, v1alpha1},
22+
crd::{logging_framework, v1alpha1},
2023
utils::build_recommended_labels,
2124
zk_controller::{
2225
ZK_CONTROLLER_NAME,
@@ -36,22 +39,11 @@ pub enum Error {
3639
rolegroup: RoleGroupRef<v1alpha1::ZookeeperCluster>,
3740
},
3841

39-
#[snafu(display("object is missing metadata to build owner reference"))]
40-
ObjectMissingMetadataForOwnerRef {
41-
source: stackable_operator::builder::meta::Error,
42-
},
43-
4442
#[snafu(display("failed to build object meta data"))]
4543
ObjectMeta {
4644
source: stackable_operator::builder::meta::Error,
4745
},
4846

49-
#[snafu(display("failed to add the logging configuration to the ConfigMap [{cm_name}]"))]
50-
InvalidLoggingConfig {
51-
source: logging::Error,
52-
cm_name: String,
53-
},
54-
5547
#[snafu(display("failed to build ConfigMap for {rolegroup}"))]
5648
BuildConfigMap {
5749
source: stackable_operator::builder::configmap::Error,
@@ -61,16 +53,14 @@ pub enum Error {
6153

6254
type Result<T, E = Error> = std::result::Result<T, E>;
6355

64-
/// Builds the rolegroup [`ConfigMap`].
56+
/// Builds the rolegroup [`ConfigMap`] entirely from the [`ValidatedCluster`].
6557
///
66-
/// `owner` is the [`v1alpha1::ZookeeperCluster`] and is used solely for the owner
67-
/// reference and object metadata (name, namespace, labels).
58+
/// The owner reference and object metadata (name, namespace, labels) are derived
59+
/// from `cluster`, which mirrors the raw [`v1alpha1::ZookeeperCluster`] metadata.
6860
pub fn build_server_rolegroup_config_map(
6961
cluster: &ValidatedCluster,
70-
role: &ZookeeperRole,
7162
rolegroup_ref: &RoleGroupRef<v1alpha1::ZookeeperCluster>,
7263
rolegroup_config: &ZookeeperRoleGroupConfig,
73-
owner: &v1alpha1::ZookeeperCluster,
7464
) -> Result<ConfigMap> {
7565
let mut data: BTreeMap<String, String> = BTreeMap::new();
7666

@@ -95,27 +85,20 @@ pub fn build_server_rolegroup_config_map(
9585
);
9686

9787
// logback.xml / log4j.properties and vector.yaml
98-
data.extend(
99-
logging::build(
100-
owner,
101-
role.clone(),
102-
rolegroup_ref,
103-
&cluster.image.product_version,
104-
)
105-
.context(InvalidLoggingConfigSnafu {
106-
cm_name: rolegroup_ref.object_name(),
107-
})?,
108-
);
88+
data.extend(logging::build(
89+
&rolegroup_config.config.logging,
90+
logging_framework(&cluster.image.product_version),
91+
rolegroup_ref,
92+
));
10993

11094
ConfigMapBuilder::new()
11195
.metadata(
11296
ObjectMetaBuilder::new()
113-
.name_and_namespace(owner)
97+
.name_and_namespace(cluster)
11498
.name(rolegroup_ref.object_name())
115-
.ownerreference_from_resource(owner, None, Some(true))
116-
.context(ObjectMissingMetadataForOwnerRefSnafu)?
99+
.ownerreference(ownerreference_from_resource(cluster, None, Some(true)))
117100
.with_recommended_labels(&build_recommended_labels(
118-
owner,
101+
cluster,
119102
ZK_CONTROLLER_NAME,
120103
&cluster.image.app_version_label_value,
121104
&rolegroup_ref.role,

rust/operator-binary/src/zk_controller/build/properties/logging.rs

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,16 @@
44
55
use std::collections::BTreeMap;
66

7-
use snafu::{ResultExt, Snafu};
87
use stackable_operator::{
98
memory::{BinaryMultiple, MemoryQuantity},
109
product_logging::{
1110
self,
12-
spec::{ContainerLogConfig, ContainerLogConfigChoice},
11+
spec::{ContainerLogConfig, ContainerLogConfigChoice, Logging},
1312
},
1413
role_utils::RoleGroupRef,
1514
};
1615

17-
use crate::crd::{LoggingFramework, STACKABLE_LOG_DIR, ZookeeperRole, v1alpha1};
16+
use crate::crd::{LoggingFramework, STACKABLE_LOG_DIR, v1alpha1};
1817

1918
/// The logback config file name (when the product uses the LOGBACK framework).
2019
pub const LOGBACK_CONFIG_FILE: &str = "logback.xml";
@@ -29,30 +28,22 @@ pub const MAX_ZK_LOG_FILES_SIZE: MemoryQuantity = MemoryQuantity {
2928
unit: BinaryMultiple::Mebi,
3029
};
3130

32-
#[derive(Snafu, Debug)]
33-
pub enum Error {
34-
#[snafu(display("crd validation failure"))]
35-
CrdValidationFailure { source: crate::crd::Error },
36-
}
37-
38-
type Result<T, E = Error> = std::result::Result<T, E>;
39-
4031
const CONSOLE_CONVERSION_PATTERN: &str = "%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n";
4132

4233
/// Builds the logging-related ConfigMap entries (product log config and the
4334
/// Vector agent config) for a role group.
35+
///
36+
/// `logging` is the merged [`Logging`] from the role group's validated config and
37+
/// `framework` selects the product log config format (see [`logging_framework`]).
38+
///
39+
/// [`logging_framework`]: crate::crd::logging_framework
4440
pub fn build(
45-
zk: &v1alpha1::ZookeeperCluster,
46-
role: ZookeeperRole,
41+
logging: &Logging<v1alpha1::Container>,
42+
framework: LoggingFramework,
4743
rolegroup: &RoleGroupRef<v1alpha1::ZookeeperCluster>,
48-
product_version: &str,
49-
) -> Result<BTreeMap<String, String>> {
44+
) -> BTreeMap<String, String> {
5045
let mut data = BTreeMap::new();
5146

52-
let logging = zk
53-
.logging(&role, rolegroup)
54-
.context(CrdValidationFailureSnafu)?;
55-
5647
if let Some(ContainerLogConfig {
5748
choice: Some(ContainerLogConfigChoice::Automatic(log_config)),
5849
}) = logging.containers.get(&v1alpha1::Container::Zookeeper)
@@ -63,7 +54,7 @@ pub fn build(
6354
.floor()
6455
.value as u32;
6556

66-
match zk.logging_framework(product_version) {
57+
match framework {
6758
LoggingFramework::LOG4J => {
6859
data.insert(
6960
LOG4J_CONFIG_FILE.to_string(),
@@ -108,5 +99,5 @@ pub fn build(
10899
);
109100
}
110101

111-
Ok(data)
102+
data
112103
}

0 commit comments

Comments
 (0)