@@ -6,6 +6,10 @@ use serde::{Deserialize, Serialize};
66use shell_escape:: escape;
77use snafu:: { OptionExt , ResultExt , Snafu } ;
88use 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
694762fn default_resources ( role : & HbaseRole ) -> ResourcesFragment < HbaseStorageConfig , NoRuntimeLimits > {
0 commit comments