-
-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathdiscovery.rs
111 lines (101 loc) · 3.53 KB
/
discovery.rs
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
use snafu::{ResultExt, Snafu};
use stackable_operator::{
builder::{configmap::ConfigMapBuilder, meta::ObjectMetaBuilder},
commons::product_image_selection::ResolvedProductImage,
k8s_openapi::api::core::v1::ConfigMap,
kube::{ResourceExt, runtime::reflector::ObjectRef},
utils::cluster_info::KubernetesClusterInfo,
};
use crate::{
build_recommended_labels,
config::{CoreSiteConfigBuilder, HdfsSiteConfigBuilder},
crd::{
HdfsNodeRole, HdfsPodRef,
constants::{CORE_SITE_XML, HDFS_SITE_XML},
v1alpha1,
},
security::kerberos,
};
type Result<T, E = Error> = std::result::Result<T, E>;
#[derive(Snafu, Debug)]
#[allow(clippy::enum_variant_names)]
pub enum Error {
#[snafu(display("object {hdfs} is missing metadata to build owner reference"))]
ObjectMissingMetadataForOwnerRef {
source: stackable_operator::builder::meta::Error,
hdfs: ObjectRef<v1alpha1::HdfsCluster>,
},
#[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,
},
#[snafu(display("failed to build security discovery config map"))]
BuildSecurityDiscoveryConfigMap { source: kerberos::Error },
}
/// Creates a discovery config map containing the `hdfs-site.xml` and `core-site.xml`
/// for clients.
pub fn build_discovery_configmap(
hdfs: &v1alpha1::HdfsCluster,
cluster_info: &KubernetesClusterInfo,
controller: &str,
namenode_podrefs: &[HdfsPodRef],
resolved_product_image: &ResolvedProductImage,
) -> Result<ConfigMap> {
let metadata = ObjectMetaBuilder::new()
.name_and_namespace(hdfs)
.ownerreference_from_resource(hdfs, None, Some(true))
.context(ObjectMissingMetadataForOwnerRefSnafu {
hdfs: ObjectRef::from_obj(hdfs),
})?
.with_recommended_labels(build_recommended_labels(
hdfs,
controller,
&resolved_product_image.app_version_label,
&HdfsNodeRole::Name.to_string(),
"discovery",
))
.context(ObjectMetaSnafu)?
.build();
ConfigMapBuilder::new()
.metadata(metadata)
.add_data(
HDFS_SITE_XML,
build_discovery_hdfs_site_xml(hdfs, cluster_info, hdfs.name_any(), namenode_podrefs),
)
.add_data(
CORE_SITE_XML,
build_discovery_core_site_xml(hdfs, cluster_info, hdfs.name_any())?,
)
.build()
.context(BuildConfigMapSnafu)
}
fn build_discovery_hdfs_site_xml(
hdfs: &v1alpha1::HdfsCluster,
cluster_info: &KubernetesClusterInfo,
logical_name: String,
namenode_podrefs: &[HdfsPodRef],
) -> String {
HdfsSiteConfigBuilder::new(logical_name)
.dfs_name_services()
.dfs_ha_namenodes(namenode_podrefs)
.dfs_namenode_rpc_address_ha(cluster_info, namenode_podrefs)
.dfs_namenode_http_address_ha(hdfs, cluster_info, namenode_podrefs)
.dfs_client_failover_proxy_provider()
.security_discovery_config(hdfs)
.build_as_xml()
}
fn build_discovery_core_site_xml(
hdfs: &v1alpha1::HdfsCluster,
cluster_info: &KubernetesClusterInfo,
logical_name: String,
) -> Result<String> {
Ok(CoreSiteConfigBuilder::new(logical_name)
.fs_default_fs()
.security_discovery_config(hdfs, cluster_info)
.context(BuildSecurityDiscoveryConfigMapSnafu)?
.build_as_xml())
}