From 098667915416b032fb9754198021a3fb8aff6489 Mon Sep 17 00:00:00 2001 From: Andrei Aaron Date: Sat, 18 Jan 2025 10:02:13 +0000 Subject: [PATCH] feat(metadb): add keyPrefix parameter for redis and remove unneeded method meta.Crate() Signed-off-by: Andrei Aaron --- examples/config-redis.json | 3 +- pkg/meta/meta.go | 115 +++----- pkg/meta/meta_test.go | 145 +++++----- pkg/meta/parse_test.go | 9 +- pkg/meta/redisdb/buckets.go | 13 - pkg/meta/redisdb/parameters.go | 20 ++ pkg/meta/redisdb/redis.go | 364 +++++++++++++----------- pkg/meta/redisdb/redis_internal_test.go | 55 ++++ pkg/meta/redisdb/redis_test.go | 12 +- pkg/meta/version/version_test.go | 11 +- 10 files changed, 404 insertions(+), 343 deletions(-) delete mode 100644 pkg/meta/redisdb/buckets.go create mode 100644 pkg/meta/redisdb/parameters.go create mode 100644 pkg/meta/redisdb/redis_internal_test.go diff --git a/examples/config-redis.json b/examples/config-redis.json index bce58494e..b8d5901c6 100644 --- a/examples/config-redis.json +++ b/examples/config-redis.json @@ -6,7 +6,8 @@ "rootDirectory": "/tmp/zot", "cacheDriver": { "name": "redis", - "url": "redis://localhost:6379" + "url": "redis://localhost:6379", + "keyPrefix": "zot" }, "storageDriver": { "name": "s3", diff --git a/pkg/meta/meta.go b/pkg/meta/meta.go index d387d7fd0..619b2d8bd 100644 --- a/pkg/meta/meta.go +++ b/pkg/meta/meta.go @@ -3,10 +3,6 @@ package meta import ( "fmt" - "github.com/aws/aws-sdk-go-v2/service/dynamodb" - "github.com/redis/go-redis/v9" - "go.etcd.io/bbolt" - "zotregistry.dev/zot/errors" "zotregistry.dev/zot/pkg/api/config" "zotregistry.dev/zot/pkg/log" @@ -27,19 +23,18 @@ func New(storageConfig config.StorageConfig, log log.Logger) (mTypes.MetaDB, err return nil, err } - return Create(sconstants.DynamoDBDriverName, client, dynamoParams, log) //nolint:contextcheck + return mdynamodb.New(client, dynamoParams, log) //nolint:contextcheck } if storageConfig.CacheDriver["name"] == sconstants.RedisDriverName { - // go-redis supports connecting via the redis uri specification (more convenient than parameter parsing) - redisURL := getRedisURL(storageConfig.CacheDriver, log) + redisParams := getRedisParams(storageConfig.CacheDriver, log) - client, err := redisdb.GetRedisClient(redisURL) + client, err := redisdb.GetRedisClient(redisParams) if err != nil { //nolint:wsl return nil, err } - return Create(sconstants.RedisDriverName, client, nil, log) //nolint:contextcheck + return redisdb.New(client, redisParams, log) //nolint:contextcheck } // this behavior is also mentioned in the configuration validation logic inside the cli package @@ -61,90 +56,34 @@ func New(storageConfig config.StorageConfig, log log.Logger) (mTypes.MetaDB, err return nil, err } - return Create("boltdb", driver, params, log) //nolint:contextcheck -} - -func Create(dbtype string, dbDriver, parameters interface{}, log log.Logger, //nolint:contextcheck -) (mTypes.MetaDB, error, -) { - switch dbtype { - case "boltdb": - { - properDriver, ok := dbDriver.(*bbolt.DB) - if !ok { - log.Error().Err(errors.ErrTypeAssertionFailed). - Msgf("failed to cast type, expected type '%T' but got '%T'", &bbolt.DB{}, dbDriver) - - return nil, errors.ErrTypeAssertionFailed - } - - return boltdb.New(properDriver, log) - } - case "redis": - { - properDriver, ok := dbDriver.(*redis.Client) - if !ok { - log.Error().Err(errors.ErrTypeAssertionFailed). - Msgf("failed to cast type, expected type '%T' but got '%T'", &redis.Client{}, dbDriver) - - return nil, errors.ErrTypeAssertionFailed - } - - return redisdb.New(properDriver, log) - } - case "dynamodb": - { - properDriver, ok := dbDriver.(*dynamodb.Client) - if !ok { - log.Error().Err(errors.ErrTypeAssertionFailed). - Msgf("failed to cast type, expected type '%T' but got '%T'", &dynamodb.Client{}, dbDriver) - - return nil, errors.ErrTypeAssertionFailed - } - - properParameters, ok := parameters.(mdynamodb.DBDriverParameters) - if !ok { - log.Error().Err(errors.ErrTypeAssertionFailed). - Msgf("failed to cast type, expected type '%T' but got '%T'", mdynamodb.DBDriverParameters{}, - parameters) - - return nil, errors.ErrTypeAssertionFailed - } - - return mdynamodb.New(properDriver, properParameters, log) - } - default: - { - return nil, errors.ErrBadConfig - } - } + return boltdb.New(driver, log) //nolint:contextcheck } func getDynamoParams(cacheDriverConfig map[string]interface{}, log log.Logger) mdynamodb.DBDriverParameters { allParametersOk := true - endpoint, ok := toStringIfOk(cacheDriverConfig, "endpoint", log) + endpoint, ok := toStringIfOk(cacheDriverConfig, "endpoint", "", log) allParametersOk = allParametersOk && ok - region, ok := toStringIfOk(cacheDriverConfig, "region", log) + region, ok := toStringIfOk(cacheDriverConfig, "region", "", log) allParametersOk = allParametersOk && ok - repoMetaTablename, ok := toStringIfOk(cacheDriverConfig, "repometatablename", log) + repoMetaTablename, ok := toStringIfOk(cacheDriverConfig, "repometatablename", "", log) allParametersOk = allParametersOk && ok - repoBlobsInfoTablename, ok := toStringIfOk(cacheDriverConfig, "repoblobsinfotablename", log) + repoBlobsInfoTablename, ok := toStringIfOk(cacheDriverConfig, "repoblobsinfotablename", "", log) allParametersOk = allParametersOk && ok - imageMetaTablename, ok := toStringIfOk(cacheDriverConfig, "imagemetatablename", log) + imageMetaTablename, ok := toStringIfOk(cacheDriverConfig, "imagemetatablename", "", log) allParametersOk = allParametersOk && ok - apiKeyTablename, ok := toStringIfOk(cacheDriverConfig, "apikeytablename", log) + apiKeyTablename, ok := toStringIfOk(cacheDriverConfig, "apikeytablename", "", log) allParametersOk = allParametersOk && ok - versionTablename, ok := toStringIfOk(cacheDriverConfig, "versiontablename", log) + versionTablename, ok := toStringIfOk(cacheDriverConfig, "versiontablename", "", log) allParametersOk = allParametersOk && ok - userDataTablename, ok := toStringIfOk(cacheDriverConfig, "userdatatablename", log) + userDataTablename, ok := toStringIfOk(cacheDriverConfig, "userdatatablename", "", log) allParametersOk = allParametersOk && ok if !allParametersOk { @@ -163,20 +102,38 @@ func getDynamoParams(cacheDriverConfig map[string]interface{}, log log.Logger) m } } -func getRedisURL(cacheDriverConfig map[string]interface{}, log log.Logger) string { - url, ok := toStringIfOk(cacheDriverConfig, "url", log) +func getRedisParams(cacheDriverConfig map[string]interface{}, log log.Logger) redisdb.DBDriverParameters { + url, ok := toStringIfOk(cacheDriverConfig, "url", "", log) + + if !ok { + log.Panic().Msg("redis parameters are not specified correctly, can't proceed") + } + + keyPrefix, ok := toStringIfOk(cacheDriverConfig, "keyPrefix", "zot", log) if !ok { log.Panic().Msg("redis parameters are not specified correctly, can't proceed") } - return url + return redisdb.DBDriverParameters{ + URL: url, + KeyPrefix: keyPrefix, + } } -func toStringIfOk(cacheDriverConfig map[string]interface{}, param string, log log.Logger) (string, bool) { +func toStringIfOk(cacheDriverConfig map[string]interface{}, + param string, + defaultVal string, + log log.Logger, +) (string, bool) { val, ok := cacheDriverConfig[param] - if !ok { + if !ok && defaultVal != "" { + log.Info().Str("field", param).Str("default", defaultVal). + Msg("field is not present in CacheDriver config, using default value") + + return defaultVal, true + } else if !ok { log.Error().Str("field", param).Msg("failed to parse CacheDriver config, field is not present") return "", false diff --git a/pkg/meta/meta_test.go b/pkg/meta/meta_test.go index 6362cfe68..5f31256ce 100644 --- a/pkg/meta/meta_test.go +++ b/pkg/meta/meta_test.go @@ -12,17 +12,16 @@ import ( "time" "github.com/alicebob/miniredis/v2" - "github.com/aws/aws-sdk-go-v2/service/dynamodb" guuid "github.com/gofrs/uuid" "github.com/notaryproject/notation-core-go/signature/jws" "github.com/notaryproject/notation-go" "github.com/notaryproject/notation-go/signer" godigest "github.com/opencontainers/go-digest" ispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/redis/go-redis/v9" . "github.com/smartystreets/goconvey/convey" zerr "zotregistry.dev/zot/errors" + "zotregistry.dev/zot/pkg/api/config" zcommon "zotregistry.dev/zot/pkg/common" "zotregistry.dev/zot/pkg/extensions/imagetrust" "zotregistry.dev/zot/pkg/extensions/search/convert" @@ -175,10 +174,15 @@ func TestRedisDB(t *testing.T) { rootDir := t.TempDir() log := log.NewLogger("debug", "") - redisDriver, err := redisdb.GetRedisClient("redis://" + miniRedis.Addr()) + params := redisdb.DBDriverParameters{ + KeyPrefix: "zot", + URL: "redis://" + miniRedis.Addr(), + } + + redisDriver, err := redisdb.GetRedisClient(params) So(err, ShouldBeNil) - metaDB, err := redisdb.New(redisDriver, log) + metaDB, err := redisdb.New(redisDriver, params, log) So(metaDB, ShouldNotBeNil) So(err, ShouldBeNil) @@ -2629,97 +2633,98 @@ func TestRelevanceSorting(t *testing.T) { }) } -func TestCreateDynamo(t *testing.T) { - tskip.SkipDynamo(t) - - Convey("Create", t, func() { - dynamoDBDriverParams := mdynamodb.DBDriverParameters{ - Endpoint: os.Getenv("DYNAMODBMOCK_ENDPOINT"), - RepoMetaTablename: "RepoMetadataTable", - RepoBlobsInfoTablename: "RepoBlobs", - ImageMetaTablename: "ImageMeta", - UserDataTablename: "UserDataTable", - APIKeyTablename: "ApiKeyTable", - VersionTablename: "Version", - Region: "us-east-2", - } +func TestCreateBoltDB(t *testing.T) { + Convey("New() succeeds", t, func() { + rootDir := t.TempDir() - client, err := mdynamodb.GetDynamoClient(dynamoDBDriverParams) - So(err, ShouldBeNil) + conf := config.New() + conf.Storage.RootDirectory = rootDir log := log.NewLogger("debug", "") + So(log, ShouldNotBeNil) - metaDB, err := meta.Create("dynamodb", client, dynamoDBDriverParams, log) - So(metaDB, ShouldNotBeNil) - So(err, ShouldBeNil) - }) - - Convey("Fails", t, func() { - log := log.NewLogger("debug", "") + Convey("Test New() with unspecified driver", func() { + conf.Storage.CacheDriver = map[string]interface{}{} + }) - _, err := meta.Create("dynamodb", nil, boltdb.DBParameters{RootDir: "root"}, log) - So(err, ShouldNotBeNil) + Convey("Test New() with bad driver", func() { + // we default to bolt in case of misconfiguration + conf.Storage.CacheDriver = map[string]interface{}{"name": "somedriver"} + }) - _, err = meta.Create("dynamodb", &dynamodb.Client{}, "bad", log) - So(err, ShouldNotBeNil) + Convey("Test New() with specified driver", func() { + conf.Storage.CacheDriver = map[string]interface{}{"name": "cache"} + }) - metaDB, err := meta.Create("random", nil, boltdb.DBParameters{RootDir: "root"}, log) - So(metaDB, ShouldBeNil) - So(err, ShouldNotBeNil) - }) -} + repoDBPath := path.Join(rootDir, "meta.db") + defer os.Remove(repoDBPath) -func TestCreateBoltDB(t *testing.T) { - Convey("Create", t, func() { - rootDir := t.TempDir() - params := boltdb.DBParameters{ - RootDir: rootDir, - } - boltDriver, err := boltdb.GetBoltDriver(params) + metaDB, err := meta.New(conf.Storage.StorageConfig, log) So(err, ShouldBeNil) - - log := log.NewLogger("debug", "") - - metaDB, err := meta.Create("boltdb", boltDriver, params, log) So(metaDB, ShouldNotBeNil) - So(err, ShouldBeNil) - }) - Convey("fails", t, func() { - log := log.NewLogger("debug", "") + err = os.Chmod(repoDBPath, 0o200) + So(err, ShouldBeNil) - _, err := meta.Create("boltdb", nil, mdynamodb.DBDriverParameters{}, log) + metaDB, err = meta.New(conf.Storage.StorageConfig, log) So(err, ShouldNotBeNil) + So(metaDB, ShouldBeNil) + + err = os.Chmod(repoDBPath, 0o600) + So(err, ShouldBeNil) }) } func TestCreateRedisDB(t *testing.T) { - Convey("Create", t, func() { - miniRedis := miniredis.RunT(t) + Convey("Test New()", t, func() { + conf := config.New() + conf.Storage.RemoteCache = true log := log.NewLogger("debug", "") So(log, ShouldNotBeNil) - redisDriver, err := redisdb.GetRedisClient("redis://" + miniRedis.Addr()) - So(err, ShouldBeNil) + Convey("Succeeds with default key prefix", func() { + miniRedis := miniredis.RunT(t) - metaDB, err := meta.Create("redis", redisDriver, nil, log) - So(metaDB, ShouldNotBeNil) - So(err, ShouldBeNil) - }) + cacheDriverParams := map[string]interface{}{ + "name": "redis", + "url": "redis://" + miniRedis.Addr(), + } - Convey("fails", t, func() { - log := log.NewLogger("debug", "") + conf.Storage.CacheDriver = cacheDriverParams - _, err := meta.Create("redis", nil, mdynamodb.DBDriverParameters{}, log) - So(err, ShouldNotBeNil) + metaDB, err := meta.New(conf.Storage.StorageConfig, log) + So(err, ShouldBeNil) + So(metaDB, ShouldNotBeNil) + }) - // Redis client will not be responding - redisURL := "redis://127.0.0.1:" + tCommon.GetFreePort() // must not match miniRedis.Addr() - connOpts, _ := redis.ParseURL(redisURL) - cacheDB := redis.NewClient(connOpts) + Convey("Succeeds with specific key prefix", func() { + miniRedis := miniredis.RunT(t) - _, err = meta.Create("redis", cacheDB, nil, log) - So(err, ShouldNotBeNil) + cacheDriverParams := map[string]interface{}{ + "name": "redis", + "url": "redis://" + miniRedis.Addr(), + "key": "keyPrefix", + } + + conf.Storage.CacheDriver = cacheDriverParams + + metaDB, err := meta.New(conf.Storage.StorageConfig, log) + So(err, ShouldBeNil) + So(metaDB, ShouldNotBeNil) + }) + + Convey("Fails on Ping()", func() { + // Redis client will not be responding + cacheDriverParams := map[string]interface{}{ + "name": "redis", + "url": "redis://127.0.0.1:" + tCommon.GetFreePort(), + } + + conf.Storage.CacheDriver = cacheDriverParams + + _, err := meta.New(conf.Storage.StorageConfig, log) + So(err, ShouldNotBeNil) + }) }) } diff --git a/pkg/meta/parse_test.go b/pkg/meta/parse_test.go index e1bd5ce29..fe7c44555 100644 --- a/pkg/meta/parse_test.go +++ b/pkg/meta/parse_test.go @@ -311,10 +311,15 @@ func TestParseStorageWithRedisDB(t *testing.T) { rootDir := t.TempDir() log := log.NewLogger("debug", "") - redisDriver, err := redisdb.GetRedisClient("redis://" + miniRedis.Addr()) + params := redisdb.DBDriverParameters{ + KeyPrefix: "zot", + URL: "redis://" + miniRedis.Addr(), + } + + redisDriver, err := redisdb.GetRedisClient(params) So(err, ShouldBeNil) - metaDB, err := redisdb.New(redisDriver, log) + metaDB, err := redisdb.New(redisDriver, params, log) So(metaDB, ShouldNotBeNil) So(err, ShouldBeNil) diff --git a/pkg/meta/redisdb/buckets.go b/pkg/meta/redisdb/buckets.go deleted file mode 100644 index 725996dda..000000000 --- a/pkg/meta/redisdb/buckets.go +++ /dev/null @@ -1,13 +0,0 @@ -package redisdb - -// MetadataDB. -const ( - ImageMetaBuck = "zot:ImageMeta" - RepoMetaBuck = "zot:RepoMeta" - RepoBlobsBuck = "zot:RepoBlobsMeta" - RepoLastUpdatedBuck = "zot:RepoLastUpdated" - UserDataBucket = "zot:UserData" - VersionBucket = "zot:Version" - UserAPIKeysBucket = "zot:UserAPIKeys" //nolint: gosec // these are not hardcoded credentials - LockBuck = "zot:Locks" -) diff --git a/pkg/meta/redisdb/parameters.go b/pkg/meta/redisdb/parameters.go new file mode 100644 index 000000000..c3eb0abc7 --- /dev/null +++ b/pkg/meta/redisdb/parameters.go @@ -0,0 +1,20 @@ +package redisdb + +import ( + "github.com/redis/go-redis/v9" +) + +type DBDriverParameters struct { + URL string + KeyPrefix string +} + +func GetRedisClient(params DBDriverParameters) (redis.UniversalClient, error) { + // go-redis supports connecting via the redis uri specification (more convenient than parameter parsing) + opts, err := redis.ParseURL(params.URL) + if err != nil { + return nil, err + } + + return redis.NewClient(opts), nil +} diff --git a/pkg/meta/redisdb/redis.go b/pkg/meta/redisdb/redis.go index d48a1ddfe..abc47a7e6 100644 --- a/pkg/meta/redisdb/redis.go +++ b/pkg/meta/redisdb/redis.go @@ -28,22 +28,49 @@ import ( reqCtx "zotregistry.dev/zot/pkg/requestcontext" ) +const ( + ImageMetaBucket = "ImageMeta" + RepoMetaBucket = "RepoMeta" + RepoBlobsBucket = "RepoBlobsMeta" + RepoLastUpdatedBucket = "RepoLastUpdated" + UserDataBucket = "UserData" + VersionBucket = "Version" + UserAPIKeysBucket = "UserAPIKeys" + LocksBucket = "Locks" +) + type RedisDB struct { - Client redis.UniversalClient - imgTrustStore mTypes.ImageTrustStore - Patches []func(client redis.UniversalClient) error - Version string - Log log.Logger - RS *redsync.Redsync + Client redis.UniversalClient + imgTrustStore mTypes.ImageTrustStore + Patches []func(client redis.UniversalClient) error + Version string + Log log.Logger + RS *redsync.Redsync + ImageMetaKey string + RepoMetaKey string + RepoBlobsKey string + RepoLastUpdatedKey string + UserDataKey string + VersionKey string + UserAPIKeysKey string + LocksKey string } -func New(client redis.UniversalClient, log log.Logger) (*RedisDB, error) { +func New(client redis.UniversalClient, params DBDriverParameters, log log.Logger) (*RedisDB, error) { redisWrapper := RedisDB{ - Client: client, - Log: log, - Patches: version.GetRedisDBPatches(), - Version: version.CurrentVersion, - imgTrustStore: nil, + Client: client, + Log: log, + Patches: version.GetRedisDBPatches(), + Version: version.CurrentVersion, + imgTrustStore: nil, + ImageMetaKey: join(params.KeyPrefix, ImageMetaBucket), + RepoMetaKey: join(params.KeyPrefix, RepoMetaBucket), + RepoBlobsKey: join(params.KeyPrefix, RepoBlobsBucket), + RepoLastUpdatedKey: join(params.KeyPrefix, RepoLastUpdatedBucket), + UserDataKey: join(params.KeyPrefix, UserDataBucket), + VersionKey: join(params.KeyPrefix, VersionBucket), + UserAPIKeysKey: join(params.KeyPrefix, UserAPIKeysBucket), + LocksKey: join(params.KeyPrefix, LocksBucket), } if err := client.Ping(context.Background()).Err(); err != nil { @@ -66,15 +93,6 @@ func New(client redis.UniversalClient, log log.Logger) (*RedisDB, error) { return &redisWrapper, nil } -func GetRedisClient(url string) (redis.UniversalClient, error) { - opts, err := redis.ParseURL(url) - if err != nil { - return nil, err - } - - return redis.NewClient(opts), nil -} - // GetStarredRepos returns starred repos and takes current user in consideration. func (rc *RedisDB) GetStarredRepos(ctx context.Context) ([]string, error) { userData, err := rc.GetUserData(ctx) @@ -110,7 +128,7 @@ func (rc *RedisDB) ToggleStarRepo(ctx context.Context, repo string) (mTypes.Togg var res mTypes.ToggleState - err = rc.withRSLocks(ctx, []string{getRepoLockKey(repo), getUserLockKey(userid)}, func() error { + err = rc.withRSLocks(ctx, []string{rc.getRepoLockKey(repo), rc.getUserLockKey(userid)}, func() error { userData, err := rc.GetUserData(ctx) if err != nil && !errors.Is(err, zerr.ErrUserDataNotFound) { res = mTypes.NotChanged @@ -159,15 +177,15 @@ func (rc *RedisDB) ToggleStarRepo(ctx context.Context, repo string) (mTypes.Togg } _, err = rc.Client.TxPipelined(ctx, func(txrp redis.Pipeliner) error { - if err = txrp.HSet(ctx, UserDataBucket, userid, userDataBlob).Err(); err != nil { - rc.Log.Error().Err(err).Str("hset", UserDataBucket).Str("userid", userid). + if err = txrp.HSet(ctx, rc.UserDataKey, userid, userDataBlob).Err(); err != nil { + rc.Log.Error().Err(err).Str("hset", rc.UserDataKey).Str("userid", userid). Msg("failed to set user data record") return fmt.Errorf("failed to set user data for identity %s: %w", userid, err) } - if err := txrp.HSet(ctx, RepoMetaBuck, repo, repoMetaBlob).Err(); err != nil { - rc.Log.Error().Err(err).Str("hset", RepoMetaBuck).Str("repo", repo). + if err := txrp.HSet(ctx, rc.RepoMetaKey, repo, repoMetaBlob).Err(); err != nil { + rc.Log.Error().Err(err).Str("hset", rc.RepoMetaKey).Str("repo", repo). Msg("failed to put repo meta record") return fmt.Errorf("failed to set repometa for repo %s: %w", repo, err) @@ -197,7 +215,7 @@ func (rc *RedisDB) ToggleBookmarkRepo(ctx context.Context, repo string) (mTypes. var res mTypes.ToggleState - err = rc.withRSLocks(ctx, []string{getUserLockKey(userid)}, func() error { + err = rc.withRSLocks(ctx, []string{rc.getUserLockKey(userid)}, func() error { userData, err := rc.GetUserData(ctx) if err != nil && !errors.Is(err, zerr.ErrUserDataNotFound) { res = mTypes.NotChanged @@ -224,9 +242,9 @@ func (rc *RedisDB) ToggleBookmarkRepo(ctx context.Context, repo string) (mTypes. return err } - err = rc.Client.HSet(ctx, UserDataBucket, userid, userDataBlob).Err() + err = rc.Client.HSet(ctx, rc.UserDataKey, userid, userDataBlob).Err() if err != nil { - rc.Log.Error().Err(err).Str("hset", UserDataBucket).Str("userid", userid). + rc.Log.Error().Err(err).Str("hset", rc.UserDataKey).Str("userid", userid). Msg("failed to set user data record") res = mTypes.NotChanged @@ -255,9 +273,9 @@ func (rc *RedisDB) GetUserData(ctx context.Context) (mTypes.UserData, error) { userid := userAc.GetUsername() - userDataBlob, err := rc.Client.HGet(ctx, UserDataBucket, userid).Bytes() + userDataBlob, err := rc.Client.HGet(ctx, rc.UserDataKey, userid).Bytes() if err != nil && !errors.Is(err, redis.Nil) { - rc.Log.Error().Err(err).Str("hget", UserDataBucket).Str("userid", userid). + rc.Log.Error().Err(err).Str("hget", rc.UserDataKey).Str("userid", userid). Msg("failed to get user data record") return mTypes.UserData{}, fmt.Errorf("failed to get user data record for identity %s: %w", userid, err) @@ -291,10 +309,10 @@ func (rc *RedisDB) SetUserData(ctx context.Context, userData mTypes.UserData) er return err } - err = rc.withRSLocks(ctx, []string{getUserLockKey(userid)}, func() error { - err = rc.Client.HSet(ctx, UserDataBucket, userid, userDataBlob).Err() + err = rc.withRSLocks(ctx, []string{rc.getUserLockKey(userid)}, func() error { + err = rc.Client.HSet(ctx, rc.UserDataKey, userid, userDataBlob).Err() if err != nil { - rc.Log.Error().Err(err).Str("hset", UserDataBucket).Str("userid", userid). + rc.Log.Error().Err(err).Str("hset", rc.UserDataKey).Str("userid", userid). Msg("failed to set user data record") return fmt.Errorf("failed to set user data for identity %s: %w", userid, err) @@ -318,7 +336,7 @@ func (rc *RedisDB) SetUserGroups(ctx context.Context, groups []string) error { userid := userAc.GetUsername() - err = rc.withRSLocks(ctx, []string{getUserLockKey(userid)}, func() error { + err = rc.withRSLocks(ctx, []string{rc.getUserLockKey(userid)}, func() error { userData, err := rc.GetUserData(ctx) if err != nil && !errors.Is(err, zerr.ErrUserDataNotFound) { return err @@ -331,9 +349,9 @@ func (rc *RedisDB) SetUserGroups(ctx context.Context, groups []string) error { return err } - err = rc.Client.HSet(ctx, UserDataBucket, userid, userDataBlob).Err() + err = rc.Client.HSet(ctx, rc.UserDataKey, userid, userDataBlob).Err() if err != nil { - rc.Log.Error().Err(err).Str("hset", UserDataBucket).Str("userid", userid). + rc.Log.Error().Err(err).Str("hset", rc.UserDataKey).Str("userid", userid). Msg("failed to set user data record") return fmt.Errorf("failed to set user data for identity %s: %w", userid, err) @@ -363,15 +381,15 @@ func (rc *RedisDB) DeleteUserData(ctx context.Context) error { userid := userAc.GetUsername() - err = rc.withRSLocks(ctx, []string{getUserLockKey(userid)}, func() error { + err = rc.withRSLocks(ctx, []string{rc.getUserLockKey(userid)}, func() error { _, err = rc.GetUserData(ctx) if err != nil && errors.Is(err, zerr.ErrUserDataNotFound) { return zerr.ErrBucketDoesNotExist } - err = rc.Client.HDel(ctx, UserDataBucket, userid).Err() + err = rc.Client.HDel(ctx, rc.UserDataKey, userid).Err() if err != nil { - rc.Log.Error().Err(err).Str("hdel", UserDataBucket).Str("userid", userid). + rc.Log.Error().Err(err).Str("hdel", rc.UserDataKey).Str("userid", userid). Msg("failed to delete user data record") return fmt.Errorf("failed to delete user data for identity %s: %w", userid, err) @@ -386,9 +404,9 @@ func (rc *RedisDB) DeleteUserData(ctx context.Context) error { func (rc *RedisDB) GetUserAPIKeyInfo(hashedKey string) (string, error) { ctx := context.Background() - userid, err := rc.Client.HGet(ctx, UserAPIKeysBucket, hashedKey).Result() + userid, err := rc.Client.HGet(ctx, rc.UserAPIKeysKey, hashedKey).Result() if err != nil && !errors.Is(err, redis.Nil) { - rc.Log.Error().Err(err).Str("hget", UserAPIKeysBucket).Str("userid", userid). + rc.Log.Error().Err(err).Str("hget", rc.UserAPIKeysKey).Str("userid", userid). Msg("failed to get api key record") return userid, fmt.Errorf("failed to get api key record for identity %s: %w", userid, err) @@ -416,7 +434,7 @@ func (rc *RedisDB) GetUserAPIKeys(ctx context.Context) ([]mTypes.APIKeyDetails, userid := userAc.GetUsername() // Lock used because getting API keys also updates their expired flag in the DB - err = rc.withRSLocks(ctx, []string{getUserLockKey(userid)}, func() error { + err = rc.withRSLocks(ctx, []string{rc.getUserLockKey(userid)}, func() error { userData, err := rc.GetUserData(ctx) if err != nil && !errors.Is(err, zerr.ErrUserDataNotFound) { return err @@ -447,9 +465,9 @@ func (rc *RedisDB) GetUserAPIKeys(ctx context.Context) ([]mTypes.APIKeyDetails, return err } - err = rc.Client.HSet(ctx, UserDataBucket, userid, userDataBlob).Err() + err = rc.Client.HSet(ctx, rc.UserDataKey, userid, userDataBlob).Err() if err != nil { - rc.Log.Error().Err(err).Str("hset", UserDataBucket).Str("userid", userid). + rc.Log.Error().Err(err).Str("hset", rc.UserDataKey).Str("userid", userid). Msg("failed to set user data record") return fmt.Errorf("failed to set user data for identity %s: %w", userid, err) @@ -473,7 +491,7 @@ func (rc *RedisDB) AddUserAPIKey(ctx context.Context, hashedKey string, apiKeyDe userid := userAc.GetUsername() - err = rc.withRSLocks(ctx, []string{getUserLockKey(userid)}, func() error { + err = rc.withRSLocks(ctx, []string{rc.getUserLockKey(userid)}, func() error { userData, err := rc.GetUserData(ctx) if err != nil && !errors.Is(err, zerr.ErrUserDataNotFound) { return err @@ -491,15 +509,15 @@ func (rc *RedisDB) AddUserAPIKey(ctx context.Context, hashedKey string, apiKeyDe } _, err = rc.Client.TxPipelined(ctx, func(txrp redis.Pipeliner) error { - if err := txrp.HSet(ctx, UserDataBucket, userid, userDataBlob).Err(); err != nil { - rc.Log.Error().Err(err).Str("hset", UserDataBucket).Str("userid", userid). + if err := txrp.HSet(ctx, rc.UserDataKey, userid, userDataBlob).Err(); err != nil { + rc.Log.Error().Err(err).Str("hset", rc.UserDataKey).Str("userid", userid). Msg("failed to set user data record") return fmt.Errorf("failed to set user data for identity %s: %w", userid, err) } - if err := txrp.HSet(ctx, UserAPIKeysBucket, hashedKey, userid).Err(); err != nil { - rc.Log.Error().Err(err).Str("hset", UserAPIKeysBucket).Str("userid", userid). + if err := txrp.HSet(ctx, rc.UserAPIKeysKey, hashedKey, userid).Err(); err != nil { + rc.Log.Error().Err(err).Str("hset", rc.UserAPIKeysKey).Str("userid", userid). Msg("failed to set api key record") return fmt.Errorf("failed to set api key for identity %s: %w", userid, err) @@ -529,7 +547,7 @@ func (rc *RedisDB) IsAPIKeyExpired(ctx context.Context, hashedKey string) (bool, var isExpired bool // Lock used because getting API keys also updates their expired flag in the DB - err = rc.withRSLocks(ctx, []string{getUserLockKey(userid)}, func() error { + err = rc.withRSLocks(ctx, []string{rc.getUserLockKey(userid)}, func() error { userData, err := rc.GetUserData(ctx) if err != nil && !errors.Is(err, zerr.ErrUserDataNotFound) { return err @@ -555,9 +573,9 @@ func (rc *RedisDB) IsAPIKeyExpired(ctx context.Context, hashedKey string) (bool, return err } - err = rc.Client.HSet(ctx, UserDataBucket, userid, userDataBlob).Err() + err = rc.Client.HSet(ctx, rc.UserDataKey, userid, userDataBlob).Err() if err != nil { - rc.Log.Error().Err(err).Str("hset", UserDataBucket).Str("userid", userid). + rc.Log.Error().Err(err).Str("hset", rc.UserDataKey).Str("userid", userid). Msg("failed to set user data record") return fmt.Errorf("failed to set user data for identity %s: %w", userid, err) @@ -581,7 +599,7 @@ func (rc *RedisDB) UpdateUserAPIKeyLastUsed(ctx context.Context, hashedKey strin userid := userAc.GetUsername() - err = rc.withRSLocks(ctx, []string{getUserLockKey(userid)}, func() error { + err = rc.withRSLocks(ctx, []string{rc.getUserLockKey(userid)}, func() error { userData, err := rc.GetUserData(ctx) if err != nil && !errors.Is(err, zerr.ErrUserDataNotFound) { return err @@ -597,9 +615,9 @@ func (rc *RedisDB) UpdateUserAPIKeyLastUsed(ctx context.Context, hashedKey strin return err } - err = rc.Client.HSet(ctx, UserDataBucket, userid, userDataBlob).Err() + err = rc.Client.HSet(ctx, rc.UserDataKey, userid, userDataBlob).Err() if err != nil { - rc.Log.Error().Err(err).Str("hset", UserDataBucket).Str("userid", userid). + rc.Log.Error().Err(err).Str("hset", rc.UserDataKey).Str("userid", userid). Msg("failed to set user data record") return fmt.Errorf("failed to set user data for identity %s: %w", userid, err) @@ -623,7 +641,7 @@ func (rc *RedisDB) DeleteUserAPIKey(ctx context.Context, keyID string) error { userid := userAc.GetUsername() - err = rc.withRSLocks(ctx, []string{getUserLockKey(userid)}, func() error { + err = rc.withRSLocks(ctx, []string{rc.getUserLockKey(userid)}, func() error { userData, err := rc.GetUserData(ctx) if err != nil { return err @@ -642,15 +660,15 @@ func (rc *RedisDB) DeleteUserAPIKey(ctx context.Context, keyID string) error { } _, err = rc.Client.TxPipelined(ctx, func(txrp redis.Pipeliner) error { - if err = txrp.HSet(ctx, UserDataBucket, userid, userDataBlob).Err(); err != nil { - rc.Log.Error().Err(err).Str("hset", UserDataBucket).Str("userid", userid). + if err = txrp.HSet(ctx, rc.UserDataKey, userid, userDataBlob).Err(); err != nil { + rc.Log.Error().Err(err).Str("hset", rc.UserDataKey).Str("userid", userid). Msg("failed to set user data record") return fmt.Errorf("failed to set user data for identity %s: %w", userid, err) } - if err = txrp.HDel(ctx, UserAPIKeysBucket, hash).Err(); err != nil { - rc.Log.Error().Err(err).Str("hdel", UserAPIKeysBucket).Str("userid", userid). + if err = txrp.HDel(ctx, rc.UserAPIKeysKey, hash).Err(); err != nil { + rc.Log.Error().Err(err).Str("hdel", rc.UserAPIKeysKey).Str("userid", userid). Msg("failed to delete api key record") return fmt.Errorf("failed to delete api key record for identity %s: %w", userid, err) @@ -687,10 +705,10 @@ func (rc *RedisDB) SetImageMeta(digest godigest.Digest, imageMeta mTypes.ImageMe return fmt.Errorf("failed to calculate blob for manifest with digest %s %w", digest, err) } - err = rc.withRSLocks(ctx, []string{getImageLockKey(digest.String())}, func() error { - err = rc.Client.HSet(ctx, ImageMetaBuck, digest.String(), pImageMetaBlob).Err() + err = rc.withRSLocks(ctx, []string{rc.getImageLockKey(digest.String())}, func() error { + err = rc.Client.HSet(ctx, rc.ImageMetaKey, digest.String(), pImageMetaBlob).Err() if err != nil { - rc.Log.Error().Err(err).Str("hset", ImageMetaBuck).Str("digest", digest.String()). + rc.Log.Error().Err(err).Str("hset", rc.ImageMetaKey).Str("digest", digest.String()). Msg("failed to set image meta record") return fmt.Errorf("failed to set image meta record for digest %s: %w", digest.String(), err) @@ -725,10 +743,11 @@ func (rc *RedisDB) SetRepoReference(ctx context.Context, repo string, return err } - err = rc.withRSLocks(ctx, []string{getImageLockKey(imageMeta.Digest.String()), getRepoLockKey(repo)}, func() error { - err := rc.Client.HSet(ctx, ImageMetaBuck, imageMeta.Digest.String(), imageMetaBlob).Err() + locks := []string{rc.getImageLockKey(imageMeta.Digest.String()), rc.getRepoLockKey(repo)} + err = rc.withRSLocks(ctx, locks, func() error { + err := rc.Client.HSet(ctx, rc.ImageMetaKey, imageMeta.Digest.String(), imageMetaBlob).Err() if err != nil { - rc.Log.Error().Err(err).Str("hset", ImageMetaBuck).Str("digest", imageMeta.Digest.String()). + rc.Log.Error().Err(err).Str("hset", rc.ImageMetaKey).Str("digest", imageMeta.Digest.String()). Msg("failed to set image meta record") return fmt.Errorf("failed to set image meta record for digest %s: %w", imageMeta.Digest.String(), err) @@ -803,9 +822,9 @@ func (rc *RedisDB) SetRepoReference(ctx context.Context, repo string, } // 4. Blobs - repoBlobsBytes, err := rc.Client.HGet(ctx, RepoBlobsBuck, repo).Bytes() + repoBlobsBytes, err := rc.Client.HGet(ctx, rc.RepoBlobsKey, repo).Bytes() if err != nil && !errors.Is(err, redis.Nil) { - rc.Log.Error().Err(err).Str("hget", RepoBlobsBuck).Str("repo", repo). + rc.Log.Error().Err(err).Str("hget", rc.RepoBlobsKey).Str("repo", repo). Msg("failed to get repo blobs record") return fmt.Errorf("failed to get repo blobs record for repo %s: %w", repo, err) @@ -835,22 +854,22 @@ func (rc *RedisDB) SetRepoReference(ctx context.Context, repo string, } _, err = rc.Client.TxPipelined(ctx, func(txrp redis.Pipeliner) error { - if err := txrp.HSet(ctx, RepoLastUpdatedBuck, repo, protoTimeBlob).Err(); err != nil { - rc.Log.Error().Err(err).Str("hset", RepoLastUpdatedBuck).Str("repo", repo). + if err := txrp.HSet(ctx, rc.RepoLastUpdatedKey, repo, protoTimeBlob).Err(); err != nil { + rc.Log.Error().Err(err).Str("hset", rc.RepoLastUpdatedKey).Str("repo", repo). Msg("failed to put repo last updated timestamp") return fmt.Errorf("failed to put repo last updated record for repo %s: %w", repo, err) } - if err := txrp.HSet(ctx, RepoBlobsBuck, repo, repoBlobsBytes).Err(); err != nil { - rc.Log.Error().Err(err).Str("hset", RepoBlobsBuck).Str("repo", repo). + if err := txrp.HSet(ctx, rc.RepoBlobsKey, repo, repoBlobsBytes).Err(); err != nil { + rc.Log.Error().Err(err).Str("hset", rc.RepoBlobsKey).Str("repo", repo). Msg("failed to put repo blobs record") return fmt.Errorf("failed to set repo blobs record for repo %s: %w", repo, err) } - if err := txrp.HSet(ctx, RepoMetaBuck, repo, repoMetaBlob).Err(); err != nil { - rc.Log.Error().Err(err).Str("hset", RepoMetaBuck).Str("repo", repo). + if err := txrp.HSet(ctx, rc.RepoMetaKey, repo, repoMetaBlob).Err(); err != nil { + rc.Log.Error().Err(err).Str("hset", rc.RepoMetaKey).Str("repo", repo). Msg("failed to put repo meta record") return fmt.Errorf("failed to put repometa record for repo %s: %w", repo, err) @@ -869,9 +888,9 @@ func (rc *RedisDB) SetRepoReference(ctx context.Context, repo string, func (rc *RedisDB) SearchRepos(ctx context.Context, searchText string) ([]mTypes.RepoMeta, error) { foundRepos := []mTypes.RepoMeta{} - repoMetaEntries, err := rc.Client.HGetAll(ctx, RepoMetaBuck).Result() + repoMetaEntries, err := rc.Client.HGetAll(ctx, rc.RepoMetaKey).Result() if err != nil { - rc.Log.Error().Err(err).Str("hgetall", RepoMetaBuck).Msg("failed to get all repo meta records") + rc.Log.Error().Err(err).Str("hgetall", rc.RepoMetaKey).Msg("failed to get all repo meta records") return foundRepos, fmt.Errorf("failed to get all repo meta records: %w", err) } @@ -920,9 +939,9 @@ func (rc *RedisDB) SearchTags(ctx context.Context, searchText string) ([]mTypes. return images, fmt.Errorf("failed to parse search text, invalid format %w", err) } - repoMetaEntries, err := rc.Client.HGetAll(ctx, RepoMetaBuck).Result() + repoMetaEntries, err := rc.Client.HGetAll(ctx, rc.RepoMetaKey).Result() if err != nil { - rc.Log.Error().Err(err).Str("hgetall", RepoMetaBuck).Msg("failed to get all repo meta records") + rc.Log.Error().Err(err).Str("hgetall", rc.RepoMetaKey).Msg("failed to get all repo meta records") return images, fmt.Errorf("failed to get all repo meta records: %w", err) } @@ -1002,9 +1021,9 @@ func (rc *RedisDB) FilterTags(ctx context.Context, filterRepoTag mTypes.FilterRe ) ([]mTypes.FullImageMeta, error) { images := []mTypes.FullImageMeta{} - repoMetaEntries, err := rc.Client.HGetAll(ctx, RepoMetaBuck).Result() + repoMetaEntries, err := rc.Client.HGetAll(ctx, rc.RepoMetaKey).Result() if err != nil { - rc.Log.Error().Err(err).Str("hgetall", RepoMetaBuck).Msg("failed to get all repo meta records") + rc.Log.Error().Err(err).Str("hgetall", rc.RepoMetaKey).Msg("failed to get all repo meta records") return images, fmt.Errorf("failed to get all repo meta records: %w", err) } @@ -1102,9 +1121,9 @@ func (rc *RedisDB) FilterRepos(ctx context.Context, acceptName mTypes.FilterRepo ) ([]mTypes.RepoMeta, error) { foundRepos := []mTypes.RepoMeta{} - repoMetaEntries, err := rc.Client.HGetAll(ctx, RepoMetaBuck).Result() + repoMetaEntries, err := rc.Client.HGetAll(ctx, rc.RepoMetaKey).Result() if err != nil { - rc.Log.Error().Err(err).Str("hgetall", RepoMetaBuck).Msg("failed to get all repo meta records") + rc.Log.Error().Err(err).Str("hgetall", rc.RepoMetaKey).Msg("failed to get all repo meta records") return foundRepos, fmt.Errorf("failed to get all repo meta records: %w", err) } @@ -1223,9 +1242,9 @@ func (rc *RedisDB) GetMultipleRepoMeta(ctx context.Context, filter func(repoMeta ) { foundRepos := []mTypes.RepoMeta{} - repoMetaEntries, err := rc.Client.HGetAll(ctx, RepoMetaBuck).Result() + repoMetaEntries, err := rc.Client.HGetAll(ctx, rc.RepoMetaKey).Result() if err != nil { - rc.Log.Error().Err(err).Str("hgetall", RepoMetaBuck).Msg("failed to get all repo meta records") + rc.Log.Error().Err(err).Str("hgetall", rc.RepoMetaKey).Msg("failed to get all repo meta records") return foundRepos, fmt.Errorf("failed to get all repometa records: %w", err) } @@ -1259,7 +1278,7 @@ func (rc *RedisDB) AddManifestSignature(repo string, signedManifestDigest godige ) error { ctx := context.Background() - err := rc.withRSLocks(ctx, []string{getRepoLockKey(repo)}, func() error { + err := rc.withRSLocks(ctx, []string{rc.getRepoLockKey(repo)}, func() error { protoRepoMeta, err := rc.getProtoRepoMeta(ctx, repo) if err != nil && !errors.Is(err, zerr.ErrRepoMetaNotFound) { return err @@ -1294,8 +1313,8 @@ func (rc *RedisDB) AddManifestSignature(repo string, signedManifestDigest godige return err } - if err := rc.Client.HSet(ctx, RepoMetaBuck, repo, repoMetaBlob).Err(); err != nil { - rc.Log.Error().Err(err).Str("hset", RepoMetaBuck).Str("repo", repo). + if err := rc.Client.HSet(ctx, rc.RepoMetaKey, repo, repoMetaBlob).Err(); err != nil { + rc.Log.Error().Err(err).Str("hset", rc.RepoMetaKey).Str("repo", repo). Msg("failed to put repo meta record") return fmt.Errorf("failed to put repometa record for repo %s: %w", repo, err) @@ -1361,9 +1380,9 @@ func (rc *RedisDB) AddManifestSignature(repo string, signedManifestDigest godige return err } - err = rc.Client.HSet(ctx, RepoMetaBuck, repo, repoMetaBlob).Err() + err = rc.Client.HSet(ctx, rc.RepoMetaKey, repo, repoMetaBlob).Err() if err != nil { - rc.Log.Error().Err(err).Str("hset", RepoMetaBuck).Str("repo", repo). + rc.Log.Error().Err(err).Str("hset", rc.RepoMetaKey).Str("repo", repo). Msg("failed to put repo meta record") return fmt.Errorf("failed to put repometa record for repo %s: %w", repo, err) @@ -1381,7 +1400,7 @@ func (rc *RedisDB) DeleteSignature(repo string, signedManifestDigest godigest.Di ) error { ctx := context.Background() - err := rc.withRSLocks(ctx, []string{getRepoLockKey(repo)}, func() error { + err := rc.withRSLocks(ctx, []string{rc.getRepoLockKey(repo)}, func() error { protoRepoMeta, err := rc.getProtoRepoMeta(ctx, repo) if err != nil { return err @@ -1410,9 +1429,9 @@ func (rc *RedisDB) DeleteSignature(repo string, signedManifestDigest godigest.Di return err } - err = rc.Client.HSet(ctx, RepoMetaBuck, repo, repoMetaBlob).Err() + err = rc.Client.HSet(ctx, rc.RepoMetaKey, repo, repoMetaBlob).Err() if err != nil { - rc.Log.Error().Err(err).Str("hset", RepoMetaBuck).Str("repo", repo). + rc.Log.Error().Err(err).Str("hset", rc.RepoMetaKey).Str("repo", repo). Msg("failed to put repo meta record") return fmt.Errorf("failed to put repometa record for repo %s: %w", repo, err) @@ -1432,7 +1451,7 @@ func (rc *RedisDB) UpdateSignaturesValidity(ctx context.Context, repo string, ma return nil } - err := rc.withRSLocks(ctx, []string{getRepoLockKey(repo)}, func() error { + err := rc.withRSLocks(ctx, []string{rc.getRepoLockKey(repo)}, func() error { // get ManifestData of signed manifest protoImageMeta, err := rc.getProtoImageMeta(ctx, manifestDigest.String()) if err != nil { @@ -1494,9 +1513,9 @@ func (rc *RedisDB) UpdateSignaturesValidity(ctx context.Context, repo string, ma return err } - err = rc.Client.HSet(ctx, RepoMetaBuck, repo, repoMetaBlob).Err() + err = rc.Client.HSet(ctx, rc.RepoMetaKey, repo, repoMetaBlob).Err() if err != nil { - rc.Log.Error().Err(err).Str("hset", RepoMetaBuck).Str("repo", repo). + rc.Log.Error().Err(err).Str("hset", rc.RepoMetaKey).Str("repo", repo). Msg("failed to put repo meta record") return fmt.Errorf("failed to put repometa record for repo %s: %w", repo, err) @@ -1512,7 +1531,7 @@ func (rc *RedisDB) UpdateSignaturesValidity(ctx context.Context, repo string, ma func (rc *RedisDB) IncrementRepoStars(repo string) error { ctx := context.Background() - err := rc.withRSLocks(ctx, []string{getRepoLockKey(repo)}, func() error { + err := rc.withRSLocks(ctx, []string{rc.getRepoLockKey(repo)}, func() error { protoRepoMeta, err := rc.getProtoRepoMeta(ctx, repo) if err != nil { return err @@ -1525,9 +1544,9 @@ func (rc *RedisDB) IncrementRepoStars(repo string) error { return err } - err = rc.Client.HSet(ctx, RepoMetaBuck, repo, repoMetaBlob).Err() + err = rc.Client.HSet(ctx, rc.RepoMetaKey, repo, repoMetaBlob).Err() if err != nil { - rc.Log.Error().Err(err).Str("hset", RepoMetaBuck).Str("repo", repo). + rc.Log.Error().Err(err).Str("hset", rc.RepoMetaKey).Str("repo", repo). Msg("failed to put repo meta record") return fmt.Errorf("failed to put repometa record for repo %s: %w", repo, err) @@ -1543,7 +1562,7 @@ func (rc *RedisDB) IncrementRepoStars(repo string) error { func (rc *RedisDB) DecrementRepoStars(repo string) error { ctx := context.Background() - err := rc.withRSLocks(ctx, []string{getRepoLockKey(repo)}, func() error { + err := rc.withRSLocks(ctx, []string{rc.getRepoLockKey(repo)}, func() error { protoRepoMeta, err := rc.getProtoRepoMeta(ctx, repo) if err != nil { return err @@ -1560,9 +1579,9 @@ func (rc *RedisDB) DecrementRepoStars(repo string) error { return err } - err = rc.Client.HSet(ctx, RepoMetaBuck, repo, repoMetaBlob).Err() + err = rc.Client.HSet(ctx, rc.RepoMetaKey, repo, repoMetaBlob).Err() if err != nil { - rc.Log.Error().Err(err).Str("hset", RepoMetaBuck).Str("repo", repo). + rc.Log.Error().Err(err).Str("hset", rc.RepoMetaKey).Str("repo", repo). Msg("failed to put repo meta record") return fmt.Errorf("failed to put repometa record for repo %s: %w", repo, err) @@ -1594,17 +1613,17 @@ func (rc *RedisDB) SetRepoMeta(repo string, repoMeta mTypes.RepoMeta) error { ctx := context.Background() - err = rc.withRSLocks(ctx, []string{getRepoLockKey(repo)}, func() error { + err = rc.withRSLocks(ctx, []string{rc.getRepoLockKey(repo)}, func() error { _, err := rc.Client.TxPipelined(ctx, func(txrp redis.Pipeliner) error { - if err := txrp.HSet(ctx, RepoMetaBuck, repo, repoMetaBlob).Err(); err != nil { - rc.Log.Error().Err(err).Str("hset", RepoMetaBuck).Str("repo", repo). + if err := txrp.HSet(ctx, rc.RepoMetaKey, repo, repoMetaBlob).Err(); err != nil { + rc.Log.Error().Err(err).Str("hset", rc.RepoMetaKey).Str("repo", repo). Msg("failed to put repo meta record") return fmt.Errorf("failed to put repometa record for repo %s: %w", repo, err) } - if err := txrp.HSet(ctx, RepoLastUpdatedBuck, repo, protoTimeBlob).Err(); err != nil { - rc.Log.Error().Err(err).Str("hset", RepoLastUpdatedBuck).Str("repo", repo). + if err := txrp.HSet(ctx, rc.RepoLastUpdatedKey, repo, protoTimeBlob).Err(); err != nil { + rc.Log.Error().Err(err).Str("hset", rc.RepoLastUpdatedKey).Str("repo", repo). Msg("failed to put repo last updated timestamp") return fmt.Errorf("failed to put repo last updated record for repo %s: %w", repo, err) @@ -1622,24 +1641,24 @@ func (rc *RedisDB) SetRepoMeta(repo string, repoMeta mTypes.RepoMeta) error { func (rc *RedisDB) DeleteRepoMeta(repo string) error { ctx := context.Background() - err := rc.withRSLocks(ctx, []string{getRepoLockKey(repo)}, func() error { + err := rc.withRSLocks(ctx, []string{rc.getRepoLockKey(repo)}, func() error { _, err := rc.Client.TxPipelined(ctx, func(txrp redis.Pipeliner) error { - if err := txrp.HDel(ctx, RepoMetaBuck, repo).Err(); err != nil { - rc.Log.Error().Err(err).Str("hdel", RepoMetaBuck).Str("repo", repo). + if err := txrp.HDel(ctx, rc.RepoMetaKey, repo).Err(); err != nil { + rc.Log.Error().Err(err).Str("hdel", rc.RepoMetaKey).Str("repo", repo). Msg("failed to delete repo meta record") return fmt.Errorf("failed to delete repometa record for repo %s: %w", repo, err) } - if err := txrp.HDel(ctx, RepoBlobsBuck, repo).Err(); err != nil { - rc.Log.Error().Err(err).Str("hdel", RepoBlobsBuck).Str("repo", repo). + if err := txrp.HDel(ctx, rc.RepoBlobsKey, repo).Err(); err != nil { + rc.Log.Error().Err(err).Str("hdel", rc.RepoBlobsKey).Str("repo", repo). Msg("failed to put repo blobs record") return fmt.Errorf("failed to delete repo blobs record for repo %s: %w", repo, err) } - if err := txrp.HDel(ctx, RepoLastUpdatedBuck, repo).Err(); err != nil { - rc.Log.Error().Err(err).Str("hdel", RepoLastUpdatedBuck).Str("repo", repo). + if err := txrp.HDel(ctx, rc.RepoLastUpdatedKey, repo).Err(); err != nil { + rc.Log.Error().Err(err).Str("hdel", rc.RepoLastUpdatedKey).Str("repo", repo). Msg("failed to put repo last updated timestamp") return fmt.Errorf("failed to delete repo last updated record for repo %s: %w", repo, err) @@ -1690,7 +1709,7 @@ func (rc *RedisDB) GetReferrersInfo(repo string, referredDigest godigest.Digest, func (rc *RedisDB) UpdateStatsOnDownload(repo string, reference string) error { ctx := context.Background() - err := rc.withRSLocks(ctx, []string{getRepoLockKey(repo)}, func() error { + err := rc.withRSLocks(ctx, []string{rc.getRepoLockKey(repo)}, func() error { protoRepoMeta, err := rc.getProtoRepoMeta(ctx, repo) if err != nil { return err @@ -1722,9 +1741,9 @@ func (rc *RedisDB) UpdateStatsOnDownload(repo string, reference string) error { return err } - err = rc.Client.HSet(ctx, RepoMetaBuck, repo, repoMetaBlob).Err() + err = rc.Client.HSet(ctx, rc.RepoMetaKey, repo, repoMetaBlob).Err() if err != nil { - rc.Log.Error().Err(err).Str("hset", RepoMetaBuck).Str("repo", repo). + rc.Log.Error().Err(err).Str("hset", rc.RepoMetaKey).Str("repo", repo). Msg("failed to put repo meta record") return fmt.Errorf("failed to put repometa record for repo %s: %w", repo, err) @@ -1774,7 +1793,8 @@ if there are no tags pointing to the digest, otherwise it's noop. func (rc *RedisDB) RemoveRepoReference(repo, reference string, manifestDigest godigest.Digest) error { ctx := context.Background() - err := rc.withRSLocks(ctx, []string{getImageLockKey(manifestDigest.String()), getRepoLockKey(repo)}, func() error { + locks := []string{rc.getImageLockKey(manifestDigest.String()), rc.getRepoLockKey(repo)} + err := rc.withRSLocks(ctx, locks, func() error { protoRepoMeta, err := rc.getProtoRepoMeta(ctx, repo) if err != nil { if errors.Is(err, zerr.ErrRepoMetaNotFound) { @@ -1848,9 +1868,9 @@ func (rc *RedisDB) RemoveRepoReference(repo, reference string, manifestDigest go delete(protoRepoMeta.Referrers, manifestDigest.String()) } - repoBlobsBytes, err := rc.Client.HGet(ctx, RepoBlobsBuck, repo).Bytes() + repoBlobsBytes, err := rc.Client.HGet(ctx, rc.RepoBlobsKey, repo).Bytes() if err != nil && !errors.Is(err, redis.Nil) { - rc.Log.Error().Err(err).Str("hget", RepoBlobsBuck).Str("repo", repo). + rc.Log.Error().Err(err).Str("hget", rc.RepoBlobsKey).Str("repo", repo). Msg("failed to get repo blobs record") return fmt.Errorf("failed to get repo blobs record for repo %s: %w", repo, err) @@ -1880,22 +1900,22 @@ func (rc *RedisDB) RemoveRepoReference(repo, reference string, manifestDigest go } _, err = rc.Client.TxPipelined(ctx, func(txrp redis.Pipeliner) error { - if err := txrp.HSet(ctx, RepoLastUpdatedBuck, repo, protoTimeBlob).Err(); err != nil { - rc.Log.Error().Err(err).Str("hset", RepoLastUpdatedBuck).Str("repo", repo). + if err := txrp.HSet(ctx, rc.RepoLastUpdatedKey, repo, protoTimeBlob).Err(); err != nil { + rc.Log.Error().Err(err).Str("hset", rc.RepoLastUpdatedKey).Str("repo", repo). Msg("failed to put repo last updated timestamp") return fmt.Errorf("failed to put repo last updated record for repo %s: %w", repo, err) } - if err := txrp.HSet(ctx, RepoBlobsBuck, repo, repoBlobsBytes).Err(); err != nil { - rc.Log.Error().Err(err).Str("hset", RepoBlobsBuck).Str("repo", repo). + if err := txrp.HSet(ctx, rc.RepoBlobsKey, repo, repoBlobsBytes).Err(); err != nil { + rc.Log.Error().Err(err).Str("hset", rc.RepoBlobsKey).Str("repo", repo). Msg("failed to put repo blobs record") return fmt.Errorf("failed to set repo blobs record for repo %s: %w", repo, err) } - if err := txrp.HSet(ctx, RepoMetaBuck, repo, repoMetaBlob).Err(); err != nil { - rc.Log.Error().Err(err).Str("hset", RepoMetaBuck).Str("repo", repo). + if err := txrp.HSet(ctx, rc.RepoMetaKey, repo, repoMetaBlob).Err(); err != nil { + rc.Log.Error().Err(err).Str("hset", rc.RepoMetaKey).Str("repo", repo). Msg("failed to put repo meta record") return fmt.Errorf("failed to put repometa record for repo %s: %w", repo, err) @@ -1915,7 +1935,7 @@ func (rc *RedisDB) RemoveRepoReference(repo, reference string, manifestDigest go func (rc *RedisDB) ResetRepoReferences(repo string) error { ctx := context.Background() - err := rc.withRSLocks(ctx, []string{getRepoLockKey(repo)}, func() error { + err := rc.withRSLocks(ctx, []string{rc.getRepoLockKey(repo)}, func() error { protoRepoMeta, err := rc.getProtoRepoMeta(ctx, repo) if err != nil && !errors.Is(err, zerr.ErrRepoMetaNotFound) { return err @@ -1933,8 +1953,8 @@ func (rc *RedisDB) ResetRepoReferences(repo string) error { return err } - if err := rc.Client.HSet(ctx, RepoMetaBuck, repo, repoMetaBlob).Err(); err != nil { - rc.Log.Error().Err(err).Str("hset", RepoMetaBuck).Str("repo", repo). + if err := rc.Client.HSet(ctx, rc.RepoMetaKey, repo, repoMetaBlob).Err(); err != nil { + rc.Log.Error().Err(err).Str("hset", rc.RepoMetaKey).Str("repo", repo). Msg("failed to put repo meta record") return fmt.Errorf("failed to put repometa record for repo %s: %w", repo, err) @@ -1949,9 +1969,9 @@ func (rc *RedisDB) ResetRepoReferences(repo string) error { func (rc *RedisDB) GetRepoLastUpdated(repo string) time.Time { ctx := context.Background() - lastUpdatedBlob, err := rc.Client.HGet(ctx, RepoLastUpdatedBuck, repo).Bytes() + lastUpdatedBlob, err := rc.Client.HGet(ctx, rc.RepoLastUpdatedKey, repo).Bytes() if err != nil { - rc.Log.Error().Err(err).Str("hget", RepoLastUpdatedBuck).Str("repo", repo). + rc.Log.Error().Err(err).Str("hget", rc.RepoLastUpdatedKey).Str("repo", repo). Msg("failed to get repo last updated timestamp") return time.Time{} @@ -1977,9 +1997,9 @@ func (rc *RedisDB) GetAllRepoNames() ([]string, error) { foundRepos := []string{} ctx := context.Background() - repoMetaEntries, err := rc.Client.HGetAll(ctx, RepoMetaBuck).Result() + repoMetaEntries, err := rc.Client.HGetAll(ctx, rc.RepoMetaKey).Result() if err != nil { - rc.Log.Error().Err(err).Str("hgetall", RepoMetaBuck).Msg("failed to get all repo meta records") + rc.Log.Error().Err(err).Str("hgetall", rc.RepoMetaKey).Msg("failed to get all repo meta records") return foundRepos, fmt.Errorf("failed to get all repometa records %w", err) } @@ -1998,44 +2018,44 @@ func (rc *RedisDB) ResetDB() error { ctx := context.Background() _, err := rc.Client.TxPipelined(ctx, func(txrp redis.Pipeliner) error { - if err := txrp.Del(ctx, RepoMetaBuck).Err(); err != nil { - rc.Log.Error().Err(err).Str("del", RepoMetaBuck).Msg("failed to delete repo meta bucket") + if err := txrp.Del(ctx, rc.RepoMetaKey).Err(); err != nil { + rc.Log.Error().Err(err).Str("del", rc.RepoMetaKey).Msg("failed to delete repo meta bucket") return fmt.Errorf("failed to delete repo meta bucket: %w", err) } - if err := txrp.Del(ctx, ImageMetaBuck).Err(); err != nil { - rc.Log.Error().Err(err).Str("del", ImageMetaBuck).Msg("failed to delete image meta bucket") + if err := txrp.Del(ctx, rc.ImageMetaKey).Err(); err != nil { + rc.Log.Error().Err(err).Str("del", rc.ImageMetaKey).Msg("failed to delete image meta bucket") return fmt.Errorf("failed to delete image meta bucket: %w", err) } - if err := txrp.Del(ctx, RepoBlobsBuck).Err(); err != nil { - rc.Log.Error().Err(err).Str("del", RepoBlobsBuck).Msg("failed to delete repo blobs bucket") + if err := txrp.Del(ctx, rc.RepoBlobsKey).Err(); err != nil { + rc.Log.Error().Err(err).Str("del", rc.RepoBlobsKey).Msg("failed to delete repo blobs bucket") return fmt.Errorf("failed to delete repo blobs bucket: %w", err) } - if err := txrp.Del(ctx, RepoLastUpdatedBuck).Err(); err != nil { - rc.Log.Error().Err(err).Str("del", RepoLastUpdatedBuck).Msg("failed to delete repo last updated bucket") + if err := txrp.Del(ctx, rc.RepoLastUpdatedKey).Err(); err != nil { + rc.Log.Error().Err(err).Str("del", rc.RepoLastUpdatedKey).Msg("failed to delete repo last updated bucket") return fmt.Errorf("failed to delete repo last updated bucket: %w", err) } - if err := txrp.Del(ctx, UserDataBucket).Err(); err != nil { - rc.Log.Error().Err(err).Str("del", UserDataBucket).Msg("failed to delete user data bucket") + if err := txrp.Del(ctx, rc.UserDataKey).Err(); err != nil { + rc.Log.Error().Err(err).Str("del", rc.UserDataKey).Msg("failed to delete user data bucket") return fmt.Errorf("failed to delete user data bucket: %w", err) } - if err := txrp.Del(ctx, UserAPIKeysBucket).Err(); err != nil { - rc.Log.Error().Err(err).Str("del", UserAPIKeysBucket).Msg("failed to delete user api key bucket") + if err := txrp.Del(ctx, rc.UserAPIKeysKey).Err(); err != nil { + rc.Log.Error().Err(err).Str("del", rc.UserAPIKeysKey).Msg("failed to delete user api key bucket") return fmt.Errorf("failed to delete user api key bucket: %w", err) } - if err := txrp.Del(ctx, VersionBucket).Err(); err != nil { - rc.Log.Error().Err(err).Str("del", VersionBucket).Msg("failed to delete version bucket") + if err := txrp.Del(ctx, rc.VersionKey).Err(); err != nil { + rc.Log.Error().Err(err).Str("del", rc.VersionKey).Msg("failed to delete version bucket") return fmt.Errorf("failed to delete version bucket: %w", err) } @@ -2049,20 +2069,20 @@ func (rc *RedisDB) ResetDB() error { func (rc *RedisDB) PatchDB() error { ctx := context.Background() - err := rc.withRSLocks(ctx, []string{getVersionLockKey()}, func() error { + err := rc.withRSLocks(ctx, []string{rc.getVersionLockKey()}, func() error { var DBVersion string - DBVersion, err := rc.Client.Get(ctx, VersionBucket).Result() + DBVersion, err := rc.Client.Get(ctx, rc.VersionKey).Result() if err != nil { if !errors.Is(err, redis.Nil) { - rc.Log.Error().Err(err).Str("get", VersionBucket).Msg("failed to get db version") + rc.Log.Error().Err(err).Str("get", rc.VersionKey).Msg("failed to get db version") return fmt.Errorf("patching the database failed, can't read db version: %w", err) } // this is a new DB, we need to initialize the version - if err := rc.Client.Set(ctx, VersionBucket, rc.Version, 0).Err(); err != nil { - rc.Log.Error().Err(err).Str("set", VersionBucket). + if err := rc.Client.Set(ctx, rc.VersionKey, rc.Version, 0).Err(); err != nil { + rc.Log.Error().Err(err).Str("set", rc.VersionKey). Str("value", version.CurrentVersion).Msg("failed to set db version") return fmt.Errorf("patching the database failed, can't set db version: %w", err) @@ -2114,9 +2134,9 @@ func (rc *RedisDB) getUserBookmarksAndStarsNoError(ctx context.Context) ([]strin } func (rc *RedisDB) getProtoImageMeta(ctx context.Context, digest string) (*proto_go.ImageMeta, error) { - imageMetaBlob, err := rc.Client.HGet(ctx, ImageMetaBuck, digest).Bytes() + imageMetaBlob, err := rc.Client.HGet(ctx, rc.ImageMetaKey, digest).Bytes() if err != nil && !errors.Is(err, redis.Nil) { - rc.Log.Error().Err(err).Str("hget", ImageMetaBuck).Str("digest", digest). + rc.Log.Error().Err(err).Str("hget", rc.ImageMetaKey).Str("digest", digest). Msg("failed to get image meta record") return nil, fmt.Errorf("failed to get image meta record for digest %s: %w", digest, err) @@ -2166,9 +2186,9 @@ func (rc *RedisDB) getAllContainedMeta(ctx context.Context, imageIndexData *prot } func (rc *RedisDB) getProtoRepoMeta(ctx context.Context, repo string) (*proto_go.RepoMeta, error) { - repoMetaBlob, err := rc.Client.HGet(ctx, RepoMetaBuck, repo).Bytes() + repoMetaBlob, err := rc.Client.HGet(ctx, rc.RepoMetaKey, repo).Bytes() if err != nil && !errors.Is(err, redis.Nil) { - rc.Log.Error().Err(err).Str("hget", RepoMetaBuck).Str("repo", repo). + rc.Log.Error().Err(err).Str("hget", rc.RepoMetaKey).Str("repo", repo). Msg("failed to get repo meta record") return nil, fmt.Errorf("failed to get repo meta record for repo %s: %w", repo, err) @@ -2196,6 +2216,22 @@ func (rc *RedisDB) withRSLocks(ctx context.Context, lockNames []string, wrappedF return wrappedFunc() } +func (rc *RedisDB) getRepoLockKey(name string) string { + return strings.Join([]string{rc.LocksKey, "Repo", name}, ":") +} + +func (rc *RedisDB) getImageLockKey(name string) string { + return strings.Join([]string{rc.LocksKey, "Image", name}, ":") +} + +func (rc *RedisDB) getUserLockKey(name string) string { + return strings.Join([]string{rc.LocksKey, "User", name}, ":") +} + +func (rc *RedisDB) getVersionLockKey() string { + return strings.Join([]string{rc.LocksKey, "Version"}, ":") +} + // unmarshalProtoRepoMeta will unmarshal the repoMeta blob and initialize nil maps. If the blob is empty // an empty initialized object is returned. func unmarshalProtoRepoMeta(repo string, repoMetaBlob []byte) (*proto_go.RepoMeta, error) { @@ -2254,18 +2290,6 @@ func unmarshalProtoRepoBlobs(repo string, repoBlobsBytes []byte) (*proto_go.Repo return repoBlobs, nil } -func getRepoLockKey(name string) string { - return strings.Join([]string{LockBuck, "Repo", name}, ":") -} - -func getImageLockKey(name string) string { - return strings.Join([]string{LockBuck, "Image", name}, ":") -} - -func getUserLockKey(name string) string { - return strings.Join([]string{LockBuck, "User", name}, ":") -} - -func getVersionLockKey() string { - return strings.Join([]string{LockBuck, "Version"}, ":") +func join(xs ...string) string { + return strings.Join(xs, ":") } diff --git a/pkg/meta/redisdb/redis_internal_test.go b/pkg/meta/redisdb/redis_internal_test.go new file mode 100644 index 000000000..a34b04b50 --- /dev/null +++ b/pkg/meta/redisdb/redis_internal_test.go @@ -0,0 +1,55 @@ +package redisdb + +import ( + "testing" + + "github.com/redis/go-redis/v9" + . "github.com/smartystreets/goconvey/convey" + + "zotregistry.dev/zot/pkg/log" +) + +func Test(t *testing.T) { + Convey("Test redis metadb key generation", t, func() { + log := log.NewLogger("debug", "") + So(log, ShouldNotBeNil) + + client := redis.NewClient(&redis.Options{}) + + params := DBDriverParameters{KeyPrefix: "zot"} + + metaDB, err := New(client, params, log) + So(err, ShouldBeNil) + So(metaDB.ImageMetaKey, ShouldEqual, "zot:ImageMeta") + So(metaDB.RepoMetaKey, ShouldEqual, "zot:RepoMeta") + So(metaDB.RepoLastUpdatedKey, ShouldEqual, "zot:RepoLastUpdated") + So(metaDB.RepoBlobsKey, ShouldEqual, "zot:RepoBlobsMeta") + So(metaDB.UserDataKey, ShouldEqual, "zot:UserData") + So(metaDB.UserAPIKeysKey, ShouldEqual, "zot:UserAPIKeys") + So(metaDB.VersionKey, ShouldEqual, "zot:Version") + So(metaDB.LocksKey, ShouldEqual, "zot:Locks") + + So(metaDB.getUserLockKey("user1"), ShouldEqual, "zot:Locks:User:user1") + So(metaDB.getRepoLockKey("repo1"), ShouldEqual, "zot:Locks:Repo:repo1") + So(metaDB.getImageLockKey("image1"), ShouldEqual, "zot:Locks:Image:image1") + So(metaDB.getVersionLockKey(), ShouldEqual, "zot:Locks:Version") + + params = DBDriverParameters{KeyPrefix: "someprefix"} + + metaDB, err = New(client, params, log) + So(err, ShouldBeNil) + So(metaDB.ImageMetaKey, ShouldEqual, "someprefix:ImageMeta") + So(metaDB.RepoMetaKey, ShouldEqual, "someprefix:RepoMeta") + So(metaDB.RepoLastUpdatedKey, ShouldEqual, "someprefix:RepoLastUpdated") + So(metaDB.RepoBlobsKey, ShouldEqual, "someprefix:RepoBlobsMeta") + So(metaDB.UserDataKey, ShouldEqual, "someprefix:UserData") + So(metaDB.UserAPIKeysKey, ShouldEqual, "someprefix:UserAPIKeys") + So(metaDB.VersionKey, ShouldEqual, "someprefix:Version") + So(metaDB.LocksKey, ShouldEqual, "someprefix:Locks") + + So(metaDB.getUserLockKey("user1"), ShouldEqual, "someprefix:Locks:User:user1") + So(metaDB.getRepoLockKey("repo1"), ShouldEqual, "someprefix:Locks:Repo:repo1") + So(metaDB.getImageLockKey("image1"), ShouldEqual, "someprefix:Locks:Image:image1") + So(metaDB.getVersionLockKey(), ShouldEqual, "someprefix:Locks:Version") + }) +} diff --git a/pkg/meta/redisdb/redis_test.go b/pkg/meta/redisdb/redis_test.go index 51fdae0e7..881b0e1da 100644 --- a/pkg/meta/redisdb/redis_test.go +++ b/pkg/meta/redisdb/redis_test.go @@ -29,11 +29,13 @@ func TestRedisMocked(t *testing.T) { mock.ExpectPing().SetVal("PONG") - metaDB, err := redisdb.New(client, log) + params := redisdb.DBDriverParameters{KeyPrefix: "zot"} + + metaDB, err := redisdb.New(client, params, log) So(err, ShouldBeNil) Convey("GetAllRepoNames HGetAll error", func() { - mock.ExpectHGetAll(redisdb.RepoMetaBuck). + mock.ExpectHGetAll(metaDB.RepoMetaKey). SetErr(ErrTestError) repoNames, err := metaDB.GetAllRepoNames() @@ -42,7 +44,7 @@ func TestRedisMocked(t *testing.T) { }) Convey("GetAllRepoNames HGetAll succeeds", func() { - mock.ExpectHGetAll(redisdb.RepoMetaBuck).SetVal( + mock.ExpectHGetAll(metaDB.RepoMetaKey).SetVal( map[string]string{ "repo1": "meta1", "repo2": "meta2", @@ -70,7 +72,9 @@ func TestRedisRepoMeta(t *testing.T) { client := redis.NewClient(opts) defer DumpKeys(t, client) // Troubleshoot test failures - metaDB, err := redisdb.New(client, log) + params := redisdb.DBDriverParameters{KeyPrefix: "zot"} + + metaDB, err := redisdb.New(client, params, log) So(err, ShouldBeNil) Convey("Test repoMeta ops", func() { diff --git a/pkg/meta/version/version_test.go b/pkg/meta/version/version_test.go index 592d3abe9..9fd62dbe1 100644 --- a/pkg/meta/version/version_test.go +++ b/pkg/meta/version/version_test.go @@ -227,7 +227,10 @@ func TestVersioningRedisDB(t *testing.T) { defer dumpRedisKeys(t, client) // Troubleshoot test failures log := log.NewLogger("debug", "") - metaDB, err := redisdb.New(client, log) + + params := redisdb.DBDriverParameters{KeyPrefix: "zot"} + + metaDB, err := redisdb.New(client, params, log) So(err, ShouldBeNil) So(metaDB.ResetDB(), ShouldBeNil) @@ -236,7 +239,7 @@ func TestVersioningRedisDB(t *testing.T) { Convey("empty initial version triggers setting the default", func() { // Check no value is initially set - actualVersion, err := client.Get(ctx, redisdb.VersionBucket).Result() + actualVersion, err := client.Get(ctx, metaDB.VersionKey).Result() So(err, ShouldEqual, redis.Nil) So(actualVersion, ShouldEqual, "") @@ -244,14 +247,14 @@ func TestVersioningRedisDB(t *testing.T) { So(err, ShouldBeNil) // Check default version is added in the DB - actualVersion, err = client.Get(ctx, redisdb.VersionBucket).Result() + actualVersion, err = client.Get(ctx, metaDB.VersionKey).Result() So(err, ShouldBeNil) So(actualVersion, ShouldEqual, version.CurrentVersion) }) Convey("initial version with a bad value raises an error", func() { // Set invalid initial value - err = client.Set(ctx, redisdb.VersionBucket, "VInvalid", 0).Err() + err = client.Set(ctx, metaDB.VersionKey, "VInvalid", 0).Err() So(err, ShouldBeNil) // Check error when attempting to patch