我正在使用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
(可以正常工作)和客户围棋的编组系统之间有什么不同?
答案 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