Last active
July 25, 2023 05:38
-
-
Save inspirit941/25d715eebfb7f53af9ecadd311cb6f87 to your computer and use it in GitHub Desktop.
dynamic informers example code. 원본: https://github.com/cloud-native-skunkworks/dynamic-informer
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"log" | |
"os" | |
"time" | |
"github.com/open-feature/open-feature-operator/apis/core/v1alpha1" | |
"k8s.io/client-go/dynamic" | |
"k8s.io/client-go/dynamic/dynamicinformer" | |
"k8s.io/client-go/rest" | |
"k8s.io/client-go/tools/cache" | |
"k8s.io/client-go/tools/clientcmd" | |
) | |
func buildConfiguration() (*rest.Config, error) { | |
kubeconfig := os.Getenv("KUBECONFIG") | |
var clusterConfig *rest.Config | |
var err error | |
if kubeconfig != "" { | |
clusterConfig, err = clientcmd.BuildConfigFromFlags("", kubeconfig) | |
} else { | |
clusterConfig, err = rest.InClusterConfig() | |
} | |
if err != nil { | |
return nil, err | |
} | |
return clusterConfig, nil | |
} | |
func main() { | |
clusterConfig, err := buildConfiguration() | |
if err != nil { | |
panic(err) | |
} | |
// traditional k8s client 대신 dynamic 패키지 사용. | |
clusterClient, err := dynamic.NewForConfig(clusterConfig) | |
if err != nil { | |
log.Fatalln(err) | |
} | |
// CRD operator에서 제공하는 Resource 정보. | |
resource := v1alpha1.GroupVersion.WithResource("featureflagconfigurations") | |
// shared Informer factory 생성. look at several different clsuter resources simultaneously. | |
//// resync time: cache between listing. | |
factory := dynamicinformer.NewFilteredDynamicSharedInformerFactory(clusterClient, | |
time.Minute, "", nil) | |
informer := factory.ForResource(resource).Informer() | |
// event handler 추가. | |
informer.AddEventHandler(cache.ResourceEventHandlerFuncs{ | |
AddFunc: func(obj interface{}) { | |
log.Println("AddFunc") | |
}, | |
UpdateFunc: func(oldObj, newObj interface{}) { | |
log.Println("UpdateFunc") | |
// 이벤트 발생했을 때 interface{}를 필요한 리소스로 매핑하는 형태로 사용 가능. | |
// ex) | |
// var featureflagObject v1alpha1.FeatureFlagConfiguration | |
//err := runtime.DefaultUnstructuredConverter.FromUnstructured(newObj, (*unstructured.Unstructured).Object, &featureflagObject) | |
// if err != nil { | |
// log.Println(err.Error()) | |
// } | |
}, | |
DeleteFunc: func(obj interface{}) { | |
log.Println("DeleteFunc") | |
}, | |
}) | |
// informer에 context를 추가하거나 inline channel을 넣는다. | |
informer.Run(make(chan struct{})) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment