@@ -319,6 +319,7 @@ func (b *APIs) parseArrayValidation(t *types.Type, found sets.String, comments [
319319type objectTemplateArgs struct {
320320 v1beta1.JSONSchemaProps
321321 Fields map [string ]string
322+ Required []string
322323}
323324
324325var 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
0 commit comments