-
Notifications
You must be signed in to change notification settings - Fork 1.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Abstracts storage constructors back to interface, as prep for redis alternatives #6451
Conversation
API Changes --- prev.txt 2024-08-07 02:48:49.101048655 +0000
+++ current.txt 2024-08-07 02:48:45.549018543 +0000
@@ -4853,8 +4853,8 @@
func GetCertIDAndChainPEM(certData []byte, secret string) (string, []byte, error)
func ParsePEM(data []byte, secret string) ([]*pem.Block, error)
func ParsePEMCertificate(data []byte, secret string) (*tls.Certificate, error)
-func NewCertificateManager(storage storage.Handler, secret string, logger *logrus.Logger, migrateCertList bool) *certificateManager
-func NewSlaveCertManager(localStorage, rpcStorage storage.Handler, secret string, logger *logrus.Logger, migrateCertList bool) *certificateManager
+func NewCertificateManager(storage interfaces.Handler, secret string, logger *logrus.Logger, migrateCertList bool) *certificateManager
+func NewSlaveCertManager(localStorage, rpcStorage interfaces.Handler, secret string, logger *logrus.Logger, migrateCertList bool) *certificateManager
TYPES
@@ -7861,7 +7861,7 @@
takes the precedence. If the global one is `true`, value of the one in api
level doesn't matter.
-func (a *APISpec) Init(authStore, sessionStore, healthStore, orgStore storage.Handler)
+func (a *APISpec) Init(authStore, sessionStore, healthStore, orgStore interfaces.Handler)
func (s *APISpec) Release()
Release releases all resources associated with API spec
@@ -8223,7 +8223,7 @@
func (h *DefaultHealthChecker) CreateKeyName(subKey HealthPrefix) string
-func (h *DefaultHealthChecker) Init(storeType storage.Handler)
+func (h *DefaultHealthChecker) Init(storeType interfaces.Handler)
func (h *DefaultHealthChecker) StoreCounterVal(counterType HealthPrefix, value string)
@@ -8244,7 +8244,7 @@
// Has unexported fields.
}
-func (b *DefaultSessionManager) Init(store storage.Handler)
+func (b *DefaultSessionManager) Init(store interfaces.Handler)
func (b *DefaultSessionManager) KeyExpired(newSession *user.SessionState) bool
KeyExpired checks if a key has expired, if the value of
@@ -8267,7 +8267,7 @@
func (b *DefaultSessionManager) Stop()
-func (b *DefaultSessionManager) Store() storage.Handler
+func (b *DefaultSessionManager) Store() interfaces.Handler
func (b *DefaultSessionManager) UpdateSession(keyName string, session *user.SessionState,
resetTTLTo int64, hashed bool) error
@@ -8501,7 +8501,7 @@
TestBundleMu sync.Mutex
// RedisController keeps track of redis connection and singleton
- StorageConnectionHandler *storage.ConnectionHandler
+ StorageConnectionHandler *redisCluster.ConnectionHandler
// Has unexported fields.
}
@@ -8544,7 +8544,7 @@
func (gw *Gateway) GetStorageForApi(apiID string) (ExtendedOsinStorageInterface, int, error)
-func (gw *Gateway) InitHostCheckManager(ctx context.Context, store storage.Handler)
+func (gw *Gateway) InitHostCheckManager(ctx context.Context, store interfaces.Handler)
func (gw *Gateway) InitializeRPCCache()
@@ -8849,7 +8849,7 @@
}
type HealthChecker interface {
- Init(storage.Handler)
+ Init(interfaces.Handler)
ApiHealthValues() (HealthCheckValues, error)
StoreCounterVal(HealthPrefix, string)
}
@@ -8899,7 +8899,7 @@
func (hc *HostCheckerManager) HostDown(urlStr string) bool
-func (hc *HostCheckerManager) Init(store storage.Handler)
+func (hc *HostCheckerManager) Init(store interfaces.Handler)
func (hc *HostCheckerManager) ListFromService(apiID string) ([]HostData, error)
@@ -9094,7 +9094,7 @@
SearchString string
// Has unexported fields.
}
- LDAPStorageHandler implements storage.Handler, this is a read-only
+ LDAPStorageHandler implements interfaces.Handler, this is a read-only
implementation to access keys from an LDAP service
func (l LDAPStorageHandler) AddToSet(keyName, value string)
@@ -9797,7 +9797,7 @@
func (r *RedisOsinStorageInterface) SetUser(username string, session *user.SessionState, timeout int64) error
type RedisPurger struct {
- Store storage.Handler
+ Store interfaces.Handler
Gw *Gateway `json:"-"`
}
@@ -10145,8 +10145,8 @@
func (s *ServiceDiscovery) Target(serviceURL string) (*apidef.HostList, error)
type SessionHandler interface {
- Init(store storage.Handler)
- Store() storage.Handler
+ Init(store interfaces.Handler)
+ Store() interfaces.Handler
UpdateSession(keyName string, session *user.SessionState, resetTTLTo int64, hashed bool) error
RemoveSession(orgID string, keyName string, hashed bool) bool
SessionDetail(orgID string, keyName string, hashed bool) (user.SessionState, bool)
@@ -10175,12 +10175,12 @@
func (l *SessionLimiter) Context() context.Context
-func (l *SessionLimiter) ForwardMessage(r *http.Request, session *user.SessionState, rateLimitKey string, quotaKey string, store storage.Handler, enableRL, enableQ bool, api *APISpec, dryRun bool) sessionFailReason
+func (l *SessionLimiter) ForwardMessage(r *http.Request, session *user.SessionState, rateLimitKey string, quotaKey string, store interfaces.Handler, enableRL, enableQ bool, api *APISpec, dryRun bool) sessionFailReason
ForwardMessage will enforce rate limiting, returning a non-zero
sessionFailReason if session limits have been exceeded. Key values to manage
rate are Rate and Per, e.g. Rate of 10 messages Per 10 seconds
-func (l *SessionLimiter) RedisQuotaExceeded(r *http.Request, session *user.SessionState, quotaKey, scope string, limit *user.APILimit, store storage.Handler, hashKeys bool) bool
+func (l *SessionLimiter) RedisQuotaExceeded(r *http.Request, session *user.SessionState, quotaKey, scope string, limit *user.APILimit, store interfaces.Handler, hashKeys bool) bool
type SlaveDataCenter struct {
SlaveOptions config.SlaveOptionsConfig
@@ -10835,6 +10835,50 @@
)
Gateway's custom response headers
+# Package: ./interfaces
+
+package interfaces // import "github.com/TykTechnologies/tyk/interfaces"
+
+
+TYPES
+
+type Handler interface {
+ GetKey(string) (string, error) // Returned string is expected to be a JSON object (user.SessionState)
+ GetMultiKey([]string) ([]string, error)
+ GetRawKey(string) (string, error)
+ SetKey(string, string, int64) error // Second input string is expected to be a JSON object (user.SessionState)
+ SetRawKey(string, string, int64) error
+ SetExp(string, int64) error // Set key expiration
+ GetExp(string) (int64, error) // Returns expiry of a key
+ GetKeys(string) []string
+ DeleteKey(string) bool
+ DeleteAllKeys() bool
+ DeleteRawKey(string) bool
+ Connect() bool
+ GetKeysAndValues() map[string]string
+ GetKeysAndValuesWithFilter(string) map[string]string
+ DeleteKeys([]string) bool
+ Decrement(string)
+ IncrememntWithExpire(string, int64) int64
+ SetRollingWindow(key string, per int64, val string, pipeline bool) (int, []interface{})
+ GetRollingWindow(key string, per int64, pipeline bool) (int, []interface{})
+ GetSet(string) (map[string]string, error)
+ AddToSet(string, string)
+ GetAndDeleteSet(string) []interface{}
+ RemoveFromSet(string, string)
+ DeleteScanMatch(string) bool
+ GetKeyPrefix() string
+ AddToSortedSet(string, string, float64)
+ GetSortedSetRange(string, string, string) ([]string, []float64, error)
+ RemoveSortedSetRange(string, string, string) error
+ GetListRange(string, int64, int64) ([]string, error)
+ RemoveFromList(string, string) error
+ AppendToSet(string, string)
+ Exists(string) (bool, error)
+}
+ Handler is a standard interface to a storage backend, used by
+ AuthorisationManager to read and write key values to the backend
+
# Package: ./log
package log // import "github.com/TykTechnologies/tyk/log"
@@ -11143,7 +11187,7 @@
}
type Purger struct {
- Store storage.Handler
+ Store interfaces.Handler
}
RPCPurger will purge analytics data into a Mongo database, requires that the
Mongo DB string is specified in the Config object
@@ -11163,7 +11207,7 @@
// Has unexported fields.
}
-func NewSyncForcer(controller *storage.ConnectionHandler, getNodeDataFunc func() []byte) *SyncronizerForcer
+func NewSyncForcer(controller *redisCluster.ConnectionHandler, getNodeDataFunc func() []byte) *SyncronizerForcer
NewSyncForcer returns a new syncforcer with a connected redis with a key
prefix synchronizer-group- for group synchronization control.
@@ -11217,54 +11261,34 @@
CONSTANTS
const (
- // DefaultConn is the default connection type. Not analytics and Not cache.
- DefaultConn = "default"
- // CacheConn is the cache connection type
- CacheConn = "cache"
- // AnalyticsConn is the analytics connection type
- AnalyticsConn = "analytics"
-)
-const B64JSONPrefix = "ey"
- `{"` in base64
-
-const MongoBsonIdLength = 24
-
-VARIABLES
-
-var (
- // ErrRedisIsDown is returned when we can't communicate with redis
- ErrRedisIsDown = errors.New("storage: Redis is either down or was not configured")
-
- // ErrStorageConn is returned when we can't get a connection from the ConnectionHandler
- ErrStorageConn = fmt.Errorf("Error trying to get singleton instance: %w", ErrRedisIsDown)
+ REDIS_CLUSTER = "redis"
+ MDCB = "mdcb"
+ DUMMY = "dummy"
)
-var (
- HashSha256 = "sha256"
- HashMurmur32 = "murmur32"
- HashMurmur64 = "murmur64"
- HashMurmur128 = "murmur128"
+const (
+ DEFAULT_MODULE = "default"
)
-var ErrKeyNotFound = errors.New("key not found")
- ErrKeyNotFound is a standard error for when a key is not found in the
- storage engine
-
-var ErrMDCBConnectionLost = errors.New("mdcb connection is lost")
FUNCTIONS
-func GenerateToken(orgID, keyID, hashAlgorithm string) (string, error)
- If hashing algorithm is empty, use legacy key generation
-
-func HashKey(in string, hashKey bool) string
-func HashStr(in string, withAlg ...string) string
-func NewConnector(connType string, conf config.Config) (model.Connector, error)
- NewConnector creates a new storage connection.
-
-func TokenHashAlgo(token string) string
-func TokenID(token string) (id string, err error)
- TODO: add checks
-
-func TokenOrg(token string) string
+func GetStorageForModule(module string) string
+ GetStorageForModule returns the storage type for the given module. Defaults
+ to REDIS_CLUSTER for the initial implementation.
+
+func IsAnalytics(analytics bool) func(interfaces.Handler)
+func IsCache(cache bool) func(interfaces.Handler)
+func NewStorageHandler(name string, opts ...func(interfaces.Handler)) (interfaces.Handler, error)
+func WithConnectionHandler(handler *redisCluster.ConnectionHandler) func(interfaces.Handler)
+func WithHashKeys(hashKeys bool) func(interfaces.Handler)
+func WithKeyPrefix(prefix string) func(interfaces.Handler)
+ Redis Cluster Options
+
+func WithLocalStorageHandler(handler interfaces.Handler) func(interfaces.Handler)
+ MDCB Options
+
+func WithLogger(logger *logrus.Entry) func(interfaces.Handler)
+func WithRedisController(controller *redisCluster.RedisController) func(interfaces.Handler)
+func WithRpcStorageHandler(handler interfaces.Handler) func(interfaces.Handler)
TYPES
@@ -11276,33 +11300,12 @@
GetExp(string) (int64, error) // Returns expiry of a key
}
-type ConnectionHandler struct {
- // Has unexported fields.
-}
- ConnectionHandler is a wrapper around the storage connection. It allows to
- dynamically enable/disable talking with storage and mantain a connection map
- to different storage types.
+# Package: ./storage/dummy
-func NewConnectionHandler(ctx context.Context) *ConnectionHandler
- NewConnectionHandler creates a new connection handler not connected
+package dummy // import "github.com/TykTechnologies/tyk/storage/dummy"
-func (rc *ConnectionHandler) Connect(ctx context.Context, onConnect func(), conf *config.Config)
- Connect starts a go routine that periodically tries to connect to storage.
- onConnect will be called when we have established a successful storage
- reconnection
-
-func (rc *ConnectionHandler) Connected() bool
- Connected returns true if we are connected to redis
-
-func (rc *ConnectionHandler) DisableStorage(setStorageDown bool)
- DisableStorage allows to dynamically enable/disable talking with storage
-
-func (rc *ConnectionHandler) Disconnect() error
- Disconnect closes the connection to the storage
-
-func (rc *ConnectionHandler) WaitConnect(ctx context.Context) bool
- WaitConnect waits until we are connected to the storage
+TYPES
type DummyStorage struct {
Data map[string]string
@@ -11455,49 +11458,65 @@
SetRollingWindow sets a rolling window for a key with specified parameters;
implementation pending.
-type Handler interface {
- GetKey(string) (string, error) // Returned string is expected to be a JSON object (user.SessionState)
- GetMultiKey([]string) ([]string, error)
- GetRawKey(string) (string, error)
- SetKey(string, string, int64) error // Second input string is expected to be a JSON object (user.SessionState)
- SetRawKey(string, string, int64) error
- SetExp(string, int64) error // Set key expiration
- GetExp(string) (int64, error) // Returns expiry of a key
- GetKeys(string) []string
- DeleteKey(string) bool
- DeleteAllKeys() bool
- DeleteRawKey(string) bool
- Connect() bool
- GetKeysAndValues() map[string]string
- GetKeysAndValuesWithFilter(string) map[string]string
- DeleteKeys([]string) bool
- Decrement(string)
- IncrememntWithExpire(string, int64) int64
- SetRollingWindow(key string, per int64, val string, pipeline bool) (int, []interface{})
- GetRollingWindow(key string, per int64, pipeline bool) (int, []interface{})
- GetSet(string) (map[string]string, error)
- AddToSet(string, string)
- GetAndDeleteSet(string) []interface{}
- RemoveFromSet(string, string)
- DeleteScanMatch(string) bool
- GetKeyPrefix() string
- AddToSortedSet(string, string, float64)
- GetSortedSetRange(string, string, string) ([]string, []float64, error)
- RemoveSortedSetRange(string, string, string) error
- GetListRange(string, int64, int64) ([]string, error)
- RemoveFromList(string, string) error
- AppendToSet(string, string)
- Exists(string) (bool, error)
+# Package: ./storage/kv
+
+package kv // import "github.com/TykTechnologies/tyk/storage/kv"
+
+
+VARIABLES
+
+var (
+ // ErrKeyNotFound is an error meant when a key doesn't exists in the
+ // storage backend
+ ErrKeyNotFound = errors.New("key not found")
+)
+
+TYPES
+
+type Consul struct {
+ // Has unexported fields.
}
- Handler is a standard interface to a storage backend, used by
- AuthorisationManager to read and write key values to the backend
+ Consul is an implementation of a KV store which uses Consul as it's backend
+
+func (c *Consul) Get(key string) (string, error)
+
+func (c *Consul) Store() *consulapi.KV
+
+type Store interface {
+ Get(key string) (string, error)
+}
+ Store is a standard interface to a KV backend
+
+func NewConsul(conf config.ConsulConfig) (Store, error)
+ NewConsul returns a configured consul KV store adapter
+
+func NewVault(conf config.VaultConfig) (Store, error)
+ NewVault returns a configured vault KV store adapter
+
+type Vault struct {
+ // Has unexported fields.
+}
+ Vault is an implementation of a KV store which uses Consul as it's backend
+
+func (v *Vault) Client() *vaultapi.Client
+
+func (v *Vault) Get(key string) (string, error)
+
+# Package: ./storage/mdcb
+
+package mdcb // import "github.com/TykTechnologies/tyk/storage/mdcb"
+
+
+TYPES
type MdcbStorage struct {
+ Local interfaces.Handler
+ Rpc interfaces.Handler
+ Logger *logrus.Entry
CallbackonPullfromRPC *func(key string, val string) error
- // Has unexported fields.
}
-func NewMdcbStorage(local, rpc Handler, log *logrus.Entry) *MdcbStorage
+func NewMdcbStorage(local, rpc interfaces.Handler, log *logrus.Entry) *MdcbStorage
func (m MdcbStorage) AddToSet(key string, value string)
@@ -11564,6 +11583,68 @@
func (m MdcbStorage) SetRollingWindow(key string, per int64, val string, pipeline bool) (int, []interface{})
+# Package: ./storage/redis-cluster
+
+package redisCluster // import "github.com/TykTechnologies/tyk/storage/redis-cluster"
+
+
+CONSTANTS
+
+const (
+ // DefaultConn is the default connection type. Not analytics and Not cache.
+ DefaultConn = "default"
+ // CacheConn is the cache connection type
+ CacheConn = "cache"
+ // AnalyticsConn is the analytics connection type
+ AnalyticsConn = "analytics"
+)
+
+VARIABLES
+
+var (
+ // ErrRedisIsDown is returned when we can't communicate with redis
+ ErrRedisIsDown = errors.New("storage: Redis is either down or was not configured")
+
+ // ErrStorageConn is returned when we can't get a connection from the ConnectionHandler
+ ErrStorageConn = fmt.Errorf("Error trying to get singleton instance: %w", ErrRedisIsDown)
+)
+
+FUNCTIONS
+
+func NewConnector(connType string, conf config.Config) (model.Connector, error)
+ NewConnector creates a new storage connection.
+
+
+TYPES
+
+type ConnectionHandler struct {
+ // Has unexported fields.
+}
+ ConnectionHandler is a wrapper around the storage connection. It allows to
+ dynamically enable/disable talking with storage and mantain a connection map
+ to different storage types.
+
+func NewConnectionHandler(ctx context.Context) *ConnectionHandler
+ NewConnectionHandler creates a new connection handler not connected
+
+func (rc *ConnectionHandler) Connect(ctx context.Context, onConnect func(), conf *config.Config)
+ Connect starts a go routine that periodically tries to connect to storage.
+
+ onConnect will be called when we have established a successful storage
+ reconnection
+
+func (rc *ConnectionHandler) Connected() bool
+ Connected returns true if we are connected to redis
+
+func (rc *ConnectionHandler) DisableStorage(setStorageDown bool)
+ DisableStorage allows to dynamically enable/disable talking with storage
+
+func (rc *ConnectionHandler) Disconnect() error
+ Disconnect closes the connection to the storage
+
+func (rc *ConnectionHandler) WaitConnect(ctx context.Context) bool
+ WaitConnect waits until we are connected to the storage
+
type RedisCluster struct {
KeyPrefix string
HashKeys bool
@@ -11730,50 +11811,51 @@
plugins to wait for connectivity before proceeding with operations that
require Redis access.
-# Package: ./storage/kv
+# Package: ./storage/shared
-package kv // import "github.com/TykTechnologies/tyk/storage/kv"
+package shared // import "github.com/TykTechnologies/tyk/storage/shared"
VARIABLES
-var (
- // ErrKeyNotFound is an error meant when a key doesn't exists in the
- // storage backend
- ErrKeyNotFound = errors.New("key not found")
-)
+var ErrKeyNotFound = errors.New("key not found")
+ ErrKeyNotFound is a standard error for when a key is not found in the
+ storage engine
-TYPES
+var ErrMDCBConnectionLost = errors.New("mdcb connection is lost")
+# Package: ./storage/util
-type Consul struct {
- // Has unexported fields.
-}
- Consul is an implementation of a KV store which uses Consul as it's backend
+package util // import "github.com/TykTechnologies/tyk/storage/util"
-func (c *Consul) Get(key string) (string, error)
-func (c *Consul) Store() *consulapi.KV
+CONSTANTS
-type Store interface {
- Get(key string) (string, error)
-}
- Store is a standard interface to a KV backend
+const B64JSONPrefix = "ey"
+ `{"` in base64
-func NewConsul(conf config.ConsulConfig) (Store, error)
- NewConsul returns a configured consul KV store adapter
+const MongoBsonIdLength = 24
-func NewVault(conf config.VaultConfig) (Store, error)
- NewVault returns a configured vault KV store adapter
+VARIABLES
-type Vault struct {
- // Has unexported fields.
-}
- Vault is an implementation of a KV store which uses Consul as it's backend
+var (
+ HashSha256 = "sha256"
+ HashMurmur32 = "murmur32"
+ HashMurmur64 = "murmur64"
+ HashMurmur128 = "murmur128"
+)
-func (v *Vault) Client() *vaultapi.Client
+FUNCTIONS
-func (v *Vault) Get(key string) (string, error)
+func GenerateToken(orgID, keyID, hashAlgorithm string) (string, error)
+ If hashing algorithm is empty, use legacy key generation
+func HashKey(in string, hashKey bool) string
+func HashStr(in string, withAlg ...string) string
+func TokenHashAlgo(token string) string
+func TokenID(token string) (id string, err error)
+ TODO: add checks
+
+func TokenOrg(token string) string
# Package: ./tcp
package tcp // import "github.com/TykTechnologies/tyk/tcp" |
PR Reviewer Guide 🔍
|
PR Code Suggestions ✨
|
Quality Gate failedFailed conditions |
hashAlgorithm = defaultHashAlgorithm | ||
} | ||
|
||
jsonToken := fmt.Sprintf(`{"org":"%s","id":"%s","h":"%s"}`, orgID, keyID, hashAlgorithm) |
Check failure
Code scanning / CodeQL
Potentially unsafe quoting Critical
JSON value
If this
JSON value
If this
JSON value
Closing this in favor of TykTechnologies/storage#112 and #6457 |
User description
This PR abstracts the storage handler implementations, which were all literals like
x :=. RedisCluster{blah:blah}
to instead take the Handler interface, and added a nifty constructor that allows for more dynamic configuration.Description
storage
package into sub-modules for each store type (redisCluster
,MDCB
,DUMMY
)storage.NewStorageHandler(type, opts...)
to consolidate instantiationRelated Issue
Remove dependency on Redis
Motivation and Context
In order to eventually drop Redis, or be able to replace it with a different beack end that is more lightweight, the code base needs to use the existing Handler interface to interact with the back end, unfortunately over time, concrete implementations have crept in and made it harder to make the back-end pluggable. This PR aims to address that to some degree.
How This Has Been Tested
lol, the code builds ;-)
Types of changes
Checklist
PR Type
Enhancement, Tests
Description
NewStorageHandler
.redisCluster
,mdcb
,shared
, andutil
.util
package.Changes walkthrough 📝
10 files
server.go
Refactor storage handler initialization in server.go
gateway/server.go
RedisCluster
instantiations withNewStorageHandler
calls.
rpc_storage_handler.go
Update storage handler and utility usage in rpc_storage_handler.go
gateway/rpc_storage_handler.go
util
package for hashing.RedisCluster
references withshared
package errors.api.go
Refactor storage handler usage and imports in api.go
gateway/api.go
RedisCluster
references withNewStorageHandler
calls.util
package.storage.go
Refactor storage handler interface and add constructor
storage/storage.go
mdcb_storage.go
Update MdcbStorage to use new storage handler interface
storage/mdcb/mdcb_storage.go
MdcbStorage
struct to use newinterfaces.Handler
.oauth_manager.go
Refactor storage handler usage and imports in oauth_manager.go
gateway/oauth_manager.go
RedisCluster
references withNewStorageHandler
calls.util
package.util.go
Add utility functions for hashing and token generation
storage/util/util.go
storage.go
to a newutil
package.redis_cluster.go
Update package name and references in redis_cluster.go
storage/redis-cluster/redis_cluster.go
redisCluster
.shared
package.util
package.session_manager.go
Update session manager to use new storage handler interface
gateway/session_manager.go
redis_options.go
Add options for configuring Redis storage handlers
storage/redis_options.go
5 files
redis_cluster_test.go
Update package name and error references in redis_cluster_test.go
storage/redis-cluster/redis_cluster_test.go
redisCluster
.shared
package.coprocess_id_extractor_test.go
Update imports and storage references in
coprocess_id_extractor_test.go
gateway/coprocess_id_extractor_test.go
RedisCluster
references withredisCluster
.util
package.api_test.go
Update imports and storage references in api_test.go
gateway/api_test.go
RedisCluster
references withredisCluster
.util
package.host_checker_manager_test.go
Update imports and storage references in host_checker_manager_test.go
gateway/host_checker_manager_test.go
RedisCluster
references withredisCluster
.sliding_log_test.go
Update imports and storage references in sliding_log_test.go
internal/rate/sliding_log_test.go
RedisCluster
references withredisCluster
.38 files
health_check.go
...
gateway/health_check.go
...
mw_api_rate_limit.go
...
gateway/mw_api_rate_limit.go
...
oauth_manager_test.go
...
gateway/oauth_manager_test.go
...
mw_basic_auth.go
...
gateway/mw_basic_auth.go
...
event_handler_webhooks.go
...
gateway/event_handler_webhooks.go
...
host_checker_manager.go
...
gateway/host_checker_manager.go
...
redis_signals.go
...
gateway/redis_signals.go
...
cert_test.go
...
gateway/cert_test.go
...
redis_logrus_hook.go
...
gateway/redis_logrus_hook.go
...
mw_external_oauth.go
...
gateway/mw_external_oauth.go
...
coprocess_api.go
...
gateway/coprocess_api.go
...
api_definition.go
...
gateway/api_definition.go
...
mdcb_options.go
...
storage/mdcb_options.go
...
mw_auth_key_test.go
...
gateway/mw_auth_key_test.go
...
mw_jwt.go
...
gateway/mw_jwt.go
...
ctx.go
...
ctx/ctx.go
...
api_healthcheck.go
...
gateway/api_healthcheck.go
...
analytics.go
...
gateway/analytics.go
...
mw_auth_key.go
...
gateway/mw_auth_key.go
...
mw_basic_auth_test.go
...
gateway/mw_basic_auth_test.go
...
mdcb_storage_test.go
...
storage/mdcb/mdcb_storage_test.go
...
mw_redis_cache.go
...
gateway/mw_redis_cache.go
...
synchronization_forcer_test.go
...
rpc/synchronization_forcer_test.go
...
sliding_log.go
...
internal/rate/sliding_log.go
...
rpc_analytics_purger.go
...
rpc/rpc_analytics_purger.go
...
delete_api_cache.go
...
gateway/delete_api_cache.go
...
storage_test.go
...
storage/storage_test.go
...
redis_analytics_purger.go
...
gateway/redis_analytics_purger.go
...
res_cache.go
...
gateway/res_cache.go
...
manager_test.go
...
certs/manager_test.go
...
ldap_auth_handler.go
...
gateway/ldap_auth_handler.go
...
errors.go
...
storage/shared/errors.go
...
redis_shim_test.go
...
storage/redis-cluster/redis_shim_test.go
...
redis_shim.go
...
storage/redis-cluster/redis_shim.go
...
connection_handler_test.go
...
storage/redis-cluster/connection_handler_test.go
...
dummy_test.go
...
storage/dummy/dummy_test.go
...
connection_handler.go
...
storage/redis-cluster/connection_handler.go
...
dummy.go
...
storage/dummy/dummy.go
...