用于生成k8s风格的api代码
在 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是用于自动生成在内部和外部类型之间转换的函数的工具。一般的转换代码生成任务涉及三套程序包:
peerpackage
的角色。使用方法
// +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函数的工具,使用方法:
// +k8s:deepcopy-gen=package
// +k8s:deepcopy-gen=true
// +k8s:deepcopy-gen=false
用于生成Defaulter函数
// +k8s:defaulter-gen=<field-name-to-flag>
// +k8s:defaulter-gen=true|false
通过go struct生成pb idl
在给定存储库中强制执行导入限制
生成informer
生成对应的lister方法
生成openAPI定义
使用方法:
+k8s:openapi-gen=true
为指定包或方法开启+k8s:openapi-gen=false
指定包关闭生成register
ip是我们定义的新的资源
package ip
// GroupName is the group name used in this package
const (
GroupName = "rocdu.top"
)
// +k8s:deepcopy-gen=package
// Package v1 is the v1 version of the API.
// +groupName=rocdu.top
package v1
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
/*
/*
@Time : 2019/12/23 3:08 下午
@Author : tianpeng.du
@File : types
@Software: GoLand
*/
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
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)
https://github.com/kubernetes/code-generator https://github.com/kubernetes/sample-controller