Summary
Tenants get no status on their Envoy Gateway policies. The manager's role grants no status subresource on any gateway.envoyproxy.io type, so every status write the gateway resource replicator attempts is denied.
Two things break for tenants:
- No feedback when a policy is held. A tenant whose OIDC
SecurityPolicy references a missing client secret sees login silently fail with nothing to act on. The operator correctly refuses to push the broken policy to the shared gateway — the protection works — but cannot write the reason onto the tenant's resource. No Accepted=False, no PendingSecret.
- No status at all on four policy types.
SecurityPolicy, BackendTrafficPolicy, Backend, and HTTPRouteFilter never reflect edge reality. Tenants cannot tell whether a policy was accepted, rejected, or programmed. Stale status is never cleared either.
Every reconcile of an affected resource logs an error, indefinitely.
Cause
The markers on gateway_resource_replicator_controller.go:59-60 cover the resources and finalizers only — no /status — so config/rbac/role.yaml has no /status rule for gateway.envoyproxy.io at all. BackendTLSPolicy is the one replicated policy whose writes succeed, because gateway.networking.k8s.io/*/status is granted (role.yaml:204-207).
Denied write paths:
| Path |
Location |
| Held-policy condition |
gateway_resource_replicator_securitypolicy_guard.go:176 |
| Downstream→upstream status sync |
gateway_resource_replicator_controller.go:487 |
| Upstream status clear |
gateway_resource_replicator_controller.go:526 |
The last two run for every replicated GVK without skipUpstreamStatusSync:
| GVK |
Writes status |
/status RBAC |
envoyproxy.io/SecurityPolicy |
guard + sync |
missing |
envoyproxy.io/BackendTrafficPolicy |
sync |
missing |
envoyproxy.io/Backend |
sync |
missing |
envoyproxy.io/HTTPRouteFilter |
sync |
missing |
gateway.networking.k8s.io/BackendTLSPolicy |
sync |
granted |
TrafficProtectionPolicy, HTTPProxy, Connector |
no |
n/a |
httproutefilters has resource-level RBAC only incidentally, from an unrelated marker on httpproxy_controller.go:88. The replicator's own marker never names it.
ERROR Reconciler error {"controller": "gateway_resource_replicator", "error": "failed to record held status on SecurityPolicy chainsaw-legal-aardvark/tenant-oidc: securitypolicies.gateway.envoyproxy.io \"tenant-oidc\" is forbidden: User \"system:serviceaccount:network-services-operator-system:network-services-operator-controller-manager\" cannot update resource \"securitypolicies/status\" in API group \"gateway.envoyproxy.io\""}
Unit tests miss it: gateway_resource_replicator_controller_test.go:963 asserts PendingSecret against a fake client that does not enforce RBAC.
Also blocked
Acceptance criteria
Notes
Distinct from #97, which covers propagating status back from edge clusters via a Karmada resource interpreter. This is the operator's own upstream write being denied.
Related to #194
Summary
Tenants get no status on their Envoy Gateway policies. The manager's role grants no
statussubresource on anygateway.envoyproxy.iotype, so every status write the gateway resource replicator attempts is denied.Two things break for tenants:
SecurityPolicyreferences a missing client secret sees login silently fail with nothing to act on. The operator correctly refuses to push the broken policy to the shared gateway — the protection works — but cannot write the reason onto the tenant's resource. NoAccepted=False, noPendingSecret.SecurityPolicy,BackendTrafficPolicy,Backend, andHTTPRouteFilternever reflect edge reality. Tenants cannot tell whether a policy was accepted, rejected, or programmed. Stale status is never cleared either.Every reconcile of an affected resource logs an error, indefinitely.
Cause
The markers on
gateway_resource_replicator_controller.go:59-60cover the resources andfinalizersonly — no/status— soconfig/rbac/role.yamlhas no/statusrule forgateway.envoyproxy.ioat all.BackendTLSPolicyis the one replicated policy whose writes succeed, becausegateway.networking.k8s.io/*/statusis granted (role.yaml:204-207).Denied write paths:
gateway_resource_replicator_securitypolicy_guard.go:176gateway_resource_replicator_controller.go:487gateway_resource_replicator_controller.go:526The last two run for every replicated GVK without
skipUpstreamStatusSync:/statusRBACenvoyproxy.io/SecurityPolicyenvoyproxy.io/BackendTrafficPolicyenvoyproxy.io/Backendenvoyproxy.io/HTTPRouteFiltergateway.networking.k8s.io/BackendTLSPolicyTrafficProtectionPolicy,HTTPProxy,Connectorhttproutefiltershas resource-level RBAC only incidentally, from an unrelated marker onhttpproxy_controller.go:88. The replicator's own marker never names it.Unit tests miss it:
gateway_resource_replicator_controller_test.go:963assertsPendingSecretagainst a fake client that does not enforce RBAC.Also blocked
oidc-missing-secret-isolatione2e) fails in Arm 1 waiting forAccepted=False, reason=PendingSecret. Arm 2 — shared-gateway restart isolation — never runs, leaving the upgrade gate for Envoy OIDC SecurityPolicy fails on startup and doesn't recover envoyproxy/gateway#6123 unverified.Acceptance criteria
get,update,patchonsecuritypolicies/status,backendtrafficpolicies/status,backends/status, andhttproutefilters/statusconfig/rbac/role.yamlregenerated from markers, not hand-editedAccepted=False, reason=PendingSecret, and edge status for a replicatedBackendTrafficPolicyappears upstreamfailed to record held statusorfailed to update upstream statusin manager logsoidc-missing-secret-isolationreaches Arm 2 and passes on pinned Envoy Gateway v1.7.4Notes
Distinct from #97, which covers propagating status back from edge clusters via a Karmada resource interpreter. This is the operator's own upstream write being denied.
Related to #194