@@ -27,6 +27,7 @@ import (
2727 "k8s.io/klog/v2"
2828 "k8s.io/kops/pkg/apis/kops"
2929 "k8s.io/kops/pkg/apis/nodeup"
30+ "k8s.io/kops/util/pkg/reflectutils"
3031 "k8s.io/kops/util/pkg/vfs"
3132)
3233
@@ -196,19 +197,44 @@ func (c *Context[T]) Render(a, e, changes Task[T]) error {
196197
197198 targetType := reflect .ValueOf (c .Target ).Type ()
198199
199- var renderer * reflect.Method
200+ var renderer * reflect.Value
200201 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 () {
205230 continue
206231 }
207232 match := true
208233
234+ methodType := method .Type ()
209235 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 )
212238 if arg .ConvertibleTo (vType ) {
213239 continue
214240 }
@@ -225,27 +251,29 @@ func (c *Context[T]) Render(a, e, changes Task[T]) error {
225251 }
226252 if match {
227253 if renderer != nil {
228- if method . Name == "Render" {
254+ if methodName == "Render" {
229255 continue
230256 }
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 )
233259 }
234260 }
235261 renderer = & method
262+ rendererName = methodName
236263 rendererArgs = args
237264 }
238-
239265 }
266+
240267 if renderer == nil {
241268 return fmt .Errorf ("could not find Render method on type %T (target %T)" , e , c .Target )
242269 }
270+
243271 rendererArgs = append (rendererArgs , reflect .ValueOf (a ))
244272 rendererArgs = append (rendererArgs , reflect .ValueOf (e ))
245273 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 )
249277 var rvErr error
250278 if ! rv [0 ].IsNil () {
251279 rvErr = rv [0 ].Interface ().(error )
0 commit comments