Skip to content

Commit e9f2586

Browse files
committed
fix(validators): reject dots in helm release names
Helm itself permits dots in release names but generated resource names like `<release>-<chart>-<hash>` must be valid DNS-1123 labels (no dots). A dotted release like `my.app` passes Helm's validation, then K8s rejects the resource apply server-side with an opaque 422. Switch validateHelmReleaseName to delegate to validateRFC1123Label so the dot is caught with clear inline feedback before submit. Cursor bugbot finding (validators.ts:126).
1 parent a668623 commit e9f2586

2 files changed

Lines changed: 20 additions & 4 deletions

File tree

packages/k8s-ui/src/utils/validators.test.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,14 @@ describe('validateHelmReleaseName', () => {
135135
if (r.valid) throw new Error('expected invalid')
136136
expect(r.error.endsWith('.')).toBe(false)
137137
})
138+
139+
it('rejects dotted names (generated resource names must be DNS-1123 labels)', () => {
140+
// Helm itself permits dots, but generated resource names like
141+
// `<release>-<chart>-<hash>` must be valid labels. Catch the dot
142+
// up front instead of letting K8s reject the apply server-side.
143+
expect(validateHelmReleaseName('my.app').valid).toBe(false)
144+
expect(validateHelmReleaseName('foo.bar.baz').valid).toBe(false)
145+
})
138146
})
139147

140148
describe('validatePort', () => {

packages/k8s-ui/src/utils/validators.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,17 @@ export function validateRFC1123Subdomain(input: string): ValidationResult {
106106
}
107107

108108
/**
109-
* Validates a Helm release name. Same shape as an RFC 1123 subdomain
110-
* but capped at 53 chars (Helm's hard limit; longer names produce
111-
* resources that exceed K8s' 63-char label limit).
109+
* Validates a Helm release name. Same shape as an RFC 1123 label
110+
* (no dots) capped at 53 chars (Helm's hard limit; longer names
111+
* produce resources that exceed K8s' 63-char label limit).
112+
*
113+
* Why label and not subdomain: Helm itself permits dots in release
114+
* names, but most charts compose resource names as
115+
* `<release>-<chart>-<hash>` which must be valid DNS-1123 labels.
116+
* A dotted release name like `my.app` produces resources whose
117+
* names fail K8s label validation server-side. Reject the dot up
118+
* front so the user sees a clear inline error instead of a server
119+
* 422 after submit.
112120
*/
113121
export function validateHelmReleaseName(input: string): ValidationResult {
114122
if (input.length === 0) {
@@ -123,7 +131,7 @@ export function validateHelmReleaseName(input: string): ValidationResult {
123131
error: `must be at most ${HELM_RELEASE_NAME_MAX} characters (got ${input.length}); Helm caps release names so derived resource names fit under K8s' 63-char limit`,
124132
}
125133
}
126-
return validateRFC1123Subdomain(input)
134+
return validateRFC1123Label(input)
127135
}
128136

129137
/**

0 commit comments

Comments
 (0)