Skip to content

Commit 47ac444

Browse files
committed
updating according to decision
1 parent fa9eaad commit 47ac444

4 files changed

Lines changed: 127 additions & 58 deletions

File tree

rust/operator-binary/src/controller.rs

Lines changed: 88 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -94,12 +94,12 @@ use crate::{
9494
STACKABLE_LOG_DIR_NAME,
9595
v1alpha1::{self, HiveMetastoreRoleConfig},
9696
},
97-
discovery::{self, build_headless_role_group_metrics_service_name},
97+
discovery::{self},
9898
kerberos::{
9999
self, add_kerberos_pod_config, kerberos_config_properties,
100100
kerberos_container_start_commands,
101101
},
102-
listener::{LISTENER_VOLUME_DIR, LISTENER_VOLUME_NAME, build_role_listener},
102+
listener::{LISTENER_VOLUME_DIR, LISTENER_VOLUME_NAME, build_role_listener, listener_ports},
103103
operations::{graceful_shutdown::add_graceful_shutdown_config, pdb::add_pdbs},
104104
product_logging::extend_role_group_config_map,
105105
};
@@ -456,7 +456,7 @@ pub async fn reconcile_hive(
456456
.merged_config(&HiveRole::MetaStore, &rolegroup)
457457
.context(FailedToResolveResourceConfigSnafu)?;
458458

459-
let rg_service = build_rolegroup_service(hive, &resolved_product_image, &rolegroup)?;
459+
let rg_services = build_rolegroup_service(hive, &resolved_product_image, &rolegroup)?;
460460
let rg_configmap = build_metastore_rolegroup_config_map(
461461
hive,
462462
&hive_namespace,
@@ -478,12 +478,13 @@ pub async fn reconcile_hive(
478478
&rbac_sa.name_any(),
479479
)?;
480480

481-
cluster_resources
482-
.add(client, rg_service)
483-
.await
484-
.context(ApplyRoleGroupServiceSnafu {
485-
rolegroup: rolegroup.clone(),
486-
})?;
481+
for rg_service in rg_services {
482+
cluster_resources.add(client, rg_service).await.context(
483+
ApplyRoleGroupServiceSnafu {
484+
rolegroup: rolegroup.clone(),
485+
},
486+
)?;
487+
}
487488

488489
cluster_resources
489490
.add(client, rg_configmap)
@@ -720,39 +721,84 @@ fn build_rolegroup_service(
720721
hive: &v1alpha1::HiveCluster,
721722
resolved_product_image: &ResolvedProductImage,
722723
rolegroup: &RoleGroupRef<v1alpha1::HiveCluster>,
723-
) -> Result<Service> {
724-
Ok(Service {
725-
metadata: ObjectMetaBuilder::new()
726-
.name_and_namespace(hive)
727-
.name(build_headless_role_group_metrics_service_name(
728-
rolegroup.object_name(),
729-
))
730-
.ownerreference_from_resource(hive, None, Some(true))
731-
.context(ObjectMissingMetadataForOwnerRefSnafu)?
732-
.with_recommended_labels(build_recommended_labels(
733-
hive,
734-
&resolved_product_image.app_version_label,
735-
&rolegroup.role,
736-
&rolegroup.role_group,
737-
))
738-
.context(MetadataBuildSnafu)?
739-
.with_label(Label::try_from(("prometheus.io/scrape", "true")).context(LabelBuildSnafu)?)
740-
.build(),
741-
spec: Some(ServiceSpec {
742-
// Internal communication does not need to be exposed
743-
type_: Some("ClusterIP".to_string()),
744-
cluster_ip: Some("None".to_string()),
745-
ports: Some(service_ports()),
746-
selector: Some(
747-
Labels::role_group_selector(hive, APP_NAME, &rolegroup.role, &rolegroup.role_group)
724+
) -> Result<Vec<Service>> {
725+
let services = vec![
726+
Service {
727+
metadata: ObjectMetaBuilder::new()
728+
.name_and_namespace(hive)
729+
// TODO: Use method on RoleGroupRef once op-rs is released
730+
.name(hive.rolegroup_headless_metrics_service_name(rolegroup))
731+
.ownerreference_from_resource(hive, None, Some(true))
732+
.context(ObjectMissingMetadataForOwnerRefSnafu)?
733+
.with_recommended_labels(build_recommended_labels(
734+
hive,
735+
&resolved_product_image.app_version_label,
736+
&rolegroup.role,
737+
&rolegroup.role_group,
738+
))
739+
.context(MetadataBuildSnafu)?
740+
.with_label(
741+
Label::try_from(("prometheus.io/scrape", "true")).context(LabelBuildSnafu)?,
742+
)
743+
.build(),
744+
spec: Some(ServiceSpec {
745+
// Internal communication does not need to be exposed
746+
type_: Some("ClusterIP".to_string()),
747+
cluster_ip: Some("None".to_string()),
748+
ports: Some(hive.metrics_ports()),
749+
selector: Some(
750+
Labels::role_group_selector(
751+
hive,
752+
APP_NAME,
753+
&rolegroup.role,
754+
&rolegroup.role_group,
755+
)
748756
.context(LabelBuildSnafu)?
749757
.into(),
750-
),
751-
publish_not_ready_addresses: Some(true),
752-
..ServiceSpec::default()
753-
}),
754-
status: None,
755-
})
758+
),
759+
publish_not_ready_addresses: Some(true),
760+
..ServiceSpec::default()
761+
}),
762+
status: None,
763+
},
764+
Service {
765+
metadata: ObjectMetaBuilder::new()
766+
.name_and_namespace(hive)
767+
// TODO: Use method on RoleGroupRef once op-rs is released
768+
.name(hive.rolegroup_headless_service_name(rolegroup))
769+
.ownerreference_from_resource(hive, None, Some(true))
770+
.context(ObjectMissingMetadataForOwnerRefSnafu)?
771+
.with_recommended_labels(build_recommended_labels(
772+
hive,
773+
&resolved_product_image.app_version_label,
774+
&rolegroup.role,
775+
&rolegroup.role_group,
776+
))
777+
.context(MetadataBuildSnafu)?
778+
.build(),
779+
spec: Some(ServiceSpec {
780+
// Internal communication does not need to be exposed
781+
type_: Some("ClusterIP".to_string()),
782+
cluster_ip: Some("None".to_string()),
783+
// Expecting same ports as on listener service, just as a headless, internal service
784+
ports: Some(hive.service_ports()),
785+
selector: Some(
786+
Labels::role_group_selector(
787+
hive,
788+
APP_NAME,
789+
&rolegroup.role,
790+
&rolegroup.role_group,
791+
)
792+
.context(LabelBuildSnafu)?
793+
.into(),
794+
),
795+
publish_not_ready_addresses: Some(true),
796+
..ServiceSpec::default()
797+
}),
798+
status: None,
799+
},
800+
];
801+
Ok(services)
756802
}
757803

758804
/// The rolegroup [`StatefulSet`] runs the rolegroup, as configured by the administrator.
@@ -1100,9 +1146,8 @@ fn build_metastore_rolegroup_statefulset(
11001146
),
11011147
..LabelSelector::default()
11021148
},
1103-
service_name: Some(build_headless_role_group_metrics_service_name(
1104-
rolegroup_ref.object_name(),
1105-
)),
1149+
// TODO: Use method on RoleGroupRef once op-rs is released
1150+
service_name: Some(hive.rolegroup_headless_metrics_service_name(rolegroup_ref)),
11061151
template: pod_template,
11071152
volume_claim_templates: Some(vec![pvc]),
11081153
..StatefulSetSpec::default()
@@ -1123,15 +1168,6 @@ pub fn error_policy(
11231168
}
11241169
}
11251170

1126-
pub fn service_ports() -> Vec<ServicePort> {
1127-
vec![ServicePort {
1128-
name: Some(METRICS_PORT_NAME.to_string()),
1129-
port: METRICS_PORT.into(),
1130-
protocol: Some("TCP".to_string()),
1131-
..ServicePort::default()
1132-
}]
1133-
}
1134-
11351171
/// Creates recommended `ObjectLabels` to be used in deployed resources
11361172
pub fn build_recommended_labels<'a, T>(
11371173
owner: &'a T,

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

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use stackable_operator::{
1818
merge::Merge,
1919
},
2020
crd::s3,
21-
k8s_openapi::apimachinery::pkg::api::resource::Quantity,
21+
k8s_openapi::{api::core::v1::ServicePort, apimachinery::pkg::api::resource::Quantity},
2222
kube::{CustomResource, ResourceExt, runtime::reflector::ObjectRef},
2323
product_config_utils::{self, Configuration},
2424
product_logging::{self, spec::Logging},
@@ -246,6 +246,43 @@ impl v1alpha1::HiveCluster {
246246
format!("{name}-{role}", name = self.name_any(), role = hive_role)
247247
}
248248

249+
/// Set of functions to define service names on rolegroup level.
250+
/// Headless service for cluster internal purposes only.
251+
// TODO: Move to operator-rs
252+
pub fn rolegroup_headless_service_name(
253+
&self,
254+
rolegroup: &RoleGroupRef<v1alpha1::HiveCluster>,
255+
) -> String {
256+
format!("{name}-headless", name = rolegroup.object_name())
257+
}
258+
259+
/// Headless metrics service exposes Prometheus endpoint only
260+
// TODO: Move to operator-rs
261+
pub fn rolegroup_headless_metrics_service_name(
262+
&self,
263+
rolegroup: &RoleGroupRef<v1alpha1::HiveCluster>,
264+
) -> String {
265+
format!("{name}-metrics", name = rolegroup.object_name())
266+
}
267+
268+
pub fn metrics_ports(&self) -> Vec<ServicePort> {
269+
vec![ServicePort {
270+
name: Some(METRICS_PORT_NAME.to_string()),
271+
port: METRICS_PORT.into(),
272+
protocol: Some("TCP".to_string()),
273+
..ServicePort::default()
274+
}]
275+
}
276+
277+
pub fn service_ports(&self) -> Vec<ServicePort> {
278+
vec![ServicePort {
279+
name: Some(HIVE_PORT_NAME.to_string()),
280+
port: HIVE_PORT.into(),
281+
protocol: Some("TCP".to_string()),
282+
..ServicePort::default()
283+
}]
284+
}
285+
249286
pub fn rolegroup(
250287
&self,
251288
rolegroup_ref: &RoleGroupRef<Self>,

rust/operator-binary/src/discovery.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,3 @@ fn build_discovery_configmap(
111111
obj_ref: ObjectRef::from_obj(hive),
112112
})
113113
}
114-
115-
pub fn build_headless_role_group_metrics_service_name(name: String) -> String {
116-
format!("{name}-metrics")
117-
}

rust/operator-binary/src/listener.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ pub fn build_role_listener(
104104
Ok(listener)
105105
}
106106

107-
fn listener_ports() -> Vec<ListenerPort> {
107+
pub fn listener_ports() -> Vec<ListenerPort> {
108108
vec![ListenerPort {
109109
name: HIVE_PORT_NAME.to_owned(),
110110
port: HIVE_PORT.into(),

0 commit comments

Comments
 (0)