Skip to content

fix: reject invalid plugin config instead of applying an empty one - #441

Open
shreemaan-abhishek wants to merge 4 commits into
masterfrom
fix/plugin-config-unmarshal-fail-closed
Open

fix: reject invalid plugin config instead of applying an empty one#441
shreemaan-abhishek wants to merge 4 commits into
masterfrom
fix/plugin-config-unmarshal-fail-closed

Conversation

@shreemaan-abhishek

@shreemaan-abhishek shreemaan-abhishek commented Jul 20, 2026

Copy link
Copy Markdown
Contributor

Type of change:

  • Bugfix

What this PR does / why we need it:

When a plugin's config fails to unmarshal into an object (for example a
non-object value like config: ["10.0.0.0/8"], which the CRD accepts
because config uses x-kubernetes-preserve-unknown-fields), the error
was logged and discarded, and the plugin was still applied with an empty
(or secret-only) config. So an ip-restriction plugin with a malformed
whitelist silently became ip-restriction: {} on the published route,
enforcing nothing while the resource reconciled green. The same path
serves ApisixGlobalRule, so a malformed global plugin config was
applied gateway-wide in mutated form.

This changes buildPluginConfig to return an error on a malformed
config and propagates it through its apiv2 and Ingress callers (route
plugins, stream-route plugins, referenced ApisixPluginConfig,
ApisixGlobalRule, Ingress plugin-config annotation, ApisixConsumer).
Translation now fails instead of publishing a fabricated empty object,
so the resource keeps its last good state.

On these paths the failure is observable. ApisixRoute and
ApisixConsumer go through adcValidator, which runs the real
translator inside the admission webhook, so an invalid config is
rejected at apply time. ApisixGlobalRule and Ingress have no such
validator, but both controllers call Provider.Update before writing
status, so the error lands in a status condition.

Scope

The Gateway API paths (httproute.go, grpcroute.go) are deliberately
excluded. Gateway API requires that an ExtensionRef filter which
cannot be resolved must not be skipped, and that the affected requests
receive an HTTP error response instead. Failing translation does not
satisfy that: the route is never programmed, so a request either falls
through to another matching route and is served without the filter, or
404s. Those paths need the fault-injection treatment the translator
already applies to unresolvable backendRefs, scoped per rule. Tracked
in #452, which depends on #453 for the failure to be visible in status.

The remaining log-and-skip sites (consumer.go, gateway.go,
policies.go) are also out of scope: each needs its own decision about
how the failure surfaces, since v1alpha1 Consumer has an
adcValidator case while L4RoutePolicy has no webhook at all.
Tracked in #454.

Pre-submission checklist:

  • Did you explain what problem does this PR solve? Or what new features have been added?
  • Have you added corresponding test cases?
  • Have you modified the corresponding document?
  • Is this PR backward compatible?

Summary by CodeRabbit

  • Bug Fixes

    • Improved error handling when plugin configurations are invalid or cannot be loaded.
    • Translation now stops and reports errors instead of continuing with incomplete or malformed configurations.
    • Applies consistently across routes, streams, consumers, global rules, ingress resources, and extensions.
  • Tests

    • Added coverage for malformed plugin configurations, secret references, and related translation failures.

A plugin config that fails to unmarshal (e.g. a non-object value) was
logged and dropped, and the plugin was still applied with an empty or
secret-only config. Translation now fails so the resource keeps its
last good state and the admission webhook rejects the change upfront.

Aligns fillPluginFromExtensionRef, which silently skipped such
plugins, to the same fail-hard behavior.
@coderabbitai

coderabbitai Bot commented Jul 20, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Plugin configuration parsing errors now propagate through route, stream-rule, consumer, global-rule, and Ingress translation. New tests cover malformed configurations, valid secret references, and nil results after translation failures.

Changes

Plugin configuration error propagation

