kygo

command
v0.0.0-...-862afa6 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 28, 2023 License: Apache-2.0 Imports: 12 Imported by: 0

README

Kygo

Convert kubernetes YAML manifests to Go structs.

Why? Because we found it easier to manipulate manifests and automate with Go code than YAML.

Why Go? Smarter people have a better way to explain it than us: https://github.com/bwplotka/mimic/blob/main/README.md#but-why-go

Usage

Usage of kygo:
  -app string
    	specify the app name. This will be used as the package name if none is specified. (default "myapp")
  -clean-name
    	specify if the app name should be removed from the variable, struct and file name. (default true)
  -group
    	specify if the output should be grouped by kind (default) or split by name. (default false)
  -in string
    	specify the input directory of the yaml manifests, '-' for stdin (default "-")
  -out string
    	specify the output directory for manifests. (default "out")
  -pkg string
    	specify the Go package name. Cannot contain a dash. If none is specified the app name will be used.

Example

go build -o ./bin/kygo ./cmd/kygo
./bin/kygo -in=./pkg/kube/testdata/argocd.yaml -out=./out -app=argocd -group
ls -Rl1 out/

The output will be:

out/argocd
├── app.go
├── cluster-role-binding.go
├── cluster-role.go
├── config-map.go
├── custom-resource-definition.go
├── deployment.go
├── network-policy.go
├── role-binding.go
├── role.go
├── secret.go
├── service-account.go
├── service.go
└── stateful-set.go

Deploying to kubernetes

Either:

  • Use the lingon library to generate the yaml from Go.
  • Use the k8s.io/client-go library to directly apply to kubernetes.
Using lingon
package main

import (
    "context"
    "path/filepath"

    "github.com/XXX/YYY/myapp"
    "github.com/volvo-cars/lingon/pkg/kube"
)

func main() {   
	app := myapp.New()
	manifestOut := filepath.Join("manifests", "myapp")
	
	// it will create the output directory if it does not exist
	// and generate the YAML manifests in the directory manifests/myapp/
	if err := kube.Export(app, manifestOut); err != nil {
        panic(err)
    }
    
    // OR 
	// apply the manifests to kubernetes directly to the cluster
	// it will pass the manifest output to  `kubectl apply -f -`
	if err := app.Apply(context.Background()); err != nil {
        panic(err)
    }
	
	// check if the manifests are applied correctly
	// ...
}
Using client-go

Please refer to the client-go repo.

There is an interesting issue on GitHub about "Add go generics support to client-go": https://github.com/kubernetes/kubernetes/issues/106846

Documentation

Overview

Kygo is a command line tool to convert kubernetes YAML manifests to Go structs.

Convert kubernetes YAML manifests to Go structs.

Why? Because we found it easier to manipulate manifests and automate with Go code than YAML.

Why Go? Smarter people have a better way to explain it than us: <https://github.com/bwplotka/mimic/blob/main/README.md#but-why-go>

Usage

Usage of kygo:

-app string
  	specify the app name. This will be used as the package name if none is specified. (default "myapp")
-clean-name
  	specify if the app name should be removed from the variable, struct and file name. (default true)
-group
  	specify if the output should be grouped by kind (default) or split by name. (default false)
-in string
  	specify the input directory of the yaml manifests, '-' for stdin (default "-")
-out string
  	specify the output directory for manifests. (default "out")
-pkg string
  	specify the Go package name. Cannot contain a dash. If none is specified the app name will be used.

Example

go build -o ./bin/kygo ./cmd/kygo
./bin/kygo -in=./pkg/kube/testdata/argocd.yaml -out=./out -app=argocd -group
ls -Rl1 out/

The output will be:

out/argocd
├── app.go
├── cluster-role-binding.go
├── cluster-role.go
├── config-map.go
├── custom-resource-definition.go
├── deployment.go
├── network-policy.go
├── role-binding.go
├── role.go
├── secret.go
├── service-account.go
├── service.go
└── stateful-set.go

Deploying to kubernetes

Either:

  • Use the `lingon` library to generate the yaml from Go.
  • Use the `k8s.io/client-go` library to directly apply to kubernetes.

Using lingon

package main

import (
	"context"
	"path/filepath"

	"github.com/XXX/YYY/myapp"
	"github.com/volvo-cars/lingon/pkg/kube"
)

func main() {
	app := myapp.New()
	manifestOut := filepath.Join("manifests", "myapp")

	// it will create the output directory if it does not exist
	// and generate the YAML manifests in the directory manifests/myapp/
	if err := kube.Export(app, manifestOut); err != nil {
        panic(err)
    }

    // OR
	// apply the manifests to kubernetes directly to the cluster
	// it will pass the manifest output to  `kubectl apply -f -`
	if err := app.Apply(context.Background()); err != nil {
        panic(err)
    }

	// check if the manifests are applied correctly
	// ...
}

Using client-go

Please refer to the [client-go repo](https://github.com/kubernetes/client-go).

There is an interesting issue on GitHub about "Add go generics support to client-go": <https://github.com/kubernetes/kubernetes/issues/106846>

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL