Skip to content

Commit 6976021

Browse files
committed
Add headless service, move listener logic to own file
1 parent c8d527e commit 6976021

4 files changed

Lines changed: 203 additions & 108 deletions

File tree

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

Lines changed: 42 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use stackable_operator::{
1919
fragment::{self, Fragment, ValidationError},
2020
merge::Merge,
2121
},
22-
k8s_openapi::apimachinery::pkg::api::resource::Quantity,
22+
k8s_openapi::{api::core::v1::ServicePort, apimachinery::pkg::api::resource::Quantity},
2323
kube::{CustomResource, ResourceExt, runtime::reflector::ObjectRef},
2424
memory::{BinaryMultiple, MemoryQuantity},
2525
product_config_utils::{self, Configuration},
@@ -32,7 +32,10 @@ use stackable_operator::{
3232
};
3333
use strum::{Display, EnumIter, EnumString, IntoEnumIterator};
3434

35-
use crate::crd::v1alpha1::{SupersetConfigFragment, SupersetRoleConfig};
35+
use crate::{
36+
crd::v1alpha1::{SupersetConfigFragment, SupersetRoleConfig},
37+
listener::default_listener_class,
38+
};
3639

3740
pub mod affinity;
3841
pub mod authentication;
@@ -49,9 +52,6 @@ pub const MAX_LOG_FILES_SIZE: MemoryQuantity = MemoryQuantity {
4952
unit: BinaryMultiple::Mebi,
5053
};
5154

52-
pub const LISTENER_VOLUME_NAME: &str = "listener";
53-
pub const LISTENER_VOLUME_DIR: &str = "/stackable/listener";
54-
5555
pub const APP_PORT_NAME: &str = "http";
5656
pub const APP_PORT: u16 = 8088;
5757
pub const METRICS_PORT_NAME: &str = "metrics";
@@ -311,10 +311,6 @@ impl Default for v1alpha1::SupersetRoleConfig {
311311
}
312312
}
313313

314-
fn default_listener_class() -> String {
315-
"cluster-internal".to_string()
316-
}
317-
318314
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
319315
#[serde(rename_all = "camelCase")]
320316
pub struct SupersetCredentials {
@@ -528,6 +524,43 @@ impl v1alpha1::SupersetCluster {
528524
}
529525
}
530526

527+
/// Set of functions to define service names on rolegroup level.
528+
/// Headless service for cluster internal purposes only.
529+
// TODO: Move to operator-rs
530+
pub fn rolegroup_headless_service_name(
531+
&self,
532+
rolegroup: &RoleGroupRef<v1alpha1::SupersetCluster>,
533+
) -> String {
534+
format!("{name}-headless", name = rolegroup.object_name())
535+
}
536+
537+
/// Headless metrics service exposes Prometheus endpoint only
538+
// TODO: Move to operator-rs
539+
pub fn rolegroup_headless_metrics_service_name(
540+
&self,
541+
rolegroup: &RoleGroupRef<v1alpha1::SupersetCluster>,
542+
) -> String {
543+
format!("{name}-metrics", name = rolegroup.object_name())
544+
}
545+
546+
pub fn metrics_ports(&self) -> Vec<ServicePort> {
547+
vec![ServicePort {
548+
name: Some(METRICS_PORT_NAME.to_string()),
549+
port: METRICS_PORT.into(),
550+
protocol: Some("TCP".to_string()),
551+
..ServicePort::default()
552+
}]
553+
}
554+
555+
pub fn service_ports(&self) -> Vec<ServicePort> {
556+
vec![ServicePort {
557+
name: Some(APP_PORT_NAME.to_string()),
558+
port: APP_PORT.into(),
559+
protocol: Some("TCP".to_string()),
560+
..ServicePort::default()
561+
}]
562+
}
563+
531564
pub fn generic_role_config(&self, role: &SupersetRole) -> Option<GenericRoleConfig> {
532565
self.get_role_config(role).map(|r| r.common.to_owned())
533566
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
use snafu::{ResultExt, Snafu};
2+
use stackable_operator::{builder::meta::ObjectMetaBuilder, crd::listener, kvp::ObjectLabels};
3+
4+
use crate::crd::{APP_PORT, APP_PORT_NAME, v1alpha1};
5+
6+
pub const LISTENER_VOLUME_NAME: &str = "listener";
7+
pub const LISTENER_VOLUME_DIR: &str = "/stackable/listener";
8+
9+
#[derive(Snafu, Debug)]
10+
pub enum Error {
11+
#[snafu(display("object is missing metadata to build owner reference"))]
12+
ObjectMissingMetadataForOwnerRef {
13+
source: stackable_operator::builder::meta::Error,
14+
},
15+
#[snafu(display("failed to build Metadata"))]
16+
MetadataBuild {
17+
source: stackable_operator::builder::meta::Error,
18+
},
19+
}
20+
21+
pub fn build_group_listener(
22+
superset: &v1alpha1::SupersetCluster,
23+
object_labels: ObjectLabels<v1alpha1::SupersetCluster>,
24+
listener_class: String,
25+
listener_group_name: String,
26+
) -> Result<listener::v1alpha1::Listener, Error> {
27+
let metadata = ObjectMetaBuilder::new()
28+
.name_and_namespace(superset)
29+
.name(listener_group_name)
30+
.ownerreference_from_resource(superset, None, Some(true))
31+
.context(ObjectMissingMetadataForOwnerRefSnafu)?
32+
.with_recommended_labels(object_labels)
33+
.context(MetadataBuildSnafu)?
34+
.build();
35+
36+
let spec = listener::v1alpha1::ListenerSpec {
37+
class_name: Some(listener_class),
38+
ports: Some(listener_ports()),
39+
..Default::default()
40+
};
41+
42+
let listener = listener::v1alpha1::Listener {
43+
metadata,
44+
spec,
45+
status: None,
46+
};
47+
48+
Ok(listener)
49+
}
50+
51+
pub fn listener_ports() -> Vec<listener::v1alpha1::ListenerPort> {
52+
vec![listener::v1alpha1::ListenerPort {
53+
name: APP_PORT_NAME.to_owned(),
54+
port: APP_PORT.into(),
55+
protocol: Some("TCP".to_owned()),
56+
}]
57+
}
58+
59+
pub fn default_listener_class() -> String {
60+
"cluster-internal".to_string()
61+
}

rust/operator-binary/src/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ mod config;
4242
mod controller_commons;
4343
mod crd;
4444
mod druid_connection_controller;
45+
mod listener;
4546
mod operations;
4647
mod product_logging;
4748
mod rbac;

0 commit comments

Comments
 (0)