You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.3 KiB
60 lines
1.3 KiB
package kubernetes
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/go-kratos/kratos/v2/config"
|
|
v1 "k8s.io/api/core/v1"
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
"k8s.io/apimachinery/pkg/watch"
|
|
)
|
|
|
|
type watcher struct {
|
|
k *kube
|
|
watcher watch.Interface
|
|
}
|
|
|
|
func newWatcher(k *kube) (config.Watcher, error) {
|
|
w, err := k.client.CoreV1().ConfigMaps(k.opts.Namespace).Watch(context.Background(), metav1.ListOptions{
|
|
LabelSelector: k.opts.LabelSelector,
|
|
FieldSelector: k.opts.FieldSelector,
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &watcher{
|
|
k: k,
|
|
watcher: w,
|
|
}, nil
|
|
}
|
|
|
|
func (w *watcher) Next() ([]*config.KeyValue, error) {
|
|
ResultChan:
|
|
ch := <-w.watcher.ResultChan()
|
|
if ch.Object == nil {
|
|
// 重新获取watcher
|
|
k8sWatcher, err := w.k.client.CoreV1().ConfigMaps(w.k.opts.Namespace).Watch(context.Background(), metav1.ListOptions{
|
|
LabelSelector: w.k.opts.LabelSelector,
|
|
FieldSelector: w.k.opts.FieldSelector,
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
w.watcher = k8sWatcher
|
|
goto ResultChan
|
|
}
|
|
cm, ok := ch.Object.(*v1.ConfigMap)
|
|
if !ok {
|
|
return nil, fmt.Errorf("kubernetes Object not ConfigMap")
|
|
}
|
|
if ch.Type == "DELETED" {
|
|
return nil, fmt.Errorf("kubernetes configmap delete %s", cm.Name)
|
|
}
|
|
return w.k.configMap(*cm), nil
|
|
}
|
|
|
|
func (w *watcher) Stop() error {
|
|
w.watcher.Stop()
|
|
return nil
|
|
}
|
|
|