为什么解码返回结果为空

问题描述:

I have below code, I would like to convert yaml to client go data structure and get the object name from it

package main

import (
  "fmt"

  "k8s.io/api/extensions/v1beta1"
  "k8s.io/client-go/kubernetes/scheme"
)

var yml = `
apiVersion: extensions/v1beta1
kind: Deployment
metadata: 
name: testnginx
replicas: 1
spec: 
template:
  metadata:
    labels:
      run: testnginx
  spec:
    containers:
    - image: nginx
      name: testnginx
      ports:
      - containerPort: 8080
`

func main() {
    decode := scheme.Codecs.UniversalDeserializer().Decode

    obj, _, err := decode([]byte(yml), nil, nil)
    if err != nil {
        fmt.Printf("%#v", err)
    }

  //fmt.Printf("%#v
", obj)
  deployment := obj.(*v1beta1.Deployment)

    fmt.Printf("%#v
", deployment.ObjectMeta.Name)
}

The return result supposes to be testnginx but it is empty

$ ./decode-k8s-exercise 
""

Not sure why. thanks

我有以下代码,我想将yaml转换为client go数据结构并从中获取对象名称

 包main 
 
import(
“ fmt” 
 
“ k8s.io/api/extensions/v1beta1"
” k8s.io/client-go  / kubernetes / scheme“ 
)
 
var yml =`
apiVersion:extensions / v1beta1 
kind:Deployment 
metadata:
name:testnginx 
replicas:1 
spec:
template:
元数据:
标签:  
运行:testnginx 
规范:
容器:
-映像:nginx 
名称:testnginx 
端口:
-containerPort:8080 
` 
 
func main(){
解码:=  scheme.Codecs.UniversalDeserializer()。解码
 
 obj,_,err:=解码([] byte(yml),nil,nil)
如果err!= nil {
 fmt.Printf(“%#  v“,err)
} 
 
 //fmt.Printf("%#v
”,obj)
部署:= obj。(* v1beta1.Deployment)
 
 fmt.Printf(“  %#v 
“,deployment.ObjectMeta.Name)
} 
  code>  pre> 
 
 

返回结果应该是testnginx,但为空 p>

  $  ./decode-k8s-exercise 
“” 
  code>  pre> 
 
 

不知道为什么。 谢谢 p> div>

The problem is in the yaml. The name field should be an attribute inside metadata but they are currently at the same level. If you space indent the name then it should work (the same applies to template later on). relicas should also be inside spec:

var yml = `
apiVersion: extensions/v1beta1
kind: Deployment
metadata: 
  name: testnginx
spec:
  replicas: 1
  template:
    metadata:
      labels:
        run: testnginx
    spec:
      containers:
      - image: nginx
        name: testnginx
        ports:
        - containerPort: 8080
`