Skip to content

Commit

Permalink
Uses apiReader in nodes controller where possible (#808)
Browse files Browse the repository at this point in the history
  • Loading branch information
0sewa0 authored Jun 2, 2022
1 parent bd7edc4 commit 99b9af4
Show file tree
Hide file tree
Showing 5 changed files with 152 additions and 150 deletions.
6 changes: 3 additions & 3 deletions src/controllers/nodes/cache.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import (
// ErrNotFound is returned when entry hasn't been found on the cache.
var ErrNotFound = errors.New("not found")

// CacheEntry constains information about a Node.
// CacheEntry contains information about a Node.
type CacheEntry struct {
Instance string `json:"instance"`
IPAddress string `json:"ip"`
Expand Down Expand Up @@ -95,7 +95,7 @@ func (cache *Cache) ContainsKey(key string) bool {
}

func (cache *Cache) IsCacheOutdated() bool {
if lastUpdated, ok := cache.Obj.Annotations[lastUpdatedCacheAnnotiation]; ok {
if lastUpdated, ok := cache.Obj.Annotations[lastUpdatedCacheAnnotation]; ok {
if lastUpdatedTime, err := time.Parse(time.RFC3339, lastUpdated); err == nil {
return lastUpdatedTime.Add(cacheLifetime).Before(time.Now())
} else {
Expand All @@ -109,7 +109,7 @@ func (cache *Cache) UpdateTimestamp() {
if cache.Obj.Annotations == nil {
cache.Obj.Annotations = make(map[string]string)
}
cache.Obj.Annotations[lastUpdatedCacheAnnotiation] = time.Now().Format(time.RFC3339)
cache.Obj.Annotations[lastUpdatedCacheAnnotation] = time.Now().Format(time.RFC3339)
cache.upd = true
}

Expand Down
6 changes: 3 additions & 3 deletions src/controllers/nodes/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ import (
)

const (
cacheName = "dynatrace-node-cache"
cacheLifetime = 10 * time.Minute
lastUpdatedCacheAnnotiation = "DTOperatorLastUpdated"
cacheName = "dynatrace-node-cache"
cacheLifetime = 10 * time.Minute
lastUpdatedCacheAnnotation = "DTOperatorLastUpdated"
)

var (
Expand Down
64 changes: 33 additions & 31 deletions src/controllers/nodes/nodes_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,21 @@ import (
"sigs.k8s.io/controller-runtime/pkg/reconcile"
)

type NodesController struct {
client client.Client
apiReader client.Reader
scheme *runtime.Scheme
dtClientFunc dynakube.DynatraceClientFunc
runLocal bool
podNamespace string
}

type CachedNodeInfo struct {
cachedNode CacheEntry
nodeCache *Cache
nodeName string
}

func Add(mgr manager.Manager, _ string) error {
return NewController(mgr).SetupWithManager(mgr)
}
Expand All @@ -36,7 +51,7 @@ func nodeDeletionPredicate(controller *NodesController) predicate.Predicate {
return predicate.Funcs{
DeleteFunc: func(deleteEvent event.DeleteEvent) bool {
node := deleteEvent.Object.GetName()
err := controller.reconcileNodeDeletion(node)
err := controller.reconcileNodeDeletion(context.TODO(), node)
if err != nil {
log.Error(err, "error while deleting node", "node", node)
}
Expand All @@ -49,41 +64,28 @@ func nodeDeletionPredicate(controller *NodesController) predicate.Predicate {
func NewController(mgr manager.Manager) *NodesController {
return &NodesController{
client: mgr.GetClient(),
apiReader: mgr.GetAPIReader(),
scheme: mgr.GetScheme(),
dtClientFunc: dynakube.BuildDynatraceClient,
runLocal: os.Getenv("RUN_LOCAL") == "true",
podNamespace: os.Getenv("POD_NAMESPACE"),
}
}

type NodesController struct {
client client.Client
scheme *runtime.Scheme
dtClientFunc dynakube.DynatraceClientFunc
runLocal bool
podNamespace string
}

type CachedNodeInfo struct {
cachedNode CacheEntry
nodeCache *Cache
nodeName string
}

func (controller *NodesController) Reconcile(ctx context.Context, request reconcile.Request) (reconcile.Result, error) {
nodeName := request.NamespacedName.Name
dynakube, err := controller.determineDynakubeForNode(nodeName)
if err != nil {
return reconcile.Result{}, err
}

nodeCache, err := controller.getCache()
nodeCache, err := controller.getCache(ctx)
if err != nil {
return reconcile.Result{}, err
}

var node corev1.Node
if err := controller.client.Get(ctx, client.ObjectKey{Name: nodeName}, &node); err != nil {
if err := controller.apiReader.Get(ctx, client.ObjectKey{Name: nodeName}, &node); err != nil {
if k8serrors.IsNotFound(err) {
log.Info("node was not found in cluster", "node", nodeName)
return reconcile.Result{}, nil
Expand Down Expand Up @@ -124,16 +126,16 @@ func (controller *NodesController) Reconcile(ctx context.Context, request reconc

// check node cache for outdated nodes and remove them, to keep cache clean
if nodeCache.IsCacheOutdated() {
if err := controller.handleOutdatedCache(nodeCache); err != nil {
if err := controller.handleOutdatedCache(ctx, nodeCache); err != nil {
return reconcile.Result{}, err
}
nodeCache.UpdateTimestamp()
}
return reconcile.Result{}, controller.updateCache(nodeCache, ctx)
return reconcile.Result{}, controller.updateCache(ctx, nodeCache)
}

func (controller *NodesController) reconcileNodeDeletion(nodeName string) error {
nodeCache, err := controller.getCache()
func (controller *NodesController) reconcileNodeDeletion(ctx context.Context, nodeName string) error {
nodeCache, err := controller.getCache(ctx)
if err != nil {
return err
}
Expand All @@ -146,7 +148,7 @@ func (controller *NodesController) reconcileNodeDeletion(nodeName string) error
cachedNodeInfo, err := nodeCache.Get(nodeName)
if err != nil {
if err == ErrNotFound {
// uncached node -> igonoring
// uncached node -> ignoring
return nil
}
return err
Expand All @@ -165,16 +167,16 @@ func (controller *NodesController) reconcileNodeDeletion(nodeName string) error
}

nodeCache.Delete(nodeName)
if err := controller.updateCache(nodeCache, context.TODO()); err != nil {
if err := controller.updateCache(ctx, nodeCache); err != nil {
return err
}
return nil
}

func (controller *NodesController) getCache() (*Cache, error) {
func (controller *NodesController) getCache(ctx context.Context) (*Cache, error) {
var cm corev1.ConfigMap

err := controller.client.Get(context.TODO(), client.ObjectKey{Name: cacheName, Namespace: controller.podNamespace}, &cm)
err := controller.apiReader.Get(ctx, client.ObjectKey{Name: cacheName, Namespace: controller.podNamespace}, &cm)
if err == nil {
return &Cache{Obj: &cm}, nil
}
Expand Down Expand Up @@ -205,7 +207,7 @@ func (controller *NodesController) getCache() (*Cache, error) {
return nil, err
}

func (controller *NodesController) updateCache(nodeCache *Cache, ctx context.Context) error {
func (controller *NodesController) updateCache(ctx context.Context, nodeCache *Cache) error {
if !nodeCache.Changed() {
return nil
}
Expand All @@ -220,7 +222,7 @@ func (controller *NodesController) updateCache(nodeCache *Cache, ctx context.Con
return nil
}

func (controller *NodesController) handleOutdatedCache(nodeCache *Cache) error {
func (controller *NodesController) handleOutdatedCache(ctx context.Context, nodeCache *Cache) error {
var nodeLst corev1.NodeList
if err := controller.client.List(context.TODO(), &nodeLst); err != nil {
return err
Expand All @@ -244,8 +246,8 @@ func (controller *NodesController) handleOutdatedCache(nodeCache *Cache) error {

// if node is not in cluster -> probably deleted
if !cachedNodeInCluster {
log.Info("Removing unfound cached node from cluster", "node", cachedNodeName)
err := controller.reconcileNodeDeletion(cachedNodeName)
log.Info("Removing missing cached node from cluster", "node", cachedNodeName)
err := controller.reconcileNodeDeletion(ctx, cachedNodeName)
if err != nil {
return err
}
Expand All @@ -255,12 +257,12 @@ func (controller *NodesController) handleOutdatedCache(nodeCache *Cache) error {
}

func (controller *NodesController) removeNodeFromCache(nodeCache *Cache, cachedNode CacheEntry, nodeName string) {
if controller.isNodeDeleteable(cachedNode) {
if controller.isNodeDeletable(cachedNode) {
nodeCache.Delete(nodeName)
}
}

func (controller *NodesController) isNodeDeleteable(cachedNode CacheEntry) bool {
func (controller *NodesController) isNodeDeletable(cachedNode CacheEntry) bool {
if time.Now().UTC().Sub(cachedNode.LastSeen).Hours() > 1 {
return true
} else if cachedNode.IPAddress == "" {
Expand Down
Loading

0 comments on commit 99b9af4

Please sign in to comment.