mirror of
https://github.com/yannh/kubeconform.git
synced 2026-02-11 14:09:21 +00:00
52 lines
962 B
Go
52 lines
962 B
Go
package cache
|
|
|
|
import (
|
|
"crypto/sha256"
|
|
"encoding/hex"
|
|
"io"
|
|
"os"
|
|
"path"
|
|
"sync"
|
|
)
|
|
|
|
type onDisk struct {
|
|
sync.RWMutex
|
|
folder string
|
|
}
|
|
|
|
// New creates a new cache for downloaded schemas
|
|
func NewOnDiskCache(cache string) Cache {
|
|
return &onDisk{
|
|
folder: cache,
|
|
}
|
|
}
|
|
|
|
func cachePath(folder, key string) string {
|
|
hash := sha256.Sum256([]byte(key))
|
|
return path.Join(folder, hex.EncodeToString(hash[:]))
|
|
}
|
|
|
|
// Get retrieves the JSON schema given a resource signature
|
|
func (c *onDisk) Get(key string) (any, error) {
|
|
c.RLock()
|
|
defer c.RUnlock()
|
|
|
|
f, err := os.Open(cachePath(c.folder, key))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer f.Close()
|
|
|
|
return io.ReadAll(f)
|
|
}
|
|
|
|
// Set adds a JSON schema to the schema cache
|
|
func (c *onDisk) Set(key string, schema any) error {
|
|
c.Lock()
|
|
defer c.Unlock()
|
|
|
|
if _, err := os.Stat(cachePath(c.folder, key)); os.IsNotExist(err) {
|
|
return os.WriteFile(cachePath(c.folder, key), schema.([]byte), 0644)
|
|
}
|
|
return nil
|
|
}
|