Skip to content

feat(pluginpresets): evaluate CEL expressions for owned Plugins#2088

Merged
Zaggy21 merged 16 commits into
mainfrom
feat/v3-CEL-in-pp
Jun 26, 2026
Merged

feat(pluginpresets): evaluate CEL expressions for owned Plugins#2088
Zaggy21 merged 16 commits into
mainfrom
feat/v3-CEL-in-pp

Conversation

@k-fabryczny

@k-fabryczny k-fabryczny commented Jun 22, 2026

Copy link
Copy Markdown
Contributor

feat(pluginpresets): evaluate CEL expressions for owned Plugins (#1774)

Description

What type of PR is this? (check all applicable)

  • 🍕 Feature
  • 🐛 Bug Fix
  • 📝 Documentation Update
  • 🎨 Style
  • 🧑‍💻 Code Refactor
  • 🔥 Performance Improvements
  • ✅ Test
  • 🤖 Build
  • 🔁 CI
  • 📦 Chore (Release)
  • ⏩ Revert

Related Tickets & Documents

Added tests?

  • 👍 yes
  • 🙅 no, because they aren't needed
  • 🙋 no, because I need help
  • Separate ticket for tests # (issue/pr)

Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration

Files for manual testing:

K1_expression_test.yaml

apiVersion: greenhouse.sap/v1alpha1
kind: PluginPreset
metadata:
  name: expr-test
  namespace: demo
spec:
  plugin:
    pluginDefinitionRef:
      name: perses
    releaseName: perses-expr-test
    releaseNamespace: kube-monitoring
    optionValues:
      - name: test.direct
        value: "unchanged"
      - name: test.hostname
        expression: |
          "app-${global.greenhouse.clusterName}.example.com"
      - name: test.combined
        expression: |
          "${global.greenhouse.clusterName}-${global.greenhouse.organizationName}"
  clusterSelector:
    matchLabels:
      greenhouse.sap/cluster: kind-greenhouse-remote

K2_override_expression_test.yaml

apiVersion: greenhouse.sap/v1alpha1
kind: PluginPreset
metadata:
  name: override-test
  namespace: demo
spec:
  plugin:
    pluginDefinitionRef:
      name: perses
    releaseName: perses-override-test
    releaseNamespace: kube-monitoring
    optionValues:
      - name: base.value
        expression: |
          "base-${global.greenhouse.clusterName}"
      - name: override.hostname
        expression: |
          "default-${global.greenhouse.clusterName}.example.com"
  clusterOptionOverrides:
    - clusterName: kind-greenhouse-remote
      overrides:
        - name: override.hostname
          expression: |
            "overridden-${global.greenhouse.clusterName}.special.com"
  clusterSelector:
    matchLabels:
      greenhouse.sap/cluster: kind-greenhouse-remote
  1. Install plugin definition
greenhouse-extensions % kubectl apply -f perses/plugindefinition.yaml -n demo
plugindefinition.greenhouse.sap/perses created
  1. Verify
kubectl get pd -A                                                            
NAMESPACE   NAME     VERSION   CATALOG   READY   AGE
demo        perses   0.14.2              True    54s
  1. Apply first test file
kubectl apply -f K1_expression_test.yaml -n demo     
Warning: PluginPreset should have a support-group Team set as its owner
Warning: metadata.labels[greenhouse.sap/owned-by]: Required value: label greenhouse.sap/owned-by is required
pluginpreset.greenhouse.sap/expr-test created
  1. Verify plugin preset
kubectl get pp -A
NAMESPACE   NAME        PLUGIN DEFINITION   VERSION   RELEASE NAMESPACE   READY   AGE
demo        expr-test   perses              0.14.2    kube-monitoring     True    20s
  1. Verify plugin
kubectl get plugin -A
NAMESPACE   NAME                               DISPLAY NAME                       PLUGIN DEFINITION   CLUSTER                  RELEASE NAME       RELEASE NAMESPACE   READY   VERSION   AGE
demo        expr-test-kind-greenhouse-remote   expr test kind greenhouse remote   perses              kind-greenhouse-remote   perses-expr-test   kube-monitoring     True    0.14.2    33s
  1. Check optionValues
kubectl get plugin -n demo expr-test-kind-greenhouse-remote -o jsonpath='{.spec.optionValues}' | jq
...
  {
    "name": "test.combined",
    "value": "kind-greenhouse-remote-demo"
  },
  {
    "name": "test.direct",
    "value": "unchanged"
  },
  {
    "name": "test.hostname",
    "value": "app-kind-greenhouse-remote.example.com"
  },
...
  1. Apply second test file for override
kubectl apply -f K2_override_expression_test.yaml -n demo                                           
Warning: PluginPreset should have a support-group Team set as its owner
Warning: metadata.labels[greenhouse.sap/owned-by]: Required value: label greenhouse.sap/owned-by is required
pluginpreset.greenhouse.sap/override-test created
  1. Check plugin preset
kubectl get pp -A
NAMESPACE   NAME            PLUGIN DEFINITION   VERSION   RELEASE NAMESPACE   READY   AGE
demo        expr-test       perses              0.14.2    kube-monitoring     True    3m32s
demo        override-test   perses              0.14.2    kube-monitoring     True    19s
  1. Check plugin
kubectl get plugin -A
NAMESPACE   NAME                                   DISPLAY NAME                           PLUGIN DEFINITION   CLUSTER                  RELEASE NAME           RELEASE NAMESPACE   READY   VERSION   AGE
demo        expr-test-kind-greenhouse-remote       expr test kind greenhouse remote       perses              kind-greenhouse-remote   perses-expr-test       kube-monitoring     True    0.14.2    3m50s
demo        override-test-kind-greenhouse-remote   override test kind greenhouse remote   perses              kind-greenhouse-remote   perses-override-test   kube-monitoring     True    0.14.2    37s
  1. Check optionValues for second plugin
kubectl get plugin -n demo override-test-kind-greenhouse-remote -o jsonpath='{.spec.optionValues}' | jq
...
  {
    "name": "override.hostname",
    "value": "overridden-kind-greenhouse-remote.special.com"
  },
...

Added to documentation?

  • 📜 README.md
  • 🤝 Documentation pages updated
  • 🙅 no documentation needed
  • (if applicable) generated OpenAPI docs for CRD changes

Checklist

  • My code follows the style guidelines of this project
  • I have performed a self-review of my code
  • I have commented my code, particularly in hard-to-understand areas
  • My changes generate no new warnings
  • New and existing unit tests pass locally with my changes

Signed-off-by: Klaudiusz Fabryczny <klaudiusz.fabryczny@sap.com>
Signed-off-by: Klaudiusz Fabryczny <klaudiusz.fabryczny@sap.com>
Signed-off-by: Klaudiusz Fabryczny <klaudiusz.fabryczny@sap.com>
Signed-off-by: Klaudiusz Fabryczny <klaudiusz.fabryczny@sap.com>
Signed-off-by: Klaudiusz Fabryczny <klaudiusz.fabryczny@sap.com>
Copilot AI review requested due to automatic review settings June 22, 2026 07:34
@k-fabryczny k-fabryczny requested review from a team as code owners June 22, 2026 07:34
@github-actions github-actions Bot added size/XXL documentation Improvements or additions to documentation feature core-apis helm-charts and removed size/XXL labels Jun 22, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR moves CEL ${...} expression handling for owned Plugins into the PluginPreset controller (behind a new pluginPreset.expressionEvaluationEnabled feature flag), updates the PluginPreset API to use a dedicated option value type, and refreshes docs/charts/tests accordingly.

Changes:

  • Added PluginPreset-side option value expression evaluation during reconciliation (with cluster overrides applied before evaluation).
  • Introduced pluginPreset feature flags plumbing (controller wiring + ConfigMap/chart values + unit tests).
  • Updated API/docs/webhook/tests to use PluginPresetPluginOptionValue for PluginPreset.spec.plugin.optionValues and cluster overrides.

Reviewed changes

Copilot reviewed 25 out of 26 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
internal/webhook/v1alpha1/pluginpreset_webhook.go Converts preset option values for validation before calling shared plugin option validation.
internal/webhook/v1alpha1/pluginpreset_webhook_test.go Expands webhook tests to cover Expression mutual exclusivity for presets/overrides.
internal/util/plugin.go Adds conversion helpers between preset option values and plugin option values.
internal/test/resources.go Updates test builders/helpers for new preset option value types.
internal/helm/cel.go Exports BuildTemplateData for reuse by PluginPreset expression evaluation.
internal/features/features.go Adds pluginPreset feature section and accessor.
internal/features/features_test.go Adds tests for pluginPreset feature flag parsing/independence.
internal/controller/plugin/suite_test.go Enables PluginPreset expression evaluation in controller test suite.
internal/controller/plugin/pluginpreset_values_resolver.go Implements expression evaluation and override merging for presets.
internal/controller/plugin/pluginpreset_controller.go Applies overrides + resolves expressions before writing Plugin spec optionValues.
internal/controller/plugin/pluginpreset_controller_test.go Adds controller tests validating expression resolution and overrides behavior.
internal/cmd/plugin_template.go Ensures template generation merges preset values after converting to plugin option values.
internal/cmd/plugin_template_test.go Updates tests for new preset option value types.
docs/reference/components/pluginpreset.md Documents CEL expressions for presets and the pluginPreset feature flag.
docs/reference/api/openapi.yaml Updates generated OpenAPI schema descriptions for preset option values.
docs/reference/api/index.html Updates generated API HTML to reflect new preset option value type references.
dev-env/dev.values.yaml Enables pluginPreset.expressionEvaluationEnabled in dev env defaults.
cmd/greenhouse/controllers.go Wires PluginPreset reconciler startup to the new feature flag accessor.
charts/manager/templates/manager/feature-flag.yaml Adds pluginPreset section to feature flags ConfigMap template.
charts/manager/templates/_helpers.tpl Adds helper for rendering pluginPreset expression evaluation flag.
charts/manager/crds/greenhouse.sap_pluginpresets.yaml Updates CRD schema descriptions for preset option value type.
charts/manager/ci/test-values.yaml Sets pluginPreset expression evaluation in chart CI values.
charts/greenhouse/values.yaml Adds pluginPreset flag default under global.
charts/greenhouse/ci/test-values.yaml Sets pluginPreset expression evaluation in greenhouse chart CI values.
api/v1alpha1/zz_generated.deepcopy.go Regenerates deepcopy logic for new preset option value slice types.
api/v1alpha1/pluginpreset_types.go Switches PluginPreset option values/overrides to PluginPresetPluginOptionValue.
Files not reviewed (1)
  • api/v1alpha1/zz_generated.deepcopy.go: Generated file

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread internal/controller/plugin/pluginpreset_values_resolver.go Outdated
Comment thread internal/util/plugin.go
Comment thread internal/util/plugin.go
Comment thread internal/webhook/v1alpha1/pluginpreset_webhook.go
Comment thread internal/test/resources.go Outdated
Comment thread charts/greenhouse/values.yaml
Signed-off-by: Klaudiusz Fabryczny <klaudiusz.fabryczny@sap.com>
Signed-off-by: Klaudiusz Fabryczny <klaudiusz.fabryczny@sap.com>
Signed-off-by: Klaudiusz Fabryczny <klaudiusz.fabryczny@sap.com>
… dev

Signed-off-by: Klaudiusz Fabryczny <klaudiusz.fabryczny@sap.com>
Signed-off-by: Klaudiusz Fabryczny <klaudiusz.fabryczny@sap.com>
Comment thread charts/greenhouse/values.yaml Outdated
Comment thread dev-env/dev.values.yaml
Comment thread internal/test/resources.go Outdated
Comment thread internal/test/resources.go Outdated
k-fabryczny and others added 6 commits June 24, 2026 13:49
Signed-off-by: Klaudiusz Fabryczny <klaudiusz.fabryczny@sap.com>
Signed-off-by: Klaudiusz Fabryczny <klaudiusz.fabryczny@sap.com>
Signed-off-by: Klaudiusz Fabryczny <klaudiusz.fabryczny@sap.com>
…disabled

Signed-off-by: Klaudiusz Fabryczny <klaudiusz.fabryczny@sap.com>
Signed-off-by: Klaudiusz Fabryczny <klaudiusz.fabryczny@sap.com>
@Zaggy21 Zaggy21 requested a review from abhijith-darshan June 25, 2026 14:09
@Zaggy21 Zaggy21 merged commit 4afb323 into main Jun 26, 2026
28 of 29 checks passed
@Zaggy21 Zaggy21 deleted the feat/v3-CEL-in-pp branch June 26, 2026 08:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

core-apis documentation Improvements or additions to documentation feature helm-charts size/XXL

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEAT] - PluginPreset controller evaluates CEL expressions for owned Plugins

4 participants