@@ -64,16 +64,20 @@ func (p *loaded) connect() (*kubernetes.Kubernetes, error) {
64
64
65
65
// load runs all processing stages described at the Processed type
66
66
func load (path string , opts Opts ) (* loaded , error ) {
67
- raw , env , err := eval (path , opts .JsonnetOpts )
67
+ _ , env , err := eval (path , opts .JsonnetOpts )
68
68
if err != nil {
69
69
return nil , err
70
70
}
71
71
72
+ if env == nil {
73
+ return nil , fmt .Errorf ("no Tanka environment found" )
74
+ }
75
+
72
76
if err := checkVersion (env .Spec .ExpectVersions .Tanka ); err != nil {
73
77
return nil , err
74
78
}
75
79
76
- rec , err := process .Process (raw , * env , opts .Filters )
80
+ rec , err := process .Process (env . Data , * env , opts .Filters )
77
81
if err != nil {
78
82
return nil , err
79
83
}
@@ -87,12 +91,7 @@ func load(path string, opts Opts) (*loaded, error) {
87
91
// eval runs all processing stages describe at the Processed type apart from
88
92
// post-processing, thus returning the raw Jsonnet result.
89
93
func eval (path string , opts jsonnet.Opts ) (raw interface {}, env * v1alpha1.Config , err error ) {
90
- env , err = parseSpec (path )
91
- if err != nil {
92
- return nil , nil , err
93
- }
94
-
95
- raw , err = evalJsonnet (path , env , opts )
94
+ raw , env , err = evalJsonnet (path , opts )
96
95
if err != nil {
97
96
return nil , nil , errors .Wrap (err , "evaluating jsonnet" )
98
97
}
@@ -119,7 +118,7 @@ func parseSpec(path string) (*v1alpha1.Config, error) {
119
118
log .Println (err )
120
119
// spec.json missing. we can still work with the default value
121
120
case spec.ErrNoSpec :
122
- return config , nil
121
+ return config , err
123
122
// some other error
124
123
default :
125
124
return nil , errors .Wrap (err , "reading spec.json" )
@@ -130,39 +129,83 @@ func parseSpec(path string) (*v1alpha1.Config, error) {
130
129
}
131
130
132
131
// evalJsonnet evaluates the jsonnet environment at the given path
133
- func evalJsonnet (path string , env * v1alpha1. Config , opts jsonnet.Opts ) (interface {}, error ) {
134
- // make env spec accessible from Jsonnet
135
- jsonEnv , err := json . Marshal ( env )
132
+ func evalJsonnet (path string , opts jsonnet.Opts ) (interface {}, * v1alpha1. Config , error ) {
133
+ var hasSpec bool
134
+ specEnv , err := parseSpec ( path )
136
135
if err != nil {
137
- return nil , errors .Wrap (err , "marshalling environment config" )
136
+ switch err .(type ) {
137
+ case spec.ErrNoSpec :
138
+ hasSpec = false
139
+ default :
140
+ return nil , nil , errors .Wrap (err , "reading spec.json" )
141
+ }
142
+ } else {
143
+ hasSpec = true
144
+
145
+ // original behavior, if env has spec.json
146
+ // then make env spec accessible through extCode
147
+ jsonEnv , err := json .Marshal (specEnv )
148
+ if err != nil {
149
+ return nil , nil , errors .Wrap (err , "marshalling environment config" )
150
+ }
151
+ opts .ExtCode .Set (spec .APIGroup + "/environment" , string (jsonEnv ))
138
152
}
139
- opts .ExtCode .Set (spec .APIGroup + "/environment" , string (jsonEnv ))
140
153
141
- // evaluate Jsonnet
142
- var raw string
143
154
entrypoint , err := jpath .Entrypoint (path )
144
155
if err != nil {
145
- return nil , err
156
+ return nil , nil , err
146
157
}
147
158
159
+ // evaluate Jsonnet
160
+ var raw string
148
161
if opts .EvalPattern != "" {
149
162
evalScript := fmt .Sprintf ("(import '%s').%s" , entrypoint , opts .EvalPattern )
150
163
raw , err = jsonnet .Evaluate (entrypoint , evalScript , opts )
151
164
if err != nil {
152
- return nil , err
165
+ return nil , nil , err
153
166
}
154
167
} else {
155
168
raw , err = jsonnet .EvaluateFile (entrypoint , opts )
156
169
if err != nil {
157
- return nil , err
170
+ return nil , nil , err
158
171
}
159
172
}
160
- // parse result
173
+
161
174
var data interface {}
162
175
if err := json .Unmarshal ([]byte (raw ), & data ); err != nil {
163
- return nil , err
176
+ return nil , nil , err
177
+ }
178
+
179
+ if opts .EvalPattern != "" {
180
+ // EvalPattern has no affinity with an environment, behave as jsonnet interpreter
181
+ return data , nil , err
182
+ }
183
+
184
+ var env * v1alpha1.Config
185
+ switch data .(type ) {
186
+ case []interface {}:
187
+ env = & v1alpha1.Config {}
188
+ // data is array, do not try to unmarshal,
189
+ // multiple envs currently unsupported
190
+ default :
191
+ if err := json .Unmarshal ([]byte (raw ), & env ); err != nil {
192
+ return nil , nil , err
193
+ }
194
+ }
195
+
196
+ // env is not a v1alpha1.Config, fallback to original behavior
197
+ if env .Kind != "Environment" {
198
+ if hasSpec {
199
+ specEnv .Data = data
200
+ // return env from spec.json
201
+ return data , specEnv , nil
202
+ } else {
203
+ // No spec.json found, behave as jsonnet interpreter
204
+ return data , nil , nil
205
+ }
164
206
}
165
- return data , nil
207
+ // return env AS IS
208
+ return * env , env , nil
166
209
}
167
210
168
211
func checkVersion (constraint string ) error {
0 commit comments