in operatortrace-go/pkg/client/conditions.go [125:174]
func getConditionsAsMap(obj client.Object, scheme *runtime.Scheme) ([]map[string]interface{}, error) {
gvk, err := apiutil.GVKForObject(obj, scheme)
if err != nil {
return nil, fmt.Errorf("problem getting the GVK: %w", err)
}
objTyped, err := scheme.New(gvk)
if err != nil {
return nil, fmt.Errorf("problem creating new object of kind %s: %w", gvk.Kind, err)
}
if err := scheme.Convert(obj, objTyped, nil); err != nil {
return nil, fmt.Errorf("problem converting object to kind %s: %w", gvk.Kind, err)
}
val := reflect.ValueOf(objTyped)
statusField := val.Elem().FieldByName("Status")
if !statusField.IsValid() {
return nil, fmt.Errorf("status field not found in kind %s", gvk.Kind)
}
conditionsField := statusField.FieldByName("Conditions")
if !conditionsField.IsValid() {
return nil, fmt.Errorf("conditions field not found in kind %s", gvk.Kind)
}
conditionsValue := conditionsField.Interface()
val = reflect.ValueOf(conditionsValue)
if val.Kind() != reflect.Slice {
return nil, fmt.Errorf("conditions field is not a slice")
}
var conditionsAsMap []map[string]interface{}
for i := 0; i < val.Len(); i++ {
conditionVal := val.Index(i)
if conditionVal.Kind() == reflect.Ptr {
conditionVal = conditionVal.Elem()
}
conditionMap := make(map[string]interface{})
for _, field := range reflect.VisibleFields(conditionVal.Type()) {
fieldValue := conditionVal.FieldByIndex(field.Index)
conditionMap[field.Name] = fieldValue.Interface()
}
conditionsAsMap = append(conditionsAsMap, conditionMap)
}
return conditionsAsMap, nil
}