From 58d6a501388be33bf968838341e49085dad436e0 Mon Sep 17 00:00:00 2001 From: Yosiah de Koeyer Date: Mon, 15 Dec 2025 19:13:05 +1100 Subject: [PATCH 1/4] Add failing tests Signed-off-by: Yosiah de Koeyer --- .../chainsaw-test.yaml | 0 .../featureflag_bad.yaml | 0 .../featureflag_good.yaml | 0 .../featureflag_good_empty.yaml | 0 .../chainsaw-test.yaml | 26 +++++++++++++++++++ .../featureflag_bad.yaml | 22 ++++++++++++++++ .../featureflag_good.yaml | 20 ++++++++++++++ .../featureflag_good_empty.yaml | 15 +++++++++++ 8 files changed, 83 insertions(+) rename test/e2e/chainsaw/{validate-featureflag => validate-featureflag-create}/chainsaw-test.yaml (100%) rename test/e2e/chainsaw/{validate-featureflag => validate-featureflag-create}/featureflag_bad.yaml (100%) rename test/e2e/chainsaw/{validate-featureflag => validate-featureflag-create}/featureflag_good.yaml (100%) rename test/e2e/chainsaw/{validate-featureflag => validate-featureflag-create}/featureflag_good_empty.yaml (100%) create mode 100644 test/e2e/chainsaw/validate-featureflag-update/chainsaw-test.yaml create mode 100644 test/e2e/chainsaw/validate-featureflag-update/featureflag_bad.yaml create mode 100644 test/e2e/chainsaw/validate-featureflag-update/featureflag_good.yaml create mode 100644 test/e2e/chainsaw/validate-featureflag-update/featureflag_good_empty.yaml diff --git a/test/e2e/chainsaw/validate-featureflag/chainsaw-test.yaml b/test/e2e/chainsaw/validate-featureflag-create/chainsaw-test.yaml similarity index 100% rename from test/e2e/chainsaw/validate-featureflag/chainsaw-test.yaml rename to test/e2e/chainsaw/validate-featureflag-create/chainsaw-test.yaml diff --git a/test/e2e/chainsaw/validate-featureflag/featureflag_bad.yaml b/test/e2e/chainsaw/validate-featureflag-create/featureflag_bad.yaml similarity index 100% rename from test/e2e/chainsaw/validate-featureflag/featureflag_bad.yaml rename to test/e2e/chainsaw/validate-featureflag-create/featureflag_bad.yaml diff --git a/test/e2e/chainsaw/validate-featureflag/featureflag_good.yaml b/test/e2e/chainsaw/validate-featureflag-create/featureflag_good.yaml similarity index 100% rename from test/e2e/chainsaw/validate-featureflag/featureflag_good.yaml rename to test/e2e/chainsaw/validate-featureflag-create/featureflag_good.yaml diff --git a/test/e2e/chainsaw/validate-featureflag/featureflag_good_empty.yaml b/test/e2e/chainsaw/validate-featureflag-create/featureflag_good_empty.yaml similarity index 100% rename from test/e2e/chainsaw/validate-featureflag/featureflag_good_empty.yaml rename to test/e2e/chainsaw/validate-featureflag-create/featureflag_good_empty.yaml diff --git a/test/e2e/chainsaw/validate-featureflag-update/chainsaw-test.yaml b/test/e2e/chainsaw/validate-featureflag-update/chainsaw-test.yaml new file mode 100644 index 000000000..897950b14 --- /dev/null +++ b/test/e2e/chainsaw/validate-featureflag-update/chainsaw-test.yaml @@ -0,0 +1,26 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/kyverno/chainsaw/main/.schemas/json/test-chainsaw-v1alpha1.json +apiVersion: chainsaw.kyverno.io/v1alpha1 +kind: Test +metadata: + name: validate-featureflag +spec: + steps: + - name: step-00 + try: + - apply: + file: featureflag_good_empty.yaml + - apply: + file: featureflag_good.yaml + - apply: + file: featureflag_bad.yaml + expect: + - check: + ($error != null): true + - name: step-01 + try: + - assert: + file: featureflag_good_empty.yaml + - assert: + file: featureflag_good.yaml + - error: + file: featureflag_bad.yaml diff --git a/test/e2e/chainsaw/validate-featureflag-update/featureflag_bad.yaml b/test/e2e/chainsaw/validate-featureflag-update/featureflag_bad.yaml new file mode 100644 index 000000000..8756074a5 --- /dev/null +++ b/test/e2e/chainsaw/validate-featureflag-update/featureflag_bad.yaml @@ -0,0 +1,22 @@ +apiVersion: core.openfeature.dev/v1beta1 +kind: FeatureFlag +metadata: + name: featureflag-sample +spec: + flagSpec: + flags: + fibAlgo: + variants: + recursive: recursive + memo: memo + loop: loop + binet: binet + defaultVariant: recursive + state: ENABLED + targeting: + fractional: + - "invalid" + - ["clubs", 25] + - ["diamonds", 25] + - ["hearts", 25] + - ["spades", 25] diff --git a/test/e2e/chainsaw/validate-featureflag-update/featureflag_good.yaml b/test/e2e/chainsaw/validate-featureflag-update/featureflag_good.yaml new file mode 100644 index 000000000..d023c89dc --- /dev/null +++ b/test/e2e/chainsaw/validate-featureflag-update/featureflag_good.yaml @@ -0,0 +1,20 @@ +apiVersion: core.openfeature.dev/v1beta1 +kind: FeatureFlag +metadata: + name: featureflag-sample +spec: + flagSpec: + flags: + fibAlgo: + variants: + recursive: recursive + memo: memo + loop: loop + binet: binet + defaultVariant: recursive + state: ENABLED + targeting: + if: + - "$ref": emailWithFaas + - binet + - null diff --git a/test/e2e/chainsaw/validate-featureflag-update/featureflag_good_empty.yaml b/test/e2e/chainsaw/validate-featureflag-update/featureflag_good_empty.yaml new file mode 100644 index 000000000..669e2a25a --- /dev/null +++ b/test/e2e/chainsaw/validate-featureflag-update/featureflag_good_empty.yaml @@ -0,0 +1,15 @@ +apiVersion: core.openfeature.dev/v1beta1 +kind: FeatureFlag +metadata: + name: featureflag-sample +spec: + flagSpec: + flags: + fibAlgo: + variants: + recursive: recursive + memo: memo + loop: loop + binet: binet + defaultVariant: recursive + state: ENABLED From 3f170b5dfbaea1ebfce81b13bff021e39cb7bd07 Mon Sep 17 00:00:00 2001 From: Yosiah de Koeyer Date: Mon, 15 Dec 2025 19:13:53 +1100 Subject: [PATCH 2/4] Validate update on new object not old Signed-off-by: Yosiah de Koeyer --- internal/webhook/featureflag_webhook.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/internal/webhook/featureflag_webhook.go b/internal/webhook/featureflag_webhook.go index 55d4d4ff4..be922dc55 100644 --- a/internal/webhook/featureflag_webhook.go +++ b/internal/webhook/featureflag_webhook.go @@ -33,13 +33,14 @@ import ( "sigs.k8s.io/controller-runtime/pkg/webhook/admission" ) -type FeatureFlagCustomValidator struct { -} +type FeatureFlagCustomValidator struct{} // log is for logging in this package. -var featureFlagLog = logf.Log.WithName("featureflag-resource validator") -var compiledSchema *gojsonschema.Schema -var schemaInitOnce sync.Once +var ( + featureFlagLog = logf.Log.WithName("featureflag-resource validator") + compiledSchema *gojsonschema.Schema + schemaInitOnce sync.Once +) func (v *FeatureFlagCustomValidator) SetupWebhookWithManager(mgr ctrl.Manager) error { return ctrl.NewWebhookManagedBy(mgr). @@ -71,10 +72,10 @@ func (v *FeatureFlagCustomValidator) ValidateCreate(ctx context.Context, obj run // ValidateUpdate implements webhook.Validator so a webhook will be registered for the type func (v *FeatureFlagCustomValidator) ValidateUpdate(ctx context.Context, oldObj runtime.Object, newObj runtime.Object) (warnings admission.Warnings, err error) { - featureFlag, ok := oldObj.(*v1beta1.FeatureFlag) + featureFlag, ok := newObj.(*v1beta1.FeatureFlag) if !ok { - return nil, fmt.Errorf("expected a FeatureFlag object but got %T", oldObj) + return nil, fmt.Errorf("expected a FeatureFlag object but got %T", newObj) } featureFlagLog.Info("validate update", "name", featureFlag.Name) @@ -135,7 +136,6 @@ func initSchemas() (*gojsonschema.Schema, error) { if err == nil { compiledSchema, err = schemaLoader.Compile(gojsonschema.NewStringLoader(schema.FlagSchema)) } - }) return compiledSchema, err From 2d73c350c2e64946fa9896e25ae3e27cb190167c Mon Sep 17 00:00:00 2001 From: Yosiah de Koeyer Date: Mon, 15 Dec 2025 19:22:29 +1100 Subject: [PATCH 3/4] Update test names Signed-off-by: Yosiah de Koeyer --- .../e2e/chainsaw/validate-featureflag-create/chainsaw-test.yaml | 2 +- .../e2e/chainsaw/validate-featureflag-update/chainsaw-test.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/e2e/chainsaw/validate-featureflag-create/chainsaw-test.yaml b/test/e2e/chainsaw/validate-featureflag-create/chainsaw-test.yaml index 897950b14..3933a1f96 100644 --- a/test/e2e/chainsaw/validate-featureflag-create/chainsaw-test.yaml +++ b/test/e2e/chainsaw/validate-featureflag-create/chainsaw-test.yaml @@ -2,7 +2,7 @@ apiVersion: chainsaw.kyverno.io/v1alpha1 kind: Test metadata: - name: validate-featureflag + name: validate-featureflag-create spec: steps: - name: step-00 diff --git a/test/e2e/chainsaw/validate-featureflag-update/chainsaw-test.yaml b/test/e2e/chainsaw/validate-featureflag-update/chainsaw-test.yaml index 897950b14..4065af7f0 100644 --- a/test/e2e/chainsaw/validate-featureflag-update/chainsaw-test.yaml +++ b/test/e2e/chainsaw/validate-featureflag-update/chainsaw-test.yaml @@ -2,7 +2,7 @@ apiVersion: chainsaw.kyverno.io/v1alpha1 kind: Test metadata: - name: validate-featureflag + name: validate-featureflag-update spec: steps: - name: step-00 From 5197fd02f9660239faa6215fb1b6e8c460e3ddfa Mon Sep 17 00:00:00 2001 From: Yosiah de Koeyer Date: Mon, 15 Dec 2025 19:32:09 +1100 Subject: [PATCH 4/4] Cleanup update tests Signed-off-by: Yosiah de Koeyer --- .../chainsaw-test.yaml | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/test/e2e/chainsaw/validate-featureflag-update/chainsaw-test.yaml b/test/e2e/chainsaw/validate-featureflag-update/chainsaw-test.yaml index 4065af7f0..d2c388672 100644 --- a/test/e2e/chainsaw/validate-featureflag-update/chainsaw-test.yaml +++ b/test/e2e/chainsaw/validate-featureflag-update/chainsaw-test.yaml @@ -9,18 +9,9 @@ spec: try: - apply: file: featureflag_good_empty.yaml - - apply: - file: featureflag_good.yaml - - apply: - file: featureflag_bad.yaml - expect: - - check: - ($error != null): true - - name: step-01 - try: - - assert: - file: featureflag_good_empty.yaml - - assert: + - update: file: featureflag_good.yaml - error: file: featureflag_bad.yaml + - update: + file: featureflag_good_empty.yaml