-
-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathdiscovery.rs
More file actions
99 lines (89 loc) · 3.14 KB
/
discovery.rs
File metadata and controls
99 lines (89 loc) · 3.14 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
use snafu::{OptionExt, ResultExt, Snafu};
use stackable_opa_operator::crd::v1alpha1;
use stackable_operator::{
builder::{configmap::ConfigMapBuilder, meta::ObjectMetaBuilder},
commons::product_image_selection::ResolvedProductImage,
k8s_openapi::api::core::v1::{ConfigMap, Service},
kube::{Resource, ResourceExt, runtime::reflector::ObjectRef},
utils::cluster_info::KubernetesClusterInfo,
};
use crate::{controller::build_recommended_labels, service::APP_PORT};
#[derive(Snafu, Debug)]
pub enum Error {
#[snafu(display("object {} is missing metadata to build owner reference", opa))]
ObjectMissingMetadataForOwnerRef {
source: stackable_operator::builder::meta::Error,
opa: ObjectRef<v1alpha1::OpaCluster>,
},
#[snafu(display("object has no name associated"))]
NoName,
#[snafu(display("object has no namespace associated"))]
NoNamespace,
#[snafu(display("failed to build ConfigMap"))]
BuildConfigMap {
source: stackable_operator::builder::configmap::Error,
},
#[snafu(display("failed to build object meta data"))]
ObjectMeta {
source: stackable_operator::builder::meta::Error,
},
}
/// Builds discovery [`ConfigMap`]s for connecting to a [`v1alpha1::OpaCluster`] for all expected scenarios
pub fn build_discovery_configmaps(
owner: &impl Resource<DynamicType = ()>,
opa: &v1alpha1::OpaCluster,
resolved_product_image: &ResolvedProductImage,
svc: &Service,
cluster_info: &KubernetesClusterInfo,
) -> Result<Vec<ConfigMap>, Error> {
let name = owner.name_any();
Ok(vec![build_discovery_configmap(
&name,
owner,
opa,
resolved_product_image,
svc,
cluster_info,
)?])
}
/// Build a discovery [`ConfigMap`] containing information about how to connect to a certain [`v1alpha1::OpaCluster`]
fn build_discovery_configmap(
name: &str,
owner: &impl Resource<DynamicType = ()>,
opa: &v1alpha1::OpaCluster,
resolved_product_image: &ResolvedProductImage,
svc: &Service,
cluster_info: &KubernetesClusterInfo,
) -> Result<ConfigMap, Error> {
let url = format!(
"http://{name}.{namespace}.svc.{cluster_domain}:{port}/",
name = svc.metadata.name.as_deref().context(NoNameSnafu)?,
namespace = svc
.metadata
.namespace
.as_deref()
.context(NoNamespaceSnafu)?,
cluster_domain = cluster_info.cluster_domain,
port = APP_PORT
);
let metadata = ObjectMetaBuilder::new()
.name_and_namespace(opa)
.name(name)
.ownerreference_from_resource(owner, None, Some(true))
.with_context(|_| ObjectMissingMetadataForOwnerRefSnafu {
opa: ObjectRef::from_obj(opa),
})?
.with_recommended_labels(build_recommended_labels(
opa,
&resolved_product_image.app_version_label_value,
&v1alpha1::OpaRole::Server.to_string(),
"discovery",
))
.context(ObjectMetaSnafu)?
.build();
ConfigMapBuilder::new()
.metadata(metadata)
.add_data("OPA", url)
.build()
.context(BuildConfigMapSnafu)
}