Layer / File(s) Summary
Central plugin configuration error handling
internal/adc/translator/apisixroute.go, internal/adc/translator/apisixconsumer.go, internal/adc/translator/globalrule.go
Plugin configuration parsing returns errors. Consumer and global-rule translation now stops when plugin construction fails.
Route extension error propagation
internal/adc/translator/apisixroute.go
HTTP and stream route plugin loading now returns referenced and inline plugin configuration errors.
Ingress plugin loading propagation
internal/adc/translator/ingress.go
Ingress service and route builders now return errors from plugin configuration loading.
Plugin configuration regression coverage
internal/adc/translator/pluginconfig_test.go
Tests cover invalid JSON shapes, secret-reference merging, and failures across route, stream-rule, consumer, global-rule, and Ingress translation.

Estimated code review effort: 3 (Moderate) | ~20 minutes


Important

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

❌ Failed checks (1 error, 1 warning)

Check name Status Explanation Resolution
Security Check ❌ Error Category 7/MEDIUM: ingress_controller.go:711-713 ignores missing SecretRef errors, and apisixroute.go:167-172 returns an empty config; secret-dependent plugins can fail open. Return an error when SecretRef is set but absent or nil, and propagate it from processPluginConfig; do not publish a route with an empty plugin config.
E2e Test Quality Review ⚠️ Warning The PR adds only translator unit tests; no test/e2e files changed, and the existing invalid-route E2E checks admission denial, not reconciliation or last-good-state preservation. Add an E2E test that submits a CRD-accepted non-object plugin config, verifies translation does not publish it, and confirms the prior valid route remains served.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: reject invalid plugin configurations instead of applying empty configurations.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/plugin-config-unmarshal-fail-closed

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
internal/adc/translator/pluginconfig_test.go (1)

39-183: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add test coverage for consumer and stream-route error propagation paths.

The test suite covers buildPlugins, buildPluginConfig, TranslateApisixGlobalRule, loadPluginConfigPluginsForIngress, and fillPluginFromExtensionRef, but two changed error-propagation paths lack regression tests:

  1. TranslateApisixConsumer (apisixconsumer.go lines 104-107): No test verifies that a malformed consumer plugin config fails consumer translation.
  2. translateStreamRule (apisixroute.go lines 491-493): No test verifies that a malformed stream-route plugin config fails stream rule translation.

Adding these tests would close the coverage gap for the fail-closed behavior this PR introduces.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/adc/translator/pluginconfig_test.go` around lines 39 - 183, Add
regression tests for malformed plugin configurations through
TranslateApisixConsumer and translateStreamRule. Use the existing non-object
plugin config fixture, construct the required consumer and stream-route
resources and translation context, then assert translation returns an error and
no result; preserve the fail-closed assertions used by the existing buildPlugins
and global-rule tests.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@internal/adc/translator/pluginconfig_test.go`:
- Around line 39-183: Add regression tests for malformed plugin configurations
through TranslateApisixConsumer and translateStreamRule. Use the existing
non-object plugin config fixture, construct the required consumer and
stream-route resources and translation context, then assert translation returns
an error and no result; preserve the fail-closed assertions used by the existing
buildPlugins and global-rule tests.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: d947cdf1-b6b3-4bd4-be0e-c5213d143552

📥 Commits

Reviewing files that changed from the base of the PR and between 5f84a00 and 3356e2b.

📒 Files selected for processing (7)
  • internal/adc/translator/apisixconsumer.go
  • internal/adc/translator/apisixroute.go
  • internal/adc/translator/globalrule.go
  • internal/adc/translator/grpcroute.go
  • internal/adc/translator/httproute.go
  • internal/adc/translator/ingress.go
  • internal/adc/translator/pluginconfig_test.go

@github-actions

github-actions Bot commented Jul 20, 2026

Copy link
Copy Markdown
Contributor

conformance test report - apisix-standalone mode

apiVersion: gateway.networking.k8s.io/v1
date: "2026-08-07T10:25:08Z"
gatewayAPIChannel: experimental
gatewayAPIVersion: v1.6.0
implementation:
  contact:
  - https://github.com/apache/apisix-ingress-controller/issues
  organization: APISIX
  project: apisix-ingress-controller
  url: https://github.com/apache/apisix-ingress-controller.git
  version: v2.0.0
