argo-cd/util/cache/appstate/cache.go
Ishita Sequeira f533ed17f0
feat: simplify parametrization of Argo CD server processes (#6328)
feat: simplify parametrization of Argo CD server processes  (#6328)

Signed-off-by: Ishita Sequeira <isequeir@redhat.com>
2021-06-10 13:03:47 -07:00

107 lines
3.3 KiB
Go

package appstate
import (
"context"
"fmt"
"sort"
"time"
"github.com/go-redis/redis/v8"
"github.com/spf13/cobra"
appv1 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1"
cacheutil "github.com/argoproj/argo-cd/v2/util/cache"
"github.com/argoproj/argo-cd/v2/util/env"
)
var ErrCacheMiss = cacheutil.ErrCacheMiss
const (
clusterInfoCacheExpiration = 10 * time.Minute
)
type Cache struct {
Cache *cacheutil.Cache
appStateCacheExpiration time.Duration
}
func NewCache(cache *cacheutil.Cache, appStateCacheExpiration time.Duration) *Cache {
return &Cache{cache, appStateCacheExpiration}
}
func AddCacheFlagsToCmd(cmd *cobra.Command, opts ...func(client *redis.Client)) func() (*Cache, error) {
var appStateCacheExpiration time.Duration
cmd.Flags().DurationVar(&appStateCacheExpiration, "app-state-cache-expiration", env.ParseDurationFromEnv("ARGOCD_APP_STATE_CACHE_EXPIRATION", 1*time.Hour, 0, 10*time.Hour), "Cache expiration for app state")
cacheFactory := cacheutil.AddCacheFlagsToCmd(cmd, opts...)
return func() (*Cache, error) {
cache, err := cacheFactory()
if err != nil {
return nil, err
}
return NewCache(cache, appStateCacheExpiration), nil
}
}
func (c *Cache) GetItem(key string, item interface{}) error {
return c.Cache.GetItem(key, item)
}
func (c *Cache) SetItem(key string, item interface{}, expiration time.Duration, delete bool) error {
return c.Cache.SetItem(key, item, expiration, delete)
}
func appManagedResourcesKey(appName string) string {
return fmt.Sprintf("app|managed-resources|%s", appName)
}
func (c *Cache) GetAppManagedResources(appName string, res *[]*appv1.ResourceDiff) error {
err := c.GetItem(appManagedResourcesKey(appName), &res)
return err
}
func (c *Cache) SetAppManagedResources(appName string, managedResources []*appv1.ResourceDiff) error {
sort.Slice(managedResources, func(i, j int) bool {
return managedResources[i].FullName() < managedResources[j].FullName()
})
return c.SetItem(appManagedResourcesKey(appName), managedResources, c.appStateCacheExpiration, managedResources == nil)
}
func appResourcesTreeKey(appName string) string {
return fmt.Sprintf("app|resources-tree|%s", appName)
}
func clusterInfoKey(server string) string {
return fmt.Sprintf("cluster|info|%s", server)
}
func (c *Cache) GetAppResourcesTree(appName string, res *appv1.ApplicationTree) error {
err := c.GetItem(appResourcesTreeKey(appName), &res)
return err
}
func (c *Cache) OnAppResourcesTreeChanged(ctx context.Context, appName string, callback func() error) error {
return c.Cache.OnUpdated(ctx, appManagedResourcesKey(appName), callback)
}
func (c *Cache) SetAppResourcesTree(appName string, resourcesTree *appv1.ApplicationTree) error {
if resourcesTree != nil {
resourcesTree.Normalize()
}
err := c.SetItem(appResourcesTreeKey(appName), resourcesTree, c.appStateCacheExpiration, resourcesTree == nil)
if err != nil {
return err
}
return c.Cache.NotifyUpdated(appManagedResourcesKey(appName))
}
func (c *Cache) SetClusterInfo(server string, info *appv1.ClusterInfo) error {
return c.SetItem(clusterInfoKey(server), info, clusterInfoCacheExpiration, info == nil)
}
func (c *Cache) GetClusterInfo(server string, res *appv1.ClusterInfo) error {
err := c.GetItem(clusterInfoKey(server), &res)
return err
}