@@ -11,8 +11,13 @@ use stackable_operator::{
1111 configmap:: ConfigMapBuilder ,
1212 meta:: ObjectMetaBuilder ,
1313 pod:: {
14- PodBuilder , container:: ContainerBuilder , resources:: ResourceRequirementsBuilder ,
15- volume:: VolumeBuilder ,
14+ PodBuilder ,
15+ container:: ContainerBuilder ,
16+ resources:: ResourceRequirementsBuilder ,
17+ volume:: {
18+ ListenerOperatorVolumeSourceBuilder , ListenerOperatorVolumeSourceBuilderError ,
19+ ListenerReference , VolumeBuilder ,
20+ } ,
1621 } ,
1722 } ,
1823 cluster_resources:: { ClusterResourceApplyStrategy , ClusterResources } ,
@@ -71,6 +76,11 @@ use crate::{
7176#[ strum_discriminants( derive( IntoStaticStr ) ) ]
7277#[ allow( clippy:: enum_variant_names) ]
7378pub enum Error {
79+ #[ snafu( display( "failed to build listener volume" ) ) ]
80+ BuildListenerVolume {
81+ source : ListenerOperatorVolumeSourceBuilderError ,
82+ } ,
83+
7484 #[ snafu( display( "missing secret lifetime" ) ) ]
7585 MissingSecretLifetime ,
7686
@@ -535,15 +545,27 @@ fn build_stateful_set(
535545
536546 // Add listener volume
537547 let listener_class = & shs. spec . cluster_config . listener_class ;
538- // all listeners will use ephemeral volumes as they can/should
539- // be removed when the pods are *terminated* (ephemeral PVCs will
540- // survive re-starts)
541- pb. add_listener_volume_by_listener_class (
542- LISTENER_VOLUME_NAME ,
543- & listener_class. to_string ( ) ,
544- & recommended_labels. clone ( ) ,
545- )
546- . context ( AddVolumeSnafu ) ?;
548+ let pvcs = if listener_class. discoverable ( ) {
549+ // externally reachable listener endpoints will use persistent volumes
550+ // so that load balancers can hard-code the target addresses
551+ let pvc = ListenerOperatorVolumeSourceBuilder :: new (
552+ & ListenerReference :: ListenerClass ( listener_class. to_string ( ) ) ,
553+ & recommended_labels,
554+ )
555+ . context ( BuildListenerVolumeSnafu ) ?
556+ . build_pvc ( LISTENER_VOLUME_NAME . to_string ( ) )
557+ . context ( BuildListenerVolumeSnafu ) ?;
558+ Some ( vec ! [ pvc] )
559+ } else {
560+ // non-reachable endpoints use ephemeral volumes
561+ pb. add_listener_volume_by_listener_class (
562+ LISTENER_VOLUME_NAME ,
563+ & listener_class. to_string ( ) ,
564+ & recommended_labels,
565+ )
566+ . context ( AddVolumeSnafu ) ?;
567+ None
568+ } ;
547569
548570 pb. add_container ( container) ;
549571
@@ -593,6 +615,7 @@ fn build_stateful_set(
593615 metadata : sts_metadata,
594616 spec : Some ( StatefulSetSpec {
595617 template : pod_template,
618+ volume_claim_templates : pvcs,
596619 replicas : shs. replicas ( rolegroupref) ,
597620 selector : LabelSelector {
598621 match_labels : Some (
0 commit comments