AmitKumarDas / Decisions

Apache License 2.0
10 stars 3 forks source link

K8s: Code Generation for CR ~ Makefile #229

Open AmitKumarDas opened 4 years ago

AmitKumarDas commented 4 years ago

Steps below show how to generate all the code required to build controllers against custom resources:

package v1alpha1


- This is how your types.go look like:
```go
// +genclient
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object

type Storage struct {
    metav1.TypeMeta   `json:",inline"`
    metav1.ObjectMeta `json:"metadata"`

    Spec   StorageSpec   `json:"spec"`
    Status StorageStatus `json:"status,omitempty"`
}

// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object

type StorageList struct {
    metav1.TypeMeta `json:",inline"`
    metav1.ListMeta `json:"metadata"`
    Items           []Storage `json:"items"`
}

.PHONY: generated_files generated_files: deepcopy clientset lister informer

deepcopy installs the deepcopy-gen at $GOPATH/bin

Then make use of this installed binary to generate

deepcopy

.PHONY: deepcopy deepcopy: @go install ./vendor/k8s.io/code-generator/cmd/deepcopy-gen @echo "+ Generating deepcopy funcs for $(API_GROUPS)" @deepcopy-gen \ --input-dirs $(PKG)/apis/$(API_GROUPS) \ --output-file-base zz_generated.deepcopy \ --go-header-file ./hack/custom-boilerplate.go.txt

clienset installs the client-gen at $GOPATH/bin

Then make use of this installed binary to generate

clienset

.PHONY: clientset clientset: @go install ./vendor/k8s.io/code-generator/cmd/client-gen @echo "+ Generating clientsets for $(API_GROUPS)" @client-gen \ --fake-clientset=false \ --input $(API_GROUPS) \ --input-base $(PKG)/apis \ --go-header-file ./hack/custom-boilerplate.go.txt \ --clientset-path $(PKG)/client/generated/clientset

lister installs the lister-gen at $GOPATH/bin

Then make use of this installed binary to generate

lister

.PHONY: lister lister: @go install ./vendor/k8s.io/code-generator/cmd/lister-gen @echo "+ Generating lister for $(API_GROUPS)" @lister-gen \ --input-dirs $(PKG)/apis/$(API_GROUPS) \ --go-header-file ./hack/custom-boilerplate.go.txt \ --output-package $(PKG)/client/generated/lister

informer installs the informer-gen at $GOPATH/bin

Then make use of this installed binary to generate

informer

.PHONY: informer informer: @go install ./vendor/k8s.io/code-generator/cmd/informer-gen @echo "+ Generating informer for $(API_GROUPS)" @informer-gen \ --input-dirs $(PKG)/apis/$(API_GROUPS) \ --output-package $(PKG)/client/generated/informer \ --versioned-clientset-package $(PKG)/client/generated/clientset/internalclientset \ --go-header-file ./hack/custom-boilerplate.go.txt \ --listers-package $(PKG)/client/generated/lister

AmitKumarDas commented 4 years ago

This snippet shows code generation for custom resources via go modules & makefile:

PROJECT_ROOT := github.com/AmitKumarDas/storage-provisioner
PKG          := $(PROJECT_ROOT)/pkg
API_GROUPS   := ddp/v1alpha1

# I prefer using makefile targets instead of ./hack/update-codegen.sh
# since makefile based targets are more manageable than script based 
# approach. There are some differences between two approaches. 
#
# Makefile uses informer & lister as output package names instead of 
# plural forms i.e. informers & listers.
.PHONY: generated_files
generated_files: vendor deepcopy clientset lister informer

# deepcopy expects client-gen source code to be available at the 
# given vendor location. This source code is installed as a binary 
# i.e. deepcopy-gen at $GOPATH/bin
#
# Finally this installed binary is used to generate deepcopy
.PHONY: deepcopy
deepcopy:
    @GO111MODULE=on go install k8s.io/code-generator/cmd/deepcopy-gen
    @echo "+ Generating deepcopy funcs for $(API_GROUPS)"
    @deepcopy-gen \
        --input-dirs $(PKG)/apis/$(API_GROUPS) \
        --output-file-base zz_generated.deepcopy \
        --go-header-file ./hack/custom-boilerplate.go.txt

# clienset expects client-gen source code to be available at the 
# given vendor location. This source code is installed as a binary 
# i.e. client-gen at $GOPATH/bin
#
# Finally this installed binary is used to generate clienset
.PHONY: clientset
clientset:
    @GO111MODULE=on go install k8s.io/code-generator/cmd/client-gen
    @echo "+ Generating clientset for $(API_GROUPS)"
    @client-gen \
        --fake-clientset=false \
        --input $(API_GROUPS) \
        --input-base $(PKG)/apis \
        --go-header-file ./hack/custom-boilerplate.go.txt \
        --clientset-name versioned \
        --clientset-path $(PROJECT_ROOT)/client/generated/clientset

# lister expects client-gen source code to be available at the 
# given vendor location. This source code is installed as a binary 
# i.e. lister-gen at $GOPATH/bin
#
# Finally this installed binary is used to generate lister
.PHONY: lister
lister:
    @GO111MODULE=on go install k8s.io/code-generator/cmd/lister-gen
    @echo "+ Generating lister for $(API_GROUPS)"
    @lister-gen \
        --input-dirs $(PKG)/apis/$(API_GROUPS) \
        --go-header-file ./hack/custom-boilerplate.go.txt \
        --output-package $(PROJECT_ROOT)/client/generated/lister

# informer expects client-gen source code to be available at the 
# given vendor location. This source code is installed as a binary 
# i.e. informer-gen at $GOPATH/bin
#
# Finally this installed binary is used to generate informer
.PHONY: informer
informer:
    @GO111MODULE=on go install k8s.io/code-generator/cmd/informer-gen
    @echo "+ Generating informer for $(API_GROUPS)"
    @informer-gen \
        --input-dirs $(PKG)/apis/$(API_GROUPS) \
        --output-package $(PROJECT_ROOT)/client/generated/informer \
        --versioned-clientset-package $(PROJECT_ROOT)/client/generated/clientset/versioned \
        --go-header-file ./hack/custom-boilerplate.go.txt \
        --listers-package $(PROJECT_ROOT)/client/generated/lister