forked from TrueCloudLab/frostfs-s3-gw
60 lines
1.6 KiB
Go
60 lines
1.6 KiB
Go
package policy
|
|
|
|
import (
|
|
"git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/cache"
|
|
"git.frostfs.info/TrueCloudLab/frostfs-s3-gw/internal/logs"
|
|
"git.frostfs.info/TrueCloudLab/policy-engine/pkg/chain"
|
|
"git.frostfs.info/TrueCloudLab/policy-engine/pkg/engine"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
type CachedMorph struct {
|
|
morph engine.MorphRuleChainStorage
|
|
cache *cache.MorphPolicyCache
|
|
log *zap.Logger
|
|
}
|
|
|
|
type CachedMorphConfig struct {
|
|
Morph engine.MorphRuleChainStorage
|
|
Cache *cache.MorphPolicyCache
|
|
Log *zap.Logger
|
|
}
|
|
|
|
var _ engine.MorphRuleChainStorage = (*CachedMorph)(nil)
|
|
|
|
func NewCachedMorph(config CachedMorphConfig) *CachedMorph {
|
|
return &CachedMorph{
|
|
morph: config.Morph,
|
|
cache: config.Cache,
|
|
log: config.Log,
|
|
}
|
|
}
|
|
|
|
func (c *CachedMorph) AddMorphRuleChain(name chain.Name, target engine.Target, policyChain *chain.Chain) error {
|
|
c.cache.Delete(cache.MorphPolicyCacheKey{Target: target, Name: name})
|
|
return c.morph.AddMorphRuleChain(name, target, policyChain)
|
|
}
|
|
|
|
func (c *CachedMorph) RemoveMorphRuleChain(name chain.Name, target engine.Target, chainID chain.ID) error {
|
|
c.cache.Delete(cache.MorphPolicyCacheKey{Target: target, Name: name})
|
|
return c.morph.RemoveMorphRuleChain(name, target, chainID)
|
|
}
|
|
|
|
func (c *CachedMorph) ListMorphRuleChains(name chain.Name, target engine.Target) ([]*chain.Chain, error) {
|
|
key := cache.MorphPolicyCacheKey{Target: target, Name: name}
|
|
list := c.cache.Get(key)
|
|
if list != nil {
|
|
return list, nil
|
|
}
|
|
|
|
list, err := c.morph.ListMorphRuleChains(name, target)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if err = c.cache.Put(key, list); err != nil {
|
|
c.log.Warn(logs.CouldntCacheListPolicyChains)
|
|
}
|
|
|
|
return list, nil
|
|
}
|