kind: ConformanceReport
mode: default
profiles:
- core:
    result: partial
    skippedTests:
    - HTTPRouteHTTPSListener
    - HTTPRouteInvalidBackendRefUnknownKind
    - HTTPRouteInvalidCrossNamespaceBackendRef
    - HTTPRouteInvalidNonExistentBackendRef
    - HTTPRouteListenerHostnameMatching
    - HTTPRouteMultipleGateways
    - HTTPRouteNoBackendRefs
    statistics:
      Failed: 0
      Passed: 30
      Skipped: 7
  extended:
    result: partial
    skippedTests:
    - HTTPRouteRedirectPortAndScheme
    statistics:
      Failed: 0
      Passed: 12
      Skipped: 1
    supportedFeatures:
    - GatewayAddressEmpty
    - GatewayPort8080
    - HTTPRouteBackendProtocolWebSocket
    - HTTPRouteDestinationPortMatching
    - HTTPRouteHostRewrite
    - HTTPRouteMethodMatching
    - HTTPRoutePathRewrite
    - HTTPRoutePortRedirect
    - HTTPRouteQueryParamMatching
    - HTTPRouteRequestMirror
    - HTTPRouteResponseHeaderModification
    - HTTPRouteSchemeRedirect
    unsupportedFeatures:
    - BackendTLSPolicy
    - BackendTLSPolicySANValidation
    - GatewayBackendClientCertificate
    - GatewayFrontendClientCertificateValidation
    - GatewayFrontendClientCertificateValidationInsecureFallback
    - GatewayHTTPListenerIsolation
    - GatewayHTTPSListenerDetectMisdirectedRequests
    - GatewayInfrastructurePropagation
    - GatewayStaticAddresses
    - HTTPRoute303RedirectStatusCode
    - HTTPRoute307RedirectStatusCode
    - HTTPRoute308RedirectStatusCode
    - HTTPRouteBackendProtocolH2C
    - HTTPRouteBackendRequestHeaderModification
    - HTTPRouteBackendTimeout
    - HTTPRouteCORS
    - HTTPRouteNamedRouteRule
    - HTTPRouteParentRefPort
    - HTTPRoutePathRedirect
    - HTTPRouteRequestMultipleMirrors
    - HTTPRouteRequestPercentageMirror
    - HTTPRouteRequestTimeout
    - HTTPRouteRetry
    - HTTPRouteRetryBackendTimeout
    - HTTPRouteRetryConnectionError
    - ListenerSet
  name: GATEWAY-HTTP
  summary: Core tests partially succeeded with 7 test skips. Extended tests partially
    succeeded with 1 test skips.
- core:
    result: partial
    skippedTests:
    - GRPCRouteListenerHostnameMatching
    statistics:
      Failed: 0
      Passed: 14
      Skipped: 1
  extended:
    result: success
    statistics:
      Failed: 0
      Passed: 1
      Skipped: 0
    supportedFeatures:
    - GatewayAddressEmpty
    - GatewayPort8080
    unsupportedFeatures:
    - GatewayBackendClientCertificate
    - GatewayFrontendClientCertificateValidation
    - GatewayFrontendClientCertificateValidationInsecureFallback
    - GatewayHTTPListenerIsolation
    - GatewayHTTPSListenerDetectMisdirectedRequests
    - GatewayInfrastructurePropagation
    - GatewayStaticAddresses
    - ListenerSet
  name: GATEWAY-GRPC
  summary: Core tests partially succeeded with 1 test skips. Extended tests succeeded.
- core:
    result: partial
    skippedTests:
    - TLSRouteHostnameIntersection
    - TLSRouteInvalidBackendRefNonexistent
    - TLSRouteInvalidBackendRefUnknownKind
    - TLSRouteSimpleSameNamespace
    statistics:
      Failed: 0
      Passed: 16
      Skipped: 4
  extended:
    result: partial
    skippedTests:
    - TLSRouteTerminateSimpleSameNamespace
    statistics:
      Failed: 0
      Passed: 3
      Skipped: 1
    supportedFeatures:
    - GatewayAddressEmpty
    - GatewayPort8080
    - TLSRouteModeTerminate
    unsupportedFeatures:
    - GatewayBackendClientCertificate
    - GatewayFrontendClientCertificateValidation
    - GatewayFrontendClientCertificateValidationInsecureFallback
    - GatewayHTTPListenerIsolation
    - GatewayHTTPSListenerDetectMisdirectedRequests
    - GatewayInfrastructurePropagation
    - GatewayStaticAddresses
    - ListenerSet
    - TLSRouteModeMixed
  name: GATEWAY-TLS
  summary: Core tests partially succeeded with 4 test skips. Extended tests partially
    succeeded with 1 test skips.
