Skip to content

Commit ce1c669

Browse files
dilyevskyclaude
andcommitted
[apiserver] register custom field selectors with the scheme
customGetAttrs already extracted custom fields for storage-level filtering, but the API server's request validation layer rejected them because no FieldLabelConversionFunc was registered. Add registerFieldLabelConversions to declare selectable fields for all resource types that have custom field selectors. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 321f4b3 commit ce1c669

File tree

2 files changed

+57
-1
lines changed

2 files changed

+57
-1
lines changed

pkg/apiserver/fieldselectors.go

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"k8s.io/apimachinery/pkg/fields"
77
"k8s.io/apimachinery/pkg/labels"
88
"k8s.io/apimachinery/pkg/runtime"
9+
"k8s.io/apimachinery/pkg/runtime/schema"
910
"k8s.io/apiserver/pkg/registry/generic"
1011
"sigs.k8s.io/apiserver-runtime/pkg/builder/resource"
1112

@@ -41,3 +42,58 @@ func customGetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) {
4142

4243
return labels.Set(om.Labels), fs, nil
4344
}
45+
46+
// selectableFieldConversion returns a FieldLabelConversionFunc that accepts
47+
// metadata.name, metadata.namespace, and any additional fields.
48+
func selectableFieldConversion(extra ...string) func(label, value string) (string, string, error) {
49+
allowed := map[string]bool{
50+
"metadata.name": true,
51+
"metadata.namespace": true,
52+
}
53+
for _, f := range extra {
54+
allowed[f] = true
55+
}
56+
return func(label, value string) (string, string, error) {
57+
if allowed[label] {
58+
return label, value, nil
59+
}
60+
return "", "", fmt.Errorf("%q is not a known field selector", label)
61+
}
62+
}
63+
64+
// registerFieldLabelConversions registers custom field selectors so the API
65+
// server accepts them in ?fieldSelector= query parameters. Without this
66+
// registration, only metadata.name and metadata.namespace are accepted.
67+
func registerFieldLabelConversions(s *runtime.Scheme) error {
68+
if err := s.AddFieldLabelConversionFunc(
69+
schema.GroupVersionKind{Group: corev1alpha2.GroupName, Version: "v1alpha2", Kind: "Domain"},
70+
selectableFieldConversion("spec.zone", "status.phase"),
71+
); err != nil {
72+
return err
73+
}
74+
if err := s.AddFieldLabelConversionFunc(
75+
schema.GroupVersionKind{Group: corev1alpha2.GroupName, Version: "v1alpha2", Kind: "DomainZone"},
76+
selectableFieldConversion("status.phase"),
77+
); err != nil {
78+
return err
79+
}
80+
if err := s.AddFieldLabelConversionFunc(
81+
schema.GroupVersionKind{Group: corev1alpha2.GroupName, Version: "v1alpha2", Kind: "Proxy"},
82+
selectableFieldConversion("spec.provider"),
83+
); err != nil {
84+
return err
85+
}
86+
if err := s.AddFieldLabelConversionFunc(
87+
schema.GroupVersionKind{Group: corev1alpha2.GroupName, Version: "v1alpha2", Kind: "Backend"},
88+
selectableFieldConversion("spec.protocol"),
89+
); err != nil {
90+
return err
91+
}
92+
if err := s.AddFieldLabelConversionFunc(
93+
schema.GroupVersionKind{Group: corev1alpha3.GroupName, Version: "v1alpha3", Kind: "DomainRecord"},
94+
selectableFieldConversion("spec.zone", "spec.name", "status.type"),
95+
); err != nil {
96+
return err
97+
}
98+
return nil
99+
}

pkg/apiserver/manager.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -943,7 +943,7 @@ func start(
943943
}
944944

945945
srvBuilder := builder.APIServer.
946-
WithAdditionalSchemeInstallers(registerCrossVersionConversions)
946+
WithAdditionalSchemeInstallers(registerCrossVersionConversions, registerFieldLabelConversions)
947947
for _, r := range opts.resources {
948948
srvBuilder = srvBuilder.WithResourceAndStorage(r, kineStore)
949949
}

0 commit comments

Comments
 (0)