Skip to content
Merged
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
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ All notable changes to this project will be documented in this file.

- Support objectOverrides using `.spec.objectOverrides` on the `Listener`.
See [objectOverrides concepts page](https://docs.stackable.tech/home/nightly/concepts/overrides/#object-overrides) for details ([#364]).
- Support serviceOverrides using `.spec.serviceOverrides` on the `ListenerClass` ([#365]).

### Changed

Expand All @@ -20,6 +21,7 @@ All notable changes to this project will be documented in this file.
[#360]: https://github.com/stackabletech/listener-operator/pull/360
[#363]: https://github.com/stackabletech/listener-operator/pull/363
[#364]: https://github.com/stackabletech/listener-operator/pull/364
[#365]: https://github.com/stackabletech/listener-operator/pull/365

## [25.11.0] - 2025-11-07

Expand Down
16 changes: 8 additions & 8 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

30 changes: 15 additions & 15 deletions Cargo.nix

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ edition = "2021"
repository = "https://github.com/stackabletech/listener-operator"

[workspace.dependencies]
stackable-operator = { git = "https://github.com/stackabletech/operator-rs.git", tag = "stackable-operator-0.102.0", features = ["telemetry", "versioned"] }
stackable-operator = { git = "https://github.com/stackabletech/operator-rs.git", tag = "stackable-operator-0.104.0", features = ["telemetry", "versioned"] }

anyhow = "1.0"
built = { version = "0.8", features = ["chrono", "git2"] }
Expand Down
14 changes: 7 additions & 7 deletions crate-hashes.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 14 additions & 0 deletions deploy/helm/listener-operator/crds/crds.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,20 @@ spec:
- Local
nullable: true
type: string
serviceOverrides:
default:
apiVersion: v1
kind: Service
metadata: {}
description: |-
In the `serviceOverrides` property you can define a
[Service](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.34/#service-v1-core)
to override any property that can be set on a Kubernetes Service.

This mechanism is similar to the `podOverrides`, which are documented in the
[Pod overrides documentation](https://docs.stackable.tech/home/nightly/concepts/overrides#pod-overrides).
type: object
x-kubernetes-preserve-unknown-fields: true
serviceType:
description: The method used to access the services.
enum:
Expand Down
9 changes: 8 additions & 1 deletion rust/operator-binary/src/listener_controller.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ use stackable_operator::{
crd::listener,
iter::TryFromIterator,
k8s_openapi::{
DeepMerge,
api::core::v1::{Endpoints, Node, PersistentVolume, Service, ServicePort, ServiceSpec},
apimachinery::pkg::apis::meta::v1::LabelSelector,
},
Expand Down Expand Up @@ -348,7 +349,7 @@ pub async fn reconcile(
}
};

let svc = Service {
let mut svc = Service {
metadata: ObjectMetaBuilder::new()
.namespace(ns)
.name(&svc_name)
Expand Down Expand Up @@ -402,6 +403,12 @@ pub async fn reconcile(
}),
..Default::default()
};

// The overrides need to come last!
svc.merge_from(listener_class.spec.service_overrides.clone());
// Prevent accidental further modification by removing mutability
let svc = svc;

let svc_ref = ObjectRef::from_obj(&svc);
let svc = cluster_resources
.add(&ctx.client, svc)
Expand Down
9 changes: 9 additions & 0 deletions tests/templates/kuttl/overrides/00-patch-ns.yaml.j2
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{% if test_scenario['values']['openshift'] == 'true' %}
# see https://github.com/stackabletech/issues/issues/566
---
apiVersion: kuttl.dev/v1beta1
kind: TestStep
commands:
- script: kubectl patch namespace $NAMESPACE -p '{"metadata":{"labels":{"pod-security.kubernetes.io/enforce":"privileged"}}}'
timeout: 120
{% endif %}
5 changes: 5 additions & 0 deletions tests/templates/kuttl/overrides/05-create-listenerclass.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
apiVersion: kuttl.dev/v1beta1
kind: TestStep
commands:
- script: envsubst '$NAMESPACE' < 05_listenerclass.yaml | kubectl apply -n $NAMESPACE -f -
17 changes: 17 additions & 0 deletions tests/templates/kuttl/overrides/05_listenerclass.yaml.j2
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
---
apiVersion: listeners.stackable.tech/v1alpha1
kind: ListenerClass
metadata:
name: listener-operator-test-overrides-$NAMESPACE
spec:
serviceType: ClusterIP
serviceAnnotations:
deprecated: was here
winner: deprecated
serviceOverrides:
metadata:
annotations:
serviceOverrides: was here
winner: serviceOverrides
spec:
sessionAffinity: ClientIP
21 changes: 21 additions & 0 deletions tests/templates/kuttl/overrides/10-assert.yaml.j2
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
---
apiVersion: v1
kind: Service
metadata:
name: listener
annotations:
deprecated: was here
serviceOverrides: was here
listener: was here
winner: listener
spec:
type: ClusterIP
ports:
- name: http
port: 80

# Set by ListenerClass.spec.serviceOverrides
sessionAffinity: ClientIP

# Set by Listener.spec.objectOverrides
internalTrafficPolicy: Local
5 changes: 5 additions & 0 deletions tests/templates/kuttl/overrides/10-create-listener.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
apiVersion: kuttl.dev/v1beta1
kind: TestStep
commands:
- script: envsubst '$NAMESPACE' < 10_listener.yaml | kubectl apply -n $NAMESPACE -f -
21 changes: 21 additions & 0 deletions tests/templates/kuttl/overrides/10_listener.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
---
apiVersion: listeners.stackable.tech/v1alpha1
kind: Listener
metadata:
name: listener
spec:
className: listener-operator-test-overrides-$NAMESPACE
ports:
- name: http
port: 80
objectOverrides:
- apiVersion: v1
kind: Service
metadata:
name: listener
namespace: $NAMESPACE
annotations:
listener: was here
winner: listener
spec:
internalTrafficPolicy: Local
2 changes: 2 additions & 0 deletions tests/test-definition.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ tests:
dimensions:
- openshift
- loadbalancer-allocatenodeports
- name: overrides
dimensions: []
suites:
- name: nightly
- name: openshift
Expand Down
Loading