@@ -99,31 +99,19 @@ func Parse(manifest string, defaultNamespace string, excludedHooks ...string) ma
99
99
if content == "" {
100
100
continue
101
101
}
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
- }
106
102
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 )
114
106
}
115
107
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
127
115
}
128
116
}
129
117
}
@@ -133,6 +121,66 @@ func Parse(manifest string, defaultNamespace string, excludedHooks ...string) ma
133
121
return result
134
122
}
135
123
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
+
136
184
func isHook (metadata metadata , hooks ... string ) bool {
137
185
for _ , hook := range hooks {
138
186
if metadata .Metadata .Annotations [hookAnnotation ] == hook {
0 commit comments