code-generator用於生成k8s風格的api代碼
生成器
- client-gen
- conversion-gen
- deepcopy-gen
- defaulter-gen
- go-to-protobuf
- import-boss
- informer-gen
- lister-gen
- openapi-gen
- register-gen
- set-gen
client-gen
在pkg/apis/${GROUP}/${VERSION}/types.go中使用,使用// +genclient標記對應類型生成的客戶端,
如果與該類型相關聯的資源不是命名空間範圍的(例如PersistentVolume),
則還需要附加// + genclient:nonNamespaced標記,
- // +genclient - 生成默認的客戶端動作函數(create, update, delete, get, list, update, patch, watch以及
- 是否生成updateStatus取決於.Status字段是否存在)。
- // +genclient:nonNamespaced - 所有動作函數都是在沒有名稱空間的情況下生成
- // +genclient:onlyVerbs=create,get - 指定的動作函數被生成.
- // +genclient:skipVerbs=watch - 生成watch以外所有的動作函數.
- // +genclient:noStatus - 即使.Status字段存在也不生成updateStatus動作函數
conversion-gen
conversion-gen是用於自動生成在內部和外部類型之間轉換的函數的工具。一般的轉換代碼生成任務涉及三套程序包:
- 一套包含內部類型的程序包,
- 一套包含外部類型的程序包,
- 單個目標程序包(即,生成的轉換函數所在的位置,以及開發人員授權的轉換功能所在的位置)。
- 包含內部類型的包在Kubernetes的常規代碼生成框架中扮演著稱為peer package的角色。
- 使用方法
- 標記轉換內部軟件包 // +k8s:conversion-gen=<import-path-of-internal-package>
- 標記轉換外部軟件包// +k8s:conversion-gen-external-types=<import-path-of-external-package>
- 標記不轉換對應註釋或結構 // +k8s:conversion-gen=false
deepcopy-gen
deepcopy-gen是用於自動生成DeepCopy函數的工具,使用方法:
- 在文件中添加註釋// +k8s:deepcopy-gen=package
- 為單個類型添加自動生成// +k8s:deepcopy-gen=true
- 為單個類型關閉自動生成// +k8s:deepcopy-gen=false
defaulter-gen
用於生成Defaulter函數
- 為包含字段的所有類型創建defaulters,// +k8s:defaulter-gen=<field-name-to-flag>
- 所有都生成// +k8s:defaulter-gen=true|false
go-to-protobuf
通過go struct生成pb idl
import-boss
在給定存儲庫中強制執行導入限制
informer-gen
生成informer
lister-gen
生成對應的lister方法
openapi-gen
生成openAPI定義
使用方法:
- +k8s:openapi-gen=true 為指定包或方法開啟
- +k8s:openapi-gen=false 指定包關閉
register-gen
生成register
手動添加基礎代碼
ip是我們定義的新的資源
- pkg/apis/ip/register.go內容如下
package ip
// GroupName is the group name used in this package
const (
GroupName = "rocdu.top"
)
- pkg/apis/ip/v1/doc.go內容如下
// +k8s:deepcopy-gen=package
// Package v1 is the v1 version of the API.
// +groupName=rocdu.top
package v1
- pkg/apis/ip/v1/types.go內容如下,該文件包含了資源的數據結構,對應yaml
package v1
import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
// +genclient
// +genclient:noStatus
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
// ip is a res to get node/pod from ip
type Ip struct {
metav1.TypeMeta `json:",inline"`
// +optional
metav1.ObjectMeta `json:"metadata,omitempty"`
Spec IpSpec `json:"spec"`
}
type IpSpec struct {
Pod string `json:"pod,omitempty"`
Node string `json:"node,omitempty"`
}
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
// IpCrdList is a list of ip
type IpList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata"`
Items []Ip `json:"items"`
}
- boilerplate.go.txt該文件是文件開頭統一的註釋
boilerplate.go.txt
/*
/*
@Time : 2019/12/23 3:08 下午
@Author : tianpeng.du
@File : types
@Software: GoLand
*/
- pkg/apis/ip/v1/register.go
package v1
import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
"github.com/du2016/code-generator/pkg/apis/ip"
)
// SchemeGroupVersion is group version used to register these objects
var SchemeGroupVersion = schema.GroupVersion{Group: ip.GroupName, Version: "v1"}
// Kind takes an unqualified kind and returns back a Group qualified GroupKind
func Kind(kind string) schema.GroupKind {
return SchemeGroupVersion.WithKind(kind).GroupKind()
}
// Resource takes an unqualified resource and returns a Group qualified GroupResource
func Resource(resource string) schema.GroupResource {
return SchemeGroupVersion.WithResource(resource).GroupResource()
}
var (
// SchemeBuilder initializes a scheme builder
SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes)
// AddToScheme is a global function that registers this API group & version to a scheme
AddToScheme = SchemeBuilder.AddToScheme
)
// Adds the list of known types to Scheme.
func addKnownTypes(scheme *runtime.Scheme) error {
scheme.AddKnownTypes(SchemeGroupVersion,
&Ip{},
&IpList{},
)
metav1.AddToGroupVersion(scheme, SchemeGroupVersion)
return nil
}
生成代碼
./vendor/k8s.io/code-generator/generate-groups.sh all github.com/du2016/code-generator/pkg/client github.com/du2016/code-generator/pkg/apis ip:v1
使用crd informer
informer := externalversions.NewSharedInformerFactoryWithOptions(clientset, 10*time.Second, externalversions.WithNamespace("default"))
go informer.Start(nil)
IpCrdInformer:=informer.Rocdu().V1().Ips()
cache.WaitForCacheSync(nil,IpCrdInformer.Informer().HasSynced)
閱讀更多 有點技術 的文章