succeededProvisionalTests:
- GatewayOptionalAddressValue

@github-actions

github-actions Bot commented Jul 20, 2026

Copy link
Copy Markdown
Contributor

conformance test report - apisix mode

apiVersion: gateway.networking.k8s.io/v1
date: "2026-08-07T10:25:29Z"
gatewayAPIChannel: experimental
gatewayAPIVersion: v1.6.0
implementation:
  contact:
  - https://github.com/apache/apisix-ingress-controller/issues
  organization: APISIX
  project: apisix-ingress-controller
  url: https://github.com/apache/apisix-ingress-controller.git
  version: v2.0.0
kind: ConformanceReport
mode: default
profiles:
- core:
    result: partial
    skippedTests:
    - HTTPRouteHTTPSListener
    - HTTPRouteInvalidBackendRefUnknownKind
    - HTTPRouteInvalidCrossNamespaceBackendRef
    - HTTPRouteInvalidNonExistentBackendRef
    - HTTPRouteListenerHostnameMatching
    - HTTPRouteMultipleGateways
    - HTTPRouteNoBackendRefs
    statistics:
      Failed: 0
      Passed: 30
      Skipped: 7
  extended:
    result: partial
    skippedTests:
    - HTTPRouteRedirectPortAndScheme
    statistics:
      Failed: 0
      Passed: 12
      Skipped: 1
    supportedFeatures:
    - GatewayAddressEmpty
    - GatewayPort8080
    - HTTPRouteBackendProtocolWebSocket
    - HTTPRouteDestinationPortMatching
    - HTTPRouteHostRewrite
    - HTTPRouteMethodMatching
    - HTTPRoutePathRewrite
    - HTTPRoutePortRedirect
    - HTTPRouteQueryParamMatching
    - HTTPRouteRequestMirror
    - HTTPRouteResponseHeaderModification
    - HTTPRouteSchemeRedirect
    unsupportedFeatures:
    - BackendTLSPolicy
    - BackendTLSPolicySANValidation
    - GatewayBackendClientCertificate
    - GatewayFrontendClientCertificateValidation
    - GatewayFrontendClientCertificateValidationInsecureFallback
    - GatewayHTTPListenerIsolation
    - GatewayHTTPSListenerDetectMisdirectedRequests
    - GatewayInfrastructurePropagation
    - GatewayStaticAddresses
    - HTTPRoute303RedirectStatusCode
    - HTTPRoute307RedirectStatusCode
    - HTTPRoute308RedirectStatusCode
    - HTTPRouteBackendProtocolH2C
    - HTTPRouteBackendRequestHeaderModification
    - HTTPRouteBackendTimeout
    - HTTPRouteCORS
    - HTTPRouteNamedRouteRule
    - HTTPRouteParentRefPort
    - HTTPRoutePathRedirect
    - HTTPRouteRequestMultipleMirrors
    - HTTPRouteRequestPercentageMirror
    - HTTPRouteRequestTimeout
    - HTTPRouteRetry
    - HTTPRouteRetryBackendTimeout
    - HTTPRouteRetryConnectionError
    - ListenerSet
  name: GATEWAY-HTTP
  summary: Core tests partially succeeded with 7 test skips. Extended tests partially
    succeeded with 1 test skips.
