Skip to content

Commit

Permalink
More validation for DynamoDB cache driver cachetablename
Browse files Browse the repository at this point in the history
Signed-off-by: Andrei Aaron <[email protected]>
  • Loading branch information
andaaron committed Feb 8, 2025
1 parent d0ad935 commit e941212
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 5 deletions.
26 changes: 25 additions & 1 deletion pkg/api/controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,30 @@ func TestCreateCacheDatabaseDriver(t *testing.T) {
}

endpoint := os.Getenv("DYNAMODBMOCK_ENDPOINT")

// missing cachetablename key
conf.Storage.CacheDriver = map[string]interface{}{
"name": "dynamodb",
"endpoint": endpoint,
"region": "us-east-2",
}

driver, err := storage.CreateCacheDatabaseDriver(conf.Storage.StorageConfig, log)
So(err, ShouldNotBeNil)
So(driver, ShouldBeNil)

// invalid cachetablename type
conf.Storage.CacheDriver = map[string]interface{}{
"name": "dynamodb",
"endpoint": endpoint,
"region": "us-east-2",
"cachetablename": false,
}

driver, err = storage.CreateCacheDatabaseDriver(conf.Storage.StorageConfig, log)
So(err, ShouldNotBeNil)
So(driver, ShouldBeNil)

conf.Storage.CacheDriver = map[string]interface{}{
"name": "dynamodb",
"endpoint": endpoint,
Expand All @@ -237,7 +261,7 @@ func TestCreateCacheDatabaseDriver(t *testing.T) {
"versiontablename": "Version",
}

driver, err := storage.CreateCacheDatabaseDriver(conf.Storage.StorageConfig, log)
driver, err = storage.CreateCacheDatabaseDriver(conf.Storage.StorageConfig, log)
So(err, ShouldBeNil)
So(driver, ShouldNotBeNil)

Expand Down
23 changes: 20 additions & 3 deletions pkg/storage/cache.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package storage

import (
"fmt"

zerr "zotregistry.dev/zot/errors"
"zotregistry.dev/zot/pkg/api/config"
rediscfg "zotregistry.dev/zot/pkg/api/config/redis"
Expand Down Expand Up @@ -43,7 +45,12 @@ func CreateCacheDatabaseDriver(storageConfig config.StorageConfig, log zlog.Logg

if name == constants.DynamoDBDriverName {
// dynamodb
return Create(name, getDynamoParams(&storageConfig), log)
dynamoParams, err := getDynamoParams(&storageConfig)
if err != nil {
return nil, err
}

return Create(name, dynamoParams, log)
}

if name == constants.RedisDriverName {
Expand Down Expand Up @@ -86,13 +93,23 @@ func getUseRelPaths(storageConfig *config.StorageConfig) bool {
return storageConfig.StorageDriver == nil
}

func getDynamoParams(storageConfig *config.StorageConfig) cache.DynamoDBDriverParameters {
func getDynamoParams(storageConfig *config.StorageConfig) (cache.DynamoDBDriverParameters, error) {
dynamoParams := cache.DynamoDBDriverParameters{}
dynamoParams.Endpoint, _ = storageConfig.CacheDriver["endpoint"].(string)
dynamoParams.Region, _ = storageConfig.CacheDriver["region"].(string)
dynamoParams.TableName, _ = storageConfig.CacheDriver["cachetablename"].(string)

return dynamoParams
cachetable, ok := storageConfig.CacheDriver["cachetablename"]
if !ok {
return dynamoParams, fmt.Errorf("%w: cachetablename key is mandatory for dynamodb cache driver", zerr.ErrBadConfig)
}

dynamoParams.TableName, ok = cachetable.(string)
if !ok {
return dynamoParams, fmt.Errorf("%w: failed to cast cachetablename %s to string type", zerr.ErrBadConfig, cachetable)
}

return dynamoParams, nil
}

func getRedisParams(storageConfig *config.StorageConfig, log zlog.Logger) (cache.RedisDriverParameters, error) {
Expand Down
2 changes: 1 addition & 1 deletion pkg/storage/cache/dynamodb.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ func NewDynamoDBCache(parameters interface{}, log zlog.Logger) (*DynamoDBDriver,
properParameters, ok := parameters.(DynamoDBDriverParameters)
if !ok {
log.Error().Err(zerr.ErrTypeAssertionFailed).Msgf("failed to cast type, expected type '%T' but got '%T'",
BoltDBDriverParameters{}, parameters)
DynamoDBDriverParameters{}, parameters)

return nil, zerr.ErrTypeAssertionFailed
}
Expand Down

0 comments on commit e941212

Please sign in to comment.