-
-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathdiscovery.rs
More file actions
113 lines (102 loc) · 3.62 KB
/
Copy pathdiscovery.rs
File metadata and controls
113 lines (102 loc) · 3.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
use snafu::{OptionExt, ResultExt, Snafu};
use stackable_operator::{
builder::{configmap::ConfigMapBuilder, meta::ObjectMetaBuilder},
commons::product_image_selection::ResolvedProductImage,
crd::listener::v1alpha1::Listener,
k8s_openapi::api::core::v1::ConfigMap,
kube::{Resource, runtime::reflector::ObjectRef},
};
use crate::{
controller::build_recommended_labels,
crd::{HiveRole, v1alpha1},
listener::build_listener_connection_string,
};
#[derive(Snafu, Debug)]
pub enum Error {
#[snafu(display("object is missing metadata to build owner reference {hive}"))]
ObjectMissingMetadataForOwnerRef {
source: stackable_operator::builder::meta::Error,
hive: ObjectRef<v1alpha1::HiveCluster>,
},
#[snafu(display("could not build discovery config map for {obj_ref}"))]
DiscoveryConfigMap {
source: stackable_operator::builder::configmap::Error,
obj_ref: ObjectRef<v1alpha1::HiveCluster>,
},
#[snafu(display("invalid owner name for discovery ConfigMap"))]
InvalidOwnerNameForDiscoveryConfigMap,
#[snafu(display("failed to build Metadata"))]
MetadataBuild {
source: stackable_operator::builder::meta::Error,
},
#[snafu(display("failed to configure listener discovery configmap"))]
ListenerConfiguration { source: crate::listener::Error },
}
/// Builds discovery [`ConfigMap`]s for connecting to a [`v1alpha1::HiveCluster`] for all expected
/// scenarios.
pub async fn build_discovery_configmaps(
owner: &impl Resource<DynamicType = ()>,
hive: &v1alpha1::HiveCluster,
hive_role: HiveRole,
resolved_product_image: &ResolvedProductImage,
chroot: Option<&str>,
listener: Listener,
) -> Result<Vec<ConfigMap>, Error> {
let name = owner
.meta()
.name
.as_ref()
.context(InvalidOwnerNameForDiscoveryConfigMapSnafu)?;
let discovery_configmaps = vec![build_discovery_configmap(
name,
owner,
hive,
hive_role,
resolved_product_image,
chroot,
listener,
)?];
Ok(discovery_configmaps)
}
/// Build a discovery [`ConfigMap`] containing information about how to connect to a certain
/// [`v1alpha1::HiveCluster`].
///
/// Data is coming from the [`Listener`] objects. Connection string is only build by [`build_listener_connection_string`].
fn build_discovery_configmap(
name: &str,
owner: &impl Resource<DynamicType = ()>,
hive: &v1alpha1::HiveCluster,
hive_role: HiveRole,
resolved_product_image: &ResolvedProductImage,
chroot: Option<&str>,
listener: Listener,
) -> Result<ConfigMap, Error> {
let mut discovery_configmap = ConfigMapBuilder::new();
discovery_configmap.metadata(
ObjectMetaBuilder::new()
.name_and_namespace(hive)
.name(name)
.ownerreference_from_resource(owner, None, Some(true))
.with_context(|_| ObjectMissingMetadataForOwnerRefSnafu {
hive: ObjectRef::from_obj(hive),
})?
.with_recommended_labels(build_recommended_labels(
hive,
&resolved_product_image.app_version_label,
&hive_role.to_string(),
"discovery",
))
.context(MetadataBuildSnafu)?
.build(),
);
discovery_configmap.add_data(
"HIVE".to_string(),
build_listener_connection_string(listener, &hive_role.to_string(), chroot)
.context(ListenerConfigurationSnafu)?,
);
discovery_configmap
.build()
.with_context(|_| DiscoveryConfigMapSnafu {
obj_ref: ObjectRef::from_obj(hive),
})
}