Reputation: 1943
I'm looking into writing a tool that generates Kubernetes definitions programatically for our project.
I've found that the API types in Kubernetes can be found in k8s.io/kubernetes/pkg/api
. I would like to output YAML based on these types.
Given an object like this:
ns := &api.Namespace{
ObjectMeta: api.ObjectMeta{
Name: "test",
},
}
What's the best way to generate the YAML output expected by kubectl create
?
Upvotes: 3
Views: 4377
Reputation: 29
Their API has updated, so this is how it looks like:
import k8sJson "k8s.io/apimachinery/pkg/runtime/serializer/json"
...
serializer := k8sJson.NewSerializerWithOptions(
k8sJson.DefaultMetaFactory, nil, nil,
k8sJson.SerializerOptions{
Yaml: true,
Pretty: true,
Strict: true,
},
)
Upvotes: 2
Reputation: 11
package main
import (
"os"
v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime/serializer/json"
)
func main() {
ns := &v1.Namespace{
TypeMeta: metav1.TypeMeta{
Kind: "Namespace",
APIVersion: "v1",
},
ObjectMeta: metav1.ObjectMeta{
Name: "test",
},
}
e := json.NewYAMLSerializer(json.DefaultMetaFactory, nil, nil)
//err := e.EncodeToStream(ns, os.Stdout)
err := e.Encode(ns, os.Stdout)
if err != nil {
panic(err)
}
}
Upvotes: 1
Reputation: 1943
Found it, for future reference, here's what you might want to do:
package main
import (
"os"
"k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/api/v1"
"k8s.io/kubernetes/pkg/runtime/serializer/json"
)
func main() {
ns := &v1.Namespace{
TypeMeta: unversioned.TypeMeta{
Kind: "Namespace",
APIVersion: "v1",
},
ObjectMeta: v1.ObjectMeta{
Name: "test",
},
}
e := json.NewYAMLSerializer(json.DefaultMetaFactory, nil, nil)
err := e.EncodeToStream(ns, os.Stdout)
if err != nil {
panic(err)
}
}
This might not be the best practice (better suggestions welcome), but it does the job.
Upvotes: 2