Skip to content

Commit 3334481

Browse files
committed
use v2 ownerref, add HasName and HasUid traits N.B. compiled against local/temp op-rs
1 parent ae62c32 commit 3334481

4 files changed

Lines changed: 54 additions & 48 deletions

File tree

rust/operator-binary/src/airflow_controller.rs

Lines changed: 19 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ use stackable_operator::{
6363
statefulset::StatefulSetConditionBuilder,
6464
},
6565
utils::COMMON_BASH_TRAP_FUNCTIONS,
66+
v2::builder::meta::ownerreference_from_resource,
6667
};
6768
use strum::{EnumDiscriminants, IntoStaticStr};
6869

@@ -128,11 +129,6 @@ pub enum Error {
128129
rolegroup: RoleGroupRef<v1alpha2::AirflowCluster>,
129130
},
130131

131-
#[snafu(display("object is missing metadata to build owner reference"))]
132-
ObjectMissingMetadataForOwnerRef {
133-
source: stackable_operator::builder::meta::Error,
134-
},
135-
136132
#[snafu(display("failed to patch service account"))]
137133
ApplyServiceAccount {
138134
source: stackable_operator::cluster_resources::Error,
@@ -442,7 +438,7 @@ pub async fn reconcile_airflow(
442438
&& let Some(listener_group_name) = &role_config.group_listener_name
443439
{
444440
let rg_group_listener = build_group_listener(
445-
airflow,
441+
&validated_cluster,
446442
build_recommended_labels(
447443
airflow,
448444
AIRFLOW_CONTROLLER_NAME,
@@ -497,7 +493,7 @@ pub async fn reconcile_airflow(
497493
.context(LabelBuildSnafu)?;
498494

499495
let rg_headless_service = build_rolegroup_headless_service(
500-
airflow,
496+
&validated_cluster,
501497
&rolegroup,
502498
role_group_service_recommended_labels.clone(),
503499
role_group_service_selector.clone().into(),
@@ -512,7 +508,7 @@ pub async fn reconcile_airflow(
512508
})?;
513509

514510
let rg_metrics_service = build_rolegroup_metrics_service(
515-
airflow,
511+
&validated_cluster,
516512
&rolegroup,
517513
role_group_service_recommended_labels,
518514
role_group_service_selector.into(),
@@ -632,8 +628,7 @@ async fn build_executor_template(
632628

633629
let worker_pod_template_config_map = build_executor_template_config_map(
634630
airflow,
635-
&validated_cluster.image,
636-
&validated_cluster.cluster_config.authentication_config,
631+
validated_cluster,
637632
metadata_database_connection_details,
638633
&rbac_sa.name_unchecked(),
639634
&merged_executor_config,
@@ -650,21 +645,19 @@ async fn build_executor_template(
650645
}
651646

652647
fn build_rolegroup_metadata(
653-
airflow: &v1alpha2::AirflowCluster,
654-
resolved_product_image: &&ResolvedProductImage,
648+
cluster: &ValidatedCluster,
655649
rolegroup: &&RoleGroupRef<v1alpha2::AirflowCluster>,
656650
prometheus_label: Label,
657651
name: String,
658652
) -> Result<ObjectMeta, Error> {
659653
let metadata = ObjectMetaBuilder::new()
660-
.name_and_namespace(airflow)
654+
.name_and_namespace(cluster)
661655
.name(name)
662-
.ownerreference_from_resource(airflow, None, Some(true))
663-
.context(ObjectMissingMetadataForOwnerRefSnafu)?
656+
.ownerreference(ownerreference_from_resource(cluster, None, Some(true)))
664657
.with_recommended_labels(&build_recommended_labels(
665-
airflow,
658+
cluster,
666659
AIRFLOW_CONTROLLER_NAME,
667-
&resolved_product_image.app_version_label_value,
660+
&cluster.image.app_version_label_value,
668661
&rolegroup.role,
669662
&rolegroup.role_group,
670663
))
@@ -675,17 +668,16 @@ fn build_rolegroup_metadata(
675668
}
676669

677670
pub fn build_group_listener(
678-
airflow: &v1alpha2::AirflowCluster,
671+
cluster: &ValidatedCluster,
679672
object_labels: ObjectLabels<v1alpha2::AirflowCluster>,
680673
listener_class: String,
681674
listener_group_name: String,
682675
) -> Result<listener::v1alpha1::Listener> {
683676
Ok(listener::v1alpha1::Listener {
684677
metadata: ObjectMetaBuilder::new()
685-
.name_and_namespace(airflow)
678+
.name_and_namespace(cluster)
686679
.name(listener_group_name)
687-
.ownerreference_from_resource(airflow, None, Some(true))
688-
.context(ObjectMissingMetadataForOwnerRefSnafu)?
680+
.ownerreference(ownerreference_from_resource(cluster, None, Some(true)))
689681
.with_recommended_labels(&object_labels)
690682
.context(ObjectMetaSnafu)?
691683
.build(),
@@ -978,8 +970,7 @@ fn build_server_rolegroup_statefulset(
978970
Label::try_from(("restarter.stackable.tech/enabled", "true")).context(BuildLabelSnafu)?;
979971

980972
let metadata = build_rolegroup_metadata(
981-
airflow,
982-
&resolved_product_image,
973+
validated_cluster,
983974
&rolegroup_ref,
984975
restarter_label,
985976
rolegroup_ref.object_name(),
@@ -1048,8 +1039,7 @@ fn build_logging_container(
10481039
#[allow(clippy::too_many_arguments)]
10491040
fn build_executor_template_config_map(
10501041
airflow: &v1alpha2::AirflowCluster,
1051-
resolved_product_image: &ResolvedProductImage,
1052-
authentication_config: &AirflowClientAuthenticationDetailsResolved,
1042+
cluster: &ValidatedCluster,
10531043
metadata_database_connection_details: &SqlAlchemyDatabaseConnectionDetails,
10541044
sa_name: &str,
10551045
merged_executor_config: &ExecutorConfig,
@@ -1058,6 +1048,9 @@ fn build_executor_template_config_map(
10581048
rolegroup_ref: &RoleGroupRef<v1alpha2::AirflowCluster>,
10591049
git_sync_resources: &git_sync::v1alpha2::GitSyncResources,
10601050
) -> Result<ConfigMap> {
1051+
let resolved_product_image = &cluster.image;
1052+
let authentication_config = &cluster.cluster_config.authentication_config;
1053+
10611054
let mut pb = PodBuilder::new();
10621055
let pb_metadata = ObjectMetaBuilder::new()
10631056
.with_recommended_labels(&build_recommended_labels(
@@ -1167,8 +1160,7 @@ fn build_executor_template_config_map(
11671160
ObjectMetaBuilder::new()
11681161
.name_and_namespace(airflow)
11691162
.name(airflow.executor_template_configmap_name())
1170-
.ownerreference_from_resource(airflow, None, Some(true))
1171-
.context(ObjectMissingMetadataForOwnerRefSnafu)?
1163+
.ownerreference(ownerreference_from_resource(cluster, None, Some(true)))
11721164
.with_recommended_labels(&build_recommended_labels(
11731165
airflow,
11741166
AIRFLOW_CONTROLLER_NAME,

rust/operator-binary/src/controller/build/config_map.rs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use stackable_operator::{
1212
spec::{ContainerLogConfig, ContainerLogConfigChoice, Logging},
1313
},
1414
role_utils::RoleGroupRef,
15+
v2::builder::meta::ownerreference_from_resource,
1516
};
1617

1718
use crate::{
@@ -33,11 +34,6 @@ pub enum Error {
3334
rolegroup: RoleGroupRef<v1alpha2::AirflowCluster>,
3435
},
3536

36-
#[snafu(display("object is missing metadata to build owner reference"))]
37-
ObjectMissingMetadataForOwnerRef {
38-
source: stackable_operator::builder::meta::Error,
39-
},
40-
4137
#[snafu(display("failed to build object meta"))]
4238
ObjectMeta {
4339
source: stackable_operator::builder::meta::Error,
@@ -80,8 +76,7 @@ pub fn build_rolegroup_config_map(
8076
ObjectMetaBuilder::new()
8177
.name_and_namespace(validated_cluster)
8278
.name(rolegroup.object_name())
83-
.ownerreference_from_resource(validated_cluster, None, Some(true))
84-
.context(ObjectMissingMetadataForOwnerRefSnafu)?
79+
.ownerreference(ownerreference_from_resource(validated_cluster, None, Some(true)))
8580
.with_recommended_labels(&build_recommended_labels(
8681
validated_cluster,
8782
AIRFLOW_CONTROLLER_NAME,

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
use std::collections::BTreeMap;
22

3+
use std::str::FromStr;
4+
35
use stackable_operator::{
46
commons::product_image_selection::ResolvedProductImage,
57
kube::{Resource, ResourceExt, api::ObjectMeta},
8+
v2::{HasName, HasUid, types::kubernetes::Uid},
69
};
710

811
use crate::crd::{
@@ -114,3 +117,22 @@ impl Resource for ValidatedCluster {
114117
&mut self.metadata
115118
}
116119
}
120+
121+
impl HasName for ValidatedCluster {
122+
fn to_name(&self) -> String {
123+
self.name_any()
124+
}
125+
}
126+
127+
impl HasUid for ValidatedCluster {
128+
fn to_uid(&self) -> Uid {
129+
Uid::from_str(
130+
&self
131+
.metadata
132+
.uid
133+
.clone()
134+
.expect("the uid is captured during validation"),
135+
)
136+
.expect("the uid is a valid Kubernetes UID")
137+
}
138+
}

rust/operator-binary/src/service.rs

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,19 @@ use stackable_operator::{
66
k8s_openapi::api::core::v1::{Service, ServicePort, ServiceSpec},
77
kvp::{Annotations, Labels, ObjectLabels},
88
role_utils::RoleGroupRef,
9+
v2::builder::meta::ownerreference_from_resource,
910
};
1011

11-
use crate::crd::{HTTP_PORT, HTTP_PORT_NAME, METRICS_PORT, METRICS_PORT_NAME, v1alpha2};
12+
use crate::{
13+
controller::ValidatedCluster,
14+
crd::{HTTP_PORT, HTTP_PORT_NAME, METRICS_PORT, METRICS_PORT_NAME, v1alpha2},
15+
};
1216

1317
pub const METRICS_SERVICE_SUFFIX: &str = "metrics";
1418
pub const HEADLESS_SERVICE_SUFFIX: &str = "headless";
1519

1620
#[derive(Snafu, Debug)]
1721
pub enum Error {
18-
#[snafu(display("object is missing metadata to build owner reference"))]
19-
ObjectMissingMetadataForOwnerRef {
20-
source: stackable_operator::builder::meta::Error,
21-
},
22-
2322
#[snafu(display("failed to build Metadata"))]
2423
MetadataBuild {
2524
source: stackable_operator::builder::meta::Error,
@@ -34,20 +33,19 @@ pub enum Error {
3433
/// The rolegroup headless [`Service`] is a service that allows direct access to the instances of a certain rolegroup
3534
/// This is mostly useful for internal communication between peers, or for clients that perform client-side load balancing.
3635
pub fn build_rolegroup_headless_service(
37-
airflow: &v1alpha2::AirflowCluster,
36+
cluster: &ValidatedCluster,
3837
rolegroup_ref: &RoleGroupRef<v1alpha2::AirflowCluster>,
3938
object_labels: ObjectLabels<v1alpha2::AirflowCluster>,
4039
selector: BTreeMap<String, String>,
4140
) -> Result<Service, Error> {
4241
let ports = headless_service_ports();
4342

4443
let metadata = ObjectMetaBuilder::new()
45-
.name_and_namespace(airflow)
44+
.name_and_namespace(cluster)
4645
.name(rolegroup_headless_service_name(
4746
&rolegroup_ref.object_name(),
4847
))
49-
.ownerreference_from_resource(airflow, None, Some(true))
50-
.context(ObjectMissingMetadataForOwnerRefSnafu)?
48+
.ownerreference(ownerreference_from_resource(cluster, None, Some(true)))
5149
.with_recommended_labels(&object_labels)
5250
.context(MetadataBuildSnafu)?
5351
.build();
@@ -71,18 +69,17 @@ pub fn build_rolegroup_headless_service(
7169

7270
/// The rolegroup metrics [`Service`] is a service that exposes metrics and a prometheus scraping label.
7371
pub fn build_rolegroup_metrics_service(
74-
airflow: &v1alpha2::AirflowCluster,
72+
cluster: &ValidatedCluster,
7573
rolegroup_ref: &RoleGroupRef<v1alpha2::AirflowCluster>,
7674
object_labels: ObjectLabels<v1alpha2::AirflowCluster>,
7775
selector: BTreeMap<String, String>,
7876
) -> Result<Service, Error> {
7977
let ports = metrics_service_ports();
8078

8179
let metadata = ObjectMetaBuilder::new()
82-
.name_and_namespace(airflow)
80+
.name_and_namespace(cluster)
8381
.name(rolegroup_metrics_service_name(&rolegroup_ref.object_name()))
84-
.ownerreference_from_resource(airflow, None, Some(true))
85-
.context(ObjectMissingMetadataForOwnerRefSnafu)?
82+
.ownerreference(ownerreference_from_resource(cluster, None, Some(true)))
8683
.with_recommended_labels(&object_labels)
8784
.context(MetadataBuildSnafu)?
8885
.with_labels(prometheus_labels())

0 commit comments

Comments
 (0)