Generate YAML manifest from Kubernetes types

1/27/2016

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?

-- Ruben Vermeersch
go
kubernetes

3 Answers

6/19/2019
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)
    }
}
-- tianfeiyu
Source: StackOverflow

1/27/2016

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.

-- Ruben Vermeersch
Source: StackOverflow

8/29/2019

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,
    },
)
-- Piotr The First
Source: StackOverflow