Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions crates/stackable-operator/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file.

## [Unreleased]

### Changed

- BREAKING: `PodSecurityContextBuilder::new` was removed in favor of `PodSecurityContextBuilder::with_stackable_defaults`.
This function already sets up some defaults we want to use across the platform.
- BREAKING: `PodSecurityContextBuilder::run_as_non_root` now takes a `bool` instead of assuming consumers always want to set it to `true`.
This is needed to allow users setting it to `false` in case the new `with_stackable_defaults` functions set's it to `true`.

## [0.111.1] - 2026-04-28

### Added
Expand Down
42 changes: 35 additions & 7 deletions crates/stackable-operator/src/builder/pod/security.rs
Original file line number Diff line number Diff line change
Expand Up @@ -144,14 +144,42 @@ impl SecurityContextBuilder {
}
}

#[derive(Clone, Default)]
/// A builder to construct a [`PodSecurityContext`].
///
/// # Basic usage
///
/// ```
/// use stackable_operator::builder::pod::security::PodSecurityContextBuilder;
///
/// let _ = PodSecurityContextBuilder::with_stackable_defaults()
/// // Configure any arbitrary fields
/// .run_as_user(1234)
/// .build();
/// ```
#[derive(Clone, Debug)]
pub struct PodSecurityContextBuilder {
pod_security_context: PodSecurityContext,
}

impl PodSecurityContextBuilder {
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

pub fn new() -> Self {
Self::default()
/// Construct a new [`PodSecurityContextBuilder`] that is pre-filled with Stackable's defaults.
pub fn with_stackable_defaults() -> Self {
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • I prefer a vendor neutral term like with_recommended_settings, similar to https://search.nixos.org/options?channel=25.11&query=services.nginx.recommended.
  • I would keep the new function and not force the settings yet: new().with_recommended_settings(). On the one hand, this pull request can then be merged now, and on the other hand, it is not guaranteed that we will be able to roll out this change on all operators at the same time. If we want to force the recommended settings later (which I would not do), we could create a function like new_with_recommended_settings and remove the new function.
  • I would already use the builder functions here, to ensure that builder functions exist to override these settings.
  • I asked for the stackable_default_pod_security_context function but it is not necessary and can be removed. The recommended settings can also be retrieved via PodSecurityContextBuilder::new().with_recommended_settings().build().

Self {
pod_security_context: Self::stackable_default_pod_security_context(),
}
}

/// The Stackable's defaults for a [`PodSecurityContext`].
///
/// It is recommended to use the [`PodSecurityContextBuilder::with_stackable_defaults`] instead
/// (if possible).
pub fn stackable_default_pod_security_context() -> PodSecurityContext {
todo!("Lars needs to define the exact settings he wants");
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A TODO for @lfrancke :)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would just leave the with_recommended_settings() function empty for now and keep the TODO in the issue, so that this pull request can be merged.


PodSecurityContext {
run_as_non_root: Some(true),
..Default::default()
}
}

pub fn build(&self) -> PodSecurityContext {
Expand All @@ -173,8 +201,8 @@ impl PodSecurityContextBuilder {
self
}

pub fn run_as_non_root(&mut self) -> &mut Self {
self.pod_security_context.run_as_non_root = Some(true);
pub fn run_as_non_root(&mut self, non_root: bool) -> &mut Self {
self.pod_security_context.run_as_non_root = Some(non_root);
self
}

Expand Down Expand Up @@ -381,13 +409,13 @@ mod tests {

#[test]
fn security_context_builder() {
let mut builder = PodSecurityContextBuilder::new();
let mut builder = PodSecurityContextBuilder::with_stackable_defaults();
let context = builder
.fs_group(1000)
.fs_group_change_policy("policy")
.run_as_user(1001)
.run_as_group(1001)
.run_as_non_root()
.run_as_non_root(true)
.supplemental_groups(&[1002, 1003])
.se_linux_level("level")
.se_linux_role("role")
Expand Down
Loading