本文介绍: convertUnstructuredProject的实现 Project 是实现的 runtime.Object 接口的struct。dynamicClient 是 创建的K8s的client, 这里使用的是 Unstructured 接収的CRD的结果,需要监听K8s中CRD资源的变动, 做出相应的处理, 需要针对 CRD资源建立informer。加工了一下, convertUnstructuredProject 实现下面提供。
背景
需要监听K8s中CRD资源的变动, 做出相应的处理, 需要针对 CRD资源建立informer
实现
dynamicClient 是 创建的K8s的client, 这里使用的是 Unstructured 接収的CRD的结果,
加工的时候使用了convertUnstructuredProject
加工了一下, convertUnstructuredProject 实现下面提供
projectGvk 是 GroupVersionResource
, 根据自己的CRD定义
// 创建sharedInformerFactory,第二个参数为同步周期,也就是多久从APIServer List一次,并更新到本地缓存
informer := cache.NewSharedInformer(&cache.ListWatch{
ListFunc: func(options v1.ListOptions) (runtime.Object, error) {
return dynamicClient.Resource(projectGvk).List(ctx, options)
},
WatchFunc: func(options v1.ListOptions) (watch.Interface, error) {
return dynamicClient.Resource(projectGvk).Watch(ctx, options)
},
},
&unstructured.Unstructured{},
60*time.Second)
// 创建informer
if err != nil {
log.Error("Failed to create informer", zap.Error(err))
continue
}
// 注册资源事件处理方法
informer.AddEventHandler(cache.ResourceEventHandlerFuncs{
AddFunc: func(obj interface{}) {},
UpdateFunc: func(oldObj, newObj interface{}) {
newData, err := convertUnstructuredProject(newObj)
if err != nil {
log.Error("Failed to convert unstructured project", zap.Error(err))
}
oldData, err := convertUnstructuredProject(oldObj)
if err != nil {
log.Error("Failed to convert unstructured project", zap.Error(err))
}
if oldData.Generation != newData.Generation {
fmt.Println("update", newData)
saveProject(newData, clsuter.Platform)
}
},
DeleteFunc: func(obj interface{}) {
data, err := convertUnstructuredProject(obj)
if err != nil {
log.Error("Failed to convert unstructured project", zap.Error(err))
}
fmt.Println("delete", data)
deleteProject(data, clsuter.Platform)
},
})
// 启动
stopCh := make(chan struct{})
log.Info("Starting project informer factory")
informer.Run(stopCh)
// 等待父协程处理
<-ctx.Done()
close(stopCh)
log.Info("Shutting down project informer factory")
convertUnstructuredProject的实现 Project 是实现的 runtime.Object 接口的struct
func convertUnstructuredProject(obj interface{}) (crd *Project, err error) {
// 将obj转换为*unstructured.Unstructured类型
u, ok := obj.(*unstructured.Unstructured)
if !ok {
fmt.Println("Failed to convert object to *unstructured.Unstructured")
return
}
// 将u对象转换为YourCRDType类型
crd = &Project{}
err = runtime.DefaultUnstructuredConverter.FromUnstructured(u.UnstructuredContent(), crd)
if err != nil {
fmt.Println("Failed to convert object to YourCRDType")
return
}
return
}
原文地址:https://blog.csdn.net/qq_21047625/article/details/134568140
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_2003.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。