@@ -99,31 +99,19 @@ func Parse(manifest string, defaultNamespace string, excludedHooks ...string) ma
9999 if content == "" {
100100 continue
101101 }
102- var parsedMetadata metadata
103- if err := yaml .Unmarshal ([]byte (content ), & parsedMetadata ); err != nil {
104- log .Fatalf ("YAML unmarshal error: %s\n Can't unmarshal %s" , err , content )
105- }
106102
107- // Skip content without any metadata. It is probably a template that
108- // only contains comments in the current state.
109- if parsedMetadata .APIVersion == "" && parsedMetadata .Kind == "" {
110- continue
111- }
112- if isHook (parsedMetadata , excludedHooks ... ) {
113- continue
103+ parsed , err := parseContent (content , defaultNamespace , excludedHooks ... )
104+ if err != nil {
105+ log .Fatalf ("%v" , err )
114106 }
115107
116- if parsedMetadata .Metadata .Namespace == "" {
117- parsedMetadata .Metadata .Namespace = defaultNamespace
118- }
119- name := parsedMetadata .String ()
120- if _ , ok := result [name ]; ok {
121- log .Printf ("Error: Found duplicate key %#v in manifest" , name )
122- } else {
123- result [name ] = & MappingResult {
124- Name : name ,
125- Kind : parsedMetadata .Kind ,
126- Content : content ,
108+ for _ , p := range parsed {
109+ name := p .Name
110+
111+ if _ , ok := result [name ]; ok {
112+ log .Printf ("Error: Found duplicate key %#v in manifest" , name )
113+ } else {
114+ result [name ] = p
127115 }
128116 }
129117 }
@@ -133,6 +121,66 @@ func Parse(manifest string, defaultNamespace string, excludedHooks ...string) ma
133121 return result
134122}
135123
124+ func parseContent (content string , defaultNamespace string , excludedHooks ... string ) ([]* MappingResult , error ) {
125+ var parsedMetadata metadata
126+ if err := yaml .Unmarshal ([]byte (content ), & parsedMetadata ); err != nil {
127+ log .Fatalf ("YAML unmarshal error: %s\n Can't unmarshal %s" , err , content )
128+ }
129+
130+ // Skip content without any metadata. It is probably a template that
131+ // only contains comments in the current state.
132+ if parsedMetadata .APIVersion == "" && parsedMetadata .Kind == "" {
133+ return nil , nil
134+ }
135+
136+ if parsedMetadata .Kind == "List" {
137+ type ListV1 struct {
138+ Items []yaml.MapSlice `yaml:"items"`
139+ }
140+
141+ var list ListV1
142+
143+ if err := yaml .Unmarshal ([]byte (content ), & list ); err != nil {
144+ log .Fatalf ("YAML unmarshal error: %s\n Can't unmarshal %s" , err , content )
145+ }
146+
147+ var result []* MappingResult
148+
149+ for _ , item := range list .Items {
150+ subcontent , err := yaml .Marshal (item )
151+ if err != nil {
152+ log .Printf ("YAML marshal error: %s\n Can't marshal %v" , err , item )
153+ }
154+
155+ subs , err := parseContent (string (subcontent ), defaultNamespace , excludedHooks ... )
156+ if err != nil {
157+ return nil , fmt .Errorf ("Parsing YAML list item: %v" , err )
158+ }
159+
160+ result = append (result , subs ... )
161+ }
162+
163+ return result , nil
164+ }
165+
166+ if isHook (parsedMetadata , excludedHooks ... ) {
167+ return nil , nil
168+ }
169+
170+ if parsedMetadata .Metadata .Namespace == "" {
171+ parsedMetadata .Metadata .Namespace = defaultNamespace
172+ }
173+
174+ name := parsedMetadata .String ()
175+ return []* MappingResult {
176+ {
177+ Name : name ,
178+ Kind : parsedMetadata .Kind ,
179+ Content : content ,
180+ },
181+ }, nil
182+ }
183+
136184func isHook (metadata metadata , hooks ... string ) bool {
137185 for _ , hook := range hooks {
138186 if metadata .Metadata .Annotations [hookAnnotation ] == hook {
0 commit comments