@@ -27,6 +27,7 @@ import (
27
27
"k8s.io/klog/v2"
28
28
"k8s.io/kops/pkg/apis/kops"
29
29
"k8s.io/kops/pkg/apis/nodeup"
30
+ "k8s.io/kops/util/pkg/reflectutils"
30
31
"k8s.io/kops/util/pkg/vfs"
31
32
)
32
33
@@ -196,19 +197,44 @@ func (c *Context[T]) Render(a, e, changes Task[T]) error {
196
197
197
198
targetType := reflect .ValueOf (c .Target ).Type ()
198
199
199
- var renderer * reflect.Method
200
+ var renderer * reflect.Value
200
201
var rendererArgs []reflect.Value
201
-
202
- for i := 0 ; i < vType .NumMethod (); i ++ {
203
- method := vType .Method (i )
204
- if ! strings .HasPrefix (method .Name , "Render" ) {
202
+ rendererName := ""
203
+
204
+ renderMethodNames := []string {"Render" }
205
+
206
+ targetTypeName := fmt .Sprintf ("%T" , c .Target )
207
+ switch targetTypeName {
208
+ case "*awsup.AWSAPITarget" :
209
+ renderMethodNames = append (renderMethodNames , "RenderAWS" )
210
+ case "*azure.AzureAPITarget" :
211
+ renderMethodNames = append (renderMethodNames , "RenderAzure" )
212
+ case "*do.DOAPITarget" :
213
+ renderMethodNames = append (renderMethodNames , "RenderDO" )
214
+ case "*gce.GCEAPITarget" :
215
+ renderMethodNames = append (renderMethodNames , "RenderGCE" )
216
+ case "*hetzner.HetznerAPITarget" :
217
+ renderMethodNames = append (renderMethodNames , "RenderHetzner" )
218
+ case "*openstack.OpenstackAPITarget" :
219
+ renderMethodNames = append (renderMethodNames , "RenderOpenstack" )
220
+ case "*scaleway.ScwAPITarget" :
221
+ renderMethodNames = append (renderMethodNames , "RenderScw" )
222
+ case "*terraform.TerraformTarget" :
223
+ renderMethodNames = append (renderMethodNames , "RenderTerraform" )
224
+ default :
225
+ panic (fmt .Sprintf ("targetType %q is not recognized" , targetTypeName ))
226
+ }
227
+ for _ , methodName := range renderMethodNames {
228
+ method := reflectutils .GetMethodByName (v , methodName )
229
+ if ! method .IsValid () {
205
230
continue
206
231
}
207
232
match := true
208
233
234
+ methodType := method .Type ()
209
235
var args []reflect.Value
210
- for j := 0 ; j < method . Type .NumIn (); j ++ {
211
- arg := method . Type .In (j )
236
+ for j := 0 ; j < methodType .NumIn (); j ++ {
237
+ arg := methodType .In (j )
212
238
if arg .ConvertibleTo (vType ) {
213
239
continue
214
240
}
@@ -225,27 +251,29 @@ func (c *Context[T]) Render(a, e, changes Task[T]) error {
225
251
}
226
252
if match {
227
253
if renderer != nil {
228
- if method . Name == "Render" {
254
+ if methodName == "Render" {
229
255
continue
230
256
}
231
- if renderer . Name != "Render" {
232
- return fmt .Errorf ("found multiple Render methods that could be involved on %T" , e )
257
+ if rendererName != "Render" {
258
+ return fmt .Errorf ("found multiple Render methods that could be invoked on %T" , e )
233
259
}
234
260
}
235
261
renderer = & method
262
+ rendererName = methodName
236
263
rendererArgs = args
237
264
}
238
-
239
265
}
266
+
240
267
if renderer == nil {
241
268
return fmt .Errorf ("could not find Render method on type %T (target %T)" , e , c .Target )
242
269
}
270
+
243
271
rendererArgs = append (rendererArgs , reflect .ValueOf (a ))
244
272
rendererArgs = append (rendererArgs , reflect .ValueOf (e ))
245
273
rendererArgs = append (rendererArgs , reflect .ValueOf (changes ))
246
- klog .V (11 ).Infof ("Calling method %s on %T" , renderer . Name , e )
247
- m := v .MethodByName (renderer .Name )
248
- rv := m .Call (rendererArgs )
274
+ klog .V (11 ).Infof ("Calling method %s on %T" , rendererName , e )
275
+ // m := v.MethodByName(renderer.Name)
276
+ rv := ( * renderer ) .Call (rendererArgs )
249
277
var rvErr error
250
278
if ! rv [0 ].IsNil () {
251
279
rvErr = rv [0 ].Interface ().(error )
0 commit comments