Skip to content

Commit f79cfef

Browse files
author
Michal Budzyn
authored
✨ Add selectablefield marker (#1050)
* Add selectablefield marker * Selectable field marker parser test
1 parent 3b70a40 commit f79cfef

File tree

6 files changed

+67
-10
lines changed

6 files changed

+67
-10
lines changed

pkg/crd/markers/crd.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ var CRDMarkers = []*definitionWithHelp{
5555

5656
must(markers.MakeDefinition("kubebuilder:metadata", markers.DescribesType, Metadata{})).
5757
WithHelp(Metadata{}.Help()),
58+
59+
must(markers.MakeDefinition("kubebuilder:selectablefield", markers.DescribesType, SelectableField{})).
60+
WithHelp(SelectableField{}.Help()),
5861
}
5962

6063
// TODO: categories and singular used to be annotations types
@@ -388,3 +391,32 @@ func (s Metadata) ApplyToCRD(crd *apiext.CustomResourceDefinition, _ string) err
388391

389392
return nil
390393
}
394+
395+
// +controllertools:marker:generateHelp:category=CRD
396+
397+
// SelectableField adds a field that may be used with field selectors.
398+
type SelectableField struct {
399+
// JSONPath specifies the jsonpath expression which is used to produce a field selector value.
400+
JSONPath string `marker:"JSONPath"`
401+
}
402+
403+
func (s SelectableField) ApplyToCRD(crd *apiext.CustomResourceDefinitionSpec, version string) error {
404+
var selectableFields *[]apiext.SelectableField
405+
for i := range crd.Versions {
406+
ver := &crd.Versions[i]
407+
if ver.Name != version {
408+
continue
409+
}
410+
selectableFields = &ver.SelectableFields
411+
break
412+
}
413+
if selectableFields == nil {
414+
return fmt.Errorf("selectable field applied to version %q not in CRD", version)
415+
}
416+
417+
*selectableFields = append(*selectableFields, apiext.SelectableField{
418+
JSONPath: s.JSONPath,
419+
})
420+
421+
return nil
422+
}

pkg/crd/markers/zz_generated.markerhelp.go

Lines changed: 22 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/crd/testdata/cronjob_types.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,9 @@ type CronJobSpec struct {
352352
// +optional
353353
// +default="TCP"
354354
Protocol corev1.Protocol `json:"protocol,omitempty" protobuf:"bytes,4,opt,name=protocol,casttype=Protocol"`
355+
356+
// This tests that selectable field.
357+
SelectableFieldString string `json:"selectableFieldString,omitempty"`
355358
}
356359

357360
type StringAlias = string
@@ -639,6 +642,7 @@ type CronJobStatus struct {
639642
// +kubebuilder:resource:singular=mycronjob
640643
// +kubebuilder:storageversion
641644
// +kubebuilder:metadata:annotations="api-approved.kubernetes.io=https://github.com/kubernetes-sigs/controller-tools";"cert-manager.io/inject-ca-from-secret=cert-manager/cert-manager-webhook-ca"
645+
// +kubebuilder:selectablefield:JSONPath=`.spec.selectableFieldString`
642646

643647
// CronJob is the Schema for the cronjobs API
644648
type CronJob struct {

pkg/crd/testdata/testdata.kubebuilder.io_cronjobs.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8966,6 +8966,9 @@ spec:
89668966
type: string
89678967
schemaless:
89688968
description: This tests that the schemaless marker works
8969+
selectableFieldString:
8970+
description: This tests that selectable field.
8971+
type: string
89698972
startingDeadlineSeconds:
89708973
description: |-
89718974
Optional deadline in seconds for starting the job if it misses scheduled
@@ -9206,6 +9209,8 @@ spec:
92069209
type: string
92079210
type: object
92089211
type: object
9212+
selectableFields:
9213+
- jsonPath: .spec.selectableFieldString
92099214
served: true
92109215
storage: true
92119216
subresources:

pkg/crd/zz_generated.markerhelp.go

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/genall/zz_generated.markerhelp.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)