configwatchers.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package watcher
  2. import (
  3. "github.com/opencost/opencost/core/pkg/log"
  4. v1 "k8s.io/api/core/v1"
  5. )
  6. // ConfigMapWatcher represents a single configmap watcher
  7. type ConfigMapWatcher struct {
  8. ConfigMapName string
  9. WatchFunc func(string, map[string]string) error
  10. }
  11. type ConfigMapWatchers struct {
  12. watchers map[string][]*ConfigMapWatcher
  13. }
  14. func NewConfigMapWatchers(watchers ...*ConfigMapWatcher) *ConfigMapWatchers {
  15. cmw := &ConfigMapWatchers{
  16. watchers: make(map[string][]*ConfigMapWatcher),
  17. }
  18. for _, w := range watchers {
  19. cmw.AddWatcher(w)
  20. }
  21. return cmw
  22. }
  23. func (cmw *ConfigMapWatchers) AddWatcher(watcher *ConfigMapWatcher) {
  24. if watcher == nil {
  25. return
  26. }
  27. name := watcher.ConfigMapName
  28. cmw.watchers[name] = append(cmw.watchers[name], watcher)
  29. }
  30. func (cmw *ConfigMapWatchers) Add(configMapName string, watchFunc func(string, map[string]string) error) {
  31. cmw.AddWatcher(&ConfigMapWatcher{
  32. ConfigMapName: configMapName,
  33. WatchFunc: watchFunc,
  34. })
  35. }
  36. func (cmw *ConfigMapWatchers) GetWatchedConfigs() []string {
  37. configNames := []string{}
  38. for k := range cmw.watchers {
  39. configNames = append(configNames, k)
  40. }
  41. return configNames
  42. }
  43. func (cmw *ConfigMapWatchers) ToWatchFunc() func(interface{}) {
  44. return func(c interface{}) {
  45. conf, ok := c.(*v1.ConfigMap)
  46. if !ok {
  47. return
  48. }
  49. name := conf.GetName()
  50. data := conf.Data
  51. if watchers, ok := cmw.watchers[name]; ok {
  52. for _, cw := range watchers {
  53. err := cw.WatchFunc(name, data)
  54. if err != nil {
  55. log.Infof("ERROR UPDATING %s CONFIG: %s", name, err.Error())
  56. }
  57. }
  58. }
  59. }
  60. }