Skip to content

Commit 559360d

Browse files
committed
Added FieldPathEnvVar enum.
1 parent edcdda7 commit 559360d

File tree

1 file changed

+36
-5
lines changed

1 file changed

+36
-5
lines changed

src/builder.rs

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ use k8s_openapi::apimachinery::pkg::apis::meta::v1::{
2121
};
2222
use kube::{Resource, ResourceExt};
2323
use std::collections::BTreeMap;
24+
use std::fmt;
2425
use tracing::warn;
2526

2627
/// A builder to build [`ConfigMap`] objects.
@@ -214,6 +215,28 @@ impl SecurityContextBuilder {
214215
}
215216
}
216217

218+
/// Downward API capabilities available via `fieldRef`
219+
/// See: https://kubernetes.io/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information/#capabilities-of-the-downward-api
220+
#[derive(Debug)]
221+
pub enum FieldPathEnvVar {
222+
Name,
223+
Namespace,
224+
UID,
225+
Labels(String),
226+
Annotations(String),
227+
}
228+
229+
impl fmt::Display for FieldPathEnvVar {
230+
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
231+
match self {
232+
FieldPathEnvVar::Name => write!(f, "metadata.name"),
233+
FieldPathEnvVar::Namespace => write!(f, "metadata.namespace"),
234+
FieldPathEnvVar::UID => write!(f, "metadata.uid"),
235+
FieldPathEnvVar::Labels(name) => write!(f, "metadata.labels['{name}']"),
236+
FieldPathEnvVar::Annotations(name) => write!(f, "metadata.annotations['{name}']"),
237+
}
238+
}
239+
}
217240
/// A builder to build [`Container`] objects.
218241
///
219242
/// This will automatically create the necessary volumes and mounts for each `ConfigMap` which is added.
@@ -261,16 +284,16 @@ impl ContainerBuilder {
261284
}
262285

263286
/// Used for pushing down attributes like the Pod's namespace into the containers.
264-
pub fn add_env_var_from_field_ref(
287+
pub fn add_env_var_from_field_path(
265288
&mut self,
266289
name: impl Into<String>,
267-
value: impl Into<String>,
290+
field_path: FieldPathEnvVar,
268291
) -> &mut Self {
269292
self.env.get_or_insert_with(Vec::new).push(EnvVar {
270293
name: name.into(),
271294
value_from: Some(EnvVarSource {
272295
field_ref: Some(ObjectFieldSelector {
273-
field_path: value.into(),
296+
field_path: field_path.to_string(),
274297
..ObjectFieldSelector::default()
275298
}),
276299
..EnvVarSource::default()
@@ -1532,8 +1555,8 @@ impl VolumeMountBuilder {
15321555
mod tests {
15331556
use crate::builder::{
15341557
ConfigMapBuilder, ContainerBuilder, ContainerPortBuilder, EventBuilder, EventType,
1535-
NodeBuilder, ObjectMetaBuilder, PodBuilder, PodSecurityContextBuilder, VolumeBuilder,
1536-
VolumeMountBuilder,
1558+
FieldPathEnvVar, NodeBuilder, ObjectMetaBuilder, PodBuilder, PodSecurityContextBuilder,
1559+
VolumeBuilder, VolumeMountBuilder,
15371560
};
15381561
use k8s_openapi::api::core::v1::{
15391562
EnvVar, Pod, PodAffinity, PodAffinityTerm, PodSecurityContext, ResourceRequirements,
@@ -1885,4 +1908,12 @@ mod tests {
18851908
.unwrap();
18861909
assert_eq!(pod.metadata.name.unwrap(), "foo");
18871910
}
1911+
1912+
#[test]
1913+
pub fn test_field_ref_env_var_serialization() {
1914+
assert_eq!(
1915+
"metadata.labels['some-label-name']",
1916+
FieldPathEnvVar::Labels("some-label-name".to_string()).to_string()
1917+
);
1918+
}
18881919
}

0 commit comments

Comments
 (0)