- core:
    result: partial
    skippedTests:
    - GRPCRouteListenerHostnameMatching
    statistics:
      Failed: 0
      Passed: 14
      Skipped: 1
  extended:
    result: success
    statistics:
      Failed: 0
      Passed: 1
      Skipped: 0
    supportedFeatures:
    - GatewayAddressEmpty
    - GatewayPort8080
    unsupportedFeatures:
    - GatewayBackendClientCertificate
    - GatewayFrontendClientCertificateValidation
    - GatewayFrontendClientCertificateValidationInsecureFallback
    - GatewayHTTPListenerIsolation
    - GatewayHTTPSListenerDetectMisdirectedRequests
    - GatewayInfrastructurePropagation
    - GatewayStaticAddresses
    - ListenerSet
  name: GATEWAY-GRPC
  summary: Core tests partially succeeded with 1 test skips. Extended tests succeeded.
- core:
    result: partial
    skippedTests:
    - TLSRouteHostnameIntersection
    - TLSRouteInvalidBackendRefNonexistent
    - TLSRouteInvalidBackendRefUnknownKind
    - TLSRouteSimpleSameNamespace
    statistics:
      Failed: 0
      Passed: 16
      Skipped: 4
  extended:
    result: partial
    skippedTests:
    - TLSRouteTerminateSimpleSameNamespace
    statistics:
      Failed: 0
      Passed: 3
      Skipped: 1
    supportedFeatures:
    - GatewayAddressEmpty
    - GatewayPort8080
    - TLSRouteModeTerminate
    unsupportedFeatures:
    - GatewayBackendClientCertificate
    - GatewayFrontendClientCertificateValidation
    - GatewayFrontendClientCertificateValidationInsecureFallback
    - GatewayHTTPListenerIsolation
    - GatewayHTTPSListenerDetectMisdirectedRequests
    - GatewayInfrastructurePropagation
    - GatewayStaticAddresses
    - ListenerSet
    - TLSRouteModeMixed
  name: GATEWAY-TLS
  summary: Core tests partially succeeded with 4 test skips. Extended tests partially
    succeeded with 1 test skips.
succeededProvisionalTests:
- GatewayOptionalAddressValue

@github-actions

github-actions Bot commented Jul 20, 2026

Copy link
Copy Markdown
Contributor

conformance test report

apiVersion: gateway.networking.k8s.io/v1
date: "2026-08-07T10:44:19Z"
gatewayAPIChannel: experimental
gatewayAPIVersion: v1.6.0
implementation:
  contact:
  - https://github.com/apache/apisix-ingress-controller/issues
  organization: APISIX
  project: apisix-ingress-controller
  url: https://github.com/apache/apisix-ingress-controller.git
  version: v2.0.0
kind: ConformanceReport
mode: default
profiles:
- core:
    failedTests:
    - GatewayModifyListeners
    - TLSRouteHostnameIntersection
    - TLSRouteInvalidBackendRefNonexistent
    - TLSRouteInvalidBackendRefUnknownKind
    - TLSRouteSimpleSameNamespace
    result: failure
    statistics:
      Failed: 5
      Passed: 15
      Skipped: 0
  extended:
    failedTests:
    - TLSRouteTerminateSimpleSameNamespace
    result: failure
    statistics:
      Failed: 1
      Passed: 3
      Skipped: 0
    supportedFeatures:
    - GatewayAddressEmpty
    - GatewayPort8080
    - TLSRouteModeTerminate
    unsupportedFeatures:
    - GatewayBackendClientCertificate
    - GatewayFrontendClientCertificateValidation
    - GatewayFrontendClientCertificateValidationInsecureFallback
    - GatewayHTTPListenerIsolation
    - GatewayHTTPSListenerDetectMisdirectedRequests
    - GatewayInfrastructurePropagation
    - GatewayStaticAddresses
    - ListenerSet
    - TLSRouteModeMixed
  name: GATEWAY-TLS
  summary: Core tests failed with 5 test failures. Extended tests failed with 1 test
    failures.
