Skip to content

Commit d572fa3

Browse files
committed
move services to own module
1 parent 2298e3a commit d572fa3

3 files changed

Lines changed: 270 additions & 211 deletions

File tree

rust/operator-binary/src/hdfs_controller.rs

Lines changed: 25 additions & 211 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ use stackable_operator::{
2727
DeepMerge,
2828
api::{
2929
apps::v1::{StatefulSet, StatefulSetSpec},
30-
core::v1::{ConfigMap, Service, ServiceAccount, ServicePort, ServiceSpec},
30+
core::v1::{ConfigMap, ServiceAccount},
3131
},
3232
apimachinery::pkg::apis::meta::v1::LabelSelector,
3333
},
@@ -37,7 +37,7 @@ use stackable_operator::{
3737
core::{DeserializeGuard, error_boundary},
3838
runtime::{controller::Action, events::Recorder, reflector::ObjectRef},
3939
},
40-
kvp::{Annotations, Label, LabelError, Labels},
40+
kvp::{LabelError, Labels},
4141
logging::controller::ReconcilerError,
4242
product_config_utils::{transform_all_roles_to_config, validate_all_roles_and_groups_config},
4343
role_utils::{GenericRoleConfig, RoleGroupRef},
@@ -69,6 +69,10 @@ use crate::{
6969
},
7070
product_logging::extend_role_group_config_map,
7171
security::{self, kerberos, opa::HdfsOpaConfig},
72+
service::{
73+
self, rolegroup_headless_service, rolegroup_metrics_service,
74+
rolegroup_native_metrics_service,
75+
},
7276
};
7377

7478
pub const RESOURCE_MANAGER_HDFS_CONTROLLER: &str = "hdfs-operator-hdfs-controller";
@@ -218,15 +222,9 @@ pub enum Error {
218222
#[snafu(display("failed to build roleGroup selector labels"))]
219223
RoleGroupSelectorLabels { source: crate::crd::Error },
220224

221-
#[snafu(display("failed to build prometheus label"))]
222-
BuildPrometheusLabel { source: LabelError },
223-
224225
#[snafu(display("failed to build cluster resources label"))]
225226
BuildClusterResourcesLabel { source: LabelError },
226227

227-
#[snafu(display("failed to build role-group selector label"))]
228-
BuildRoleGroupSelectorLabel { source: LabelError },
229-
230228
#[snafu(display("failed to build role-group volume claim templates from config"))]
231229
BuildRoleGroupVolumeClaimTemplates { source: container::Error },
232230

@@ -250,6 +248,9 @@ pub enum Error {
250248
ResolveProductImage {
251249
source: product_image_selection::Error,
252250
},
251+
252+
#[snafu(display("failed to builds service"))]
253+
BuildService { source: service::Error },
253254
}
254255

255256
impl ReconcilerError for Error {
@@ -392,6 +393,20 @@ pub async fn reconcile_hdfs(
392393

393394
let rolegroup_ref = hdfs.rolegroup_ref(role_name, rolegroup_name);
394395

396+
let rg_service =
397+
rolegroup_headless_service(hdfs, &role, &rolegroup_ref, &resolved_product_image)
398+
.context(BuildServiceSnafu)?;
399+
let rg_metrics_service =
400+
rolegroup_metrics_service(hdfs, &role, &rolegroup_ref, &resolved_product_image)
401+
.context(BuildServiceSnafu)?;
402+
let rg_native_metrics_service = rolegroup_native_metrics_service(
403+
hdfs,
404+
&role,
405+
&rolegroup_ref,
406+
&resolved_product_image,
407+
)
408+
.context(BuildServiceSnafu)?;
409+
395410
// We need to split the creation and the usage of the "metadata" variable in two statements.
396411
// to avoid the compiler error "E0716 (temporary value dropped while borrowed)".
397412
let mut metadata = ObjectMetaBuilder::new();
@@ -411,17 +426,6 @@ pub async fn reconcile_hdfs(
411426
))
412427
.context(ObjectMetaSnafu)?;
413428

414-
let rg_service = rolegroup_service(hdfs, metadata, &role, &rolegroup_ref)?;
415-
416-
let rg_metrics_service =
417-
rolegroup_metrics_service(hdfs, &role, &rolegroup_ref, &resolved_product_image)?;
418-
let rg_native_metrics_service = rolegroup_native_metrics_service(
419-
hdfs,
420-
&role,
421-
&rolegroup_ref,
422-
&resolved_product_image,
423-
)?;
424-
425429
let rg_configmap = rolegroup_config_map(
426430
hdfs,
427431
&client.kubernetes_cluster_info,
@@ -584,195 +588,6 @@ pub async fn reconcile_hdfs(
584588
Ok(Action::await_change())
585589
}
586590

587-
fn rolegroup_service(
588-
hdfs: &v1alpha1::HdfsCluster,
589-
metadata: &ObjectMetaBuilder,
590-
role: &HdfsNodeRole,
591-
rolegroup_ref: &RoleGroupRef<v1alpha1::HdfsCluster>,
592-
) -> HdfsOperatorResult<Service> {
593-
tracing::info!("Setting up Service for {:?}", rolegroup_ref);
594-
595-
let service_spec = ServiceSpec {
596-
// Internal communication does not need to be exposed
597-
type_: Some("ClusterIP".to_string()),
598-
cluster_ip: Some("None".to_string()),
599-
ports: Some(
600-
hdfs.ports(role)
601-
.into_iter()
602-
.map(|(name, value)| ServicePort {
603-
name: Some(name),
604-
port: i32::from(value),
605-
protocol: Some("TCP".to_string()),
606-
..ServicePort::default()
607-
})
608-
.collect(),
609-
),
610-
selector: Some(
611-
hdfs.rolegroup_selector_labels(rolegroup_ref)
612-
.context(RoleGroupSelectorLabelsSnafu)?
613-
.into(),
614-
),
615-
publish_not_ready_addresses: Some(true),
616-
..ServiceSpec::default()
617-
};
618-
619-
Ok(Service {
620-
metadata: metadata.build(),
621-
spec: Some(service_spec),
622-
status: None,
623-
})
624-
}
625-
626-
fn rolegroup_metrics_service(
627-
hdfs: &v1alpha1::HdfsCluster,
628-
role: &HdfsNodeRole,
629-
rolegroup_ref: &RoleGroupRef<v1alpha1::HdfsCluster>,
630-
resolved_product_image: &ResolvedProductImage,
631-
) -> HdfsOperatorResult<Service> {
632-
tracing::info!("Setting up metrics Service for {:?}", rolegroup_ref);
633-
634-
let service_spec = ServiceSpec {
635-
// Internal communication does not need to be exposed
636-
type_: Some("ClusterIP".to_string()),
637-
cluster_ip: Some("None".to_string()),
638-
ports: Some(
639-
hdfs.metrics_ports(role)
640-
.into_iter()
641-
.map(|(name, value)| ServicePort {
642-
name: Some(name),
643-
port: i32::from(value),
644-
protocol: Some("TCP".to_string()),
645-
..ServicePort::default()
646-
})
647-
.collect(),
648-
),
649-
selector: Some(
650-
hdfs.rolegroup_selector_labels(rolegroup_ref)
651-
.context(RoleGroupSelectorLabelsSnafu)?
652-
.into(),
653-
),
654-
publish_not_ready_addresses: Some(true),
655-
..ServiceSpec::default()
656-
};
657-
658-
Ok(Service {
659-
metadata: ObjectMetaBuilder::new()
660-
.name_and_namespace(hdfs)
661-
.name(rolegroup_ref.rolegroup_metrics_service_name())
662-
.ownerreference_from_resource(hdfs, None, Some(true))
663-
.with_context(|_| ObjectMissingMetadataForOwnerRefSnafu {
664-
obj_ref: ObjectRef::from_obj(hdfs),
665-
})?
666-
.with_recommended_labels(build_recommended_labels(
667-
hdfs,
668-
RESOURCE_MANAGER_HDFS_CONTROLLER,
669-
&resolved_product_image.app_version_label_value,
670-
&rolegroup_ref.role,
671-
&rolegroup_ref.role_group,
672-
))
673-
.context(ObjectMetaSnafu)?
674-
.with_label(
675-
Label::try_from(("prometheus.io/scrape", "true"))
676-
.context(BuildPrometheusLabelSnafu)?,
677-
)
678-
.with_annotations(
679-
Annotations::try_from([
680-
("prometheus.io/path".to_owned(), "/metrics".to_owned()),
681-
(
682-
"prometheus.io/port".to_owned(),
683-
hdfs.metrics_port(role).to_string(),
684-
),
685-
("prometheus.io/scheme".to_owned(), "http".to_owned()),
686-
("prometheus.io/scrape".to_owned(), "true".to_owned()),
687-
])
688-
.expect("should be valid annotations"),
689-
)
690-
.build(),
691-
spec: Some(service_spec),
692-
status: None,
693-
})
694-
}
695-
696-
fn rolegroup_native_metrics_service(
697-
hdfs: &v1alpha1::HdfsCluster,
698-
role: &HdfsNodeRole,
699-
rolegroup_ref: &RoleGroupRef<v1alpha1::HdfsCluster>,
700-
resolved_product_image: &ResolvedProductImage,
701-
) -> HdfsOperatorResult<Service> {
702-
tracing::info!("Setting up native metrics Service for {:?}", rolegroup_ref);
703-
704-
let service_spec = ServiceSpec {
705-
// Internal communication does not need to be exposed
706-
type_: Some("ClusterIP".to_string()),
707-
cluster_ip: Some("None".to_string()),
708-
ports: Some(
709-
hdfs.native_metrics_ports(role)
710-
.into_iter()
711-
.map(|(name, value)| ServicePort {
712-
name: Some(name),
713-
port: i32::from(value),
714-
protocol: Some("TCP".to_string()),
715-
..ServicePort::default()
716-
})
717-
.collect(),
718-
),
719-
selector: Some(
720-
hdfs.rolegroup_selector_labels(rolegroup_ref)
721-
.context(RoleGroupSelectorLabelsSnafu)?
722-
.into(),
723-
),
724-
publish_not_ready_addresses: Some(true),
725-
..ServiceSpec::default()
726-
};
727-
728-
Ok(Service {
729-
metadata: ObjectMetaBuilder::new()
730-
.name_and_namespace(hdfs)
731-
.name(format!(
732-
"{name}-native-metrics",
733-
name = rolegroup_ref.object_name()
734-
))
735-
.ownerreference_from_resource(hdfs, None, Some(true))
736-
.with_context(|_| ObjectMissingMetadataForOwnerRefSnafu {
737-
obj_ref: ObjectRef::from_obj(hdfs),
738-
})?
739-
.with_recommended_labels(build_recommended_labels(
740-
hdfs,
741-
RESOURCE_MANAGER_HDFS_CONTROLLER,
742-
&resolved_product_image.app_version_label_value,
743-
&rolegroup_ref.role,
744-
&rolegroup_ref.role_group,
745-
))
746-
.context(ObjectMetaSnafu)?
747-
.with_label(
748-
Label::try_from(("prometheus.io/scrape", "true"))
749-
.context(BuildPrometheusLabelSnafu)?,
750-
)
751-
.with_annotations(
752-
Annotations::try_from([
753-
("prometheus.io/path".to_owned(), "/prom".to_owned()),
754-
(
755-
"prometheus.io/port".to_owned(),
756-
hdfs.native_metrics_port(role).to_string(),
757-
),
758-
(
759-
"prometheus.io/scheme".to_owned(),
760-
if hdfs.has_https_enabled() {
761-
"https".to_owned()
762-
} else {
763-
"http".to_owned()
764-
},
765-
),
766-
("prometheus.io/scrape".to_owned(), "true".to_owned()),
767-
])
768-
.expect("should be valid annotations"),
769-
)
770-
.build(),
771-
spec: Some(service_spec),
772-
status: None,
773-
})
774-
}
775-
776591
#[allow(clippy::too_many_arguments)]
777592
fn rolegroup_config_map(
778593
hdfs: &v1alpha1::HdfsCluster,
@@ -1026,7 +841,6 @@ fn rolegroup_statefulset(
1026841
) -> HdfsOperatorResult<StatefulSet> {
1027842
tracing::info!("Setting up StatefulSet for {:?}", rolegroup_ref);
1028843

1029-
let object_name = rolegroup_ref.object_name();
1030844
// PodBuilder for StatefulSet Pod template.
1031845
let mut pb = PodBuilder::new();
1032846

@@ -1061,7 +875,7 @@ fn rolegroup_statefulset(
1061875
merged_config,
1062876
env_overrides,
1063877
&hdfs.spec.cluster_config.zookeeper_config_map_name,
1064-
&object_name,
878+
&rolegroup_ref.object_name(),
1065879
namenode_podrefs,
1066880
&rolegroup_selector_labels,
1067881
)
@@ -1091,7 +905,7 @@ fn rolegroup_statefulset(
1091905
match_labels: Some(rolegroup_selector_labels.into()),
1092906
..LabelSelector::default()
1093907
},
1094-
service_name: Some(object_name),
908+
service_name: Some(rolegroup_ref.rolegroup_headless_service_name()),
1095909
template: pod_template,
1096910

1097911
volume_claim_templates: Some(pvcs),

rust/operator-binary/src/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ mod hdfs_controller;
4747
mod operations;
4848
mod product_logging;
4949
mod security;
50+
mod service;
5051

5152
mod built_info {
5253
include!(concat!(env!("OUT_DIR"), "/built.rs"));

0 commit comments

Comments
 (0)