Skip to content

Commit c1266d2

Browse files
razvansbernauer
andcommitted
Make pod overrides usable without roles. (#616)
Required for: stackabletech/spark-k8s-operator#256 - Make pub_overrides_schema public. - Make PodTemplateSpec implement Atomic. - Update CHANGELOG.md Co-authored-by: Sebastian Bernauer <sebastian.bernauer@stackable.de>
1 parent 27f4653 commit c1266d2

File tree

4 files changed

+81
-2
lines changed

4 files changed

+81
-2
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,12 @@ All notable changes to this project will be documented in this file.
88

99
- Secrets can now be requested in a custom format ([#610]).
1010

11+
### Changed
12+
13+
- Make pod overrides usable independently of roles (like in the case of the Spark operator) ([#616])
14+
1115
[#610]: https://github.com/stackabletech/operator-rs/pull/610
16+
[#616]: https://github.com/stackabletech/operator-rs/pull/616
1217

1318
## [0.42.2] - 2023-06-27
1419

src/config/fragment.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use super::merge::Merge;
1515
#[cfg(doc)]
1616
use crate::role_utils::{Role, RoleGroup};
1717

18+
use k8s_openapi::api::core::v1::PodTemplateSpec;
1819
use snafu::Snafu;
1920

2021
pub use stackable_operator_derive::Fragment;
@@ -192,6 +193,17 @@ impl<T: FromFragment> FromFragment for Option<T> {
192193
}
193194
}
194195
}
196+
impl FromFragment for PodTemplateSpec {
197+
type Fragment = PodTemplateSpec;
198+
type RequiredFragment = PodTemplateSpec;
199+
200+
fn from_fragment(
201+
fragment: Self::Fragment,
202+
_validator: Validator,
203+
) -> Result<Self, ValidationError> {
204+
Ok(fragment)
205+
}
206+
}
195207

196208
/// Validates a [`Fragment`](`FromFragment::Fragment`), and turns it into its corresponding [`FromFragment`] type if successful.
197209
///

src/config/merge.rs

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use k8s_openapi::{
2-
api::core::v1::{NodeAffinity, PodAffinity, PodAntiAffinity},
2+
api::core::v1::{NodeAffinity, PodAffinity, PodAntiAffinity, PodTemplateSpec},
33
apimachinery::pkg::{api::resource::Quantity, apis::meta::v1::LabelSelector},
4+
DeepMerge,
45
};
56
use std::{
67
collections::{btree_map, hash_map, BTreeMap, HashMap},
@@ -83,6 +84,11 @@ impl<K: Hash + Eq + Clone, V: Merge + Clone> Merge for HashMap<K, V> {
8384
}
8485
}
8586
}
87+
impl Merge for PodTemplateSpec {
88+
fn merge(&mut self, defaults: &Self) {
89+
self.merge_from(defaults.clone())
90+
}
91+
}
8692

8793
/// Moving version of [`Merge::merge`], to produce slightly nicer test output
8894
pub fn merge<T: Merge>(mut overrides: T, defaults: &T) -> T {
@@ -151,6 +157,7 @@ impl<T: Atomic> Merge for Option<T> {
151157

152158
#[cfg(test)]
153159
mod tests {
160+
use k8s_openapi::api::core::v1::{PodSpec, PodTemplateSpec};
154161
use std::collections::{BTreeMap, HashMap};
155162

156163
use super::{merge, Merge};
@@ -425,4 +432,59 @@ mod tests {
425432
BTreeMap::from([("a", Acc(4)), ("b", Acc(2)), ("c", Acc(5))])
426433
);
427434
}
435+
436+
#[test]
437+
fn merge_pod_template_spec() {
438+
assert_eq!(
439+
merge(
440+
PodTemplateSpec {
441+
spec: Some(PodSpec {
442+
service_account_name: Some("my-sa".to_string()),
443+
..PodSpec::default()
444+
}),
445+
..PodTemplateSpec::default()
446+
},
447+
&PodTemplateSpec {
448+
spec: Some(PodSpec {
449+
priority: Some(3000),
450+
..PodSpec::default()
451+
}),
452+
..PodTemplateSpec::default()
453+
}
454+
),
455+
PodTemplateSpec {
456+
spec: Some(PodSpec {
457+
service_account_name: Some("my-sa".to_string()),
458+
priority: Some(3000),
459+
..PodSpec::default()
460+
}),
461+
..PodTemplateSpec::default()
462+
}
463+
);
464+
assert_eq!(
465+
merge(
466+
PodTemplateSpec {
467+
spec: Some(PodSpec {
468+
service_account_name: Some("sa-to-be-overridden".to_string()),
469+
..PodSpec::default()
470+
}),
471+
..PodTemplateSpec::default()
472+
},
473+
&PodTemplateSpec {
474+
spec: Some(PodSpec {
475+
service_account_name: Some("sa-override".to_string()),
476+
..PodSpec::default()
477+
}),
478+
..PodTemplateSpec::default()
479+
}
480+
),
481+
PodTemplateSpec {
482+
spec: Some(PodSpec {
483+
service_account_name: Some("sa-override".to_string()),
484+
..PodSpec::default()
485+
}),
486+
..PodTemplateSpec::default()
487+
}
488+
);
489+
}
428490
}

src/role_utils.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ pub struct CommonConfiguration<T> {
134134
/// Additionally all docs are removed, as the resulting Stackable CRD objects where to big for Kubernetes.
135135
/// E.g. the HdfsCluster CRD increased to ~3.2 MB (which is over the limit of 3MB), after stripping
136136
/// the docs it went down to ~1.3 MiB.
137-
fn pod_overrides_schema(gen: &mut schemars::gen::SchemaGenerator) -> Schema {
137+
pub fn pod_overrides_schema(gen: &mut schemars::gen::SchemaGenerator) -> Schema {
138138
let mut schema = PodTemplateSpec::json_schema(gen);
139139
SimplifyOverrideSchema.visit_schema(&mut schema);
140140
if let Schema::Object(schema) = &mut schema {

0 commit comments

Comments
 (0)