- core:
    failedTests:
    - GatewayModifyListeners
    - HTTPRouteExactPathMatching
    - HTTPRouteMultipleGateways
    - HTTPRouteNoBackendRefs
    result: failure
    skippedTests:
    - HTTPRouteHTTPSListener
    statistics:
      Failed: 4
      Passed: 32
      Skipped: 1
  extended:
    result: partial
    skippedTests:
    - HTTPRouteRedirectPortAndScheme
    statistics:
      Failed: 0
      Passed: 12
      Skipped: 1
    supportedFeatures:
    - GatewayAddressEmpty
    - GatewayPort8080
    - HTTPRouteBackendProtocolWebSocket
    - HTTPRouteDestinationPortMatching
    - HTTPRouteHostRewrite
    - HTTPRouteMethodMatching
    - HTTPRoutePathRewrite
    - HTTPRoutePortRedirect
    - HTTPRouteQueryParamMatching
    - HTTPRouteRequestMirror
    - HTTPRouteResponseHeaderModification
    - HTTPRouteSchemeRedirect
    unsupportedFeatures:
    - BackendTLSPolicy
    - BackendTLSPolicySANValidation
    - GatewayBackendClientCertificate
    - GatewayFrontendClientCertificateValidation
    - GatewayFrontendClientCertificateValidationInsecureFallback
    - GatewayHTTPListenerIsolation
    - GatewayHTTPSListenerDetectMisdirectedRequests
    - GatewayInfrastructurePropagation
    - GatewayStaticAddresses
    - HTTPRoute303RedirectStatusCode
    - HTTPRoute307RedirectStatusCode
    - HTTPRoute308RedirectStatusCode
    - HTTPRouteBackendProtocolH2C
    - HTTPRouteBackendRequestHeaderModification
    - HTTPRouteBackendTimeout
    - HTTPRouteCORS
    - HTTPRouteNamedRouteRule
    - HTTPRouteParentRefPort
    - HTTPRoutePathRedirect
    - HTTPRouteRequestMultipleMirrors
    - HTTPRouteRequestPercentageMirror
    - HTTPRouteRequestTimeout
    - HTTPRouteRetry
    - HTTPRouteRetryBackendTimeout
    - HTTPRouteRetryConnectionError
    - ListenerSet
  name: GATEWAY-HTTP
  summary: Core tests failed with 4 test failures. Extended tests partially succeeded
    with 1 test skips.
- core:
    failedTests:
    - GatewayModifyListeners
    result: failure
    statistics:
      Failed: 1
      Passed: 14
      Skipped: 0
  extended:
    result: success
    statistics:
      Failed: 0
      Passed: 1
      Skipped: 0
    supportedFeatures:
    - GatewayAddressEmpty
    - GatewayPort8080
    unsupportedFeatures:
    - GatewayBackendClientCertificate
    - GatewayFrontendClientCertificateValidation
    - GatewayFrontendClientCertificateValidationInsecureFallback
    - GatewayHTTPListenerIsolation
    - GatewayHTTPSListenerDetectMisdirectedRequests
    - GatewayInfrastructurePropagation
    - GatewayStaticAddresses
    - ListenerSet
  name: GATEWAY-GRPC
  summary: Core tests failed with 1 test failures. Extended tests succeeded.
succeededProvisionalTests:
- GatewayOptionalAddressValue

Also rename the shadowed pluginconfig variable in
fillPluginFromExtensionRef.
@shreemaan-abhishek

Copy link
Copy Markdown
Contributor Author

Addressed the coverage gap: added TestTranslateApisixConsumer_MalformedPluginConfigFailsTranslation and TestTranslateStreamRule_MalformedPluginConfigFailsTranslation, so every error path this PR introduces now has a regression test.

On the two pre-merge checks:

Security check (plugin payloads in debug logs) — the two lines flagged (fill plugin from extension ref in httproute.go and translating Ingress Annotations in ingress.go) are pre-existing and untouched by this PR. The concern is valid on its own terms, and adc.Plugins does still lack a MarshalLog, so it belongs in the log-redaction work started in #435 rather than in a translator fix. Keeping it out of scope here.

E2E test quality — the invalid config is rejected by the admission webhook, which the existing e2e-test (webhook) suite exercises. The behavior this PR changes is translator-level error propagation, so translator unit tests are the right altitude; adding an e2e case that re-tests webhook rejection would not cover anything new.

Gateway API requires that an unresolvable ExtensionRef filter yields an
error response for the affected requests rather than being skipped, so
those paths need a data-plane fault-injection instead of failing
translation. Tracked in #452.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant