Skip to content

Commit 8a31fe0

Browse files
authored
Merge pull request #241 from Liujingfang1/required
Add parsing for required field and corresponding test
2 parents 9f2f498 + 58bab20 commit 8a31fe0

File tree

25 files changed

+1161
-13
lines changed

25 files changed

+1161
-13
lines changed

cmd/internal/codegen/parse/crd.go

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,7 @@ func (b *APIs) parseArrayValidation(t *types.Type, found sets.String, comments [
319319
type objectTemplateArgs struct {
320320
v1beta1.JSONSchemaProps
321321
Fields map[string]string
322+
Required []string
322323
}
323324

324325
var objectTemplate = template.Must(template.New("object-template").Parse(
@@ -329,6 +330,11 @@ var objectTemplate = template.Must(template.New("object-template").Parse(
329330
"{{ $k }}": {{ $v }},
330331
{{ end -}}
331332
},
333+
{{if .Required}}Required: []string{
334+
{{ range $k, $v := .Required -}}
335+
"{{ $v }}",
336+
{{ end -}}
337+
},{{ end -}}
332338
}`))
333339

334340
// parseObjectValidation returns a JSONSchemaProps object and its serialization in
@@ -340,19 +346,20 @@ func (b *APIs) parseObjectValidation(t *types.Type, found sets.String, comments
340346
}
341347

342348
if strings.HasPrefix(t.Name.String(), "k8s.io/api") {
343-
if err := objectTemplate.Execute(buff, objectTemplateArgs{props, nil}); err != nil {
349+
if err := objectTemplate.Execute(buff, objectTemplateArgs{props, nil, nil}); err != nil {
344350
log.Fatalf("%v", err)
345351
}
346352
} else {
347-
m, result := b.getMembers(t, found)
353+
m, result, required := b.getMembers(t, found)
348354
props.Properties = m
355+
props.Required = required
349356

350357
// Only add field validation for non-inlined fields
351358
for _, l := range comments {
352359
getValidation(l, &props)
353360
}
354361

355-
if err := objectTemplate.Execute(buff, objectTemplateArgs{props, result}); err != nil {
362+
if err := objectTemplate.Execute(buff, objectTemplateArgs{props, result, required}); err != nil {
356363
log.Fatalf("%v", err)
357364
}
358365
}
@@ -475,15 +482,16 @@ func getValidation(comment string, props *v1beta1.JSONSchemaProps) {
475482

476483
// getMembers builds maps by field name of the JSONSchemaProps and their Go
477484
// serializations.
478-
func (b *APIs) getMembers(t *types.Type, found sets.String) (map[string]v1beta1.JSONSchemaProps, map[string]string) {
485+
func (b *APIs) getMembers(t *types.Type, found sets.String) (map[string]v1beta1.JSONSchemaProps, map[string]string, []string) {
479486
members := map[string]v1beta1.JSONSchemaProps{}
480487
result := map[string]string{}
488+
required := []string{}
481489

482490
// Don't allow recursion until we support it through refs
483491
// TODO: Support recursion
484492
if found.Has(t.Name.String()) {
485493
fmt.Printf("Breaking recursion for type %s", t.Name.String())
486-
return members, result
494+
return members, result, required
487495
}
488496
found.Insert(t.Name.String())
489497

@@ -506,22 +514,26 @@ func (b *APIs) getMembers(t *types.Type, found sets.String) (map[string]v1beta1.
506514

507515
// Inline "inline" structs
508516
if strat == "inline" {
509-
m, r := b.getMembers(member.Type, found)
517+
m, r, re:= b.getMembers(member.Type, found)
510518
for n, v := range m {
511519
members[n] = v
512520
}
513521
for n, v := range r {
514522
result[n] = v
515523
}
524+
required = append(required, re...)
516525
} else {
517526
m, r := b.typeToJSONSchemaProps(member.Type, found, member.CommentLines)
518527
members[name] = m
519528
result[name] = r
529+
if !strings.HasSuffix(strat, "omitempty") {
530+
required = append(required, name)
531+
}
520532
}
521533
}
522534

523535
defer found.Delete(t.Name.String())
524-
return members, result
536+
return members, result, required
525537
}
526538

527539
// getCategoriesTag returns the value of the +kubebuilder:categories tags

test.sh

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -517,18 +517,18 @@ function test_crd_validation {
517517
sed -i -e '/type HouseSpec struct/ a \
518518
// +kubebuilder:validation:Maximum=100\
519519
// +kubebuilder:validation:ExclusiveMinimum=true\
520-
Power float32 \`json:"power"\`\
521-
Bricks int32 \`json:"bricks"\`\
520+
Power float32 \`json:"power,omitempty"\`\
521+
Bricks int32 \`json:"bricks,omitempty"\`\
522522
// +kubebuilder:validation:MaxLength=15\
523523
// +kubebuilder:validation:MinLength=1\
524-
Name string \`json:"name"\`\
524+
Name string \`json:"name,omitempty"\`\
525525
// +kubebuilder:validation:MaxItems=500\
526526
// +kubebuilder:validation:MinItems=1\
527527
// +kubebuilder:validation:UniqueItems=false\
528-
Knights []string \`json:"knights"\`\
529-
Winner bool \`json:"winner"\`\
528+
Knights []string \`json:"knights,omitempty"\`\
529+
Winner bool \`json:"winner,omitempty"\`\
530530
// +kubebuilder:validation:Enum=Lion,Wolf,Dragon\
531-
Alias string \`json:"alias"\`\
531+
Alias string \`json:"alias,omitempty"\`\
532532
// +kubebuilder:validation:Enum=1,2,3\
533533
Rank int \`json:"rank"\`\
534534
Comment []byte \`json:"comment,omitempty"\`\

test/data/resource/expected/crd-expected.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ spec:
5959
type: integer
6060
winner:
6161
type: boolean
62+
required:
63+
- rank
6264
type: object
6365
status:
6466
type: object

test/projects/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ Sample project is a project that created by kubebuilder and moved into `samples`
44

55
## Current Sample Projects
66
- memcached-api-apiserver
7+
- validations
78

89
## Test Sample Project
910
Run following command to test a sample project such as memcached-api-apiserver

test/projects/memcached-api-server/test/hack/install.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ spec:
2828
maximum: 100
2929
minimum: 5
3030
type: integer
31+
required:
32+
- size
3133
type: object
3234
status:
3335
properties:

0 commit comments

Comments
 (0)