@@ -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
@@ -136,7 +137,7 @@ func (c *Context[T]) RunTasks(options RunTasksOptions) error {
136
137
// it is typically called after we have checked the existing state of the Task and determined that is different
137
138
// from the desired state.
138
139
func (c * Context [T ]) Render (a , e , changes Task [T ]) error {
139
- typeContextPtr := reflect .TypeOf ((* Context [T ])(nil ))
140
+ // typeContextPtr := reflect.TypeOf((*Context[T])(nil))
140
141
var lifecycle Lifecycle
141
142
if hl , ok := e .(HasLifecycle ); ok {
142
143
lifecycle = hl .GetLifecycle ()
@@ -192,60 +193,73 @@ func (c *Context[T]) Render(a, e, changes Task[T]) error {
192
193
}
193
194
194
195
v := reflect .ValueOf (e )
195
- vType := v .Type ()
196
+ // vType := v.Type()
196
197
197
- targetType := reflect .ValueOf (c .Target ).Type ()
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
202
+ rendererName := ""
201
203
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 () {
205
216
continue
206
217
}
207
218
match := true
208
219
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
+ // }
226
237
if match {
227
238
if renderer != nil {
228
- if method . Name == "Render" {
239
+ if methodName == "Render" {
229
240
continue
230
241
}
231
- if renderer . Name != "Render" {
242
+ if rendererName != "Render" {
232
243
return fmt .Errorf ("found multiple Render methods that could be involved on %T" , e )
233
244
}
234
245
}
235
246
renderer = & method
236
- rendererArgs = args
247
+ rendererName = methodName
248
+ // rendererArgs = args
237
249
}
238
250
239
251
}
240
252
if renderer == nil {
241
253
return fmt .Errorf ("could not find Render method on type %T (target %T)" , e , c .Target )
242
254
}
255
+
256
+ rendererArgs = append (rendererArgs , reflect .ValueOf (c ))
243
257
rendererArgs = append (rendererArgs , reflect .ValueOf (a ))
244
258
rendererArgs = append (rendererArgs , reflect .ValueOf (e ))
245
259
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 )
249
263
var rvErr error
250
264
if ! rv [0 ].IsNil () {
251
265
rvErr = rv [0 ].Interface ().(error )
0 commit comments