internal/k8sCommon/k8sclient/obj_store.go (98 lines of code) (raw):
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: MIT
package k8sclient
import (
"log"
"sync"
"k8s.io/apimachinery/pkg/api/meta"
"k8s.io/apimachinery/pkg/types"
)
type ObjStore struct {
sync.RWMutex
refreshed bool
objs map[types.UID]interface{}
transformFunc func(interface{}) (interface{}, error)
}
func NewObjStore(transformFunc func(interface{}) (interface{}, error)) *ObjStore {
return &ObjStore{
transformFunc: transformFunc,
objs: map[types.UID]interface{}{},
}
}
// Track whether the underlying data store is refreshed or not.
// Calling this func itself will reset the state to false.
func (s *ObjStore) Refreshed() bool {
s.Lock()
defer s.Unlock()
refreshed := s.refreshed
if refreshed {
s.refreshed = false
}
return refreshed
}
func (s *ObjStore) Add(obj interface{}) error {
o, err := meta.Accessor(obj)
if err != nil {
log.Printf("W! Cannot find the metadata for %v.", obj)
return err
}
var toCacheObj interface{}
if toCacheObj, err = s.transformFunc(obj); err != nil {
log.Printf("W! Failed to update obj %v in the cached store.", obj)
return err
}
s.Lock()
defer s.Unlock()
s.objs[o.GetUID()] = toCacheObj
s.refreshed = true
return nil
}
// Update updates the existing entry in the ObjStore.
func (s *ObjStore) Update(obj interface{}) error {
return s.Add(obj)
}
// Delete deletes an existing entry in the ObjStore.
func (s *ObjStore) Delete(obj interface{}) error {
o, err := meta.Accessor(obj)
if err != nil {
return err
}
s.Lock()
defer s.Unlock()
delete(s.objs, o.GetUID())
s.refreshed = true
return nil
}
// List implements the List method of the store interface.
func (s *ObjStore) List() []interface{} {
s.RLock()
defer s.RUnlock()
result := make([]interface{}, 0, len(s.objs))
for _, v := range s.objs {
result = append(result, v)
}
return result
}
// ListKeys implements the ListKeys method of the store interface.
func (s *ObjStore) ListKeys() []string {
s.RLock()
defer s.RUnlock()
result := make([]string, 0, len(s.objs))
for k := range s.objs {
result = append(result, string(k))
}
return result
}
// Get implements the Get method of the store interface.
func (s *ObjStore) Get(obj interface{}) (item interface{}, exists bool, err error) {
return nil, false, nil
}
// GetByKey implements the GetByKey method of the store interface.
func (s *ObjStore) GetByKey(key string) (item interface{}, exists bool, err error) {
return nil, false, nil
}
// Replace will delete the contents of the store, using instead the
// given list.
func (s *ObjStore) Replace(list []interface{}, _ string) error {
s.Lock()
s.objs = map[types.UID]interface{}{}
s.Unlock()
for _, o := range list {
err := s.Add(o)
if err != nil {
return err
}
}
return nil
}
// Resync implements the Resync method of the store interface.
func (s *ObjStore) Resync() error {
return nil
}