go - 带有客户端 Go 资源的 MarshalYAML
问题描述
我正在用 CRD 编写一个k8s 运算符。该资源的状态字段的一部分是枚举值,使用 iota 如下:
type Enum int
const (
Enum1 = iota + 1
Enum2
Enum3
...
)
我有一个附加到枚举的函数,将其转换为字符串表示形式。当客户端将枚举编组到状态 yaml 时,我希望将该字符串表示形式用作值。
但是,当我实现时MarshalYAML
(就像我在这个操场上所做的那样:https: //play.golang.org/p/qtfFNoOQ-Dz),客户端 go 返回一个错误:
status.test.phase in body must be of type integer: "string"
(status.test.phase
是枚举的位置)
如果没有该函数,它会正确编组,而只是使用整数值。
gopkg.in/yaml.v2
在操场上(运行良好)和客户端 go 的编组系统之间有什么不同?
解决方案
@MarufTuhin 有正确的想法 - 看起来 openapi/operator-sdk generate openapi
正在生成一个 CRD,由于枚举的类型是int
.
您可以通过在结构中的枚举正上方添加此 kubebuilder 注释来为 client-go 修复此问题(请参阅参考资料):
// +kubebuilder:validation:Type=string
Enum Enum `json:"enum"`
或者只需手动编辑像这样生成的 crd
enum:
type: string
推荐阅读
- ceph - Rook/Ceph 数据未在两个集群之间正常同步
- laravel - 在 laravel 中显示来自多个表和外键的数据
- javascript - 使用 select2 时出错 Uncaught Error: No select2/compat/containerCss
- opencv - 如何修复“未定义对符号'vxCannyEdgeDetectorNode'的引用”错误在yocto上编译openvx
- asynchronous - 等待异步函数完成
- javascript - 为什么 HTML/JAVASCRIPT 无法识别我设置的密码?
- r - rmarkdown:编织 pdf 文档时的新行为
- firebase - Firebase 存储安全规则和上传文件的下载令牌
- apache-spark - 在纱线集群上提交火花作业时,Log4j 不显示日志
- r - 在 reactiveValues 函数中使用反应输出时 .getReactiveEnvironment()$currentContext() 出错