go - 带有客户端 Go 资源的 MarshalYAML

标签 go kubernetes yaml client-go

我正在写 k8s operator带有 CRD。该资源的状态字段的一部分是枚举值,使用 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 的编码系统?

最佳答案

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

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

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

或者只需手动编辑像这样生成的 crd
enum:
  type: string

关于go - 带有客户端 Go 资源的 MarshalYAML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58884207/

相关文章:

python - kubernetes python 客户端中的 kubectl cp

yaml - 从 Pandoc YAML front-matter 设置突出显示样式

python - 在pyyaml中表示具有相同基类的不同类的实例

docker - 在k8s进程中, “kube-controller-manager”是来自docker容器的 “child process”。为什么k8s具有这种架构?

logging - Kubernetes Pod日志的绝对路径是什么?

string - 将字符串切成字母

pointers - struct中的指针和值有什么区别?

linux - 通过 Azure Devops 将 .Net Core 3.1 Web 应用部署到 Azure Linux Web 服务时出错

go - 为 docker api 的 golang sdk 中的 ContainerCreate 函数设置 PortBindings 配置

pointers - Golang转换自定义类型并将其指针分配给可行的