Ruben Vermeersch
Ruben Vermeersch

Reputation: 1943

Generate YAML manifest from Kubernetes types

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

Answers (3)

Piotr The First
Piotr The First

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

tianfeiyu
tianfeiyu

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

Ruben Vermeersch
Ruben Vermeersch

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

Related Questions