diff --git a/pkg/api/controller_test.go b/pkg/api/controller_test.go index 4adecc985..81063ef25 100644 --- a/pkg/api/controller_test.go +++ b/pkg/api/controller_test.go @@ -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, @@ -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) diff --git a/pkg/storage/cache.go b/pkg/storage/cache.go index ec80f259e..b5bd8afd2 100644 --- a/pkg/storage/cache.go +++ b/pkg/storage/cache.go @@ -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" @@ -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 { @@ -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) { diff --git a/pkg/storage/cache/dynamodb.go b/pkg/storage/cache/dynamodb.go index 84270a6ab..6f536145d 100644 --- a/pkg/storage/cache/dynamodb.go +++ b/pkg/storage/cache/dynamodb.go @@ -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 }