zoukankan      html  css  js  c++  java
  • kubernetes 开发 code-generator

    主要参考项目 https://github.com/kubernetes/code-generator

    1. git clone https://github.com/kubernetes/code-generator

    2. 创建自己的项目例如 k8s-controller-example

    3. 复制 code-generator 项目的vendor, hack 目录到自己的项目下

    4. 创建doc.go types.go 文件

    保持这个目录结构

    其中 pkg/apis是固定的 

    controllerexample是groupname

    v1alpha1 是 version

    doc.go types.go register.go 都是自己写的

    doc.go

    // +k8s:deepcopy-gen=package
    // +groupName=controllerexample.github.com
    
    package v1alpha1
    

    types.go

    package v1alpha1
    
    import (
    	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    )
    
    // +genclient
    // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
    
    // Foo is a specification for a Foo resource
    type App struct {
    	metav1.TypeMeta   `json:",inline"`
    	metav1.ObjectMeta `json:"metadata,omitempty"`
    
    	Spec   AppSpec   `json:"spec"`
    	Status AppStatus `json:"status"`
    }
    
    // FooSpec is the spec for a Foo resource
    type AppSpec struct {
    	DeploymentName string `json:"deploymentName"`
    	Replicas       *int32 `json:"replicas"`
    }
    
    // FooStatus is the status for a Foo resource
    type AppStatus struct {
    	AvailableReplicas int32 `json:"availableReplicas"`
    }
    
    // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
    
    // FooList is a list of Foo resources
    type AppList struct {
    	metav1.TypeMeta `json:",inline"`
    	metav1.ListMeta `json:"metadata"`
    
    	Items []App `json:"items"`
    }
    

      

      code-generator 通过一些特殊注释来生成代码

    // +k8s:deepcopy-gen=package
    // +groupName=controllerexample.github.com

    doc.go的注释放在了package上 这是全局注释,针对这个package , 注意把这些注释的前后都加上空行
    +k8s:deepcopy-gen=package 为这个package下的所有type生成deepcopy方法
    +groupName=controllerexample.github.com 针对自己的groupname来修改 要对应到实际创建的目录名称

    5. 修改 hack/update-codegen.sh 文件

    #!/usr/bin/env bash
    
    # Copyright 2017 The Kubernetes Authors.
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    set -o errexit
    set -o nounset
    set -o pipefail
    
    SCRIPT_ROOT=$(dirname ${BASH_SOURCE})/..
    CODEGEN_PKG=${CODEGEN_PKG:-$(cd ${SCRIPT_ROOT}; ls -d -1 ./vendor/k8s.io/code-generator 2>/dev/null || echo ../code-generator)}
    
    # generate the code with:
    # --output-base    because this script should also be able to run inside the vendor dir of
    #                  k8s.io/kubernetes. The output-base is needed for the generators to output into the vendor dir
    #                  instead of the $GOPATH directly. For normal projects this can be dropped.
    ${CODEGEN_PKG}/generate-groups.sh "deepcopy,client,informer,lister" 
      github.com/xuchenCN/k8s-controller-example/pkg/client github.com/xuchenCN/k8s-controller-example/pkg/apis 
      controllerexample:v1alpha1 
      --output-base "$GOPATH/src" 
      --go-header-file ${SCRIPT_ROOT}/hack/boilerplate.go.txt
    
    # To use your own boilerplate text use:
    #   --go-header-file ${SCRIPT_ROOT}/hack/custom-boilerplate.go.txt
    

     

     v1alpha1.register.go

    /*
    Copyright 2017 The Kubernetes Authors.
    
    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at
    
        http://www.apache.org/licenses/LICENSE-2.0
    
    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
    */
    
    package v1alpha1
    
    import (
    	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    	"k8s.io/apimachinery/pkg/runtime"
    	"k8s.io/apimachinery/pkg/runtime/schema"
    
    	samplecontroller "github.com/xuchenCN/k8s-controller-example/pkg/apis/controllerexample"
    )
    
    // SchemeGroupVersion is group version used to register these objects
    var SchemeGroupVersion = schema.GroupVersion{Group: samplecontroller.GroupName, Version: "v1alpha1"}
    
    // 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 = runtime.NewSchemeBuilder(addKnownTypes)
    	AddToScheme   = SchemeBuilder.AddToScheme
    )
    
    // Adds the list of known types to Scheme.
    func addKnownTypes(scheme *runtime.Scheme) error {
    	scheme.AddKnownTypes(SchemeGroupVersion,
    		&App{},
    		&AppList{},
    	)
    	metav1.AddToGroupVersion(scheme, SchemeGroupVersion)
    	return nil
    }
    

     controllerexample.register.go

    /*
    Copyright 2017 The Kubernetes Authors.
    
    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at
    
        http://www.apache.org/licenses/LICENSE-2.0
    
    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
    */
    
    package controllerexample
    
    const (
    	GroupName = "controllerexample.github.com"
    )
    

    6. 执行./hack/update-codegen.sh

  • 相关阅读:
    vue五十:Vue美团项目之商家详情-查看商品详情
    vue四十九:Vue美团项目之商家详情-tabbar状态切换和导航返回
    vue四十八:Vue美团项目之商家详情-左右联动之商品分类跟随商品列表滚动
    vue四十七:Vue美团项目之商家详情-左右联动之选中商品分类跳转到对应商品列表
    vue四十六:Vue美团项目之商家详情-商品滚动完成
    vue四十五:Vue美团项目之商家详情-商品分类滚动完成
    vue四十四:Vue美团项目之商家详情-导航栏和header布局
    vue四十三:Vue美团项目之首页-tabbar搭建
    vue四十二:Vue美团项目之首页-商家列表
    Ugly Number
  • 原文地址:https://www.cnblogs.com/xuchenCN/p/10396751.html
Copyright © 2011-2022 走看看