Skip to content

Commit 00ef5c9

Browse files
committed
write endpoints to hbase-site instead of dedicated config map
1 parent 39740fa commit 00ef5c9

File tree

12 files changed

+140
-407
lines changed

12 files changed

+140
-407
lines changed

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

Lines changed: 0 additions & 166 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
use std::{
2-
borrow::Cow,
32
collections::{BTreeMap, HashMap},
43
num::TryFromIntError,
54
};
65

7-
use futures::future::try_join_all;
86
use product_config::types::PropertyNameKind;
97
use security::AuthenticationConfig;
108
use serde::{Deserialize, Serialize};
@@ -37,7 +35,6 @@ use stackable_operator::{
3735
schemars::{self, JsonSchema},
3836
status::condition::{ClusterCondition, HasStatusCondition},
3937
time::Duration,
40-
utils::cluster_info::KubernetesClusterInfo,
4138
versioned::versioned,
4239
};
4340
use strum::{Display, EnumIter, EnumString};
@@ -591,169 +588,6 @@ impl v1alpha1::HbaseCluster {
591588
role_group: group_name.into(),
592589
}
593590
}
594-
595-
/// Returns rolegroup and replica information for a specific role.
596-
/// We can't pass through the merged config for a particular role-group
597-
/// here as we need more than the config. As this will be called by role,
598-
/// the merged listener-class is called so that only role-group information
599-
/// for externally-reachable services (based on their listener class) are
600-
/// included in the collection.
601-
pub fn rolegroup_ref_and_replicas(
602-
&self,
603-
role: &HbaseRole,
604-
) -> Vec<(RoleGroupRef<v1alpha1::HbaseCluster>, u16)> {
605-
match role {
606-
HbaseRole::Master => self
607-
.spec
608-
.masters
609-
.iter()
610-
.flat_map(|role| &role.role_groups)
611-
// Order rolegroups consistently, to avoid spurious downstream rewrites
612-
.collect::<BTreeMap<_, _>>()
613-
.into_iter()
614-
.map(|(rolegroup_name, role_group)| {
615-
(
616-
self.rolegroup_ref(HbaseRole::Master.to_string(), rolegroup_name),
617-
role_group.replicas.unwrap_or_default(),
618-
)
619-
})
620-
.collect(),
621-
HbaseRole::RegionServer => self
622-
.spec
623-
.region_servers
624-
.iter()
625-
.flat_map(|role| &role.role_groups)
626-
// Order rolegroups consistently, to avoid spurious downstream rewrites
627-
.collect::<BTreeMap<_, _>>()
628-
.into_iter()
629-
.map(|(rolegroup_name, role_group)| {
630-
(
631-
self.rolegroup_ref(HbaseRole::RegionServer.to_string(), rolegroup_name),
632-
role_group.replicas.unwrap_or_default(),
633-
)
634-
})
635-
.collect(),
636-
HbaseRole::RestServer => self
637-
.spec
638-
.rest_servers
639-
.iter()
640-
.flat_map(|role| &role.role_groups)
641-
// Order rolegroups consistently, to avoid spurious downstream rewrites
642-
.collect::<BTreeMap<_, _>>()
643-
.into_iter()
644-
.map(|(rolegroup_name, role_group)| {
645-
(
646-
self.rolegroup_ref(HbaseRole::RestServer.to_string(), rolegroup_name),
647-
role_group.replicas.unwrap_or_default(),
648-
)
649-
})
650-
.collect(),
651-
}
652-
}
653-
654-
pub fn pod_refs(
655-
&self,
656-
role: &HbaseRole,
657-
hbase_version: &str,
658-
) -> Result<Vec<HbasePodRef>, Error> {
659-
let ns = self.metadata.namespace.clone().context(NoNamespaceSnafu)?;
660-
let rolegroup_ref_and_replicas = self.rolegroup_ref_and_replicas(role);
661-
662-
Ok(rolegroup_ref_and_replicas
663-
.iter()
664-
.flat_map(|(rolegroup_ref, replicas)| {
665-
let ns = ns.clone();
666-
(0..*replicas).map(move |i| HbasePodRef {
667-
namespace: ns.clone(),
668-
role_group_service_name: rolegroup_ref.object_name(),
669-
pod_name: format!("{}-{}", rolegroup_ref.object_name(), i),
670-
ports: self
671-
.ports(role, hbase_version)
672-
.iter()
673-
.map(|(n, p)| (n.clone(), *p))
674-
.collect(),
675-
fqdn_override: None,
676-
})
677-
})
678-
.collect())
679-
}
680-
681-
pub async fn listener_refs(
682-
&self,
683-
client: &stackable_operator::client::Client,
684-
role: &HbaseRole,
685-
hbase_version: &str,
686-
) -> Result<Vec<HbasePodRef>, Error> {
687-
let pod_refs = self.pod_refs(role, hbase_version)?;
688-
try_join_all(pod_refs.into_iter().map(|pod_ref| async {
689-
// N.B. use the naming convention for persistent listener volumes as we
690-
// have specified above that we only want externally-reachable endpoints.
691-
let listener_name = format!("{LISTENER_VOLUME_NAME}-{}", pod_ref.pod_name);
692-
let listener_ref =
693-
|| ObjectRef::<Listener>::new(&listener_name).within(&pod_ref.namespace);
694-
let pod_obj_ref =
695-
|| ObjectRef::<Pod>::new(&pod_ref.pod_name).within(&pod_ref.namespace);
696-
let listener = client
697-
.get::<Listener>(&listener_name, &pod_ref.namespace)
698-
.await
699-
.context(GetPodListenerSnafu {
700-
listener: listener_ref(),
701-
pod: pod_obj_ref(),
702-
})?;
703-
let listener_address = listener
704-
.status
705-
.and_then(|s| s.ingress_addresses?.into_iter().next())
706-
.context(PodListenerHasNoAddressSnafu {
707-
listener: listener_ref(),
708-
pod: pod_obj_ref(),
709-
})?;
710-
Ok(HbasePodRef {
711-
fqdn_override: Some(listener_address.address),
712-
ports: listener_address
713-
.ports
714-
.into_iter()
715-
.map(|(port_name, port)| {
716-
let port = u16::try_from(port).context(PortOutOfBoundsSnafu {
717-
port_name: &port_name,
718-
port,
719-
})?;
720-
Ok((port_name, port))
721-
})
722-
.collect::<Result<_, _>>()?,
723-
..pod_ref
724-
})
725-
}))
726-
.await
727-
}
728-
}
729-
730-
/// Reference to a single `Pod` that is a component of a [`HbaseCluster`]
731-
///
732-
/// Used for service discovery.
733-
#[derive(Debug)]
734-
pub struct HbasePodRef {
735-
pub namespace: String,
736-
pub role_group_service_name: String,
737-
pub pod_name: String,
738-
pub fqdn_override: Option<String>,
739-
pub ports: HashMap<String, u16>,
740-
}
741-
742-
impl HbasePodRef {
743-
pub fn fqdn(&self, cluster_info: &KubernetesClusterInfo) -> Cow<str> {
744-
self.fqdn_override.as_deref().map_or_else(
745-
|| {
746-
Cow::Owned(format!(
747-
"{pod_name}.{role_group_service_name}.{namespace}.svc.{cluster_domain}",
748-
pod_name = self.pod_name,
749-
role_group_service_name = self.role_group_service_name,
750-
namespace = self.namespace,
751-
cluster_domain = cluster_info.cluster_domain,
752-
))
753-
},
754-
Cow::Borrowed,
755-
)
756-
}
757591
}
758592

