@@ -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
@@ -136,7 +137,7 @@ func (c *Context[T]) RunTasks(options RunTasksOptions) error {
136137// it is typically called after we have checked the existing state of the Task and determined that is different
137138// from the desired state.
138139func (c * Context [T ]) Render (a , e , changes Task [T ]) error {
139- typeContextPtr := reflect .TypeOf ((* Context [T ])(nil ))
140+ // typeContextPtr := reflect.TypeOf((*Context[T])(nil))
140141 var lifecycle Lifecycle
141142 if hl , ok := e .(HasLifecycle ); ok {
142143 lifecycle = hl .GetLifecycle ()
@@ -192,60 +193,73 @@ func (c *Context[T]) Render(a, e, changes Task[T]) error {
192193 }
193194
194195 v := reflect .ValueOf (e )
195- vType := v .Type ()
196+ // vType := v.Type()
196197
197- targetType := reflect .ValueOf (c .Target ).Type ()
198+ // targetType := reflect.ValueOf(c.Target).Type()
198199
199- var renderer * reflect.Method
200+ var renderer * reflect.Value
200201 var rendererArgs []reflect.Value
202+ rendererName := ""
201203
202- for i := 0 ; i < vType .NumMethod (); i ++ {
203- method := vType .Method (i )
204- if ! strings .HasPrefix (method .Name , "Render" ) {
204+ renderMethodNames := []string {"Render" }
205+
206+ targetTypeName := fmt .Sprintf ("%T" , c .Target )
207+ switch targetTypeName {
208+ case "Foo" :
209+
210+ default :
211+ panic (fmt .Sprintf ("targetType %q is not recognized" , targetTypeName ))
212+ }
213+ for _ , methodName := range renderMethodNames {
214+ method := reflectutils .GetMethodByName (v , methodName )
215+ if method .IsZero () {
205216 continue
206217 }
207218 match := true
208219
209- var args []reflect.Value
210- for j := 0 ; j < method .Type .NumIn (); j ++ {
211- arg := method .Type .In (j )
212- if arg .ConvertibleTo (vType ) {
213- continue
214- }
215- if arg .ConvertibleTo (typeContextPtr ) {
216- args = append (args , reflect .ValueOf (c ))
217- continue
218- }
219- if arg .ConvertibleTo (targetType ) {
220- args = append (args , reflect .ValueOf (c .Target ))
221- continue
222- }
223- match = false
224- break
225- }
220+ // var args []reflect.Value
221+ // for j := 0; j < method.Type.NumIn(); j++ {
222+ // arg := method.Type.In(j)
223+ // if arg.ConvertibleTo(vType) {
224+ // continue
225+ // }
226+ // if arg.ConvertibleTo(typeContextPtr) {
227+ // args = append(args, reflect.ValueOf(c))
228+ // continue
229+ // }
230+ // if arg.ConvertibleTo(targetType) {
231+ // args = append(args, reflect.ValueOf(c.Target))
232+ // continue
233+ // }
234+ // match = false
235+ // break
236+ // }
226237 if match {
227238 if renderer != nil {
228- if method . Name == "Render" {
239+ if methodName == "Render" {
229240 continue
230241 }
231- if renderer . Name != "Render" {
242+ if rendererName != "Render" {
232243 return fmt .Errorf ("found multiple Render methods that could be involved on %T" , e )
233244 }
234245 }
235246 renderer = & method
236- rendererArgs = args
247+ rendererName = methodName
248+ // rendererArgs = args
237249 }
238250
239251 }
240252 if renderer == nil {
241253 return fmt .Errorf ("could not find Render method on type %T (target %T)" , e , c .Target )
242254 }
255+
256+ rendererArgs = append (rendererArgs , reflect .ValueOf (c ))
243257 rendererArgs = append (rendererArgs , reflect .ValueOf (a ))
244258 rendererArgs = append (rendererArgs , reflect .ValueOf (e ))
245259 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 )
260+ klog .V (11 ).Infof ("Calling method %s on %T" , rendererName , e )
261+ // m := v.MethodByName(renderer.Name)
262+ rv := ( * renderer ) .Call (rendererArgs )
249263 var rvErr error
250264 if ! rv [0 ].IsNil () {
251265 rvErr = rv [0 ].Interface ().(error )
0 commit comments