Skip to content

Commit 3c0557c

Browse files
committed
use ephemeral volumes for master/rs
1 parent 3cf5e34 commit 3c0557c

File tree

3 files changed

+93
-25
lines changed

3 files changed

+93
-25
lines changed

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

Lines changed: 69 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ use serde::{Deserialize, Serialize};
66
use shell_escape::escape;
77
use snafu::{OptionExt, ResultExt, Snafu};
88
use stackable_operator::{
9+
builder::pod::volume::{
10+
ListenerOperatorVolumeSourceBuilder, ListenerOperatorVolumeSourceBuilderError,
11+
ListenerReference, VolumeBuilder,
12+
},
913
commons::{
1014
affinity::StackableAffinity,
1115
cluster_operation::ClusterOperation,
@@ -21,10 +25,11 @@ use stackable_operator::{
2125
},
2226
k8s_openapi::{
2327
DeepMerge,
24-
api::core::v1::{EnvVar, PodTemplateSpec},
28+
api::core::v1::{EnvVar, PersistentVolumeClaim, PodTemplateSpec, Volume},
2529
apimachinery::pkg::api::resource::Quantity,
2630
},
2731
kube::{CustomResource, ResourceExt, runtime::reflector::ObjectRef},
32+
kvp::Labels,
2833
product_config_utils::Configuration,
2934
product_logging::{self, spec::Logging},
3035
role_utils::{GenericRoleConfig, JavaCommonConfig, Role, RoleGroupRef},
@@ -110,6 +115,21 @@ pub enum Error {
110115

111116
#[snafu(display("role-group not found by name"))]
112117
RoleGroupNotFound,
118+
119+
#[snafu(display("failed to build listener volume source"))]
120+
ListenerVolumeSource {
121+
source: ListenerOperatorVolumeSourceBuilderError,
122+
},
123+
124+
#[snafu(display("failed to build listener volume"))]
125+
BuildListenerVolume {
126+
source: ListenerOperatorVolumeSourceBuilderError,
127+
},
128+
129+
#[snafu(display("failed to build listener pvc"))]
130+
BuildListenerPvc {
131+
source: ListenerOperatorVolumeSourceBuilderError,
132+
},
113133
}
114134

115135
#[versioned(version(name = "v1alpha1"))]
@@ -689,6 +709,54 @@ impl HbaseRole {
689709
HbaseRole::RestServer => "rest".to_string(),
690710
}
691711
}
712+
713+
pub fn listener_volume(
714+
&self,
715+
merged_config: &AnyServiceConfig,
716+
recommended_labels: &Labels,
717+
) -> Result<Option<Volume>, Error> {
718+
let volume = match &self {
719+
// Master and regionservers should use ephemeral listener volumes
720+
// since clients pull the latest address from ZooKeeper
721+
HbaseRole::Master | HbaseRole::RegionServer => Some(
722+
VolumeBuilder::new(LISTENER_VOLUME_NAME)
723+
.ephemeral(
724+
ListenerOperatorVolumeSourceBuilder::new(
725+
&ListenerReference::ListenerClass(
726+
merged_config.listener_class().to_string(),
727+
),
728+
recommended_labels,
729+
)
730+
.context(ListenerVolumeSourceSnafu)?
731+
.build_ephemeral()
732+
.context(BuildListenerVolumeSnafu)?,
733+
)
734+
.build(),
735+
),
736+
HbaseRole::RestServer => None,
737+
};
738+
Ok(volume)
739+
}
740+
741+
pub fn listener_pvc(
742+
&self,
743+
merged_config: &AnyServiceConfig,
744+
recommended_labels: &Labels,
745+
) -> Result<Option<Vec<PersistentVolumeClaim>>, Error> {
746+
let pvc = match &self {
747+
HbaseRole::Master | HbaseRole::RegionServer => None,
748+
HbaseRole::RestServer => Some(vec![
749+
ListenerOperatorVolumeSourceBuilder::new(
750+
&ListenerReference::ListenerClass(merged_config.listener_class().to_string()),
751+
recommended_labels,
752+
)
753+
.context(ListenerVolumeSourceSnafu)?
754+
.build_pvc(LISTENER_VOLUME_NAME.to_string())
755+
.context(BuildListenerPvcSnafu)?,
756+
]),
757+
};
758+
Ok(pvc)
759+
}
692760
}
693761

