Repository navigation
Fix Connector Gateway configuration gaps - #1227
Conversation
Verified against chart v0.22.0. Add the required groupRef, baseline_client_scopes, and control-plane validator to the example; document primaryIdp.subjectClaim, AI Gateway caller auth, name override drift guards, clusterOidcIssuer reachability, the directory NetworkPolicy, the Enterprise Manager KEK Secret format, and global.redis.username. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
tgrunnagle
left a comment
There was a problem hiding this comment.
Multi-Agent Consensus Review
Agents consulted: cgw-accuracy (connector-gateway / umbrella chart), em-accuracy (Enterprise Manager / Redis / AI Gateway), docs-style (style, structure, issue coverage). Claims were checked against the SEP v0.22.0 chart and Go source, and the page's example values were rendered with helm template.
Consensus Summary
| # | Finding | Consensus | Severity | Action |
|---|---|---|---|---|
| 1 | A failed discovery fetch stops the Enterprise Manager from starting, rather than causing it to reject gRPC callers | 9/10 | MEDIUM | Fix |
| 2 | The API-key render guard fires without virtual keys; the acknowledgeNoApiKeyServiceCaller escape hatch is undocumented |
9/10 | MEDIUM | Fix |
| 3 | grpc.insecure isn't addressed (issue item 4); it's also refused at startup alongside a KEK |
9/10 | MEDIUM | Fix |
| 4 | subjectClaim is also read from the console's access token |
7/10 | MEDIUM | Fix |
| 5 | grpc.networkPolicy can only widen access; the example contradicts the text |
7/10 | MEDIUM | Fix |
| 6 | Switching to existingSecret with a new KEK loses stored credentials |
7/10 | MEDIUM | Fix |
| 7 | Name overrides: httpSaSubjectAllowlist is missing; the port claim is overstated |
7/10 | MEDIUM | Fix |
| 8 | The dev-cluster cleartext paragraph now sits under "Name overrides" | 8/10 | MEDIUM | Fix |
| 9 | No minimum chart version is stated | 8/10 | LOW | Fix |
| 10 | The API key service must run in the release namespace | 9/10 | LOW | Fix |
| 11 | The AI Gateway main processor also needs an allowlist entry | 8/10 | LOW | Fix |
| 12 | ACL advice: the username is shared, and the required commands and default user are not covered |
8/10 | LOW | Fix |
| 13 | The console-token link has no anchor and doesn't show how to get the audience | 7/10 | LOW | Fix |
| 14 | Use a placeholder for the control-plane issuer | 7/10 | LOW | Fix |
Overall
This is a docs-only PR that closes #1225. It adds the values the Connector Gateway page was missing (groupRef, baseline_client_scopes, controlPlane.incomingAuth.oidc, primaryIdp.subjectClaim), plus sections on console tokens, non-sub subjects, AI Gateway access and name overrides, and Enterprise Manager KEK and NetworkPolicy details in deployment.mdx. The approach is sound. Re-baselining on v0.22.0 instead of the issue's v0.18.0 is the right call, and the PR body explains where the issue no longer applies. Most new claims hold up against source: Redis inheritance, the groupRef validator and its status-only use, baseline_client_scopes semantics, control-plane issuer matching, the drift guards' messages, the KEK version-map format and the openssl command, and the api-key-service subject, field path and 503 symptom. The example values render cleanly at v0.22.0.
None of the findings challenge the approach. They fall into three groups. Several failure modes are described wrongly or only partly: a discovery failure is a startup crash, the API-key guard and grpc.insecure both affect installs without virtual keys, and subjectClaim also applies to access tokens. Two deployment.mdx additions could lead readers to a bad outcome: the NetworkPolicy text contradicts the example above it, and the KEK existingSecret path has no warning for existing installs. The rest are completeness and structure items. Items 1–3 and 6 are the ones worth fixing before merge.
Documentation
All findings are documentation findings, in configure-connector-gateway.mdx and deployment.mdx; see the inline comments. Codex cross-review was not run because the CLI isn't installed.
Generated with Claude Code
Addresses #1227 review comments: - MEDIUM configure-connector-gateway.mdx (4235091747): discovery failure stops EM startup - MEDIUM configure-connector-gateway.mdx (4235091770): API key guard fires without virtual keys - MEDIUM configure-connector-gateway.mdx (4235091778): cover grpc.insecure for the AI Gateway - MEDIUM configure-connector-gateway.mdx (4235091790): subjectClaim also read from access tokens - MEDIUM configure-connector-gateway.mdx (4235091815): name override guards and httpSaSubjectAllowlist - MEDIUM configure-connector-gateway.mdx (4235091820): give dev cleartext path its own heading - LOW configure-connector-gateway.mdx (4235091824): state minimum chart version - LOW configure-connector-gateway.mdx (4235091846): API key service in release namespace - LOW configure-connector-gateway.mdx (4235091853): main processor allowlist entry - LOW configure-connector-gateway.mdx (4235091861): qualify Redis ACL advice - LOW configure-connector-gateway.mdx (4235091871): explain how to find console audience - LOW configure-connector-gateway.mdx (4235091880): placeholder for control-plane issuer Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Addresses #1227 review comments: - MEDIUM deployment.mdx (4235091799): NetworkPolicies are additive; match the example - MEDIUM deployment.mdx (4235091808): warn against replacing an existing KEK Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
danbarr
left a comment
There was a problem hiding this comment.
The additions close useful configuration gaps, and the earlier review fixes are reflected in this revision. I'm requesting changes primarily to keep the setup procedure focused: required configuration, optional configurations, and failure diagnosis currently compete for attention before readers reach verification.
Editorial scope
The inline comments mark representative places to tighten that boundary. Apply the same approach to these sections in configure-connector-gateway.mdx:
- Accept console tokens on the REST API: retain the issuer, audience, JWT requirement, restricted-audience guidance, and token-verification link. Move the default-validator explanation and resulting
401symptoms into Troubleshooting. - Identify users by a claim other than
sub: retain the matching settings, ID-token/access-token requirements, Okta instructions, and stable-identity guidance. Consolidate the two401explanations into a troubleshooting entry. - Keep the AI Gateway's access: keep the conditional setup instructions here, including the acknowledgement required when virtual API keys are disabled. Move the
503symptom and silent loss of telemetry labels into Troubleshooting. Link this section from the AI Gateway setup guide so readers can find it from that journey too.
Group the Redis ACL recipe, cleartext development transport, and name overrides under Advanced configuration after the normal setup and verification sequence. Keep a short pointer where each becomes relevant. Also move the groupRef explanation next to the example or values table; it currently sits under "Choose the gateway ID and issuer," where readers would not look for it.
Retain explanations that help readers choose values or avoid credential loss. The goal is to shorten the main procedure while preserving actionable troubleshooting and optional configuration.
Remaining correctness items
- Name overrides:
nameOverridealso changes the gateway'sapp.kubernetes.io/namelabel. The Enterprise Manager's directory NetworkPolicy and the documented additional policy selectconnector-gateway, so changing the names and allowlists alone leaves the renamed pods without gRPC access under those policies. Document updatingenterprise-manager.grpc.networkPolicy.allowedClientSelectorto the actual pod label.fullnameOverridealone preserves that label. - Enterprise Manager KEK rotation:
deployment.mdxsays to add a higher-numbered key and retain earlier keys, but omits restarting the Enterprise Manager pods. The KEK provider loads the Secret once at startup, so the new active version is only picked up on restart. Add that activation step, or move rotation into a complete operational procedure and link to it.
Separate follow-up
The existing deployment example nests matchLabels inside grpc.networkPolicy.allowedClientSelector. At v0.22.0 the chart adds matchLabels itself and expects the value to be the label map directly. This predates the PR, so please track or fix it separately.
Reviewed head 50edbf4 and spot-checked these behavior claims against v0.22.0 chart and Go source. Current CI checks pass; this was a source-based review without live deployment testing.
| If the Connector Gateway is the only component that uses `global.redis`, you can | ||
| connect as a least-privilege ACL user. Set `global.redis.username` to that user, | ||
| and apply this reference ACL to your Redis or Valkey instance with your own | ||
| password. `global.redis.username` applies to every component that inherits | ||
| `global.redis`, so don't restrict the user this way while other components share | ||
| it. |
There was a problem hiding this comment.
Please move the full ACL recipe and key-pattern explanation into an optional Advanced configuration subsection. Prerequisites should establish that Redis is available and configured, with a short link to the ACL instructions. This detailed hardening procedure interrupts the setup checklist before readers have prepared the gateway's secrets.
There was a problem hiding this comment.
Addressed in a26a719. The ACL recipe and key-pattern explanation now live under Advanced configuration > Restrict the Redis user. The Redis prerequisite keeps only a one-line link to that section.
Addresses #1227 review comments: - MEDIUM review body (5498084449): move symptoms to Troubleshooting, group optional config under Advanced configuration, move groupRef, link from AI Gateway guide - MEDIUM review body (5498084449): nameOverride changes the pod label; update allowedClientSelector - MEDIUM configure-connector-gateway.mdx (4254095820): move Redis ACL recipe to Advanced configuration - MEDIUM configure-connector-gateway.mdx (4254095821): shorten baseline_client_scopes text - MEDIUM configure-connector-gateway.mdx (4254095827): move issuer failure diagnosis to Troubleshooting - MEDIUM configure-connector-gateway.mdx (4254095830): make the name override table task-oriented Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Addresses #1227 review comments: - MEDIUM deployment.mdx (4254095833): place the credential-loss warning before the commands and separate new from existing installs - MEDIUM review body (5498084449): restart the Enterprise Manager after KEK rotation Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The chart wraps grpc.networkPolicy.allowedClientSelector in matchLabels itself, so the example's nested matchLabels key rendered an invalid label selector. Addresses #1227 review comments: - LOW review body (5498084449): allowedClientSelector takes the label map directly Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Responses to the review body (#1227 (review)):
|
danbarr
left a comment
There was a problem hiding this comment.
The previous review findings are addressed. One nonblocking naming clarification below.
| To read the names, render the chart with `helm template` and find the gateway's | ||
| ServiceAccount and its `-control-plane` Service. With `fullnameOverride`, the | ||
| ServiceAccount and Services take the override as their name; with | ||
| `nameOverride`, they become `<RELEASE_NAME>-<NAME_OVERRIDE>`. |
There was a problem hiding this comment.
Nonblocking clarification: the control-plane Service keeps its -control-plane suffix, and serviceAccount.name can independently override the ServiceAccount name. Since the rendered resources are authoritative, I'd remove the simplified naming formulas:
| To read the names, render the chart with `helm template` and find the gateway's | |
| ServiceAccount and its `-control-plane` Service. With `fullnameOverride`, the | |
| ServiceAccount and Services take the override as their name; with | |
| `nameOverride`, they become `<RELEASE_NAME>-<NAME_OVERRIDE>`. | |
| Render the chart with `helm template`. Use the gateway's ServiceAccount name and | |
| the control-plane Service's name and port from the rendered output to set these | |
| values. |
Description
Addresses the gaps and inaccuracies reported in #1225 on Configure the Connector Gateway, plus follow-up fixes from two rounds of review. Claims were checked against the latest chart release, v0.22.0. The issue was written against v0.18.0, so a few findings have changed since then (noted below).
configure-connector-gateway.mdxThe page now follows this order: required setup, verification, an Advanced configuration section, and Troubleshooting.
Prerequisites:
global.redis.global.redissettings, includingusernameand TLS. A link points to the Redis ACL instructions.Values example: adds three settings, with short explanations under the values table:
vmcpConfig.groupRef. It's required, and noMCPGroupwith that name has to exist.authServer.baseline_client_scopes: [openid, offline_access], so dynamically registered MCP clients can get refresh tokens.controlPlane.incomingAuth.oidc, with placeholders for the issuer and audience.New section, "Accept console tokens on the REST API": the issuer must match the primary IdP. The audience is the one the IdP assigns to the console's OAuth client (
cloud-uiin the Okta example), with a link showing how to confirm it. It also covers restricted audiences and the JWT requirement.Rewritten section, "Identify users by a claim other than
sub": setprimaryIdp.subjectClaimand the Enterprise Manager'sbinding_claimtogether. The claim must be on ID tokens (with the Okta step for addinguid) and on the console's access tokens.Connect to the Enterprise Manager:
clusterOidcIssuerdirectly from that URL, so its pods need egress to it.meteringSaSubjectAllowlist.New section, "Keep the AI Gateway's access":
AIGatewayin the release namespace.directory.insecure: false.grpc.insecure.acknowledgeNoApiKeyServiceCallerwhen you don't use virtual keys.configure-ai-gateway.mdxnow links to this section.New section, Advanced configuration:
global.redisconsumer.allowedClientSelectorfornameOverride, which changes the pod label.Troubleshooting: new entries for:
401on the console's Connectors pages.503s and missing group labels.deployment.mdxexistingSecretformat, a JSON version map of base64-encoded 32-byte keys.externallyManagedNetworkPolicy.allowedClientSelectorexample: now passes the label map directly. The chart addsmatchLabelsitself, so the old nested form rendered an invalid selector. This bug predates the PR and is fixed in its own commit.global.redis.username: documented, along with the render error when it's set withoutexistingSecret.Where v0.22.0 differs from the issue
global.redisat v0.22.0, so this PR documentsusernameand the minimum chart version instead of a per-component Redis block.spec.auth.virtualAPIKeys.directory.insecure.Type of change
Related issues/PRs
Closes #1225
Submitter checklist
Content and formatting
Reviewer checklist
Content
🤖 Generated with Claude Code