@@ -171,31 +171,38 @@ func eval(path string, opts jsonnet.Opts) (interface{}, *v1alpha1.Config, error)
171
171
return data , nil , nil
172
172
}
173
173
174
- var env * v1alpha1.Config
175
- switch data .(type ) {
176
- case []interface {}:
177
- env = & v1alpha1.Config {}
178
- // data is array, do not try to unmarshal,
179
- // multiple envs currently unsupported
180
- default :
181
- if err := json .Unmarshal ([]byte (raw ), & env ); err != nil {
182
- return nil , nil , errors .Wrap (err , "unmarshalling into v1alpha1.Config" )
174
+ extract , err := extractEnvironments (data )
175
+ if _ , ok := err .(process.ErrorPrimitiveReached ); ok {
176
+ if ! hasSpec {
177
+ // if no environments or spec found, behave as jsonnet interpreter
178
+ return data , nil , err
183
179
}
180
+ } else if err != nil {
181
+ return nil , nil , err
184
182
}
185
183
186
- // env is not a v1alpha1.Config, fallback to original behavior
187
- if env .Kind != "Environment" {
188
- if hasSpec {
189
- specEnv .Data = data
190
- // return env from spec.json
191
- return data , specEnv , nil
192
- } else {
193
- // No spec.json found, behave as jsonnet interpreter
194
- return data , nil , nil
184
+ var env * v1alpha1.Config
185
+
186
+ if len (extract ) > 1 {
187
+ return nil , nil , fmt .Errorf ("more than 1 environments found" )
188
+ } else if len (extract ) == 1 {
189
+ data , err := json .Marshal (extract [0 ])
190
+ if err != nil {
191
+ return nil , nil , err
195
192
}
193
+ env , err = spec .Parse (data )
194
+ if err != nil {
195
+ return nil , nil , err
196
+ }
197
+ } else if hasSpec {
198
+ // if no environments found, fallback to original behavior
199
+ specEnv .Data = data
200
+ return data , specEnv , nil
201
+ } else {
202
+ // if no environments or spec found, behave as jsonnet interpreter
203
+ return data , nil , fmt .Errorf ("no environments found" )
196
204
}
197
- // return env AS IS
198
- return * env , env , nil
205
+ return data , env , nil
199
206
}
200
207
201
208
func checkVersion (constraint string ) error {
@@ -222,3 +229,25 @@ func checkVersion(constraint string) error {
222
229
223
230
return nil
224
231
}
232
+
233
+ func extractEnvironments (data interface {}) (manifest.List , error ) {
234
+ // Scan for everything that looks like a Kubernetes object
235
+ extracted , err := process .Extract (data )
236
+ if err != nil {
237
+ return nil , err
238
+ }
239
+
240
+ // Unwrap *List types
241
+ if err := process .Unwrap (extracted ); err != nil {
242
+ return nil , err
243
+ }
244
+
245
+ // Perhaps filter for kind/name expressions
246
+ out := make (manifest.List , 0 , len (extracted ))
247
+ for _ , m := range extracted {
248
+ out = append (out , m )
249
+ }
250
+
251
+ // Extract only object of Kind: Environment
252
+ return process .Filter (out , process .MustStrExps ("Environment/.*" )), nil
253
+ }
0 commit comments