带有 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