Skip to content

Commit 88d47b2

Browse files
authored
Merge pull request #8280 from killianmuldoon/pr-runtimesdk-validate-hooknam
🌱 Update handler name validation rules
2 parents 821b957 + a57e32b commit 88d47b2

File tree

5 files changed

+38
-3
lines changed

5 files changed

+38
-3
lines changed

exp/runtime/server/server.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ type ExtensionHandler struct {
112112
Hook runtimecatalog.Hook
113113

114114
// Name is the name of the extension handler.
115+
// An extension handler name must be valid in line RFC 1123 Label Names.
115116
Name string
116117

117118
// HandlerFunc is the handler function.

internal/runtime/client/client.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -586,8 +586,8 @@ func defaultAndValidateDiscoveryResponse(cat *runtimecatalog.Catalog, discovery
586586
}
587587
names[handler.Name] = true
588588

589-
// Name should match Kubernetes naming conventions - validated based on Kubernetes DNS1123 Subdomain rules.
590-
if errStrings := validation.IsDNS1123Subdomain(handler.Name); len(errStrings) > 0 {
589+
// Name should match Kubernetes naming conventions - validated based on DNS1123 label rules.
590+
if errStrings := validation.IsDNS1123Label(handler.Name); len(errStrings) > 0 {
591591
errs = append(errs, errors.Errorf("handler name %s is not valid: %s", handler.Name, errStrings))
592592
}
593593

internal/runtime/client/client_test.go

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,7 @@ func Test_defaultAndValidateDiscoveryResponse(t *testing.T) {
362362
wantErr: false,
363363
},
364364
{
365-
name: "error with name violating DNS1123",
365+
name: "error if handler name has capital letters",
366366
discovery: &runtimehooksv1.DiscoveryResponse{
367367
TypeMeta: metav1.TypeMeta{
368368
Kind: "DiscoveryResponse",
@@ -378,6 +378,23 @@ func Test_defaultAndValidateDiscoveryResponse(t *testing.T) {
378378
},
379379
wantErr: true,
380380
},
381+
{
382+
name: "error if handler name has full stops",
383+
discovery: &runtimehooksv1.DiscoveryResponse{
384+
TypeMeta: metav1.TypeMeta{
385+
Kind: "DiscoveryResponse",
386+
APIVersion: runtimehooksv1.GroupVersion.String(),
387+
},
388+
Handlers: []runtimehooksv1.ExtensionHandler{{
389+
Name: "has.full.stops",
390+
RequestHook: runtimehooksv1.GroupVersionHook{
391+
Hook: "FakeHook",
392+
APIVersion: fakev1alpha1.GroupVersion.String(),
393+
},
394+
}},
395+
},
396+
wantErr: true,
397+
},
381398
{
382399
name: "error with Timeout of over 30 seconds",
383400
discovery: &runtimehooksv1.DiscoveryResponse{

internal/webhooks/runtime/extensionconfig_webhook.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,14 @@ func (webhook *ExtensionConfig) validate(_ context.Context, _, newExtensionConfi
104104
}
105105

106106
var allErrs field.ErrorList
107+
108+
// Name should match Kubernetes naming conventions - validated based on DNS1123 label rules.
109+
if errStrings := validation.IsDNS1123Label(newExtensionConfig.Name); len(errStrings) > 0 {
110+
allErrs = append(allErrs, field.Invalid(
111+
field.NewPath("metadata", "name"),
112+
newExtensionConfig.Name,
113+
fmt.Sprintf("ExtensionConfig name should be a valid DNS1123 label name: %s", errStrings)))
114+
}
107115
allErrs = append(allErrs, validateExtensionConfigSpec(newExtensionConfig)...)
108116

109117
if len(allErrs) > 0 {

internal/webhooks/runtime/extensionconfig_webhook_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,9 @@ func TestExtensionConfigValidate(t *testing.T) {
161161
extensionWithServiceAndURL := extensionWithURL.DeepCopy()
162162
extensionWithServiceAndURL.Spec.ClientConfig.Service = extensionWithService.Spec.ClientConfig.Service
163163

164+
extensionWithBadName := extensionWithURL.DeepCopy()
165+
extensionWithBadName.Name = "bad.name"
166+
164167
// Valid updated Extension
165168
updatedExtension := extensionWithURL.DeepCopy()
166169
updatedExtension.Spec.ClientConfig.URL = pointer.String("https://a-in-extension-address.com")
@@ -238,6 +241,12 @@ func TestExtensionConfigValidate(t *testing.T) {
238241
featureGate: true,
239242
expectErr: true,
240243
},
244+
{
245+
name: "creation should fail if extensionConfig Name violates Kubernetes naming rules",
246+
in: extensionWithBadName,
247+
featureGate: true,
248+
expectErr: true,
249+
},
241250
{
242251
name: "creation should fail if Service Name violates Kubernetes naming rules",
243252
in: extensionWithBadServiceName,

0 commit comments

Comments
 (0)