@@ -51,7 +51,8 @@ func Parse(in io.Reader) ([]*types.Wrapper, error) {
5151 }
5252 }
5353 dec := json .NewDecoder (bytes .NewReader (jsonBytes ))
54- dec .DisallowUnknownFields ()
54+ dec .DisallowUnknownFields () // this will only warn about top-level keys like spec, api_version
55+ warnDec := json .NewDecoder (bytes .NewReader (jsonBytes ))
5556 errCount := 0
5657 for dec .More () {
5758 var w types.Wrapper
@@ -68,6 +69,9 @@ func Parse(in io.Reader) ([]*types.Wrapper, error) {
6869 continue
6970 }
7071
72+ // Warn if there are unknown fields
73+ stripWrapperAndMaybeWarn (warnDec , & w , count )
74+
7175 resources = append (resources , & w )
7276 count ++
7377 }
@@ -79,6 +83,28 @@ func Parse(in io.Reader) ([]*types.Wrapper, error) {
7983 return resources , err
8084}
8185
86+ // warn if there are any unknown fields in the resource. ignores errors because
87+ // they would be caught by the other decoder.
88+ func stripWrapperAndMaybeWarn (dec * json.Decoder , wrapper * types.Wrapper , count int ) {
89+ envelope := map [string ]* json.RawMessage {}
90+ if err := dec .Decode (& envelope ); err != nil {
91+ return
92+ }
93+ msg := envelope ["spec" ]
94+ if msg == nil {
95+ return
96+ }
97+ resource , err := types .ResolveRaw (wrapper .APIVersion , wrapper .Type )
98+ if err != nil {
99+ return
100+ }
101+ dec = json .NewDecoder (bytes .NewReader (* msg ))
102+ dec .DisallowUnknownFields ()
103+ if err := dec .Decode (& resource ); err != nil {
104+ describeError (count , fmt .Errorf ("warning: %s" , err ))
105+ }
106+ }
107+
82108// splitResources scans the content of the reader and splits the resources.
83109// The resources should be separated by a line containing only "---".
84110// An error will be returned if the data from the reader cannot be read.
0 commit comments