Skip to content

mipsel64/xcontroller

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

xcontroller

A sample Kubernetes Controller using protobuf to define CRD.

This repository is base on the concept of kubernetes/sample-controller but more details. Additionally, this repository also use protobuf to define CRD model.

Basically, go-client using json to marshal and unmarshal CRD after retrieve them from API, and you are unable to unmarshal a proto message by encoding/json. To do that, you need a marshal/unmarshal redirect to jsonpb.

package v1alpha1 import ( bytes "bytes" jsonpb "github.com/golang/protobuf/jsonpb" ) type Bar struct { } // Your CRD func (this *Bar) MarshalJSON() ([]byte, error) { str, err := BarMarshaler.MarshalToString(this) return []byte(str), err } func (this *Bar) UnmarshalJSON(b []byte) error { return BarUnmarshaler.Unmarshal(bytes.NewReader(b), this) } var ( BarMarshaler = &jsonpb.Marshaler{} BarUnmarshaler = &jsonpb.Unmarshaler{AllowUnknownFields: true} )

The second thing you need is the deepcopy.

package v1alpha1 import (	proto "google.golang.org/protobuf/proto" ) func (in *Bar) DeepCopyInto(out *Bar) { p := proto.Clone(in).(*Bar) *out = *p } func (in *Bar) DeepCopy() *Bar { if in == nil { return nil	} out := new(Bar) in.DeepCopyInto(out) return out } func (in *Bar) DeepCopyInterface() interface{} { return in.DeepCopy() }

Fortunately, istio/tools support us several tools to automatically generate these codes, this will save a lot of times for us when we're working with Kubernetes CRDs. Big thanks for istio contributors.

Usage

To generate code from protobuf

Make sure that you already install buf.

# install istio tools $ go install istio.io/tools/cmd/protoc-gen-golang-deepcopy $ go install istio.io/tools/cmd/protoc-gen-golang-jsonshim # lint check before generate code $ buf lint --path api $ buf generate --path api

To update codegen

$ export CODEGEN_PKG=~/go/pkg/mod/k8s.io/code-generator@v0.21.0 $ ./hack/update-codegen.sh 

To start xcontroller

$ xcontroller --help Usage:  xcontroller [flags] Flags:  -h, --help help for xcontroller  --kubeconfig string Full path to kubernetes client configuration, i.e. ~/.kube/config  --log-level string Log level (default "info")  --workers int Number of workers (default 10)

References

About

A sample Kubernetes Controller using protobuf to define CRD model

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published