MarshalYAML与Client Go资源

时间:2019-11-15 20:24:53

标签: go kubernetes yaml client-go

我正在使用CRD编写k8s operator。该资源的状态字段的一部分是枚举值,使用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(可以正常工作)和客户围棋的编组系统之间有什么不同?

1 个答案:

答案 0 :(得分:0)

@MarufTuhin的想法正确-看起来像openapi / operator-sdk generate openapi正在生成CRD,由于枚举类型为int,该CRD期望一个整数。

您可以通过在结构体枚举上方直接添加以下kubebuilder注释来解决此问题(请参见reference):

// +kubebuilder:validation:Type=string
Enum Enum `json:"enum"`

或仅通过手动编辑生成的crd即可

enum:
  type: string