759593
pub fn merged_env(rolegroup_config: Option<&BTreeMap<String, String>>) -> Vec<EnvVar> {

rust/operator-binary/src/discovery.rs

Lines changed: 2 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@ use stackable_operator::{
66
builder::{configmap::ConfigMapBuilder, meta::ObjectMetaBuilder},
77
commons::product_image_selection::ResolvedProductImage,
88
k8s_openapi::api::core::v1::ConfigMap,
9-
kube::{ResourceExt, runtime::reflector::ObjectRef},
9+
kube::runtime::reflector::ObjectRef,
1010
utils::cluster_info::KubernetesClusterInfo,
1111
};
1212

1313
use crate::{
14-
crd::{HBASE_SITE_XML, HbasePodRef, HbaseRole, v1alpha1},
14+
crd::{HBASE_SITE_XML, HbaseRole, v1alpha1},
1515
hbase_controller::build_recommended_labels,
1616
kerberos::{self, kerberos_discovery_config_properties},
1717
zookeeper::ZookeeperConnectionInformation,
@@ -84,48 +84,3 @@ pub fn build_discovery_configmap(
8484
.build()
8585
.context(BuildConfigMapSnafu)
8686
}
87-
88-
pub fn build_endpoint_configmap(
89-
hbase: &v1alpha1::HbaseCluster,
90-
resolved_product_image: &ResolvedProductImage,
91-
role_podrefs: BTreeMap<String, Vec<HbasePodRef>>,
92-
) -> Result<ConfigMap> {
93-
let name = hbase.name_unchecked();
94-
let mut cm = ConfigMapBuilder::new();
95-
96-
let cmm = cm.metadata(
97-
ObjectMetaBuilder::new()
98-
.name_and_namespace(hbase)
99-
.name(format!("{name}-ui-endpoints"))
100-
.ownerreference_from_resource(hbase, None, Some(true))
101-
.with_context(|_| ObjectMissingMetadataForOwnerRefSnafu {
102-
hbase: ObjectRef::from_obj(hbase),
103-
})?
104-
.with_recommended_labels(build_recommended_labels(
105-
hbase,
106-
&resolved_product_image.app_version_label,
107-
"hbase-ui",
108-
"discovery",
109-
))
110-
.context(ObjectMetaSnafu)?
111-
.build(),
112-
);
113-
114-
for role_podref in role_podrefs {
115-
for podref in role_podref.1 {
116-
if let HbasePodRef {
117-
fqdn_override: Some(fqdn_override),
118-
ports,
119-
pod_name,
120-
..
121-
} = podref
122-
{
123-
if let Some(ui_port) = ports.get(&hbase.ui_port_name()) {
124-
cmm.add_data(pod_name, format!("{fqdn_override}:{ui_port}"));
125-
}
126-
}
127-
}
128-
}
129-
130-
cm.build().context(BuildConfigMapSnafu)
131-
}

rust/operator-binary/src/hbase_controller.rs

Lines changed: 2 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,11 @@ use crate::{
7979
crd::{
8080
APP_NAME, AnyServiceConfig, Container, HBASE_ENV_SH, HBASE_MASTER_PORT,
8181
HBASE_REGIONSERVER_PORT, HBASE_REST_PORT_NAME_HTTP, HBASE_REST_PORT_NAME_HTTPS,
82-
HBASE_SITE_XML, HbaseClusterStatus, HbasePodRef, HbaseRole, JVM_SECURITY_PROPERTIES_FILE,
82+
HBASE_SITE_XML, HbaseClusterStatus, HbaseRole, JVM_SECURITY_PROPERTIES_FILE,
8383
LISTENER_VOLUME_DIR, LISTENER_VOLUME_NAME, SSL_CLIENT_XML, SSL_SERVER_XML, merged_env,
8484
v1alpha1,
8585
},
86-
discovery::{build_discovery_configmap, build_endpoint_configmap},
86+
discovery::build_discovery_configmap,
8787
kerberos::{
8888
self, add_kerberos_pod_config, kerberos_config_properties, kerberos_ssl_client_settings,
8989
kerberos_ssl_server_settings,
@@ -415,7 +415,6 @@ pub async fn reconcile_hbase(
415415
.context(ApplyRoleBindingSnafu)?;
416416

417417
let mut ss_cond_builder = StatefulSetConditionBuilder::default();
418-
let mut listener_refs: BTreeMap<String, Vec<HbasePodRef>> = BTreeMap::new();
419418

420419
for (role_name, group_config) in validated_config.iter() {
421420
let hbase_role = HbaseRole::from_str(role_name).context(UnidentifiedHbaseRoleSnafu {
@@ -485,40 +484,6 @@ pub async fn reconcile_hbase(
485484
.await
486485
.context(FailedToCreatePdbSnafu)?;
487486
}
488-
489-
// if the replicas are changed at the same time as the reconciliation
490-
// being paused, it may be possible to have listeners that are *expected*
491-
// (according to their replica number) but which are not yet created, so
492-
// deactivate this action in such cases.
493-
if hbase.spec.cluster_operation.reconciliation_paused
494-
|| hbase.spec.cluster_operation.stopped
495-
{
496-
tracing::info!(
497-
"Cluster is in a transitional state so do not attempt to collect listener information that will only be active once cluster has returned to a non-transitional state."
498-
);
499-
} else {
500-
listener_refs.insert(
501-
hbase_role.to_string(),
502-
hbase
503-
.listener_refs(client, &hbase_role, &resolved_product_image.product_version)
504-
.await
505-
.context(CollectDiscoveryConfigSnafu)?,
506-
);
507-
}
508-
}
509-
510-
tracing::debug!(
511-
"Listener references prepared for the ConfigMap {:#?}",
512-
listener_refs
513-
);
514-
515-
if !listener_refs.is_empty() {
516-
let endpoint_cm = build_endpoint_configmap(hbase, &resolved_product_image, listener_refs)
517-
.context(BuildDiscoveryConfigMapSnafu)?;
518-
cluster_resources
519-
.add(client, endpoint_cm)
520-
.await
521-
.context(ApplyDiscoveryConfigMapSnafu)?;
522487
}
523488

524489
// Discovery CM will fail to build until the rest of the cluster has been deployed, so do it last

tests/templates/kuttl/external-access/03-assert.yaml

Lines changed: 0 additions & 44 deletions
This file was deleted.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
apiVersion: kuttl.dev/v1beta1
3+
kind: TestStep
4+
commands:
5+
- script: |
6+
envsubst < listener-classes.yaml | kubectl apply -n $NAMESPACE -f -

0 commit comments

Comments
 (0)