解析字节数组以获取YAML值- kubebuilder

3
我们正在使用kubebuilder来构建自定义控制器,问题是当您应用文件时,无法解析原始数据,因为它为空。
我已经创建了一个非常简单的示例来描述这个问题。
apiVersion:mygroup.test.com/v1alpha1
kind: Rawtest
metadata:
  name: rawtest-sample
spec:
  system:
    type: test
    provider:
      type: aws
      infrastructureConfig:
        kind: InfrastructureConfig
        apiVersion: v1alpha1
        networks:
          vpc:
            cidr: aaa
          zones:
            - name: abc
              internal: 123
      workers:
        - name: myworker
          machine:
            type: "mt"
            image:
              name: name1
              version: "2"
          maximum: 2
          minimum: 1
          maxUnavailable: 0
          volume:
            type: a1
            size: 20Gi
          zones:
            - zone1

在运行时,我能够获得spec.system.type的值为test和spec.system.provider.type的值为"aws",但是我无法获取infrastructureConfig:下的所有数据(第10行),你有什么想法如何克服这个问题吗?
我创建了这个非常简单的项目来演示这个问题,可以查看api/type文件夹,在获取协调对象之后(应用config/sample/文件后),您会发现infrastructureconfig和所有相关数据都在那里。

https://github.com/JennyMet/

以下是试图读取原始值的代码: https://github.com/JennyMet/kuberaw/blob/master/controllers/rawtest_controller.go#L57

&rawtest 应包含所有数据

请查看类型 https://github.com/JennyMet/kuberaw/blob/master/api/v1alpha1/rawtest_types.go#L32

原始类型 https://github.com/gardener/gardener/blob/bf32324d9d1a366d8a0a7514956dc39c2f22f7b7/pkg/apis/core/v1beta1/types_shoot.go#L945

https://github.com/gardener/gardener/blob/bf32324d9d1a366d8a0a7514956dc39c2f22f7b7/pkg/apis/core/types_shoot.go#L774

https://github.com/gardener/gardener/blob/bf32324d9d1a366d8a0a7514956dc39c2f22f7b7/vendor/k8s.io/apimachinery/pkg/runtime/types.go#L94:6

我需要一种方法让它在kubebuilder中工作,因为当我应用文件时,调试中没有得到值... 调试图片

enter image description here

如果有遗漏,请告诉我。

@flyx - 谢谢!当我把它改成小写时,我遇到了一个错误“com.test.mygroup.v1alpha1.Rawtest.spec.system.provider”中的未知字段“infrastructureconfig”。我应该尝试些什么别的吗? - Jenny M
你能提供你项目中尝试访问该值的代码链接吗?我找不到它,如果不知道你如何尝试访问该值,我无法给出更多建议。 - flyx
在扫描您的go.sum时,我发现您的代码似乎使用了ghodss/yaml来加载YAML。这否定了我之前的推断,即json:被忽略了(然而,使用该yaml包装库有自己的问题集)。可能是这个YAML以两种不同的方式进行处理,具有不同的代码路径,其中第一种导致您在评论中显示的错误,而第二种不使用ghodss,从而跳过infrastructureConfig - flyx
go.sum中存在gopkg.in/yaml.v3的存在意味着某些东西正在使用原始的go-yaml,因为ghodss/yaml仍然可与gopkg.in/yaml.v2一起使用。但它也可能只是一些不相关的依赖关系。 - flyx
@flyx - 谢谢,这是一个非常简单的应用程序,演示了这个问题,我在问题中放置了链接,请参见 https://github.com/JennyMet/kuberaw/blob/master/controllers/rawtest_controller.go#L57 ,&rawtest 应该包含所有数据,但目前它除了 InfrastructureConfig 值之外都包含。 - Jenny M
显示剩余4条评论
1个回答

0

我做了以下事情

  1. 访问网站,例如https://yaml.to-go.online/将YAML转换为Go结构体

  2. 创建一个结构体

    t := AutoGenerated{}

  3. 我假设YAML数据已经作为[]byte加载到内存中

  4. 使用"gopkg.in/yaml.v2",将YAML解组到结构体中

    err := yaml.Unmarshal([]byte(data), &t)

  5. InfrastructureConfig字段可用作t.Spec.System.Provider.InfrastructureConfig

请参见https://play.golang.org/p/syx8v7gAmDH


非常感谢,问题在于我在 kube-builder 中无法获得 infrastructureconfig 的内容(调试时为空数组),但可以获取其他值...这和我需要在此处放置一些注释有关吗? https://github.com/JennyMet/kuberaw/blob/master/api/v1alpha1/rawtest_types.go#L32 - Jenny M
我设置了悬赏,如果您能看一下就太好了,谢谢! - Jenny M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接