keel/extension/credentialshelper/aws/cache.go

80 lines
1.3 KiB
Go

package aws
import (
"fmt"
"sync"
"time"
"github.com/keel-hq/keel/types"
)
type item struct {
credentials *types.Credentials
created time.Time
}
// Cache - internal cache for aws
type Cache struct {
creds map[string]*item
tick time.Duration
ttl time.Duration
mu *sync.RWMutex
}
// NewCache - new credentials cache
func NewCache(ttl time.Duration) *Cache {
c := &Cache{
creds: make(map[string]*item),
ttl: ttl,
tick: 30 * time.Second,
mu: &sync.RWMutex{},
}
go c.expiryService()
return c
}
func (c *Cache) expiryService() {
ticker := time.NewTicker(c.tick)
defer ticker.Stop()
for {
select {
case <-ticker.C:
c.expire()
}
}
}
func (c *Cache) expire() {
c.mu.Lock()
defer c.mu.Unlock()
t := time.Now()
for k, v := range c.creds {
if t.Sub(v.created) > c.ttl {
delete(c.creds, k)
}
}
}
// Put - saves new creds
func (c *Cache) Put(registry string, creds *types.Credentials) {
c.mu.Lock()
defer c.mu.Unlock()
c.creds[registry] = &item{credentials: creds, created: time.Now()}
}
// Get - retrieves creds
func (c *Cache) Get(registry string) (*types.Credentials, error) {
c.mu.RLock()
defer c.mu.RUnlock()
item, ok := c.creds[registry]
if !ok {
return nil, fmt.Errorf("not found")
}
cr := new(types.Credentials)
*cr = *item.credentials
return cr, nil
}