我正在写 k8s operator带有 CRD。该资源的状态字段的一部分是枚举值,使用 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
由于枚举类型为 int
,正在生成一个期望整数的 CRD .
您可以通过在结构中的枚举正上方添加此 kubebuilder 注释来为 client-go 修复此问题(请参阅 reference ):
// +kubebuilder:validation:Type=string
Enum Enum `json:"enum"`
或者只需手动编辑像这样生成的 crd
enum:
type: string
关于go - 带有客户端 Go 资源的 MarshalYAML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58884207/