Skip to content

Commit 4822af4

Browse files
committed
refactor: move listener build out of crd
1 parent d1d7f0c commit 4822af4

4 files changed

Lines changed: 88 additions & 77 deletions

File tree

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
//! Build the listener `Volume`/`PersistentVolumeClaim` exposing a rolegroup.
2+
3+
use snafu::{ResultExt, Snafu};
4+
use stackable_operator::{
5+
builder::pod::volume::{
6+
ListenerOperatorVolumeSourceBuilder, ListenerOperatorVolumeSourceBuilderError,
7+
ListenerReference, VolumeBuilder,
8+
},
9+
k8s_openapi::api::core::v1::{PersistentVolumeClaim, Volume},
10+
kvp::Labels,
11+
};
12+
13+
use crate::crd::{AnyServiceConfig, HbaseRole, LISTENER_VOLUME_NAME};
14+
15+
#[derive(Snafu, Debug)]
16+
pub enum Error {
17+
#[snafu(display("failed to build listener volume"))]
18+
BuildListenerVolume {
19+
source: ListenerOperatorVolumeSourceBuilderError,
20+
},
21+
22+
#[snafu(display("failed to build listener pvc"))]
23+
BuildListenerPvc {
24+
source: ListenerOperatorVolumeSourceBuilderError,
25+
},
26+
}
27+
28+
type Result<T, E = Error> = std::result::Result<T, E>;
29+
30+
/// The ephemeral listener [`Volume`] for the masters and region servers, or `None` for the rest
31+
/// servers (which use a [`PersistentVolumeClaim`] instead, see [`build_listener_pvc`]).
32+
pub fn build_listener_volume(
33+
role: &HbaseRole,
34+
merged_config: &AnyServiceConfig,
35+
recommended_labels: &Labels,
36+
) -> Result<Option<Volume>> {
37+
let volume = match role {
38+
// Master and regionservers should use ephemeral listener volumes
39+
// since clients pull the latest address from ZooKeeper
40+
HbaseRole::Master | HbaseRole::RegionServer => Some(
41+
VolumeBuilder::new(LISTENER_VOLUME_NAME)
42+
.ephemeral(
43+
ListenerOperatorVolumeSourceBuilder::new(
44+
&ListenerReference::ListenerClass(
45+
merged_config.listener_class().to_string(),
46+
),
47+
recommended_labels,
48+
)
49+
.build_ephemeral()
50+
.context(BuildListenerVolumeSnafu)?,
51+
)
52+
.build(),
53+
),
54+
HbaseRole::RestServer => None,
55+
};
56+
Ok(volume)
57+
}
58+
59+
/// The listener [`PersistentVolumeClaim`] template for the rest servers, or `None` for the masters
60+
/// and region servers (which use an ephemeral [`Volume`] instead, see [`build_listener_volume`]).
61+
pub fn build_listener_pvc(
62+
role: &HbaseRole,
63+
merged_config: &AnyServiceConfig,
64+
recommended_labels: &Labels,
65+
) -> Result<Option<Vec<PersistentVolumeClaim>>> {
66+
let pvc = match role {
67+
HbaseRole::Master | HbaseRole::RegionServer => None,
68+
HbaseRole::RestServer => Some(vec![
69+
ListenerOperatorVolumeSourceBuilder::new(
70+
&ListenerReference::ListenerClass(merged_config.listener_class().to_string()),
71+
recommended_labels,
72+
)
73+
.build_pvc(LISTENER_VOLUME_NAME.to_string())
74+
.context(BuildListenerPvcSnafu)?,
75+
]),
76+
};
77+
Ok(pvc)
78+
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
44
pub mod config_map;
55
pub mod discovery;
6+
pub mod listener;
67
pub mod pdb;
78
pub mod service;
89
pub mod statefulset;

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,10 @@ pub enum Error {
8585
},
8686

8787
#[snafu(display("failed to build listener volume"))]
88-
ListenerVolume { source: crate::crd::Error },
88+
ListenerVolume { source: super::listener::Error },
8989

9090
#[snafu(display("failed to build listener persistent volume claim"))]
91-
ListenerPersistentVolumeClaim { source: crate::crd::Error },
91+
ListenerPersistentVolumeClaim { source: super::listener::Error },
9292
}
9393

9494
type Result<T, E = Error> = std::result::Result<T, E>;
@@ -298,13 +298,13 @@ pub fn build_rolegroup_statefulset(
298298
));
299299
}
300300

301-
let listener_pvc = hbase_role
302-
.listener_pvc(merged_config, &recommended_labels)
303-
.context(ListenerPersistentVolumeClaimSnafu)?;
301+
let listener_pvc =
302+
super::listener::build_listener_pvc(hbase_role, merged_config, &recommended_labels)
303+
.context(ListenerPersistentVolumeClaimSnafu)?;
304304

