Fix chart documentation defects found by following it - #149
Open
richbg wants to merge 2 commits into
Open
Conversation
Every namespaced `helm install` in the repo failed on a clean cluster because
none passed `--create-namespace`, and both documented uninstall commands failed
outright (one missing `--namespace`, one using Helm 2's removed `--purge`).
The "Example Usage" block did not run at all: `--set` split on the unescaped
comma in `gremlin.client.tags`, the tag value was not `key=value` so it produced
no tags, and it used the undocumented legacy `gremlin.clusterID` alias.
Several documented defaults did not match what the chart renders. Verified with
`helm template`:
- podSecurity.capabilities listed SETFCAP, AUDIT_WRITE and MKNOD, which the
chart never grants, and omitted DAC_READ_SEARCH, SYS_RESOURCE and NET_RAW,
which it does. Re-asserting the documented list via --set silently strips
three capabilities the agent needs.
- podSecurity.volumes omitted emptyDir, which the DaemonSet mounts
unconditionally, so a PSP or SCC built from the documented list rejects the
agent pod.
- securityContextConstraints.seLinuxContext documented gremlin.process; the
chart renders spc_t. The PSP row above it was already correct.
- container.driver documented `any`; values.yaml ships `linux`. Same code
path, so this is cosmetic.
- secret.name has a conditional default the table did not capture.
values.yaml said containerd implies /run/containers/containers.sock in three
comments; no template mounts that path. Also documents gremlin.serviceUrl, which
appears in every values file generated by the web app but was described only in
the sibling chart's README, and adds the cluster-scoped RBAC the chart creates by
default to Prerequisites.
The tag-escaping comment pointed at github.com/gremlin/helm/issues/8, which 404s.
`helm unittest gremlin`: 137 tests, 18 suites, all passing. `helm lint` clean.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
gremsam
reviewed
Aug 26, 2026
Review feedback: the intended default is `any`, so fix the chart rather than the docs. values.yaml shipped `linux`; the README documented `any`. The two are the same code path -- _helpers.tpl treats `linux` and `any` identically -- so this is a no-op for anyone's manifest. Verified: rendering before and after the change produces byte-identical output (8194 bytes), and `driver=any` and `driver=linux` both mount all three runtime sockets. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
This PR updates the Gremlin Helm chart documentation (and related values.yaml comments/defaults) to make the install/uninstall flows copy-pasteable on a clean cluster and to align documented defaults/keys with what the chart actually renders.
Changes:
- Add
--create-namespaceto install snippets across READMEs so first-time installs don’t fail on a missing namespace. - Fix Helm 3 uninstall guidance and refresh the “Example Usage”
--setsyntax to properly escape commas and use the documented key. - Align
gremlin/values.yamlcomments/defaults andgremlin/README.mdconfiguration table entries with current chart behavior (capabilities, SCC SELinux context, secret naming, etc.).
Reviewed changes
Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.
| File | Description |
|---|---|
| README.md | Updates top-level install snippets to create the gremlin namespace during install. |
| gremlin/values.yaml | Corrects/clarifies several values comments and adjusts the default container driver value to match documented behavior. |
| gremlin/README.md | Expands prerequisites, fixes config table defaults, updates example usage and uninstall instructions. |
| gremlin/examples/drivers/README.md | Updates the driver example install snippet to create the namespace. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Comment on lines
+519
to
+522
| # Determines if chao's Kubernetes ServiceAccount, ClusterRole (`gremlin-watcher`) and | ||
| # ClusterRoleBinding are created by this chart. This is separate from `chao.create`, which | ||
| # controls whether the chao Deployment itself is installed. When false, a ServiceAccount | ||
| # named exactly `chao` must already exist in the release namespace. |
| | `gremlin.hostNetwork` | Enable host-level network attacks | `true` | | ||
| | `gremlin.priorityClassName` | The priority class to use for the agent DaemonSet | `""` | | ||
| | `gremlin.client.tags` | Comma-separated list of custom tags to assign to this client | `""` | | ||
| | `gremlin.client.tags` | Comma-separated list of `key=value` tag pairs to assign to this client. Commas must be backslash-escaped when using `--set`; see [Example Usage](#example-usage) | `""` | |
sirged
approved these changes
Aug 31, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What this is
An audit followed this repo's documentation from scratch on a clean minikube cluster to install the chart. It worked in the end, but not by copy-paste. This PR fixes the mechanical, verified defects; findings that need a product or owner decision are listed at the bottom and deliberately not touched.
Every change was checked with
helm templateagainst chart 0.27.0.helm unittest gremlinpasses 137 tests across 18 suites, andhelm lintis clean.Breaks an install
--create-namespaceanywhere in the repo. All 13 namespacedhelm installsnippets pass--namespace gremlinand none creates it, so the first documented command fails on a clean cluster withError: INSTALLATION FAILED: create: failed to create: namespaces "gremlin" not found. The string--create-namespacedid not appear in the repo at all.helm delete gremlinerrors withrelease: not found(no--namespace), andhelm delete --purge gremlinerrors withunknown flag: --purge— Helm 2 syntax. Collapsed to one Helm 3 command, with a note thatuninstallremoves history by default and that the namespace is not deleted with the release.--setsplit on the unescaped comma (Error: failed parsing --set data: key "kubernetes" has no value); the valuek8s,kubernetesis notkey=valueso it yields no tags even once it parses; and it usedgremlin.clusterID, an undocumented legacy alias for thegremlin.secret.clusterIDthis same README documents. Now--set 'gremlin.client.tags=env=prod\,team=core', verified to renderGREMLIN_CLIENT_TAGS: env=prod,team=core.Documented defaults that did not match the rendered manifest
podSecurity.capabilitiesSETFCAP,AUDIT_WRITE,MKNODamong 9DAC_READ_SEARCH,SYS_RESOURCE,NET_RAWgranted and undocumentedpodSecurity.volumes[configMap, secret, hostPath]emptyDirsecurityContextConstraints.seLinuxContexttype: gremlin.processtype: spc_t, level: s0-s0:c0.c1023container.driveranylinux(same code path — cosmetic)secret.namegremlin-team-certgremlin-team-certunmanaged,gremlin-secretmanagedThe capabilities one is the most consequential: a user who trusts the table and re-asserts it with
--setsilently stripsDAC_READ_SEARCH,SYS_RESOURCEandNET_RAW, whichvalues.yamldocuments as required for dependency discovery, Certificate Expiry with CIDR args, and container Process Exhaustion.On SELinux, only the SCC row was wrong — the PSP row directly above it was already correct and is unchanged.
values.yamlexplains whyspc_tmatters: OpenShift/CRI-O runshostPID=truepods asspc_tand any other value is ignored, so the documented value would have broken an OpenShift install.values.yamlcontainer.drivercomment said containerd implies/run/containers/containers.sockin three places. No template mounts that path;containerDrivers.containerd-linux.runtimeSocketalready had the correct/run/containerd/containerd.sock. Fixed all three.chao.serviceAccount.create's comment was a copy ofchao.create's, telling readers it controls whether the Deployment is installed. It controls the ServiceAccount,ClusterRole/gremlin-watcherand its binding.gremlin.secret.nameentry so the key is discoverable from the file the README calls the full reference. It is intentionally computed in_helpers.tplrather than declared, so it stays commented.github.com/gremlin/helm/issues/8, which 404s. Replaced with a pointer to the worked example.Added
ClusterRole/gremlin-metadata-reader,ClusterRoleBinding/gremlin-metadata-reader,ClusterRole/gremlin-watcher,ClusterRoleBinding/chao), name the twoserviceAccount.create=falseescape valves, and note that using them requires pre-created ServiceAccounts named exactlygremlinandchaobecause both names are fixed in the pod specs. Also Helm 3.gremlin.serviceUrl— honoured by the chart, present in every values file generated at app.gremlin.com/getting-started, and documented only in the siblinggremlin-integrationsREADME.Deliberately not in this PR
These need a decision from someone who owns the feature, not a docs edit:
gremlin.tls.identity.*/chao.tls.identity.*keys appear in no Markdown anywhere in the repo. Three strategies, dedicated templates, dedicated tests. Whether they are customer-facing or internal is a product call — but silence seems like the wrong answer either way.Chart.yamlhas noappVersion,image.tagislatest, andminimumAppVersion: 2.66.0has no consumer anywhere inagent,service,webapporhelm— it is informational and unenforced.image.tagis the lever, but nothing records an agent↔chao version mapping, so guidance would be guesswork.nodesresource thatgremlin-metadata-readergrants, but that is a grep negative, not proof, and Chao was not examined. The Prerequisites wording above says only what the chart creates, and advises checking with support before disabling.chao.create=falsestill rendersServiceAccount/chao,ClusterRole/gremlin-watcherandClusterRoleBinding/chaobecause the template gates onchao.serviceAccount.create; enabling PSP and SCC together renders two RoleBindings both nameddefault:gremlin; andGREMLIN_CLIENT_TAGSat_daemonset.tpl:178is missing| quote, so the default renders a barevalue:and a tag containing YAML metacharacters would corrupt the manifest.curlcannot see it. The field observation was thatapp.gremlin.com/settings/teamslands on Company Options, that there is noConfigurationtab, and that certificates live under Team Settings → Details. That text is left unchanged in this PR rather than rewritten from an unverified observation.