带有 Client Go 资源的 MarshalYAML
MarshalYAML with Client Go resources
我正在用 CRD 编写 k8s operator。该资源的状态字段的一部分是一个枚举值,像这样使用 iota:
type Enum int
const (
Enum1 = iota + 1
Enum2
Enum3
...
)
我有一个附加到枚举的函数,可将其转换为字符串表示形式。当客户端将枚举编组到状态 yaml 中时,我希望将该字符串表示用作值。
然而,当我实施 MarshalYAML
(就像我在这个操场上所做的那样:https://play.golang.org/p/qtfFNoOQ-Dz),客户端会 returns 一个错误:
status.test.phase in body must be of type integer: "string"
(status.test.phase
是枚举的位置)
没有该函数,它可以正确编组,只是用整数值代替。
在 playground 中的 gopkg.in/yaml.v2
(工作正常)和 client go 的编组系统之间有什么不同?
@MarufTuhin 的想法是正确的——看起来 openapi/operator-sdk generate openapi
正在生成一个 CRD,由于枚举的类型是 int
,因此需要一个整数。
您可以通过直接在结构中的枚举上方添加此 kubebuilder 注释来为 client-go 修复此问题(参见 reference):
// +kubebuilder:validation:Type=string
Enum Enum `json:"enum"`
或者像这样手动编辑生成的 crd
enum:
type: string
我正在用 CRD 编写 k8s operator。该资源的状态字段的一部分是一个枚举值,像这样使用 iota:
type Enum int
const (
Enum1 = iota + 1
Enum2
Enum3
...
)
我有一个附加到枚举的函数,可将其转换为字符串表示形式。当客户端将枚举编组到状态 yaml 中时,我希望将该字符串表示用作值。
然而,当我实施 MarshalYAML
(就像我在这个操场上所做的那样:https://play.golang.org/p/qtfFNoOQ-Dz),客户端会 returns 一个错误:
status.test.phase in body must be of type integer: "string"
(status.test.phase
是枚举的位置)
没有该函数,它可以正确编组,只是用整数值代替。
在 playground 中的 gopkg.in/yaml.v2
(工作正常)和 client go 的编组系统之间有什么不同?
@MarufTuhin 的想法是正确的——看起来 openapi/operator-sdk generate openapi
正在生成一个 CRD,由于枚举的类型是 int
,因此需要一个整数。
您可以通过直接在结构中的枚举上方添加此 kubebuilder 注释来为 client-go 修复此问题(参见 reference):
// +kubebuilder:validation:Type=string
Enum Enum `json:"enum"`
或者像这样手动编辑生成的 crd
enum:
type: string