为什么解码返回结果为空
问题描述:
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
`