305-
if let Some(listener_volume) = hbase_role
306-
.listener_volume(merged_config, &recommended_labels)
307-
.context(ListenerVolumeSnafu)?
305+
if let Some(listener_volume) =
306+
super::listener::build_listener_volume(hbase_role, merged_config, &recommended_labels)
307+
.context(ListenerVolumeSnafu)?
308308
{
309309
pod_builder
310310
.add_volume(listener_volume)

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

Lines changed: 1 addition & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,7 @@
11
use security::AuthenticationConfig;
22
use serde::{Deserialize, Serialize};
33
use shell_escape::escape;
4-
use snafu::{ResultExt, Snafu};
54
use stackable_operator::{
6-
builder::pod::volume::{
7-
ListenerOperatorVolumeSourceBuilder, ListenerOperatorVolumeSourceBuilderError,
8-
ListenerReference, VolumeBuilder,
9-
},
105
commons::{
116
affinity::StackableAffinity,
127
cluster_operation::ClusterOperation,
@@ -21,12 +16,8 @@ use stackable_operator::{
2116
merge::{Atomic, Merge},
2217
},
2318
deep_merger::ObjectOverrides,
24-
k8s_openapi::{
25-
api::core::v1::{PersistentVolumeClaim, Volume},
26-
apimachinery::pkg::api::resource::Quantity,
27-
},
19+
k8s_openapi::apimachinery::pkg::api::resource::Quantity,
2820
kube::CustomResource,
29-
kvp::Labels,
3021
product_logging::{self, spec::Logging},
3122
role_utils::{GenericRoleConfig, Role},
3223
schemars::{self, JsonSchema},
@@ -103,19 +94,6 @@ pub type RegionServerRoleType = Role<
10394
pub type RestServerRoleType =
10495
Role<HbaseConfigFragment, v1alpha1::HbaseConfigOverrides, GenericRoleConfig, JavaCommonConfig>;
10596

106-
#[derive(Snafu, Debug)]
107-
pub enum Error {
108-
#[snafu(display("failed to build listener volume"))]
109-
BuildListenerVolume {
110-
source: ListenerOperatorVolumeSourceBuilderError,
111-
},
112-
113-
#[snafu(display("failed to build listener pvc"))]
114-
BuildListenerPvc {
115-
source: ListenerOperatorVolumeSourceBuilderError,
116-
},
117-
}
118-
11997
#[versioned(
12098
version(name = "v1alpha1"),
12199
crates(
@@ -311,52 +289,6 @@ impl HbaseRole {
311289
}
312290
}
313291

314-
pub fn listener_volume(
315-
&self,
316-
merged_config: &AnyServiceConfig,
317-
recommended_labels: &Labels,
318-
) -> Result<Option<Volume>, Error> {
319-
let volume = match &self {
320-
// Master and regionservers should use ephemeral listener volumes
321-
// since clients pull the latest address from ZooKeeper
322-
HbaseRole::Master | HbaseRole::RegionServer => Some(
323-
VolumeBuilder::new(LISTENER_VOLUME_NAME)
324-
.ephemeral(
325-
ListenerOperatorVolumeSourceBuilder::new(
326-
&ListenerReference::ListenerClass(
327-
merged_config.listener_class().to_string(),
328-
),
329-
recommended_labels,
330-
)
331-
.build_ephemeral()
332-
.context(BuildListenerVolumeSnafu)?,
333-
)
334-
.build(),
335-
),
336-
HbaseRole::RestServer => None,
337-
};
338-
Ok(volume)
339-
}
340-
341-
pub fn listener_pvc(
342-
&self,
343-
merged_config: &AnyServiceConfig,
344-
recommended_labels: &Labels,
345-
) -> Result<Option<Vec<PersistentVolumeClaim>>, Error> {
346-
let pvc = match &self {
347-
HbaseRole::Master | HbaseRole::RegionServer => None,
348-
HbaseRole::RestServer => Some(vec![
349-
ListenerOperatorVolumeSourceBuilder::new(
350-
&ListenerReference::ListenerClass(merged_config.listener_class().to_string()),
351-
recommended_labels,
352-
)
353-
.build_pvc(LISTENER_VOLUME_NAME.to_string())
354-
.context(BuildListenerPvcSnafu)?,
355-
]),
356-
};
357-
Ok(pvc)
358-
}
359-
360292
/// Returns required port name and port number tuples depending on the role.
361293
///
362294
/// Hbase versions 2.6.* will have two ports for each role. The metrics are available on the

0 commit comments

Comments
 (0)