首页 > 解决方案 > 带有客户端 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 的编组系统之间有什么不同?

标签: gokubernetesyamlclient-go

解决方案


@MarufTuhin 有正确的想法 - 看起来 openapi/operator-sdk generate openapi正在生成一个 CRD,由于枚举的类型是int.

您可以通过在结构中的枚举正上方添加此 kubebuilder 注释来为 client-go 修复此问题(请参阅参考资料):

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

或者只需手动编辑像这样生成的 crd

enum:
  type: string

推荐阅读