694762
fn default_resources(role: &HbaseRole) -> ResourcesFragment<HbaseStorageConfig, NoRuntimeLimits> {

rust/operator-binary/src/hbase_controller.rs

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,8 @@ use stackable_operator::{
2121
configmap::ConfigMapBuilder,
2222
meta::ObjectMetaBuilder,
2323
pod::{
24-
PodBuilder,
25-
container::ContainerBuilder,
26-
resources::ResourceRequirementsBuilder,
24+
PodBuilder, container::ContainerBuilder, resources::ResourceRequirementsBuilder,
2725
security::PodSecurityContextBuilder,
28-
volume::{
29-
ListenerOperatorVolumeSourceBuilder, ListenerOperatorVolumeSourceBuilderError,
30-
ListenerReference,
31-
},
3226
},
3327
},
3428
cluster_resources::{ClusterResourceApplyStrategy, ClusterResources},
@@ -323,9 +317,10 @@ pub enum Error {
323317
},
324318

325319
#[snafu(display("failed to build listener volume"))]
326-
BuildListenerVolume {
327-
source: ListenerOperatorVolumeSourceBuilderError,
328-
},
320+
ListenerVolume { source: crate::crd::Error },
321+
322+
#[snafu(display("failed to build listener persistent volume claim"))]
323+
ListenerPersistentVolumeClaim { source: crate::crd::Error },
329324
}
330325

331326
type Result<T, E = Error> = std::result::Result<T, E>;
@@ -968,15 +963,6 @@ fn build_rolegroup_statefulset(
968963
.service_account_name(service_account.name_any())
969964
.security_context(PodSecurityContextBuilder::new().fs_group(1000).build());
970965

971-
// externally-reachable listener endpoints should use a pvc volume...
972-
let pvc = ListenerOperatorVolumeSourceBuilder::new(
973-
&ListenerReference::ListenerClass(merged_config.listener_class().to_string()),
974-
&recommended_labels,
975-
)
976-
.context(BuildListenerVolumeSnafu)?
977-
.build_pvc(LISTENER_VOLUME_NAME.to_string())
978-
.context(BuildListenerVolumeSnafu)?;
979-
980966
if let Some(ContainerLogConfig {
981967
choice:
982968
Some(ContainerLogConfigChoice::Custom(CustomContainerLogConfig {
@@ -1047,7 +1033,21 @@ fn build_rolegroup_statefulset(
10471033
}
10481034
}
10491035

1036+
let listener_pvc = hbase_role
1037+
.listener_pvc(merged_config, &recommended_labels)
1038+
.context(ListenerPersistentVolumeClaimSnafu)?;
1039+
1040+
if let Some(listener_volume) = hbase_role
1041+
.listener_volume(merged_config, &recommended_labels)
1042+
.context(ListenerVolumeSnafu)?
1043+
{
1044+
pod_builder
1045+
.add_volume(listener_volume)
1046+
.context(AddVolumeSnafu)?;
1047+
};
1048+
10501049
let mut pod_template = pod_builder.build_template();
1050+
10511051
hbase.merge_pod_overrides(&mut pod_template, hbase_role, rolegroup_ref);
10521052

10531053
let metadata = ObjectMetaBuilder::new()
@@ -1081,7 +1081,7 @@ fn build_rolegroup_statefulset(
10811081
},
10821082
service_name: Some(headless_service_name(&rolegroup_ref.object_name())),
10831083
template: pod_template,
1084-
volume_claim_templates: Some(vec![pvc]),
1084+
volume_claim_templates: listener_pvc,
10851085
..StatefulSetSpec::default()
10861086
};
10871087

tests/templates/kuttl/external-access/20-assert.yaml.j2

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,28 +56,28 @@ status:
5656
apiVersion: v1
5757
kind: Service
5858
metadata:
59-
name: listener-test-hbase-master-external-unstable-0
59+
name: test-hbase-master-external-unstable-0-listener
6060
spec:
6161
type: NodePort
6262
---
6363
apiVersion: v1
6464
kind: Service
6565
metadata:
66-
name: listener-test-hbase-master-external-unstable-1
66+
name: test-hbase-master-external-unstable-1-listener
6767
spec:
6868
type: NodePort
6969
---
7070
apiVersion: v1
7171
kind: Service
7272
metadata:
73-
name: listener-test-hbase-regionserver-external-stable-0
73+
name: test-hbase-regionserver-external-stable-0-listener
7474
spec:
7575
type: NodePort
7676
---
7777
apiVersion: v1
7878
kind: Service
7979
metadata:
80-
name: listener-test-hbase-regionserver-external-unstable-0
80+
name: test-hbase-regionserver-external-unstable-0-listener
8181
spec:
8282
type: NodePort
8383
---

0 commit comments

Comments
 (0)