2023年11月29日发(作者:)

code-generator⽣成代码

⼀、⽣成代码如下

package main

import (

"flag"

"fmt"

crdv1beta1 "/cnych/controller-demo/pkg/apis/stable/v1beta1"

"/apimachinery/pkg/api/errors"

"/apimachinery/pkg/util/runtime"

"/apimachinery/pkg/util/wait"

"/client-go/tools/cache"

"/client-go/util/workqueue"

"os"

"os/signal"

"path/filepath"

"syscall"

"time"

"/golang/glog"

"/client-go/tools/clientcmd"

"/client-go/util/homedir"

"/klog"

}

crontabClient, err := Config(cfg)

if err != nil {

("Error building example clientset: %s", ())

}

// informerFactory ⼯⼚类, 这⾥注⼊我们通过代码⽣成的 client

// clent 主要⽤于和 API Server 进⾏通信,实现 ListAndWatch

crontabInformerFactory := redInformerFactory(crontabClient, *30)

// 实例化⾃定义控制器

controller := NewController(().V1beta1().CronTabs())

// 启动 informer,开始List & Watch

go (stopCh)

if err = (2, stopCh); err != nil {

("Error running controller: %s", ())

}

}

func NewController(informer bInformer) *Controller {

//使⽤client 和前⾯创建的 Informer,初始化了⾃定义控制器

controller := &Controller{

informer: informer,

// WorkQueue 的实现,负责同步 Informer 和控制循环之间的数据

workqueue: edRateLimitingQueue(tControllerRateLimiter(), "CronTab"),

}

("Setting up crontab event handlers")

// informer 注册了三个 HandlerAddFuncUpdateFunc DeleteFunc

// 分别对应 API 对象的添加”“更新删除事件。

// ⽽具体的处理操作,都是将该事件对应的 API 对象加⼊到⼯作队列中

er().AddEventHandler(ceEventHandlerFuncs{

AddFunc: eCronTab,

UpdateFunc: func(old, new interface{}) {

oldObj := old.(*b)

newObj := new.(*b)

// 如果资源版本相同则不处理

if ceVersion == ceVersion {

return

}

eCronTab(new)

},

DeleteFunc: eCronTabForDelete,

})

return controller

}

func (c *Controller) Run(threadiness int, stopCh <-chan struct{}) error {

defer Crash()

defer wn()

// 记录开始⽇志

("Starting CronTab control loop")

("Waiting for informer caches to sync")

if ok := rCacheSync(stopCh, er().HasSynced); !ok {

return ("failed to wait for caches to sync")

if shutdown {

return false

}

err := func(obj interface{}) error {

defer (obj)

var key string

var ok bool

if key, ok = obj.(string); !ok {

(obj)

Error(("expected string in workqueue but got %#v", obj))

return nil

}

if err := ndler(key); err != nil {

return ("error syncing '%s': %s", key, ())

}

(obj)

("Successfully synced '%s'", key)

return nil

}(obj)

if err != nil {