80 lines
1.3 KiB
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
|
|
}
|