mirror of
https://github.com/project-zot/zot.git
synced 2025-03-11 02:17:43 -05:00
feat(refator): refactoring repodb into meta (#1626)
Signed-off-by: Laurentiu Niculae <niculae.laurentiu1@gmail.com>
This commit is contained in:
parent
fe9c9750b5
commit
28de980319
65 changed files with 3267 additions and 3243 deletions
|
@ -63,22 +63,22 @@ var (
|
|||
ErrBadRange = errors.New("storage: bad range")
|
||||
ErrBadLayerCount = errors.New("manifest: layers count doesn't correspond to config history")
|
||||
ErrManifestConflict = errors.New("manifest: multiple manifests found")
|
||||
ErrManifestMetaNotFound = errors.New("repodb: image metadata not found for given manifest reference")
|
||||
ErrManifestDataNotFound = errors.New("repodb: image data not found for given manifest digest")
|
||||
ErrIndexDataNotFount = errors.New("repodb: index data not found for given digest")
|
||||
ErrRepoMetaNotFound = errors.New("repodb: repo metadata not found for given repo name")
|
||||
ErrTagMetaNotFound = errors.New("repodb: tag metadata not found for given repo and tag names")
|
||||
ErrManifestMetaNotFound = errors.New("metadb: image metadata not found for given manifest reference")
|
||||
ErrManifestDataNotFound = errors.New("metadb: image data not found for given manifest digest")
|
||||
ErrIndexDataNotFount = errors.New("metadb: index data not found for given digest")
|
||||
ErrRepoMetaNotFound = errors.New("metadb: repo metadata not found for given repo name")
|
||||
ErrTagMetaNotFound = errors.New("metadb: tag metadata not found for given repo and tag names")
|
||||
ErrTypeAssertionFailed = errors.New("storage: failed DatabaseDriver type assertion")
|
||||
ErrInvalidRequestParams = errors.New("resolver: parameter sent has invalid value")
|
||||
ErrBadCtxFormat = errors.New("type assertion failed")
|
||||
ErrEmptyRepoName = errors.New("repodb: repo name can't be empty string")
|
||||
ErrEmptyTag = errors.New("repodb: tag can't be empty string")
|
||||
ErrEmptyDigest = errors.New("repodb: digest can't be empty string")
|
||||
ErrEmptyRepoName = errors.New("metadb: repo name can't be empty string")
|
||||
ErrEmptyTag = errors.New("metadb: tag can't be empty string")
|
||||
ErrEmptyDigest = errors.New("metadb: digest can't be empty string")
|
||||
ErrInvalidRepoRefFormat = errors.New("invalid image reference format")
|
||||
ErrLimitIsNegative = errors.New("pageturner: limit has negative value")
|
||||
ErrOffsetIsNegative = errors.New("pageturner: offset has negative value")
|
||||
ErrSortCriteriaNotSupported = errors.New("pageturner: the sort criteria is not supported")
|
||||
ErrMediaTypeNotSupported = errors.New("repodb: media type is not supported")
|
||||
ErrMediaTypeNotSupported = errors.New("metadb: media type is not supported")
|
||||
ErrTimeout = errors.New("operation timeout")
|
||||
ErrNotImplemented = errors.New("not implemented")
|
||||
ErrDedupeRebuild = errors.New("dedupe: couldn't rebuild dedupe index")
|
||||
|
@ -89,14 +89,14 @@ var (
|
|||
ErrOpenIDProviderDoesNotExist = errors.New("openID: provider does not exist in given config")
|
||||
ErrHashKeyNotCreated = errors.New("cookiestore: generated random hash key is nil, not continuing")
|
||||
ErrFailedTypeAssertion = errors.New("type assertion failed")
|
||||
ErrInvalidOldUserStarredRepos = errors.New("repodb: invalid old entry for user starred repos")
|
||||
ErrUnmarshalledRepoListIsNil = errors.New("repodb: list of repos is still nil")
|
||||
ErrCouldNotMarshalStarredRepos = errors.New("repodb: could not repack entry for user starred repos")
|
||||
ErrInvalidOldUserBookmarkedRepos = errors.New("repodb: invalid old entry for user bookmarked repos")
|
||||
ErrCouldNotMarshalBookmarkedRepos = errors.New("repodb: could not repack entry for user bookmarked repos")
|
||||
ErrUserDataNotFound = errors.New("repodb: user data not found for given user identifier")
|
||||
ErrUserDataNotAllowed = errors.New("repodb: user data operations are not allowed")
|
||||
ErrCouldNotPersistData = errors.New("repodb: could not persist to db")
|
||||
ErrInvalidOldUserStarredRepos = errors.New("metadb: invalid old entry for user starred repos")
|
||||
ErrUnmarshalledRepoListIsNil = errors.New("metadb: list of repos is still nil")
|
||||
ErrCouldNotMarshalStarredRepos = errors.New("metadb: could not repack entry for user starred repos")
|
||||
ErrInvalidOldUserBookmarkedRepos = errors.New("metadb: invalid old entry for user bookmarked repos")
|
||||
ErrCouldNotMarshalBookmarkedRepos = errors.New("metadb: could not repack entry for user bookmarked repos")
|
||||
ErrUserDataNotFound = errors.New("metadb: user data not found for given user identifier")
|
||||
ErrUserDataNotAllowed = errors.New("metadb: user data operations are not allowed")
|
||||
ErrCouldNotPersistData = errors.New("metadb: could not persist to db")
|
||||
ErrSignConfigDirNotSet = errors.New("signatures: signature config dir not set")
|
||||
ErrBadManifestDigest = errors.New("signatures: bad manifest digest")
|
||||
ErrInvalidSignatureType = errors.New("signatures: invalid signature type")
|
||||
|
|
|
@ -93,7 +93,7 @@ func (amw *AuthnMiddleware) sessionAuthn(ctlr *Controller, next http.Handler, re
|
|||
|
||||
ctx := getReqContextWithAuthorization(identity, []string{}, request)
|
||||
|
||||
groups, err := ctlr.RepoDB.GetUserGroups(ctx)
|
||||
groups, err := ctlr.MetaDB.GetUserGroups(ctx)
|
||||
if err != nil {
|
||||
if errors.Is(err, zerr.ErrUserDataNotFound) {
|
||||
ctlr.Log.Err(err).Str("identity", identity).Msg("can not find user profile in DB")
|
||||
|
@ -168,7 +168,7 @@ func (amw *AuthnMiddleware) basicAuthn(ctlr *Controller, response http.ResponseW
|
|||
return false, response, request, err
|
||||
}
|
||||
|
||||
if err := ctlr.RepoDB.SetUserGroups(ctx, groups); err != nil {
|
||||
if err := ctlr.MetaDB.SetUserGroups(ctx, groups); err != nil {
|
||||
ctlr.Log.Error().Err(err).Str("identity", identity).Msg("couldn't update user profile")
|
||||
|
||||
return false, response, request, err
|
||||
|
@ -200,7 +200,7 @@ func (amw *AuthnMiddleware) basicAuthn(ctlr *Controller, response http.ResponseW
|
|||
return false, response, request, err
|
||||
}
|
||||
|
||||
if err := ctlr.RepoDB.SetUserGroups(ctx, groups); err != nil {
|
||||
if err := ctlr.MetaDB.SetUserGroups(ctx, groups); err != nil {
|
||||
ctlr.Log.Error().Err(err).Str("identity", identity).Msg("couldn't update user profile")
|
||||
|
||||
return false, response, request, err
|
||||
|
@ -224,7 +224,7 @@ func (amw *AuthnMiddleware) basicAuthn(ctlr *Controller, response http.ResponseW
|
|||
|
||||
hashedKey := hashUUID(trimmedAPIKey)
|
||||
|
||||
storedIdentity, err := ctlr.RepoDB.GetUserAPIKeyInfo(hashedKey)
|
||||
storedIdentity, err := ctlr.MetaDB.GetUserAPIKeyInfo(hashedKey)
|
||||
if err != nil {
|
||||
if errors.Is(err, zerr.ErrUserAPIKeyNotFound) {
|
||||
ctlr.Log.Info().Err(err).Msgf("can not find any user info for hashed key %s in DB", hashedKey)
|
||||
|
@ -240,14 +240,14 @@ func (amw *AuthnMiddleware) basicAuthn(ctlr *Controller, response http.ResponseW
|
|||
if storedIdentity == identity {
|
||||
ctx := getReqContextWithAuthorization(identity, []string{}, request)
|
||||
|
||||
err := ctlr.RepoDB.UpdateUserAPIKeyLastUsed(ctx, hashedKey)
|
||||
err := ctlr.MetaDB.UpdateUserAPIKeyLastUsed(ctx, hashedKey)
|
||||
if err != nil {
|
||||
ctlr.Log.Err(err).Str("identity", identity).Msg("can not update user profile in DB")
|
||||
|
||||
return false, nil, nil, err
|
||||
}
|
||||
|
||||
groups, err := ctlr.RepoDB.GetUserGroups(ctx)
|
||||
groups, err := ctlr.MetaDB.GetUserGroups(ctx)
|
||||
if err != nil {
|
||||
ctlr.Log.Err(err).Str("identity", identity).Msg("can not get user's groups in DB")
|
||||
|
||||
|
@ -843,7 +843,7 @@ func OAuth2Callback(ctlr *Controller, w http.ResponseWriter, r *http.Request, st
|
|||
return "", err
|
||||
}
|
||||
|
||||
if err := ctlr.RepoDB.SetUserGroups(ctx, groups); err != nil {
|
||||
if err := ctlr.MetaDB.SetUserGroups(ctx, groups); err != nil {
|
||||
ctlr.Log.Error().Err(err).Str("identity", email).Msg("couldn't update the user profile")
|
||||
|
||||
return "", err
|
||||
|
|
|
@ -24,8 +24,8 @@ import (
|
|||
ext "zotregistry.io/zot/pkg/extensions"
|
||||
"zotregistry.io/zot/pkg/extensions/monitoring"
|
||||
"zotregistry.io/zot/pkg/log"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
"zotregistry.io/zot/pkg/meta/repodb/repodbfactory"
|
||||
"zotregistry.io/zot/pkg/meta"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
"zotregistry.io/zot/pkg/scheduler"
|
||||
"zotregistry.io/zot/pkg/storage"
|
||||
)
|
||||
|
@ -39,7 +39,7 @@ const (
|
|||
type Controller struct {
|
||||
Config *config.Config
|
||||
Router *mux.Router
|
||||
RepoDB repodb.RepoDB
|
||||
MetaDB mTypes.MetaDB
|
||||
StoreController storage.StoreController
|
||||
Log log.Logger
|
||||
Audit *log.Logger
|
||||
|
@ -229,7 +229,7 @@ func (c *Controller) Init(reloadCtx context.Context) error {
|
|||
return err
|
||||
}
|
||||
|
||||
if err := c.InitRepoDB(reloadCtx); err != nil {
|
||||
if err := c.InitMetaDB(reloadCtx); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
|
@ -241,7 +241,7 @@ func (c *Controller) Init(reloadCtx context.Context) error {
|
|||
func (c *Controller) InitCVEInfo() {
|
||||
// Enable CVE extension if extension config is provided
|
||||
if c.Config != nil && c.Config.Extensions != nil {
|
||||
c.CveInfo = ext.GetCVEInfo(c.Config, c.StoreController, c.RepoDB, c.Log)
|
||||
c.CveInfo = ext.GetCVEInfo(c.Config, c.StoreController, c.MetaDB, c.Log)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -258,11 +258,11 @@ func (c *Controller) InitImageStore() error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (c *Controller) InitRepoDB(reloadCtx context.Context) error {
|
||||
// init repoDB if search is enabled or authn enabled (need to store user profiles) or apikey ext is enabled
|
||||
func (c *Controller) InitMetaDB(reloadCtx context.Context) error {
|
||||
// init metaDB if search is enabled or authn enabled (need to store user profiles) or apikey ext is enabled
|
||||
if (c.Config.Extensions != nil && c.Config.Extensions.Search != nil && *c.Config.Extensions.Search.Enable) ||
|
||||
isAuthnEnabled(c.Config) || isOpenIDAuthEnabled(c.Config) || isAPIKeyEnabled(c.Config) {
|
||||
driver, err := repodbfactory.New(c.Config.Storage.StorageConfig, c.Log) //nolint:contextcheck
|
||||
driver, err := meta.New(c.Config.Storage.StorageConfig, c.Log) //nolint:contextcheck
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -272,12 +272,12 @@ func (c *Controller) InitRepoDB(reloadCtx context.Context) error {
|
|||
return err
|
||||
}
|
||||
|
||||
err = repodb.ParseStorage(driver, c.StoreController, c.Log)
|
||||
err = meta.ParseStorage(driver, c.StoreController, c.Log)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
c.RepoDB = driver
|
||||
c.MetaDB = driver
|
||||
}
|
||||
|
||||
return nil
|
||||
|
@ -335,7 +335,7 @@ func (c *Controller) StartBackgroundTasks(reloadCtx context.Context) {
|
|||
// Enable extensions if extension config is provided for DefaultStore
|
||||
if c.Config != nil && c.Config.Extensions != nil {
|
||||
ext.EnableMetricsExtension(c.Config, c.Log, c.Config.Storage.RootDirectory)
|
||||
ext.EnableSearchExtension(c.Config, c.StoreController, c.RepoDB, taskScheduler, c.CveInfo, c.Log)
|
||||
ext.EnableSearchExtension(c.Config, c.StoreController, c.MetaDB, taskScheduler, c.CveInfo, c.Log)
|
||||
}
|
||||
|
||||
if c.Config.Storage.SubPaths != nil {
|
||||
|
@ -361,7 +361,7 @@ func (c *Controller) StartBackgroundTasks(reloadCtx context.Context) {
|
|||
if c.Config.Extensions != nil {
|
||||
ext.EnableScrubExtension(c.Config, c.Log, c.StoreController, taskScheduler)
|
||||
|
||||
syncOnDemand, err := ext.EnableSyncExtension(c.Config, c.RepoDB, c.StoreController, taskScheduler, c.Log)
|
||||
syncOnDemand, err := ext.EnableSyncExtension(c.Config, c.MetaDB, c.StoreController, taskScheduler, c.Log)
|
||||
if err != nil {
|
||||
c.Log.Error().Err(err).Msg("unable to start sync extension")
|
||||
}
|
||||
|
@ -371,7 +371,7 @@ func (c *Controller) StartBackgroundTasks(reloadCtx context.Context) {
|
|||
|
||||
if c.Config.Extensions != nil {
|
||||
if c.Config.Extensions.Mgmt != nil && *c.Config.Extensions.Mgmt.Enable {
|
||||
ext.EnablePeriodicSignaturesVerification(c.Config, taskScheduler, c.RepoDB, c.Log) //nolint: contextcheck
|
||||
ext.EnablePeriodicSignaturesVerification(c.Config, taskScheduler, c.MetaDB, c.Log) //nolint: contextcheck
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -56,7 +56,7 @@ import (
|
|||
"zotregistry.io/zot/pkg/common"
|
||||
extconf "zotregistry.io/zot/pkg/extensions/config"
|
||||
"zotregistry.io/zot/pkg/log"
|
||||
"zotregistry.io/zot/pkg/meta/repodb/repodbfactory"
|
||||
"zotregistry.io/zot/pkg/meta"
|
||||
"zotregistry.io/zot/pkg/storage"
|
||||
storageConstants "zotregistry.io/zot/pkg/storage/constants"
|
||||
"zotregistry.io/zot/pkg/test"
|
||||
|
@ -203,7 +203,7 @@ func TestCreateCacheDatabaseDriver(t *testing.T) {
|
|||
})
|
||||
}
|
||||
|
||||
func TestCreateRepoDBDriver(t *testing.T) {
|
||||
func TestCreateMetaDBDriver(t *testing.T) {
|
||||
Convey("Test CreateCacheDatabaseDriver dynamo", t, func() {
|
||||
log := log.NewLogger("debug", "")
|
||||
dir := t.TempDir()
|
||||
|
@ -230,7 +230,7 @@ func TestCreateRepoDBDriver(t *testing.T) {
|
|||
"userdatatablename": "UserDatatable",
|
||||
}
|
||||
|
||||
testFunc := func() { _, _ = repodbfactory.New(conf.Storage.StorageConfig, log) }
|
||||
testFunc := func() { _, _ = meta.New(conf.Storage.StorageConfig, log) }
|
||||
So(testFunc, ShouldPanic)
|
||||
|
||||
conf.Storage.CacheDriver = map[string]interface{}{
|
||||
|
@ -244,7 +244,7 @@ func TestCreateRepoDBDriver(t *testing.T) {
|
|||
"versiontablename": 1,
|
||||
}
|
||||
|
||||
testFunc = func() { _, _ = repodbfactory.New(conf.Storage.StorageConfig, log) }
|
||||
testFunc = func() { _, _ = meta.New(conf.Storage.StorageConfig, log) }
|
||||
So(testFunc, ShouldPanic)
|
||||
|
||||
conf.Storage.CacheDriver = map[string]interface{}{
|
||||
|
@ -260,7 +260,7 @@ func TestCreateRepoDBDriver(t *testing.T) {
|
|||
"versiontablename": "1",
|
||||
}
|
||||
|
||||
testFunc = func() { _, _ = repodbfactory.New(conf.Storage.StorageConfig, log) }
|
||||
testFunc = func() { _, _ = meta.New(conf.Storage.StorageConfig, log) }
|
||||
So(testFunc, ShouldNotPanic)
|
||||
})
|
||||
|
||||
|
@ -283,7 +283,7 @@ func TestCreateRepoDBDriver(t *testing.T) {
|
|||
err = os.Chmod(path.Join(dir, "repo.db"), 0o200)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, err = repodbfactory.New(conf.Storage.StorageConfig, log)
|
||||
_, err = meta.New(conf.Storage.StorageConfig, log)
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
err = os.Chmod(path.Join(dir, "repo.db"), 0o600)
|
||||
|
@ -3103,7 +3103,7 @@ func TestAuthnSessionErrors(t *testing.T) {
|
|||
Convey("trigger basic authn middle(htpasswd) error", func() {
|
||||
client := resty.New()
|
||||
|
||||
ctlr.RepoDB = mocks.RepoDBMock{
|
||||
ctlr.MetaDB = mocks.MetaDBMock{
|
||||
SetUserGroupsFn: func(ctx context.Context, groups []string) error {
|
||||
return ErrUnexpectedError
|
||||
},
|
||||
|
@ -3120,7 +3120,7 @@ func TestAuthnSessionErrors(t *testing.T) {
|
|||
Convey("trigger basic authn middle(ldap) error", func() {
|
||||
client := resty.New()
|
||||
|
||||
ctlr.RepoDB = mocks.RepoDBMock{
|
||||
ctlr.MetaDB = mocks.MetaDBMock{
|
||||
SetUserGroupsFn: func(ctx context.Context, groups []string) error {
|
||||
return ErrUnexpectedError
|
||||
},
|
||||
|
@ -3138,7 +3138,7 @@ func TestAuthnSessionErrors(t *testing.T) {
|
|||
client := resty.New()
|
||||
client.SetRedirectPolicy(test.CustomRedirectPolicy(20))
|
||||
|
||||
ctlr.RepoDB = mocks.RepoDBMock{
|
||||
ctlr.MetaDB = mocks.MetaDBMock{
|
||||
SetUserGroupsFn: func(ctx context.Context, groups []string) error {
|
||||
return ErrUnexpectedError
|
||||
},
|
||||
|
@ -3153,7 +3153,7 @@ func TestAuthnSessionErrors(t *testing.T) {
|
|||
So(resp.StatusCode(), ShouldEqual, http.StatusInternalServerError)
|
||||
})
|
||||
|
||||
Convey("trigger session middle repoDB errors", func() {
|
||||
Convey("trigger session middle metaDB errors", func() {
|
||||
client := resty.New()
|
||||
client.SetRedirectPolicy(test.CustomRedirectPolicy(20))
|
||||
|
||||
|
@ -3162,7 +3162,7 @@ func TestAuthnSessionErrors(t *testing.T) {
|
|||
|
||||
mockOIDCServer.QueueUser(user)
|
||||
|
||||
ctlr.RepoDB = mocks.RepoDBMock{}
|
||||
ctlr.MetaDB = mocks.MetaDBMock{}
|
||||
|
||||
// first login user
|
||||
resp, err := client.R().
|
||||
|
@ -3178,7 +3178,7 @@ func TestAuthnSessionErrors(t *testing.T) {
|
|||
|
||||
client.SetCookies(cookies)
|
||||
|
||||
ctlr.RepoDB = mocks.RepoDBMock{
|
||||
ctlr.MetaDB = mocks.MetaDBMock{
|
||||
GetUserGroupsFn: func(ctx context.Context) ([]string, error) {
|
||||
return []string{}, ErrUnexpectedError
|
||||
},
|
||||
|
@ -3198,7 +3198,7 @@ func TestAuthnSessionErrors(t *testing.T) {
|
|||
|
||||
client.SetCookies(cookies)
|
||||
|
||||
ctlr.RepoDB = mocks.RepoDBMock{
|
||||
ctlr.MetaDB = mocks.MetaDBMock{
|
||||
GetUserGroupsFn: func(ctx context.Context) ([]string, error) {
|
||||
return []string{}, errors.ErrUserDataNotFound
|
||||
},
|
||||
|
@ -3417,7 +3417,7 @@ func TestAuthnSessionErrors(t *testing.T) {
|
|||
})
|
||||
}
|
||||
|
||||
func TestAuthnRepoDBErrors(t *testing.T) {
|
||||
func TestAuthnMetaDBErrors(t *testing.T) {
|
||||
Convey("make controller", t, func() {
|
||||
port := test.GetFreePort()
|
||||
baseURL := test.GetBaseURL(port)
|
||||
|
@ -3472,7 +3472,7 @@ func TestAuthnRepoDBErrors(t *testing.T) {
|
|||
Convey("trigger basic authn middle(htpasswd) error", func() {
|
||||
client := resty.New()
|
||||
|
||||
ctlr.RepoDB = mocks.RepoDBMock{
|
||||
ctlr.MetaDB = mocks.MetaDBMock{
|
||||
SetUserGroupsFn: func(ctx context.Context, groups []string) error {
|
||||
return ErrUnexpectedError
|
||||
},
|
||||
|
@ -3486,7 +3486,7 @@ func TestAuthnRepoDBErrors(t *testing.T) {
|
|||
So(resp.StatusCode(), ShouldEqual, http.StatusInternalServerError)
|
||||
})
|
||||
|
||||
Convey("trigger session middle repoDB errors", func() {
|
||||
Convey("trigger session middle metaDB errors", func() {
|
||||
client := resty.New()
|
||||
client.SetRedirectPolicy(test.CustomRedirectPolicy(20))
|
||||
|
||||
|
@ -3509,7 +3509,7 @@ func TestAuthnRepoDBErrors(t *testing.T) {
|
|||
|
||||
client.SetCookies(cookies)
|
||||
|
||||
ctlr.RepoDB = mocks.RepoDBMock{
|
||||
ctlr.MetaDB = mocks.MetaDBMock{
|
||||
GetUserGroupsFn: func(ctx context.Context) ([]string, error) {
|
||||
return []string{}, ErrUnexpectedError
|
||||
},
|
||||
|
@ -4727,7 +4727,7 @@ func TestCrossRepoMount(t *testing.T) {
|
|||
// in cache, now try mount blob request status and it should be 201 because now blob is present in cache
|
||||
// and it should do hard link.
|
||||
|
||||
// make a new server with dedupe on and same rootDir (can't restart because of repodb - boltdb being open)
|
||||
// make a new server with dedupe on and same rootDir (can't restart because of metadb - boltdb being open)
|
||||
newDir := t.TempDir()
|
||||
err = test.CopyFiles(dir, newDir)
|
||||
So(err, ShouldBeNil)
|
||||
|
|
|
@ -157,11 +157,11 @@ func (rh *RouteHandler) SetupRoutes() {
|
|||
prefixedExtensionsRouter.Use(CORSHeadersMiddleware(rh.c.Config.HTTP.AllowOrigin))
|
||||
|
||||
ext.SetupMgmtRoutes(rh.c.Config, prefixedExtensionsRouter, rh.c.Log)
|
||||
ext.SetupSearchRoutes(rh.c.Config, prefixedExtensionsRouter, rh.c.StoreController, rh.c.RepoDB, rh.c.CveInfo,
|
||||
ext.SetupSearchRoutes(rh.c.Config, prefixedExtensionsRouter, rh.c.StoreController, rh.c.MetaDB, rh.c.CveInfo,
|
||||
rh.c.Log)
|
||||
ext.SetupUserPreferencesRoutes(rh.c.Config, prefixedExtensionsRouter, rh.c.StoreController, rh.c.RepoDB,
|
||||
ext.SetupUserPreferencesRoutes(rh.c.Config, prefixedExtensionsRouter, rh.c.StoreController, rh.c.MetaDB,
|
||||
rh.c.CveInfo, rh.c.Log)
|
||||
ext.SetupAPIKeyRoutes(rh.c.Config, prefixedExtensionsRouter, rh.c.RepoDB, rh.c.CookieStore, rh.c.Log)
|
||||
ext.SetupAPIKeyRoutes(rh.c.Config, prefixedExtensionsRouter, rh.c.MetaDB, rh.c.CookieStore, rh.c.Log)
|
||||
ext.SetupMetricsRoutes(rh.c.Config, rh.c.Router, rh.c.StoreController, authHandler, rh.c.Log)
|
||||
|
||||
gqlPlayground.SetupGQLPlaygroundRoutes(rh.c.Config, prefixedRouter, rh.c.StoreController, rh.c.Log)
|
||||
|
@ -505,8 +505,8 @@ func (rh *RouteHandler) GetManifest(response http.ResponseWriter, request *http.
|
|||
return
|
||||
}
|
||||
|
||||
if rh.c.RepoDB != nil {
|
||||
err := meta.OnGetManifest(name, reference, content, rh.c.StoreController, rh.c.RepoDB, rh.c.Log)
|
||||
if rh.c.MetaDB != nil {
|
||||
err := meta.OnGetManifest(name, reference, content, rh.c.StoreController, rh.c.MetaDB, rh.c.Log)
|
||||
if err != nil {
|
||||
response.WriteHeader(http.StatusInternalServerError)
|
||||
|
||||
|
@ -712,8 +712,8 @@ func (rh *RouteHandler) UpdateManifest(response http.ResponseWriter, request *ht
|
|||
return
|
||||
}
|
||||
|
||||
if rh.c.RepoDB != nil {
|
||||
err := meta.OnUpdateManifest(name, reference, mediaType, digest, body, rh.c.StoreController, rh.c.RepoDB,
|
||||
if rh.c.MetaDB != nil {
|
||||
err := meta.OnUpdateManifest(name, reference, mediaType, digest, body, rh.c.StoreController, rh.c.MetaDB,
|
||||
rh.c.Log)
|
||||
if err != nil {
|
||||
response.WriteHeader(http.StatusInternalServerError)
|
||||
|
@ -813,9 +813,9 @@ func (rh *RouteHandler) DeleteManifest(response http.ResponseWriter, request *ht
|
|||
return
|
||||
}
|
||||
|
||||
if rh.c.RepoDB != nil {
|
||||
if rh.c.MetaDB != nil {
|
||||
err := meta.OnDeleteManifest(name, reference, mediaType, manifestDigest, manifestBlob,
|
||||
rh.c.StoreController, rh.c.RepoDB, rh.c.Log)
|
||||
rh.c.StoreController, rh.c.MetaDB, rh.c.Log)
|
||||
if err != nil {
|
||||
response.WriteHeader(http.StatusInternalServerError)
|
||||
|
||||
|
|
|
@ -30,7 +30,7 @@ import (
|
|||
"zotregistry.io/zot/pkg/api/constants"
|
||||
"zotregistry.io/zot/pkg/extensions"
|
||||
extconf "zotregistry.io/zot/pkg/extensions/config"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
localCtx "zotregistry.io/zot/pkg/requestcontext"
|
||||
storageTypes "zotregistry.io/zot/pkg/storage/types"
|
||||
"zotregistry.io/zot/pkg/test"
|
||||
|
@ -1434,7 +1434,7 @@ func TestRoutes(t *testing.T) {
|
|||
request, _ := http.NewRequestWithContext(ctx, http.MethodPost, baseURL, bytes.NewReader([]byte{}))
|
||||
response := httptest.NewRecorder()
|
||||
|
||||
extensions.CreateAPIKey(response, request, ctlr.RepoDB, ctlr.CookieStore, ctlr.Log)
|
||||
extensions.CreateAPIKey(response, request, ctlr.MetaDB, ctlr.CookieStore, ctlr.Log)
|
||||
|
||||
resp := response.Result()
|
||||
defer resp.Body.Close()
|
||||
|
@ -1451,7 +1451,7 @@ func TestRoutes(t *testing.T) {
|
|||
request, _ = http.NewRequestWithContext(ctx, http.MethodPost, baseURL, bytes.NewReader([]byte{}))
|
||||
response = httptest.NewRecorder()
|
||||
|
||||
extensions.CreateAPIKey(response, request, ctlr.RepoDB, ctlr.CookieStore, ctlr.Log)
|
||||
extensions.CreateAPIKey(response, request, ctlr.MetaDB, ctlr.CookieStore, ctlr.Log)
|
||||
|
||||
resp = response.Result()
|
||||
defer resp.Body.Close()
|
||||
|
@ -1468,8 +1468,8 @@ func TestRoutes(t *testing.T) {
|
|||
request, _ = http.NewRequestWithContext(ctx, http.MethodPost, baseURL, bytes.NewReader(reqBody))
|
||||
response = httptest.NewRecorder()
|
||||
|
||||
extensions.CreateAPIKey(response, request, mocks.RepoDBMock{
|
||||
AddUserAPIKeyFn: func(ctx context.Context, hashedKey string, apiKeyDetails *repodb.APIKeyDetails) error {
|
||||
extensions.CreateAPIKey(response, request, mocks.MetaDBMock{
|
||||
AddUserAPIKeyFn: func(ctx context.Context, hashedKey string, apiKeyDetails *mTypes.APIKeyDetails) error {
|
||||
return ErrUnexpectedError
|
||||
},
|
||||
}, ctlr.CookieStore, ctlr.Log)
|
||||
|
@ -1486,7 +1486,7 @@ func TestRoutes(t *testing.T) {
|
|||
q.Add("id", "apikeyid")
|
||||
request.URL.RawQuery = q.Encode()
|
||||
|
||||
extensions.RevokeAPIKey(response, request, mocks.RepoDBMock{
|
||||
extensions.RevokeAPIKey(response, request, mocks.MetaDBMock{
|
||||
DeleteUserAPIKeyFn: func(ctx context.Context, id string) error {
|
||||
return ErrUnexpectedError
|
||||
},
|
||||
|
|
|
@ -35,7 +35,7 @@ import (
|
|||
cveinfo "zotregistry.io/zot/pkg/extensions/search/cve"
|
||||
cvemodel "zotregistry.io/zot/pkg/extensions/search/cve/model"
|
||||
"zotregistry.io/zot/pkg/log"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
"zotregistry.io/zot/pkg/storage"
|
||||
"zotregistry.io/zot/pkg/storage/local"
|
||||
"zotregistry.io/zot/pkg/test"
|
||||
|
@ -527,7 +527,7 @@ func TestNegativeServerResponse(t *testing.T) {
|
|||
panic(err)
|
||||
}
|
||||
|
||||
ctlr.CveInfo = getMockCveInfo(ctlr.RepoDB, ctlr.Log)
|
||||
ctlr.CveInfo = getMockCveInfo(ctlr.MetaDB, ctlr.Log)
|
||||
|
||||
go func() {
|
||||
if err := ctlr.Run(ctx); !errors.Is(err, http.ErrServerClosed) {
|
||||
|
@ -602,7 +602,7 @@ func TestServerCVEResponse(t *testing.T) {
|
|||
panic(err)
|
||||
}
|
||||
|
||||
ctlr.CveInfo = getMockCveInfo(ctlr.RepoDB, ctlr.Log)
|
||||
ctlr.CveInfo = getMockCveInfo(ctlr.MetaDB, ctlr.Log)
|
||||
|
||||
go func() {
|
||||
if err := ctlr.Run(ctx); !errors.Is(err, http.ErrServerClosed) {
|
||||
|
@ -1159,8 +1159,8 @@ func MockSearchCve(searchConfig searchConfig) error {
|
|||
return zotErrors.ErrInvalidFlagsCombination
|
||||
}
|
||||
|
||||
func getMockCveInfo(repoDB repodb.RepoDB, log log.Logger) cveinfo.CveInfo {
|
||||
// RepoDB loaded with initial data, mock the scanner
|
||||
func getMockCveInfo(metaDB mTypes.MetaDB, log log.Logger) cveinfo.CveInfo {
|
||||
// MetaDB loaded with initial data, mock the scanner
|
||||
severities := map[string]int{
|
||||
"UNKNOWN": 0,
|
||||
"LOW": 1,
|
||||
|
@ -1219,7 +1219,7 @@ func getMockCveInfo(repoDB repodb.RepoDB, log log.Logger) cveinfo.CveInfo {
|
|||
imageDir := repo
|
||||
inputTag := reference
|
||||
|
||||
repoMeta, err := repoDB.GetRepoMeta(imageDir)
|
||||
repoMeta, err := metaDB.GetRepoMeta(imageDir)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
@ -1242,7 +1242,7 @@ func getMockCveInfo(repoDB repodb.RepoDB, log log.Logger) cveinfo.CveInfo {
|
|||
return false, err
|
||||
}
|
||||
|
||||
manifestData, err := repoDB.GetManifestData(manifestDigest)
|
||||
manifestData, err := metaDB.GetManifestData(manifestDigest)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
@ -1272,7 +1272,7 @@ func getMockCveInfo(repoDB repodb.RepoDB, log log.Logger) cveinfo.CveInfo {
|
|||
return &cveinfo.BaseCveInfo{
|
||||
Log: log,
|
||||
Scanner: scanner,
|
||||
RepoDB: repoDB,
|
||||
MetaDB: metaDB,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -22,10 +22,10 @@ import (
|
|||
"zotregistry.io/zot/pkg/api/constants"
|
||||
zcommon "zotregistry.io/zot/pkg/common"
|
||||
"zotregistry.io/zot/pkg/log"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
)
|
||||
|
||||
func SetupAPIKeyRoutes(config *config.Config, router *mux.Router, repoDB repodb.RepoDB,
|
||||
func SetupAPIKeyRoutes(config *config.Config, router *mux.Router, metaDB mTypes.MetaDB,
|
||||
cookieStore sessions.Store, log log.Logger,
|
||||
) {
|
||||
if config.Extensions.APIKey != nil && *config.Extensions.APIKey.Enable {
|
||||
|
@ -36,7 +36,7 @@ func SetupAPIKeyRoutes(config *config.Config, router *mux.Router, repoDB repodb.
|
|||
apiKeyRouter := router.PathPrefix(constants.ExtAPIKey).Subrouter()
|
||||
apiKeyRouter.Use(zcommon.ACHeadersHandler(allowedMethods...))
|
||||
apiKeyRouter.Use(zcommon.AddExtensionSecurityHeaders())
|
||||
apiKeyRouter.Methods(allowedMethods...).Handler(HandleAPIKeyRequest(repoDB, cookieStore, log))
|
||||
apiKeyRouter.Methods(allowedMethods...).Handler(HandleAPIKeyRequest(metaDB, cookieStore, log))
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -45,17 +45,17 @@ type APIKeyPayload struct { //nolint:revive
|
|||
Scopes []string `json:"scopes"`
|
||||
}
|
||||
|
||||
func HandleAPIKeyRequest(repoDB repodb.RepoDB, cookieStore sessions.Store,
|
||||
func HandleAPIKeyRequest(metaDB mTypes.MetaDB, cookieStore sessions.Store,
|
||||
log log.Logger,
|
||||
) http.Handler {
|
||||
return http.HandlerFunc(func(resp http.ResponseWriter, req *http.Request) {
|
||||
switch req.Method {
|
||||
case http.MethodPost:
|
||||
CreateAPIKey(resp, req, repoDB, cookieStore, log) //nolint:contextcheck
|
||||
CreateAPIKey(resp, req, metaDB, cookieStore, log) //nolint:contextcheck
|
||||
|
||||
return
|
||||
case http.MethodDelete:
|
||||
RevokeAPIKey(resp, req, repoDB, cookieStore, log) //nolint:contextcheck
|
||||
RevokeAPIKey(resp, req, metaDB, cookieStore, log) //nolint:contextcheck
|
||||
|
||||
return
|
||||
}
|
||||
|
@ -71,7 +71,7 @@ func HandleAPIKeyRequest(repoDB repodb.RepoDB, cookieStore sessions.Store,
|
|||
// @Failure 401 {string} string "unauthorized"
|
||||
// @Failure 500 {string} string "internal server error"
|
||||
// @Router /v2/_zot/ext/apikey [post].
|
||||
func CreateAPIKey(resp http.ResponseWriter, req *http.Request, repoDB repodb.RepoDB,
|
||||
func CreateAPIKey(resp http.ResponseWriter, req *http.Request, metaDB mTypes.MetaDB,
|
||||
cookieStore sessions.Store, log log.Logger,
|
||||
) {
|
||||
var payload APIKeyPayload
|
||||
|
@ -113,7 +113,7 @@ func CreateAPIKey(resp http.ResponseWriter, req *http.Request, repoDB repodb.Rep
|
|||
return
|
||||
}
|
||||
|
||||
apiKeyDetails := &repodb.APIKeyDetails{
|
||||
apiKeyDetails := &mTypes.APIKeyDetails{
|
||||
CreatedAt: time.Now(),
|
||||
LastUsed: time.Now(),
|
||||
CreatorUA: req.UserAgent(),
|
||||
|
@ -123,7 +123,7 @@ func CreateAPIKey(resp http.ResponseWriter, req *http.Request, repoDB repodb.Rep
|
|||
UUID: apiKeyID.String(),
|
||||
}
|
||||
|
||||
err = repoDB.AddUserAPIKey(req.Context(), hashedAPIKey, apiKeyDetails)
|
||||
err = metaDB.AddUserAPIKey(req.Context(), hashedAPIKey, apiKeyDetails)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("error storing API key")
|
||||
resp.WriteHeader(http.StatusInternalServerError)
|
||||
|
@ -132,7 +132,7 @@ func CreateAPIKey(resp http.ResponseWriter, req *http.Request, repoDB repodb.Rep
|
|||
}
|
||||
|
||||
apiKeyResponse := struct {
|
||||
repodb.APIKeyDetails
|
||||
mTypes.APIKeyDetails
|
||||
APIKey string `json:"apiKey"`
|
||||
}{
|
||||
APIKey: fmt.Sprintf("%s%s", constants.APIKeysPrefix, apiKey),
|
||||
|
@ -166,7 +166,7 @@ func CreateAPIKey(resp http.ResponseWriter, req *http.Request, repoDB repodb.Rep
|
|||
// @Failure 401 {string} string "unauthorized"
|
||||
// @Failure 400 {string} string "bad request"
|
||||
// @Router /v2/_zot/ext/apikey?id=UUID [delete].
|
||||
func RevokeAPIKey(resp http.ResponseWriter, req *http.Request, repoDB repodb.RepoDB,
|
||||
func RevokeAPIKey(resp http.ResponseWriter, req *http.Request, metaDB mTypes.MetaDB,
|
||||
cookieStore sessions.Store, log log.Logger,
|
||||
) {
|
||||
ids, ok := req.URL.Query()["id"]
|
||||
|
@ -178,7 +178,7 @@ func RevokeAPIKey(resp http.ResponseWriter, req *http.Request, repoDB repodb.Rep
|
|||
|
||||
keyID := ids[0]
|
||||
|
||||
err := repoDB.DeleteUserAPIKey(req.Context(), keyID)
|
||||
err := metaDB.DeleteUserAPIKey(req.Context(), keyID)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Str("keyID", keyID).Msg("error deleting API key")
|
||||
resp.WriteHeader(http.StatusInternalServerError)
|
||||
|
|
|
@ -9,10 +9,10 @@ import (
|
|||
|
||||
"zotregistry.io/zot/pkg/api/config"
|
||||
"zotregistry.io/zot/pkg/log"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
)
|
||||
|
||||
func SetupAPIKeyRoutes(config *config.Config, router *mux.Router, repoDB repodb.RepoDB,
|
||||
func SetupAPIKeyRoutes(config *config.Config, router *mux.Router, metaDB mTypes.MetaDB,
|
||||
cookieStore sessions.Store, log log.Logger,
|
||||
) {
|
||||
log.Warn().Msg("skipping setting up API key routes because given zot binary doesn't include this feature," +
|
||||
|
|
|
@ -20,7 +20,7 @@ import (
|
|||
"zotregistry.io/zot/pkg/api/constants"
|
||||
"zotregistry.io/zot/pkg/extensions"
|
||||
extconf "zotregistry.io/zot/pkg/extensions/config"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
localCtx "zotregistry.io/zot/pkg/requestcontext"
|
||||
"zotregistry.io/zot/pkg/test"
|
||||
"zotregistry.io/zot/pkg/test/mocks"
|
||||
|
@ -28,7 +28,7 @@ import (
|
|||
|
||||
type (
|
||||
apiKeyResponse struct {
|
||||
repodb.APIKeyDetails
|
||||
mTypes.APIKeyDetails
|
||||
APIKey string `json:"apiKey"`
|
||||
}
|
||||
)
|
||||
|
@ -209,7 +209,7 @@ func TestAPIKeys(t *testing.T) {
|
|||
So(resp.StatusCode(), ShouldEqual, http.StatusOK)
|
||||
|
||||
// trigger errors
|
||||
ctlr.RepoDB = mocks.RepoDBMock{
|
||||
ctlr.MetaDB = mocks.MetaDBMock{
|
||||
GetUserAPIKeyInfoFn: func(hashedKey string) (string, error) {
|
||||
return "", ErrUnexpectedError
|
||||
},
|
||||
|
@ -222,7 +222,7 @@ func TestAPIKeys(t *testing.T) {
|
|||
So(resp, ShouldNotBeNil)
|
||||
So(resp.StatusCode(), ShouldEqual, http.StatusInternalServerError)
|
||||
|
||||
ctlr.RepoDB = mocks.RepoDBMock{
|
||||
ctlr.MetaDB = mocks.MetaDBMock{
|
||||
GetUserAPIKeyInfoFn: func(hashedKey string) (string, error) {
|
||||
return user.Email, nil
|
||||
},
|
||||
|
@ -238,7 +238,7 @@ func TestAPIKeys(t *testing.T) {
|
|||
So(resp, ShouldNotBeNil)
|
||||
So(resp.StatusCode(), ShouldEqual, http.StatusInternalServerError)
|
||||
|
||||
ctlr.RepoDB = mocks.RepoDBMock{
|
||||
ctlr.MetaDB = mocks.MetaDBMock{
|
||||
GetUserAPIKeyInfoFn: func(hashedKey string) (string, error) {
|
||||
return user.Email, nil
|
||||
},
|
||||
|
@ -361,7 +361,7 @@ func TestAPIKeys(t *testing.T) {
|
|||
|
||||
ctx := context.WithValue(context.Background(), authzCtxKey, acCtx)
|
||||
|
||||
err = ctlr.RepoDB.DeleteUserData(ctx)
|
||||
err = ctlr.MetaDB.DeleteUserData(ctx)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
resp, err = client.R().
|
||||
|
|
|
@ -17,8 +17,8 @@ import (
|
|||
"zotregistry.io/zot/pkg/api/constants"
|
||||
zcommon "zotregistry.io/zot/pkg/common"
|
||||
"zotregistry.io/zot/pkg/log"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
"zotregistry.io/zot/pkg/meta/signatures"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
"zotregistry.io/zot/pkg/scheduler"
|
||||
)
|
||||
|
||||
|
@ -243,21 +243,21 @@ func HandleCertificatesAndPublicKeysUploads(response http.ResponseWriter, reques
|
|||
}
|
||||
|
||||
func EnablePeriodicSignaturesVerification(config *config.Config, taskScheduler *scheduler.Scheduler,
|
||||
repoDB repodb.RepoDB, log log.Logger,
|
||||
metaDB mTypes.MetaDB, log log.Logger,
|
||||
) {
|
||||
if config.Extensions.Search != nil && *config.Extensions.Search.Enable {
|
||||
ctx := context.Background()
|
||||
|
||||
repos, err := repoDB.GetMultipleRepoMeta(ctx, func(repoMeta repodb.RepoMetadata) bool {
|
||||
repos, err := metaDB.GetMultipleRepoMeta(ctx, func(repoMeta mTypes.RepoMetadata) bool {
|
||||
return true
|
||||
}, repodb.PageInput{})
|
||||
}, mTypes.PageInput{})
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
generator := &taskGeneratorSigValidity{
|
||||
repos: repos,
|
||||
repoDB: repoDB,
|
||||
metaDB: metaDB,
|
||||
repoIndex: -1,
|
||||
log: log,
|
||||
}
|
||||
|
@ -269,8 +269,8 @@ func EnablePeriodicSignaturesVerification(config *config.Config, taskScheduler *
|
|||
}
|
||||
|
||||
type taskGeneratorSigValidity struct {
|
||||
repos []repodb.RepoMetadata
|
||||
repoDB repodb.RepoDB
|
||||
repos []mTypes.RepoMetadata
|
||||
metaDB mTypes.MetaDB
|
||||
repoIndex int
|
||||
done bool
|
||||
log log.Logger
|
||||
|
@ -285,7 +285,7 @@ func (gen *taskGeneratorSigValidity) Next() (scheduler.Task, error) {
|
|||
return nil, nil
|
||||
}
|
||||
|
||||
return NewValidityTask(gen.repoDB, gen.repos[gen.repoIndex], gen.log), nil
|
||||
return NewValidityTask(gen.metaDB, gen.repos[gen.repoIndex], gen.log), nil
|
||||
}
|
||||
|
||||
func (gen *taskGeneratorSigValidity) IsDone() bool {
|
||||
|
@ -297,9 +297,9 @@ func (gen *taskGeneratorSigValidity) Reset() {
|
|||
gen.repoIndex = -1
|
||||
ctx := context.Background()
|
||||
|
||||
repos, err := gen.repoDB.GetMultipleRepoMeta(ctx, func(repoMeta repodb.RepoMetadata) bool {
|
||||
repos, err := gen.metaDB.GetMultipleRepoMeta(ctx, func(repoMeta mTypes.RepoMetadata) bool {
|
||||
return true
|
||||
}, repodb.PageInput{})
|
||||
}, mTypes.PageInput{})
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
@ -308,13 +308,13 @@ func (gen *taskGeneratorSigValidity) Reset() {
|
|||
}
|
||||
|
||||
type validityTask struct {
|
||||
repoDB repodb.RepoDB
|
||||
repo repodb.RepoMetadata
|
||||
metaDB mTypes.MetaDB
|
||||
repo mTypes.RepoMetadata
|
||||
log log.Logger
|
||||
}
|
||||
|
||||
func NewValidityTask(repoDB repodb.RepoDB, repo repodb.RepoMetadata, log log.Logger) *validityTask {
|
||||
return &validityTask{repoDB, repo, log}
|
||||
func NewValidityTask(metaDB mTypes.MetaDB, repo mTypes.RepoMetadata, log log.Logger) *validityTask {
|
||||
return &validityTask{metaDB, repo, log}
|
||||
}
|
||||
|
||||
func (validityT *validityTask) DoWork() error {
|
||||
|
@ -322,7 +322,7 @@ func (validityT *validityTask) DoWork() error {
|
|||
|
||||
for signedManifest, sigs := range validityT.repo.Signatures {
|
||||
if len(sigs[signatures.CosignSignature]) != 0 || len(sigs[signatures.NotationSignature]) != 0 {
|
||||
err := validityT.repoDB.UpdateSignaturesValidity(validityT.repo.Name, digest.Digest(signedManifest))
|
||||
err := validityT.metaDB.UpdateSignaturesValidity(validityT.repo.Name, digest.Digest(signedManifest))
|
||||
if err != nil {
|
||||
validityT.log.Info().Msg("error while verifying signatures")
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@ import (
|
|||
|
||||
"zotregistry.io/zot/pkg/api/config"
|
||||
"zotregistry.io/zot/pkg/log"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
"zotregistry.io/zot/pkg/scheduler"
|
||||
)
|
||||
|
||||
|
@ -22,7 +22,7 @@ func SetupMgmtRoutes(config *config.Config, router *mux.Router, log log.Logger)
|
|||
}
|
||||
|
||||
func EnablePeriodicSignaturesVerification(config *config.Config, taskScheduler *scheduler.Scheduler,
|
||||
repoDB repodb.RepoDB, log log.Logger,
|
||||
metaDB mTypes.MetaDB, log log.Logger,
|
||||
) {
|
||||
log.Warn().Msg("skipping adding to the scheduler a generator for updating signatures validity because " +
|
||||
"given binary doesn't include this feature, please build a binary that does so")
|
||||
|
|
|
@ -18,7 +18,7 @@ import (
|
|||
cveinfo "zotregistry.io/zot/pkg/extensions/search/cve"
|
||||
"zotregistry.io/zot/pkg/extensions/search/gql_generated"
|
||||
"zotregistry.io/zot/pkg/log"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
"zotregistry.io/zot/pkg/scheduler"
|
||||
"zotregistry.io/zot/pkg/storage"
|
||||
)
|
||||
|
@ -39,7 +39,7 @@ func IsBuiltWithSearchExtension() bool {
|
|||
}
|
||||
|
||||
func GetCVEInfo(config *config.Config, storeController storage.StoreController,
|
||||
repoDB repodb.RepoDB, log log.Logger,
|
||||
metaDB mTypes.MetaDB, log log.Logger,
|
||||
) CveInfo {
|
||||
if config.Extensions.Search == nil || !*config.Extensions.Search.Enable || config.Extensions.Search.CVE == nil {
|
||||
return nil
|
||||
|
@ -48,11 +48,11 @@ func GetCVEInfo(config *config.Config, storeController storage.StoreController,
|
|||
dbRepository := config.Extensions.Search.CVE.Trivy.DBRepository
|
||||
javaDBRepository := config.Extensions.Search.CVE.Trivy.JavaDBRepository
|
||||
|
||||
return cveinfo.NewCVEInfo(storeController, repoDB, dbRepository, javaDBRepository, log)
|
||||
return cveinfo.NewCVEInfo(storeController, metaDB, dbRepository, javaDBRepository, log)
|
||||
}
|
||||
|
||||
func EnableSearchExtension(config *config.Config, storeController storage.StoreController,
|
||||
repoDB repodb.RepoDB, taskScheduler *scheduler.Scheduler, cveInfo CveInfo, log log.Logger,
|
||||
metaDB mTypes.MetaDB, taskScheduler *scheduler.Scheduler, cveInfo CveInfo, log log.Logger,
|
||||
) {
|
||||
if config.Extensions.Search != nil && *config.Extensions.Search.Enable && config.Extensions.Search.CVE != nil {
|
||||
updateInterval := config.Extensions.Search.CVE.UpdateInterval
|
||||
|
@ -157,12 +157,12 @@ func (trivyT *trivyTask) DoWork() error {
|
|||
}
|
||||
|
||||
func SetupSearchRoutes(config *config.Config, router *mux.Router, storeController storage.StoreController,
|
||||
repoDB repodb.RepoDB, cveInfo CveInfo, log log.Logger,
|
||||
metaDB mTypes.MetaDB, cveInfo CveInfo, log log.Logger,
|
||||
) {
|
||||
log.Info().Msg("setting up search routes")
|
||||
|
||||
if config.Extensions.Search != nil && *config.Extensions.Search.Enable {
|
||||
resConfig := search.GetResolverConfig(log, storeController, repoDB, cveInfo)
|
||||
resConfig := search.GetResolverConfig(log, storeController, metaDB, cveInfo)
|
||||
|
||||
allowedMethods := zcommon.AllowedMethods(http.MethodGet, http.MethodPost)
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@ import (
|
|||
|
||||
"zotregistry.io/zot/pkg/api/config"
|
||||
"zotregistry.io/zot/pkg/log"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
"zotregistry.io/zot/pkg/scheduler"
|
||||
"zotregistry.io/zot/pkg/storage"
|
||||
)
|
||||
|
@ -16,7 +16,7 @@ import (
|
|||
type CveInfo interface{}
|
||||
|
||||
func GetCVEInfo(config *config.Config, storeController storage.StoreController,
|
||||
repoDB repodb.RepoDB, log log.Logger,
|
||||
metaDB mTypes.MetaDB, log log.Logger,
|
||||
) CveInfo {
|
||||
return nil
|
||||
}
|
||||
|
@ -27,7 +27,7 @@ func IsBuiltWithSearchExtension() bool {
|
|||
|
||||
// EnableSearchExtension ...
|
||||
func EnableSearchExtension(config *config.Config, storeController storage.StoreController,
|
||||
repoDB repodb.RepoDB, scheduler *scheduler.Scheduler, cveInfo CveInfo, log log.Logger,
|
||||
metaDB mTypes.MetaDB, scheduler *scheduler.Scheduler, cveInfo CveInfo, log log.Logger,
|
||||
) {
|
||||
log.Warn().Msg("skipping enabling search extension because given zot binary doesn't include this feature," +
|
||||
"please build a binary that does so")
|
||||
|
@ -35,7 +35,7 @@ func EnableSearchExtension(config *config.Config, storeController storage.StoreC
|
|||
|
||||
// SetupSearchRoutes ...
|
||||
func SetupSearchRoutes(config *config.Config, router *mux.Router, storeController storage.StoreController,
|
||||
repoDB repodb.RepoDB, cveInfo CveInfo, log log.Logger,
|
||||
metaDB mTypes.MetaDB, cveInfo CveInfo, log log.Logger,
|
||||
) {
|
||||
log.Warn().Msg("skipping setting up search routes because given zot binary doesn't include this feature," +
|
||||
"please build a binary that does so")
|
||||
|
|
|
@ -17,7 +17,7 @@ import (
|
|||
. "zotregistry.io/zot/pkg/extensions"
|
||||
cveinfo "zotregistry.io/zot/pkg/extensions/search/cve"
|
||||
"zotregistry.io/zot/pkg/log"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
"zotregistry.io/zot/pkg/scheduler"
|
||||
"zotregistry.io/zot/pkg/storage"
|
||||
. "zotregistry.io/zot/pkg/test"
|
||||
|
@ -40,10 +40,10 @@ func TestTrivyDBGenerator(t *testing.T) {
|
|||
cfg.Scheduler = &config.SchedulerConfig{NumWorkers: 3}
|
||||
sch := scheduler.NewScheduler(cfg, logger)
|
||||
|
||||
repoDB := &mocks.RepoDBMock{
|
||||
GetRepoMetaFn: func(repo string) (repodb.RepoMetadata, error) {
|
||||
return repodb.RepoMetadata{
|
||||
Tags: map[string]repodb.Descriptor{
|
||||
metaDB := &mocks.MetaDBMock{
|
||||
GetRepoMetaFn: func(repo string) (mTypes.RepoMetadata, error) {
|
||||
return mTypes.RepoMetadata{
|
||||
Tags: map[string]mTypes.Descriptor{
|
||||
"tag": {MediaType: ispec.MediaTypeImageIndex},
|
||||
},
|
||||
}, nil
|
||||
|
@ -57,7 +57,7 @@ func TestTrivyDBGenerator(t *testing.T) {
|
|||
},
|
||||
}
|
||||
|
||||
cveInfo := cveinfo.NewCVEInfo(storeController, repoDB, "ghcr.io/project-zot/trivy-db", "", logger)
|
||||
cveInfo := cveinfo.NewCVEInfo(storeController, metaDB, "ghcr.io/project-zot/trivy-db", "", logger)
|
||||
generator := NewTrivyTaskGenerator(time.Minute, cveInfo, logger)
|
||||
|
||||
sch.SubmitGenerator(generator, 12000*time.Millisecond, scheduler.HighPriority)
|
||||
|
|
|
@ -13,12 +13,12 @@ import (
|
|||
syncconf "zotregistry.io/zot/pkg/extensions/config/sync"
|
||||
"zotregistry.io/zot/pkg/extensions/sync"
|
||||
"zotregistry.io/zot/pkg/log"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
"zotregistry.io/zot/pkg/scheduler"
|
||||
"zotregistry.io/zot/pkg/storage"
|
||||
)
|
||||
|
||||
func EnableSyncExtension(config *config.Config, repoDB repodb.RepoDB,
|
||||
func EnableSyncExtension(config *config.Config, metaDB mTypes.MetaDB,
|
||||
storeController storage.StoreController, sch *scheduler.Scheduler, log log.Logger,
|
||||
) (*sync.BaseOnDemand, error) {
|
||||
if config.Extensions.Sync != nil && *config.Extensions.Sync.Enable {
|
||||
|
@ -43,7 +43,7 @@ func EnableSyncExtension(config *config.Config, repoDB repodb.RepoDB,
|
|||
|
||||
if isPeriodical || isOnDemand {
|
||||
service, err := sync.New(registryConfig, config.Extensions.Sync.CredentialsFile,
|
||||
storeController, repoDB, log)
|
||||
storeController, metaDB, log)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
|
|
@ -7,13 +7,13 @@ import (
|
|||
"zotregistry.io/zot/pkg/api/config"
|
||||
"zotregistry.io/zot/pkg/extensions/sync"
|
||||
"zotregistry.io/zot/pkg/log"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
"zotregistry.io/zot/pkg/scheduler"
|
||||
"zotregistry.io/zot/pkg/storage"
|
||||
)
|
||||
|
||||
// EnableSyncExtension ...
|
||||
func EnableSyncExtension(config *config.Config, repoDB repodb.RepoDB,
|
||||
func EnableSyncExtension(config *config.Config, metaDB mTypes.MetaDB,
|
||||
storeController storage.StoreController, sch *scheduler.Scheduler, log log.Logger,
|
||||
) (*sync.BaseOnDemand, error) {
|
||||
log.Warn().Msg("skipping enabling sync extension because given zot binary doesn't include this feature," +
|
||||
|
|
|
@ -14,7 +14,7 @@ import (
|
|||
"zotregistry.io/zot/pkg/api/constants"
|
||||
zcommon "zotregistry.io/zot/pkg/common"
|
||||
"zotregistry.io/zot/pkg/log"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
"zotregistry.io/zot/pkg/storage"
|
||||
)
|
||||
|
||||
|
@ -28,7 +28,7 @@ func IsBuiltWithUserPrefsExtension() bool {
|
|||
}
|
||||
|
||||
func SetupUserPreferencesRoutes(config *config.Config, router *mux.Router, storeController storage.StoreController,
|
||||
repoDB repodb.RepoDB, cveInfo CveInfo, log log.Logger,
|
||||
metaDB mTypes.MetaDB, cveInfo CveInfo, log log.Logger,
|
||||
) {
|
||||
if config.Extensions.Search != nil && *config.Extensions.Search.Enable {
|
||||
log.Info().Msg("setting up user preferences routes")
|
||||
|
@ -39,7 +39,7 @@ func SetupUserPreferencesRoutes(config *config.Config, router *mux.Router, store
|
|||
userprefsRouter.Use(zcommon.ACHeadersHandler(allowedMethods...))
|
||||
userprefsRouter.Use(zcommon.AddExtensionSecurityHeaders())
|
||||
|
||||
userprefsRouter.HandleFunc("", HandleUserPrefs(repoDB, log)).Methods(allowedMethods...)
|
||||
userprefsRouter.HandleFunc("", HandleUserPrefs(metaDB, log)).Methods(allowedMethods...)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -56,7 +56,7 @@ func SetupUserPreferencesRoutes(config *config.Config, router *mux.Router, store
|
|||
// @Failure 403 {string} string "forbidden"
|
||||
// @Failure 500 {string} string "internal server error"
|
||||
// @Failure 400 {string} string "bad request".
|
||||
func HandleUserPrefs(repoDB repodb.RepoDB, log log.Logger) func(w http.ResponseWriter, r *http.Request) {
|
||||
func HandleUserPrefs(metaDB mTypes.MetaDB, log log.Logger) func(w http.ResponseWriter, r *http.Request) {
|
||||
return func(rsp http.ResponseWriter, req *http.Request) {
|
||||
if !zcommon.QueryHasParams(req.URL.Query(), []string{"action"}) {
|
||||
rsp.WriteHeader(http.StatusBadRequest)
|
||||
|
@ -68,11 +68,11 @@ func HandleUserPrefs(repoDB repodb.RepoDB, log log.Logger) func(w http.ResponseW
|
|||
|
||||
switch action {
|
||||
case ToggleRepoBookmarkAction:
|
||||
PutBookmark(rsp, req, repoDB, log) //nolint:contextcheck
|
||||
PutBookmark(rsp, req, metaDB, log) //nolint:contextcheck
|
||||
|
||||
return
|
||||
case ToggleRepoStarAction:
|
||||
PutStar(rsp, req, repoDB, log) //nolint:contextcheck
|
||||
PutStar(rsp, req, metaDB, log) //nolint:contextcheck
|
||||
|
||||
return
|
||||
default:
|
||||
|
@ -83,7 +83,7 @@ func HandleUserPrefs(repoDB repodb.RepoDB, log log.Logger) func(w http.ResponseW
|
|||
}
|
||||
}
|
||||
|
||||
func PutStar(rsp http.ResponseWriter, req *http.Request, repoDB repodb.RepoDB, log log.Logger) {
|
||||
func PutStar(rsp http.ResponseWriter, req *http.Request, metaDB mTypes.MetaDB, log log.Logger) {
|
||||
if !zcommon.QueryHasParams(req.URL.Query(), []string{"repo"}) {
|
||||
rsp.WriteHeader(http.StatusBadRequest)
|
||||
|
||||
|
@ -98,7 +98,7 @@ func PutStar(rsp http.ResponseWriter, req *http.Request, repoDB repodb.RepoDB, l
|
|||
return
|
||||
}
|
||||
|
||||
_, err := repoDB.ToggleStarRepo(req.Context(), repo)
|
||||
_, err := metaDB.ToggleStarRepo(req.Context(), repo)
|
||||
if err != nil {
|
||||
if errors.Is(err, zerr.ErrRepoMetaNotFound) {
|
||||
rsp.WriteHeader(http.StatusNotFound)
|
||||
|
@ -118,7 +118,7 @@ func PutStar(rsp http.ResponseWriter, req *http.Request, repoDB repodb.RepoDB, l
|
|||
rsp.WriteHeader(http.StatusOK)
|
||||
}
|
||||
|
||||
func PutBookmark(rsp http.ResponseWriter, req *http.Request, repoDB repodb.RepoDB, log log.Logger) {
|
||||
func PutBookmark(rsp http.ResponseWriter, req *http.Request, metaDB mTypes.MetaDB, log log.Logger) {
|
||||
if !zcommon.QueryHasParams(req.URL.Query(), []string{"repo"}) {
|
||||
rsp.WriteHeader(http.StatusBadRequest)
|
||||
|
||||
|
@ -133,7 +133,7 @@ func PutBookmark(rsp http.ResponseWriter, req *http.Request, repoDB repodb.RepoD
|
|||
return
|
||||
}
|
||||
|
||||
_, err := repoDB.ToggleBookmarkRepo(req.Context(), repo)
|
||||
_, err := metaDB.ToggleBookmarkRepo(req.Context(), repo)
|
||||
if err != nil {
|
||||
if errors.Is(err, zerr.ErrRepoMetaNotFound) {
|
||||
rsp.WriteHeader(http.StatusNotFound)
|
||||
|
|
|
@ -8,7 +8,7 @@ import (
|
|||
|
||||
"zotregistry.io/zot/pkg/api/config"
|
||||
"zotregistry.io/zot/pkg/log"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
"zotregistry.io/zot/pkg/storage"
|
||||
)
|
||||
|
||||
|
@ -17,7 +17,7 @@ func IsBuiltWithUserPrefsExtension() bool {
|
|||
}
|
||||
|
||||
func SetupUserPreferencesRoutes(config *config.Config, router *mux.Router, storeController storage.StoreController,
|
||||
repoDB repodb.RepoDB, cveInfo CveInfo, log log.Logger,
|
||||
metaDB mTypes.MetaDB, cveInfo CveInfo, log log.Logger,
|
||||
) {
|
||||
log.Warn().Msg("userprefs extension is disabled because given zot binary doesn't" +
|
||||
"include this feature please build a binary that does so")
|
||||
|
|
|
@ -22,7 +22,7 @@ import (
|
|||
"zotregistry.io/zot/pkg/extensions"
|
||||
extconf "zotregistry.io/zot/pkg/extensions/config"
|
||||
"zotregistry.io/zot/pkg/log"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
"zotregistry.io/zot/pkg/test"
|
||||
"zotregistry.io/zot/pkg/test/mocks"
|
||||
)
|
||||
|
@ -62,18 +62,18 @@ func TestHandlers(t *testing.T) {
|
|||
const UserprefsBaseURL = "http://127.0.0.1:8080/v2/_zot/ext/userprefs"
|
||||
|
||||
log := log.NewLogger("debug", "")
|
||||
mockrepoDB := mocks.RepoDBMock{}
|
||||
mockmetaDB := mocks.MetaDBMock{}
|
||||
|
||||
Convey("No repo in request", t, func() {
|
||||
request := httptest.NewRequest(http.MethodGet, UserprefsBaseURL+"", strings.NewReader("My string"))
|
||||
response := httptest.NewRecorder()
|
||||
|
||||
extensions.PutStar(response, request, mockrepoDB, log)
|
||||
extensions.PutStar(response, request, mockmetaDB, log)
|
||||
res := response.Result()
|
||||
So(res.StatusCode, ShouldEqual, http.StatusBadRequest)
|
||||
defer res.Body.Close()
|
||||
|
||||
extensions.PutBookmark(response, request, mockrepoDB, log)
|
||||
extensions.PutBookmark(response, request, mockmetaDB, log)
|
||||
res = response.Result()
|
||||
So(res.StatusCode, ShouldEqual, http.StatusBadRequest)
|
||||
defer res.Body.Close()
|
||||
|
@ -83,12 +83,12 @@ func TestHandlers(t *testing.T) {
|
|||
request := httptest.NewRequest(http.MethodGet, UserprefsBaseURL+"?repo=", strings.NewReader("My string"))
|
||||
response := httptest.NewRecorder()
|
||||
|
||||
extensions.PutStar(response, request, mockrepoDB, log)
|
||||
extensions.PutStar(response, request, mockmetaDB, log)
|
||||
res := response.Result()
|
||||
So(res.StatusCode, ShouldEqual, http.StatusNotFound)
|
||||
defer res.Body.Close()
|
||||
|
||||
extensions.PutBookmark(response, request, mockrepoDB, log)
|
||||
extensions.PutBookmark(response, request, mockmetaDB, log)
|
||||
res = response.Result()
|
||||
So(res.StatusCode, ShouldEqual, http.StatusNotFound)
|
||||
defer res.Body.Close()
|
||||
|
@ -99,22 +99,22 @@ func TestHandlers(t *testing.T) {
|
|||
strings.NewReader("My string"))
|
||||
|
||||
Convey("ErrRepoMetaNotFound", func() {
|
||||
mockrepoDB.ToggleStarRepoFn = func(ctx context.Context, repo string) (repodb.ToggleState, error) {
|
||||
return repodb.NotChanged, zerr.ErrRepoMetaNotFound
|
||||
mockmetaDB.ToggleStarRepoFn = func(ctx context.Context, repo string) (mTypes.ToggleState, error) {
|
||||
return mTypes.NotChanged, zerr.ErrRepoMetaNotFound
|
||||
}
|
||||
|
||||
mockrepoDB.ToggleBookmarkRepoFn = func(ctx context.Context, repo string) (repodb.ToggleState, error) {
|
||||
return repodb.NotChanged, zerr.ErrRepoMetaNotFound
|
||||
mockmetaDB.ToggleBookmarkRepoFn = func(ctx context.Context, repo string) (mTypes.ToggleState, error) {
|
||||
return mTypes.NotChanged, zerr.ErrRepoMetaNotFound
|
||||
}
|
||||
|
||||
response := httptest.NewRecorder()
|
||||
extensions.PutBookmark(response, request, mockrepoDB, log)
|
||||
extensions.PutBookmark(response, request, mockmetaDB, log)
|
||||
res := response.Result()
|
||||
So(res.StatusCode, ShouldEqual, http.StatusNotFound)
|
||||
defer res.Body.Close()
|
||||
|
||||
response = httptest.NewRecorder()
|
||||
extensions.PutStar(response, request, mockrepoDB, log)
|
||||
extensions.PutStar(response, request, mockmetaDB, log)
|
||||
res = response.Result()
|
||||
So(res.StatusCode, ShouldEqual, http.StatusNotFound)
|
||||
defer res.Body.Close()
|
||||
|
@ -125,22 +125,22 @@ func TestHandlers(t *testing.T) {
|
|||
"name": "repo",
|
||||
})
|
||||
|
||||
mockrepoDB.ToggleBookmarkRepoFn = func(ctx context.Context, repo string) (repodb.ToggleState, error) {
|
||||
return repodb.NotChanged, zerr.ErrUserDataNotAllowed
|
||||
mockmetaDB.ToggleBookmarkRepoFn = func(ctx context.Context, repo string) (mTypes.ToggleState, error) {
|
||||
return mTypes.NotChanged, zerr.ErrUserDataNotAllowed
|
||||
}
|
||||
|
||||
mockrepoDB.ToggleStarRepoFn = func(ctx context.Context, repo string) (repodb.ToggleState, error) {
|
||||
return repodb.NotChanged, zerr.ErrUserDataNotAllowed
|
||||
mockmetaDB.ToggleStarRepoFn = func(ctx context.Context, repo string) (mTypes.ToggleState, error) {
|
||||
return mTypes.NotChanged, zerr.ErrUserDataNotAllowed
|
||||
}
|
||||
|
||||
response := httptest.NewRecorder()
|
||||
extensions.PutBookmark(response, request, mockrepoDB, log)
|
||||
extensions.PutBookmark(response, request, mockmetaDB, log)
|
||||
res := response.Result()
|
||||
So(res.StatusCode, ShouldEqual, http.StatusForbidden)
|
||||
defer res.Body.Close()
|
||||
|
||||
response = httptest.NewRecorder()
|
||||
extensions.PutStar(response, request, mockrepoDB, log)
|
||||
extensions.PutStar(response, request, mockmetaDB, log)
|
||||
res = response.Result()
|
||||
So(res.StatusCode, ShouldEqual, http.StatusForbidden)
|
||||
defer res.Body.Close()
|
||||
|
@ -151,21 +151,21 @@ func TestHandlers(t *testing.T) {
|
|||
"name": "repo",
|
||||
})
|
||||
|
||||
mockrepoDB.ToggleBookmarkRepoFn = func(ctx context.Context, repo string) (repodb.ToggleState, error) {
|
||||
return repodb.NotChanged, ErrTestError
|
||||
mockmetaDB.ToggleBookmarkRepoFn = func(ctx context.Context, repo string) (mTypes.ToggleState, error) {
|
||||
return mTypes.NotChanged, ErrTestError
|
||||
}
|
||||
|
||||
mockrepoDB.ToggleStarRepoFn = func(ctx context.Context, repo string) (repodb.ToggleState, error) {
|
||||
return repodb.NotChanged, ErrTestError
|
||||
mockmetaDB.ToggleStarRepoFn = func(ctx context.Context, repo string) (mTypes.ToggleState, error) {
|
||||
return mTypes.NotChanged, ErrTestError
|
||||
}
|
||||
response := httptest.NewRecorder()
|
||||
extensions.PutBookmark(response, request, mockrepoDB, log)
|
||||
extensions.PutBookmark(response, request, mockmetaDB, log)
|
||||
res := response.Result()
|
||||
So(res.StatusCode, ShouldEqual, http.StatusInternalServerError)
|
||||
defer res.Body.Close()
|
||||
|
||||
response = httptest.NewRecorder()
|
||||
extensions.PutStar(response, request, mockrepoDB, log)
|
||||
extensions.PutStar(response, request, mockmetaDB, log)
|
||||
res = response.Result()
|
||||
So(res.StatusCode, ShouldEqual, http.StatusInternalServerError)
|
||||
defer res.Body.Close()
|
||||
|
|
|
@ -16,9 +16,8 @@ import (
|
|||
cvemodel "zotregistry.io/zot/pkg/extensions/search/cve/model"
|
||||
"zotregistry.io/zot/pkg/extensions/search/gql_generated"
|
||||
"zotregistry.io/zot/pkg/log"
|
||||
"zotregistry.io/zot/pkg/meta/bolt"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
boltdb_wrapper "zotregistry.io/zot/pkg/meta/repodb/boltdb-wrapper"
|
||||
"zotregistry.io/zot/pkg/meta/boltdb"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
"zotregistry.io/zot/pkg/test/mocks"
|
||||
)
|
||||
|
||||
|
@ -26,13 +25,13 @@ var ErrTestError = errors.New("TestError")
|
|||
|
||||
func TestConvertErrors(t *testing.T) {
|
||||
Convey("Convert Errors", t, func() {
|
||||
params := bolt.DBParameters{
|
||||
params := boltdb.DBParameters{
|
||||
RootDir: t.TempDir(),
|
||||
}
|
||||
boltDB, err := bolt.GetBoltDriver(params)
|
||||
boltDB, err := boltdb.GetBoltDriver(params)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
repoDB, err := boltdb_wrapper.NewBoltDBWrapper(boltDB, log.NewLogger("debug", ""))
|
||||
metaDB, err := boltdb.New(boltDB, log.NewLogger("debug", ""))
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
configBlob, err := json.Marshal(ispec.Image{})
|
||||
|
@ -49,19 +48,19 @@ func TestConvertErrors(t *testing.T) {
|
|||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
repoMeta11 := repodb.ManifestMetadata{
|
||||
repoMeta11 := mTypes.ManifestMetadata{
|
||||
ManifestBlob: manifestBlob,
|
||||
ConfigBlob: configBlob,
|
||||
}
|
||||
|
||||
digest11 := godigest.FromString("abc1")
|
||||
err = repoDB.SetManifestMeta("repo1", digest11, repoMeta11)
|
||||
err = metaDB.SetManifestMeta("repo1", digest11, repoMeta11)
|
||||
So(err, ShouldBeNil)
|
||||
err = repoDB.SetRepoReference("repo1", "0.1.0", digest11, ispec.MediaTypeImageManifest)
|
||||
err = metaDB.SetRepoReference("repo1", "0.1.0", digest11, ispec.MediaTypeImageManifest)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
repoMetas, manifestMetaMap, _, _, err := repoDB.SearchRepos(context.Background(), "", repodb.Filter{},
|
||||
repodb.PageInput{})
|
||||
repoMetas, manifestMetaMap, _, _, err := metaDB.SearchRepos(context.Background(), "", mTypes.Filter{},
|
||||
mTypes.PageInput{})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
ctx := graphql.WithResponseContext(context.Background(),
|
||||
|
@ -71,7 +70,7 @@ func TestConvertErrors(t *testing.T) {
|
|||
ctx,
|
||||
repoMetas[0],
|
||||
manifestMetaMap,
|
||||
map[string]repodb.IndexData{},
|
||||
map[string]mTypes.IndexData{},
|
||||
convert.SkipQGLField{},
|
||||
mocks.CveInfoMock{
|
||||
GetCVESummaryForImageMediaFn: func(repo string, digest, mediaType string,
|
||||
|
@ -94,11 +93,11 @@ func TestConvertErrors(t *testing.T) {
|
|||
"tag",
|
||||
godigest.FromString("indexDigest"),
|
||||
true,
|
||||
repodb.RepoMetadata{},
|
||||
repodb.IndexData{
|
||||
mTypes.RepoMetadata{},
|
||||
mTypes.IndexData{
|
||||
IndexBlob: []byte("bad json"),
|
||||
},
|
||||
map[string]repodb.ManifestMetadata{},
|
||||
map[string]mTypes.ManifestMetadata{},
|
||||
mocks.CveInfoMock{},
|
||||
)
|
||||
So(err, ShouldNotBeNil)
|
||||
|
@ -114,11 +113,11 @@ func TestConvertErrors(t *testing.T) {
|
|||
"tag",
|
||||
godigest.FromString("indexDigest"),
|
||||
false,
|
||||
repodb.RepoMetadata{},
|
||||
repodb.IndexData{
|
||||
mTypes.RepoMetadata{},
|
||||
mTypes.IndexData{
|
||||
IndexBlob: []byte("{}"),
|
||||
},
|
||||
map[string]repodb.ManifestMetadata{},
|
||||
map[string]mTypes.ManifestMetadata{},
|
||||
mocks.CveInfoMock{
|
||||
GetCVESummaryForImageMediaFn: func(repo, digest, mediaType string) (cvemodel.ImageCVESummary, error) {
|
||||
return cvemodel.ImageCVESummary{}, ErrTestError
|
||||
|
@ -146,8 +145,8 @@ func TestConvertErrors(t *testing.T) {
|
|||
"tag",
|
||||
godigest.FromString("manifestDigest"),
|
||||
false,
|
||||
repodb.RepoMetadata{},
|
||||
repodb.ManifestMetadata{
|
||||
mTypes.RepoMetadata{},
|
||||
mTypes.ManifestMetadata{
|
||||
ManifestBlob: []byte("{}"),
|
||||
ConfigBlob: configBlob,
|
||||
},
|
||||
|
@ -174,13 +173,13 @@ func TestConvertErrors(t *testing.T) {
|
|||
MediaType: ispec.MediaTypeImageManifest,
|
||||
},
|
||||
false,
|
||||
repodb.RepoMetadata{
|
||||
Tags: map[string]repodb.Descriptor{},
|
||||
Statistics: map[string]repodb.DescriptorStatistics{},
|
||||
Signatures: map[string]repodb.ManifestSignatures{},
|
||||
Referrers: map[string][]repodb.ReferrerInfo{},
|
||||
mTypes.RepoMetadata{
|
||||
Tags: map[string]mTypes.Descriptor{},
|
||||
Statistics: map[string]mTypes.DescriptorStatistics{},
|
||||
Signatures: map[string]mTypes.ManifestSignatures{},
|
||||
Referrers: map[string][]mTypes.ReferrerInfo{},
|
||||
},
|
||||
repodb.ManifestMetadata{
|
||||
mTypes.ManifestMetadata{
|
||||
ManifestBlob: []byte(`{}`),
|
||||
ConfigBlob: []byte("bad json"),
|
||||
},
|
||||
|
@ -208,13 +207,13 @@ func TestConvertErrors(t *testing.T) {
|
|||
MediaType: ispec.MediaTypeImageManifest,
|
||||
},
|
||||
false,
|
||||
repodb.RepoMetadata{
|
||||
Tags: map[string]repodb.Descriptor{},
|
||||
Statistics: map[string]repodb.DescriptorStatistics{},
|
||||
Signatures: map[string]repodb.ManifestSignatures{"dig": {"cosine": []repodb.SignatureInfo{{}}}},
|
||||
Referrers: map[string][]repodb.ReferrerInfo{},
|
||||
mTypes.RepoMetadata{
|
||||
Tags: map[string]mTypes.Descriptor{},
|
||||
Statistics: map[string]mTypes.DescriptorStatistics{},
|
||||
Signatures: map[string]mTypes.ManifestSignatures{"dig": {"cosine": []mTypes.SignatureInfo{{}}}},
|
||||
Referrers: map[string][]mTypes.ReferrerInfo{},
|
||||
},
|
||||
repodb.ManifestMetadata{
|
||||
mTypes.ManifestMetadata{
|
||||
ManifestBlob: []byte("{}"),
|
||||
ConfigBlob: configBlob,
|
||||
},
|
||||
|
@ -235,18 +234,18 @@ func TestConvertErrors(t *testing.T) {
|
|||
// with bad config json, error while unmarshaling
|
||||
_, imageSummaries := convert.RepoMeta2ExpandedRepoInfo(
|
||||
ctx,
|
||||
repodb.RepoMetadata{
|
||||
Tags: map[string]repodb.Descriptor{
|
||||
mTypes.RepoMetadata{
|
||||
Tags: map[string]mTypes.Descriptor{
|
||||
"tag1": {Digest: "dig", MediaType: ispec.MediaTypeImageManifest},
|
||||
},
|
||||
},
|
||||
map[string]repodb.ManifestMetadata{
|
||||
map[string]mTypes.ManifestMetadata{
|
||||
"dig": {
|
||||
ManifestBlob: []byte("{}"),
|
||||
ConfigBlob: []byte("bad json"),
|
||||
},
|
||||
},
|
||||
map[string]repodb.IndexData{},
|
||||
map[string]mTypes.IndexData{},
|
||||
convert.SkipQGLField{
|
||||
Vulnerabilities: false,
|
||||
},
|
||||
|
@ -261,18 +260,18 @@ func TestConvertErrors(t *testing.T) {
|
|||
// cveInfo present no error
|
||||
_, imageSummaries = convert.RepoMeta2ExpandedRepoInfo(
|
||||
ctx,
|
||||
repodb.RepoMetadata{
|
||||
Tags: map[string]repodb.Descriptor{
|
||||
mTypes.RepoMetadata{
|
||||
Tags: map[string]mTypes.Descriptor{
|
||||
"tag1": {Digest: "dig", MediaType: ispec.MediaTypeImageManifest},
|
||||
},
|
||||
},
|
||||
map[string]repodb.ManifestMetadata{
|
||||
map[string]mTypes.ManifestMetadata{
|
||||
"dig": {
|
||||
ManifestBlob: []byte("{}"),
|
||||
ConfigBlob: []byte("{}"),
|
||||
},
|
||||
},
|
||||
map[string]repodb.IndexData{},
|
||||
map[string]mTypes.IndexData{},
|
||||
convert.SkipQGLField{
|
||||
Vulnerabilities: false,
|
||||
},
|
||||
|
@ -379,9 +378,9 @@ func TestLabels(t *testing.T) {
|
|||
func TestGetSignaturesInfo(t *testing.T) {
|
||||
Convey("Test get signatures info - cosign", t, func() {
|
||||
indexDigest := godigest.FromString("123")
|
||||
repoMeta := repodb.RepoMetadata{
|
||||
Signatures: map[string]repodb.ManifestSignatures{string(indexDigest): {"cosign": []repodb.SignatureInfo{{
|
||||
LayersInfo: []repodb.LayerInfo{{LayerContent: []byte{}, LayerDigest: "", SignatureKey: "", Signer: "author"}},
|
||||
repoMeta := mTypes.RepoMetadata{
|
||||
Signatures: map[string]mTypes.ManifestSignatures{string(indexDigest): {"cosign": []mTypes.SignatureInfo{{
|
||||
LayersInfo: []mTypes.LayerInfo{{LayerContent: []byte{}, LayerDigest: "", SignatureKey: "", Signer: "author"}},
|
||||
}}}},
|
||||
}
|
||||
|
||||
|
@ -394,9 +393,9 @@ func TestGetSignaturesInfo(t *testing.T) {
|
|||
|
||||
Convey("Test get signatures info - notation", t, func() {
|
||||
indexDigest := godigest.FromString("123")
|
||||
repoMeta := repodb.RepoMetadata{
|
||||
Signatures: map[string]repodb.ManifestSignatures{string(indexDigest): {"notation": []repodb.SignatureInfo{{
|
||||
LayersInfo: []repodb.LayerInfo{
|
||||
repoMeta := mTypes.RepoMetadata{
|
||||
Signatures: map[string]mTypes.ManifestSignatures{string(indexDigest): {"notation": []mTypes.SignatureInfo{{
|
||||
LayersInfo: []mTypes.LayerInfo{
|
||||
{
|
||||
LayerContent: []byte{},
|
||||
LayerDigest: "",
|
||||
|
|
|
@ -20,15 +20,15 @@ import (
|
|||
cvemodel "zotregistry.io/zot/pkg/extensions/search/cve/model"
|
||||
"zotregistry.io/zot/pkg/extensions/search/gql_generated"
|
||||
"zotregistry.io/zot/pkg/log"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
)
|
||||
|
||||
type SkipQGLField struct {
|
||||
Vulnerabilities bool
|
||||
}
|
||||
|
||||
func RepoMeta2RepoSummary(ctx context.Context, repoMeta repodb.RepoMetadata,
|
||||
manifestMetaMap map[string]repodb.ManifestMetadata, indexDataMap map[string]repodb.IndexData,
|
||||
func RepoMeta2RepoSummary(ctx context.Context, repoMeta mTypes.RepoMetadata,
|
||||
manifestMetaMap map[string]mTypes.ManifestMetadata, indexDataMap map[string]mTypes.IndexData,
|
||||
skip SkipQGLField, cveInfo cveinfo.CveInfo,
|
||||
) *gql_generated.RepoSummary {
|
||||
var (
|
||||
|
@ -154,9 +154,9 @@ func UpdateLastUpdatedTimestamp(repoLastUpdatedTimestamp *time.Time,
|
|||
return newLastUpdatedImageSummary
|
||||
}
|
||||
|
||||
func Descriptor2ImageSummary(ctx context.Context, descriptor repodb.Descriptor, repo, tag string, skipCVE bool,
|
||||
repoMeta repodb.RepoMetadata, manifestMetaMap map[string]repodb.ManifestMetadata,
|
||||
indexDataMap map[string]repodb.IndexData, cveInfo cveinfo.CveInfo,
|
||||
func Descriptor2ImageSummary(ctx context.Context, descriptor mTypes.Descriptor, repo, tag string, skipCVE bool,
|
||||
repoMeta mTypes.RepoMetadata, manifestMetaMap map[string]mTypes.ManifestMetadata,
|
||||
indexDataMap map[string]mTypes.IndexData, cveInfo cveinfo.CveInfo,
|
||||
) (*gql_generated.ImageSummary, map[string]int64, error) {
|
||||
switch descriptor.MediaType {
|
||||
case ispec.MediaTypeImageManifest:
|
||||
|
@ -171,7 +171,7 @@ func Descriptor2ImageSummary(ctx context.Context, descriptor repodb.Descriptor,
|
|||
}
|
||||
|
||||
func ImageIndex2ImageSummary(ctx context.Context, repo, tag string, indexDigest godigest.Digest, skipCVE bool,
|
||||
repoMeta repodb.RepoMetadata, indexData repodb.IndexData, manifestMetaMap map[string]repodb.ManifestMetadata,
|
||||
repoMeta mTypes.RepoMetadata, indexData mTypes.IndexData, manifestMetaMap map[string]mTypes.ManifestMetadata,
|
||||
cveInfo cveinfo.CveInfo,
|
||||
) (*gql_generated.ImageSummary, map[string]int64, error) {
|
||||
var indexContent ispec.Index
|
||||
|
@ -276,7 +276,7 @@ func ImageIndex2ImageSummary(ctx context.Context, repo, tag string, indexDigest
|
|||
}
|
||||
|
||||
func ImageManifest2ImageSummary(ctx context.Context, repo, tag string, digest godigest.Digest, skipCVE bool,
|
||||
repoMeta repodb.RepoMetadata, manifestMeta repodb.ManifestMetadata, cveInfo cveinfo.CveInfo,
|
||||
repoMeta mTypes.RepoMetadata, manifestMeta mTypes.ManifestMetadata, cveInfo cveinfo.CveInfo,
|
||||
) (*gql_generated.ImageSummary, map[string]int64, error) {
|
||||
var (
|
||||
manifestContent ispec.Manifest
|
||||
|
@ -409,7 +409,7 @@ func ImageManifest2ImageSummary(ctx context.Context, repo, tag string, digest go
|
|||
return &imageSummary, imageBlobsMap, nil
|
||||
}
|
||||
|
||||
func getReferrers(referrersInfo []repodb.ReferrerInfo) []*gql_generated.Referrer {
|
||||
func getReferrers(referrersInfo []mTypes.ReferrerInfo) []*gql_generated.Referrer {
|
||||
referrers := make([]*gql_generated.Referrer, 0, len(referrersInfo))
|
||||
|
||||
for _, referrerInfo := range referrersInfo {
|
||||
|
@ -444,8 +444,8 @@ func getAnnotationsFromMap(annotationsMap map[string]string) []*gql_generated.An
|
|||
}
|
||||
|
||||
func ImageManifest2ManifestSummary(ctx context.Context, repo, tag string, descriptor ispec.Descriptor,
|
||||
skipCVE bool, repoMeta repodb.RepoMetadata, manifestMeta repodb.ManifestMetadata, referrersInfo []repodb.ReferrerInfo,
|
||||
cveInfo cveinfo.CveInfo,
|
||||
skipCVE bool, repoMeta mTypes.RepoMetadata, manifestMeta mTypes.ManifestMetadata,
|
||||
referrersInfo []mTypes.ReferrerInfo, cveInfo cveinfo.CveInfo,
|
||||
) (*gql_generated.ManifestSummary, map[string]int64, error) {
|
||||
var (
|
||||
manifestContent ispec.Manifest
|
||||
|
@ -567,8 +567,8 @@ func getImageBlobsInfo(manifestDigest string, manifestSize int64, configDigest s
|
|||
return imageSize, imageBlobsMap
|
||||
}
|
||||
|
||||
func RepoMeta2ImageSummaries(ctx context.Context, repoMeta repodb.RepoMetadata,
|
||||
manifestMetaMap map[string]repodb.ManifestMetadata, indexDataMap map[string]repodb.IndexData,
|
||||
func RepoMeta2ImageSummaries(ctx context.Context, repoMeta mTypes.RepoMetadata,
|
||||
manifestMetaMap map[string]mTypes.ManifestMetadata, indexDataMap map[string]mTypes.IndexData,
|
||||
skip SkipQGLField, cveInfo cveinfo.CveInfo,
|
||||
) []*gql_generated.ImageSummary {
|
||||
imageSummaries := make([]*gql_generated.ImageSummary, 0, len(repoMeta.Tags))
|
||||
|
@ -599,8 +599,8 @@ func RepoMeta2ImageSummaries(ctx context.Context, repoMeta repodb.RepoMetadata,
|
|||
return imageSummaries
|
||||
}
|
||||
|
||||
func RepoMeta2ExpandedRepoInfo(ctx context.Context, repoMeta repodb.RepoMetadata,
|
||||
manifestMetaMap map[string]repodb.ManifestMetadata, indexDataMap map[string]repodb.IndexData,
|
||||
func RepoMeta2ExpandedRepoInfo(ctx context.Context, repoMeta mTypes.RepoMetadata,
|
||||
manifestMetaMap map[string]mTypes.ManifestMetadata, indexDataMap map[string]mTypes.IndexData,
|
||||
skip SkipQGLField, cveInfo cveinfo.CveInfo, log log.Logger,
|
||||
) (*gql_generated.RepoSummary, []*gql_generated.ImageSummary) {
|
||||
var (
|
||||
|
@ -629,7 +629,7 @@ func RepoMeta2ExpandedRepoInfo(ctx context.Context, repoMeta repodb.RepoMetadata
|
|||
skip.Vulnerabilities, repoMeta, manifestMetaMap, indexDataMap, cveInfo)
|
||||
if err != nil {
|
||||
log.Error().Str("repository", repoName).Str("reference", tag).
|
||||
Msg("repodb: erorr while converting descriptor for image")
|
||||
Msg("metadb: erorr while converting descriptor for image")
|
||||
|
||||
continue
|
||||
}
|
||||
|
@ -771,7 +771,7 @@ func GetPreloadString(prefix, name string) string {
|
|||
return name
|
||||
}
|
||||
|
||||
func GetSignaturesInfo(isSigned bool, repoMeta repodb.RepoMetadata, indexDigest godigest.Digest,
|
||||
func GetSignaturesInfo(isSigned bool, repoMeta mTypes.RepoMetadata, indexDigest godigest.Digest,
|
||||
) []*gql_generated.SignatureSummary {
|
||||
signaturesInfo := []*gql_generated.SignatureSummary{}
|
||||
|
|
@ -13,7 +13,7 @@ import (
|
|||
cvemodel "zotregistry.io/zot/pkg/extensions/search/cve/model"
|
||||
"zotregistry.io/zot/pkg/extensions/search/cve/trivy"
|
||||
"zotregistry.io/zot/pkg/log"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
"zotregistry.io/zot/pkg/storage"
|
||||
)
|
||||
|
||||
|
@ -39,25 +39,25 @@ type Scanner interface {
|
|||
type BaseCveInfo struct {
|
||||
Log log.Logger
|
||||
Scanner Scanner
|
||||
RepoDB repodb.RepoDB
|
||||
MetaDB mTypes.MetaDB
|
||||
}
|
||||
|
||||
func NewCVEInfo(storeController storage.StoreController, repoDB repodb.RepoDB,
|
||||
func NewCVEInfo(storeController storage.StoreController, metaDB mTypes.MetaDB,
|
||||
dbRepository, javaDBRepository string, log log.Logger,
|
||||
) *BaseCveInfo {
|
||||
scanner := trivy.NewScanner(storeController, repoDB, dbRepository, javaDBRepository, log)
|
||||
scanner := trivy.NewScanner(storeController, metaDB, dbRepository, javaDBRepository, log)
|
||||
|
||||
return &BaseCveInfo{
|
||||
Log: log,
|
||||
Scanner: scanner,
|
||||
RepoDB: repoDB,
|
||||
MetaDB: metaDB,
|
||||
}
|
||||
}
|
||||
|
||||
func (cveinfo BaseCveInfo) GetImageListForCVE(repo, cveID string) ([]cvemodel.TagInfo, error) {
|
||||
imgList := make([]cvemodel.TagInfo, 0)
|
||||
|
||||
repoMeta, err := cveinfo.RepoDB.GetRepoMeta(repo)
|
||||
repoMeta, err := cveinfo.MetaDB.GetRepoMeta(repo)
|
||||
if err != nil {
|
||||
cveinfo.Log.Error().Err(err).Str("repository", repo).Str("cve-id", cveID).
|
||||
Msg("unable to get list of tags from repo")
|
||||
|
@ -104,7 +104,7 @@ func (cveinfo BaseCveInfo) GetImageListForCVE(repo, cveID string) ([]cvemodel.Ta
|
|||
}
|
||||
|
||||
func (cveinfo BaseCveInfo) GetImageListWithCVEFixed(repo, cveID string) ([]cvemodel.TagInfo, error) {
|
||||
repoMeta, err := cveinfo.RepoDB.GetRepoMeta(repo)
|
||||
repoMeta, err := cveinfo.MetaDB.GetRepoMeta(repo)
|
||||
if err != nil {
|
||||
cveinfo.Log.Error().Err(err).Str("repository", repo).Str("cve-id", cveID).
|
||||
Msg("unable to get list of tags from repo")
|
||||
|
@ -120,7 +120,7 @@ func (cveinfo BaseCveInfo) GetImageListWithCVEFixed(repo, cveID string) ([]cvemo
|
|||
case ispec.MediaTypeImageManifest:
|
||||
manifestDigestStr := descriptor.Digest
|
||||
|
||||
tagInfo, err := getTagInfoForManifest(tag, manifestDigestStr, cveinfo.RepoDB)
|
||||
tagInfo, err := getTagInfoForManifest(tag, manifestDigestStr, cveinfo.MetaDB)
|
||||
if err != nil {
|
||||
cveinfo.Log.Error().Err(err).Str("repository", repo).Str("tag", tag).
|
||||
Str("cve-id", cveID).Msg("unable to retrieve manifest and config")
|
||||
|
@ -136,7 +136,7 @@ func (cveinfo BaseCveInfo) GetImageListWithCVEFixed(repo, cveID string) ([]cvemo
|
|||
case ispec.MediaTypeImageIndex:
|
||||
indexDigestStr := descriptor.Digest
|
||||
|
||||
indexContent, err := getIndexContent(cveinfo.RepoDB, indexDigestStr)
|
||||
indexContent, err := getIndexContent(cveinfo.MetaDB, indexDigestStr)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
|
@ -145,7 +145,7 @@ func (cveinfo BaseCveInfo) GetImageListWithCVEFixed(repo, cveID string) ([]cvemo
|
|||
allManifests := []cvemodel.DescriptorInfo{}
|
||||
|
||||
for _, manifest := range indexContent.Manifests {
|
||||
tagInfo, err := getTagInfoForManifest(tag, manifest.Digest.String(), cveinfo.RepoDB)
|
||||
tagInfo, err := getTagInfoForManifest(tag, manifest.Digest.String(), cveinfo.MetaDB)
|
||||
if err != nil {
|
||||
cveinfo.Log.Error().Err(err).Str("repository", repo).Str("tag", tag).
|
||||
Str("cve-id", cveID).Msg("unable to retrieve manifest and config")
|
||||
|
@ -226,8 +226,8 @@ func mostRecentUpdate(allManifests []cvemodel.DescriptorInfo) time.Time {
|
|||
return timeStamp
|
||||
}
|
||||
|
||||
func getTagInfoForManifest(tag, manifestDigestStr string, repoDB repodb.RepoDB) (cvemodel.TagInfo, error) {
|
||||
configContent, manifestDigest, err := getConfigAndDigest(repoDB, manifestDigestStr)
|
||||
func getTagInfoForManifest(tag, manifestDigestStr string, metaDB mTypes.MetaDB) (cvemodel.TagInfo, error) {
|
||||
configContent, manifestDigest, err := getConfigAndDigest(metaDB, manifestDigestStr)
|
||||
if err != nil {
|
||||
return cvemodel.TagInfo{}, err
|
||||
}
|
||||
|
@ -279,13 +279,13 @@ func (cveinfo *BaseCveInfo) isManifestVulnerable(repo, tag, manifestDigestStr, c
|
|||
return hasCVE
|
||||
}
|
||||
|
||||
func getIndexContent(repoDB repodb.RepoDB, indexDigestStr string) (ispec.Index, error) {
|
||||
func getIndexContent(metaDB mTypes.MetaDB, indexDigestStr string) (ispec.Index, error) {
|
||||
indexDigest, err := godigest.Parse(indexDigestStr)
|
||||
if err != nil {
|
||||
return ispec.Index{}, err
|
||||
}
|
||||
|
||||
indexData, err := repoDB.GetIndexData(indexDigest)
|
||||
indexData, err := metaDB.GetIndexData(indexDigest)
|
||||
if err != nil {
|
||||
return ispec.Index{}, err
|
||||
}
|
||||
|
@ -300,13 +300,13 @@ func getIndexContent(repoDB repodb.RepoDB, indexDigestStr string) (ispec.Index,
|
|||
return indexContent, nil
|
||||
}
|
||||
|
||||
func getConfigAndDigest(repoDB repodb.RepoDB, manifestDigestStr string) (ispec.Image, godigest.Digest, error) {
|
||||
func getConfigAndDigest(metaDB mTypes.MetaDB, manifestDigestStr string) (ispec.Image, godigest.Digest, error) {
|
||||
manifestDigest, err := godigest.Parse(manifestDigestStr)
|
||||
if err != nil {
|
||||
return ispec.Image{}, "", err
|
||||
}
|
||||
|
||||
manifestData, err := repoDB.GetManifestData(manifestDigest)
|
||||
manifestData, err := metaDB.GetManifestData(manifestDigest)
|
||||
if err != nil {
|
||||
return ispec.Image{}, "", err
|
||||
}
|
||||
|
|
|
@ -33,9 +33,9 @@ import (
|
|||
cvemodel "zotregistry.io/zot/pkg/extensions/search/cve/model"
|
||||
"zotregistry.io/zot/pkg/extensions/search/cve/trivy"
|
||||
"zotregistry.io/zot/pkg/log"
|
||||
"zotregistry.io/zot/pkg/meta/bolt"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
boltdb_wrapper "zotregistry.io/zot/pkg/meta/repodb/boltdb-wrapper"
|
||||
"zotregistry.io/zot/pkg/meta"
|
||||
"zotregistry.io/zot/pkg/meta/boltdb"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
"zotregistry.io/zot/pkg/storage"
|
||||
storageConstants "zotregistry.io/zot/pkg/storage/constants"
|
||||
"zotregistry.io/zot/pkg/storage/local"
|
||||
|
@ -319,19 +319,19 @@ func TestImageFormat(t *testing.T) {
|
|||
false, false, log, metrics, nil, nil)
|
||||
storeController := storage.StoreController{DefaultStore: defaultStore}
|
||||
|
||||
params := bolt.DBParameters{
|
||||
params := boltdb.DBParameters{
|
||||
RootDir: dbDir,
|
||||
}
|
||||
boltDriver, err := bolt.GetBoltDriver(params)
|
||||
boltDriver, err := boltdb.GetBoltDriver(params)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
repoDB, err := boltdb_wrapper.NewBoltDBWrapper(boltDriver, log)
|
||||
metaDB, err := boltdb.New(boltDriver, log)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = repodb.ParseStorage(repoDB, storeController, log)
|
||||
err = meta.ParseStorage(metaDB, storeController, log)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
cveInfo := cveinfo.NewCVEInfo(storeController, repoDB, "ghcr.io/project-zot/trivy-db", "", log)
|
||||
cveInfo := cveinfo.NewCVEInfo(storeController, metaDB, "ghcr.io/project-zot/trivy-db", "", log)
|
||||
|
||||
isValidImage, err := cveInfo.Scanner.IsImageFormatScannable("zot-test", "")
|
||||
So(err, ShouldNotBeNil)
|
||||
|
@ -381,10 +381,10 @@ func TestImageFormat(t *testing.T) {
|
|||
Convey("isIndexScanable", t, func() {
|
||||
log := log.NewLogger("debug", "")
|
||||
|
||||
repoDB := &mocks.RepoDBMock{
|
||||
GetRepoMetaFn: func(repo string) (repodb.RepoMetadata, error) {
|
||||
return repodb.RepoMetadata{
|
||||
Tags: map[string]repodb.Descriptor{
|
||||
metaDB := &mocks.MetaDBMock{
|
||||
GetRepoMetaFn: func(repo string) (mTypes.RepoMetadata, error) {
|
||||
return mTypes.RepoMetadata{
|
||||
Tags: map[string]mTypes.Descriptor{
|
||||
"tag": {
|
||||
MediaType: ispec.MediaTypeImageIndex,
|
||||
Digest: godigest.FromString("digest").String(),
|
||||
|
@ -392,15 +392,15 @@ func TestImageFormat(t *testing.T) {
|
|||
},
|
||||
}, nil
|
||||
},
|
||||
GetIndexDataFn: func(indexDigest godigest.Digest) (repodb.IndexData, error) {
|
||||
return repodb.IndexData{IndexBlob: []byte(`{}`)}, nil
|
||||
GetIndexDataFn: func(indexDigest godigest.Digest) (mTypes.IndexData, error) {
|
||||
return mTypes.IndexData{IndexBlob: []byte(`{}`)}, nil
|
||||
},
|
||||
}
|
||||
storeController := storage.StoreController{
|
||||
DefaultStore: mocks.MockedImageStore{},
|
||||
}
|
||||
|
||||
cveInfo := cveinfo.NewCVEInfo(storeController, repoDB, "ghcr.io/project-zot/trivy-db", "", log)
|
||||
cveInfo := cveinfo.NewCVEInfo(storeController, metaDB, "ghcr.io/project-zot/trivy-db", "", log)
|
||||
|
||||
isScanable, err := cveInfo.Scanner.IsImageFormatScannable("repo", "tag")
|
||||
So(err, ShouldBeNil)
|
||||
|
@ -733,16 +733,16 @@ func TestCVESearch(t *testing.T) {
|
|||
|
||||
func TestCVEStruct(t *testing.T) {
|
||||
Convey("Unit test the CVE struct", t, func() {
|
||||
params := bolt.DBParameters{
|
||||
params := boltdb.DBParameters{
|
||||
RootDir: t.TempDir(),
|
||||
}
|
||||
boltDriver, err := bolt.GetBoltDriver(params)
|
||||
boltDriver, err := boltdb.GetBoltDriver(params)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
repoDB, err := boltdb_wrapper.NewBoltDBWrapper(boltDriver, log.NewLogger("debug", ""))
|
||||
metaDB, err := boltdb.New(boltDriver, log.NewLogger("debug", ""))
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
// Create repodb data for scannable image with vulnerabilities
|
||||
// Create metadb data for scannable image with vulnerabilities
|
||||
timeStamp11 := time.Date(2008, 1, 1, 12, 0, 0, 0, time.UTC)
|
||||
|
||||
configBlob11, err := json.Marshal(ispec.Image{
|
||||
|
@ -766,17 +766,17 @@ func TestCVEStruct(t *testing.T) {
|
|||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
repoMeta11 := repodb.ManifestMetadata{
|
||||
repoMeta11 := mTypes.ManifestMetadata{
|
||||
ManifestBlob: manifestBlob11,
|
||||
ConfigBlob: configBlob11,
|
||||
DownloadCount: 0,
|
||||
Signatures: repodb.ManifestSignatures{},
|
||||
Signatures: mTypes.ManifestSignatures{},
|
||||
}
|
||||
|
||||
digest11 := godigest.FromBytes(manifestBlob11)
|
||||
err = repoDB.SetManifestMeta("repo1", digest11, repoMeta11)
|
||||
err = metaDB.SetManifestMeta("repo1", digest11, repoMeta11)
|
||||
So(err, ShouldBeNil)
|
||||
err = repoDB.SetRepoReference("repo1", "0.1.0", digest11, ispec.MediaTypeImageManifest)
|
||||
err = metaDB.SetRepoReference("repo1", "0.1.0", digest11, ispec.MediaTypeImageManifest)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
timeStamp12 := time.Date(2009, 1, 1, 12, 0, 0, 0, time.UTC)
|
||||
|
@ -802,17 +802,17 @@ func TestCVEStruct(t *testing.T) {
|
|||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
repoMeta12 := repodb.ManifestMetadata{
|
||||
repoMeta12 := mTypes.ManifestMetadata{
|
||||
ManifestBlob: manifestBlob12,
|
||||
ConfigBlob: configBlob12,
|
||||
DownloadCount: 0,
|
||||
Signatures: repodb.ManifestSignatures{},
|
||||
Signatures: mTypes.ManifestSignatures{},
|
||||
}
|
||||
|
||||
digest12 := godigest.FromBytes(manifestBlob12)
|
||||
err = repoDB.SetManifestMeta("repo1", digest12, repoMeta12)
|
||||
err = metaDB.SetManifestMeta("repo1", digest12, repoMeta12)
|
||||
So(err, ShouldBeNil)
|
||||
err = repoDB.SetRepoReference("repo1", "1.0.0", digest12, ispec.MediaTypeImageManifest)
|
||||
err = metaDB.SetRepoReference("repo1", "1.0.0", digest12, ispec.MediaTypeImageManifest)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
timeStamp13 := time.Date(2010, 1, 1, 12, 0, 0, 0, time.UTC)
|
||||
|
@ -838,15 +838,15 @@ func TestCVEStruct(t *testing.T) {
|
|||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
repoMeta13 := repodb.ManifestMetadata{
|
||||
repoMeta13 := mTypes.ManifestMetadata{
|
||||
ManifestBlob: manifestBlob13,
|
||||
ConfigBlob: configBlob13,
|
||||
}
|
||||
|
||||
digest13 := godigest.FromBytes(manifestBlob13)
|
||||
err = repoDB.SetManifestMeta("repo1", digest13, repoMeta13)
|
||||
err = metaDB.SetManifestMeta("repo1", digest13, repoMeta13)
|
||||
So(err, ShouldBeNil)
|
||||
err = repoDB.SetRepoReference("repo1", "1.1.0", digest13, ispec.MediaTypeImageManifest)
|
||||
err = metaDB.SetRepoReference("repo1", "1.1.0", digest13, ispec.MediaTypeImageManifest)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
timeStamp14 := time.Date(2011, 1, 1, 12, 0, 0, 0, time.UTC)
|
||||
|
@ -872,18 +872,18 @@ func TestCVEStruct(t *testing.T) {
|
|||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
repoMeta14 := repodb.ManifestMetadata{
|
||||
repoMeta14 := mTypes.ManifestMetadata{
|
||||
ManifestBlob: manifestBlob14,
|
||||
ConfigBlob: configBlob14,
|
||||
}
|
||||
|
||||
digest14 := godigest.FromBytes(manifestBlob14)
|
||||
err = repoDB.SetManifestMeta("repo1", digest14, repoMeta14)
|
||||
err = metaDB.SetManifestMeta("repo1", digest14, repoMeta14)
|
||||
So(err, ShouldBeNil)
|
||||
err = repoDB.SetRepoReference("repo1", "1.0.1", digest14, ispec.MediaTypeImageManifest)
|
||||
err = metaDB.SetRepoReference("repo1", "1.0.1", digest14, ispec.MediaTypeImageManifest)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
// Create repodb data for scannable image with no vulnerabilities
|
||||
// Create metadb data for scannable image with no vulnerabilities
|
||||
timeStamp61 := time.Date(2011, 1, 1, 12, 0, 0, 0, time.UTC)
|
||||
|
||||
configBlob61, err := json.Marshal(ispec.Image{
|
||||
|
@ -907,18 +907,18 @@ func TestCVEStruct(t *testing.T) {
|
|||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
repoMeta61 := repodb.ManifestMetadata{
|
||||
repoMeta61 := mTypes.ManifestMetadata{
|
||||
ManifestBlob: manifestBlob61,
|
||||
ConfigBlob: configBlob61,
|
||||
}
|
||||
|
||||
digest61 := godigest.FromBytes(manifestBlob61)
|
||||
err = repoDB.SetManifestMeta("repo6", digest61, repoMeta61)
|
||||
err = metaDB.SetManifestMeta("repo6", digest61, repoMeta61)
|
||||
So(err, ShouldBeNil)
|
||||
err = repoDB.SetRepoReference("repo6", "1.0.0", digest61, ispec.MediaTypeImageManifest)
|
||||
err = metaDB.SetRepoReference("repo6", "1.0.0", digest61, ispec.MediaTypeImageManifest)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
// Create repodb data for image not supporting scanning
|
||||
// Create metadb data for image not supporting scanning
|
||||
timeStamp21 := time.Date(2009, 1, 1, 12, 0, 0, 0, time.UTC)
|
||||
|
||||
configBlob21, err := json.Marshal(ispec.Image{
|
||||
|
@ -942,46 +942,46 @@ func TestCVEStruct(t *testing.T) {
|
|||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
repoMeta21 := repodb.ManifestMetadata{
|
||||
repoMeta21 := mTypes.ManifestMetadata{
|
||||
ManifestBlob: manifestBlob21,
|
||||
ConfigBlob: configBlob21,
|
||||
}
|
||||
|
||||
digest21 := godigest.FromBytes(manifestBlob21)
|
||||
err = repoDB.SetManifestMeta("repo2", digest21, repoMeta21)
|
||||
err = metaDB.SetManifestMeta("repo2", digest21, repoMeta21)
|
||||
So(err, ShouldBeNil)
|
||||
err = repoDB.SetRepoReference("repo2", "1.0.0", digest21, ispec.MediaTypeImageManifest)
|
||||
err = metaDB.SetRepoReference("repo2", "1.0.0", digest21, ispec.MediaTypeImageManifest)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
// Create repodb data for invalid images/negative tests
|
||||
// Create metadb data for invalid images/negative tests
|
||||
manifestBlob31 := []byte("invalid manifest blob")
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
repoMeta31 := repodb.ManifestMetadata{
|
||||
repoMeta31 := mTypes.ManifestMetadata{
|
||||
ManifestBlob: manifestBlob31,
|
||||
}
|
||||
|
||||
digest31 := godigest.FromBytes(manifestBlob31)
|
||||
err = repoDB.SetManifestMeta("repo3", digest31, repoMeta31)
|
||||
err = metaDB.SetManifestMeta("repo3", digest31, repoMeta31)
|
||||
So(err, ShouldBeNil)
|
||||
err = repoDB.SetRepoReference("repo3", "invalid-manifest", digest31, ispec.MediaTypeImageManifest)
|
||||
err = metaDB.SetRepoReference("repo3", "invalid-manifest", digest31, ispec.MediaTypeImageManifest)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
configBlob41 := []byte("invalid config blob")
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
repoMeta41 := repodb.ManifestMetadata{
|
||||
repoMeta41 := mTypes.ManifestMetadata{
|
||||
ConfigBlob: configBlob41,
|
||||
}
|
||||
|
||||
digest41 := godigest.FromString("abc7")
|
||||
err = repoDB.SetManifestMeta("repo4", digest41, repoMeta41)
|
||||
err = metaDB.SetManifestMeta("repo4", digest41, repoMeta41)
|
||||
So(err, ShouldBeNil)
|
||||
err = repoDB.SetRepoReference("repo4", "invalid-config", digest41, ispec.MediaTypeImageManifest)
|
||||
err = metaDB.SetRepoReference("repo4", "invalid-config", digest41, ispec.MediaTypeImageManifest)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
digest51 := godigest.FromString("abc8")
|
||||
err = repoDB.SetRepoReference("repo5", "nonexitent-manifest", digest51, ispec.MediaTypeImageManifest)
|
||||
err = metaDB.SetRepoReference("repo5", "nonexitent-manifest", digest51, ispec.MediaTypeImageManifest)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
// ------ Multiarch image
|
||||
|
@ -990,7 +990,7 @@ func TestCVEStruct(t *testing.T) {
|
|||
manifestContent1Blob, err := json.Marshal(manifestContent1)
|
||||
So(err, ShouldBeNil)
|
||||
diestManifestFromIndex1 := godigest.FromBytes(manifestContent1Blob)
|
||||
err = repoDB.SetManifestData(diestManifestFromIndex1, repodb.ManifestData{
|
||||
err = metaDB.SetManifestData(diestManifestFromIndex1, mTypes.ManifestData{
|
||||
ManifestBlob: manifestContent1Blob,
|
||||
ConfigBlob: []byte("{}"),
|
||||
})
|
||||
|
@ -1001,7 +1001,7 @@ func TestCVEStruct(t *testing.T) {
|
|||
manifestContent2Blob, err := json.Marshal(manifestContent2)
|
||||
So(err, ShouldBeNil)
|
||||
diestManifestFromIndex2 := godigest.FromBytes(manifestContent2Blob)
|
||||
err = repoDB.SetManifestData(diestManifestFromIndex1, repodb.ManifestData{
|
||||
err = metaDB.SetManifestData(diestManifestFromIndex1, mTypes.ManifestData{
|
||||
ManifestBlob: manifestContent2Blob,
|
||||
ConfigBlob: []byte("{}"),
|
||||
})
|
||||
|
@ -1013,15 +1013,15 @@ func TestCVEStruct(t *testing.T) {
|
|||
So(err, ShouldBeNil)
|
||||
|
||||
indexDigest := godigest.FromBytes(indexBlob)
|
||||
err = repoDB.SetIndexData(indexDigest, repodb.IndexData{
|
||||
err = metaDB.SetIndexData(indexDigest, mTypes.IndexData{
|
||||
IndexBlob: indexBlob,
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = repoDB.SetRepoReference("repoIndex", "tagIndex", indexDigest, ispec.MediaTypeImageIndex)
|
||||
err = metaDB.SetRepoReference("repoIndex", "tagIndex", indexDigest, ispec.MediaTypeImageIndex)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
// RepoDB loaded with initial data, mock the scanner
|
||||
// MetaDB loaded with initial data, mock the scanner
|
||||
severities := map[string]int{
|
||||
"UNKNOWN": 0,
|
||||
"LOW": 1,
|
||||
|
@ -1127,7 +1127,7 @@ func TestCVEStruct(t *testing.T) {
|
|||
// Almost same logic compared to actual Trivy specific implementation
|
||||
imageDir, inputTag := repo, reference
|
||||
|
||||
repoMeta, err := repoDB.GetRepoMeta(imageDir)
|
||||
repoMeta, err := metaDB.GetRepoMeta(imageDir)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
@ -1150,7 +1150,7 @@ func TestCVEStruct(t *testing.T) {
|
|||
return false, err
|
||||
}
|
||||
|
||||
manifestData, err := repoDB.GetManifestData(manifestDigest)
|
||||
manifestData, err := metaDB.GetManifestData(manifestDigest)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
@ -1187,7 +1187,7 @@ func TestCVEStruct(t *testing.T) {
|
|||
}
|
||||
|
||||
log := log.NewLogger("debug", "")
|
||||
cveInfo := cveinfo.BaseCveInfo{Log: log, Scanner: scanner, RepoDB: repoDB}
|
||||
cveInfo := cveinfo.BaseCveInfo{Log: log, Scanner: scanner, MetaDB: metaDB}
|
||||
|
||||
t.Log("Test GetCVESummaryForImage")
|
||||
|
||||
|
@ -1420,7 +1420,7 @@ func TestCVEStruct(t *testing.T) {
|
|||
},
|
||||
}
|
||||
|
||||
cveInfo = cveinfo.BaseCveInfo{Log: log, Scanner: faultyScanner, RepoDB: repoDB}
|
||||
cveInfo = cveinfo.BaseCveInfo{Log: log, Scanner: faultyScanner, MetaDB: metaDB}
|
||||
|
||||
cveSummary, err = cveInfo.GetCVESummaryForImage("repo1", "0.1.0")
|
||||
So(err, ShouldNotBeNil)
|
||||
|
@ -1445,7 +1445,7 @@ func TestCVEStruct(t *testing.T) {
|
|||
So(err, ShouldBeNil)
|
||||
So(len(tagList), ShouldEqual, 0)
|
||||
|
||||
cveInfo = cveinfo.BaseCveInfo{Log: log, Scanner: scanner, RepoDB: repoDB}
|
||||
cveInfo = cveinfo.BaseCveInfo{Log: log, Scanner: scanner, MetaDB: metaDB}
|
||||
|
||||
tagList, err = cveInfo.GetImageListForCVE("repoIndex", "CVE1")
|
||||
So(err, ShouldBeNil)
|
||||
|
@ -1455,7 +1455,7 @@ func TestCVEStruct(t *testing.T) {
|
|||
IsImageFormatScannableFn: func(repo, reference string) (bool, error) {
|
||||
return false, nil
|
||||
},
|
||||
}, RepoDB: repoDB}
|
||||
}, MetaDB: metaDB}
|
||||
|
||||
_, err = cveInfo.GetImageListForCVE("repoIndex", "CVE1")
|
||||
So(err, ShouldBeNil)
|
||||
|
@ -1467,7 +1467,7 @@ func TestCVEStruct(t *testing.T) {
|
|||
ScanImageFn: func(image string) (map[string]cvemodel.CVE, error) {
|
||||
return nil, zerr.ErrTypeAssertionFailed
|
||||
},
|
||||
}, RepoDB: repoDB}
|
||||
}, MetaDB: metaDB}
|
||||
|
||||
_, err = cveInfo.GetImageListForCVE("repoIndex", "CVE1")
|
||||
So(err, ShouldBeNil)
|
||||
|
@ -1598,12 +1598,12 @@ func TestFixedTagsWithIndex(t *testing.T) {
|
|||
err = UploadImage(simpleVulnImg, baseURL, "repo")
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
scanner := trivy.NewScanner(ctlr.StoreController, ctlr.RepoDB, "ghcr.io/project-zot/trivy-db", "", ctlr.Log)
|
||||
scanner := trivy.NewScanner(ctlr.StoreController, ctlr.MetaDB, "ghcr.io/project-zot/trivy-db", "", ctlr.Log)
|
||||
|
||||
err = scanner.UpdateDB()
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
cveInfo := cveinfo.NewCVEInfo(ctlr.StoreController, ctlr.RepoDB, "ghcr.io/project-zot/trivy-db", "", ctlr.Log)
|
||||
cveInfo := cveinfo.NewCVEInfo(ctlr.StoreController, ctlr.MetaDB, "ghcr.io/project-zot/trivy-db", "", ctlr.Log)
|
||||
|
||||
tagsInfo, err := cveInfo.GetImageListWithCVEFixed("repo", Vulnerability1ID)
|
||||
So(err, ShouldBeNil)
|
||||
|
@ -1647,13 +1647,13 @@ func TestImageListWithCVEFixedErrors(t *testing.T) {
|
|||
storeController := storage.StoreController{}
|
||||
storeController.DefaultStore = mocks.MockedImageStore{}
|
||||
|
||||
repoDB := mocks.RepoDBMock{}
|
||||
metaDB := mocks.MetaDBMock{}
|
||||
log := log.NewLogger("debug", "")
|
||||
|
||||
Convey("getIndexContent errors", func() {
|
||||
repoDB.GetRepoMetaFn = func(repo string) (repodb.RepoMetadata, error) {
|
||||
return repodb.RepoMetadata{
|
||||
Tags: map[string]repodb.Descriptor{
|
||||
metaDB.GetRepoMetaFn = func(repo string) (mTypes.RepoMetadata, error) {
|
||||
return mTypes.RepoMetadata{
|
||||
Tags: map[string]mTypes.Descriptor{
|
||||
"tag": {
|
||||
Digest: indexDigest.String(),
|
||||
MediaType: ispec.MediaTypeImageIndex,
|
||||
|
@ -1661,20 +1661,20 @@ func TestImageListWithCVEFixedErrors(t *testing.T) {
|
|||
},
|
||||
}, nil
|
||||
}
|
||||
repoDB.GetIndexDataFn = func(indexDigest godigest.Digest) (repodb.IndexData, error) {
|
||||
return repodb.IndexData{}, zerr.ErrIndexDataNotFount
|
||||
metaDB.GetIndexDataFn = func(indexDigest godigest.Digest) (mTypes.IndexData, error) {
|
||||
return mTypes.IndexData{}, zerr.ErrIndexDataNotFount
|
||||
}
|
||||
|
||||
cveInfo := cveinfo.NewCVEInfo(storeController, repoDB, "", "", log)
|
||||
cveInfo := cveinfo.NewCVEInfo(storeController, metaDB, "", "", log)
|
||||
|
||||
_, err := cveInfo.GetImageListWithCVEFixed("repo", Vulnerability1ID)
|
||||
So(err, ShouldBeNil)
|
||||
})
|
||||
|
||||
Convey("getIndexContent bad indexDigest", func() {
|
||||
repoDB.GetRepoMetaFn = func(repo string) (repodb.RepoMetadata, error) {
|
||||
return repodb.RepoMetadata{
|
||||
Tags: map[string]repodb.Descriptor{
|
||||
metaDB.GetRepoMetaFn = func(repo string) (mTypes.RepoMetadata, error) {
|
||||
return mTypes.RepoMetadata{
|
||||
Tags: map[string]mTypes.Descriptor{
|
||||
"tag": {
|
||||
Digest: "bad digest",
|
||||
MediaType: ispec.MediaTypeImageIndex,
|
||||
|
@ -1682,20 +1682,20 @@ func TestImageListWithCVEFixedErrors(t *testing.T) {
|
|||
},
|
||||
}, nil
|
||||
}
|
||||
repoDB.GetIndexDataFn = func(indexDigest godigest.Digest) (repodb.IndexData, error) {
|
||||
return repodb.IndexData{}, zerr.ErrIndexDataNotFount
|
||||
metaDB.GetIndexDataFn = func(indexDigest godigest.Digest) (mTypes.IndexData, error) {
|
||||
return mTypes.IndexData{}, zerr.ErrIndexDataNotFount
|
||||
}
|
||||
|
||||
cveInfo := cveinfo.NewCVEInfo(storeController, repoDB, "", "", log)
|
||||
cveInfo := cveinfo.NewCVEInfo(storeController, metaDB, "", "", log)
|
||||
|
||||
_, err := cveInfo.GetImageListWithCVEFixed("repo", Vulnerability1ID)
|
||||
So(err, ShouldBeNil)
|
||||
})
|
||||
|
||||
Convey("getIndexContent bad index content", func() {
|
||||
repoDB.GetRepoMetaFn = func(repo string) (repodb.RepoMetadata, error) {
|
||||
return repodb.RepoMetadata{
|
||||
Tags: map[string]repodb.Descriptor{
|
||||
metaDB.GetRepoMetaFn = func(repo string) (mTypes.RepoMetadata, error) {
|
||||
return mTypes.RepoMetadata{
|
||||
Tags: map[string]mTypes.Descriptor{
|
||||
"tag": {
|
||||
Digest: indexDigest.String(),
|
||||
MediaType: ispec.MediaTypeImageIndex,
|
||||
|
@ -1703,20 +1703,20 @@ func TestImageListWithCVEFixedErrors(t *testing.T) {
|
|||
},
|
||||
}, nil
|
||||
}
|
||||
repoDB.GetIndexDataFn = func(indexDigest godigest.Digest) (repodb.IndexData, error) {
|
||||
return repodb.IndexData{IndexBlob: []byte(`bad index`)}, nil
|
||||
metaDB.GetIndexDataFn = func(indexDigest godigest.Digest) (mTypes.IndexData, error) {
|
||||
return mTypes.IndexData{IndexBlob: []byte(`bad index`)}, nil
|
||||
}
|
||||
|
||||
cveInfo := cveinfo.NewCVEInfo(storeController, repoDB, "", "", log)
|
||||
cveInfo := cveinfo.NewCVEInfo(storeController, metaDB, "", "", log)
|
||||
|
||||
_, err := cveInfo.GetImageListWithCVEFixed("repo", Vulnerability1ID)
|
||||
So(err, ShouldBeNil)
|
||||
})
|
||||
|
||||
Convey("getTagInfoForManifest bad manifest digest", func() {
|
||||
repoDB.GetRepoMetaFn = func(repo string) (repodb.RepoMetadata, error) {
|
||||
return repodb.RepoMetadata{
|
||||
Tags: map[string]repodb.Descriptor{
|
||||
metaDB.GetRepoMetaFn = func(repo string) (mTypes.RepoMetadata, error) {
|
||||
return mTypes.RepoMetadata{
|
||||
Tags: map[string]mTypes.Descriptor{
|
||||
"tag": {
|
||||
Digest: "bad digest",
|
||||
MediaType: ispec.MediaTypeImageManifest,
|
||||
|
@ -1725,16 +1725,16 @@ func TestImageListWithCVEFixedErrors(t *testing.T) {
|
|||
}, nil
|
||||
}
|
||||
|
||||
cveInfo := cveinfo.NewCVEInfo(storeController, repoDB, "", "", log)
|
||||
cveInfo := cveinfo.NewCVEInfo(storeController, metaDB, "", "", log)
|
||||
|
||||
_, err := cveInfo.GetImageListWithCVEFixed("repo", Vulnerability1ID)
|
||||
So(err, ShouldBeNil)
|
||||
})
|
||||
|
||||
Convey("getTagInfoForManifest fails for index", func() {
|
||||
repoDB.GetRepoMetaFn = func(repo string) (repodb.RepoMetadata, error) {
|
||||
return repodb.RepoMetadata{
|
||||
Tags: map[string]repodb.Descriptor{
|
||||
metaDB.GetRepoMetaFn = func(repo string) (mTypes.RepoMetadata, error) {
|
||||
return mTypes.RepoMetadata{
|
||||
Tags: map[string]mTypes.Descriptor{
|
||||
"tag": {
|
||||
Digest: indexDigest.String(),
|
||||
MediaType: ispec.MediaTypeImageIndex,
|
||||
|
@ -1742,8 +1742,8 @@ func TestImageListWithCVEFixedErrors(t *testing.T) {
|
|||
},
|
||||
}, nil
|
||||
}
|
||||
repoDB.GetIndexDataFn = func(indexDigest godigest.Digest) (repodb.IndexData, error) {
|
||||
return repodb.IndexData{
|
||||
metaDB.GetIndexDataFn = func(indexDigest godigest.Digest) (mTypes.IndexData, error) {
|
||||
return mTypes.IndexData{
|
||||
IndexBlob: []byte(fmt.Sprintf(`{
|
||||
"manifests": [
|
||||
{
|
||||
|
@ -1753,11 +1753,11 @@ func TestImageListWithCVEFixedErrors(t *testing.T) {
|
|||
]}`, manifestDigest)),
|
||||
}, nil
|
||||
}
|
||||
repoDB.GetManifestDataFn = func(manifestDigest godigest.Digest) (repodb.ManifestData, error) {
|
||||
return repodb.ManifestData{}, zerr.ErrManifestDataNotFound
|
||||
metaDB.GetManifestDataFn = func(manifestDigest godigest.Digest) (mTypes.ManifestData, error) {
|
||||
return mTypes.ManifestData{}, zerr.ErrManifestDataNotFound
|
||||
}
|
||||
|
||||
cveInfo := cveinfo.NewCVEInfo(storeController, repoDB, "", "", log)
|
||||
cveInfo := cveinfo.NewCVEInfo(storeController, metaDB, "", "", log)
|
||||
|
||||
tagsInfo, err := cveInfo.GetImageListWithCVEFixed("repo", Vulnerability1ID)
|
||||
So(err, ShouldBeNil)
|
||||
|
@ -1765,9 +1765,9 @@ func TestImageListWithCVEFixedErrors(t *testing.T) {
|
|||
})
|
||||
|
||||
Convey("media type not supported", func() {
|
||||
repoDB.GetRepoMetaFn = func(repo string) (repodb.RepoMetadata, error) {
|
||||
return repodb.RepoMetadata{
|
||||
Tags: map[string]repodb.Descriptor{
|
||||
metaDB.GetRepoMetaFn = func(repo string) (mTypes.RepoMetadata, error) {
|
||||
return mTypes.RepoMetadata{
|
||||
Tags: map[string]mTypes.Descriptor{
|
||||
"tag": {
|
||||
Digest: godigest.FromString("media type").String(),
|
||||
MediaType: "bad media type",
|
||||
|
@ -1776,7 +1776,7 @@ func TestImageListWithCVEFixedErrors(t *testing.T) {
|
|||
}, nil
|
||||
}
|
||||
|
||||
cveInfo := cveinfo.NewCVEInfo(storeController, repoDB, "", "", log)
|
||||
cveInfo := cveinfo.NewCVEInfo(storeController, metaDB, "", "", log)
|
||||
|
||||
tagsInfo, err := cveInfo.GetImageListWithCVEFixed("repo", Vulnerability1ID)
|
||||
So(err, ShouldBeNil)
|
||||
|
@ -1790,11 +1790,11 @@ func TestGetCVESummaryForImageMediaErrors(t *testing.T) {
|
|||
storeController := storage.StoreController{}
|
||||
storeController.DefaultStore = mocks.MockedImageStore{}
|
||||
|
||||
repoDB := mocks.RepoDBMock{}
|
||||
metaDB := mocks.MetaDBMock{}
|
||||
log := log.NewLogger("debug", "")
|
||||
|
||||
Convey("IsImageMediaScannable returns false", func() {
|
||||
cveInfo := cveinfo.NewCVEInfo(storeController, repoDB, "", "", log)
|
||||
cveInfo := cveinfo.NewCVEInfo(storeController, metaDB, "", "", log)
|
||||
cveInfo.Scanner = mocks.CveScannerMock{
|
||||
IsImageMediaScannableFn: func(repo, digest, mediaType string) (bool, error) {
|
||||
return false, zerr.ErrScanNotSupported
|
||||
|
@ -1806,7 +1806,7 @@ func TestGetCVESummaryForImageMediaErrors(t *testing.T) {
|
|||
})
|
||||
|
||||
Convey("Scan fails", func() {
|
||||
cveInfo := cveinfo.NewCVEInfo(storeController, repoDB, "", "", log)
|
||||
cveInfo := cveinfo.NewCVEInfo(storeController, metaDB, "", "", log)
|
||||
cveInfo.Scanner = mocks.CveScannerMock{
|
||||
IsImageMediaScannableFn: func(repo, digest, mediaType string) (bool, error) {
|
||||
return true, nil
|
||||
|
|
|
@ -17,24 +17,23 @@ import (
|
|||
cveinfo "zotregistry.io/zot/pkg/extensions/search/cve"
|
||||
cvemodel "zotregistry.io/zot/pkg/extensions/search/cve/model"
|
||||
"zotregistry.io/zot/pkg/log"
|
||||
"zotregistry.io/zot/pkg/meta/bolt"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
boltdb_wrapper "zotregistry.io/zot/pkg/meta/repodb/boltdb-wrapper"
|
||||
"zotregistry.io/zot/pkg/meta/boltdb"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
"zotregistry.io/zot/pkg/test/mocks"
|
||||
)
|
||||
|
||||
func TestCVEPagination(t *testing.T) {
|
||||
Convey("CVE Pagination", t, func() {
|
||||
params := bolt.DBParameters{
|
||||
params := boltdb.DBParameters{
|
||||
RootDir: t.TempDir(),
|
||||
}
|
||||
boltDriver, err := bolt.GetBoltDriver(params)
|
||||
boltDriver, err := boltdb.GetBoltDriver(params)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
repoDB, err := boltdb_wrapper.NewBoltDBWrapper(boltDriver, log.NewLogger("debug", ""))
|
||||
metaDB, err := boltdb.New(boltDriver, log.NewLogger("debug", ""))
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
// Create repodb data for scannable image with vulnerabilities
|
||||
// Create metadb data for scannable image with vulnerabilities
|
||||
timeStamp11 := time.Date(2008, 1, 1, 12, 0, 0, 0, time.UTC)
|
||||
|
||||
configBlob11, err := json.Marshal(ispec.Image{
|
||||
|
@ -58,15 +57,15 @@ func TestCVEPagination(t *testing.T) {
|
|||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
repoMeta11 := repodb.ManifestMetadata{
|
||||
repoMeta11 := mTypes.ManifestMetadata{
|
||||
ManifestBlob: manifestBlob11,
|
||||
ConfigBlob: configBlob11,
|
||||
}
|
||||
|
||||
digest11 := godigest.FromBytes(manifestBlob11)
|
||||
err = repoDB.SetManifestMeta("repo1", digest11, repoMeta11)
|
||||
err = metaDB.SetManifestMeta("repo1", digest11, repoMeta11)
|
||||
So(err, ShouldBeNil)
|
||||
err = repoDB.SetRepoReference("repo1", "0.1.0", digest11, ispec.MediaTypeImageManifest)
|
||||
err = metaDB.SetRepoReference("repo1", "0.1.0", digest11, ispec.MediaTypeImageManifest)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
timeStamp12 := time.Date(2009, 1, 1, 12, 0, 0, 0, time.UTC)
|
||||
|
@ -92,18 +91,18 @@ func TestCVEPagination(t *testing.T) {
|
|||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
repoMeta12 := repodb.ManifestMetadata{
|
||||
repoMeta12 := mTypes.ManifestMetadata{
|
||||
ManifestBlob: manifestBlob12,
|
||||
ConfigBlob: configBlob12,
|
||||
}
|
||||
|
||||
digest12 := godigest.FromBytes(manifestBlob12)
|
||||
err = repoDB.SetManifestMeta("repo1", digest12, repoMeta12)
|
||||
err = metaDB.SetManifestMeta("repo1", digest12, repoMeta12)
|
||||
So(err, ShouldBeNil)
|
||||
err = repoDB.SetRepoReference("repo1", "1.0.0", digest12, ispec.MediaTypeImageManifest)
|
||||
err = metaDB.SetRepoReference("repo1", "1.0.0", digest12, ispec.MediaTypeImageManifest)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
// RepoDB loaded with initial data, mock the scanner
|
||||
// MetaDB loaded with initial data, mock the scanner
|
||||
severityToInt := map[string]int{
|
||||
"UNKNOWN": 0,
|
||||
"LOW": 1,
|
||||
|
@ -153,7 +152,7 @@ func TestCVEPagination(t *testing.T) {
|
|||
}
|
||||
|
||||
log := log.NewLogger("debug", "")
|
||||
cveInfo := cveinfo.BaseCveInfo{Log: log, Scanner: scanner, RepoDB: repoDB}
|
||||
cveInfo := cveinfo.BaseCveInfo{Log: log, Scanner: scanner, MetaDB: metaDB}
|
||||
|
||||
Convey("create new paginator errors", func() {
|
||||
paginator, err := cveinfo.NewCvePageFinder(-1, 10, cveinfo.AlphabeticAsc, cveInfo)
|
||||
|
|
|
@ -25,7 +25,8 @@ import (
|
|||
zcommon "zotregistry.io/zot/pkg/common"
|
||||
cvemodel "zotregistry.io/zot/pkg/extensions/search/cve/model"
|
||||
"zotregistry.io/zot/pkg/log"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
mcommon "zotregistry.io/zot/pkg/meta/common"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
"zotregistry.io/zot/pkg/storage"
|
||||
)
|
||||
|
||||
|
@ -70,7 +71,7 @@ type cveTrivyController struct {
|
|||
}
|
||||
|
||||
type Scanner struct {
|
||||
repoDB repodb.RepoDB
|
||||
metaDB mTypes.MetaDB
|
||||
cveController cveTrivyController
|
||||
storeController storage.StoreController
|
||||
log log.Logger
|
||||
|
@ -81,7 +82,7 @@ type Scanner struct {
|
|||
}
|
||||
|
||||
func NewScanner(storeController storage.StoreController,
|
||||
repoDB repodb.RepoDB, dbRepository, javaDBRepository string, log log.Logger,
|
||||
metaDB mTypes.MetaDB, dbRepository, javaDBRepository string, log log.Logger,
|
||||
) *Scanner {
|
||||
cveController := cveTrivyController{}
|
||||
|
||||
|
@ -113,7 +114,7 @@ func NewScanner(storeController storage.StoreController,
|
|||
|
||||
return &Scanner{
|
||||
log: log,
|
||||
repoDB: repoDB,
|
||||
metaDB: metaDB,
|
||||
cveController: cveController,
|
||||
storeController: storeController,
|
||||
dbLock: &sync.Mutex{},
|
||||
|
@ -189,7 +190,7 @@ func (scanner Scanner) IsImageFormatScannable(repo, ref string) (bool, error) {
|
|||
)
|
||||
|
||||
if zcommon.IsTag(ref) {
|
||||
imgDescriptor, err := repodb.GetImageDescriptor(scanner.repoDB, repo, ref)
|
||||
imgDescriptor, err := mcommon.GetImageDescriptor(scanner.metaDB, repo, ref)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
@ -199,7 +200,7 @@ func (scanner Scanner) IsImageFormatScannable(repo, ref string) (bool, error) {
|
|||
} else {
|
||||
var found bool
|
||||
|
||||
found, mediaType = repodb.FindMediaTypeForDigest(scanner.repoDB, godigest.Digest(ref))
|
||||
found, mediaType = mcommon.FindMediaTypeForDigest(scanner.metaDB, godigest.Digest(ref))
|
||||
if !found {
|
||||
return false, zerr.ErrManifestNotFound
|
||||
}
|
||||
|
@ -236,7 +237,7 @@ func (scanner Scanner) isManifestScanable(digestStr string) (bool, error) {
|
|||
return true, nil
|
||||
}
|
||||
|
||||
manifestData, err := scanner.repoDB.GetManifestData(godigest.Digest(digestStr))
|
||||
manifestData, err := scanner.metaDB.GetManifestData(godigest.Digest(digestStr))
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
@ -270,7 +271,7 @@ func (scanner Scanner) isIndexScanable(digestStr string) (bool, error) {
|
|||
return true, nil
|
||||
}
|
||||
|
||||
indexData, err := scanner.repoDB.GetIndexData(godigest.Digest(digestStr))
|
||||
indexData, err := scanner.metaDB.GetIndexData(godigest.Digest(digestStr))
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
@ -313,7 +314,7 @@ func (scanner Scanner) ScanImage(image string) (map[string]cvemodel.CVE, error)
|
|||
digest = ref
|
||||
|
||||
if isTag {
|
||||
imgDescriptor, err := repodb.GetImageDescriptor(scanner.repoDB, repo, ref)
|
||||
imgDescriptor, err := mcommon.GetImageDescriptor(scanner.metaDB, repo, ref)
|
||||
if err != nil {
|
||||
return map[string]cvemodel.CVE{}, err
|
||||
}
|
||||
|
@ -323,7 +324,7 @@ func (scanner Scanner) ScanImage(image string) (map[string]cvemodel.CVE, error)
|
|||
} else {
|
||||
var found bool
|
||||
|
||||
found, mediaType = repodb.FindMediaTypeForDigest(scanner.repoDB, godigest.Digest(ref))
|
||||
found, mediaType = mcommon.FindMediaTypeForDigest(scanner.metaDB, godigest.Digest(ref))
|
||||
if !found {
|
||||
return map[string]cvemodel.CVE{}, zerr.ErrManifestNotFound
|
||||
}
|
||||
|
@ -427,7 +428,7 @@ func (scanner Scanner) scanManifest(repo, digest string) (map[string]cvemodel.CV
|
|||
}
|
||||
|
||||
func (scanner Scanner) scanIndex(repo, digest string) (map[string]cvemodel.CVE, error) {
|
||||
indexData, err := scanner.repoDB.GetIndexData(godigest.Digest(digest))
|
||||
indexData, err := scanner.metaDB.GetIndexData(godigest.Digest(digest))
|
||||
if err != nil {
|
||||
return map[string]cvemodel.CVE{}, err
|
||||
}
|
||||
|
|
|
@ -20,9 +20,9 @@ import (
|
|||
"zotregistry.io/zot/pkg/extensions/monitoring"
|
||||
"zotregistry.io/zot/pkg/extensions/search/cve/model"
|
||||
"zotregistry.io/zot/pkg/log"
|
||||
"zotregistry.io/zot/pkg/meta/bolt"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
boltdb_wrapper "zotregistry.io/zot/pkg/meta/repodb/boltdb-wrapper"
|
||||
"zotregistry.io/zot/pkg/meta"
|
||||
"zotregistry.io/zot/pkg/meta/boltdb"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
"zotregistry.io/zot/pkg/storage"
|
||||
storageConstants "zotregistry.io/zot/pkg/storage/constants"
|
||||
"zotregistry.io/zot/pkg/storage/local"
|
||||
|
@ -93,16 +93,16 @@ func TestMultipleStoragePath(t *testing.T) {
|
|||
|
||||
storeController.SubStore = subStore
|
||||
|
||||
params := bolt.DBParameters{
|
||||
params := boltdb.DBParameters{
|
||||
RootDir: firstRootDir,
|
||||
}
|
||||
boltDriver, err := bolt.GetBoltDriver(params)
|
||||
boltDriver, err := boltdb.GetBoltDriver(params)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
repoDB, err := boltdb_wrapper.NewBoltDBWrapper(boltDriver, log)
|
||||
metaDB, err := boltdb.New(boltDriver, log)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
scanner := NewScanner(storeController, repoDB, "ghcr.io/project-zot/trivy-db", "", log)
|
||||
scanner := NewScanner(storeController, metaDB, "ghcr.io/project-zot/trivy-db", "", log)
|
||||
|
||||
So(scanner.storeController.DefaultStore, ShouldNotBeNil)
|
||||
So(scanner.storeController.SubStore, ShouldNotBeNil)
|
||||
|
@ -124,7 +124,7 @@ func TestMultipleStoragePath(t *testing.T) {
|
|||
generateTestImage(storeController, img1)
|
||||
generateTestImage(storeController, img2)
|
||||
|
||||
err = repodb.ParseStorage(repoDB, storeController, log)
|
||||
err = meta.ParseStorage(metaDB, storeController, log)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
// Try to scan without the DB being downloaded
|
||||
|
@ -192,23 +192,23 @@ func TestTrivyLibraryErrors(t *testing.T) {
|
|||
storeController := storage.StoreController{}
|
||||
storeController.DefaultStore = store
|
||||
|
||||
params := bolt.DBParameters{
|
||||
params := boltdb.DBParameters{
|
||||
RootDir: rootDir,
|
||||
}
|
||||
|
||||
boltDriver, err := bolt.GetBoltDriver(params)
|
||||
boltDriver, err := boltdb.GetBoltDriver(params)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
repoDB, err := boltdb_wrapper.NewBoltDBWrapper(boltDriver, log)
|
||||
metaDB, err := boltdb.New(boltDriver, log)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = repodb.ParseStorage(repoDB, storeController, log)
|
||||
err = meta.ParseStorage(metaDB, storeController, log)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
img := "zot-test:0.0.1" //nolint:goconst
|
||||
|
||||
// Download DB fails for missing DB url
|
||||
scanner := NewScanner(storeController, repoDB, "", "", log)
|
||||
scanner := NewScanner(storeController, metaDB, "", "", log)
|
||||
|
||||
err = scanner.UpdateDB()
|
||||
So(err, ShouldNotBeNil)
|
||||
|
@ -220,7 +220,7 @@ func TestTrivyLibraryErrors(t *testing.T) {
|
|||
So(err, ShouldWrap, zerr.ErrCVEDBNotFound)
|
||||
|
||||
// Download DB fails for invalid Java DB
|
||||
scanner = NewScanner(storeController, repoDB, "ghcr.io/project-zot/trivy-db",
|
||||
scanner = NewScanner(storeController, metaDB, "ghcr.io/project-zot/trivy-db",
|
||||
"ghcr.io/project-zot/trivy-not-db", log)
|
||||
|
||||
err = scanner.UpdateDB()
|
||||
|
@ -228,7 +228,7 @@ func TestTrivyLibraryErrors(t *testing.T) {
|
|||
|
||||
// Download DB passes for valid Trivy DB url, and missing Trivy Java DB url
|
||||
// Download DB is necessary since DB download on scan is disabled
|
||||
scanner = NewScanner(storeController, repoDB, "ghcr.io/project-zot/trivy-db", "", log)
|
||||
scanner = NewScanner(storeController, metaDB, "ghcr.io/project-zot/trivy-db", "", log)
|
||||
|
||||
err = scanner.UpdateDB()
|
||||
So(err, ShouldBeNil)
|
||||
|
@ -261,18 +261,18 @@ func TestTrivyLibraryErrors(t *testing.T) {
|
|||
func TestImageScannable(t *testing.T) {
|
||||
rootDir := t.TempDir()
|
||||
|
||||
params := bolt.DBParameters{
|
||||
params := boltdb.DBParameters{
|
||||
RootDir: rootDir,
|
||||
}
|
||||
|
||||
boltDriver, err := bolt.GetBoltDriver(params)
|
||||
boltDriver, err := boltdb.GetBoltDriver(params)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
log := log.NewLogger("debug", "")
|
||||
|
||||
repoDB, err := boltdb_wrapper.NewBoltDBWrapper(boltDriver, log)
|
||||
metaDB, err := boltdb.New(boltDriver, log)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
@ -281,12 +281,12 @@ func TestImageScannable(t *testing.T) {
|
|||
// - Error: RepoMeta not found in DB
|
||||
// - Error: Tag not found in DB
|
||||
// - Error: Digest in RepoMeta is invalid
|
||||
// - Error: ManifestData not found in repodb
|
||||
// - Error: ManifestData not found in metadb
|
||||
// - Error: ManifestData cannot be unmarshalled
|
||||
// - Error: ManifestData contains unscannable layer type
|
||||
// - Valid Scannable image
|
||||
|
||||
// Create repodb data for scannable image
|
||||
// Create metadb data for scannable image
|
||||
timeStamp := time.Date(2008, 1, 1, 12, 0, 0, 0, time.UTC)
|
||||
|
||||
validConfigBlob, err := json.Marshal(ispec.Image{
|
||||
|
@ -314,24 +314,24 @@ func TestImageScannable(t *testing.T) {
|
|||
panic(err)
|
||||
}
|
||||
|
||||
validRepoMeta := repodb.ManifestData{
|
||||
validRepoMeta := mTypes.ManifestData{
|
||||
ManifestBlob: validManifestBlob,
|
||||
ConfigBlob: validConfigBlob,
|
||||
}
|
||||
|
||||
digestValidManifest := godigest.FromBytes(validManifestBlob)
|
||||
|
||||
err = repoDB.SetManifestData(digestValidManifest, validRepoMeta)
|
||||
err = metaDB.SetManifestData(digestValidManifest, validRepoMeta)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
err = repoDB.SetRepoReference("repo1", "valid", digestValidManifest, ispec.MediaTypeImageManifest)
|
||||
err = metaDB.SetRepoReference("repo1", "valid", digestValidManifest, ispec.MediaTypeImageManifest)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// Create RepoDB data for manifest with unscannable layers
|
||||
// Create MetaDB data for manifest with unscannable layers
|
||||
manifestBlobUnscannableLayer, err := json.Marshal(ispec.Manifest{
|
||||
Config: ispec.Descriptor{
|
||||
MediaType: ispec.MediaTypeImageConfig,
|
||||
|
@ -350,39 +350,39 @@ func TestImageScannable(t *testing.T) {
|
|||
panic(err)
|
||||
}
|
||||
|
||||
repoMetaUnscannableLayer := repodb.ManifestData{
|
||||
repoMetaUnscannableLayer := mTypes.ManifestData{
|
||||
ManifestBlob: manifestBlobUnscannableLayer,
|
||||
ConfigBlob: validConfigBlob,
|
||||
}
|
||||
|
||||
digestManifestUnscannableLayer := godigest.FromBytes(manifestBlobUnscannableLayer)
|
||||
|
||||
err = repoDB.SetManifestData(digestManifestUnscannableLayer, repoMetaUnscannableLayer)
|
||||
err = metaDB.SetManifestData(digestManifestUnscannableLayer, repoMetaUnscannableLayer)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
err = repoDB.SetRepoReference("repo1", "unscannable-layer", digestManifestUnscannableLayer,
|
||||
err = metaDB.SetRepoReference("repo1", "unscannable-layer", digestManifestUnscannableLayer,
|
||||
ispec.MediaTypeImageManifest)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// Create RepoDB data for unmarshable manifest
|
||||
// Create MetaDB data for unmarshable manifest
|
||||
unmarshableManifestBlob := []byte("Some string")
|
||||
repoMetaUnmarshable := repodb.ManifestData{
|
||||
repoMetaUnmarshable := mTypes.ManifestData{
|
||||
ManifestBlob: unmarshableManifestBlob,
|
||||
ConfigBlob: validConfigBlob,
|
||||
}
|
||||
|
||||
digestUnmarshableManifest := godigest.FromBytes(unmarshableManifestBlob)
|
||||
|
||||
err = repoDB.SetManifestData(digestUnmarshableManifest, repoMetaUnmarshable)
|
||||
err = metaDB.SetManifestData(digestUnmarshableManifest, repoMetaUnmarshable)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
err = repoDB.SetRepoReference("repo1", "unmarshable", digestUnmarshableManifest, ispec.MediaTypeImageManifest)
|
||||
err = metaDB.SetRepoReference("repo1", "unmarshable", digestUnmarshableManifest, ispec.MediaTypeImageManifest)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
@ -390,13 +390,13 @@ func TestImageScannable(t *testing.T) {
|
|||
// Manifest meta cannot be found
|
||||
digestMissingManifest := godigest.FromBytes([]byte("Some other string"))
|
||||
|
||||
err = repoDB.SetRepoReference("repo1", "missing", digestMissingManifest, ispec.MediaTypeImageManifest)
|
||||
err = metaDB.SetRepoReference("repo1", "missing", digestMissingManifest, ispec.MediaTypeImageManifest)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// RepoMeta contains invalid digest
|
||||
err = repoDB.SetRepoReference("repo1", "invalid-digest", "invalid", ispec.MediaTypeImageManifest)
|
||||
err = metaDB.SetRepoReference("repo1", "invalid-digest", "invalid", ispec.MediaTypeImageManifest)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
@ -409,7 +409,7 @@ func TestImageScannable(t *testing.T) {
|
|||
storeController := storage.StoreController{}
|
||||
storeController.DefaultStore = store
|
||||
|
||||
scanner := NewScanner(storeController, repoDB, "ghcr.io/project-zot/trivy-db",
|
||||
scanner := NewScanner(storeController, metaDB, "ghcr.io/project-zot/trivy-db",
|
||||
"ghcr.io/aquasecurity/trivy-java-db", log)
|
||||
|
||||
Convey("Valid image should be scannable", t, func() {
|
||||
|
@ -475,20 +475,20 @@ func TestDefaultTrivyDBUrl(t *testing.T) {
|
|||
storeController := storage.StoreController{}
|
||||
storeController.DefaultStore = store
|
||||
|
||||
params := bolt.DBParameters{
|
||||
params := boltdb.DBParameters{
|
||||
RootDir: rootDir,
|
||||
}
|
||||
|
||||
boltDriver, err := bolt.GetBoltDriver(params)
|
||||
boltDriver, err := boltdb.GetBoltDriver(params)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
repoDB, err := boltdb_wrapper.NewBoltDBWrapper(boltDriver, log)
|
||||
metaDB, err := boltdb.New(boltDriver, log)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = repodb.ParseStorage(repoDB, storeController, log)
|
||||
err = meta.ParseStorage(metaDB, storeController, log)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
scanner := NewScanner(storeController, repoDB, "ghcr.io/aquasecurity/trivy-db",
|
||||
scanner := NewScanner(storeController, metaDB, "ghcr.io/aquasecurity/trivy-db",
|
||||
"ghcr.io/aquasecurity/trivy-java-db", log)
|
||||
|
||||
// Download DB since DB download on scan is disabled
|
||||
|
@ -516,11 +516,11 @@ func TestIsIndexScanable(t *testing.T) {
|
|||
storeController := storage.StoreController{}
|
||||
storeController.DefaultStore = &local.ImageStoreLocal{}
|
||||
|
||||
repoDB := &boltdb_wrapper.DBWrapper{}
|
||||
metaDB := &boltdb.BoltDB{}
|
||||
log := log.NewLogger("debug", "")
|
||||
|
||||
Convey("Find index in cache", func() {
|
||||
scanner := NewScanner(storeController, repoDB, "", "", log)
|
||||
scanner := NewScanner(storeController, metaDB, "", "", log)
|
||||
|
||||
scanner.cache.Add("digest", make(map[string]model.CVE))
|
||||
|
||||
|
@ -536,28 +536,28 @@ func TestScanIndexErrors(t *testing.T) {
|
|||
storeController := storage.StoreController{}
|
||||
storeController.DefaultStore = mocks.MockedImageStore{}
|
||||
|
||||
repoDB := mocks.RepoDBMock{}
|
||||
metaDB := mocks.MetaDBMock{}
|
||||
log := log.NewLogger("debug", "")
|
||||
|
||||
Convey("GetIndexData fails", func() {
|
||||
repoDB.GetIndexDataFn = func(indexDigest godigest.Digest) (repodb.IndexData, error) {
|
||||
return repodb.IndexData{}, godigest.ErrDigestUnsupported
|
||||
metaDB.GetIndexDataFn = func(indexDigest godigest.Digest) (mTypes.IndexData, error) {
|
||||
return mTypes.IndexData{}, godigest.ErrDigestUnsupported
|
||||
}
|
||||
|
||||
scanner := NewScanner(storeController, repoDB, "", "", log)
|
||||
scanner := NewScanner(storeController, metaDB, "", "", log)
|
||||
|
||||
_, err := scanner.scanIndex("repo", "digest")
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
Convey("Bad Index Blob, Unamrshal fails", func() {
|
||||
repoDB.GetIndexDataFn = func(indexDigest godigest.Digest) (repodb.IndexData, error) {
|
||||
return repodb.IndexData{
|
||||
metaDB.GetIndexDataFn = func(indexDigest godigest.Digest) (mTypes.IndexData, error) {
|
||||
return mTypes.IndexData{
|
||||
IndexBlob: []byte(`bad-blob`),
|
||||
}, nil
|
||||
}
|
||||
|
||||
scanner := NewScanner(storeController, repoDB, "", "", log)
|
||||
scanner := NewScanner(storeController, metaDB, "", "", log)
|
||||
|
||||
_, err := scanner.scanIndex("repo", "digest")
|
||||
So(err, ShouldNotBeNil)
|
||||
|
@ -570,24 +570,24 @@ func TestIsIndexScanableErrors(t *testing.T) {
|
|||
storeController := storage.StoreController{}
|
||||
storeController.DefaultStore = mocks.MockedImageStore{}
|
||||
|
||||
repoDB := mocks.RepoDBMock{}
|
||||
metaDB := mocks.MetaDBMock{}
|
||||
log := log.NewLogger("debug", "")
|
||||
|
||||
Convey("GetIndexData errors", func() {
|
||||
repoDB.GetIndexDataFn = func(indexDigest godigest.Digest) (repodb.IndexData, error) {
|
||||
return repodb.IndexData{}, zerr.ErrManifestDataNotFound
|
||||
metaDB.GetIndexDataFn = func(indexDigest godigest.Digest) (mTypes.IndexData, error) {
|
||||
return mTypes.IndexData{}, zerr.ErrManifestDataNotFound
|
||||
}
|
||||
scanner := NewScanner(storeController, repoDB, "", "", log)
|
||||
scanner := NewScanner(storeController, metaDB, "", "", log)
|
||||
|
||||
_, err := scanner.isIndexScanable("digest")
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
Convey("bad index data, can't unmarshal", func() {
|
||||
repoDB.GetIndexDataFn = func(indexDigest godigest.Digest) (repodb.IndexData, error) {
|
||||
return repodb.IndexData{IndexBlob: []byte(`bad`)}, nil
|
||||
metaDB.GetIndexDataFn = func(indexDigest godigest.Digest) (mTypes.IndexData, error) {
|
||||
return mTypes.IndexData{IndexBlob: []byte(`bad`)}, nil
|
||||
}
|
||||
scanner := NewScanner(storeController, repoDB, "", "", log)
|
||||
scanner := NewScanner(storeController, metaDB, "", "", log)
|
||||
|
||||
ok, err := scanner.isIndexScanable("digest")
|
||||
So(err, ShouldNotBeNil)
|
||||
|
@ -595,8 +595,8 @@ func TestIsIndexScanableErrors(t *testing.T) {
|
|||
})
|
||||
|
||||
Convey("is Manifest Scanable errors", func() {
|
||||
repoDB.GetIndexDataFn = func(indexDigest godigest.Digest) (repodb.IndexData, error) {
|
||||
return repodb.IndexData{IndexBlob: []byte(`{
|
||||
metaDB.GetIndexDataFn = func(indexDigest godigest.Digest) (mTypes.IndexData, error) {
|
||||
return mTypes.IndexData{IndexBlob: []byte(`{
|
||||
"manifests": [{
|
||||
"digest": "digest2"
|
||||
},
|
||||
|
@ -606,19 +606,19 @@ func TestIsIndexScanableErrors(t *testing.T) {
|
|||
]
|
||||
}`)}, nil
|
||||
}
|
||||
repoDB.GetManifestDataFn = func(manifestDigest godigest.Digest) (repodb.ManifestData, error) {
|
||||
metaDB.GetManifestDataFn = func(manifestDigest godigest.Digest) (mTypes.ManifestData, error) {
|
||||
switch manifestDigest {
|
||||
case "digest1":
|
||||
return repodb.ManifestData{
|
||||
return mTypes.ManifestData{
|
||||
ManifestBlob: []byte("{}"),
|
||||
}, nil
|
||||
case "digest2":
|
||||
return repodb.ManifestData{}, zerr.ErrBadBlob
|
||||
return mTypes.ManifestData{}, zerr.ErrBadBlob
|
||||
}
|
||||
|
||||
return repodb.ManifestData{}, nil
|
||||
return mTypes.ManifestData{}, nil
|
||||
}
|
||||
scanner := NewScanner(storeController, repoDB, "", "", log)
|
||||
scanner := NewScanner(storeController, metaDB, "", "", log)
|
||||
|
||||
ok, err := scanner.isIndexScanable("digest")
|
||||
So(err, ShouldBeNil)
|
||||
|
@ -626,18 +626,18 @@ func TestIsIndexScanableErrors(t *testing.T) {
|
|||
})
|
||||
|
||||
Convey("is Manifest Scanable returns false because no manifest is scanable", func() {
|
||||
repoDB.GetIndexDataFn = func(indexDigest godigest.Digest) (repodb.IndexData, error) {
|
||||
return repodb.IndexData{IndexBlob: []byte(`{
|
||||
metaDB.GetIndexDataFn = func(indexDigest godigest.Digest) (mTypes.IndexData, error) {
|
||||
return mTypes.IndexData{IndexBlob: []byte(`{
|
||||
"manifests": [{
|
||||
"digest": "digest2"
|
||||
}
|
||||
]
|
||||
}`)}, nil
|
||||
}
|
||||
repoDB.GetManifestDataFn = func(manifestDigest godigest.Digest) (repodb.ManifestData, error) {
|
||||
return repodb.ManifestData{}, zerr.ErrBadBlob
|
||||
metaDB.GetManifestDataFn = func(manifestDigest godigest.Digest) (mTypes.ManifestData, error) {
|
||||
return mTypes.ManifestData{}, zerr.ErrBadBlob
|
||||
}
|
||||
scanner := NewScanner(storeController, repoDB, "", "", log)
|
||||
scanner := NewScanner(storeController, metaDB, "", "", log)
|
||||
|
||||
ok, err := scanner.isIndexScanable("digest")
|
||||
So(err, ShouldBeNil)
|
||||
|
|
|
@ -15,9 +15,9 @@ import (
|
|||
"zotregistry.io/zot/pkg/extensions/monitoring"
|
||||
"zotregistry.io/zot/pkg/extensions/search/cve/trivy"
|
||||
"zotregistry.io/zot/pkg/log"
|
||||
"zotregistry.io/zot/pkg/meta/bolt"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
boltdb_wrapper "zotregistry.io/zot/pkg/meta/repodb/boltdb-wrapper"
|
||||
"zotregistry.io/zot/pkg/meta"
|
||||
"zotregistry.io/zot/pkg/meta/boltdb"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
"zotregistry.io/zot/pkg/storage"
|
||||
"zotregistry.io/zot/pkg/storage/local"
|
||||
"zotregistry.io/zot/pkg/test"
|
||||
|
@ -64,7 +64,7 @@ func TestScanningByDigest(t *testing.T) {
|
|||
So(err, ShouldBeNil)
|
||||
|
||||
// scan
|
||||
scanner := trivy.NewScanner(ctlr.StoreController, ctlr.RepoDB, "ghcr.io/project-zot/trivy-db", "", ctlr.Log)
|
||||
scanner := trivy.NewScanner(ctlr.StoreController, ctlr.MetaDB, "ghcr.io/project-zot/trivy-db", "", ctlr.Log)
|
||||
|
||||
err = scanner.UpdateDB()
|
||||
So(err, ShouldBeNil)
|
||||
|
@ -100,17 +100,17 @@ func TestScannerErrors(t *testing.T) {
|
|||
storeController := storage.StoreController{}
|
||||
storeController.DefaultStore = mocks.MockedImageStore{}
|
||||
|
||||
repoDB := mocks.RepoDBMock{}
|
||||
metaDB := mocks.MetaDBMock{}
|
||||
log := log.NewLogger("debug", "")
|
||||
|
||||
Convey("IsImageFormatSanable", func() {
|
||||
repoDB.GetManifestDataFn = func(manifestDigest godigest.Digest) (repodb.ManifestData, error) {
|
||||
return repodb.ManifestData{}, zerr.ErrManifestDataNotFound
|
||||
metaDB.GetManifestDataFn = func(manifestDigest godigest.Digest) (mTypes.ManifestData, error) {
|
||||
return mTypes.ManifestData{}, zerr.ErrManifestDataNotFound
|
||||
}
|
||||
repoDB.GetIndexDataFn = func(indexDigest godigest.Digest) (repodb.IndexData, error) {
|
||||
return repodb.IndexData{}, zerr.ErrManifestDataNotFound
|
||||
metaDB.GetIndexDataFn = func(indexDigest godigest.Digest) (mTypes.IndexData, error) {
|
||||
return mTypes.IndexData{}, zerr.ErrManifestDataNotFound
|
||||
}
|
||||
scanner := trivy.NewScanner(storeController, repoDB, "", "", log)
|
||||
scanner := trivy.NewScanner(storeController, metaDB, "", "", log)
|
||||
|
||||
_, err := scanner.ScanImage("repo@" + digest.String())
|
||||
So(err, ShouldNotBeNil)
|
||||
|
@ -165,19 +165,19 @@ func TestVulnerableLayer(t *testing.T) {
|
|||
err = test.WriteImageToFileSystem(img, "repo", storeController)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
params := bolt.DBParameters{
|
||||
params := boltdb.DBParameters{
|
||||
RootDir: tempDir,
|
||||
}
|
||||
boltDriver, err := bolt.GetBoltDriver(params)
|
||||
boltDriver, err := boltdb.GetBoltDriver(params)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
repoDB, err := boltdb_wrapper.NewBoltDBWrapper(boltDriver, log)
|
||||
metaDB, err := boltdb.New(boltDriver, log)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = repodb.ParseStorage(repoDB, storeController, log)
|
||||
err = meta.ParseStorage(metaDB, storeController, log)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
scanner := trivy.NewScanner(storeController, repoDB, "ghcr.io/project-zot/trivy-db", "", log)
|
||||
scanner := trivy.NewScanner(storeController, metaDB, "ghcr.io/project-zot/trivy-db", "", log)
|
||||
|
||||
err = scanner.UpdateDB()
|
||||
So(err, ShouldBeNil)
|
||||
|
|
|
@ -24,7 +24,7 @@ import (
|
|||
cvemodel "zotregistry.io/zot/pkg/extensions/search/cve/model"
|
||||
"zotregistry.io/zot/pkg/extensions/search/gql_generated"
|
||||
"zotregistry.io/zot/pkg/log"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
localCtx "zotregistry.io/zot/pkg/requestcontext"
|
||||
"zotregistry.io/zot/pkg/storage"
|
||||
)
|
||||
|
@ -38,18 +38,18 @@ const (
|
|||
// Resolver ...
|
||||
type Resolver struct {
|
||||
cveInfo cveinfo.CveInfo
|
||||
repoDB repodb.RepoDB
|
||||
metaDB mTypes.MetaDB
|
||||
storeController storage.StoreController
|
||||
log log.Logger
|
||||
}
|
||||
|
||||
// GetResolverConfig ...
|
||||
func GetResolverConfig(log log.Logger, storeController storage.StoreController,
|
||||
repoDB repodb.RepoDB, cveInfo cveinfo.CveInfo,
|
||||
metaDB mTypes.MetaDB, cveInfo cveinfo.CveInfo,
|
||||
) gql_generated.Config {
|
||||
resConfig := &Resolver{
|
||||
cveInfo: cveInfo,
|
||||
repoDB: repoDB,
|
||||
metaDB: metaDB,
|
||||
storeController: storeController,
|
||||
log: log,
|
||||
}
|
||||
|
@ -61,11 +61,11 @@ func GetResolverConfig(log log.Logger, storeController storage.StoreController,
|
|||
}
|
||||
|
||||
func NewResolver(log log.Logger, storeController storage.StoreController,
|
||||
repoDB repodb.RepoDB, cveInfo cveinfo.CveInfo,
|
||||
metaDB mTypes.MetaDB, cveInfo cveinfo.CveInfo,
|
||||
) *Resolver {
|
||||
resolver := &Resolver{
|
||||
cveInfo: cveInfo,
|
||||
repoDB: repoDB,
|
||||
metaDB: metaDB,
|
||||
storeController: storeController,
|
||||
log: log,
|
||||
}
|
||||
|
@ -73,8 +73,8 @@ func NewResolver(log log.Logger, storeController storage.StoreController,
|
|||
return resolver
|
||||
}
|
||||
|
||||
func FilterByDigest(digest string) repodb.FilterFunc {
|
||||
return func(repoMeta repodb.RepoMetadata, manifestMeta repodb.ManifestMetadata) bool {
|
||||
func FilterByDigest(digest string) mTypes.FilterFunc {
|
||||
return func(repoMeta mTypes.RepoMetadata, manifestMeta mTypes.ManifestMetadata) bool {
|
||||
lookupDigest := digest
|
||||
contains := false
|
||||
|
||||
|
@ -111,7 +111,7 @@ func FilterByDigest(digest string) repodb.FilterFunc {
|
|||
}
|
||||
}
|
||||
|
||||
func getImageListForDigest(ctx context.Context, digest string, repoDB repodb.RepoDB, cveInfo cveinfo.CveInfo,
|
||||
func getImageListForDigest(ctx context.Context, digest string, metaDB mTypes.MetaDB, cveInfo cveinfo.CveInfo,
|
||||
requestedPage *gql_generated.PageInput,
|
||||
) (*gql_generated.PaginatedImagesResult, error) {
|
||||
imageList := make([]*gql_generated.ImageSummary, 0)
|
||||
|
@ -124,17 +124,17 @@ func getImageListForDigest(ctx context.Context, digest string, repoDB repodb.Rep
|
|||
Vulnerabilities: canSkipField(convert.GetPreloads(ctx), "Images.Vulnerabilities"),
|
||||
}
|
||||
|
||||
pageInput := repodb.PageInput{
|
||||
pageInput := mTypes.PageInput{
|
||||
Limit: safeDereferencing(requestedPage.Limit, 0),
|
||||
Offset: safeDereferencing(requestedPage.Offset, 0),
|
||||
SortBy: repodb.SortCriteria(
|
||||
SortBy: mTypes.SortCriteria(
|
||||
safeDereferencing(requestedPage.SortBy, gql_generated.SortCriteriaRelevance),
|
||||
),
|
||||
}
|
||||
|
||||
// get all repos
|
||||
reposMeta, manifestMetaMap, indexDataMap, pageInfo, err := repoDB.FilterTags(ctx,
|
||||
FilterByDigest(digest), repodb.Filter{}, pageInput)
|
||||
reposMeta, manifestMetaMap, indexDataMap, pageInfo, err := metaDB.FilterTags(ctx,
|
||||
FilterByDigest(digest), mTypes.Filter{}, pageInput)
|
||||
if err != nil {
|
||||
return &gql_generated.PaginatedImagesResult{}, err
|
||||
}
|
||||
|
@ -155,12 +155,12 @@ func getImageListForDigest(ctx context.Context, digest string, repoDB repodb.Rep
|
|||
}, nil
|
||||
}
|
||||
|
||||
func getImageSummary(ctx context.Context, repo, tag string, digest *string, repoDB repodb.RepoDB,
|
||||
func getImageSummary(ctx context.Context, repo, tag string, digest *string, metaDB mTypes.MetaDB,
|
||||
cveInfo cveinfo.CveInfo, log log.Logger, //nolint:unparam
|
||||
) (
|
||||
*gql_generated.ImageSummary, error,
|
||||
) {
|
||||
repoMeta, err := repoDB.GetRepoMeta(repo)
|
||||
repoMeta, err := metaDB.GetRepoMeta(repo)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -177,8 +177,8 @@ func getImageSummary(ctx context.Context, repo, tag string, digest *string, repo
|
|||
}
|
||||
|
||||
var (
|
||||
manifestMetaMap = map[string]repodb.ManifestMetadata{}
|
||||
indexDataMap = map[string]repodb.IndexData{}
|
||||
manifestMetaMap = map[string]mTypes.ManifestMetadata{}
|
||||
indexDataMap = map[string]mTypes.IndexData{}
|
||||
)
|
||||
|
||||
switch manifestDescriptor.MediaType {
|
||||
|
@ -190,19 +190,19 @@ func getImageSummary(ctx context.Context, repo, tag string, digest *string, repo
|
|||
manifestDigest, repo, tag, zerr.ErrManifestDataNotFound)
|
||||
}
|
||||
|
||||
manifestData, err := repoDB.GetManifestData(godigest.Digest(manifestDigest))
|
||||
manifestData, err := metaDB.GetManifestData(godigest.Digest(manifestDigest))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
manifestMetaMap[manifestDigest] = repodb.ManifestMetadata{
|
||||
manifestMetaMap[manifestDigest] = mTypes.ManifestMetadata{
|
||||
ManifestBlob: manifestData.ManifestBlob,
|
||||
ConfigBlob: manifestData.ConfigBlob,
|
||||
}
|
||||
case ispec.MediaTypeImageIndex:
|
||||
indexDigest := manifestDescriptor.Digest
|
||||
|
||||
indexData, err := repoDB.GetIndexData(godigest.Digest(indexDigest))
|
||||
indexData, err := metaDB.GetIndexData(godigest.Digest(indexDigest))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -232,20 +232,20 @@ func getImageSummary(ctx context.Context, repo, tag string, digest *string, repo
|
|||
manifestDigest, repo, tag, zerr.ErrManifestDataNotFound)
|
||||
}
|
||||
|
||||
manifestData, err := repoDB.GetManifestData(godigest.Digest(manifestDigest))
|
||||
manifestData, err := metaDB.GetManifestData(godigest.Digest(manifestDigest))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("resolver: can't get ManifestData for digest %s for image '%s:%s' %w",
|
||||
manifestDigest, repo, tag, err)
|
||||
}
|
||||
|
||||
manifestMetaMap[manifestDigest] = repodb.ManifestMetadata{
|
||||
manifestMetaMap[manifestDigest] = mTypes.ManifestMetadata{
|
||||
ManifestBlob: manifestData.ManifestBlob,
|
||||
ConfigBlob: manifestData.ConfigBlob,
|
||||
}
|
||||
|
||||
// We update the tag descriptor to be the manifest descriptor with digest specified in the
|
||||
// 'digest' parameter. We treat it as a standalone image.
|
||||
repoMeta.Tags[tag] = repodb.Descriptor{
|
||||
repoMeta.Tags[tag] = mTypes.Descriptor{
|
||||
Digest: manifestDigest,
|
||||
MediaType: ispec.MediaTypeImageManifest,
|
||||
}
|
||||
|
@ -254,13 +254,13 @@ func getImageSummary(ctx context.Context, repo, tag string, digest *string, repo
|
|||
}
|
||||
|
||||
for _, manifest := range indexContent.Manifests {
|
||||
manifestData, err := repoDB.GetManifestData(manifest.Digest)
|
||||
manifestData, err := metaDB.GetManifestData(manifest.Digest)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("resolver: can't get ManifestData for digest %s for image '%s:%s' %w",
|
||||
manifest.Digest, repo, tag, err)
|
||||
}
|
||||
|
||||
manifestMetaMap[manifest.Digest.String()] = repodb.ManifestMetadata{
|
||||
manifestMetaMap[manifest.Digest.String()] = mTypes.ManifestMetadata{
|
||||
ManifestBlob: manifestData.ManifestBlob,
|
||||
ConfigBlob: manifestData.ConfigBlob,
|
||||
}
|
||||
|
@ -357,8 +357,8 @@ func getCVEListForImage(
|
|||
}, nil
|
||||
}
|
||||
|
||||
func FilterByTagInfo(tagsInfo []cvemodel.TagInfo) repodb.FilterFunc {
|
||||
return func(repoMeta repodb.RepoMetadata, manifestMeta repodb.ManifestMetadata) bool {
|
||||
func FilterByTagInfo(tagsInfo []cvemodel.TagInfo) mTypes.FilterFunc {
|
||||
return func(repoMeta mTypes.RepoMetadata, manifestMeta mTypes.ManifestMetadata) bool {
|
||||
manifestDigest := godigest.FromBytes(manifestMeta.ManifestBlob).String()
|
||||
|
||||
for _, tagInfo := range tagsInfo {
|
||||
|
@ -386,16 +386,16 @@ func getImageListForCVE(
|
|||
cveInfo cveinfo.CveInfo,
|
||||
filter *gql_generated.Filter,
|
||||
requestedPage *gql_generated.PageInput,
|
||||
repoDB repodb.RepoDB,
|
||||
metaDB mTypes.MetaDB,
|
||||
log log.Logger,
|
||||
) (*gql_generated.PaginatedImagesResult, error) {
|
||||
// Obtain all repos and tags
|
||||
// Infinite page to make sure we scan all repos in advance, before filtering results
|
||||
// The CVE scan logic is called from here, not in the actual filter,
|
||||
// this is because we shouldn't keep the DB locked while we wait on scan results
|
||||
reposMeta, err := repoDB.GetMultipleRepoMeta(ctx,
|
||||
func(repoMeta repodb.RepoMetadata) bool { return true },
|
||||
repodb.PageInput{Limit: 0, Offset: 0, SortBy: repodb.SortCriteria(gql_generated.SortCriteriaUpdateTime)},
|
||||
reposMeta, err := metaDB.GetMultipleRepoMeta(ctx,
|
||||
func(repoMeta mTypes.RepoMetadata) bool { return true },
|
||||
mTypes.PageInput{Limit: 0, Offset: 0, SortBy: mTypes.SortCriteria(gql_generated.SortCriteriaUpdateTime)},
|
||||
)
|
||||
if err != nil {
|
||||
return &gql_generated.PaginatedImagesResult{}, err
|
||||
|
@ -428,9 +428,9 @@ func getImageListForCVE(
|
|||
requestedPage = &gql_generated.PageInput{}
|
||||
}
|
||||
|
||||
localFilter := repodb.Filter{}
|
||||
localFilter := mTypes.Filter{}
|
||||
if filter != nil {
|
||||
localFilter = repodb.Filter{
|
||||
localFilter = mTypes.Filter{
|
||||
Os: filter.Os,
|
||||
Arch: filter.Arch,
|
||||
HasToBeSigned: filter.HasToBeSigned,
|
||||
|
@ -440,16 +440,16 @@ func getImageListForCVE(
|
|||
}
|
||||
|
||||
// Actual page requested by user
|
||||
pageInput := repodb.PageInput{
|
||||
pageInput := mTypes.PageInput{
|
||||
Limit: safeDereferencing(requestedPage.Limit, 0),
|
||||
Offset: safeDereferencing(requestedPage.Offset, 0),
|
||||
SortBy: repodb.SortCriteria(
|
||||
SortBy: mTypes.SortCriteria(
|
||||
safeDereferencing(requestedPage.SortBy, gql_generated.SortCriteriaUpdateTime),
|
||||
),
|
||||
}
|
||||
|
||||
// get all repos
|
||||
reposMeta, manifestMetaMap, indexDataMap, pageInfo, err := repoDB.FilterTags(ctx,
|
||||
reposMeta, manifestMetaMap, indexDataMap, pageInfo, err := metaDB.FilterTags(ctx,
|
||||
FilterByTagInfo(affectedImages), localFilter, pageInput)
|
||||
if err != nil {
|
||||
return &gql_generated.PaginatedImagesResult{}, err
|
||||
|
@ -477,7 +477,7 @@ func getImageListWithCVEFixed(
|
|||
cveInfo cveinfo.CveInfo,
|
||||
filter *gql_generated.Filter,
|
||||
requestedPage *gql_generated.PageInput,
|
||||
repoDB repodb.RepoDB,
|
||||
metaDB mTypes.MetaDB,
|
||||
log log.Logger,
|
||||
) (*gql_generated.PaginatedImagesResult, error) {
|
||||
imageList := make([]*gql_generated.ImageSummary, 0)
|
||||
|
@ -502,9 +502,9 @@ func getImageListWithCVEFixed(
|
|||
requestedPage = &gql_generated.PageInput{}
|
||||
}
|
||||
|
||||
localFilter := repodb.Filter{}
|
||||
localFilter := mTypes.Filter{}
|
||||
if filter != nil {
|
||||
localFilter = repodb.Filter{
|
||||
localFilter = mTypes.Filter{
|
||||
Os: filter.Os,
|
||||
Arch: filter.Arch,
|
||||
HasToBeSigned: filter.HasToBeSigned,
|
||||
|
@ -514,16 +514,16 @@ func getImageListWithCVEFixed(
|
|||
}
|
||||
|
||||
// Actual page requested by user
|
||||
pageInput := repodb.PageInput{
|
||||
pageInput := mTypes.PageInput{
|
||||
Limit: safeDereferencing(requestedPage.Limit, 0),
|
||||
Offset: safeDereferencing(requestedPage.Offset, 0),
|
||||
SortBy: repodb.SortCriteria(
|
||||
SortBy: mTypes.SortCriteria(
|
||||
safeDereferencing(requestedPage.SortBy, gql_generated.SortCriteriaUpdateTime),
|
||||
),
|
||||
}
|
||||
|
||||
// get all repos
|
||||
reposMeta, manifestMetaMap, indexDataMap, pageInfo, err := repoDB.FilterTags(ctx,
|
||||
reposMeta, manifestMetaMap, indexDataMap, pageInfo, err := metaDB.FilterTags(ctx,
|
||||
FilterByTagInfo(tagsInfo), localFilter, pageInput,
|
||||
)
|
||||
if err != nil {
|
||||
|
@ -553,7 +553,7 @@ func repoListWithNewestImage(
|
|||
cveInfo cveinfo.CveInfo,
|
||||
log log.Logger, //nolint:unparam // may be used by devs for debugging
|
||||
requestedPage *gql_generated.PageInput,
|
||||
repoDB repodb.RepoDB,
|
||||
metaDB mTypes.MetaDB,
|
||||
) (*gql_generated.PaginatedReposResult, error) {
|
||||
repos := []*gql_generated.RepoSummary{}
|
||||
paginatedRepos := &gql_generated.PaginatedReposResult{}
|
||||
|
@ -566,15 +566,15 @@ func repoListWithNewestImage(
|
|||
Vulnerabilities: canSkipField(convert.GetPreloads(ctx), "Results.NewestImage.Vulnerabilities"),
|
||||
}
|
||||
|
||||
pageInput := repodb.PageInput{
|
||||
pageInput := mTypes.PageInput{
|
||||
Limit: safeDereferencing(requestedPage.Limit, 0),
|
||||
Offset: safeDereferencing(requestedPage.Offset, 0),
|
||||
SortBy: repodb.SortCriteria(
|
||||
SortBy: mTypes.SortCriteria(
|
||||
safeDereferencing(requestedPage.SortBy, gql_generated.SortCriteriaUpdateTime),
|
||||
),
|
||||
}
|
||||
|
||||
reposMeta, manifestMetaMap, indexDataMap, pageInfo, err := repoDB.SearchRepos(ctx, "", repodb.Filter{}, pageInput)
|
||||
reposMeta, manifestMetaMap, indexDataMap, pageInfo, err := metaDB.SearchRepos(ctx, "", mTypes.Filter{}, pageInput)
|
||||
if err != nil {
|
||||
return &gql_generated.PaginatedReposResult{}, err
|
||||
}
|
||||
|
@ -599,18 +599,18 @@ func getBookmarkedRepos(
|
|||
cveInfo cveinfo.CveInfo,
|
||||
log log.Logger, //nolint:unparam // may be used by devs for debugging
|
||||
requestedPage *gql_generated.PageInput,
|
||||
repoDB repodb.RepoDB,
|
||||
metaDB mTypes.MetaDB,
|
||||
) (*gql_generated.PaginatedReposResult, error) {
|
||||
repoNames, err := repoDB.GetBookmarkedRepos(ctx)
|
||||
repoNames, err := metaDB.GetBookmarkedRepos(ctx)
|
||||
if err != nil {
|
||||
return &gql_generated.PaginatedReposResult{}, err
|
||||
}
|
||||
|
||||
filterFn := func(repoMeta repodb.RepoMetadata) bool {
|
||||
filterFn := func(repoMeta mTypes.RepoMetadata) bool {
|
||||
return zcommon.Contains(repoNames, repoMeta.Name)
|
||||
}
|
||||
|
||||
return getFilteredPaginatedRepos(ctx, cveInfo, filterFn, log, requestedPage, repoDB)
|
||||
return getFilteredPaginatedRepos(ctx, cveInfo, filterFn, log, requestedPage, metaDB)
|
||||
}
|
||||
|
||||
func getStarredRepos(
|
||||
|
@ -618,27 +618,27 @@ func getStarredRepos(
|
|||
cveInfo cveinfo.CveInfo,
|
||||
log log.Logger, //nolint:unparam // may be used by devs for debugging
|
||||
requestedPage *gql_generated.PageInput,
|
||||
repoDB repodb.RepoDB,
|
||||
metaDB mTypes.MetaDB,
|
||||
) (*gql_generated.PaginatedReposResult, error) {
|
||||
repoNames, err := repoDB.GetStarredRepos(ctx)
|
||||
repoNames, err := metaDB.GetStarredRepos(ctx)
|
||||
if err != nil {
|
||||
return &gql_generated.PaginatedReposResult{}, err
|
||||
}
|
||||
|
||||
filterFn := func(repoMeta repodb.RepoMetadata) bool {
|
||||
filterFn := func(repoMeta mTypes.RepoMetadata) bool {
|
||||
return zcommon.Contains(repoNames, repoMeta.Name)
|
||||
}
|
||||
|
||||
return getFilteredPaginatedRepos(ctx, cveInfo, filterFn, log, requestedPage, repoDB)
|
||||
return getFilteredPaginatedRepos(ctx, cveInfo, filterFn, log, requestedPage, metaDB)
|
||||
}
|
||||
|
||||
func getFilteredPaginatedRepos(
|
||||
ctx context.Context,
|
||||
cveInfo cveinfo.CveInfo,
|
||||
filterFn repodb.FilterRepoFunc,
|
||||
filterFn mTypes.FilterRepoFunc,
|
||||
log log.Logger, //nolint:unparam // may be used by devs for debugging
|
||||
requestedPage *gql_generated.PageInput,
|
||||
repoDB repodb.RepoDB,
|
||||
metaDB mTypes.MetaDB,
|
||||
) (*gql_generated.PaginatedReposResult, error) {
|
||||
repos := []*gql_generated.RepoSummary{}
|
||||
paginatedRepos := &gql_generated.PaginatedReposResult{}
|
||||
|
@ -651,15 +651,15 @@ func getFilteredPaginatedRepos(
|
|||
Vulnerabilities: canSkipField(convert.GetPreloads(ctx), "Results.NewestImage.Vulnerabilities"),
|
||||
}
|
||||
|
||||
pageInput := repodb.PageInput{
|
||||
pageInput := mTypes.PageInput{
|
||||
Limit: safeDereferencing(requestedPage.Limit, 0),
|
||||
Offset: safeDereferencing(requestedPage.Offset, 0),
|
||||
SortBy: repodb.SortCriteria(
|
||||
SortBy: mTypes.SortCriteria(
|
||||
safeDereferencing(requestedPage.SortBy, gql_generated.SortCriteriaUpdateTime),
|
||||
),
|
||||
}
|
||||
|
||||
reposMeta, manifestMetaMap, indexDataMap, pageInfo, err := repoDB.FilterRepos(ctx, filterFn, pageInput)
|
||||
reposMeta, manifestMetaMap, indexDataMap, pageInfo, err := metaDB.FilterRepos(ctx, filterFn, pageInput)
|
||||
if err != nil {
|
||||
return paginatedRepos, err
|
||||
}
|
||||
|
@ -679,7 +679,7 @@ func getFilteredPaginatedRepos(
|
|||
return paginatedRepos, nil
|
||||
}
|
||||
|
||||
func globalSearch(ctx context.Context, query string, repoDB repodb.RepoDB, filter *gql_generated.Filter,
|
||||
func globalSearch(ctx context.Context, query string, metaDB mTypes.MetaDB, filter *gql_generated.Filter,
|
||||
requestedPage *gql_generated.PageInput, cveInfo cveinfo.CveInfo, log log.Logger, //nolint:unparam
|
||||
) (*gql_generated.PaginatedReposResult, []*gql_generated.ImageSummary, []*gql_generated.LayerSummary, error,
|
||||
) {
|
||||
|
@ -693,9 +693,9 @@ func globalSearch(ctx context.Context, query string, repoDB repodb.RepoDB, filte
|
|||
requestedPage = &gql_generated.PageInput{}
|
||||
}
|
||||
|
||||
localFilter := repodb.Filter{}
|
||||
localFilter := mTypes.Filter{}
|
||||
if filter != nil {
|
||||
localFilter = repodb.Filter{
|
||||
localFilter = mTypes.Filter{
|
||||
Os: filter.Os,
|
||||
Arch: filter.Arch,
|
||||
HasToBeSigned: filter.HasToBeSigned,
|
||||
|
@ -709,15 +709,15 @@ func globalSearch(ctx context.Context, query string, repoDB repodb.RepoDB, filte
|
|||
Vulnerabilities: canSkipField(preloads, "Repos.NewestImage.Vulnerabilities"),
|
||||
}
|
||||
|
||||
pageInput := repodb.PageInput{
|
||||
pageInput := mTypes.PageInput{
|
||||
Limit: safeDereferencing(requestedPage.Limit, 0),
|
||||
Offset: safeDereferencing(requestedPage.Offset, 0),
|
||||
SortBy: repodb.SortCriteria(
|
||||
SortBy: mTypes.SortCriteria(
|
||||
safeDereferencing(requestedPage.SortBy, gql_generated.SortCriteriaRelevance),
|
||||
),
|
||||
}
|
||||
|
||||
reposMeta, manifestMetaMap, indexDataMap, pageInfo, err := repoDB.SearchRepos(ctx, query, localFilter, pageInput)
|
||||
reposMeta, manifestMetaMap, indexDataMap, pageInfo, err := metaDB.SearchRepos(ctx, query, localFilter, pageInput)
|
||||
if err != nil {
|
||||
return &gql_generated.PaginatedReposResult{}, []*gql_generated.ImageSummary{}, []*gql_generated.LayerSummary{}, err
|
||||
}
|
||||
|
@ -740,15 +740,15 @@ func globalSearch(ctx context.Context, query string, repoDB repodb.RepoDB, filte
|
|||
Vulnerabilities: canSkipField(preloads, "Images.Vulnerabilities"),
|
||||
}
|
||||
|
||||
pageInput := repodb.PageInput{
|
||||
pageInput := mTypes.PageInput{
|
||||
Limit: safeDereferencing(requestedPage.Limit, 0),
|
||||
Offset: safeDereferencing(requestedPage.Offset, 0),
|
||||
SortBy: repodb.SortCriteria(
|
||||
SortBy: mTypes.SortCriteria(
|
||||
safeDereferencing(requestedPage.SortBy, gql_generated.SortCriteriaRelevance),
|
||||
),
|
||||
}
|
||||
|
||||
reposMeta, manifestMetaMap, indexDataMap, pageInfo, err := repoDB.SearchTags(ctx, query, localFilter, pageInput)
|
||||
reposMeta, manifestMetaMap, indexDataMap, pageInfo, err := metaDB.SearchTags(ctx, query, localFilter, pageInput)
|
||||
if err != nil {
|
||||
return &gql_generated.PaginatedReposResult{}, []*gql_generated.ImageSummary{}, []*gql_generated.LayerSummary{}, err
|
||||
}
|
||||
|
@ -774,7 +774,7 @@ func canSkipField(preloads map[string]bool, s string) bool {
|
|||
return !fieldIsPresent
|
||||
}
|
||||
|
||||
func derivedImageList(ctx context.Context, image string, digest *string, repoDB repodb.RepoDB,
|
||||
func derivedImageList(ctx context.Context, image string, digest *string, metaDB mTypes.MetaDB,
|
||||
requestedPage *gql_generated.PageInput,
|
||||
cveInfo cveinfo.CveInfo, log log.Logger,
|
||||
) (*gql_generated.PaginatedImagesResult, error) {
|
||||
|
@ -784,10 +784,10 @@ func derivedImageList(ctx context.Context, image string, digest *string, repoDB
|
|||
requestedPage = &gql_generated.PageInput{}
|
||||
}
|
||||
|
||||
pageInput := repodb.PageInput{
|
||||
pageInput := mTypes.PageInput{
|
||||
Limit: safeDereferencing(requestedPage.Limit, 0),
|
||||
Offset: safeDereferencing(requestedPage.Offset, 0),
|
||||
SortBy: repodb.SortCriteria(
|
||||
SortBy: mTypes.SortCriteria(
|
||||
safeDereferencing(requestedPage.SortBy, gql_generated.SortCriteriaUpdateTime),
|
||||
),
|
||||
}
|
||||
|
@ -801,7 +801,7 @@ func derivedImageList(ctx context.Context, image string, digest *string, repoDB
|
|||
return &gql_generated.PaginatedImagesResult{}, gqlerror.Errorf("no reference provided")
|
||||
}
|
||||
|
||||
searchedImage, err := getImageSummary(ctx, imageRepo, imageTag, digest, repoDB, cveInfo, log)
|
||||
searchedImage, err := getImageSummary(ctx, imageRepo, imageTag, digest, metaDB, cveInfo, log)
|
||||
if err != nil {
|
||||
if errors.Is(err, zerr.ErrRepoMetaNotFound) {
|
||||
return &gql_generated.PaginatedImagesResult{}, gqlerror.Errorf("repository: not found")
|
||||
|
@ -811,9 +811,9 @@ func derivedImageList(ctx context.Context, image string, digest *string, repoDB
|
|||
}
|
||||
|
||||
// we need all available tags
|
||||
reposMeta, manifestMetaMap, indexDataMap, pageInfo, err := repoDB.FilterTags(ctx,
|
||||
reposMeta, manifestMetaMap, indexDataMap, pageInfo, err := metaDB.FilterTags(ctx,
|
||||
filterDerivedImages(searchedImage),
|
||||
repodb.Filter{},
|
||||
mTypes.Filter{},
|
||||
pageInput)
|
||||
if err != nil {
|
||||
return &gql_generated.PaginatedImagesResult{}, err
|
||||
|
@ -842,8 +842,8 @@ func derivedImageList(ctx context.Context, image string, digest *string, repoDB
|
|||
}, nil
|
||||
}
|
||||
|
||||
func filterDerivedImages(image *gql_generated.ImageSummary) repodb.FilterFunc {
|
||||
return func(repoMeta repodb.RepoMetadata, manifestMeta repodb.ManifestMetadata) bool {
|
||||
func filterDerivedImages(image *gql_generated.ImageSummary) mTypes.FilterFunc {
|
||||
return func(repoMeta mTypes.RepoMetadata, manifestMeta mTypes.ManifestMetadata) bool {
|
||||
var addImageToList bool
|
||||
|
||||
var imageManifest ispec.Manifest
|
||||
|
@ -888,7 +888,7 @@ func filterDerivedImages(image *gql_generated.ImageSummary) repodb.FilterFunc {
|
|||
}
|
||||
}
|
||||
|
||||
func baseImageList(ctx context.Context, image string, digest *string, repoDB repodb.RepoDB,
|
||||
func baseImageList(ctx context.Context, image string, digest *string, metaDB mTypes.MetaDB,
|
||||
requestedPage *gql_generated.PageInput,
|
||||
cveInfo cveinfo.CveInfo, log log.Logger,
|
||||
) (*gql_generated.PaginatedImagesResult, error) {
|
||||
|
@ -898,10 +898,10 @@ func baseImageList(ctx context.Context, image string, digest *string, repoDB rep
|
|||
requestedPage = &gql_generated.PageInput{}
|
||||
}
|
||||
|
||||
pageInput := repodb.PageInput{
|
||||
pageInput := mTypes.PageInput{
|
||||
Limit: safeDereferencing(requestedPage.Limit, 0),
|
||||
Offset: safeDereferencing(requestedPage.Offset, 0),
|
||||
SortBy: repodb.SortCriteria(
|
||||
SortBy: mTypes.SortCriteria(
|
||||
safeDereferencing(requestedPage.SortBy, gql_generated.SortCriteriaUpdateTime),
|
||||
),
|
||||
}
|
||||
|
@ -916,7 +916,7 @@ func baseImageList(ctx context.Context, image string, digest *string, repoDB rep
|
|||
return &gql_generated.PaginatedImagesResult{}, gqlerror.Errorf("no reference provided")
|
||||
}
|
||||
|
||||
searchedImage, err := getImageSummary(ctx, imageRepo, imageTag, digest, repoDB, cveInfo, log)
|
||||
searchedImage, err := getImageSummary(ctx, imageRepo, imageTag, digest, metaDB, cveInfo, log)
|
||||
if err != nil {
|
||||
if errors.Is(err, zerr.ErrRepoMetaNotFound) {
|
||||
return &gql_generated.PaginatedImagesResult{}, gqlerror.Errorf("repository: not found")
|
||||
|
@ -926,9 +926,9 @@ func baseImageList(ctx context.Context, image string, digest *string, repoDB rep
|
|||
}
|
||||
|
||||
// we need all available tags
|
||||
reposMeta, manifestMetaMap, indexDataMap, pageInfo, err := repoDB.FilterTags(ctx,
|
||||
reposMeta, manifestMetaMap, indexDataMap, pageInfo, err := metaDB.FilterTags(ctx,
|
||||
filterBaseImages(searchedImage),
|
||||
repodb.Filter{},
|
||||
mTypes.Filter{},
|
||||
pageInput)
|
||||
if err != nil {
|
||||
return &gql_generated.PaginatedImagesResult{}, err
|
||||
|
@ -957,8 +957,8 @@ func baseImageList(ctx context.Context, image string, digest *string, repoDB rep
|
|||
}, nil
|
||||
}
|
||||
|
||||
func filterBaseImages(image *gql_generated.ImageSummary) repodb.FilterFunc {
|
||||
return func(repoMeta repodb.RepoMetadata, manifestMeta repodb.ManifestMetadata) bool {
|
||||
func filterBaseImages(image *gql_generated.ImageSummary) mTypes.FilterFunc {
|
||||
return func(repoMeta mTypes.RepoMetadata, manifestMeta mTypes.ManifestMetadata) bool {
|
||||
var addImageToList bool
|
||||
|
||||
var manifestContent ispec.Manifest
|
||||
|
@ -1122,7 +1122,7 @@ func deleteElementAt(slice []*string, i int) []*string {
|
|||
return slice
|
||||
}
|
||||
|
||||
func expandedRepoInfo(ctx context.Context, repo string, repoDB repodb.RepoDB, cveInfo cveinfo.CveInfo, log log.Logger,
|
||||
func expandedRepoInfo(ctx context.Context, repo string, metaDB mTypes.MetaDB, cveInfo cveinfo.CveInfo, log log.Logger,
|
||||
) (*gql_generated.RepoInfo, error) {
|
||||
if ok, err := localCtx.RepoIsUserAvailable(ctx, repo); !ok || err != nil {
|
||||
log.Info().Err(err).Str("repository", repo).Bool("availability", ok).Msg("resolver: repo user availability")
|
||||
|
@ -1130,7 +1130,7 @@ func expandedRepoInfo(ctx context.Context, repo string, repoDB repodb.RepoDB, cv
|
|||
return &gql_generated.RepoInfo{}, nil //nolint:nilerr // don't give details to a potential attacker
|
||||
}
|
||||
|
||||
repoMeta, err := repoDB.GetUserRepoMeta(ctx, repo)
|
||||
repoMeta, err := metaDB.GetUserRepoMeta(ctx, repo)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Str("repository", repo).Msg("resolver: can't retrieve repoMeta for repo")
|
||||
|
||||
|
@ -1138,8 +1138,8 @@ func expandedRepoInfo(ctx context.Context, repo string, repoDB repodb.RepoDB, cv
|
|||
}
|
||||
|
||||
var (
|
||||
manifestMetaMap = map[string]repodb.ManifestMetadata{}
|
||||
indexDataMap = map[string]repodb.IndexData{}
|
||||
manifestMetaMap = map[string]mTypes.ManifestMetadata{}
|
||||
indexDataMap = map[string]mTypes.IndexData{}
|
||||
)
|
||||
|
||||
for tag, descriptor := range repoMeta.Tags {
|
||||
|
@ -1151,7 +1151,7 @@ func expandedRepoInfo(ctx context.Context, repo string, repoDB repodb.RepoDB, cv
|
|||
continue
|
||||
}
|
||||
|
||||
manifestData, err := repoDB.GetManifestData(godigest.Digest(digest))
|
||||
manifestData, err := metaDB.GetManifestData(godigest.Digest(digest))
|
||||
if err != nil {
|
||||
graphql.AddError(ctx, fmt.Errorf("resolver: failed to get manifest meta for image %s:%s with manifest digest %s %w",
|
||||
repo, tag, digest, err))
|
||||
|
@ -1159,7 +1159,7 @@ func expandedRepoInfo(ctx context.Context, repo string, repoDB repodb.RepoDB, cv
|
|||
continue
|
||||
}
|
||||
|
||||
manifestMetaMap[digest] = repodb.ManifestMetadata{
|
||||
manifestMetaMap[digest] = mTypes.ManifestMetadata{
|
||||
ManifestBlob: manifestData.ManifestBlob,
|
||||
ConfigBlob: manifestData.ConfigBlob,
|
||||
}
|
||||
|
@ -1170,7 +1170,7 @@ func expandedRepoInfo(ctx context.Context, repo string, repoDB repodb.RepoDB, cv
|
|||
continue
|
||||
}
|
||||
|
||||
indexData, err := repoDB.GetIndexData(godigest.Digest(digest))
|
||||
indexData, err := metaDB.GetIndexData(godigest.Digest(digest))
|
||||
if err != nil {
|
||||
graphql.AddError(ctx, fmt.Errorf("resolver: failed to get manifest meta for image %s:%s with manifest digest %s %w",
|
||||
repo, tag, digest, err))
|
||||
|
@ -1191,7 +1191,7 @@ func expandedRepoInfo(ctx context.Context, repo string, repoDB repodb.RepoDB, cv
|
|||
var errorOccured bool
|
||||
|
||||
for _, descriptor := range indexContent.Manifests {
|
||||
manifestData, err := repoDB.GetManifestData(descriptor.Digest)
|
||||
manifestData, err := metaDB.GetManifestData(descriptor.Digest)
|
||||
if err != nil {
|
||||
graphql.AddError(ctx,
|
||||
fmt.Errorf("resolver: failed to get manifest meta with digest '%s' for multiarch image %s:%s %w",
|
||||
|
@ -1203,7 +1203,7 @@ func expandedRepoInfo(ctx context.Context, repo string, repoDB repodb.RepoDB, cv
|
|||
break
|
||||
}
|
||||
|
||||
manifestMetaMap[descriptor.Digest.String()] = repodb.ManifestMetadata{
|
||||
manifestMetaMap[descriptor.Digest.String()] = mTypes.ManifestMetadata{
|
||||
ManifestBlob: manifestData.ManifestBlob,
|
||||
ConfigBlob: manifestData.ConfigBlob,
|
||||
}
|
||||
|
@ -1262,7 +1262,7 @@ func searchingForRepos(query string) bool {
|
|||
return !strings.Contains(query, ":")
|
||||
}
|
||||
|
||||
func getImageList(ctx context.Context, repo string, repoDB repodb.RepoDB, cveInfo cveinfo.CveInfo,
|
||||
func getImageList(ctx context.Context, repo string, metaDB mTypes.MetaDB, cveInfo cveinfo.CveInfo,
|
||||
requestedPage *gql_generated.PageInput, log log.Logger, //nolint:unparam
|
||||
) (*gql_generated.PaginatedImagesResult, error) {
|
||||
imageList := make([]*gql_generated.ImageSummary, 0)
|
||||
|
@ -1275,20 +1275,20 @@ func getImageList(ctx context.Context, repo string, repoDB repodb.RepoDB, cveInf
|
|||
Vulnerabilities: canSkipField(convert.GetPreloads(ctx), "Images.Vulnerabilities"),
|
||||
}
|
||||
|
||||
pageInput := repodb.PageInput{
|
||||
pageInput := mTypes.PageInput{
|
||||
Limit: safeDereferencing(requestedPage.Limit, 0),
|
||||
Offset: safeDereferencing(requestedPage.Offset, 0),
|
||||
SortBy: repodb.SortCriteria(
|
||||
SortBy: mTypes.SortCriteria(
|
||||
safeDereferencing(requestedPage.SortBy, gql_generated.SortCriteriaRelevance),
|
||||
),
|
||||
}
|
||||
|
||||
// reposMeta, manifestMetaMap, err := repoDB.SearchRepos(ctx, repo, repodb.Filter{}, pageInput)
|
||||
reposMeta, manifestMetaMap, indexDataMap, pageInfo, err := repoDB.FilterTags(ctx,
|
||||
func(repoMeta repodb.RepoMetadata, manifestMeta repodb.ManifestMetadata) bool {
|
||||
// reposMeta, manifestMetaMap, err := metaDB.SearchRepos(ctx, repo, mTypes.Filter{}, pageInput)
|
||||
reposMeta, manifestMetaMap, indexDataMap, pageInfo, err := metaDB.FilterTags(ctx,
|
||||
func(repoMeta mTypes.RepoMetadata, manifestMeta mTypes.ManifestMetadata) bool {
|
||||
return true
|
||||
},
|
||||
repodb.Filter{},
|
||||
mTypes.Filter{},
|
||||
pageInput)
|
||||
if err != nil {
|
||||
return &gql_generated.PaginatedImagesResult{}, err
|
||||
|
@ -1312,7 +1312,7 @@ func getImageList(ctx context.Context, repo string, repoDB repodb.RepoDB, cveInf
|
|||
}, nil
|
||||
}
|
||||
|
||||
func getReferrers(repoDB repodb.RepoDB, repo string, referredDigest string, artifactTypes []string,
|
||||
func getReferrers(metaDB mTypes.MetaDB, repo string, referredDigest string, artifactTypes []string,
|
||||
log log.Logger,
|
||||
) ([]*gql_generated.Referrer, error) {
|
||||
refDigest := godigest.Digest(referredDigest)
|
||||
|
@ -1323,7 +1323,7 @@ func getReferrers(repoDB repodb.RepoDB, repo string, referredDigest string, arti
|
|||
referredDigest, err)
|
||||
}
|
||||
|
||||
referrers, err := repoDB.GetReferrersInfo(repo, refDigest, artifactTypes)
|
||||
referrers, err := metaDB.GetReferrersInfo(repo, refDigest, artifactTypes)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -34,7 +34,7 @@ func (r *queryResolver) ImageListForCve(ctx context.Context, id string, filter *
|
|||
|
||||
filter = cleanFilter(filter)
|
||||
|
||||
return getImageListForCVE(ctx, id, r.cveInfo, filter, requestedPage, r.repoDB, r.log)
|
||||
return getImageListForCVE(ctx, id, r.cveInfo, filter, requestedPage, r.metaDB, r.log)
|
||||
}
|
||||
|
||||
// ImageListWithCVEFixed is the resolver for the ImageListWithCVEFixed field.
|
||||
|
@ -45,14 +45,14 @@ func (r *queryResolver) ImageListWithCVEFixed(ctx context.Context, id string, im
|
|||
|
||||
filter = cleanFilter(filter)
|
||||
|
||||
return getImageListWithCVEFixed(ctx, id, image, r.cveInfo, filter, requestedPage, r.repoDB, r.log)
|
||||
return getImageListWithCVEFixed(ctx, id, image, r.cveInfo, filter, requestedPage, r.metaDB, r.log)
|
||||
}
|
||||
|
||||
// ImageListForDigest is the resolver for the ImageListForDigest field.
|
||||
func (r *queryResolver) ImageListForDigest(ctx context.Context, id string, requestedPage *gql_generated.PageInput) (*gql_generated.PaginatedImagesResult, error) {
|
||||
r.log.Info().Msg("extracting repositories")
|
||||
|
||||
imgResultForDigest, err := getImageListForDigest(ctx, id, r.repoDB, r.cveInfo, requestedPage)
|
||||
imgResultForDigest, err := getImageListForDigest(ctx, id, r.metaDB, r.cveInfo, requestedPage)
|
||||
|
||||
return imgResultForDigest, err
|
||||
}
|
||||
|
@ -61,7 +61,7 @@ func (r *queryResolver) ImageListForDigest(ctx context.Context, id string, reque
|
|||
func (r *queryResolver) RepoListWithNewestImage(ctx context.Context, requestedPage *gql_generated.PageInput) (*gql_generated.PaginatedReposResult, error) {
|
||||
r.log.Info().Msg("extension api: finding image list")
|
||||
|
||||
paginatedReposResult, err := repoListWithNewestImage(ctx, r.cveInfo, r.log, requestedPage, r.repoDB)
|
||||
paginatedReposResult, err := repoListWithNewestImage(ctx, r.cveInfo, r.log, requestedPage, r.metaDB)
|
||||
if err != nil {
|
||||
r.log.Error().Err(err).Msg("unable to retrieve repo list")
|
||||
|
||||
|
@ -75,7 +75,7 @@ func (r *queryResolver) RepoListWithNewestImage(ctx context.Context, requestedPa
|
|||
func (r *queryResolver) ImageList(ctx context.Context, repo string, requestedPage *gql_generated.PageInput) (*gql_generated.PaginatedImagesResult, error) {
|
||||
r.log.Info().Msg("extension api: getting a list of all images")
|
||||
|
||||
imageList, err := getImageList(ctx, repo, r.repoDB, r.cveInfo, requestedPage, r.log)
|
||||
imageList, err := getImageList(ctx, repo, r.metaDB, r.cveInfo, requestedPage, r.log)
|
||||
if err != nil {
|
||||
r.log.Error().Err(err).Str("repository", repo).Msg("unable to retrieve image list for repo")
|
||||
|
||||
|
@ -87,7 +87,7 @@ func (r *queryResolver) ImageList(ctx context.Context, repo string, requestedPag
|
|||
|
||||
// ExpandedRepoInfo is the resolver for the ExpandedRepoInfo field.
|
||||
func (r *queryResolver) ExpandedRepoInfo(ctx context.Context, repo string) (*gql_generated.RepoInfo, error) {
|
||||
repoInfo, err := expandedRepoInfo(ctx, repo, r.repoDB, r.cveInfo, r.log)
|
||||
repoInfo, err := expandedRepoInfo(ctx, repo, r.metaDB, r.cveInfo, r.log)
|
||||
|
||||
return repoInfo, err
|
||||
}
|
||||
|
@ -101,7 +101,7 @@ func (r *queryResolver) GlobalSearch(ctx context.Context, query string, filter *
|
|||
query = cleanQuery(query)
|
||||
filter = cleanFilter(filter)
|
||||
|
||||
paginatedReposResult, images, layers, err := globalSearch(ctx, query, r.repoDB, filter, requestedPage, r.cveInfo, r.log)
|
||||
paginatedReposResult, images, layers, err := globalSearch(ctx, query, r.metaDB, filter, requestedPage, r.cveInfo, r.log)
|
||||
|
||||
return &gql_generated.GlobalSearchResult{
|
||||
Page: paginatedReposResult.Page,
|
||||
|
@ -113,14 +113,14 @@ func (r *queryResolver) GlobalSearch(ctx context.Context, query string, filter *
|
|||
|
||||
// DependencyListForImage is the resolver for the DependencyListForImage field.
|
||||
func (r *queryResolver) DerivedImageList(ctx context.Context, image string, digest *string, requestedPage *gql_generated.PageInput) (*gql_generated.PaginatedImagesResult, error) {
|
||||
derivedList, err := derivedImageList(ctx, image, digest, r.repoDB, requestedPage, r.cveInfo, r.log)
|
||||
derivedList, err := derivedImageList(ctx, image, digest, r.metaDB, requestedPage, r.cveInfo, r.log)
|
||||
|
||||
return derivedList, err
|
||||
}
|
||||
|
||||
// BaseImageList is the resolver for the BaseImageList field.
|
||||
func (r *queryResolver) BaseImageList(ctx context.Context, image string, digest *string, requestedPage *gql_generated.PageInput) (*gql_generated.PaginatedImagesResult, error) {
|
||||
imageList, err := baseImageList(ctx, image, digest, r.repoDB, requestedPage, r.cveInfo, r.log)
|
||||
imageList, err := baseImageList(ctx, image, digest, r.metaDB, requestedPage, r.cveInfo, r.log)
|
||||
|
||||
return imageList, err
|
||||
}
|
||||
|
@ -133,12 +133,12 @@ func (r *queryResolver) Image(ctx context.Context, image string) (*gql_generated
|
|||
return &gql_generated.ImageSummary{}, gqlerror.Errorf("no reference provided")
|
||||
}
|
||||
|
||||
return getImageSummary(ctx, repo, tag, nil, r.repoDB, r.cveInfo, r.log)
|
||||
return getImageSummary(ctx, repo, tag, nil, r.metaDB, r.cveInfo, r.log)
|
||||
}
|
||||
|
||||
// Referrers is the resolver for the Referrers field.
|
||||
func (r *queryResolver) Referrers(ctx context.Context, repo string, digest string, typeArg []string) ([]*gql_generated.Referrer, error) {
|
||||
referrers, err := getReferrers(r.repoDB, repo, digest, typeArg, r.log)
|
||||
referrers, err := getReferrers(r.metaDB, repo, digest, typeArg, r.log)
|
||||
if err != nil {
|
||||
r.log.Error().Err(err).Msg("unable to get referrers from default store")
|
||||
|
||||
|
@ -150,12 +150,12 @@ func (r *queryResolver) Referrers(ctx context.Context, repo string, digest strin
|
|||
|
||||
// StarredRepos is the resolver for the StarredRepos field.
|
||||
func (r *queryResolver) StarredRepos(ctx context.Context, requestedPage *gql_generated.PageInput) (*gql_generated.PaginatedReposResult, error) {
|
||||
return getStarredRepos(ctx, r.cveInfo, r.log, requestedPage, r.repoDB)
|
||||
return getStarredRepos(ctx, r.cveInfo, r.log, requestedPage, r.metaDB)
|
||||
}
|
||||
|
||||
// BookmarkedRepos is the resolver for the BookmarkedRepos field.
|
||||
func (r *queryResolver) BookmarkedRepos(ctx context.Context, requestedPage *gql_generated.PageInput) (*gql_generated.PaginatedReposResult, error) {
|
||||
return getBookmarkedRepos(ctx, r.cveInfo, r.log, requestedPage, r.repoDB)
|
||||
return getBookmarkedRepos(ctx, r.cveInfo, r.log, requestedPage, r.metaDB)
|
||||
}
|
||||
|
||||
// Query returns gql_generated.QueryResolver implementation.
|
||||
|
|
|
@ -38,7 +38,7 @@ import (
|
|||
cveinfo "zotregistry.io/zot/pkg/extensions/search/cve"
|
||||
cvemodel "zotregistry.io/zot/pkg/extensions/search/cve/model"
|
||||
"zotregistry.io/zot/pkg/log"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
"zotregistry.io/zot/pkg/storage"
|
||||
storageConstants "zotregistry.io/zot/pkg/storage/constants"
|
||||
"zotregistry.io/zot/pkg/storage/local"
|
||||
|
@ -222,8 +222,8 @@ func uploadNewRepoTag(tag string, repoName string, baseURL string, layers [][]by
|
|||
return err
|
||||
}
|
||||
|
||||
func getMockCveInfo(repoDB repodb.RepoDB, log log.Logger) cveinfo.CveInfo {
|
||||
// RepoDB loaded with initial data, mock the scanner
|
||||
func getMockCveInfo(metaDB mTypes.MetaDB, log log.Logger) cveinfo.CveInfo {
|
||||
// MetaDB loaded with initial data, mock the scanner
|
||||
severities := map[string]int{
|
||||
"UNKNOWN": 0,
|
||||
"LOW": 1,
|
||||
|
@ -320,7 +320,7 @@ func getMockCveInfo(repoDB repodb.RepoDB, log log.Logger) cveinfo.CveInfo {
|
|||
imageDir := repo
|
||||
inputTag := reference
|
||||
|
||||
repoMeta, err := repoDB.GetRepoMeta(imageDir)
|
||||
repoMeta, err := metaDB.GetRepoMeta(imageDir)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
@ -343,7 +343,7 @@ func getMockCveInfo(repoDB repodb.RepoDB, log log.Logger) cveinfo.CveInfo {
|
|||
return false, err
|
||||
}
|
||||
|
||||
manifestData, err := repoDB.GetManifestData(manifestDigest)
|
||||
manifestData, err := metaDB.GetManifestData(manifestDigest)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
@ -373,7 +373,7 @@ func getMockCveInfo(repoDB repodb.RepoDB, log log.Logger) cveinfo.CveInfo {
|
|||
return &cveinfo.BaseCveInfo{
|
||||
Log: log,
|
||||
Scanner: scanner,
|
||||
RepoDB: repoDB,
|
||||
MetaDB: metaDB,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -715,7 +715,7 @@ func TestRepoListWithNewestImage(t *testing.T) {
|
|||
panic(err)
|
||||
}
|
||||
|
||||
ctlr.CveInfo = getMockCveInfo(ctlr.RepoDB, ctlr.Log)
|
||||
ctlr.CveInfo = getMockCveInfo(ctlr.MetaDB, ctlr.Log)
|
||||
|
||||
go func() {
|
||||
if err := ctlr.Run(ctx); !errors.Is(err, http.ErrServerClosed) {
|
||||
|
@ -3493,7 +3493,7 @@ func TestGlobalSearch(t *testing.T) {
|
|||
panic(err)
|
||||
}
|
||||
|
||||
ctlr.CveInfo = getMockCveInfo(ctlr.RepoDB, ctlr.Log)
|
||||
ctlr.CveInfo = getMockCveInfo(ctlr.MetaDB, ctlr.Log)
|
||||
|
||||
go func() {
|
||||
if err := ctlr.Run(ctx); !errors.Is(err, http.ErrServerClosed) {
|
||||
|
@ -4360,7 +4360,7 @@ func TestGlobalSearchPagination(t *testing.T) {
|
|||
})
|
||||
}
|
||||
|
||||
func TestRepoDBWhenSigningImages(t *testing.T) {
|
||||
func TestMetaDBWhenSigningImages(t *testing.T) {
|
||||
Convey("SigningImages", t, func() {
|
||||
subpath := "/a"
|
||||
|
||||
|
@ -4546,9 +4546,9 @@ func TestRepoDBWhenSigningImages(t *testing.T) {
|
|||
})
|
||||
|
||||
Convey("image is a signature, AddManifestSignature fails", func() {
|
||||
ctlr.RepoDB = mocks.RepoDBMock{
|
||||
ctlr.MetaDB = mocks.MetaDBMock{
|
||||
AddManifestSignatureFn: func(repo string, signedManifestDigest godigest.Digest,
|
||||
sm repodb.SignatureMetadata,
|
||||
sm mTypes.SignatureMetadata,
|
||||
) error {
|
||||
return ErrTestError
|
||||
},
|
||||
|
@ -4613,7 +4613,7 @@ func TestRepoDBWhenSigningImages(t *testing.T) {
|
|||
})
|
||||
}
|
||||
|
||||
func TestRepoDBWhenPushingImages(t *testing.T) {
|
||||
func TestMetaDBWhenPushingImages(t *testing.T) {
|
||||
Convey("Cover errors when pushing", t, func() {
|
||||
dir := t.TempDir()
|
||||
|
||||
|
@ -4634,8 +4634,8 @@ func TestRepoDBWhenPushingImages(t *testing.T) {
|
|||
defer ctlrManager.StopServer()
|
||||
|
||||
Convey("SetManifestMeta fails", func() {
|
||||
ctlr.RepoDB = mocks.RepoDBMock{
|
||||
SetManifestDataFn: func(manifestDigest godigest.Digest, mm repodb.ManifestData) error {
|
||||
ctlr.MetaDB = mocks.MetaDBMock{
|
||||
SetManifestDataFn: func(manifestDigest godigest.Digest, mm mTypes.ManifestData) error {
|
||||
return ErrTestError
|
||||
},
|
||||
}
|
||||
|
@ -4670,7 +4670,7 @@ func TestRepoDBWhenPushingImages(t *testing.T) {
|
|||
})
|
||||
|
||||
Convey("SetManifestMeta succeeds but SetRepoReference fails", func() {
|
||||
ctlr.RepoDB = mocks.RepoDBMock{
|
||||
ctlr.MetaDB = mocks.MetaDBMock{
|
||||
SetRepoReferenceFn: func(repo, reference string, manifestDigest godigest.Digest, mediaType string) error {
|
||||
return ErrTestError
|
||||
},
|
||||
|
@ -4705,7 +4705,7 @@ func TestRepoDBWhenPushingImages(t *testing.T) {
|
|||
})
|
||||
}
|
||||
|
||||
func TestRepoDBIndexOperations(t *testing.T) {
|
||||
func TestMetaDBIndexOperations(t *testing.T) {
|
||||
Convey("Idex Operations BoltDB", t, func() {
|
||||
dir := t.TempDir()
|
||||
|
||||
|
@ -4726,11 +4726,11 @@ func TestRepoDBIndexOperations(t *testing.T) {
|
|||
ctlrManager.StartAndWait(port)
|
||||
defer ctlrManager.StopServer()
|
||||
|
||||
RunRepoDBIndexTests(baseURL, port)
|
||||
RunMetaDBIndexTests(baseURL, port)
|
||||
})
|
||||
}
|
||||
|
||||
func RunRepoDBIndexTests(baseURL, port string) {
|
||||
func RunMetaDBIndexTests(baseURL, port string) {
|
||||
Convey("Push test index", func() {
|
||||
const repo = "repo"
|
||||
|
||||
|
@ -5351,7 +5351,7 @@ func RunRepoDBIndexTests(baseURL, port string) {
|
|||
})
|
||||
}
|
||||
|
||||
func TestRepoDBWhenReadingImages(t *testing.T) {
|
||||
func TestMetaDBWhenReadingImages(t *testing.T) {
|
||||
Convey("Push test image", t, func() {
|
||||
dir := t.TempDir()
|
||||
|
||||
|
@ -5422,7 +5422,7 @@ func TestRepoDBWhenReadingImages(t *testing.T) {
|
|||
})
|
||||
|
||||
Convey("Error when incrementing", func() {
|
||||
ctlr.RepoDB = mocks.RepoDBMock{
|
||||
ctlr.MetaDB = mocks.MetaDBMock{
|
||||
IncrementImageDownloadsFn: func(repo string, tag string) error {
|
||||
return ErrTestError
|
||||
},
|
||||
|
@ -5435,7 +5435,7 @@ func TestRepoDBWhenReadingImages(t *testing.T) {
|
|||
})
|
||||
}
|
||||
|
||||
func TestRepoDBWhenDeletingImages(t *testing.T) {
|
||||
func TestMetaDBWhenDeletingImages(t *testing.T) {
|
||||
Convey("Setting up zot repo with test images", t, func() {
|
||||
dir := t.TempDir()
|
||||
port := GetFreePort()
|
||||
|
@ -5747,7 +5747,7 @@ func TestRepoDBWhenDeletingImages(t *testing.T) {
|
|||
So(err, ShouldNotBeNil)
|
||||
So(statusCode, ShouldEqual, -1)
|
||||
|
||||
// ------- Delete the referrer and see if it disappears from repoDB also
|
||||
// ------- Delete the referrer and see if it disappears from metaDB also
|
||||
statusCode, err = DeleteImage("repo1", referrerImage.Reference, baseURL)
|
||||
So(err, ShouldBeNil)
|
||||
So(statusCode, ShouldEqual, http.StatusAccepted)
|
||||
|
@ -5865,7 +5865,7 @@ func TestRepoDBWhenDeletingImages(t *testing.T) {
|
|||
},
|
||||
}
|
||||
|
||||
ctlr.RepoDB = mocks.RepoDBMock{
|
||||
ctlr.MetaDB = mocks.MetaDBMock{
|
||||
DeleteRepoTagFn: func(repo, tag string) error { return ErrTestError },
|
||||
}
|
||||
|
||||
|
@ -6304,7 +6304,7 @@ func TestImageSummary(t *testing.T) {
|
|||
|
||||
So(len(imgSummaryResponse.Errors), ShouldEqual, 1)
|
||||
So(imgSummaryResponse.Errors[0].Message,
|
||||
ShouldContainSubstring, "repodb: repo metadata not found for given repo name")
|
||||
ShouldContainSubstring, "metadb: repo metadata not found for given repo name")
|
||||
|
||||
t.Log("starting Test retrieve image with bad tag")
|
||||
// gql is parametrized with the repo.
|
||||
|
@ -6395,7 +6395,7 @@ func TestImageSummary(t *testing.T) {
|
|||
panic(err)
|
||||
}
|
||||
|
||||
ctlr.CveInfo = getMockCveInfo(ctlr.RepoDB, ctlr.Log)
|
||||
ctlr.CveInfo = getMockCveInfo(ctlr.MetaDB, ctlr.Log)
|
||||
|
||||
go func() {
|
||||
if err := ctlr.Run(ctx); !errors.Is(err, http.ErrServerClosed) {
|
||||
|
|
|
@ -20,7 +20,8 @@ import (
|
|||
"zotregistry.io/zot/pkg/common"
|
||||
"zotregistry.io/zot/pkg/extensions/monitoring"
|
||||
"zotregistry.io/zot/pkg/log"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
"zotregistry.io/zot/pkg/meta"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
"zotregistry.io/zot/pkg/storage"
|
||||
storageCommon "zotregistry.io/zot/pkg/storage/common"
|
||||
storageConstants "zotregistry.io/zot/pkg/storage/constants"
|
||||
|
@ -31,14 +32,14 @@ import (
|
|||
type LocalRegistry struct {
|
||||
storeController storage.StoreController
|
||||
tempStorage OciLayoutStorage
|
||||
repoDB repodb.RepoDB
|
||||
metaDB mTypes.MetaDB
|
||||
log log.Logger
|
||||
}
|
||||
|
||||
func NewLocalRegistry(storeController storage.StoreController, repoDB repodb.RepoDB, log log.Logger) Local {
|
||||
func NewLocalRegistry(storeController storage.StoreController, metaDB mTypes.MetaDB, log log.Logger) Local {
|
||||
return &LocalRegistry{
|
||||
storeController: storeController,
|
||||
repoDB: repoDB,
|
||||
metaDB: metaDB,
|
||||
// first we sync from remote (using containers/image copy from docker:// to oci:) to a temp imageStore
|
||||
// then we copy the image from tempStorage to zot's storage using ImageStore APIs
|
||||
tempStorage: NewOciLayoutStorage(storeController),
|
||||
|
@ -163,14 +164,14 @@ func (registry *LocalRegistry) CommitImage(imageReference types.ImageReference,
|
|||
return err
|
||||
}
|
||||
|
||||
if registry.repoDB != nil {
|
||||
err = repodb.SetImageMetaFromInput(repo, reference, mediaType,
|
||||
manifestDigest, manifestBlob, imageStore, registry.repoDB, registry.log)
|
||||
if registry.metaDB != nil {
|
||||
err = meta.SetImageMetaFromInput(repo, reference, mediaType,
|
||||
manifestDigest, manifestBlob, imageStore, registry.metaDB, registry.log)
|
||||
if err != nil {
|
||||
return fmt.Errorf("repoDB: failed to set metadata for image '%s %s': %w", repo, reference, err)
|
||||
return fmt.Errorf("metaDB: failed to set metadata for image '%s %s': %w", repo, reference, err)
|
||||
}
|
||||
|
||||
registry.log.Debug().Str("repo", repo).Str("reference", reference).Msg("repoDB: successfully set metadata for image")
|
||||
registry.log.Debug().Str("repo", repo).Str("reference", reference).Msg("metaDB: successfully set metadata for image")
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -221,9 +222,9 @@ func (registry *LocalRegistry) copyManifest(repo string, manifestContent []byte,
|
|||
return err
|
||||
}
|
||||
|
||||
if registry.repoDB != nil {
|
||||
err = repodb.SetImageMetaFromInput(repo, reference, ispec.MediaTypeImageManifest,
|
||||
digest, manifestContent, imageStore, registry.repoDB, registry.log)
|
||||
if registry.metaDB != nil {
|
||||
err = meta.SetImageMetaFromInput(repo, reference, ispec.MediaTypeImageManifest,
|
||||
digest, manifestContent, imageStore, registry.metaDB, registry.log)
|
||||
if err != nil {
|
||||
registry.log.Error().Str("errorType", common.TypeOf(err)).
|
||||
Err(err).Msg("couldn't set metadata from input")
|
||||
|
|
|
@ -18,24 +18,25 @@ import (
|
|||
"zotregistry.io/zot/pkg/extensions/sync/constants"
|
||||
client "zotregistry.io/zot/pkg/extensions/sync/httpclient"
|
||||
"zotregistry.io/zot/pkg/log"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
"zotregistry.io/zot/pkg/meta"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
"zotregistry.io/zot/pkg/storage"
|
||||
)
|
||||
|
||||
type CosignReference struct {
|
||||
client *client.Client
|
||||
storeController storage.StoreController
|
||||
repoDB repodb.RepoDB
|
||||
metaDB mTypes.MetaDB
|
||||
log log.Logger
|
||||
}
|
||||
|
||||
func NewCosignReference(httpClient *client.Client, storeController storage.StoreController,
|
||||
repoDB repodb.RepoDB, log log.Logger,
|
||||
metaDB mTypes.MetaDB, log log.Logger,
|
||||
) CosignReference {
|
||||
return CosignReference{
|
||||
client: httpClient,
|
||||
storeController: storeController,
|
||||
repoDB: repoDB,
|
||||
metaDB: metaDB,
|
||||
log: log,
|
||||
}
|
||||
}
|
||||
|
@ -145,9 +146,9 @@ func (ref CosignReference) SyncReferences(localRepo, remoteRepo, subjectDigestSt
|
|||
ref.log.Info().Str("repository", localRepo).Str("subject", subjectDigestStr).
|
||||
Msg("successfully synced cosign reference for image")
|
||||
|
||||
if ref.repoDB != nil {
|
||||
if ref.metaDB != nil {
|
||||
ref.log.Debug().Str("repository", localRepo).Str("subject", subjectDigestStr).
|
||||
Msg("repoDB: trying to sync cosign reference for image")
|
||||
Msg("metaDB: trying to sync cosign reference for image")
|
||||
|
||||
isSig, sigType, signedManifestDig, err := storage.CheckIsImageSignature(localRepo, manifestBuf,
|
||||
cosignTag)
|
||||
|
@ -157,14 +158,14 @@ func (ref CosignReference) SyncReferences(localRepo, remoteRepo, subjectDigestSt
|
|||
}
|
||||
|
||||
if isSig {
|
||||
err = ref.repoDB.AddManifestSignature(localRepo, signedManifestDig, repodb.SignatureMetadata{
|
||||
err = ref.metaDB.AddManifestSignature(localRepo, signedManifestDig, mTypes.SignatureMetadata{
|
||||
SignatureType: sigType,
|
||||
SignatureDigest: referenceDigest.String(),
|
||||
})
|
||||
} else {
|
||||
err = repodb.SetImageMetaFromInput(localRepo, cosignTag, ispec.MediaTypeImageManifest,
|
||||
err = meta.SetImageMetaFromInput(localRepo, cosignTag, ispec.MediaTypeImageManifest,
|
||||
referenceDigest, manifestBuf, ref.storeController.GetImageStore(localRepo),
|
||||
ref.repoDB, ref.log)
|
||||
ref.metaDB, ref.log)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
|
@ -173,7 +174,7 @@ func (ref CosignReference) SyncReferences(localRepo, remoteRepo, subjectDigestSt
|
|||
}
|
||||
|
||||
ref.log.Info().Str("repository", localRepo).Str("subject", subjectDigestStr).
|
||||
Msg("repoDB: successfully added cosign reference for image")
|
||||
Msg("metaDB: successfully added cosign reference for image")
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -17,7 +17,8 @@ import (
|
|||
"zotregistry.io/zot/pkg/extensions/sync/constants"
|
||||
client "zotregistry.io/zot/pkg/extensions/sync/httpclient"
|
||||
"zotregistry.io/zot/pkg/log"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
"zotregistry.io/zot/pkg/meta"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
"zotregistry.io/zot/pkg/storage"
|
||||
storageTypes "zotregistry.io/zot/pkg/storage/types"
|
||||
)
|
||||
|
@ -25,17 +26,17 @@ import (
|
|||
type OciReferences struct {
|
||||
client *client.Client
|
||||
storeController storage.StoreController
|
||||
repoDB repodb.RepoDB
|
||||
metaDB mTypes.MetaDB
|
||||
log log.Logger
|
||||
}
|
||||
|
||||
func NewOciReferences(httpClient *client.Client, storeController storage.StoreController,
|
||||
repoDB repodb.RepoDB, log log.Logger,
|
||||
metaDB mTypes.MetaDB, log log.Logger,
|
||||
) OciReferences {
|
||||
return OciReferences{
|
||||
client: httpClient,
|
||||
storeController: storeController,
|
||||
repoDB: repoDB,
|
||||
metaDB: metaDB,
|
||||
log: log,
|
||||
}
|
||||
}
|
||||
|
@ -129,9 +130,9 @@ func (ref OciReferences) SyncReferences(localRepo, remoteRepo, subjectDigestStr
|
|||
|
||||
refsDigests = append(refsDigests, referenceDigest)
|
||||
|
||||
if ref.repoDB != nil {
|
||||
if ref.metaDB != nil {
|
||||
ref.log.Debug().Str("repository", localRepo).Str("subject", subjectDigestStr).
|
||||
Msg("repoDB: trying to add oci references for image")
|
||||
Msg("metaDB: trying to add oci references for image")
|
||||
|
||||
isSig, sigType, signedManifestDig, err := storage.CheckIsImageSignature(localRepo, referenceBuf,
|
||||
referrer.Digest.String())
|
||||
|
@ -141,14 +142,14 @@ func (ref OciReferences) SyncReferences(localRepo, remoteRepo, subjectDigestStr
|
|||
}
|
||||
|
||||
if isSig {
|
||||
err = ref.repoDB.AddManifestSignature(localRepo, signedManifestDig, repodb.SignatureMetadata{
|
||||
err = ref.metaDB.AddManifestSignature(localRepo, signedManifestDig, mTypes.SignatureMetadata{
|
||||
SignatureType: sigType,
|
||||
SignatureDigest: referenceDigest.String(),
|
||||
})
|
||||
} else {
|
||||
err = repodb.SetImageMetaFromInput(localRepo, referenceDigest.String(), referrer.MediaType,
|
||||
err = meta.SetImageMetaFromInput(localRepo, referenceDigest.String(), referrer.MediaType,
|
||||
referenceDigest, referenceBuf, ref.storeController.GetImageStore(localRepo),
|
||||
ref.repoDB, ref.log)
|
||||
ref.metaDB, ref.log)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
|
@ -157,7 +158,7 @@ func (ref OciReferences) SyncReferences(localRepo, remoteRepo, subjectDigestStr
|
|||
}
|
||||
|
||||
ref.log.Info().Str("repository", localRepo).Str("subject", subjectDigestStr).
|
||||
Msg("repoDB: successfully added oci references to RepoDB for image")
|
||||
Msg("metaDB: successfully added oci references to MetaDB for image")
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -17,7 +17,8 @@ import (
|
|||
"zotregistry.io/zot/pkg/extensions/sync/constants"
|
||||
client "zotregistry.io/zot/pkg/extensions/sync/httpclient"
|
||||
"zotregistry.io/zot/pkg/log"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
"zotregistry.io/zot/pkg/meta"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
"zotregistry.io/zot/pkg/storage"
|
||||
)
|
||||
|
||||
|
@ -28,17 +29,17 @@ type ReferenceList struct {
|
|||
type ORASReferences struct {
|
||||
client *client.Client
|
||||
storeController storage.StoreController
|
||||
repoDB repodb.RepoDB
|
||||
metaDB mTypes.MetaDB
|
||||
log log.Logger
|
||||
}
|
||||
|
||||
func NewORASReferences(httpClient *client.Client, storeController storage.StoreController,
|
||||
repoDB repodb.RepoDB, log log.Logger,
|
||||
metaDB mTypes.MetaDB, log log.Logger,
|
||||
) ORASReferences {
|
||||
return ORASReferences{
|
||||
client: httpClient,
|
||||
storeController: storeController,
|
||||
repoDB: repoDB,
|
||||
metaDB: metaDB,
|
||||
log: log,
|
||||
}
|
||||
}
|
||||
|
@ -146,20 +147,20 @@ func (ref ORASReferences) SyncReferences(localRepo, remoteRepo, subjectDigestStr
|
|||
|
||||
refsDigests = append(refsDigests, referenceDigest)
|
||||
|
||||
if ref.repoDB != nil {
|
||||
if ref.metaDB != nil {
|
||||
ref.log.Debug().Str("repository", localRepo).Str("subject", subjectDigestStr).
|
||||
Msg("repoDB: trying to sync oras artifact for image")
|
||||
Msg("metaDB: trying to sync oras artifact for image")
|
||||
|
||||
err := repodb.SetImageMetaFromInput(localRepo, referenceDigest.String(), referrer.MediaType,
|
||||
err := meta.SetImageMetaFromInput(localRepo, referenceDigest.String(), referrer.MediaType,
|
||||
referenceDigest, orasBuf, ref.storeController.GetImageStore(localRepo),
|
||||
ref.repoDB, ref.log)
|
||||
ref.metaDB, ref.log)
|
||||
if err != nil {
|
||||
return refsDigests, fmt.Errorf("repoDB: failed to set metadata for oras artifact '%s@%s': %w",
|
||||
return refsDigests, fmt.Errorf("metaDB: failed to set metadata for oras artifact '%s@%s': %w",
|
||||
localRepo, subjectDigestStr, err)
|
||||
}
|
||||
|
||||
ref.log.Info().Str("repository", localRepo).Str("subject", subjectDigestStr).
|
||||
Msg("repoDB: successfully added oras artifacts to RepoDB for image")
|
||||
Msg("metaDB: successfully added oras artifacts to MetaDB for image")
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -17,7 +17,7 @@ import (
|
|||
"zotregistry.io/zot/pkg/common"
|
||||
client "zotregistry.io/zot/pkg/extensions/sync/httpclient"
|
||||
"zotregistry.io/zot/pkg/log"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
"zotregistry.io/zot/pkg/storage"
|
||||
storageTypes "zotregistry.io/zot/pkg/storage/types"
|
||||
)
|
||||
|
@ -37,13 +37,13 @@ type References struct {
|
|||
}
|
||||
|
||||
func NewReferences(httpClient *client.Client, storeController storage.StoreController,
|
||||
repoDB repodb.RepoDB, log log.Logger,
|
||||
metaDB mTypes.MetaDB, log log.Logger,
|
||||
) References {
|
||||
refs := References{log: log}
|
||||
|
||||
refs.referenceList = append(refs.referenceList, NewCosignReference(httpClient, storeController, repoDB, log))
|
||||
refs.referenceList = append(refs.referenceList, NewOciReferences(httpClient, storeController, repoDB, log))
|
||||
refs.referenceList = append(refs.referenceList, NewORASReferences(httpClient, storeController, repoDB, log))
|
||||
refs.referenceList = append(refs.referenceList, NewCosignReference(httpClient, storeController, metaDB, log))
|
||||
refs.referenceList = append(refs.referenceList, NewOciReferences(httpClient, storeController, metaDB, log))
|
||||
refs.referenceList = append(refs.referenceList, NewORASReferences(httpClient, storeController, metaDB, log))
|
||||
|
||||
return refs
|
||||
}
|
||||
|
|
|
@ -18,7 +18,7 @@ import (
|
|||
client "zotregistry.io/zot/pkg/extensions/sync/httpclient"
|
||||
"zotregistry.io/zot/pkg/extensions/sync/references"
|
||||
"zotregistry.io/zot/pkg/log"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
"zotregistry.io/zot/pkg/storage"
|
||||
)
|
||||
|
||||
|
@ -30,7 +30,7 @@ type BaseService struct {
|
|||
retryOptions *retry.RetryOptions
|
||||
contentManager ContentManager
|
||||
storeController storage.StoreController
|
||||
repoDB repodb.RepoDB
|
||||
metaDB mTypes.MetaDB
|
||||
repositories []string
|
||||
references references.References
|
||||
client *client.Client
|
||||
|
@ -38,13 +38,13 @@ type BaseService struct {
|
|||
}
|
||||
|
||||
func New(opts syncconf.RegistryConfig, credentialsFilepath string,
|
||||
storeController storage.StoreController, repodb repodb.RepoDB, log log.Logger,
|
||||
storeController storage.StoreController, metadb mTypes.MetaDB, log log.Logger,
|
||||
) (Service, error) {
|
||||
service := &BaseService{}
|
||||
|
||||
service.config = opts
|
||||
service.log = log
|
||||
service.repoDB = repodb
|
||||
service.metaDB = metadb
|
||||
|
||||
var err error
|
||||
|
||||
|
@ -60,7 +60,7 @@ func New(opts syncconf.RegistryConfig, credentialsFilepath string,
|
|||
service.credentials = credentialsFile
|
||||
|
||||
service.contentManager = NewContentManager(opts.Content, log)
|
||||
service.local = NewLocalRegistry(storeController, repodb, log)
|
||||
service.local = NewLocalRegistry(storeController, metadb, log)
|
||||
|
||||
retryOptions := &retry.RetryOptions{}
|
||||
|
||||
|
@ -82,7 +82,7 @@ func New(opts syncconf.RegistryConfig, credentialsFilepath string,
|
|||
service.references = references.NewReferences(
|
||||
service.client,
|
||||
service.storeController,
|
||||
service.repoDB,
|
||||
service.metaDB,
|
||||
service.log,
|
||||
)
|
||||
|
||||
|
|
|
@ -162,7 +162,7 @@ func TestService(t *testing.T) {
|
|||
URLs: []string{"http://localhost"},
|
||||
}
|
||||
|
||||
service, err := New(conf, "", storage.StoreController{}, mocks.RepoDBMock{}, log.Logger{})
|
||||
service, err := New(conf, "", storage.StoreController{}, mocks.MetaDBMock{}, log.Logger{})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = service.SyncRepo("repo")
|
||||
|
@ -337,8 +337,8 @@ func TestLocalRegistry(t *testing.T) {
|
|||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
Convey("trigger repoDB error on index manifest in CommitImage()", func() {
|
||||
registry := NewLocalRegistry(storage.StoreController{DefaultStore: syncImgStore}, mocks.RepoDBMock{
|
||||
Convey("trigger metaDB error on index manifest in CommitImage()", func() {
|
||||
registry := NewLocalRegistry(storage.StoreController{DefaultStore: syncImgStore}, mocks.MetaDBMock{
|
||||
SetRepoReferenceFn: func(repo, Reference string, manifestDigest godigest.Digest, mediaType string) error {
|
||||
if Reference == "1.0" {
|
||||
return errors.ErrRepoMetaNotFound
|
||||
|
@ -352,8 +352,8 @@ func TestLocalRegistry(t *testing.T) {
|
|||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
Convey("trigger repoDB error on image manifest in CommitImage()", func() {
|
||||
registry := NewLocalRegistry(storage.StoreController{DefaultStore: syncImgStore}, mocks.RepoDBMock{
|
||||
Convey("trigger metaDB error on image manifest in CommitImage()", func() {
|
||||
registry := NewLocalRegistry(storage.StoreController{DefaultStore: syncImgStore}, mocks.MetaDBMock{
|
||||
SetRepoReferenceFn: func(repo, Reference string, manifestDigest godigest.Digest, mediaType string) error {
|
||||
return errors.ErrRepoMetaNotFound
|
||||
},
|
||||
|
|
|
@ -42,8 +42,8 @@ import (
|
|||
extconf "zotregistry.io/zot/pkg/extensions/config"
|
||||
syncconf "zotregistry.io/zot/pkg/extensions/config/sync"
|
||||
"zotregistry.io/zot/pkg/extensions/sync"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
"zotregistry.io/zot/pkg/meta/signatures"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
storageConstants "zotregistry.io/zot/pkg/storage/constants"
|
||||
"zotregistry.io/zot/pkg/test"
|
||||
"zotregistry.io/zot/pkg/test/mocks"
|
||||
|
@ -857,10 +857,10 @@ func TestOnDemand(t *testing.T) {
|
|||
|
||||
dctlr := api.NewController(destConfig)
|
||||
|
||||
// repodb fails for syncCosignSignature"
|
||||
dctlr.RepoDB = mocks.RepoDBMock{
|
||||
// metadb fails for syncCosignSignature"
|
||||
dctlr.MetaDB = mocks.MetaDBMock{
|
||||
AddManifestSignatureFn: func(repo string, signedManifestDigest godigest.Digest,
|
||||
sm repodb.SignatureMetadata,
|
||||
sm mTypes.SignatureMetadata,
|
||||
) error {
|
||||
if sm.SignatureType == signatures.CosignSignature || sm.SignatureType == signatures.NotationSignature {
|
||||
return sync.ErrTestError
|
||||
|
@ -4422,8 +4422,8 @@ func getPortFromBaseURL(baseURL string) string {
|
|||
return slice[len(slice)-1]
|
||||
}
|
||||
|
||||
func TestSyncedSignaturesRepoDB(t *testing.T) {
|
||||
Convey("Verify that repodb update correctly when syncing a signature", t, func() {
|
||||
func TestSyncedSignaturesMetaDB(t *testing.T) {
|
||||
Convey("Verify that metadb update correctly when syncing a signature", t, func() {
|
||||
repoName := "signed-repo"
|
||||
tag := "random-signed-image"
|
||||
updateDuration := 30 * time.Minute
|
||||
|
@ -4493,7 +4493,7 @@ func TestSyncedSignaturesRepoDB(t *testing.T) {
|
|||
So(err, ShouldBeNil)
|
||||
So(resp.StatusCode(), ShouldEqual, http.StatusOK)
|
||||
|
||||
repoMeta, err := dctlr.RepoDB.GetRepoMeta(repoName)
|
||||
repoMeta, err := dctlr.MetaDB.GetRepoMeta(repoName)
|
||||
So(err, ShouldBeNil)
|
||||
So(repoMeta.Tags, ShouldContainKey, tag)
|
||||
So(len(repoMeta.Tags), ShouldEqual, 1)
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,4 +1,4 @@
|
|||
package bolt_test
|
||||
package boltdb_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
@ -15,10 +15,9 @@ import (
|
|||
|
||||
zerr "zotregistry.io/zot/errors"
|
||||
"zotregistry.io/zot/pkg/log"
|
||||
"zotregistry.io/zot/pkg/meta/bolt"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
boltdb_wrapper "zotregistry.io/zot/pkg/meta/repodb/boltdb-wrapper"
|
||||
"zotregistry.io/zot/pkg/meta/boltdb"
|
||||
"zotregistry.io/zot/pkg/meta/signatures"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
localCtx "zotregistry.io/zot/pkg/requestcontext"
|
||||
"zotregistry.io/zot/pkg/test"
|
||||
)
|
||||
|
@ -26,19 +25,19 @@ import (
|
|||
func TestWrapperErrors(t *testing.T) {
|
||||
Convey("Errors", t, func() {
|
||||
tmpDir := t.TempDir()
|
||||
boltDBParams := bolt.DBParameters{RootDir: tmpDir}
|
||||
boltDriver, err := bolt.GetBoltDriver(boltDBParams)
|
||||
boltDBParams := boltdb.DBParameters{RootDir: tmpDir}
|
||||
boltDriver, err := boltdb.GetBoltDriver(boltDBParams)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
log := log.NewLogger("debug", "")
|
||||
|
||||
boltdbWrapper, err := boltdb_wrapper.NewBoltDBWrapper(boltDriver, log)
|
||||
boltdbWrapper, err := boltdb.New(boltDriver, log)
|
||||
So(boltdbWrapper, ShouldNotBeNil)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
repoMeta := repodb.RepoMetadata{
|
||||
Tags: map[string]repodb.Descriptor{},
|
||||
Signatures: map[string]repodb.ManifestSignatures{},
|
||||
repoMeta := mTypes.RepoMetadata{
|
||||
Tags: map[string]mTypes.Descriptor{},
|
||||
Signatures: map[string]mTypes.ManifestSignatures{},
|
||||
}
|
||||
|
||||
repoMetaBlob, err := json.Marshal(repoMeta)
|
||||
|
@ -59,28 +58,28 @@ func TestWrapperErrors(t *testing.T) {
|
|||
}
|
||||
|
||||
ctx := context.WithValue(context.Background(), authzCtxKey, acCtx)
|
||||
err = boltdbWrapper.AddUserAPIKey(ctx, "", &repodb.APIKeyDetails{})
|
||||
err = boltdbWrapper.AddUserAPIKey(ctx, "", &mTypes.APIKeyDetails{})
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
err = boltdbWrapper.AddUserAPIKey(ctx, "", &repodb.APIKeyDetails{})
|
||||
err = boltdbWrapper.AddUserAPIKey(ctx, "", &mTypes.APIKeyDetails{})
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
err = boltdbWrapper.DB.Update(func(tx *bbolt.Tx) error {
|
||||
return tx.DeleteBucket([]byte(bolt.UserDataBucket))
|
||||
return tx.DeleteBucket([]byte(boltdb.UserDataBucket))
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = boltdbWrapper.AddUserAPIKey(ctx, "test", &repodb.APIKeyDetails{})
|
||||
err = boltdbWrapper.AddUserAPIKey(ctx, "test", &mTypes.APIKeyDetails{})
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
err = boltdbWrapper.DB.Update(func(tx *bbolt.Tx) error {
|
||||
return tx.DeleteBucket([]byte(bolt.UserAPIKeysBucket))
|
||||
return tx.DeleteBucket([]byte(boltdb.UserAPIKeysBucket))
|
||||
})
|
||||
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = boltdbWrapper.AddUserAPIKey(ctx, "", &repodb.APIKeyDetails{})
|
||||
err = boltdbWrapper.AddUserAPIKey(ctx, "", &mTypes.APIKeyDetails{})
|
||||
So(err, ShouldEqual, zerr.ErrBucketDoesNotExist)
|
||||
})
|
||||
|
||||
|
@ -98,15 +97,15 @@ func TestWrapperErrors(t *testing.T) {
|
|||
})
|
||||
|
||||
Convey("DeleteUserAPIKey", func() {
|
||||
err = boltdbWrapper.SetUserData(ctx, repodb.UserData{})
|
||||
err = boltdbWrapper.SetUserData(ctx, mTypes.UserData{})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = boltdbWrapper.AddUserAPIKey(ctx, "hashedKey", &repodb.APIKeyDetails{})
|
||||
err = boltdbWrapper.AddUserAPIKey(ctx, "hashedKey", &mTypes.APIKeyDetails{})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
Convey("no such bucket", func() {
|
||||
err = boltdbWrapper.DB.Update(func(tx *bbolt.Tx) error {
|
||||
return tx.DeleteBucket([]byte(bolt.UserAPIKeysBucket))
|
||||
return tx.DeleteBucket([]byte(boltdb.UserAPIKeysBucket))
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
|
@ -148,7 +147,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
So(err, ShouldNotBeNil)
|
||||
|
||||
err = boltdbWrapper.DB.Update(func(tx *bbolt.Tx) error {
|
||||
return tx.DeleteBucket([]byte(bolt.UserDataBucket))
|
||||
return tx.DeleteBucket([]byte(boltdb.UserDataBucket))
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
|
@ -158,7 +157,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
|
||||
Convey("GetUserAPIKeyInfo", func() {
|
||||
err = boltdbWrapper.DB.Update(func(tx *bbolt.Tx) error {
|
||||
return tx.DeleteBucket([]byte(bolt.UserAPIKeysBucket))
|
||||
return tx.DeleteBucket([]byte(boltdb.UserAPIKeysBucket))
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
|
@ -168,7 +167,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
|
||||
Convey("GetUserData", func() {
|
||||
err = boltdbWrapper.DB.Update(func(tx *bbolt.Tx) error {
|
||||
buck := tx.Bucket([]byte(bolt.UserDataBucket))
|
||||
buck := tx.Bucket([]byte(boltdb.UserDataBucket))
|
||||
So(buck, ShouldNotBeNil)
|
||||
|
||||
return buck.Put([]byte("test"), []byte("dsa8"))
|
||||
|
@ -180,7 +179,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
So(err, ShouldNotBeNil)
|
||||
|
||||
err = boltdbWrapper.DB.Update(func(tx *bbolt.Tx) error {
|
||||
return tx.DeleteBucket([]byte(bolt.UserAPIKeysBucket))
|
||||
return tx.DeleteBucket([]byte(boltdb.UserAPIKeysBucket))
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
|
@ -195,7 +194,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
|
||||
ctx = context.WithValue(context.Background(), authzCtxKey, acCtx)
|
||||
|
||||
err = boltdbWrapper.SetUserData(ctx, repodb.UserData{})
|
||||
err = boltdbWrapper.SetUserData(ctx, mTypes.UserData{})
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
buff := make([]byte, int(math.Ceil(float64(1000000)/float64(1.33333333333))))
|
||||
|
@ -212,11 +211,11 @@ func TestWrapperErrors(t *testing.T) {
|
|||
|
||||
ctx := context.WithValue(context.Background(), authzCtxKey, acCtx)
|
||||
|
||||
err = boltdbWrapper.SetUserData(ctx, repodb.UserData{}) //nolint: contextcheck
|
||||
err = boltdbWrapper.SetUserData(ctx, mTypes.UserData{}) //nolint: contextcheck
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
err = boltdbWrapper.DB.Update(func(tx *bbolt.Tx) error {
|
||||
return tx.DeleteBucket([]byte(bolt.UserDataBucket))
|
||||
return tx.DeleteBucket([]byte(boltdb.UserDataBucket))
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
|
@ -226,7 +225,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
|
||||
ctx = context.WithValue(context.Background(), authzCtxKey, acCtx)
|
||||
|
||||
err = boltdbWrapper.SetUserData(ctx, repodb.UserData{}) //nolint: contextcheck
|
||||
err = boltdbWrapper.SetUserData(ctx, mTypes.UserData{}) //nolint: contextcheck
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
|
@ -241,7 +240,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
So(err, ShouldNotBeNil)
|
||||
|
||||
err = boltdbWrapper.DB.Update(func(tx *bbolt.Tx) error {
|
||||
return tx.DeleteBucket([]byte(bolt.UserDataBucket))
|
||||
return tx.DeleteBucket([]byte(boltdb.UserDataBucket))
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
|
@ -271,7 +270,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
|
||||
Convey("GetManifestData", func() {
|
||||
err := boltdbWrapper.DB.Update(func(tx *bbolt.Tx) error {
|
||||
dataBuck := tx.Bucket([]byte(bolt.ManifestDataBucket))
|
||||
dataBuck := tx.Bucket([]byte(boltdb.ManifestDataBucket))
|
||||
|
||||
return dataBuck.Put([]byte("digest1"), []byte("wrong json"))
|
||||
})
|
||||
|
@ -286,8 +285,8 @@ func TestWrapperErrors(t *testing.T) {
|
|||
|
||||
Convey("SetManifestMeta", func() {
|
||||
err := boltdbWrapper.DB.Update(func(tx *bbolt.Tx) error {
|
||||
repoBuck := tx.Bucket([]byte(bolt.RepoMetadataBucket))
|
||||
dataBuck := tx.Bucket([]byte(bolt.ManifestDataBucket))
|
||||
repoBuck := tx.Bucket([]byte(boltdb.RepoMetadataBucket))
|
||||
dataBuck := tx.Bucket([]byte(boltdb.ManifestDataBucket))
|
||||
|
||||
err := dataBuck.Put([]byte("digest1"), repoMetaBlob)
|
||||
if err != nil {
|
||||
|
@ -298,7 +297,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = boltdbWrapper.SetManifestMeta("repo1", "digest1", repodb.ManifestMetadata{})
|
||||
err = boltdbWrapper.SetManifestMeta("repo1", "digest1", mTypes.ManifestMetadata{})
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
_, err = boltdbWrapper.GetManifestMeta("repo1", "digest1")
|
||||
|
@ -307,7 +306,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
|
||||
Convey("FilterRepos", func() {
|
||||
err := boltdbWrapper.DB.Update(func(tx *bbolt.Tx) error {
|
||||
buck := tx.Bucket([]byte(bolt.RepoMetadataBucket))
|
||||
buck := tx.Bucket([]byte(boltdb.RepoMetadataBucket))
|
||||
err := buck.Put([]byte("badRepo"), []byte("bad repo"))
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
|
@ -316,19 +315,19 @@ func TestWrapperErrors(t *testing.T) {
|
|||
So(err, ShouldBeNil)
|
||||
|
||||
_, _, _, _, err = boltdbWrapper.FilterRepos(context.Background(),
|
||||
func(repoMeta repodb.RepoMetadata) bool { return true }, repodb.PageInput{})
|
||||
func(repoMeta mTypes.RepoMetadata) bool { return true }, mTypes.PageInput{})
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
Convey("SetReferrer", func() {
|
||||
err := boltdbWrapper.DB.Update(func(tx *bbolt.Tx) error {
|
||||
repoBuck := tx.Bucket([]byte(bolt.RepoMetadataBucket))
|
||||
repoBuck := tx.Bucket([]byte(boltdb.RepoMetadataBucket))
|
||||
|
||||
return repoBuck.Put([]byte("repo"), []byte("wrong json"))
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = boltdbWrapper.SetReferrer("repo", "ref", repodb.ReferrerInfo{})
|
||||
err = boltdbWrapper.SetReferrer("repo", "ref", mTypes.ReferrerInfo{})
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
|
@ -340,7 +339,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
|
||||
Convey("bad repo meta blob", func() {
|
||||
err := boltdbWrapper.DB.Update(func(tx *bbolt.Tx) error {
|
||||
repoBuck := tx.Bucket([]byte(bolt.RepoMetadataBucket))
|
||||
repoBuck := tx.Bucket([]byte(boltdb.RepoMetadataBucket))
|
||||
|
||||
return repoBuck.Put([]byte("repo"), []byte("wrong json"))
|
||||
})
|
||||
|
@ -353,7 +352,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
|
||||
Convey("SetRepoReference", func() {
|
||||
err := boltdbWrapper.DB.Update(func(tx *bbolt.Tx) error {
|
||||
repoBuck := tx.Bucket([]byte(bolt.RepoMetadataBucket))
|
||||
repoBuck := tx.Bucket([]byte(boltdb.RepoMetadataBucket))
|
||||
|
||||
return repoBuck.Put([]byte("repo1"), []byte("wrong json"))
|
||||
})
|
||||
|
@ -365,7 +364,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
|
||||
Convey("GetRepoMeta", func() {
|
||||
err := boltdbWrapper.DB.Update(func(tx *bbolt.Tx) error {
|
||||
repoBuck := tx.Bucket([]byte(bolt.RepoMetadataBucket))
|
||||
repoBuck := tx.Bucket([]byte(boltdb.RepoMetadataBucket))
|
||||
|
||||
return repoBuck.Put([]byte("repo1"), []byte("wrong json"))
|
||||
})
|
||||
|
@ -377,7 +376,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
|
||||
Convey("DeleteRepoTag", func() {
|
||||
err := boltdbWrapper.DB.Update(func(tx *bbolt.Tx) error {
|
||||
repoBuck := tx.Bucket([]byte(bolt.RepoMetadataBucket))
|
||||
repoBuck := tx.Bucket([]byte(boltdb.RepoMetadataBucket))
|
||||
|
||||
return repoBuck.Put([]byte("repo1"), []byte("wrong json"))
|
||||
})
|
||||
|
@ -392,7 +391,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
So(err, ShouldNotBeNil)
|
||||
|
||||
err := boltdbWrapper.DB.Update(func(tx *bbolt.Tx) error {
|
||||
repoBuck := tx.Bucket([]byte(bolt.RepoMetadataBucket))
|
||||
repoBuck := tx.Bucket([]byte(boltdb.RepoMetadataBucket))
|
||||
|
||||
return repoBuck.Put([]byte("repo1"), []byte("wrong json"))
|
||||
})
|
||||
|
@ -404,7 +403,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
|
||||
Convey("IncrementRepoStars", func() {
|
||||
err := boltdbWrapper.DB.Update(func(tx *bbolt.Tx) error {
|
||||
repoBuck := tx.Bucket([]byte(bolt.RepoMetadataBucket))
|
||||
repoBuck := tx.Bucket([]byte(boltdb.RepoMetadataBucket))
|
||||
|
||||
return repoBuck.Put([]byte("repo1"), []byte("wrong json"))
|
||||
})
|
||||
|
@ -419,7 +418,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
|
||||
Convey("DecrementRepoStars", func() {
|
||||
err := boltdbWrapper.DB.Update(func(tx *bbolt.Tx) error {
|
||||
repoBuck := tx.Bucket([]byte(bolt.RepoMetadataBucket))
|
||||
repoBuck := tx.Bucket([]byte(boltdb.RepoMetadataBucket))
|
||||
|
||||
return repoBuck.Put([]byte("repo1"), []byte("wrong json"))
|
||||
})
|
||||
|
@ -434,7 +433,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
|
||||
Convey("GetRepoStars", func() {
|
||||
err := boltdbWrapper.DB.Update(func(tx *bbolt.Tx) error {
|
||||
repoBuck := tx.Bucket([]byte(bolt.RepoMetadataBucket))
|
||||
repoBuck := tx.Bucket([]byte(boltdb.RepoMetadataBucket))
|
||||
|
||||
return repoBuck.Put([]byte("repo1"), []byte("wrong json"))
|
||||
})
|
||||
|
@ -446,21 +445,21 @@ func TestWrapperErrors(t *testing.T) {
|
|||
|
||||
Convey("GetMultipleRepoMeta", func() {
|
||||
err := boltdbWrapper.DB.Update(func(tx *bbolt.Tx) error {
|
||||
repoBuck := tx.Bucket([]byte(bolt.RepoMetadataBucket))
|
||||
repoBuck := tx.Bucket([]byte(boltdb.RepoMetadataBucket))
|
||||
|
||||
return repoBuck.Put([]byte("repo1"), []byte("wrong json"))
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, err = boltdbWrapper.GetMultipleRepoMeta(context.TODO(), func(repoMeta repodb.RepoMetadata) bool {
|
||||
_, err = boltdbWrapper.GetMultipleRepoMeta(context.TODO(), func(repoMeta mTypes.RepoMetadata) bool {
|
||||
return true
|
||||
}, repodb.PageInput{})
|
||||
}, mTypes.PageInput{})
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
Convey("IncrementImageDownloads", func() {
|
||||
err := boltdbWrapper.DB.Update(func(tx *bbolt.Tx) error {
|
||||
repoBuck := tx.Bucket([]byte(bolt.RepoMetadataBucket))
|
||||
repoBuck := tx.Bucket([]byte(boltdb.RepoMetadataBucket))
|
||||
|
||||
return repoBuck.Put([]byte("repo1"), []byte("wrong json"))
|
||||
})
|
||||
|
@ -473,7 +472,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
So(err, ShouldNotBeNil)
|
||||
|
||||
err = boltdbWrapper.DB.Update(func(tx *bbolt.Tx) error {
|
||||
repoBuck := tx.Bucket([]byte(bolt.RepoMetadataBucket))
|
||||
repoBuck := tx.Bucket([]byte(boltdb.RepoMetadataBucket))
|
||||
|
||||
return repoBuck.Put([]byte("repo1"), repoMetaBlob)
|
||||
})
|
||||
|
@ -485,18 +484,18 @@ func TestWrapperErrors(t *testing.T) {
|
|||
|
||||
Convey("AddManifestSignature", func() {
|
||||
err := boltdbWrapper.DB.Update(func(tx *bbolt.Tx) error {
|
||||
repoBuck := tx.Bucket([]byte(bolt.RepoMetadataBucket))
|
||||
repoBuck := tx.Bucket([]byte(boltdb.RepoMetadataBucket))
|
||||
|
||||
return repoBuck.Put([]byte("repo1"), []byte("wrong json"))
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = boltdbWrapper.AddManifestSignature("repo1", digest.FromString("dig"),
|
||||
repodb.SignatureMetadata{})
|
||||
mTypes.SignatureMetadata{})
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
err = boltdbWrapper.DB.Update(func(tx *bbolt.Tx) error {
|
||||
repoBuck := tx.Bucket([]byte(bolt.RepoMetadataBucket))
|
||||
repoBuck := tx.Bucket([]byte(boltdb.RepoMetadataBucket))
|
||||
|
||||
return repoBuck.Put([]byte("repo1"), repoMetaBlob)
|
||||
})
|
||||
|
@ -504,16 +503,16 @@ func TestWrapperErrors(t *testing.T) {
|
|||
|
||||
// signatures not found
|
||||
err = boltdbWrapper.AddManifestSignature("repo1", digest.FromString("dig"),
|
||||
repodb.SignatureMetadata{})
|
||||
mTypes.SignatureMetadata{})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
//
|
||||
err = boltdbWrapper.DB.Update(func(tx *bbolt.Tx) error {
|
||||
repoBuck := tx.Bucket([]byte(bolt.RepoMetadataBucket))
|
||||
repoBuck := tx.Bucket([]byte(boltdb.RepoMetadataBucket))
|
||||
|
||||
repoMeta := repodb.RepoMetadata{
|
||||
Tags: map[string]repodb.Descriptor{},
|
||||
Signatures: map[string]repodb.ManifestSignatures{
|
||||
repoMeta := mTypes.RepoMetadata{
|
||||
Tags: map[string]mTypes.Descriptor{},
|
||||
Signatures: map[string]mTypes.ManifestSignatures{
|
||||
"digest1": {
|
||||
"cosgin": {{}},
|
||||
},
|
||||
|
@ -531,14 +530,14 @@ func TestWrapperErrors(t *testing.T) {
|
|||
So(err, ShouldBeNil)
|
||||
|
||||
err = boltdbWrapper.AddManifestSignature("repo1", digest.FromString("dig"),
|
||||
repodb.SignatureMetadata{
|
||||
mTypes.SignatureMetadata{
|
||||
SignatureType: "cosign",
|
||||
SignatureDigest: "digest1",
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = boltdbWrapper.AddManifestSignature("repo1", digest.FromString("dig"),
|
||||
repodb.SignatureMetadata{
|
||||
mTypes.SignatureMetadata{
|
||||
SignatureType: "cosign",
|
||||
SignatureDigest: "digest2",
|
||||
})
|
||||
|
@ -552,7 +551,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
ShouldEqual, "digest2")
|
||||
|
||||
err = boltdbWrapper.AddManifestSignature("repo1", digest.FromString("dig"),
|
||||
repodb.SignatureMetadata{
|
||||
mTypes.SignatureMetadata{
|
||||
SignatureType: "notation",
|
||||
SignatureDigest: "digest2",
|
||||
})
|
||||
|
@ -561,28 +560,28 @@ func TestWrapperErrors(t *testing.T) {
|
|||
|
||||
Convey("DeleteSignature", func() {
|
||||
err := boltdbWrapper.DB.Update(func(tx *bbolt.Tx) error {
|
||||
repoBuck := tx.Bucket([]byte(bolt.RepoMetadataBucket))
|
||||
repoBuck := tx.Bucket([]byte(boltdb.RepoMetadataBucket))
|
||||
|
||||
return repoBuck.Put([]byte("repo1"), []byte("wrong json"))
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = boltdbWrapper.DeleteSignature("repo2", digest.FromString("dig"),
|
||||
repodb.SignatureMetadata{})
|
||||
mTypes.SignatureMetadata{})
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
err = boltdbWrapper.DeleteSignature("repo1", digest.FromString("dig"),
|
||||
repodb.SignatureMetadata{})
|
||||
mTypes.SignatureMetadata{})
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
err = boltdbWrapper.DB.Update(func(tx *bbolt.Tx) error {
|
||||
repoBuck := tx.Bucket([]byte(bolt.RepoMetadataBucket))
|
||||
repoBuck := tx.Bucket([]byte(boltdb.RepoMetadataBucket))
|
||||
|
||||
repoMeta := repodb.RepoMetadata{
|
||||
Tags: map[string]repodb.Descriptor{},
|
||||
Signatures: map[string]repodb.ManifestSignatures{
|
||||
repoMeta := mTypes.RepoMetadata{
|
||||
Tags: map[string]mTypes.Descriptor{},
|
||||
Signatures: map[string]mTypes.ManifestSignatures{
|
||||
"digest1": {
|
||||
"cosgin": []repodb.SignatureInfo{
|
||||
"cosgin": []mTypes.SignatureInfo{
|
||||
{
|
||||
SignatureManifestDigest: "sigDigest1",
|
||||
},
|
||||
|
@ -605,7 +604,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
So(err, ShouldBeNil)
|
||||
|
||||
err = boltdbWrapper.DeleteSignature("repo1", "digest1",
|
||||
repodb.SignatureMetadata{
|
||||
mTypes.SignatureMetadata{
|
||||
SignatureType: "cosgin",
|
||||
SignatureDigest: "sigDigest2",
|
||||
})
|
||||
|
@ -614,30 +613,30 @@ func TestWrapperErrors(t *testing.T) {
|
|||
|
||||
Convey("SearchRepos", func() {
|
||||
err := boltdbWrapper.DB.Update(func(tx *bbolt.Tx) error {
|
||||
repoBuck := tx.Bucket([]byte(bolt.RepoMetadataBucket))
|
||||
repoBuck := tx.Bucket([]byte(boltdb.RepoMetadataBucket))
|
||||
|
||||
return repoBuck.Put([]byte("repo1"), []byte("wrong json"))
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, _, _, _, err = boltdbWrapper.SearchRepos(context.Background(), "", repodb.Filter{}, repodb.PageInput{})
|
||||
_, _, _, _, err = boltdbWrapper.SearchRepos(context.Background(), "", mTypes.Filter{}, mTypes.PageInput{})
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
err = boltdbWrapper.DB.Update(func(tx *bbolt.Tx) error {
|
||||
repoBuck := tx.Bucket([]byte(bolt.RepoMetadataBucket))
|
||||
dataBuck := tx.Bucket([]byte(bolt.ManifestDataBucket))
|
||||
repoBuck := tx.Bucket([]byte(boltdb.RepoMetadataBucket))
|
||||
dataBuck := tx.Bucket([]byte(boltdb.ManifestDataBucket))
|
||||
|
||||
err := dataBuck.Put([]byte("dig1"), []byte("wrong json"))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
repoMeta := repodb.RepoMetadata{
|
||||
repoMeta := mTypes.RepoMetadata{
|
||||
Name: "repo1",
|
||||
Tags: map[string]repodb.Descriptor{
|
||||
Tags: map[string]mTypes.Descriptor{
|
||||
"tag1": {Digest: "dig1", MediaType: ispec.MediaTypeImageManifest},
|
||||
},
|
||||
Signatures: map[string]repodb.ManifestSignatures{},
|
||||
Signatures: map[string]mTypes.ManifestSignatures{},
|
||||
}
|
||||
repoMetaBlob, err := json.Marshal(repoMeta)
|
||||
So(err, ShouldBeNil)
|
||||
|
@ -647,12 +646,12 @@ func TestWrapperErrors(t *testing.T) {
|
|||
return err
|
||||
}
|
||||
|
||||
repoMeta = repodb.RepoMetadata{
|
||||
repoMeta = mTypes.RepoMetadata{
|
||||
Name: "repo2",
|
||||
Tags: map[string]repodb.Descriptor{
|
||||
Tags: map[string]mTypes.Descriptor{
|
||||
"tag2": {Digest: "dig2", MediaType: ispec.MediaTypeImageManifest},
|
||||
},
|
||||
Signatures: map[string]repodb.ManifestSignatures{},
|
||||
Signatures: map[string]mTypes.ManifestSignatures{},
|
||||
}
|
||||
repoMetaBlob, err = json.Marshal(repoMeta)
|
||||
So(err, ShouldBeNil)
|
||||
|
@ -661,20 +660,20 @@ func TestWrapperErrors(t *testing.T) {
|
|||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, _, _, _, err = boltdbWrapper.SearchRepos(context.Background(), "repo1", repodb.Filter{}, repodb.PageInput{})
|
||||
_, _, _, _, err = boltdbWrapper.SearchRepos(context.Background(), "repo1", mTypes.Filter{}, mTypes.PageInput{})
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
_, _, _, _, err = boltdbWrapper.SearchRepos(context.Background(), "repo2", repodb.Filter{}, repodb.PageInput{})
|
||||
_, _, _, _, err = boltdbWrapper.SearchRepos(context.Background(), "repo2", mTypes.Filter{}, mTypes.PageInput{})
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
err = boltdbWrapper.DB.Update(func(tx *bbolt.Tx) error {
|
||||
repoBuck := tx.Bucket([]byte(bolt.RepoMetadataBucket))
|
||||
dataBuck := tx.Bucket([]byte(bolt.ManifestDataBucket))
|
||||
repoBuck := tx.Bucket([]byte(boltdb.RepoMetadataBucket))
|
||||
dataBuck := tx.Bucket([]byte(boltdb.ManifestDataBucket))
|
||||
|
||||
manifestMeta := repodb.ManifestMetadata{
|
||||
manifestMeta := mTypes.ManifestMetadata{
|
||||
ManifestBlob: []byte("{}"),
|
||||
ConfigBlob: []byte("wrong json"),
|
||||
Signatures: repodb.ManifestSignatures{},
|
||||
Signatures: mTypes.ManifestSignatures{},
|
||||
}
|
||||
|
||||
manifestMetaBlob, err := json.Marshal(manifestMeta)
|
||||
|
@ -687,12 +686,12 @@ func TestWrapperErrors(t *testing.T) {
|
|||
return err
|
||||
}
|
||||
|
||||
repoMeta = repodb.RepoMetadata{
|
||||
repoMeta = mTypes.RepoMetadata{
|
||||
Name: "repo1",
|
||||
Tags: map[string]repodb.Descriptor{
|
||||
Tags: map[string]mTypes.Descriptor{
|
||||
"tag1": {Digest: "dig1", MediaType: ispec.MediaTypeImageManifest},
|
||||
},
|
||||
Signatures: map[string]repodb.ManifestSignatures{},
|
||||
Signatures: map[string]mTypes.ManifestSignatures{},
|
||||
}
|
||||
repoMetaBlob, err = json.Marshal(repoMeta)
|
||||
So(err, ShouldBeNil)
|
||||
|
@ -701,7 +700,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, _, _, _, err = boltdbWrapper.SearchRepos(context.Background(), "repo1", repodb.Filter{}, repodb.PageInput{})
|
||||
_, _, _, _, err = boltdbWrapper.SearchRepos(context.Background(), "repo1", mTypes.Filter{}, mTypes.PageInput{})
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
|
@ -715,10 +714,10 @@ func TestWrapperErrors(t *testing.T) {
|
|||
err = setBadIndexData(boltdbWrapper.DB, indexDigest.String())
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, _, _, _, err = boltdbWrapper.SearchRepos(ctx, "", repodb.Filter{}, repodb.PageInput{})
|
||||
_, _, _, _, err = boltdbWrapper.SearchRepos(ctx, "", mTypes.Filter{}, mTypes.PageInput{})
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
_, _, _, _, err = boltdbWrapper.SearchTags(ctx, "repo:", repodb.Filter{}, repodb.PageInput{})
|
||||
_, _, _, _, err = boltdbWrapper.SearchTags(ctx, "repo:", mTypes.Filter{}, mTypes.PageInput{})
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
|
@ -728,15 +727,15 @@ func TestWrapperErrors(t *testing.T) {
|
|||
err := boltdbWrapper.SetRepoReference("repo", "tag1", indexDigest, ispec.MediaTypeImageIndex) //nolint:contextcheck
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = boltdbWrapper.SetIndexData(indexDigest, repodb.IndexData{
|
||||
err = boltdbWrapper.SetIndexData(indexDigest, mTypes.IndexData{
|
||||
IndexBlob: []byte("bad json"),
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, _, _, _, err = boltdbWrapper.SearchRepos(ctx, "", repodb.Filter{}, repodb.PageInput{})
|
||||
_, _, _, _, err = boltdbWrapper.SearchRepos(ctx, "", mTypes.Filter{}, mTypes.PageInput{})
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
_, _, _, _, err = boltdbWrapper.SearchTags(ctx, "repo:", repodb.Filter{}, repodb.PageInput{})
|
||||
_, _, _, _, err = boltdbWrapper.SearchTags(ctx, "repo:", mTypes.Filter{}, mTypes.PageInput{})
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
|
@ -755,27 +754,27 @@ func TestWrapperErrors(t *testing.T) {
|
|||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = boltdbWrapper.SetIndexData(indexDigest, repodb.IndexData{
|
||||
err = boltdbWrapper.SetIndexData(indexDigest, mTypes.IndexData{
|
||||
IndexBlob: indexBlob,
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = boltdbWrapper.SetManifestData(manifestDigestFromIndex1, repodb.ManifestData{
|
||||
err = boltdbWrapper.SetManifestData(manifestDigestFromIndex1, mTypes.ManifestData{
|
||||
ManifestBlob: []byte("Bad Manifest"),
|
||||
ConfigBlob: []byte("Bad Manifest"),
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = boltdbWrapper.SetManifestData(manifestDigestFromIndex2, repodb.ManifestData{
|
||||
err = boltdbWrapper.SetManifestData(manifestDigestFromIndex2, mTypes.ManifestData{
|
||||
ManifestBlob: []byte("Bad Manifest"),
|
||||
ConfigBlob: []byte("Bad Manifest"),
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, _, _, _, err = boltdbWrapper.SearchRepos(ctx, "", repodb.Filter{}, repodb.PageInput{})
|
||||
_, _, _, _, err = boltdbWrapper.SearchRepos(ctx, "", mTypes.Filter{}, mTypes.PageInput{})
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
_, _, _, _, err = boltdbWrapper.SearchTags(ctx, "repo:", repodb.Filter{}, repodb.PageInput{})
|
||||
_, _, _, _, err = boltdbWrapper.SearchTags(ctx, "repo:", mTypes.Filter{}, mTypes.PageInput{})
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
})
|
||||
|
@ -784,26 +783,26 @@ func TestWrapperErrors(t *testing.T) {
|
|||
ctx := context.Background()
|
||||
|
||||
err := boltdbWrapper.DB.Update(func(tx *bbolt.Tx) error {
|
||||
repoBuck := tx.Bucket([]byte(bolt.RepoMetadataBucket))
|
||||
repoBuck := tx.Bucket([]byte(boltdb.RepoMetadataBucket))
|
||||
|
||||
return repoBuck.Put([]byte("repo1"), []byte("wrong json"))
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, _, _, _, err = boltdbWrapper.SearchTags(ctx, "", repodb.Filter{}, repodb.PageInput{})
|
||||
_, _, _, _, err = boltdbWrapper.SearchTags(ctx, "", mTypes.Filter{}, mTypes.PageInput{})
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
_, _, _, _, err = boltdbWrapper.SearchTags(ctx, "repo1:", repodb.Filter{}, repodb.PageInput{})
|
||||
_, _, _, _, err = boltdbWrapper.SearchTags(ctx, "repo1:", mTypes.Filter{}, mTypes.PageInput{})
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
err = boltdbWrapper.DB.Update(func(tx *bbolt.Tx) error {
|
||||
repoBuck := tx.Bucket([]byte(bolt.RepoMetadataBucket))
|
||||
dataBuck := tx.Bucket([]byte(bolt.ManifestDataBucket))
|
||||
repoBuck := tx.Bucket([]byte(boltdb.RepoMetadataBucket))
|
||||
dataBuck := tx.Bucket([]byte(boltdb.ManifestDataBucket))
|
||||
|
||||
manifestMeta := repodb.ManifestMetadata{
|
||||
manifestMeta := mTypes.ManifestMetadata{
|
||||
ManifestBlob: []byte("{}"),
|
||||
ConfigBlob: []byte("wrong json"),
|
||||
Signatures: repodb.ManifestSignatures{},
|
||||
Signatures: mTypes.ManifestSignatures{},
|
||||
}
|
||||
|
||||
manifestMetaBlob, err := json.Marshal(manifestMeta)
|
||||
|
@ -822,12 +821,12 @@ func TestWrapperErrors(t *testing.T) {
|
|||
}
|
||||
|
||||
// manifest data doesn't exist
|
||||
repoMeta = repodb.RepoMetadata{
|
||||
repoMeta = mTypes.RepoMetadata{
|
||||
Name: "repo1",
|
||||
Tags: map[string]repodb.Descriptor{
|
||||
Tags: map[string]mTypes.Descriptor{
|
||||
"tag2": {Digest: "dig2", MediaType: ispec.MediaTypeImageManifest},
|
||||
},
|
||||
Signatures: map[string]repodb.ManifestSignatures{},
|
||||
Signatures: map[string]mTypes.ManifestSignatures{},
|
||||
}
|
||||
repoMetaBlob, err = json.Marshal(repoMeta)
|
||||
So(err, ShouldBeNil)
|
||||
|
@ -838,12 +837,12 @@ func TestWrapperErrors(t *testing.T) {
|
|||
}
|
||||
|
||||
// manifest data is wrong
|
||||
repoMeta = repodb.RepoMetadata{
|
||||
repoMeta = mTypes.RepoMetadata{
|
||||
Name: "repo2",
|
||||
Tags: map[string]repodb.Descriptor{
|
||||
Tags: map[string]mTypes.Descriptor{
|
||||
"tag2": {Digest: "wrongManifestData", MediaType: ispec.MediaTypeImageManifest},
|
||||
},
|
||||
Signatures: map[string]repodb.ManifestSignatures{},
|
||||
Signatures: map[string]mTypes.ManifestSignatures{},
|
||||
}
|
||||
repoMetaBlob, err = json.Marshal(repoMeta)
|
||||
So(err, ShouldBeNil)
|
||||
|
@ -853,12 +852,12 @@ func TestWrapperErrors(t *testing.T) {
|
|||
return err
|
||||
}
|
||||
|
||||
repoMeta = repodb.RepoMetadata{
|
||||
repoMeta = mTypes.RepoMetadata{
|
||||
Name: "repo3",
|
||||
Tags: map[string]repodb.Descriptor{
|
||||
Tags: map[string]mTypes.Descriptor{
|
||||
"tag1": {Digest: "dig1", MediaType: ispec.MediaTypeImageManifest},
|
||||
},
|
||||
Signatures: map[string]repodb.ManifestSignatures{},
|
||||
Signatures: map[string]mTypes.ManifestSignatures{},
|
||||
}
|
||||
repoMetaBlob, err = json.Marshal(repoMeta)
|
||||
So(err, ShouldBeNil)
|
||||
|
@ -867,13 +866,13 @@ func TestWrapperErrors(t *testing.T) {
|
|||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, _, _, _, err = boltdbWrapper.SearchTags(ctx, "repo1:", repodb.Filter{}, repodb.PageInput{})
|
||||
_, _, _, _, err = boltdbWrapper.SearchTags(ctx, "repo1:", mTypes.Filter{}, mTypes.PageInput{})
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
_, _, _, _, err = boltdbWrapper.SearchTags(ctx, "repo2:", repodb.Filter{}, repodb.PageInput{})
|
||||
_, _, _, _, err = boltdbWrapper.SearchTags(ctx, "repo2:", mTypes.Filter{}, mTypes.PageInput{})
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
_, _, _, _, err = boltdbWrapper.SearchTags(ctx, "repo3:", repodb.Filter{}, repodb.PageInput{})
|
||||
_, _, _, _, err = boltdbWrapper.SearchTags(ctx, "repo3:", mTypes.Filter{}, mTypes.PageInput{})
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
|
@ -888,9 +887,9 @@ func TestWrapperErrors(t *testing.T) {
|
|||
So(err, ShouldBeNil)
|
||||
|
||||
_, _, _, _, err = boltdbWrapper.FilterTags(ctx,
|
||||
func(repoMeta repodb.RepoMetadata, manifestMeta repodb.ManifestMetadata) bool { return true },
|
||||
repodb.Filter{},
|
||||
repodb.PageInput{},
|
||||
func(repoMeta mTypes.RepoMetadata, manifestMeta mTypes.ManifestMetadata) bool { return true },
|
||||
mTypes.Filter{},
|
||||
mTypes.PageInput{},
|
||||
)
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
@ -901,15 +900,15 @@ func TestWrapperErrors(t *testing.T) {
|
|||
err := boltdbWrapper.SetRepoReference("repo", "tag1", indexDigest, ispec.MediaTypeImageIndex) //nolint:contextcheck
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = boltdbWrapper.SetIndexData(indexDigest, repodb.IndexData{
|
||||
err = boltdbWrapper.SetIndexData(indexDigest, mTypes.IndexData{
|
||||
IndexBlob: []byte("bad json"),
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, _, _, _, err = boltdbWrapper.FilterTags(ctx,
|
||||
func(repoMeta repodb.RepoMetadata, manifestMeta repodb.ManifestMetadata) bool { return true },
|
||||
repodb.Filter{},
|
||||
repodb.PageInput{},
|
||||
func(repoMeta mTypes.RepoMetadata, manifestMeta mTypes.ManifestMetadata) bool { return true },
|
||||
mTypes.Filter{},
|
||||
mTypes.PageInput{},
|
||||
)
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
@ -929,27 +928,27 @@ func TestWrapperErrors(t *testing.T) {
|
|||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = boltdbWrapper.SetIndexData(indexDigest, repodb.IndexData{
|
||||
err = boltdbWrapper.SetIndexData(indexDigest, mTypes.IndexData{
|
||||
IndexBlob: indexBlob,
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = boltdbWrapper.SetManifestData(manifestDigestFromIndex1, repodb.ManifestData{
|
||||
err = boltdbWrapper.SetManifestData(manifestDigestFromIndex1, mTypes.ManifestData{
|
||||
ManifestBlob: []byte("{}"),
|
||||
ConfigBlob: []byte("{}"),
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = boltdbWrapper.SetManifestData(manifestDigestFromIndex2, repodb.ManifestData{
|
||||
err = boltdbWrapper.SetManifestData(manifestDigestFromIndex2, mTypes.ManifestData{
|
||||
ManifestBlob: []byte("{}"),
|
||||
ConfigBlob: []byte("{}"),
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, _, _, _, err = boltdbWrapper.FilterTags(ctx,
|
||||
func(repoMeta repodb.RepoMetadata, manifestMeta repodb.ManifestMetadata) bool { return false },
|
||||
repodb.Filter{},
|
||||
repodb.PageInput{},
|
||||
func(repoMeta mTypes.RepoMetadata, manifestMeta mTypes.ManifestMetadata) bool { return false },
|
||||
mTypes.Filter{},
|
||||
mTypes.PageInput{},
|
||||
)
|
||||
So(err, ShouldBeNil)
|
||||
})
|
||||
|
@ -962,16 +961,16 @@ func TestWrapperErrors(t *testing.T) {
|
|||
)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = boltdbWrapper.SetManifestData(manifestDigest, repodb.ManifestData{
|
||||
err = boltdbWrapper.SetManifestData(manifestDigest, mTypes.ManifestData{
|
||||
ManifestBlob: []byte("{}"),
|
||||
ConfigBlob: []byte("bad blob"),
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, _, _, _, err = boltdbWrapper.FilterTags(ctx,
|
||||
func(repoMeta repodb.RepoMetadata, manifestMeta repodb.ManifestMetadata) bool { return true },
|
||||
repodb.Filter{},
|
||||
repodb.PageInput{},
|
||||
func(repoMeta mTypes.RepoMetadata, manifestMeta mTypes.ManifestMetadata) bool { return true },
|
||||
mTypes.Filter{},
|
||||
mTypes.PageInput{},
|
||||
)
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
@ -993,27 +992,27 @@ func TestWrapperErrors(t *testing.T) {
|
|||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = boltdbWrapper.SetIndexData(indexDigest, repodb.IndexData{
|
||||
err = boltdbWrapper.SetIndexData(indexDigest, mTypes.IndexData{
|
||||
IndexBlob: indexBlob,
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = boltdbWrapper.SetManifestData(manifestDigestFromIndex1, repodb.ManifestData{
|
||||
err = boltdbWrapper.SetManifestData(manifestDigestFromIndex1, mTypes.ManifestData{
|
||||
ManifestBlob: []byte("{}"),
|
||||
ConfigBlob: []byte("{}"),
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = boltdbWrapper.SetManifestData(manifestDigestFromIndex2, repodb.ManifestData{
|
||||
err = boltdbWrapper.SetManifestData(manifestDigestFromIndex2, mTypes.ManifestData{
|
||||
ManifestBlob: []byte("{}"),
|
||||
ConfigBlob: []byte("bad blob"),
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, _, _, _, err = boltdbWrapper.FilterTags(ctx,
|
||||
func(repoMeta repodb.RepoMetadata, manifestMeta repodb.ManifestMetadata) bool { return true },
|
||||
repodb.Filter{},
|
||||
repodb.PageInput{},
|
||||
func(repoMeta mTypes.RepoMetadata, manifestMeta mTypes.ManifestMetadata) bool { return true },
|
||||
mTypes.Filter{},
|
||||
mTypes.PageInput{},
|
||||
)
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
@ -1038,7 +1037,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
ctx := context.WithValue(context.Background(), authzCtxKey, acCtx)
|
||||
|
||||
err := boltdbWrapper.DB.Update(func(tx *bbolt.Tx) error {
|
||||
repoBuck := tx.Bucket([]byte(bolt.RepoMetadataBucket))
|
||||
repoBuck := tx.Bucket([]byte(boltdb.RepoMetadataBucket))
|
||||
|
||||
err := repoBuck.Put([]byte("repo"), []byte("bad repo"))
|
||||
So(err, ShouldBeNil)
|
||||
|
@ -1085,7 +1084,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
authzCtxKey := localCtx.GetContextKey()
|
||||
ctx := context.WithValue(context.Background(), authzCtxKey, "bad context")
|
||||
|
||||
err := boltdbWrapper.SetUserData(ctx, repodb.UserData{})
|
||||
err := boltdbWrapper.SetUserData(ctx, mTypes.UserData{})
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
|
@ -1112,7 +1111,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
authzCtxKey := localCtx.GetContextKey()
|
||||
ctx := context.WithValue(context.Background(), authzCtxKey, "bad context")
|
||||
|
||||
err := boltdbWrapper.AddUserAPIKey(ctx, "", &repodb.APIKeyDetails{})
|
||||
err := boltdbWrapper.AddUserAPIKey(ctx, "", &mTypes.APIKeyDetails{})
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
|
@ -1162,17 +1161,17 @@ func TestWrapperErrors(t *testing.T) {
|
|||
err := boltdbWrapper.SetRepoReference("repo", "tag1", digest, "invalid type") //nolint:contextcheck
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, _, _, _, err = boltdbWrapper.SearchRepos(ctx, "", repodb.Filter{}, repodb.PageInput{})
|
||||
_, _, _, _, err = boltdbWrapper.SearchRepos(ctx, "", mTypes.Filter{}, mTypes.PageInput{})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, _, _, _, err = boltdbWrapper.SearchTags(ctx, "repo:", repodb.Filter{}, repodb.PageInput{})
|
||||
_, _, _, _, err = boltdbWrapper.SearchTags(ctx, "repo:", mTypes.Filter{}, mTypes.PageInput{})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, _, _, _, err = boltdbWrapper.FilterTags(
|
||||
ctx,
|
||||
func(repoMeta repodb.RepoMetadata, manifestMeta repodb.ManifestMetadata) bool { return true },
|
||||
repodb.Filter{},
|
||||
repodb.PageInput{},
|
||||
func(repoMeta mTypes.RepoMetadata, manifestMeta mTypes.ManifestMetadata) bool { return true },
|
||||
mTypes.Filter{},
|
||||
mTypes.PageInput{},
|
||||
)
|
||||
So(err, ShouldBeNil)
|
||||
})
|
||||
|
@ -1188,7 +1187,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
ctx := context.WithValue(context.Background(), authzCtxKey, acCtx)
|
||||
|
||||
err = boltdbWrapper.DB.Update(func(tx *bbolt.Tx) error {
|
||||
repoBuck := tx.Bucket([]byte(bolt.RepoMetadataBucket))
|
||||
repoBuck := tx.Bucket([]byte(boltdb.RepoMetadataBucket))
|
||||
|
||||
err := repoBuck.Put([]byte("repo"), []byte("bad repo"))
|
||||
So(err, ShouldBeNil)
|
||||
|
@ -1209,7 +1208,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
|
||||
Convey("repoMeta of signed manifest not found", func() {
|
||||
// repo Meta not found
|
||||
err := boltdbWrapper.SetManifestData(digest.FromString("dig"), repodb.ManifestData{
|
||||
err := boltdbWrapper.SetManifestData(digest.FromString("dig"), mTypes.ManifestData{
|
||||
ManifestBlob: []byte("Bad Manifest"),
|
||||
ConfigBlob: []byte("Bad Manifest"),
|
||||
})
|
||||
|
@ -1221,7 +1220,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
|
||||
Convey("manifest - bad content", func() {
|
||||
err := boltdbWrapper.DB.Update(func(tx *bbolt.Tx) error {
|
||||
dataBuck := tx.Bucket([]byte(bolt.ManifestDataBucket))
|
||||
dataBuck := tx.Bucket([]byte(boltdb.ManifestDataBucket))
|
||||
|
||||
return dataBuck.Put([]byte("digest1"), []byte("wrong json"))
|
||||
})
|
||||
|
@ -1233,7 +1232,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
|
||||
Convey("index - bad content", func() {
|
||||
err := boltdbWrapper.DB.Update(func(tx *bbolt.Tx) error {
|
||||
dataBuck := tx.Bucket([]byte(bolt.IndexDataBucket))
|
||||
dataBuck := tx.Bucket([]byte(boltdb.IndexDataBucket))
|
||||
|
||||
return dataBuck.Put([]byte("digest1"), []byte("wrong json"))
|
||||
})
|
||||
|
@ -1245,14 +1244,14 @@ func TestWrapperErrors(t *testing.T) {
|
|||
|
||||
Convey("repo - bad content", func() {
|
||||
// repo Meta not found
|
||||
err := boltdbWrapper.SetManifestData(digest.FromString("dig"), repodb.ManifestData{
|
||||
err := boltdbWrapper.SetManifestData(digest.FromString("dig"), mTypes.ManifestData{
|
||||
ManifestBlob: []byte("Bad Manifest"),
|
||||
ConfigBlob: []byte("Bad Manifest"),
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = boltdbWrapper.DB.Update(func(tx *bbolt.Tx) error {
|
||||
repoBuck := tx.Bucket([]byte(bolt.RepoMetadataBucket))
|
||||
repoBuck := tx.Bucket([]byte(boltdb.RepoMetadataBucket))
|
||||
|
||||
return repoBuck.Put([]byte("repo1"), []byte("wrong json"))
|
||||
})
|
||||
|
@ -1267,7 +1266,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
|
||||
func setBadIndexData(dB *bbolt.DB, digest string) error {
|
||||
return dB.Update(func(tx *bbolt.Tx) error {
|
||||
indexDataBuck := tx.Bucket([]byte(bolt.IndexDataBucket))
|
||||
indexDataBuck := tx.Bucket([]byte(boltdb.IndexDataBucket))
|
||||
|
||||
return indexDataBuck.Put([]byte(digest), []byte("bad json"))
|
||||
})
|
|
@ -1,4 +1,4 @@
|
|||
package bolt
|
||||
package boltdb
|
||||
|
||||
// MetadataDB.
|
||||
const (
|
|
@ -1,4 +1,4 @@
|
|||
package bolt
|
||||
package boltdb
|
||||
|
||||
import (
|
||||
"path"
|
|
@ -10,12 +10,12 @@ import (
|
|||
ispec "github.com/opencontainers/image-spec/specs-go/v1"
|
||||
|
||||
zerr "zotregistry.io/zot/errors"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
)
|
||||
|
||||
func UpdateManifestMeta(repoMeta repodb.RepoMetadata, manifestDigest godigest.Digest,
|
||||
manifestMeta repodb.ManifestMetadata,
|
||||
) repodb.RepoMetadata {
|
||||
func UpdateManifestMeta(repoMeta mTypes.RepoMetadata, manifestDigest godigest.Digest,
|
||||
manifestMeta mTypes.ManifestMetadata,
|
||||
) mTypes.RepoMetadata {
|
||||
updatedRepoMeta := repoMeta
|
||||
|
||||
updatedStatistics := repoMeta.Statistics[manifestDigest.String()]
|
||||
|
@ -23,7 +23,7 @@ func UpdateManifestMeta(repoMeta repodb.RepoMetadata, manifestDigest godigest.Di
|
|||
updatedRepoMeta.Statistics[manifestDigest.String()] = updatedStatistics
|
||||
|
||||
if manifestMeta.Signatures == nil {
|
||||
manifestMeta.Signatures = repodb.ManifestSignatures{}
|
||||
manifestMeta.Signatures = mTypes.ManifestSignatures{}
|
||||
}
|
||||
|
||||
updatedRepoMeta.Signatures[manifestDigest.String()] = manifestMeta.Signatures
|
||||
|
@ -31,7 +31,7 @@ func UpdateManifestMeta(repoMeta repodb.RepoMetadata, manifestDigest godigest.Di
|
|||
return updatedRepoMeta
|
||||
}
|
||||
|
||||
func SignatureAlreadyExists(signatureSlice []repodb.SignatureInfo, sm repodb.SignatureMetadata) bool {
|
||||
func SignatureAlreadyExists(signatureSlice []mTypes.SignatureInfo, sm mTypes.SignatureMetadata) bool {
|
||||
for _, sigInfo := range signatureSlice {
|
||||
if sm.SignatureDigest == sigInfo.SignatureManifestDigest {
|
||||
return true
|
||||
|
@ -160,7 +160,7 @@ func GetImageLastUpdatedTimestamp(configContent ispec.Image) time.Time {
|
|||
return *timeStamp
|
||||
}
|
||||
|
||||
func CheckIsSigned(signatures repodb.ManifestSignatures) bool {
|
||||
func CheckIsSigned(signatures mTypes.ManifestSignatures) bool {
|
||||
for _, signatures := range signatures {
|
||||
if len(signatures) > 0 {
|
||||
return true
|
||||
|
@ -197,7 +197,7 @@ func GetMapKeys[K comparable, V any](genericMap map[K]V) []K {
|
|||
|
||||
// acceptedByFilter checks that data contains at least 1 element of each filter
|
||||
// criteria(os, arch) present in filter.
|
||||
func AcceptedByFilter(filter repodb.Filter, data repodb.FilterData) bool {
|
||||
func AcceptedByFilter(filter mTypes.Filter, data mTypes.FilterData) bool {
|
||||
if filter.Arch != nil {
|
||||
foundArch := false
|
||||
for _, arch := range filter.Arch {
|
||||
|
@ -284,7 +284,7 @@ func MatchesArtifactTypes(descriptorMediaType string, artifactTypes []string) bo
|
|||
//
|
||||
// It returns updated values for: repoLastUpdated, noImageChecked, isSigned.
|
||||
func CheckImageLastUpdated(repoLastUpdated time.Time, isSigned bool, noImageChecked bool,
|
||||
manifestFilterData repodb.FilterData,
|
||||
manifestFilterData mTypes.FilterData,
|
||||
) (time.Time, bool, bool) {
|
||||
if noImageChecked || repoLastUpdated.Before(manifestFilterData.LastUpdated) {
|
||||
repoLastUpdated = manifestFilterData.LastUpdated
|
||||
|
@ -296,12 +296,12 @@ func CheckImageLastUpdated(repoLastUpdated time.Time, isSigned bool, noImageChec
|
|||
return repoLastUpdated, noImageChecked, isSigned
|
||||
}
|
||||
|
||||
func FilterDataByRepo(foundRepos []repodb.RepoMetadata, manifestMetadataMap map[string]repodb.ManifestMetadata,
|
||||
indexDataMap map[string]repodb.IndexData,
|
||||
) (map[string]repodb.ManifestMetadata, map[string]repodb.IndexData, error) {
|
||||
func FilterDataByRepo(foundRepos []mTypes.RepoMetadata, manifestMetadataMap map[string]mTypes.ManifestMetadata,
|
||||
indexDataMap map[string]mTypes.IndexData,
|
||||
) (map[string]mTypes.ManifestMetadata, map[string]mTypes.IndexData, error) {
|
||||
var (
|
||||
foundManifestMetadataMap = make(map[string]repodb.ManifestMetadata)
|
||||
foundindexDataMap = make(map[string]repodb.IndexData)
|
||||
foundManifestMetadataMap = make(map[string]mTypes.ManifestMetadata)
|
||||
foundindexDataMap = make(map[string]mTypes.IndexData)
|
||||
)
|
||||
|
||||
// keep just the manifestMeta we need
|
||||
|
@ -317,8 +317,8 @@ func FilterDataByRepo(foundRepos []repodb.RepoMetadata, manifestMetadataMap map[
|
|||
|
||||
err := json.Unmarshal(indexData.IndexBlob, &indexContent)
|
||||
if err != nil {
|
||||
return map[string]repodb.ManifestMetadata{}, map[string]repodb.IndexData{},
|
||||
fmt.Errorf("repodb: error while getting manifest data for digest %s %w", descriptor.Digest, err)
|
||||
return map[string]mTypes.ManifestMetadata{}, map[string]mTypes.IndexData{},
|
||||
fmt.Errorf("metadb: error while getting manifest data for digest %s %w", descriptor.Digest, err)
|
||||
}
|
||||
|
||||
for _, manifestDescriptor := range indexContent.Manifests {
|
||||
|
@ -337,48 +337,48 @@ func FilterDataByRepo(foundRepos []repodb.RepoMetadata, manifestMetadataMap map[
|
|||
return foundManifestMetadataMap, foundindexDataMap, nil
|
||||
}
|
||||
|
||||
func FetchDataForRepos(repoDB repodb.RepoDB, foundRepos []repodb.RepoMetadata,
|
||||
) (map[string]repodb.ManifestMetadata, map[string]repodb.IndexData, error) {
|
||||
foundManifestMetadataMap := map[string]repodb.ManifestMetadata{}
|
||||
foundIndexDataMap := map[string]repodb.IndexData{}
|
||||
func FetchDataForRepos(metaDB mTypes.MetaDB, foundRepos []mTypes.RepoMetadata,
|
||||
) (map[string]mTypes.ManifestMetadata, map[string]mTypes.IndexData, error) {
|
||||
foundManifestMetadataMap := map[string]mTypes.ManifestMetadata{}
|
||||
foundIndexDataMap := map[string]mTypes.IndexData{}
|
||||
|
||||
for idx := range foundRepos {
|
||||
for _, descriptor := range foundRepos[idx].Tags {
|
||||
switch descriptor.MediaType {
|
||||
case ispec.MediaTypeImageManifest:
|
||||
manifestData, err := repoDB.GetManifestData(godigest.Digest(descriptor.Digest))
|
||||
manifestData, err := metaDB.GetManifestData(godigest.Digest(descriptor.Digest))
|
||||
if err != nil {
|
||||
return map[string]repodb.ManifestMetadata{}, map[string]repodb.IndexData{}, err
|
||||
return map[string]mTypes.ManifestMetadata{}, map[string]mTypes.IndexData{}, err
|
||||
}
|
||||
|
||||
foundManifestMetadataMap[descriptor.Digest] = repodb.ManifestMetadata{
|
||||
foundManifestMetadataMap[descriptor.Digest] = mTypes.ManifestMetadata{
|
||||
ManifestBlob: manifestData.ManifestBlob,
|
||||
ConfigBlob: manifestData.ConfigBlob,
|
||||
}
|
||||
case ispec.MediaTypeImageIndex:
|
||||
indexData, err := repoDB.GetIndexData(godigest.Digest(descriptor.Digest))
|
||||
indexData, err := metaDB.GetIndexData(godigest.Digest(descriptor.Digest))
|
||||
if err != nil {
|
||||
return map[string]repodb.ManifestMetadata{}, map[string]repodb.IndexData{}, err
|
||||
return map[string]mTypes.ManifestMetadata{}, map[string]mTypes.IndexData{}, err
|
||||
}
|
||||
|
||||
var indexContent ispec.Index
|
||||
|
||||
err = json.Unmarshal(indexData.IndexBlob, &indexContent)
|
||||
if err != nil {
|
||||
return map[string]repodb.ManifestMetadata{},
|
||||
map[string]repodb.IndexData{},
|
||||
fmt.Errorf("repodb: error while getting index data for digest %s %w", descriptor.Digest, err)
|
||||
return map[string]mTypes.ManifestMetadata{},
|
||||
map[string]mTypes.IndexData{},
|
||||
fmt.Errorf("metadb: error while getting index data for digest %s %w", descriptor.Digest, err)
|
||||
}
|
||||
|
||||
for _, manifestDescriptor := range indexContent.Manifests {
|
||||
manifestDigest := manifestDescriptor.Digest.String()
|
||||
|
||||
manifestData, err := repoDB.GetManifestData(manifestDescriptor.Digest)
|
||||
manifestData, err := metaDB.GetManifestData(manifestDescriptor.Digest)
|
||||
if err != nil {
|
||||
return map[string]repodb.ManifestMetadata{}, map[string]repodb.IndexData{}, err
|
||||
return map[string]mTypes.ManifestMetadata{}, map[string]mTypes.IndexData{}, err
|
||||
}
|
||||
|
||||
foundManifestMetadataMap[manifestDigest] = repodb.ManifestMetadata{
|
||||
foundManifestMetadataMap[manifestDigest] = mTypes.ManifestMetadata{
|
||||
ManifestBlob: manifestData.ManifestBlob,
|
||||
ConfigBlob: manifestData.ConfigBlob,
|
||||
}
|
||||
|
@ -391,3 +391,33 @@ func FetchDataForRepos(repoDB repodb.RepoDB, foundRepos []repodb.RepoMetadata,
|
|||
|
||||
return foundManifestMetadataMap, foundIndexDataMap, nil
|
||||
}
|
||||
|
||||
// FindMediaTypeForDigest will look into the buckets for a certain digest. Depending on which bucket that
|
||||
// digest is found the corresponding mediatype is returned.
|
||||
func FindMediaTypeForDigest(metaDB mTypes.MetaDB, digest godigest.Digest) (bool, string) {
|
||||
_, err := metaDB.GetManifestData(digest)
|
||||
if err == nil {
|
||||
return true, ispec.MediaTypeImageManifest
|
||||
}
|
||||
|
||||
_, err = metaDB.GetIndexData(digest)
|
||||
if err == nil {
|
||||
return true, ispec.MediaTypeImageIndex
|
||||
}
|
||||
|
||||
return false, ""
|
||||
}
|
||||
|
||||
func GetImageDescriptor(metaDB mTypes.MetaDB, repo, tag string) (mTypes.Descriptor, error) {
|
||||
repoMeta, err := metaDB.GetRepoMeta(repo)
|
||||
if err != nil {
|
||||
return mTypes.Descriptor{}, err
|
||||
}
|
||||
|
||||
imageDescriptor, ok := repoMeta.Tags[tag]
|
||||
if !ok {
|
||||
return mTypes.Descriptor{}, zerr.ErrTagMetaNotFound
|
||||
}
|
||||
|
||||
return imageDescriptor, nil
|
||||
}
|
||||
|
|
|
@ -10,7 +10,7 @@ import (
|
|||
. "github.com/smartystreets/goconvey/convey"
|
||||
|
||||
"zotregistry.io/zot/pkg/meta/common"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
"zotregistry.io/zot/pkg/test/mocks"
|
||||
)
|
||||
|
||||
|
@ -35,7 +35,7 @@ func TestUtils(t *testing.T) {
|
|||
repoLastUpdated := time.Time{}
|
||||
isSigned := false
|
||||
noImageChecked := true
|
||||
manifestFilterData := repodb.FilterData{
|
||||
manifestFilterData := mTypes.FilterData{
|
||||
DownloadCount: 10,
|
||||
LastUpdated: time.Time{},
|
||||
IsSigned: true,
|
||||
|
@ -52,7 +52,7 @@ func TestUtils(t *testing.T) {
|
|||
repoLastUpdated := time.Time{}
|
||||
isSigned := false
|
||||
noImageChecked := true
|
||||
manifestFilterData := repodb.FilterData{
|
||||
manifestFilterData := mTypes.FilterData{
|
||||
DownloadCount: 10,
|
||||
LastUpdated: time.Date(2000, 1, 1, 1, 1, 1, 1, time.UTC),
|
||||
IsSigned: true,
|
||||
|
@ -69,7 +69,7 @@ func TestUtils(t *testing.T) {
|
|||
repoLastUpdated := time.Date(2000, 1, 1, 1, 1, 1, 1, time.UTC)
|
||||
isSigned := true
|
||||
noImageChecked := false
|
||||
manifestFilterData := repodb.FilterData{
|
||||
manifestFilterData := mTypes.FilterData{
|
||||
DownloadCount: 10,
|
||||
LastUpdated: time.Date(2023, 1, 1, 1, 1, 1, 1, time.UTC),
|
||||
IsSigned: false,
|
||||
|
@ -86,7 +86,7 @@ func TestUtils(t *testing.T) {
|
|||
repoLastUpdated := time.Date(2024, 1, 1, 1, 1, 1, 1, time.UTC)
|
||||
isSigned := false
|
||||
noImageChecked := false
|
||||
manifestFilterData := repodb.FilterData{
|
||||
manifestFilterData := mTypes.FilterData{
|
||||
DownloadCount: 10,
|
||||
LastUpdated: time.Date(2022, 1, 1, 1, 1, 1, 1, time.UTC),
|
||||
IsSigned: true,
|
||||
|
@ -103,15 +103,15 @@ func TestUtils(t *testing.T) {
|
|||
|
||||
Convey("SignatureAlreadyExists", t, func() {
|
||||
res := common.SignatureAlreadyExists(
|
||||
[]repodb.SignatureInfo{{SignatureManifestDigest: "digest"}},
|
||||
repodb.SignatureMetadata{SignatureDigest: "digest"},
|
||||
[]mTypes.SignatureInfo{{SignatureManifestDigest: "digest"}},
|
||||
mTypes.SignatureMetadata{SignatureDigest: "digest"},
|
||||
)
|
||||
|
||||
So(res, ShouldEqual, true)
|
||||
|
||||
res = common.SignatureAlreadyExists(
|
||||
[]repodb.SignatureInfo{{SignatureManifestDigest: "digest"}},
|
||||
repodb.SignatureMetadata{SignatureDigest: "digest2"},
|
||||
[]mTypes.SignatureInfo{{SignatureManifestDigest: "digest"}},
|
||||
mTypes.SignatureMetadata{SignatureDigest: "digest2"},
|
||||
)
|
||||
|
||||
So(res, ShouldEqual, false)
|
||||
|
@ -121,16 +121,16 @@ func TestUtils(t *testing.T) {
|
|||
Convey("Errors", func() {
|
||||
// Unmarshal index data error
|
||||
_, _, err := common.FilterDataByRepo(
|
||||
[]repodb.RepoMetadata{{
|
||||
Tags: map[string]repodb.Descriptor{
|
||||
[]mTypes.RepoMetadata{{
|
||||
Tags: map[string]mTypes.Descriptor{
|
||||
"tag": {
|
||||
Digest: "indexDigest",
|
||||
MediaType: ispec.MediaTypeImageIndex,
|
||||
},
|
||||
},
|
||||
}},
|
||||
map[string]repodb.ManifestMetadata{},
|
||||
map[string]repodb.IndexData{
|
||||
map[string]mTypes.ManifestMetadata{},
|
||||
map[string]mTypes.IndexData{
|
||||
"indexDigest": {
|
||||
IndexBlob: []byte("bad blob"),
|
||||
},
|
||||
|
@ -145,15 +145,15 @@ func TestUtils(t *testing.T) {
|
|||
Convey("Errors", func() {
|
||||
// Unmarshal index data error
|
||||
_, _, err := common.FetchDataForRepos(
|
||||
mocks.RepoDBMock{
|
||||
GetIndexDataFn: func(indexDigest digest.Digest) (repodb.IndexData, error) {
|
||||
return repodb.IndexData{
|
||||
mocks.MetaDBMock{
|
||||
GetIndexDataFn: func(indexDigest digest.Digest) (mTypes.IndexData, error) {
|
||||
return mTypes.IndexData{
|
||||
IndexBlob: []byte("bad blob"),
|
||||
}, nil
|
||||
},
|
||||
},
|
||||
[]repodb.RepoMetadata{{
|
||||
Tags: map[string]repodb.Descriptor{
|
||||
[]mTypes.RepoMetadata{{
|
||||
Tags: map[string]mTypes.Descriptor{
|
||||
"tag": {
|
||||
Digest: "indexDigest",
|
||||
MediaType: ispec.MediaTypeImageIndex,
|
||||
|
@ -168,16 +168,16 @@ func TestUtils(t *testing.T) {
|
|||
|
||||
func TestFetchDataForRepos(t *testing.T) {
|
||||
Convey("GetReferredSubject", t, func() {
|
||||
mockRepoDB := mocks.RepoDBMock{}
|
||||
mockMetaDB := mocks.MetaDBMock{}
|
||||
|
||||
Convey("GetManifestData errors", func() {
|
||||
mockRepoDB.GetManifestDataFn = func(manifestDigest digest.Digest) (repodb.ManifestData, error) {
|
||||
return repodb.ManifestData{}, ErrTestError
|
||||
mockMetaDB.GetManifestDataFn = func(manifestDigest digest.Digest) (mTypes.ManifestData, error) {
|
||||
return mTypes.ManifestData{}, ErrTestError
|
||||
}
|
||||
|
||||
_, _, err := common.FetchDataForRepos(mockRepoDB, []repodb.RepoMetadata{
|
||||
_, _, err := common.FetchDataForRepos(mockMetaDB, []mTypes.RepoMetadata{
|
||||
{
|
||||
Tags: map[string]repodb.Descriptor{
|
||||
Tags: map[string]mTypes.Descriptor{
|
||||
"tag1": {Digest: "dig1", MediaType: ispec.MediaTypeImageManifest},
|
||||
},
|
||||
},
|
||||
|
@ -186,13 +186,13 @@ func TestFetchDataForRepos(t *testing.T) {
|
|||
})
|
||||
|
||||
Convey("GetIndexData errors", func() {
|
||||
mockRepoDB.GetIndexDataFn = func(indexDigest digest.Digest) (repodb.IndexData, error) {
|
||||
return repodb.IndexData{}, ErrTestError
|
||||
mockMetaDB.GetIndexDataFn = func(indexDigest digest.Digest) (mTypes.IndexData, error) {
|
||||
return mTypes.IndexData{}, ErrTestError
|
||||
}
|
||||
|
||||
_, _, err := common.FetchDataForRepos(mockRepoDB, []repodb.RepoMetadata{
|
||||
_, _, err := common.FetchDataForRepos(mockMetaDB, []mTypes.RepoMetadata{
|
||||
{
|
||||
Tags: map[string]repodb.Descriptor{
|
||||
Tags: map[string]mTypes.Descriptor{
|
||||
"tag1": {Digest: "dig1", MediaType: ispec.MediaTypeImageIndex},
|
||||
},
|
||||
},
|
||||
|
@ -201,8 +201,8 @@ func TestFetchDataForRepos(t *testing.T) {
|
|||
})
|
||||
|
||||
Convey("GetIndexData ok, GetManifestData errors", func() {
|
||||
mockRepoDB.GetIndexDataFn = func(indexDigest digest.Digest) (repodb.IndexData, error) {
|
||||
return repodb.IndexData{
|
||||
mockMetaDB.GetIndexDataFn = func(indexDigest digest.Digest) (mTypes.IndexData, error) {
|
||||
return mTypes.IndexData{
|
||||
IndexBlob: []byte(`{
|
||||
"manifests": [
|
||||
{"digest": "dig1"}
|
||||
|
@ -210,13 +210,13 @@ func TestFetchDataForRepos(t *testing.T) {
|
|||
}`),
|
||||
}, nil
|
||||
}
|
||||
mockRepoDB.GetManifestDataFn = func(manifestDigest digest.Digest) (repodb.ManifestData, error) {
|
||||
return repodb.ManifestData{}, ErrTestError
|
||||
mockMetaDB.GetManifestDataFn = func(manifestDigest digest.Digest) (mTypes.ManifestData, error) {
|
||||
return mTypes.ManifestData{}, ErrTestError
|
||||
}
|
||||
|
||||
_, _, err := common.FetchDataForRepos(mockRepoDB, []repodb.RepoMetadata{
|
||||
_, _, err := common.FetchDataForRepos(mockMetaDB, []mTypes.RepoMetadata{
|
||||
{
|
||||
Tags: map[string]repodb.Descriptor{
|
||||
Tags: map[string]mTypes.Descriptor{
|
||||
"tag1": {Digest: "dig1", MediaType: ispec.MediaTypeImageIndex},
|
||||
},
|
||||
},
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,4 +1,4 @@
|
|||
package dynamo
|
||||
package dynamodb
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
@ -52,7 +52,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
config.WithEndpointResolverWithOptions(customResolver))
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
dynamoWrapper := DBWrapper{
|
||||
dynamoWrapper := DynamoDB{
|
||||
Client: dynamodb.NewFromConfig(cfg),
|
||||
RepoMetaTablename: repoMetaTablename,
|
||||
ManifestDataTablename: manifestDataTablename,
|
||||
|
@ -96,7 +96,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
config.WithEndpointResolverWithOptions(customResolver))
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
dynamoWrapper := DBWrapper{
|
||||
dynamoWrapper := DynamoDB{
|
||||
Client: dynamodb.NewFromConfig(cfg),
|
||||
RepoMetaTablename: repoMetaTablename,
|
||||
ManifestDataTablename: manifestDataTablename,
|
|
@ -1,4 +1,4 @@
|
|||
package dynamo_test
|
||||
package dynamodb_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
@ -18,9 +18,8 @@ import (
|
|||
. "github.com/smartystreets/goconvey/convey"
|
||||
|
||||
"zotregistry.io/zot/pkg/log"
|
||||
"zotregistry.io/zot/pkg/meta/dynamo"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
dynamoWrapper "zotregistry.io/zot/pkg/meta/repodb/dynamodb-wrapper"
|
||||
mdynamodb "zotregistry.io/zot/pkg/meta/dynamodb"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
localCtx "zotregistry.io/zot/pkg/requestcontext"
|
||||
"zotregistry.io/zot/pkg/test"
|
||||
)
|
||||
|
@ -48,7 +47,7 @@ func TestIterator(t *testing.T) {
|
|||
log := log.NewLogger("debug", "")
|
||||
|
||||
Convey("TestIterator", t, func() {
|
||||
params := dynamo.DBDriverParameters{
|
||||
params := mdynamodb.DBDriverParameters{
|
||||
Endpoint: endpoint,
|
||||
Region: region,
|
||||
RepoMetaTablename: repoMetaTablename,
|
||||
|
@ -58,10 +57,10 @@ func TestIterator(t *testing.T) {
|
|||
APIKeyTablename: apiKeyTablename,
|
||||
UserDataTablename: userDataTablename,
|
||||
}
|
||||
client, err := dynamo.GetDynamoClient(params)
|
||||
client, err := mdynamodb.GetDynamoClient(params)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
dynamoWrapper, err := dynamoWrapper.NewDynamoDBWrapper(client, params, log)
|
||||
dynamoWrapper, err := mdynamodb.New(client, params, log)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
So(dynamoWrapper.ResetManifestDataTable(), ShouldBeNil)
|
||||
|
@ -76,7 +75,7 @@ func TestIterator(t *testing.T) {
|
|||
err = dynamoWrapper.SetRepoReference("repo3", "tag3", "manifestType", "manifestDigest3")
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
repoMetaAttributeIterator := dynamo.NewBaseDynamoAttributesIterator(
|
||||
repoMetaAttributeIterator := mdynamodb.NewBaseDynamoAttributesIterator(
|
||||
dynamoWrapper.Client,
|
||||
repoMetaTablename,
|
||||
"RepoMetadata",
|
||||
|
@ -117,7 +116,7 @@ func TestIteratorErrors(t *testing.T) {
|
|||
config.WithEndpointResolverWithOptions(customResolver))
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
repoMetaAttributeIterator := dynamo.NewBaseDynamoAttributesIterator(
|
||||
repoMetaAttributeIterator := mdynamodb.NewBaseDynamoAttributesIterator(
|
||||
dynamodb.NewFromConfig(cfg),
|
||||
"RepoMetadataTable",
|
||||
"RepoMetadata",
|
||||
|
@ -152,7 +151,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
log := log.NewLogger("debug", "")
|
||||
|
||||
Convey("Errors", t, func() {
|
||||
params := dynamo.DBDriverParameters{ //nolint:contextcheck
|
||||
params := mdynamodb.DBDriverParameters{ //nolint:contextcheck
|
||||
Endpoint: endpoint,
|
||||
Region: region,
|
||||
RepoMetaTablename: repoMetaTablename,
|
||||
|
@ -162,10 +161,10 @@ func TestWrapperErrors(t *testing.T) {
|
|||
APIKeyTablename: apiKeyTablename,
|
||||
VersionTablename: versionTablename,
|
||||
}
|
||||
client, err := dynamo.GetDynamoClient(params) //nolint:contextcheck
|
||||
client, err := mdynamodb.GetDynamoClient(params) //nolint:contextcheck
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
dynamoWrapper, err := dynamoWrapper.NewDynamoDBWrapper(client, params, log) //nolint:contextcheck
|
||||
dynamoWrapper, err := mdynamodb.New(client, params, log) //nolint:contextcheck
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
So(dynamoWrapper.ResetManifestDataTable(), ShouldBeNil) //nolint:contextcheck
|
||||
|
@ -181,8 +180,8 @@ func TestWrapperErrors(t *testing.T) {
|
|||
|
||||
Convey("SetUserData", func() {
|
||||
hashKey := "id"
|
||||
apiKeys := make(map[string]repodb.APIKeyDetails)
|
||||
apiKeyDetails := repodb.APIKeyDetails{
|
||||
apiKeys := make(map[string]mTypes.APIKeyDetails)
|
||||
apiKeyDetails := mTypes.APIKeyDetails{
|
||||
Label: "apiKey",
|
||||
Scopes: []string{"repo"},
|
||||
UUID: hashKey,
|
||||
|
@ -190,7 +189,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
|
||||
apiKeys[hashKey] = apiKeyDetails
|
||||
|
||||
userProfileSrc := repodb.UserData{
|
||||
userProfileSrc := mTypes.UserData{
|
||||
Groups: []string{"group1", "group2"},
|
||||
APIKeys: apiKeys,
|
||||
}
|
||||
|
@ -206,7 +205,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
|
||||
ctx := context.WithValue(context.Background(), authzCtxKey, acCtx)
|
||||
|
||||
err = dynamoWrapper.SetUserData(ctx, repodb.UserData{}) //nolint: contextcheck
|
||||
err = dynamoWrapper.SetUserData(ctx, mTypes.UserData{}) //nolint: contextcheck
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
|
@ -254,7 +253,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
|
||||
status, err := dynamoWrapper.ToggleBookmarkRepo(ctx, "repo")
|
||||
So(err, ShouldBeNil)
|
||||
So(status, ShouldEqual, repodb.NotChanged)
|
||||
So(status, ShouldEqual, mTypes.NotChanged)
|
||||
})
|
||||
|
||||
Convey("ToggleBookmarkRepo GetUserMeta client error", func() {
|
||||
|
@ -272,7 +271,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
|
||||
status, err := dynamoWrapper.ToggleBookmarkRepo(ctx, "repo")
|
||||
So(err, ShouldNotBeNil)
|
||||
So(status, ShouldEqual, repodb.NotChanged)
|
||||
So(status, ShouldEqual, mTypes.NotChanged)
|
||||
})
|
||||
|
||||
Convey("GetBookmarkedRepos", func() {
|
||||
|
@ -395,7 +394,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
authzCtxKey := localCtx.GetContextKey()
|
||||
ctx := context.WithValue(context.Background(), authzCtxKey, "bad context")
|
||||
|
||||
err := dynamoWrapper.SetUserData(ctx, repodb.UserData{})
|
||||
err := dynamoWrapper.SetUserData(ctx, mTypes.UserData{})
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
|
@ -411,7 +410,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
authzCtxKey := localCtx.GetContextKey()
|
||||
ctx := context.WithValue(context.Background(), authzCtxKey, "bad context")
|
||||
|
||||
err := dynamoWrapper.SetUserData(ctx, repodb.UserData{})
|
||||
err := dynamoWrapper.SetUserData(ctx, mTypes.UserData{})
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
|
@ -419,7 +418,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
authzCtxKey := localCtx.GetContextKey()
|
||||
ctx := context.WithValue(context.Background(), authzCtxKey, "bad context")
|
||||
|
||||
err := dynamoWrapper.AddUserAPIKey(ctx, "", &repodb.APIKeyDetails{})
|
||||
err := dynamoWrapper.AddUserAPIKey(ctx, "", &mTypes.APIKeyDetails{})
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
|
@ -456,11 +455,11 @@ func TestWrapperErrors(t *testing.T) {
|
|||
|
||||
ctx := context.WithValue(context.Background(), authzCtxKey, acCtx)
|
||||
|
||||
apiKeyDetails := make(map[string]repodb.APIKeyDetails)
|
||||
apiKeyDetails["id"] = repodb.APIKeyDetails{
|
||||
apiKeyDetails := make(map[string]mTypes.APIKeyDetails)
|
||||
apiKeyDetails["id"] = mTypes.APIKeyDetails{
|
||||
UUID: "id",
|
||||
}
|
||||
err := dynamoWrapper.SetUserData(ctx, repodb.UserData{
|
||||
err := dynamoWrapper.SetUserData(ctx, mTypes.UserData{
|
||||
APIKeys: apiKeyDetails,
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
@ -480,7 +479,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
|
||||
ctx := context.WithValue(context.Background(), authzCtxKey, acCtx)
|
||||
|
||||
err = dynamoWrapper.AddUserAPIKey(ctx, "key", &repodb.APIKeyDetails{})
|
||||
err = dynamoWrapper.AddUserAPIKey(ctx, "key", &mTypes.APIKeyDetails{})
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
authzCtxKey := localCtx.GetContextKey()
|
||||
|
@ -491,11 +490,11 @@ func TestWrapperErrors(t *testing.T) {
|
|||
|
||||
ctx := context.WithValue(context.Background(), authzCtxKey, acCtx)
|
||||
|
||||
err := dynamoWrapper.AddUserAPIKey(ctx, "key", &repodb.APIKeyDetails{})
|
||||
err := dynamoWrapper.AddUserAPIKey(ctx, "key", &mTypes.APIKeyDetails{})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
dynamoWrapper.APIKeyTablename = wrongTableName
|
||||
err = dynamoWrapper.AddUserAPIKey(ctx, "key", &repodb.APIKeyDetails{})
|
||||
err = dynamoWrapper.AddUserAPIKey(ctx, "key", &mTypes.APIKeyDetails{})
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
|
@ -530,7 +529,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
Convey("SetManifestData", func() {
|
||||
dynamoWrapper.ManifestDataTablename = wrongTableName
|
||||
|
||||
err := dynamoWrapper.SetManifestData("dig", repodb.ManifestData{})
|
||||
err := dynamoWrapper.SetManifestData("dig", mTypes.ManifestData{})
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
|
@ -568,7 +567,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
err := setBadRepoMeta(dynamoWrapper.Client, repoMetaTablename, "repo1")
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = dynamoWrapper.SetManifestMeta("repo1", "dig", repodb.ManifestMetadata{})
|
||||
err = dynamoWrapper.SetManifestMeta("repo1", "dig", mTypes.ManifestMetadata{})
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
|
@ -581,7 +580,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
})
|
||||
|
||||
Convey("GetManifestMeta GetRepoMeta Not Found error", func() {
|
||||
err := dynamoWrapper.SetManifestData("dig", repodb.ManifestData{})
|
||||
err := dynamoWrapper.SetManifestData("dig", mTypes.ManifestData{})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, err = dynamoWrapper.GetManifestMeta("repoNotFound", "dig")
|
||||
|
@ -589,7 +588,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
})
|
||||
|
||||
Convey("GetManifestMeta GetRepoMeta error", func() {
|
||||
err := dynamoWrapper.SetManifestData("dig", repodb.ManifestData{})
|
||||
err := dynamoWrapper.SetManifestData("dig", mTypes.ManifestData{})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = setBadRepoMeta(dynamoWrapper.Client, repoMetaTablename, "repo")
|
||||
|
@ -608,7 +607,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
|
||||
Convey("SetReferrer client error", func() {
|
||||
dynamoWrapper.RepoMetaTablename = badTablename
|
||||
err := dynamoWrapper.SetReferrer("repo", "", repodb.ReferrerInfo{})
|
||||
err := dynamoWrapper.SetReferrer("repo", "", mTypes.ReferrerInfo{})
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
|
@ -616,7 +615,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
err := setBadRepoMeta(dynamoWrapper.Client, repoMetaTablename, "repo")
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = dynamoWrapper.SetReferrer("repo", "", repodb.ReferrerInfo{})
|
||||
err = dynamoWrapper.SetReferrer("repo", "", mTypes.ReferrerInfo{})
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
|
@ -656,13 +655,13 @@ func TestWrapperErrors(t *testing.T) {
|
|||
|
||||
Convey("GetReferrersInfo getData fails", func() {
|
||||
dynamoWrapper.ManifestDataTablename = badTablename
|
||||
err = dynamoWrapper.SetReferrer("repo", "rf", repodb.ReferrerInfo{
|
||||
err = dynamoWrapper.SetReferrer("repo", "rf", mTypes.ReferrerInfo{
|
||||
Digest: "dig1",
|
||||
MediaType: ispec.MediaTypeImageManifest,
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = dynamoWrapper.SetReferrer("repo", "rf", repodb.ReferrerInfo{
|
||||
err = dynamoWrapper.SetReferrer("repo", "rf", mTypes.ReferrerInfo{
|
||||
Digest: "dig2",
|
||||
MediaType: ispec.MediaTypeImageManifest,
|
||||
})
|
||||
|
@ -673,18 +672,18 @@ func TestWrapperErrors(t *testing.T) {
|
|||
})
|
||||
|
||||
Convey("GetReferrersInfo bad descriptor blob", func() {
|
||||
err = dynamoWrapper.SetManifestData("dig3", repodb.ManifestData{
|
||||
err = dynamoWrapper.SetManifestData("dig3", mTypes.ManifestData{
|
||||
ManifestBlob: []byte("bad json"),
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = dynamoWrapper.SetReferrer("repo", "rf", repodb.ReferrerInfo{
|
||||
err = dynamoWrapper.SetReferrer("repo", "rf", mTypes.ReferrerInfo{
|
||||
Digest: "dig2",
|
||||
MediaType: ispec.MediaTypeImageManifest,
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = dynamoWrapper.SetReferrer("repo", "rf", repodb.ReferrerInfo{
|
||||
err = dynamoWrapper.SetReferrer("repo", "rf", mTypes.ReferrerInfo{
|
||||
Digest: "dig3",
|
||||
MediaType: ispec.MediaTypeImageManifest,
|
||||
})
|
||||
|
@ -758,7 +757,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
})
|
||||
|
||||
Convey("UpdateSignaturesValidity GetRepoMeta error", func() {
|
||||
err := dynamoWrapper.SetManifestData("dig", repodb.ManifestData{})
|
||||
err := dynamoWrapper.SetManifestData("dig", mTypes.ManifestData{})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = setBadRepoMeta(dynamoWrapper.Client, repoMetaTablename, "repo")
|
||||
|
@ -772,7 +771,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
err := dynamoWrapper.SetRepoReference("repo", "tag", "dig", "")
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = dynamoWrapper.AddManifestSignature("repoNotFound", "tag", repodb.SignatureMetadata{})
|
||||
err = dynamoWrapper.AddManifestSignature("repoNotFound", "tag", mTypes.SignatureMetadata{})
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
|
@ -780,31 +779,31 @@ func TestWrapperErrors(t *testing.T) {
|
|||
err := dynamoWrapper.SetRepoReference("repo", "tag", "dig", "")
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = dynamoWrapper.AddManifestSignature("repo", "tagNotFound", repodb.SignatureMetadata{})
|
||||
err = dynamoWrapper.AddManifestSignature("repo", "tagNotFound", mTypes.SignatureMetadata{})
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
Convey("AddManifestSignature SignatureType repodb.NotationType", func() {
|
||||
Convey("AddManifestSignature SignatureType metadb.NotationType", func() {
|
||||
err := dynamoWrapper.SetRepoReference("repo", "tag", "dig", "")
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = dynamoWrapper.AddManifestSignature("repo", "tagNotFound", repodb.SignatureMetadata{
|
||||
err = dynamoWrapper.AddManifestSignature("repo", "tagNotFound", mTypes.SignatureMetadata{
|
||||
SignatureType: "notation",
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
})
|
||||
|
||||
Convey("DeleteSignature GetRepoMeta error", func() {
|
||||
err = dynamoWrapper.DeleteSignature("repoNotFound", "tagNotFound", repodb.SignatureMetadata{})
|
||||
err = dynamoWrapper.DeleteSignature("repoNotFound", "tagNotFound", mTypes.SignatureMetadata{})
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
Convey("DeleteSignature sigDigest.SignatureManifestDigest != sigMeta.SignatureDigest true", func() {
|
||||
err := setRepoMeta(dynamoWrapper.Client, repoMetaTablename, repodb.RepoMetadata{
|
||||
err := setRepoMeta(dynamoWrapper.Client, repoMetaTablename, mTypes.RepoMetadata{
|
||||
Name: "repo",
|
||||
Signatures: map[string]repodb.ManifestSignatures{
|
||||
Signatures: map[string]mTypes.ManifestSignatures{
|
||||
"tag1": {
|
||||
"cosign": []repodb.SignatureInfo{
|
||||
"cosign": []mTypes.SignatureInfo{
|
||||
{SignatureManifestDigest: "dig1"},
|
||||
{SignatureManifestDigest: "dig2"},
|
||||
},
|
||||
|
@ -813,7 +812,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = dynamoWrapper.DeleteSignature("repo", "tag1", repodb.SignatureMetadata{
|
||||
err = dynamoWrapper.DeleteSignature("repo", "tag1", mTypes.SignatureMetadata{
|
||||
SignatureDigest: "dig2",
|
||||
SignatureType: "cosign",
|
||||
})
|
||||
|
@ -824,8 +823,8 @@ func TestWrapperErrors(t *testing.T) {
|
|||
err = setBadRepoMeta(dynamoWrapper.Client, repoMetaTablename, "repo") //nolint:contextcheck
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, err = dynamoWrapper.GetMultipleRepoMeta(ctx, func(repoMeta repodb.RepoMetadata) bool { return true },
|
||||
repodb.PageInput{})
|
||||
_, err = dynamoWrapper.GetMultipleRepoMeta(ctx, func(repoMeta mTypes.RepoMetadata) bool { return true },
|
||||
mTypes.PageInput{})
|
||||
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
@ -834,7 +833,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
err = setBadRepoMeta(dynamoWrapper.Client, repoMetaTablename, "repo") //nolint:contextcheck
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, _, _, _, err = dynamoWrapper.SearchRepos(ctx, "", repodb.Filter{}, repodb.PageInput{})
|
||||
_, _, _, _, err = dynamoWrapper.SearchRepos(ctx, "", mTypes.Filter{}, mTypes.PageInput{})
|
||||
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
@ -844,7 +843,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
ispec.MediaTypeImageManifest)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, _, _, _, err = dynamoWrapper.SearchRepos(ctx, "", repodb.Filter{}, repodb.PageInput{})
|
||||
_, _, _, _, err = dynamoWrapper.SearchRepos(ctx, "", mTypes.Filter{}, mTypes.PageInput{})
|
||||
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
@ -853,13 +852,13 @@ func TestWrapperErrors(t *testing.T) {
|
|||
err := dynamoWrapper.SetRepoReference("repo", "tag1", "dig1", ispec.MediaTypeImageManifest) //nolint:contextcheck
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = dynamoWrapper.SetManifestData("dig1", repodb.ManifestData{ //nolint:contextcheck
|
||||
err = dynamoWrapper.SetManifestData("dig1", mTypes.ManifestData{ //nolint:contextcheck
|
||||
ManifestBlob: []byte("{}"),
|
||||
ConfigBlob: []byte("bad json"),
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, _, _, _, err = dynamoWrapper.SearchRepos(ctx, "", repodb.Filter{}, repodb.PageInput{})
|
||||
_, _, _, _, err = dynamoWrapper.SearchRepos(ctx, "", mTypes.Filter{}, mTypes.PageInput{})
|
||||
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
@ -870,17 +869,17 @@ func TestWrapperErrors(t *testing.T) {
|
|||
err := dynamoWrapper.SetRepoReference("repo", "tag1", digest, "invalid type") //nolint:contextcheck
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, _, _, _, err = dynamoWrapper.SearchRepos(ctx, "", repodb.Filter{}, repodb.PageInput{})
|
||||
_, _, _, _, err = dynamoWrapper.SearchRepos(ctx, "", mTypes.Filter{}, mTypes.PageInput{})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, _, _, _, err = dynamoWrapper.SearchTags(ctx, "repo:", repodb.Filter{}, repodb.PageInput{})
|
||||
_, _, _, _, err = dynamoWrapper.SearchTags(ctx, "repo:", mTypes.Filter{}, mTypes.PageInput{})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, _, _, _, err = dynamoWrapper.FilterTags(
|
||||
ctx,
|
||||
func(repoMeta repodb.RepoMetadata, manifestMeta repodb.ManifestMetadata) bool { return true },
|
||||
repodb.Filter{},
|
||||
repodb.PageInput{},
|
||||
func(repoMeta mTypes.RepoMetadata, manifestMeta mTypes.ManifestMetadata) bool { return true },
|
||||
mTypes.Filter{},
|
||||
mTypes.PageInput{},
|
||||
)
|
||||
So(err, ShouldBeNil)
|
||||
})
|
||||
|
@ -894,7 +893,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
err = setBadIndexData(dynamoWrapper.Client, indexDataTablename, indexDigest.String()) //nolint:contextcheck
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, _, _, _, err = dynamoWrapper.SearchRepos(ctx, "", repodb.Filter{}, repodb.PageInput{})
|
||||
_, _, _, _, err = dynamoWrapper.SearchRepos(ctx, "", mTypes.Filter{}, mTypes.PageInput{})
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
|
@ -904,12 +903,12 @@ func TestWrapperErrors(t *testing.T) {
|
|||
err := dynamoWrapper.SetRepoReference("repo", "tag1", indexDigest, ispec.MediaTypeImageIndex) //nolint:contextcheck
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = dynamoWrapper.SetIndexData(indexDigest, repodb.IndexData{ //nolint:contextcheck
|
||||
err = dynamoWrapper.SetIndexData(indexDigest, mTypes.IndexData{ //nolint:contextcheck
|
||||
IndexBlob: []byte("bad json"),
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, _, _, _, err = dynamoWrapper.SearchRepos(ctx, "", repodb.Filter{}, repodb.PageInput{})
|
||||
_, _, _, _, err = dynamoWrapper.SearchRepos(ctx, "", mTypes.Filter{}, mTypes.PageInput{})
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
|
@ -928,24 +927,24 @@ func TestWrapperErrors(t *testing.T) {
|
|||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = dynamoWrapper.SetIndexData(indexDigest, repodb.IndexData{ //nolint:contextcheck
|
||||
err = dynamoWrapper.SetIndexData(indexDigest, mTypes.IndexData{ //nolint:contextcheck
|
||||
IndexBlob: indexBlob,
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = dynamoWrapper.SetManifestData(manifestDigestFromIndex1, repodb.ManifestData{ //nolint:contextcheck
|
||||
err = dynamoWrapper.SetManifestData(manifestDigestFromIndex1, mTypes.ManifestData{ //nolint:contextcheck
|
||||
ManifestBlob: []byte("Bad Manifest"),
|
||||
ConfigBlob: []byte("Bad Manifest"),
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = dynamoWrapper.SetManifestData(manifestDigestFromIndex2, repodb.ManifestData{ //nolint:contextcheck
|
||||
err = dynamoWrapper.SetManifestData(manifestDigestFromIndex2, mTypes.ManifestData{ //nolint:contextcheck
|
||||
ManifestBlob: []byte("Bad Manifest"),
|
||||
ConfigBlob: []byte("Bad Manifest"),
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, _, _, _, err = dynamoWrapper.SearchRepos(ctx, "", repodb.Filter{}, repodb.PageInput{})
|
||||
_, _, _, _, err = dynamoWrapper.SearchRepos(ctx, "", mTypes.Filter{}, mTypes.PageInput{})
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
|
@ -953,7 +952,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
err = setBadRepoMeta(dynamoWrapper.Client, repoMetaTablename, "repo") //nolint:contextcheck
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, _, _, _, err = dynamoWrapper.SearchTags(ctx, "repo:", repodb.Filter{}, repodb.PageInput{})
|
||||
_, _, _, _, err = dynamoWrapper.SearchTags(ctx, "repo:", mTypes.Filter{}, mTypes.PageInput{})
|
||||
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
@ -963,7 +962,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
ispec.MediaTypeImageManifest)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, _, _, _, err = dynamoWrapper.SearchTags(ctx, "repo:", repodb.Filter{}, repodb.PageInput{})
|
||||
_, _, _, _, err = dynamoWrapper.SearchTags(ctx, "repo:", mTypes.Filter{}, mTypes.PageInput{})
|
||||
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
@ -974,14 +973,14 @@ func TestWrapperErrors(t *testing.T) {
|
|||
|
||||
err = dynamoWrapper.SetManifestData( //nolint:contextcheck
|
||||
"dig1",
|
||||
repodb.ManifestData{
|
||||
mTypes.ManifestData{
|
||||
ManifestBlob: []byte("{}"),
|
||||
ConfigBlob: []byte("bad json"),
|
||||
},
|
||||
)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, _, _, _, err = dynamoWrapper.SearchTags(ctx, "repo:", repodb.Filter{}, repodb.PageInput{})
|
||||
_, _, _, _, err = dynamoWrapper.SearchTags(ctx, "repo:", mTypes.Filter{}, mTypes.PageInput{})
|
||||
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
@ -995,7 +994,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
err = setBadIndexData(dynamoWrapper.Client, indexDataTablename, indexDigest.String()) //nolint:contextcheck
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, _, _, _, err = dynamoWrapper.SearchTags(ctx, "repo:", repodb.Filter{}, repodb.PageInput{})
|
||||
_, _, _, _, err = dynamoWrapper.SearchTags(ctx, "repo:", mTypes.Filter{}, mTypes.PageInput{})
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
|
@ -1005,12 +1004,12 @@ func TestWrapperErrors(t *testing.T) {
|
|||
err := dynamoWrapper.SetRepoReference("repo", "tag1", indexDigest, ispec.MediaTypeImageIndex) //nolint:contextcheck
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = dynamoWrapper.SetIndexData(indexDigest, repodb.IndexData{ //nolint:contextcheck
|
||||
err = dynamoWrapper.SetIndexData(indexDigest, mTypes.IndexData{ //nolint:contextcheck
|
||||
IndexBlob: []byte("bad json"),
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, _, _, _, err = dynamoWrapper.SearchTags(ctx, "repo:", repodb.Filter{}, repodb.PageInput{})
|
||||
_, _, _, _, err = dynamoWrapper.SearchTags(ctx, "repo:", mTypes.Filter{}, mTypes.PageInput{})
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
|
@ -1029,29 +1028,30 @@ func TestWrapperErrors(t *testing.T) {
|
|||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = dynamoWrapper.SetIndexData(indexDigest, repodb.IndexData{ //nolint:contextcheck
|
||||
err = dynamoWrapper.SetIndexData(indexDigest, mTypes.IndexData{ //nolint:contextcheck
|
||||
IndexBlob: indexBlob,
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = dynamoWrapper.SetManifestData(manifestDigestFromIndex1, repodb.ManifestData{ //nolint:contextcheck
|
||||
err = dynamoWrapper.SetManifestData(manifestDigestFromIndex1, mTypes.ManifestData{ //nolint:contextcheck
|
||||
ManifestBlob: []byte("Bad Manifest"),
|
||||
ConfigBlob: []byte("Bad Manifest"),
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = dynamoWrapper.SetManifestData(manifestDigestFromIndex2, repodb.ManifestData{ //nolint:contextcheck
|
||||
err = dynamoWrapper.SetManifestData(manifestDigestFromIndex2, mTypes.ManifestData{ //nolint:contextcheck
|
||||
ManifestBlob: []byte("Bad Manifest"),
|
||||
ConfigBlob: []byte("Bad Manifest"),
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, _, _, _, err = dynamoWrapper.SearchTags(ctx, "repo:", repodb.Filter{}, repodb.PageInput{})
|
||||
_, _, _, _, err = dynamoWrapper.SearchTags(ctx, "repo:", mTypes.Filter{}, mTypes.PageInput{})
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
Convey("FilterRepos NewBaseRepoPageFinder errors", func() {
|
||||
_, _, _, _, err := dynamoWrapper.SearchRepos(ctx, "text", repodb.Filter{}, repodb.PageInput{Offset: -2, Limit: -2})
|
||||
_, _, _, _, err := dynamoWrapper.SearchRepos(ctx, "text", mTypes.Filter{},
|
||||
mTypes.PageInput{Offset: -2, Limit: -2})
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
|
@ -1059,7 +1059,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
err = setBadRepoMeta(dynamoWrapper.Client, repoMetaTablename, "repo") //nolint:contextcheck
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, _, _, _, err := dynamoWrapper.SearchRepos(ctx, "repo", repodb.Filter{}, repodb.PageInput{})
|
||||
_, _, _, _, err := dynamoWrapper.SearchRepos(ctx, "repo", mTypes.Filter{}, mTypes.PageInput{})
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
|
@ -1069,11 +1069,11 @@ func TestWrapperErrors(t *testing.T) {
|
|||
|
||||
_, _, _, _, err = dynamoWrapper.FilterTags(
|
||||
ctx,
|
||||
func(repoMeta repodb.RepoMetadata, manifestMeta repodb.ManifestMetadata) bool {
|
||||
func(repoMeta mTypes.RepoMetadata, manifestMeta mTypes.ManifestMetadata) bool {
|
||||
return true
|
||||
},
|
||||
repodb.Filter{},
|
||||
repodb.PageInput{},
|
||||
mTypes.Filter{},
|
||||
mTypes.PageInput{},
|
||||
)
|
||||
|
||||
So(err, ShouldNotBeNil)
|
||||
|
@ -1086,11 +1086,11 @@ func TestWrapperErrors(t *testing.T) {
|
|||
|
||||
_, _, _, _, err = dynamoWrapper.FilterTags(
|
||||
ctx,
|
||||
func(repoMeta repodb.RepoMetadata, manifestMeta repodb.ManifestMetadata) bool {
|
||||
func(repoMeta mTypes.RepoMetadata, manifestMeta mTypes.ManifestMetadata) bool {
|
||||
return true
|
||||
},
|
||||
repodb.Filter{},
|
||||
repodb.PageInput{},
|
||||
mTypes.Filter{},
|
||||
mTypes.PageInput{},
|
||||
)
|
||||
|
||||
So(err, ShouldNotBeNil)
|
||||
|
@ -1105,11 +1105,11 @@ func TestWrapperErrors(t *testing.T) {
|
|||
|
||||
_, _, _, _, err = dynamoWrapper.FilterTags(
|
||||
ctx,
|
||||
func(repoMeta repodb.RepoMetadata, manifestMeta repodb.ManifestMetadata) bool {
|
||||
func(repoMeta mTypes.RepoMetadata, manifestMeta mTypes.ManifestMetadata) bool {
|
||||
return true
|
||||
},
|
||||
repodb.Filter{},
|
||||
repodb.PageInput{},
|
||||
mTypes.Filter{},
|
||||
mTypes.PageInput{},
|
||||
)
|
||||
|
||||
So(err, ShouldNotBeNil)
|
||||
|
@ -1125,9 +1125,9 @@ func TestWrapperErrors(t *testing.T) {
|
|||
So(err, ShouldBeNil)
|
||||
|
||||
_, _, _, _, err = dynamoWrapper.FilterTags(ctx,
|
||||
func(repoMeta repodb.RepoMetadata, manifestMeta repodb.ManifestMetadata) bool { return true },
|
||||
repodb.Filter{},
|
||||
repodb.PageInput{},
|
||||
func(repoMeta mTypes.RepoMetadata, manifestMeta mTypes.ManifestMetadata) bool { return true },
|
||||
mTypes.Filter{},
|
||||
mTypes.PageInput{},
|
||||
)
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
@ -1138,15 +1138,15 @@ func TestWrapperErrors(t *testing.T) {
|
|||
err := dynamoWrapper.SetRepoReference("repo", "tag1", indexDigest, ispec.MediaTypeImageIndex) //nolint:contextcheck
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = dynamoWrapper.SetIndexData(indexDigest, repodb.IndexData{ //nolint:contextcheck
|
||||
err = dynamoWrapper.SetIndexData(indexDigest, mTypes.IndexData{ //nolint:contextcheck
|
||||
IndexBlob: []byte("bad json"),
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, _, _, _, err = dynamoWrapper.FilterTags(ctx,
|
||||
func(repoMeta repodb.RepoMetadata, manifestMeta repodb.ManifestMetadata) bool { return true },
|
||||
repodb.Filter{},
|
||||
repodb.PageInput{},
|
||||
func(repoMeta mTypes.RepoMetadata, manifestMeta mTypes.ManifestMetadata) bool { return true },
|
||||
mTypes.Filter{},
|
||||
mTypes.PageInput{},
|
||||
)
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
@ -1166,27 +1166,27 @@ func TestWrapperErrors(t *testing.T) {
|
|||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = dynamoWrapper.SetIndexData(indexDigest, repodb.IndexData{ //nolint:contextcheck
|
||||
err = dynamoWrapper.SetIndexData(indexDigest, mTypes.IndexData{ //nolint:contextcheck
|
||||
IndexBlob: indexBlob,
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = dynamoWrapper.SetManifestData(manifestDigestFromIndex1, repodb.ManifestData{ //nolint:contextcheck
|
||||
err = dynamoWrapper.SetManifestData(manifestDigestFromIndex1, mTypes.ManifestData{ //nolint:contextcheck
|
||||
ManifestBlob: []byte("{}"),
|
||||
ConfigBlob: []byte("{}"),
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = dynamoWrapper.SetManifestData(manifestDigestFromIndex2, repodb.ManifestData{ //nolint:contextcheck
|
||||
err = dynamoWrapper.SetManifestData(manifestDigestFromIndex2, mTypes.ManifestData{ //nolint:contextcheck
|
||||
ManifestBlob: []byte("{}"),
|
||||
ConfigBlob: []byte("{}"),
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, _, _, _, err = dynamoWrapper.FilterTags(ctx,
|
||||
func(repoMeta repodb.RepoMetadata, manifestMeta repodb.ManifestMetadata) bool { return false },
|
||||
repodb.Filter{},
|
||||
repodb.PageInput{},
|
||||
func(repoMeta mTypes.RepoMetadata, manifestMeta mTypes.ManifestMetadata) bool { return false },
|
||||
mTypes.Filter{},
|
||||
mTypes.PageInput{},
|
||||
)
|
||||
So(err, ShouldBeNil)
|
||||
})
|
||||
|
@ -1199,16 +1199,16 @@ func TestWrapperErrors(t *testing.T) {
|
|||
)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = dynamoWrapper.SetManifestData(manifestDigest, repodb.ManifestData{ //nolint:contextcheck
|
||||
err = dynamoWrapper.SetManifestData(manifestDigest, mTypes.ManifestData{ //nolint:contextcheck
|
||||
ManifestBlob: []byte("{}"),
|
||||
ConfigBlob: []byte("bad blob"),
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, _, _, _, err = dynamoWrapper.FilterTags(ctx,
|
||||
func(repoMeta repodb.RepoMetadata, manifestMeta repodb.ManifestMetadata) bool { return true },
|
||||
repodb.Filter{},
|
||||
repodb.PageInput{},
|
||||
func(repoMeta mTypes.RepoMetadata, manifestMeta mTypes.ManifestMetadata) bool { return true },
|
||||
mTypes.Filter{},
|
||||
mTypes.PageInput{},
|
||||
)
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
@ -1230,27 +1230,27 @@ func TestWrapperErrors(t *testing.T) {
|
|||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = dynamoWrapper.SetIndexData(indexDigest, repodb.IndexData{ //nolint:contextcheck
|
||||
err = dynamoWrapper.SetIndexData(indexDigest, mTypes.IndexData{ //nolint:contextcheck
|
||||
IndexBlob: indexBlob,
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = dynamoWrapper.SetManifestData(manifestDigestFromIndex1, repodb.ManifestData{ //nolint:contextcheck
|
||||
err = dynamoWrapper.SetManifestData(manifestDigestFromIndex1, mTypes.ManifestData{ //nolint:contextcheck
|
||||
ManifestBlob: []byte("{}"),
|
||||
ConfigBlob: []byte("{}"),
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = dynamoWrapper.SetManifestData(manifestDigestFromIndex2, repodb.ManifestData{ //nolint:contextcheck
|
||||
err = dynamoWrapper.SetManifestData(manifestDigestFromIndex2, mTypes.ManifestData{ //nolint:contextcheck
|
||||
ManifestBlob: []byte("{}"),
|
||||
ConfigBlob: []byte("bad blob"),
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, _, _, _, err = dynamoWrapper.FilterTags(ctx,
|
||||
func(repoMeta repodb.RepoMetadata, manifestMeta repodb.ManifestMetadata) bool { return true },
|
||||
repodb.Filter{},
|
||||
repodb.PageInput{},
|
||||
func(repoMeta mTypes.RepoMetadata, manifestMeta mTypes.ManifestMetadata) bool { return true },
|
||||
mTypes.Filter{},
|
||||
mTypes.PageInput{},
|
||||
)
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
@ -1341,7 +1341,7 @@ func TestWrapperErrors(t *testing.T) {
|
|||
})
|
||||
|
||||
Convey("NewDynamoDBWrapper errors", t, func() {
|
||||
params := dynamo.DBDriverParameters{ //nolint:contextcheck
|
||||
params := mdynamodb.DBDriverParameters{ //nolint:contextcheck
|
||||
Endpoint: endpoint,
|
||||
Region: region,
|
||||
RepoMetaTablename: "",
|
||||
|
@ -1351,13 +1351,13 @@ func TestWrapperErrors(t *testing.T) {
|
|||
APIKeyTablename: apiKeyTablename,
|
||||
VersionTablename: versionTablename,
|
||||
}
|
||||
client, err := dynamo.GetDynamoClient(params)
|
||||
client, err := mdynamodb.GetDynamoClient(params)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, err = dynamoWrapper.NewDynamoDBWrapper(client, params, log)
|
||||
_, err = mdynamodb.New(client, params, log)
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
params = dynamo.DBDriverParameters{ //nolint:contextcheck
|
||||
params = mdynamodb.DBDriverParameters{ //nolint:contextcheck
|
||||
Endpoint: endpoint,
|
||||
Region: region,
|
||||
RepoMetaTablename: repoMetaTablename,
|
||||
|
@ -1367,13 +1367,13 @@ func TestWrapperErrors(t *testing.T) {
|
|||
APIKeyTablename: apiKeyTablename,
|
||||
VersionTablename: versionTablename,
|
||||
}
|
||||
client, err = dynamo.GetDynamoClient(params)
|
||||
client, err = mdynamodb.GetDynamoClient(params)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, err = dynamoWrapper.NewDynamoDBWrapper(client, params, log)
|
||||
_, err = mdynamodb.New(client, params, log)
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
params = dynamo.DBDriverParameters{ //nolint:contextcheck
|
||||
params = mdynamodb.DBDriverParameters{ //nolint:contextcheck
|
||||
Endpoint: endpoint,
|
||||
Region: region,
|
||||
RepoMetaTablename: repoMetaTablename,
|
||||
|
@ -1383,13 +1383,13 @@ func TestWrapperErrors(t *testing.T) {
|
|||
APIKeyTablename: apiKeyTablename,
|
||||
VersionTablename: versionTablename,
|
||||
}
|
||||
client, err = dynamo.GetDynamoClient(params)
|
||||
client, err = mdynamodb.GetDynamoClient(params)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, err = dynamoWrapper.NewDynamoDBWrapper(client, params, log)
|
||||
_, err = mdynamodb.New(client, params, log)
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
params = dynamo.DBDriverParameters{ //nolint:contextcheck
|
||||
params = mdynamodb.DBDriverParameters{ //nolint:contextcheck
|
||||
Endpoint: endpoint,
|
||||
Region: region,
|
||||
RepoMetaTablename: repoMetaTablename,
|
||||
|
@ -1399,13 +1399,13 @@ func TestWrapperErrors(t *testing.T) {
|
|||
APIKeyTablename: apiKeyTablename,
|
||||
VersionTablename: "",
|
||||
}
|
||||
client, err = dynamo.GetDynamoClient(params)
|
||||
client, err = mdynamodb.GetDynamoClient(params)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, err = dynamoWrapper.NewDynamoDBWrapper(client, params, log)
|
||||
_, err = mdynamodb.New(client, params, log)
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
params = dynamo.DBDriverParameters{ //nolint:contextcheck
|
||||
params = mdynamodb.DBDriverParameters{ //nolint:contextcheck
|
||||
Endpoint: endpoint,
|
||||
Region: region,
|
||||
RepoMetaTablename: repoMetaTablename,
|
||||
|
@ -1415,13 +1415,13 @@ func TestWrapperErrors(t *testing.T) {
|
|||
UserDataTablename: userDataTablename,
|
||||
APIKeyTablename: apiKeyTablename,
|
||||
}
|
||||
client, err = dynamo.GetDynamoClient(params)
|
||||
client, err = mdynamodb.GetDynamoClient(params)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, err = dynamoWrapper.NewDynamoDBWrapper(client, params, log)
|
||||
_, err = mdynamodb.New(client, params, log)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
params = dynamo.DBDriverParameters{ //nolint:contextcheck
|
||||
params = mdynamodb.DBDriverParameters{ //nolint:contextcheck
|
||||
Endpoint: endpoint,
|
||||
Region: region,
|
||||
RepoMetaTablename: repoMetaTablename,
|
||||
|
@ -1431,13 +1431,13 @@ func TestWrapperErrors(t *testing.T) {
|
|||
UserDataTablename: "",
|
||||
APIKeyTablename: apiKeyTablename,
|
||||
}
|
||||
client, err = dynamo.GetDynamoClient(params)
|
||||
client, err = mdynamodb.GetDynamoClient(params)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, err = dynamoWrapper.NewDynamoDBWrapper(client, params, log)
|
||||
_, err = mdynamodb.New(client, params, log)
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
params = dynamo.DBDriverParameters{ //nolint:contextcheck
|
||||
params = mdynamodb.DBDriverParameters{ //nolint:contextcheck
|
||||
Endpoint: endpoint,
|
||||
Region: region,
|
||||
RepoMetaTablename: repoMetaTablename,
|
||||
|
@ -1447,10 +1447,10 @@ func TestWrapperErrors(t *testing.T) {
|
|||
UserDataTablename: userDataTablename,
|
||||
APIKeyTablename: "",
|
||||
}
|
||||
client, err = dynamo.GetDynamoClient(params)
|
||||
client, err = mdynamodb.GetDynamoClient(params)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
_, err = dynamoWrapper.NewDynamoDBWrapper(client, params, log)
|
||||
_, err = mdynamodb.New(client, params, log)
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
}
|
||||
|
@ -1580,7 +1580,7 @@ func setVersion(client *dynamodb.Client, versionTablename string, version string
|
|||
return err
|
||||
}
|
||||
|
||||
func setRepoMeta(client *dynamodb.Client, repoMetadataTableName string, repoMeta repodb.RepoMetadata) error {
|
||||
func setRepoMeta(client *dynamodb.Client, repoMetadataTableName string, repoMeta mTypes.RepoMetadata) error {
|
||||
repoAttributeValue, err := attributevalue.Marshal(repoMeta)
|
||||
if err != nil {
|
||||
return err
|
|
@ -1,4 +1,4 @@
|
|||
package dynamo
|
||||
package dynamodb
|
||||
|
||||
import (
|
||||
"context"
|
|
@ -1,4 +1,4 @@
|
|||
package dynamo
|
||||
package dynamodb
|
||||
|
||||
import (
|
||||
"context"
|
|
@ -1,4 +1,4 @@
|
|||
package repodbfactory
|
||||
package meta
|
||||
|
||||
import (
|
||||
"github.com/aws/aws-sdk-go-v2/service/dynamodb"
|
||||
|
@ -7,19 +7,17 @@ import (
|
|||
"zotregistry.io/zot/errors"
|
||||
"zotregistry.io/zot/pkg/api/config"
|
||||
"zotregistry.io/zot/pkg/log"
|
||||
"zotregistry.io/zot/pkg/meta/bolt"
|
||||
"zotregistry.io/zot/pkg/meta/dynamo"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
boltdb_wrapper "zotregistry.io/zot/pkg/meta/repodb/boltdb-wrapper"
|
||||
dynamodb_wrapper "zotregistry.io/zot/pkg/meta/repodb/dynamodb-wrapper"
|
||||
"zotregistry.io/zot/pkg/meta/boltdb"
|
||||
mdynamodb "zotregistry.io/zot/pkg/meta/dynamodb"
|
||||
"zotregistry.io/zot/pkg/meta/signatures"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
)
|
||||
|
||||
func New(storageConfig config.StorageConfig, log log.Logger) (repodb.RepoDB, error) {
|
||||
func New(storageConfig config.StorageConfig, log log.Logger) (mTypes.MetaDB, error) {
|
||||
if storageConfig.RemoteCache {
|
||||
dynamoParams := getDynamoParams(storageConfig.CacheDriver, log)
|
||||
|
||||
client, err := dynamo.GetDynamoClient(dynamoParams)
|
||||
client, err := mdynamodb.GetDynamoClient(dynamoParams)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -27,10 +25,10 @@ func New(storageConfig config.StorageConfig, log log.Logger) (repodb.RepoDB, err
|
|||
return Create("dynamodb", client, dynamoParams, log) //nolint:contextcheck
|
||||
}
|
||||
|
||||
params := bolt.DBParameters{}
|
||||
params := boltdb.DBParameters{}
|
||||
params.RootDir = storageConfig.RootDirectory
|
||||
|
||||
driver, err := bolt.GetBoltDriver(params)
|
||||
driver, err := boltdb.GetBoltDriver(params)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -44,7 +42,7 @@ func New(storageConfig config.StorageConfig, log log.Logger) (repodb.RepoDB, err
|
|||
}
|
||||
|
||||
func Create(dbtype string, dbDriver, parameters interface{}, log log.Logger, //nolint:contextcheck
|
||||
) (repodb.RepoDB, error,
|
||||
) (mTypes.MetaDB, error,
|
||||
) {
|
||||
switch dbtype {
|
||||
case "boltdb":
|
||||
|
@ -54,7 +52,7 @@ func Create(dbtype string, dbDriver, parameters interface{}, log log.Logger, //n
|
|||
panic("failed type assertion")
|
||||
}
|
||||
|
||||
return boltdb_wrapper.NewBoltDBWrapper(properDriver, log)
|
||||
return boltdb.New(properDriver, log)
|
||||
}
|
||||
case "dynamodb":
|
||||
{
|
||||
|
@ -63,12 +61,12 @@ func Create(dbtype string, dbDriver, parameters interface{}, log log.Logger, //n
|
|||
panic("failed type assertion")
|
||||
}
|
||||
|
||||
properParameters, ok := parameters.(dynamo.DBDriverParameters)
|
||||
properParameters, ok := parameters.(mdynamodb.DBDriverParameters)
|
||||
if !ok {
|
||||
panic("failed type assertion")
|
||||
}
|
||||
|
||||
return dynamodb_wrapper.NewDynamoDBWrapper(properDriver, properParameters, log)
|
||||
return mdynamodb.New(properDriver, properParameters, log)
|
||||
}
|
||||
default:
|
||||
{
|
||||
|
@ -77,7 +75,7 @@ func Create(dbtype string, dbDriver, parameters interface{}, log log.Logger, //n
|
|||
}
|
||||
}
|
||||
|
||||
func getDynamoParams(cacheDriverConfig map[string]interface{}, log log.Logger) dynamo.DBDriverParameters {
|
||||
func getDynamoParams(cacheDriverConfig map[string]interface{}, log log.Logger) mdynamodb.DBDriverParameters {
|
||||
allParametersOk := true
|
||||
|
||||
endpoint, ok := toStringIfOk(cacheDriverConfig, "endpoint", log)
|
||||
|
@ -108,7 +106,7 @@ func getDynamoParams(cacheDriverConfig map[string]interface{}, log log.Logger) d
|
|||
panic("dynamo parameters are not specified correctly, can't proceede")
|
||||
}
|
||||
|
||||
return dynamo.DBDriverParameters{
|
||||
return mdynamodb.DBDriverParameters{
|
||||
Endpoint: endpoint,
|
||||
Region: region,
|
||||
RepoMetaTablename: repoMetaTablename,
|
File diff suppressed because it is too large
Load diff
|
@ -1,4 +1,4 @@
|
|||
package repodb
|
||||
package pagination
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
@ -6,13 +6,14 @@ import (
|
|||
|
||||
zerr "zotregistry.io/zot/errors"
|
||||
"zotregistry.io/zot/pkg/common"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
)
|
||||
|
||||
// PageFinder permits keeping a pool of objects using Add
|
||||
// and returning a specific page.
|
||||
type PageFinder interface {
|
||||
Add(detailedRepoMeta DetailedRepoMeta)
|
||||
Page() ([]RepoMetadata, common.PageInfo)
|
||||
Add(detailedRepoMeta mTypes.DetailedRepoMeta)
|
||||
Page() ([]mTypes.RepoMetadata, common.PageInfo)
|
||||
Reset()
|
||||
}
|
||||
|
||||
|
@ -21,13 +22,13 @@ type PageFinder interface {
|
|||
type RepoPageFinder struct {
|
||||
limit int
|
||||
offset int
|
||||
sortBy SortCriteria
|
||||
pageBuffer []DetailedRepoMeta
|
||||
sortBy mTypes.SortCriteria
|
||||
pageBuffer []mTypes.DetailedRepoMeta
|
||||
}
|
||||
|
||||
func NewBaseRepoPageFinder(limit, offset int, sortBy SortCriteria) (*RepoPageFinder, error) {
|
||||
func NewBaseRepoPageFinder(limit, offset int, sortBy mTypes.SortCriteria) (*RepoPageFinder, error) {
|
||||
if sortBy == "" {
|
||||
sortBy = AlphabeticAsc
|
||||
sortBy = mTypes.AlphabeticAsc
|
||||
}
|
||||
|
||||
if limit < 0 {
|
||||
|
@ -38,7 +39,7 @@ func NewBaseRepoPageFinder(limit, offset int, sortBy SortCriteria) (*RepoPageFin
|
|||
return nil, zerr.ErrOffsetIsNegative
|
||||
}
|
||||
|
||||
if _, found := SortFunctions()[sortBy]; !found {
|
||||
if _, found := mTypes.SortFunctions()[sortBy]; !found {
|
||||
return nil, fmt.Errorf("sorting repos by '%s' is not supported %w",
|
||||
sortBy, zerr.ErrSortCriteriaNotSupported)
|
||||
}
|
||||
|
@ -47,26 +48,26 @@ func NewBaseRepoPageFinder(limit, offset int, sortBy SortCriteria) (*RepoPageFin
|
|||
limit: limit,
|
||||
offset: offset,
|
||||
sortBy: sortBy,
|
||||
pageBuffer: make([]DetailedRepoMeta, 0, limit),
|
||||
pageBuffer: make([]mTypes.DetailedRepoMeta, 0, limit),
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (bpt *RepoPageFinder) Reset() {
|
||||
bpt.pageBuffer = []DetailedRepoMeta{}
|
||||
bpt.pageBuffer = []mTypes.DetailedRepoMeta{}
|
||||
}
|
||||
|
||||
func (bpt *RepoPageFinder) Add(namedRepoMeta DetailedRepoMeta) {
|
||||
func (bpt *RepoPageFinder) Add(namedRepoMeta mTypes.DetailedRepoMeta) {
|
||||
bpt.pageBuffer = append(bpt.pageBuffer, namedRepoMeta)
|
||||
}
|
||||
|
||||
func (bpt *RepoPageFinder) Page() ([]RepoMetadata, common.PageInfo) {
|
||||
func (bpt *RepoPageFinder) Page() ([]mTypes.RepoMetadata, common.PageInfo) {
|
||||
if len(bpt.pageBuffer) == 0 {
|
||||
return []RepoMetadata{}, common.PageInfo{}
|
||||
return []mTypes.RepoMetadata{}, common.PageInfo{}
|
||||
}
|
||||
|
||||
pageInfo := &common.PageInfo{}
|
||||
|
||||
sort.Slice(bpt.pageBuffer, SortFunctions()[bpt.sortBy](bpt.pageBuffer))
|
||||
sort.Slice(bpt.pageBuffer, mTypes.SortFunctions()[bpt.sortBy](bpt.pageBuffer))
|
||||
|
||||
// the offset and limit are calculatd in terms of repos counted
|
||||
start := bpt.offset
|
||||
|
@ -91,7 +92,7 @@ func (bpt *RepoPageFinder) Page() ([]RepoMetadata, common.PageInfo) {
|
|||
pageInfo.ItemCount = len(detailedReposPage)
|
||||
}
|
||||
|
||||
repos := make([]RepoMetadata, 0, len(detailedReposPage))
|
||||
repos := make([]mTypes.RepoMetadata, 0, len(detailedReposPage))
|
||||
|
||||
for _, drm := range detailedReposPage {
|
||||
repos = append(repos, drm.RepoMetadata)
|
||||
|
@ -105,13 +106,13 @@ func (bpt *RepoPageFinder) Page() ([]RepoMetadata, common.PageInfo) {
|
|||
type ImagePageFinder struct {
|
||||
limit int
|
||||
offset int
|
||||
sortBy SortCriteria
|
||||
pageBuffer []DetailedRepoMeta
|
||||
sortBy mTypes.SortCriteria
|
||||
pageBuffer []mTypes.DetailedRepoMeta
|
||||
}
|
||||
|
||||
func NewBaseImagePageFinder(limit, offset int, sortBy SortCriteria) (*ImagePageFinder, error) {
|
||||
func NewBaseImagePageFinder(limit, offset int, sortBy mTypes.SortCriteria) (*ImagePageFinder, error) {
|
||||
if sortBy == "" {
|
||||
sortBy = AlphabeticAsc
|
||||
sortBy = mTypes.AlphabeticAsc
|
||||
}
|
||||
|
||||
if limit < 0 {
|
||||
|
@ -122,7 +123,7 @@ func NewBaseImagePageFinder(limit, offset int, sortBy SortCriteria) (*ImagePageF
|
|||
return nil, zerr.ErrOffsetIsNegative
|
||||
}
|
||||
|
||||
if _, found := SortFunctions()[sortBy]; !found {
|
||||
if _, found := mTypes.SortFunctions()[sortBy]; !found {
|
||||
return nil, fmt.Errorf("sorting repos by '%s' is not supported %w",
|
||||
sortBy, zerr.ErrSortCriteriaNotSupported)
|
||||
}
|
||||
|
@ -131,21 +132,21 @@ func NewBaseImagePageFinder(limit, offset int, sortBy SortCriteria) (*ImagePageF
|
|||
limit: limit,
|
||||
offset: offset,
|
||||
sortBy: sortBy,
|
||||
pageBuffer: make([]DetailedRepoMeta, 0, limit),
|
||||
pageBuffer: make([]mTypes.DetailedRepoMeta, 0, limit),
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (bpt *ImagePageFinder) Reset() {
|
||||
bpt.pageBuffer = []DetailedRepoMeta{}
|
||||
bpt.pageBuffer = []mTypes.DetailedRepoMeta{}
|
||||
}
|
||||
|
||||
func (bpt *ImagePageFinder) Add(namedRepoMeta DetailedRepoMeta) {
|
||||
func (bpt *ImagePageFinder) Add(namedRepoMeta mTypes.DetailedRepoMeta) {
|
||||
bpt.pageBuffer = append(bpt.pageBuffer, namedRepoMeta)
|
||||
}
|
||||
|
||||
func (bpt *ImagePageFinder) Page() ([]RepoMetadata, common.PageInfo) {
|
||||
func (bpt *ImagePageFinder) Page() ([]mTypes.RepoMetadata, common.PageInfo) {
|
||||
if len(bpt.pageBuffer) == 0 {
|
||||
return []RepoMetadata{}, common.PageInfo{}
|
||||
return []mTypes.RepoMetadata{}, common.PageInfo{}
|
||||
}
|
||||
|
||||
pageInfo := common.PageInfo{}
|
||||
|
@ -155,7 +156,7 @@ func (bpt *ImagePageFinder) Page() ([]RepoMetadata, common.PageInfo) {
|
|||
pageInfo.TotalCount += len(repo.Tags)
|
||||
}
|
||||
|
||||
sort.Slice(bpt.pageBuffer, SortFunctions()[bpt.sortBy](bpt.pageBuffer))
|
||||
sort.Slice(bpt.pageBuffer, mTypes.SortFunctions()[bpt.sortBy](bpt.pageBuffer))
|
||||
|
||||
repoStartIndex := 0
|
||||
tagStartIndex := 0
|
||||
|
@ -164,7 +165,7 @@ func (bpt *ImagePageFinder) Page() ([]RepoMetadata, common.PageInfo) {
|
|||
remainingOffset := bpt.offset
|
||||
remainingLimit := bpt.limit
|
||||
|
||||
repos := make([]RepoMetadata, 0)
|
||||
repos := make([]mTypes.RepoMetadata, 0)
|
||||
|
||||
if remainingOffset == 0 && remainingLimit == 0 {
|
||||
for _, drm := range bpt.pageBuffer {
|
||||
|
@ -191,11 +192,11 @@ func (bpt *ImagePageFinder) Page() ([]RepoMetadata, common.PageInfo) {
|
|||
|
||||
// offset is larger than the number of tags
|
||||
if repoStartIndex >= len(bpt.pageBuffer) {
|
||||
return []RepoMetadata{}, common.PageInfo{}
|
||||
return []mTypes.RepoMetadata{}, common.PageInfo{}
|
||||
}
|
||||
|
||||
// finish counting remaining tags inside the first repo meta
|
||||
partialTags := map[string]Descriptor{}
|
||||
partialTags := map[string]mTypes.Descriptor{}
|
||||
firstRepoMeta := bpt.pageBuffer[repoStartIndex].RepoMetadata
|
||||
|
||||
tags := make([]string, 0, len(firstRepoMeta.Tags))
|
||||
|
@ -230,7 +231,7 @@ func (bpt *ImagePageFinder) Page() ([]RepoMetadata, common.PageInfo) {
|
|||
repoMeta := bpt.pageBuffer[i].RepoMetadata
|
||||
|
||||
if len(repoMeta.Tags) > remainingLimit {
|
||||
partialTags := map[string]Descriptor{}
|
||||
partialTags := map[string]mTypes.Descriptor{}
|
||||
|
||||
tags := make([]string, 0, len(repoMeta.Tags))
|
||||
for k := range repoMeta.Tags {
|
|
@ -1,4 +1,4 @@
|
|||
package repodb_test
|
||||
package pagination_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
@ -6,19 +6,20 @@ import (
|
|||
ispec "github.com/opencontainers/image-spec/specs-go/v1"
|
||||
. "github.com/smartystreets/goconvey/convey"
|
||||
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
"zotregistry.io/zot/pkg/meta/pagination"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
)
|
||||
|
||||
func TestPagination(t *testing.T) {
|
||||
Convey("Repo Pagination", t, func() {
|
||||
Convey("reset", func() {
|
||||
pageFinder, err := repodb.NewBaseRepoPageFinder(1, 0, repodb.AlphabeticAsc)
|
||||
pageFinder, err := pagination.NewBaseRepoPageFinder(1, 0, mTypes.AlphabeticAsc)
|
||||
So(err, ShouldBeNil)
|
||||
So(pageFinder, ShouldNotBeNil)
|
||||
|
||||
pageFinder.Add(repodb.DetailedRepoMeta{})
|
||||
pageFinder.Add(repodb.DetailedRepoMeta{})
|
||||
pageFinder.Add(repodb.DetailedRepoMeta{})
|
||||
pageFinder.Add(mTypes.DetailedRepoMeta{})
|
||||
pageFinder.Add(mTypes.DetailedRepoMeta{})
|
||||
pageFinder.Add(mTypes.DetailedRepoMeta{})
|
||||
|
||||
pageFinder.Reset()
|
||||
|
||||
|
@ -29,27 +30,27 @@ func TestPagination(t *testing.T) {
|
|||
|
||||
Convey("Image Pagination", t, func() {
|
||||
Convey("create new pageFinder errors", func() {
|
||||
pageFinder, err := repodb.NewBaseImagePageFinder(-1, 10, repodb.AlphabeticAsc)
|
||||
pageFinder, err := pagination.NewBaseImagePageFinder(-1, 10, mTypes.AlphabeticAsc)
|
||||
So(pageFinder, ShouldBeNil)
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
pageFinder, err = repodb.NewBaseImagePageFinder(2, -1, repodb.AlphabeticAsc)
|
||||
pageFinder, err = pagination.NewBaseImagePageFinder(2, -1, mTypes.AlphabeticAsc)
|
||||
So(pageFinder, ShouldBeNil)
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
pageFinder, err = repodb.NewBaseImagePageFinder(2, 1, "wrong sorting criteria")
|
||||
pageFinder, err = pagination.NewBaseImagePageFinder(2, 1, "wrong sorting criteria")
|
||||
So(pageFinder, ShouldBeNil)
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
Convey("Reset", func() {
|
||||
pageFinder, err := repodb.NewBaseImagePageFinder(1, 0, repodb.AlphabeticAsc)
|
||||
pageFinder, err := pagination.NewBaseImagePageFinder(1, 0, mTypes.AlphabeticAsc)
|
||||
So(err, ShouldBeNil)
|
||||
So(pageFinder, ShouldNotBeNil)
|
||||
|
||||
pageFinder.Add(repodb.DetailedRepoMeta{})
|
||||
pageFinder.Add(repodb.DetailedRepoMeta{})
|
||||
pageFinder.Add(repodb.DetailedRepoMeta{})
|
||||
pageFinder.Add(mTypes.DetailedRepoMeta{})
|
||||
pageFinder.Add(mTypes.DetailedRepoMeta{})
|
||||
pageFinder.Add(mTypes.DetailedRepoMeta{})
|
||||
|
||||
pageFinder.Reset()
|
||||
|
||||
|
@ -59,23 +60,23 @@ func TestPagination(t *testing.T) {
|
|||
|
||||
Convey("Page", func() {
|
||||
Convey("no limit or offset", func() {
|
||||
pageFinder, err := repodb.NewBaseImagePageFinder(0, 0, repodb.AlphabeticAsc)
|
||||
pageFinder, err := pagination.NewBaseImagePageFinder(0, 0, mTypes.AlphabeticAsc)
|
||||
So(err, ShouldBeNil)
|
||||
So(pageFinder, ShouldNotBeNil)
|
||||
|
||||
pageFinder.Add(repodb.DetailedRepoMeta{
|
||||
RepoMetadata: repodb.RepoMetadata{
|
||||
pageFinder.Add(mTypes.DetailedRepoMeta{
|
||||
RepoMetadata: mTypes.RepoMetadata{
|
||||
Name: "repo1",
|
||||
Tags: map[string]repodb.Descriptor{
|
||||
Tags: map[string]mTypes.Descriptor{
|
||||
"tag1": {Digest: "dig1", MediaType: ispec.MediaTypeImageManifest},
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
pageFinder.Add(repodb.DetailedRepoMeta{
|
||||
RepoMetadata: repodb.RepoMetadata{
|
||||
pageFinder.Add(mTypes.DetailedRepoMeta{
|
||||
RepoMetadata: mTypes.RepoMetadata{
|
||||
Name: "repo2",
|
||||
Tags: map[string]repodb.Descriptor{
|
||||
Tags: map[string]mTypes.Descriptor{
|
||||
"Tag1": {Digest: "dig1", MediaType: ispec.MediaTypeImageManifest},
|
||||
"Tag2": {Digest: "dig2", MediaType: ispec.MediaTypeImageManifest},
|
||||
"Tag3": {Digest: "dig3", MediaType: ispec.MediaTypeImageManifest},
|
||||
|
@ -88,23 +89,23 @@ func TestPagination(t *testing.T) {
|
|||
So(pageInfo.TotalCount, ShouldEqual, 5)
|
||||
})
|
||||
Convey("Test 1 limit < len(tags)", func() {
|
||||
pageFinder, err := repodb.NewBaseImagePageFinder(5, 2, repodb.AlphabeticAsc)
|
||||
pageFinder, err := pagination.NewBaseImagePageFinder(5, 2, mTypes.AlphabeticAsc)
|
||||
So(err, ShouldBeNil)
|
||||
So(pageFinder, ShouldNotBeNil)
|
||||
|
||||
pageFinder.Add(repodb.DetailedRepoMeta{
|
||||
RepoMetadata: repodb.RepoMetadata{
|
||||
pageFinder.Add(mTypes.DetailedRepoMeta{
|
||||
RepoMetadata: mTypes.RepoMetadata{
|
||||
Name: "repo1",
|
||||
Tags: map[string]repodb.Descriptor{
|
||||
Tags: map[string]mTypes.Descriptor{
|
||||
"tag1": {Digest: "dig1", MediaType: ispec.MediaTypeImageManifest},
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
pageFinder.Add(repodb.DetailedRepoMeta{
|
||||
RepoMetadata: repodb.RepoMetadata{
|
||||
pageFinder.Add(mTypes.DetailedRepoMeta{
|
||||
RepoMetadata: mTypes.RepoMetadata{
|
||||
Name: "repo2",
|
||||
Tags: map[string]repodb.Descriptor{
|
||||
Tags: map[string]mTypes.Descriptor{
|
||||
"Tag1": {Digest: "dig1", MediaType: ispec.MediaTypeImageManifest},
|
||||
"Tag2": {Digest: "dig2", MediaType: ispec.MediaTypeImageManifest},
|
||||
"Tag3": {Digest: "dig3", MediaType: ispec.MediaTypeImageManifest},
|
||||
|
@ -117,14 +118,14 @@ func TestPagination(t *testing.T) {
|
|||
So(pageInfo.TotalCount, ShouldEqual, 5)
|
||||
})
|
||||
Convey("Test 2 limit < len(tags)", func() {
|
||||
pageFinder, err := repodb.NewBaseImagePageFinder(5, 2, repodb.AlphabeticAsc)
|
||||
pageFinder, err := pagination.NewBaseImagePageFinder(5, 2, mTypes.AlphabeticAsc)
|
||||
So(err, ShouldBeNil)
|
||||
So(pageFinder, ShouldNotBeNil)
|
||||
|
||||
pageFinder.Add(repodb.DetailedRepoMeta{
|
||||
RepoMetadata: repodb.RepoMetadata{
|
||||
pageFinder.Add(mTypes.DetailedRepoMeta{
|
||||
RepoMetadata: mTypes.RepoMetadata{
|
||||
Name: "repo1",
|
||||
Tags: map[string]repodb.Descriptor{
|
||||
Tags: map[string]mTypes.Descriptor{
|
||||
"tag1": {
|
||||
Digest: "dig1",
|
||||
MediaType: ispec.MediaTypeImageManifest,
|
||||
|
@ -133,10 +134,10 @@ func TestPagination(t *testing.T) {
|
|||
},
|
||||
})
|
||||
|
||||
pageFinder.Add(repodb.DetailedRepoMeta{
|
||||
RepoMetadata: repodb.RepoMetadata{
|
||||
pageFinder.Add(mTypes.DetailedRepoMeta{
|
||||
RepoMetadata: mTypes.RepoMetadata{
|
||||
Name: "repo2",
|
||||
Tags: map[string]repodb.Descriptor{
|
||||
Tags: map[string]mTypes.Descriptor{
|
||||
"Tag1": {
|
||||
Digest: "dig1",
|
||||
MediaType: ispec.MediaTypeImageManifest,
|
||||
|
@ -156,10 +157,10 @@ func TestPagination(t *testing.T) {
|
|||
},
|
||||
},
|
||||
})
|
||||
pageFinder.Add(repodb.DetailedRepoMeta{
|
||||
RepoMetadata: repodb.RepoMetadata{
|
||||
pageFinder.Add(mTypes.DetailedRepoMeta{
|
||||
RepoMetadata: mTypes.RepoMetadata{
|
||||
Name: "repo3",
|
||||
Tags: map[string]repodb.Descriptor{
|
||||
Tags: map[string]mTypes.Descriptor{
|
||||
"Tag11": {
|
||||
Digest: "dig11",
|
||||
MediaType: ispec.MediaTypeImageManifest,
|
||||
|
@ -191,14 +192,14 @@ func TestPagination(t *testing.T) {
|
|||
})
|
||||
|
||||
Convey("Test 2 limit > len(tags)", func() {
|
||||
pageFinder, err := repodb.NewBaseImagePageFinder(3, 0, repodb.AlphabeticAsc)
|
||||
pageFinder, err := pagination.NewBaseImagePageFinder(3, 0, mTypes.AlphabeticAsc)
|
||||
So(err, ShouldBeNil)
|
||||
So(pageFinder, ShouldNotBeNil)
|
||||
|
||||
pageFinder.Add(repodb.DetailedRepoMeta{
|
||||
RepoMetadata: repodb.RepoMetadata{
|
||||
pageFinder.Add(mTypes.DetailedRepoMeta{
|
||||
RepoMetadata: mTypes.RepoMetadata{
|
||||
Name: "repo1",
|
||||
Tags: map[string]repodb.Descriptor{
|
||||
Tags: map[string]mTypes.Descriptor{
|
||||
"tag1": {
|
||||
Digest: "dig1",
|
||||
MediaType: ispec.MediaTypeImageManifest,
|
||||
|
@ -207,10 +208,10 @@ func TestPagination(t *testing.T) {
|
|||
},
|
||||
})
|
||||
|
||||
pageFinder.Add(repodb.DetailedRepoMeta{
|
||||
RepoMetadata: repodb.RepoMetadata{
|
||||
pageFinder.Add(mTypes.DetailedRepoMeta{
|
||||
RepoMetadata: mTypes.RepoMetadata{
|
||||
Name: "repo2",
|
||||
Tags: map[string]repodb.Descriptor{
|
||||
Tags: map[string]mTypes.Descriptor{
|
||||
"Tag1": {
|
||||
Digest: "dig1",
|
||||
MediaType: ispec.MediaTypeImageManifest,
|
||||
|
@ -218,10 +219,10 @@ func TestPagination(t *testing.T) {
|
|||
},
|
||||
},
|
||||
})
|
||||
pageFinder.Add(repodb.DetailedRepoMeta{
|
||||
RepoMetadata: repodb.RepoMetadata{
|
||||
pageFinder.Add(mTypes.DetailedRepoMeta{
|
||||
RepoMetadata: mTypes.RepoMetadata{
|
||||
Name: "repo3",
|
||||
Tags: map[string]repodb.Descriptor{
|
||||
Tags: map[string]mTypes.Descriptor{
|
||||
"Tag11": {
|
||||
Digest: "dig11",
|
||||
MediaType: ispec.MediaTypeImageManifest,
|
|
@ -1,110 +0,0 @@
|
|||
package repodbfactory_test
|
||||
|
||||
import (
|
||||
"os"
|
||||
"path"
|
||||
"testing"
|
||||
|
||||
"github.com/aws/aws-sdk-go-v2/service/dynamodb"
|
||||
. "github.com/smartystreets/goconvey/convey"
|
||||
|
||||
"zotregistry.io/zot/pkg/api/config"
|
||||
"zotregistry.io/zot/pkg/log"
|
||||
"zotregistry.io/zot/pkg/meta/bolt"
|
||||
"zotregistry.io/zot/pkg/meta/dynamo"
|
||||
"zotregistry.io/zot/pkg/meta/repodb/repodbfactory"
|
||||
)
|
||||
|
||||
func TestCreateDynamo(t *testing.T) {
|
||||
skipDynamo(t)
|
||||
|
||||
Convey("Create", t, func() {
|
||||
dynamoDBDriverParams := dynamo.DBDriverParameters{
|
||||
Endpoint: os.Getenv("DYNAMODBMOCK_ENDPOINT"),
|
||||
RepoMetaTablename: "RepoMetadataTable",
|
||||
ManifestDataTablename: "ManifestDataTable",
|
||||
IndexDataTablename: "IndexDataTable",
|
||||
UserDataTablename: "UserDataTable",
|
||||
APIKeyTablename: "ApiKeyTable",
|
||||
VersionTablename: "Version",
|
||||
Region: "us-east-2",
|
||||
}
|
||||
|
||||
client, err := dynamo.GetDynamoClient(dynamoDBDriverParams)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
log := log.NewLogger("debug", "")
|
||||
|
||||
repoDB, err := repodbfactory.Create("dynamodb", client, dynamoDBDriverParams, log)
|
||||
So(repoDB, ShouldNotBeNil)
|
||||
So(err, ShouldBeNil)
|
||||
})
|
||||
|
||||
Convey("Fails", t, func() {
|
||||
log := log.NewLogger("debug", "")
|
||||
|
||||
So(func() { _, _ = repodbfactory.Create("dynamodb", nil, bolt.DBParameters{RootDir: "root"}, log) }, ShouldPanic)
|
||||
|
||||
So(func() { _, _ = repodbfactory.Create("dynamodb", &dynamodb.Client{}, "bad", log) }, ShouldPanic)
|
||||
|
||||
repoDB, err := repodbfactory.Create("random", nil, bolt.DBParameters{RootDir: "root"}, log)
|
||||
So(repoDB, ShouldBeNil)
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
}
|
||||
|
||||
func TestCreateBoltDB(t *testing.T) {
|
||||
Convey("Create", t, func() {
|
||||
rootDir := t.TempDir()
|
||||
params := bolt.DBParameters{
|
||||
RootDir: rootDir,
|
||||
}
|
||||
boltDriver, err := bolt.GetBoltDriver(params)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
log := log.NewLogger("debug", "")
|
||||
|
||||
repoDB, err := repodbfactory.Create("boltdb", boltDriver, params, log)
|
||||
So(repoDB, ShouldNotBeNil)
|
||||
So(err, ShouldBeNil)
|
||||
})
|
||||
|
||||
Convey("fails", t, func() {
|
||||
log := log.NewLogger("debug", "")
|
||||
|
||||
So(func() { _, _ = repodbfactory.Create("boltdb", nil, dynamo.DBDriverParameters{}, log) }, ShouldPanic)
|
||||
})
|
||||
}
|
||||
|
||||
func TestNew(t *testing.T) {
|
||||
Convey("InitCosignAndNotationDirs fails", t, func() {
|
||||
rootDir := t.TempDir()
|
||||
|
||||
var storageConfig config.StorageConfig
|
||||
|
||||
storageConfig.RootDirectory = rootDir
|
||||
storageConfig.RemoteCache = false
|
||||
log := log.NewLogger("debug", "")
|
||||
|
||||
_, err := os.Create(path.Join(rootDir, "repo.db"))
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = os.Chmod(rootDir, 0o555)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
newRepodb, err := repodbfactory.New(storageConfig, log)
|
||||
So(newRepodb, ShouldBeNil)
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
err = os.Chmod(rootDir, 0o777)
|
||||
So(err, ShouldBeNil)
|
||||
})
|
||||
}
|
||||
|
||||
func skipDynamo(t *testing.T) {
|
||||
t.Helper()
|
||||
|
||||
if os.Getenv("DYNAMODBMOCK_ENDPOINT") == "" {
|
||||
t.Skip("Skipping testing without AWS DynamoDB mock server")
|
||||
}
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
package repodb
|
||||
package meta
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
|
@ -12,13 +12,14 @@ import (
|
|||
zcommon "zotregistry.io/zot/pkg/common"
|
||||
"zotregistry.io/zot/pkg/log"
|
||||
"zotregistry.io/zot/pkg/meta/signatures"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
"zotregistry.io/zot/pkg/storage"
|
||||
storageTypes "zotregistry.io/zot/pkg/storage/types"
|
||||
)
|
||||
|
||||
// ParseStorage will sync all repos found in the rootdirectory of the oci layout that zot was deployed on with the
|
||||
// ParseStorage database.
|
||||
func ParseStorage(repoDB RepoDB, storeController storage.StoreController, log log.Logger) error {
|
||||
func ParseStorage(metaDB mTypes.MetaDB, storeController storage.StoreController, log log.Logger) error {
|
||||
allRepos, err := getAllRepos(storeController)
|
||||
if err != nil {
|
||||
rootDir := storeController.DefaultStore.RootDir()
|
||||
|
@ -29,7 +30,7 @@ func ParseStorage(repoDB RepoDB, storeController storage.StoreController, log lo
|
|||
}
|
||||
|
||||
for _, repo := range allRepos {
|
||||
err := ParseRepo(repo, repoDB, storeController, log)
|
||||
err := ParseRepo(repo, metaDB, storeController, log)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Str("repository", repo).Msg("load-local-layout: failed to sync repo")
|
||||
|
||||
|
@ -41,7 +42,7 @@ func ParseStorage(repoDB RepoDB, storeController storage.StoreController, log lo
|
|||
}
|
||||
|
||||
// ParseRepo reads the contents of a repo and syncs all images and signatures found.
|
||||
func ParseRepo(repo string, repoDB RepoDB, storeController storage.StoreController, log log.Logger) error {
|
||||
func ParseRepo(repo string, metaDB mTypes.MetaDB, storeController storage.StoreController, log log.Logger) error {
|
||||
imageStore := storeController.GetImageStore(repo)
|
||||
|
||||
indexBlob, err := imageStore.GetIndexContent(repo)
|
||||
|
@ -60,7 +61,7 @@ func ParseRepo(repo string, repoDB RepoDB, storeController storage.StoreControll
|
|||
return err
|
||||
}
|
||||
|
||||
err = resetRepoMeta(repo, repoDB, log)
|
||||
err = resetRepoMeta(repo, metaDB, log)
|
||||
if err != nil && !errors.Is(err, zerr.ErrRepoMetaNotFound) {
|
||||
log.Error().Err(err).Str("repository", repo).Msg("load-repo: failed to reset tag field in RepoMetadata for repo")
|
||||
|
||||
|
@ -70,9 +71,9 @@ func ParseRepo(repo string, repoDB RepoDB, storeController storage.StoreControll
|
|||
for _, descriptor := range indexContent.Manifests {
|
||||
tag := descriptor.Annotations[ispec.AnnotationRefName]
|
||||
|
||||
descriptorBlob, err := getCachedBlob(repo, descriptor, repoDB, imageStore, log)
|
||||
descriptorBlob, err := getCachedBlob(repo, descriptor, metaDB, imageStore, log)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("load-repo: error checking manifestMeta in RepoDB")
|
||||
log.Error().Err(err).Msg("load-repo: error checking manifestMeta in MetaDB")
|
||||
|
||||
return err
|
||||
}
|
||||
|
@ -93,8 +94,8 @@ func ParseRepo(repo string, repoDB RepoDB, storeController storage.StoreControll
|
|||
return err
|
||||
}
|
||||
|
||||
err = repoDB.AddManifestSignature(repo, signedManifestDigest,
|
||||
SignatureMetadata{
|
||||
err = metaDB.AddManifestSignature(repo, signedManifestDigest,
|
||||
mTypes.SignatureMetadata{
|
||||
SignatureType: signatureType,
|
||||
SignatureDigest: descriptor.Digest.String(),
|
||||
LayersInfo: layers,
|
||||
|
@ -107,7 +108,7 @@ func ParseRepo(repo string, repoDB RepoDB, storeController storage.StoreControll
|
|||
return err
|
||||
}
|
||||
|
||||
err = repoDB.UpdateSignaturesValidity(repo, signedManifestDigest)
|
||||
err = metaDB.UpdateSignaturesValidity(repo, signedManifestDigest)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Str("repository", repo).Str("reference", tag).Str("digest", signedManifestDigest.String()).Msg(
|
||||
"load-repo: failed verify signatures validity for signed image")
|
||||
|
@ -125,7 +126,7 @@ func ParseRepo(repo string, repoDB RepoDB, storeController storage.StoreControll
|
|||
}
|
||||
|
||||
err = SetImageMetaFromInput(repo, reference, descriptor.MediaType, descriptor.Digest, descriptorBlob,
|
||||
imageStore, repoDB, log)
|
||||
imageStore, metaDB, log)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Str("repository", repo).Str("tag", tag).
|
||||
Msg("load-repo: failed to set metadata for image")
|
||||
|
@ -138,9 +139,9 @@ func ParseRepo(repo string, repoDB RepoDB, storeController storage.StoreControll
|
|||
}
|
||||
|
||||
// resetRepoMeta will delete all tags and non-user related information from a RepoMetadata.
|
||||
// It is used to recalculate and keep RepoDB consistent with the layout in case of unexpected changes.
|
||||
func resetRepoMeta(repo string, repoDB RepoDB, log log.Logger) error {
|
||||
repoMeta, err := repoDB.GetRepoMeta(repo)
|
||||
// It is used to recalculate and keep MetaDB consistent with the layout in case of unexpected changes.
|
||||
func resetRepoMeta(repo string, metaDB mTypes.MetaDB, log log.Logger) error {
|
||||
repoMeta, err := metaDB.GetRepoMeta(repo)
|
||||
if err != nil && !errors.Is(err, zerr.ErrRepoMetaNotFound) {
|
||||
log.Error().Err(err).Str("repository", repo).Msg("load-repo: failed to get RepoMeta for repo")
|
||||
|
||||
|
@ -153,12 +154,12 @@ func resetRepoMeta(repo string, repoDB RepoDB, log log.Logger) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
return repoDB.SetRepoMeta(repo, RepoMetadata{
|
||||
return metaDB.SetRepoMeta(repo, mTypes.RepoMetadata{
|
||||
Name: repoMeta.Name,
|
||||
Tags: map[string]Descriptor{},
|
||||
Tags: map[string]mTypes.Descriptor{},
|
||||
Statistics: repoMeta.Statistics,
|
||||
Signatures: map[string]ManifestSignatures{},
|
||||
Referrers: map[string][]ReferrerInfo{},
|
||||
Signatures: map[string]mTypes.ManifestSignatures{},
|
||||
Referrers: map[string][]mTypes.ReferrerInfo{},
|
||||
Stars: repoMeta.Stars,
|
||||
})
|
||||
}
|
||||
|
@ -183,12 +184,12 @@ func getAllRepos(storeController storage.StoreController) ([]string, error) {
|
|||
return allRepos, nil
|
||||
}
|
||||
|
||||
func getCachedBlob(repo string, descriptor ispec.Descriptor, repoDB RepoDB,
|
||||
func getCachedBlob(repo string, descriptor ispec.Descriptor, metaDB mTypes.MetaDB,
|
||||
imageStore storageTypes.ImageStore, log log.Logger,
|
||||
) ([]byte, error) {
|
||||
digest := descriptor.Digest
|
||||
|
||||
descriptorBlob, err := getCachedBlobFromRepoDB(descriptor, repoDB)
|
||||
descriptorBlob, err := getCachedBlobFromMetaDB(descriptor, metaDB)
|
||||
|
||||
if err != nil || len(descriptorBlob) == 0 {
|
||||
descriptorBlob, _, _, err = imageStore.GetImageManifest(repo, digest.String())
|
||||
|
@ -205,14 +206,14 @@ func getCachedBlob(repo string, descriptor ispec.Descriptor, repoDB RepoDB,
|
|||
return descriptorBlob, nil
|
||||
}
|
||||
|
||||
func getCachedBlobFromRepoDB(descriptor ispec.Descriptor, repoDB RepoDB) ([]byte, error) {
|
||||
func getCachedBlobFromMetaDB(descriptor ispec.Descriptor, metaDB mTypes.MetaDB) ([]byte, error) {
|
||||
switch descriptor.MediaType {
|
||||
case ispec.MediaTypeImageManifest:
|
||||
manifestData, err := repoDB.GetManifestData(descriptor.Digest)
|
||||
manifestData, err := metaDB.GetManifestData(descriptor.Digest)
|
||||
|
||||
return manifestData.ManifestBlob, err
|
||||
case ispec.MediaTypeImageIndex:
|
||||
indexData, err := repoDB.GetIndexData(descriptor.Digest)
|
||||
indexData, err := metaDB.GetIndexData(descriptor.Digest)
|
||||
|
||||
return indexData.IndexBlob, err
|
||||
}
|
||||
|
@ -222,21 +223,21 @@ func getCachedBlobFromRepoDB(descriptor ispec.Descriptor, repoDB RepoDB) ([]byte
|
|||
|
||||
func GetSignatureLayersInfo(repo, tag, manifestDigest, signatureType string, manifestBlob []byte,
|
||||
imageStore storageTypes.ImageStore, log log.Logger,
|
||||
) ([]LayerInfo, error) {
|
||||
) ([]mTypes.LayerInfo, error) {
|
||||
switch signatureType {
|
||||
case signatures.CosignSignature:
|
||||
return getCosignSignatureLayersInfo(repo, tag, manifestDigest, manifestBlob, imageStore, log)
|
||||
case signatures.NotationSignature:
|
||||
return getNotationSignatureLayersInfo(repo, manifestDigest, manifestBlob, imageStore, log)
|
||||
default:
|
||||
return []LayerInfo{}, nil
|
||||
return []mTypes.LayerInfo{}, nil
|
||||
}
|
||||
}
|
||||
|
||||
func getCosignSignatureLayersInfo(
|
||||
repo, tag, manifestDigest string, manifestBlob []byte, imageStore storageTypes.ImageStore, log log.Logger,
|
||||
) ([]LayerInfo, error) {
|
||||
layers := []LayerInfo{}
|
||||
) ([]mTypes.LayerInfo, error) {
|
||||
layers := []mTypes.LayerInfo{}
|
||||
|
||||
var manifestContent ispec.Manifest
|
||||
if err := json.Unmarshal(manifestBlob, &manifestContent); err != nil {
|
||||
|
@ -261,7 +262,7 @@ func getCosignSignatureLayersInfo(
|
|||
"load-repo: unable to get specific annotation of cosign signature")
|
||||
}
|
||||
|
||||
layers = append(layers, LayerInfo{
|
||||
layers = append(layers, mTypes.LayerInfo{
|
||||
LayerDigest: layer.Digest.String(),
|
||||
LayerContent: layerContent,
|
||||
SignatureKey: layerSigKey,
|
||||
|
@ -273,8 +274,8 @@ func getCosignSignatureLayersInfo(
|
|||
|
||||
func getNotationSignatureLayersInfo(
|
||||
repo, manifestDigest string, manifestBlob []byte, imageStore storageTypes.ImageStore, log log.Logger,
|
||||
) ([]LayerInfo, error) {
|
||||
layers := []LayerInfo{}
|
||||
) ([]mTypes.LayerInfo, error) {
|
||||
layers := []mTypes.LayerInfo{}
|
||||
|
||||
var manifestContent ispec.Manifest
|
||||
if err := json.Unmarshal(manifestBlob, &manifestContent); err != nil {
|
||||
|
@ -303,7 +304,7 @@ func getNotationSignatureLayersInfo(
|
|||
|
||||
layerSigKey := manifestContent.Layers[0].MediaType
|
||||
|
||||
layers = append(layers, LayerInfo{
|
||||
layers = append(layers, mTypes.LayerInfo{
|
||||
LayerDigest: layer.String(),
|
||||
LayerContent: layerContent,
|
||||
SignatureKey: layerSigKey,
|
||||
|
@ -314,26 +315,26 @@ func getNotationSignatureLayersInfo(
|
|||
|
||||
// NewManifestMeta takes raw data about an image and createa a new ManifestMetadate object.
|
||||
func NewManifestData(repoName string, manifestBlob []byte, imageStore storageTypes.ImageStore,
|
||||
) (ManifestData, error) {
|
||||
) (mTypes.ManifestData, error) {
|
||||
var (
|
||||
manifestContent ispec.Manifest
|
||||
configContent ispec.Image
|
||||
manifestData ManifestData
|
||||
manifestData mTypes.ManifestData
|
||||
)
|
||||
|
||||
err := json.Unmarshal(manifestBlob, &manifestContent)
|
||||
if err != nil {
|
||||
return ManifestData{}, err
|
||||
return mTypes.ManifestData{}, err
|
||||
}
|
||||
|
||||
configBlob, err := imageStore.GetBlobContent(repoName, manifestContent.Config.Digest)
|
||||
if err != nil {
|
||||
return ManifestData{}, err
|
||||
return mTypes.ManifestData{}, err
|
||||
}
|
||||
|
||||
err = json.Unmarshal(configBlob, &configContent)
|
||||
if err != nil {
|
||||
return ManifestData{}, err
|
||||
return mTypes.ManifestData{}, err
|
||||
}
|
||||
|
||||
manifestData.ManifestBlob = manifestBlob
|
||||
|
@ -343,8 +344,8 @@ func NewManifestData(repoName string, manifestBlob []byte, imageStore storageTyp
|
|||
}
|
||||
|
||||
func NewIndexData(repoName string, indexBlob []byte, imageStore storageTypes.ImageStore,
|
||||
) IndexData {
|
||||
indexData := IndexData{}
|
||||
) mTypes.IndexData {
|
||||
indexData := mTypes.IndexData{}
|
||||
|
||||
indexData.IndexBlob = indexBlob
|
||||
|
||||
|
@ -354,7 +355,7 @@ func NewIndexData(repoName string, indexBlob []byte, imageStore storageTypes.Ima
|
|||
// SetMetadataFromInput tries to set manifest metadata and update repo metadata by adding the current tag
|
||||
// (in case the reference is a tag). The function expects image manifests and indexes (multi arch images).
|
||||
func SetImageMetaFromInput(repo, reference, mediaType string, digest godigest.Digest, descriptorBlob []byte,
|
||||
imageStore storageTypes.ImageStore, repoDB RepoDB, log log.Logger,
|
||||
imageStore storageTypes.ImageStore, metaDB mTypes.MetaDB, log log.Logger,
|
||||
) error {
|
||||
switch mediaType {
|
||||
case ispec.MediaTypeImageManifest:
|
||||
|
@ -363,36 +364,36 @@ func SetImageMetaFromInput(repo, reference, mediaType string, digest godigest.Di
|
|||
return err
|
||||
}
|
||||
|
||||
err = repoDB.SetManifestData(digest, imageData)
|
||||
err = metaDB.SetManifestData(digest, imageData)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("repodb: error while putting manifest meta")
|
||||
log.Error().Err(err).Msg("metadb: error while putting manifest meta")
|
||||
|
||||
return err
|
||||
}
|
||||
case ispec.MediaTypeImageIndex:
|
||||
indexData := NewIndexData(repo, descriptorBlob, imageStore)
|
||||
|
||||
err := repoDB.SetIndexData(digest, indexData)
|
||||
err := metaDB.SetIndexData(digest, indexData)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("repodb: error while putting index data")
|
||||
log.Error().Err(err).Msg("metadb: error while putting index data")
|
||||
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
refferredDigest, referrerInfo, hasSubject, err := GetReferredSubject(descriptorBlob, digest.String(), mediaType)
|
||||
refferredDigest, referrerInfo, hasSubject, err := GetReferredInfo(descriptorBlob, digest.String(), mediaType)
|
||||
if hasSubject && err == nil {
|
||||
err := repoDB.SetReferrer(repo, refferredDigest, referrerInfo)
|
||||
err := metaDB.SetReferrer(repo, refferredDigest, referrerInfo)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("repodb: error while settingg referrer")
|
||||
log.Error().Err(err).Msg("metadb: error while settingg referrer")
|
||||
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
err = repoDB.SetRepoReference(repo, reference, digest, mediaType)
|
||||
err = metaDB.SetRepoReference(repo, reference, digest, mediaType)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("repodb: error while putting repo meta")
|
||||
log.Error().Err(err).Msg("metadb: error while putting repo meta")
|
||||
|
||||
return err
|
||||
}
|
||||
|
@ -400,10 +401,10 @@ func SetImageMetaFromInput(repo, reference, mediaType string, digest godigest.Di
|
|||
return nil
|
||||
}
|
||||
|
||||
func GetReferredSubject(descriptorBlob []byte, referrerDigest, mediaType string,
|
||||
) (godigest.Digest, ReferrerInfo, bool, error) {
|
||||
func GetReferredInfo(descriptorBlob []byte, referrerDigest, mediaType string,
|
||||
) (godigest.Digest, mTypes.ReferrerInfo, bool, error) {
|
||||
var (
|
||||
referrerInfo ReferrerInfo
|
||||
referrerInfo mTypes.ReferrerInfo
|
||||
referrerSubject *ispec.Descriptor
|
||||
)
|
||||
|
||||
|
@ -414,12 +415,12 @@ func GetReferredSubject(descriptorBlob []byte, referrerDigest, mediaType string,
|
|||
err := json.Unmarshal(descriptorBlob, &manifestContent)
|
||||
if err != nil {
|
||||
return "", referrerInfo, false,
|
||||
fmt.Errorf("repodb: can't unmarshal manifest for digest %s: %w", referrerDigest, err)
|
||||
fmt.Errorf("metadb: can't unmarshal manifest for digest %s: %w", referrerDigest, err)
|
||||
}
|
||||
|
||||
referrerSubject = manifestContent.Subject
|
||||
|
||||
referrerInfo = ReferrerInfo{
|
||||
referrerInfo = mTypes.ReferrerInfo{
|
||||
Digest: referrerDigest,
|
||||
MediaType: mediaType,
|
||||
ArtifactType: zcommon.GetManifestArtifactType(manifestContent),
|
||||
|
@ -432,12 +433,12 @@ func GetReferredSubject(descriptorBlob []byte, referrerDigest, mediaType string,
|
|||
err := json.Unmarshal(descriptorBlob, &indexContent)
|
||||
if err != nil {
|
||||
return "", referrerInfo, false,
|
||||
fmt.Errorf("repodb: can't unmarshal manifest for digest %s: %w", referrerDigest, err)
|
||||
fmt.Errorf("metadb: can't unmarshal manifest for digest %s: %w", referrerDigest, err)
|
||||
}
|
||||
|
||||
referrerSubject = indexContent.Subject
|
||||
|
||||
referrerInfo = ReferrerInfo{
|
||||
referrerInfo = mTypes.ReferrerInfo{
|
||||
Digest: referrerDigest,
|
||||
MediaType: mediaType,
|
||||
ArtifactType: zcommon.GetIndexArtifactType(indexContent),
|
||||
|
@ -447,7 +448,7 @@ func GetReferredSubject(descriptorBlob []byte, referrerDigest, mediaType string,
|
|||
}
|
||||
|
||||
if referrerSubject == nil || referrerSubject.Digest.String() == "" {
|
||||
return "", ReferrerInfo{}, false, nil
|
||||
return "", mTypes.ReferrerInfo{}, false, nil
|
||||
}
|
||||
|
||||
return referrerSubject.Digest, referrerInfo, true, nil
|
|
@ -1,9 +1,8 @@
|
|||
package repodb_test
|
||||
package meta_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
|
@ -17,12 +16,11 @@ import (
|
|||
zerr "zotregistry.io/zot/errors"
|
||||
"zotregistry.io/zot/pkg/extensions/monitoring"
|
||||
"zotregistry.io/zot/pkg/log"
|
||||
"zotregistry.io/zot/pkg/meta/bolt"
|
||||
"zotregistry.io/zot/pkg/meta/dynamo"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
bolt_wrapper "zotregistry.io/zot/pkg/meta/repodb/boltdb-wrapper"
|
||||
dynamo_wrapper "zotregistry.io/zot/pkg/meta/repodb/dynamodb-wrapper"
|
||||
"zotregistry.io/zot/pkg/meta"
|
||||
"zotregistry.io/zot/pkg/meta/boltdb"
|
||||
"zotregistry.io/zot/pkg/meta/dynamodb"
|
||||
"zotregistry.io/zot/pkg/meta/signatures"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
"zotregistry.io/zot/pkg/storage"
|
||||
"zotregistry.io/zot/pkg/storage/local"
|
||||
storageTypes "zotregistry.io/zot/pkg/storage/types"
|
||||
|
@ -32,8 +30,6 @@ import (
|
|||
|
||||
const repo = "repo"
|
||||
|
||||
var ErrTestError = errors.New("test error")
|
||||
|
||||
func TestParseStorageErrors(t *testing.T) {
|
||||
Convey("ParseStorage", t, func() {
|
||||
imageStore := mocks.MockedImageStore{
|
||||
|
@ -45,10 +41,10 @@ func TestParseStorageErrors(t *testing.T) {
|
|||
},
|
||||
}
|
||||
storeController := storage.StoreController{DefaultStore: imageStore}
|
||||
repoDB := mocks.RepoDBMock{}
|
||||
metaDB := mocks.MetaDBMock{}
|
||||
|
||||
// sync repo fail
|
||||
err := repodb.ParseStorage(repoDB, storeController, log.NewLogger("debug", ""))
|
||||
err := meta.ParseStorage(metaDB, storeController, log.NewLogger("debug", ""))
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
Convey("getAllRepos errors", func() {
|
||||
|
@ -69,7 +65,7 @@ func TestParseStorageErrors(t *testing.T) {
|
|||
},
|
||||
}
|
||||
|
||||
err := repodb.ParseStorage(repoDB, storeController, log.NewLogger("debug", ""))
|
||||
err := meta.ParseStorage(metaDB, storeController, log.NewLogger("debug", ""))
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
})
|
||||
|
@ -77,7 +73,7 @@ func TestParseStorageErrors(t *testing.T) {
|
|||
Convey("Parse Repo", t, func() {
|
||||
imageStore := mocks.MockedImageStore{}
|
||||
storeController := storage.StoreController{DefaultStore: &imageStore}
|
||||
repoDB := mocks.RepoDBMock{}
|
||||
metaDB := mocks.MetaDBMock{}
|
||||
log := log.NewLogger("debug", "")
|
||||
|
||||
Convey("imageStore.GetIndexContent errors", func() {
|
||||
|
@ -85,7 +81,7 @@ func TestParseStorageErrors(t *testing.T) {
|
|||
return nil, ErrTestError
|
||||
}
|
||||
|
||||
err := repodb.ParseRepo("repo", repoDB, storeController, log)
|
||||
err := meta.ParseRepo("repo", metaDB, storeController, log)
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
|
@ -94,7 +90,7 @@ func TestParseStorageErrors(t *testing.T) {
|
|||
return []byte("Invalid JSON"), nil
|
||||
}
|
||||
|
||||
err := repodb.ParseRepo("repo", repoDB, storeController, log)
|
||||
err := meta.ParseRepo("repo", metaDB, storeController, log)
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
|
@ -103,12 +99,12 @@ func TestParseStorageErrors(t *testing.T) {
|
|||
return []byte("{}"), nil
|
||||
}
|
||||
|
||||
Convey("repoDB.GetRepoMeta errors", func() {
|
||||
repoDB.GetRepoMetaFn = func(repo string) (repodb.RepoMetadata, error) {
|
||||
return repodb.RepoMetadata{}, ErrTestError
|
||||
Convey("metaDB.GetRepoMeta errors", func() {
|
||||
metaDB.GetRepoMetaFn = func(repo string) (mTypes.RepoMetadata, error) {
|
||||
return mTypes.RepoMetadata{}, ErrTestError
|
||||
}
|
||||
|
||||
err := repodb.ParseRepo("repo", repoDB, storeController, log)
|
||||
err := meta.ParseRepo("repo", metaDB, storeController, log)
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
})
|
||||
|
@ -132,12 +128,12 @@ func TestParseStorageErrors(t *testing.T) {
|
|||
return indexBlob, nil
|
||||
}
|
||||
|
||||
Convey("repoDB.GetManifestMeta errors", func() {
|
||||
repoDB.GetManifestMetaFn = func(repo string, manifestDigest godigest.Digest) (repodb.ManifestMetadata, error) {
|
||||
return repodb.ManifestMetadata{}, ErrTestError
|
||||
Convey("metaDB.GetManifestMeta errors", func() {
|
||||
metaDB.GetManifestMetaFn = func(repo string, manifestDigest godigest.Digest) (mTypes.ManifestMetadata, error) {
|
||||
return mTypes.ManifestMetadata{}, ErrTestError
|
||||
}
|
||||
|
||||
err = repodb.ParseRepo("repo", repoDB, storeController, log)
|
||||
err = meta.ParseRepo("repo", metaDB, storeController, log)
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
})
|
||||
|
@ -161,12 +157,12 @@ func TestParseStorageErrors(t *testing.T) {
|
|||
return indexBlob, nil
|
||||
}
|
||||
|
||||
Convey("repoDB.SetRepoReference", func() {
|
||||
repoDB.SetRepoReferenceFn = func(repo, tag string, manifestDigest godigest.Digest, mediaType string) error {
|
||||
Convey("metaDB.SetRepoReference", func() {
|
||||
metaDB.SetRepoReferenceFn = func(repo, tag string, manifestDigest godigest.Digest, mediaType string) error {
|
||||
return ErrTestError
|
||||
}
|
||||
|
||||
err = repodb.ParseRepo("repo", repoDB, storeController, log)
|
||||
err = meta.ParseRepo("repo", metaDB, storeController, log)
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
})
|
||||
|
@ -190,15 +186,15 @@ func TestParseStorageErrors(t *testing.T) {
|
|||
return indexBlob, nil
|
||||
}
|
||||
|
||||
repoDB.GetManifestMetaFn = func(repo string, manifestDigest godigest.Digest) (repodb.ManifestMetadata, error) {
|
||||
return repodb.ManifestMetadata{}, zerr.ErrManifestMetaNotFound
|
||||
metaDB.GetManifestMetaFn = func(repo string, manifestDigest godigest.Digest) (mTypes.ManifestMetadata, error) {
|
||||
return mTypes.ManifestMetadata{}, zerr.ErrManifestMetaNotFound
|
||||
}
|
||||
|
||||
Convey("GetImageManifest errors", func() {
|
||||
imageStore.GetImageManifestFn = func(repo, reference string) ([]byte, godigest.Digest, string, error) {
|
||||
return nil, "", "", ErrTestError
|
||||
}
|
||||
err = repodb.ParseRepo("repo", repoDB, storeController, log)
|
||||
err = meta.ParseRepo("repo", metaDB, storeController, log)
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
|
@ -207,7 +203,7 @@ func TestParseStorageErrors(t *testing.T) {
|
|||
imageStore.GetImageManifestFn = func(repo, reference string) ([]byte, godigest.Digest, string, error) {
|
||||
return []byte("Invalid JSON"), "", "", nil
|
||||
}
|
||||
err = repodb.ParseRepo("repo", repoDB, storeController, log)
|
||||
err = meta.ParseRepo("repo", metaDB, storeController, log)
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
Convey("CheckIsImageSignature -> not signature", func() {
|
||||
|
@ -224,7 +220,7 @@ func TestParseStorageErrors(t *testing.T) {
|
|||
return nil, ErrTestError
|
||||
}
|
||||
|
||||
err = repodb.ParseRepo("repo", repoDB, storeController, log)
|
||||
err = meta.ParseRepo("repo", metaDB, storeController, log)
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
|
@ -233,7 +229,7 @@ func TestParseStorageErrors(t *testing.T) {
|
|||
return []byte("invalid JSON"), nil
|
||||
}
|
||||
|
||||
err = repodb.ParseRepo("repo", repoDB, storeController, log)
|
||||
err = meta.ParseRepo("repo", metaDB, storeController, log)
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
})
|
||||
|
@ -254,27 +250,27 @@ func TestParseStorageErrors(t *testing.T) {
|
|||
return manifestBlob, "", "", nil
|
||||
}
|
||||
|
||||
repoDB.AddManifestSignatureFn = func(repo string, signedManifestDigest godigest.Digest,
|
||||
sm repodb.SignatureMetadata,
|
||||
metaDB.AddManifestSignatureFn = func(repo string, signedManifestDigest godigest.Digest,
|
||||
sm mTypes.SignatureMetadata,
|
||||
) error {
|
||||
return ErrTestError
|
||||
}
|
||||
|
||||
err = repodb.ParseRepo("repo", repoDB, storeController, log)
|
||||
err = meta.ParseRepo("repo", metaDB, storeController, log)
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
repoDB.AddManifestSignatureFn = func(repo string, signedManifestDigest godigest.Digest,
|
||||
sm repodb.SignatureMetadata,
|
||||
metaDB.AddManifestSignatureFn = func(repo string, signedManifestDigest godigest.Digest,
|
||||
sm mTypes.SignatureMetadata,
|
||||
) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
repoDB.UpdateSignaturesValidityFn = func(repo string, signedManifestDigest godigest.Digest,
|
||||
metaDB.UpdateSignaturesValidityFn = func(repo string, signedManifestDigest godigest.Digest,
|
||||
) error {
|
||||
return ErrTestError
|
||||
}
|
||||
|
||||
err = repodb.ParseRepo("repo", repoDB, storeController, log)
|
||||
err = meta.ParseRepo("repo", metaDB, storeController, log)
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
|
@ -295,7 +291,7 @@ func TestParseStorageErrors(t *testing.T) {
|
|||
}
|
||||
|
||||
// wrong number of layers of notation manifest
|
||||
err = repodb.ParseRepo("repo", repoDB, storeController, log)
|
||||
err = meta.ParseRepo("repo", metaDB, storeController, log)
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
notationManifestContent := ispec.Manifest{
|
||||
|
@ -318,7 +314,7 @@ func TestParseStorageErrors(t *testing.T) {
|
|||
}
|
||||
|
||||
// unable to get layer content
|
||||
err = repodb.ParseRepo("repo", repoDB, storeController, log)
|
||||
err = meta.ParseRepo("repo", metaDB, storeController, log)
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
_, _, cosignManifestContent, _ := test.GetRandomImageComponents(10)
|
||||
|
@ -354,7 +350,7 @@ func TestParseStorageErrors(t *testing.T) {
|
|||
}
|
||||
|
||||
// unable to get layer content
|
||||
err = repodb.ParseRepo("repo", repoDB, storeController, log)
|
||||
err = meta.ParseRepo("repo", metaDB, storeController, log)
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
})
|
||||
|
@ -365,15 +361,15 @@ func TestParseStorageWithBoltDB(t *testing.T) {
|
|||
Convey("Boltdb", t, func() {
|
||||
rootDir := t.TempDir()
|
||||
|
||||
boltDB, err := bolt.GetBoltDriver(bolt.DBParameters{
|
||||
boltDB, err := boltdb.GetBoltDriver(boltdb.DBParameters{
|
||||
RootDir: rootDir,
|
||||
})
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
repoDB, err := bolt_wrapper.NewBoltDBWrapper(boltDB, log.NewLogger("debug", ""))
|
||||
metaDB, err := boltdb.New(boltDB, log.NewLogger("debug", ""))
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
RunParseStorageTests(rootDir, repoDB)
|
||||
RunParseStorageTests(rootDir, metaDB)
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -383,7 +379,7 @@ func TestParseStorageDynamoWrapper(t *testing.T) {
|
|||
Convey("Dynamodb", t, func() {
|
||||
rootDir := t.TempDir()
|
||||
|
||||
params := dynamo.DBDriverParameters{
|
||||
params := dynamodb.DBDriverParameters{
|
||||
Endpoint: os.Getenv("DYNAMODBMOCK_ENDPOINT"),
|
||||
Region: "us-east-2",
|
||||
RepoMetaTablename: "RepoMetadataTable",
|
||||
|
@ -394,10 +390,10 @@ func TestParseStorageDynamoWrapper(t *testing.T) {
|
|||
VersionTablename: "Version",
|
||||
}
|
||||
|
||||
dynamoClient, err := dynamo.GetDynamoClient(params)
|
||||
dynamoClient, err := dynamodb.GetDynamoClient(params)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
dynamoWrapper, err := dynamo_wrapper.NewDynamoDBWrapper(dynamoClient, params, log.NewLogger("debug", ""))
|
||||
dynamoWrapper, err := dynamodb.New(dynamoClient, params, log.NewLogger("debug", ""))
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = dynamoWrapper.ResetManifestDataTable()
|
||||
|
@ -410,7 +406,7 @@ func TestParseStorageDynamoWrapper(t *testing.T) {
|
|||
})
|
||||
}
|
||||
|
||||
func RunParseStorageTests(rootDir string, repoDB repodb.RepoDB) {
|
||||
func RunParseStorageTests(rootDir string, metaDB mTypes.MetaDB) {
|
||||
Convey("Test with simple case", func() {
|
||||
imageStore := local.NewImageStore(rootDir, false, 0, false, false,
|
||||
log.NewLogger("debug", ""), monitoring.NewMetricsServer(false, log.NewLogger("debug", "")), nil, nil)
|
||||
|
@ -481,13 +477,13 @@ func RunParseStorageTests(rootDir string, repoDB repodb.RepoDB) {
|
|||
err = os.WriteFile(indexPath, buf, 0o600)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = repodb.ParseStorage(repoDB, storeController, log.NewLogger("debug", ""))
|
||||
err = meta.ParseStorage(metaDB, storeController, log.NewLogger("debug", ""))
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
repos, err := repoDB.GetMultipleRepoMeta(
|
||||
repos, err := metaDB.GetMultipleRepoMeta(
|
||||
context.Background(),
|
||||
func(repoMeta repodb.RepoMetadata) bool { return true },
|
||||
repodb.PageInput{},
|
||||
func(repoMeta mTypes.RepoMetadata) bool { return true },
|
||||
mTypes.PageInput{},
|
||||
)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
|
@ -495,7 +491,7 @@ func RunParseStorageTests(rootDir string, repoDB repodb.RepoDB) {
|
|||
So(len(repos[0].Tags), ShouldEqual, 2)
|
||||
|
||||
for _, descriptor := range repos[0].Tags {
|
||||
manifestMeta, err := repoDB.GetManifestMeta(repo, godigest.Digest(descriptor.Digest))
|
||||
manifestMeta, err := metaDB.GetManifestMeta(repo, godigest.Digest(descriptor.Digest))
|
||||
So(err, ShouldBeNil)
|
||||
So(manifestMeta.ManifestBlob, ShouldNotBeNil)
|
||||
So(manifestMeta.ConfigBlob, ShouldNotBeNil)
|
||||
|
@ -551,13 +547,13 @@ func RunParseStorageTests(rootDir string, repoDB repodb.RepoDB) {
|
|||
storeController)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = repodb.ParseStorage(repoDB, storeController, log.NewLogger("debug", ""))
|
||||
err = meta.ParseStorage(metaDB, storeController, log.NewLogger("debug", ""))
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
repos, err := repoDB.GetMultipleRepoMeta(
|
||||
repos, err := metaDB.GetMultipleRepoMeta(
|
||||
context.Background(),
|
||||
func(repoMeta repodb.RepoMetadata) bool { return true },
|
||||
repodb.PageInput{},
|
||||
func(repoMeta mTypes.RepoMetadata) bool { return true },
|
||||
mTypes.PageInput{},
|
||||
)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
|
@ -589,28 +585,28 @@ func RunParseStorageTests(rootDir string, repoDB repodb.RepoDB) {
|
|||
storeController)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = repoDB.SetRepoReference(repo, "tag", manifestDigest, ispec.MediaTypeImageManifest)
|
||||
err = metaDB.SetRepoReference(repo, "tag", manifestDigest, ispec.MediaTypeImageManifest)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
err = repoDB.IncrementRepoStars(repo)
|
||||
err = metaDB.IncrementRepoStars(repo)
|
||||
So(err, ShouldBeNil)
|
||||
err = repoDB.IncrementImageDownloads(repo, "tag")
|
||||
err = metaDB.IncrementImageDownloads(repo, "tag")
|
||||
So(err, ShouldBeNil)
|
||||
err = repoDB.IncrementImageDownloads(repo, "tag")
|
||||
err = metaDB.IncrementImageDownloads(repo, "tag")
|
||||
So(err, ShouldBeNil)
|
||||
err = repoDB.IncrementImageDownloads(repo, "tag")
|
||||
err = metaDB.IncrementImageDownloads(repo, "tag")
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
repoMeta, err := repoDB.GetRepoMeta(repo)
|
||||
repoMeta, err := metaDB.GetRepoMeta(repo)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
So(repoMeta.Statistics[manifestDigest.String()].DownloadCount, ShouldEqual, 3)
|
||||
So(repoMeta.Stars, ShouldEqual, 1)
|
||||
|
||||
err = repodb.ParseStorage(repoDB, storeController, log.NewLogger("debug", ""))
|
||||
err = meta.ParseStorage(metaDB, storeController, log.NewLogger("debug", ""))
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
repoMeta, err = repoDB.GetRepoMeta(repo)
|
||||
repoMeta, err = metaDB.GetRepoMeta(repo)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
So(repoMeta.Statistics[manifestDigest.String()].DownloadCount, ShouldEqual, 3)
|
||||
|
@ -618,12 +614,12 @@ func RunParseStorageTests(rootDir string, repoDB repodb.RepoDB) {
|
|||
})
|
||||
}
|
||||
|
||||
func TestGetReferredSubject(t *testing.T) {
|
||||
Convey("GetReferredSubject error", t, func() {
|
||||
_, _, _, err := repodb.GetReferredSubject([]byte("bad json"), "digest", ispec.MediaTypeImageManifest)
|
||||
func TestGetReferredInfo(t *testing.T) {
|
||||
Convey("GetReferredInfo error", t, func() {
|
||||
_, _, _, err := meta.GetReferredInfo([]byte("bad json"), "digest", ispec.MediaTypeImageManifest)
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
_, _, _, err = repodb.GetReferredSubject([]byte("bad json"), "digest", ispec.MediaTypeImageIndex)
|
||||
_, _, _, err = meta.GetReferredInfo([]byte("bad json"), "digest", ispec.MediaTypeImageIndex)
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
}
|
||||
|
@ -638,18 +634,18 @@ func skipIt(t *testing.T) {
|
|||
|
||||
func TestGetSignatureLayersInfo(t *testing.T) {
|
||||
Convey("wrong signature type", t, func() {
|
||||
layers, err := repodb.GetSignatureLayersInfo("repo", "tag", "123", "wrong signature type", []byte{},
|
||||
layers, err := meta.GetSignatureLayersInfo("repo", "tag", "123", "wrong signature type", []byte{},
|
||||
nil, log.NewLogger("debug", ""))
|
||||
So(err, ShouldBeNil)
|
||||
So(layers, ShouldBeEmpty)
|
||||
})
|
||||
|
||||
Convey("error while unmarshaling manifest content", t, func() {
|
||||
_, err := repodb.GetSignatureLayersInfo("repo", "tag", "123", signatures.CosignSignature, []byte("bad manifest"),
|
||||
_, err := meta.GetSignatureLayersInfo("repo", "tag", "123", signatures.CosignSignature, []byte("bad manifest"),
|
||||
nil, log.NewLogger("debug", ""))
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
_, err = repodb.GetSignatureLayersInfo("repo", "tag", "123", signatures.NotationSignature, []byte("bad manifest"),
|
||||
_, err = meta.GetSignatureLayersInfo("repo", "tag", "123", signatures.NotationSignature, []byte("bad manifest"),
|
||||
nil, log.NewLogger("debug", ""))
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
|
@ -1,24 +1,16 @@
|
|||
package repodb
|
||||
package types
|
||||
|
||||
import (
|
||||
"time"
|
||||
type SortCriteria string
|
||||
|
||||
godigest "github.com/opencontainers/go-digest"
|
||||
ispec "github.com/opencontainers/image-spec/specs-go/v1"
|
||||
|
||||
zerr "zotregistry.io/zot/errors"
|
||||
const (
|
||||
Relevance = SortCriteria("RELEVANCE")
|
||||
UpdateTime = SortCriteria("UPDATE_TIME")
|
||||
AlphabeticAsc = SortCriteria("ALPHABETIC_ASC")
|
||||
AlphabeticDsc = SortCriteria("ALPHABETIC_DSC")
|
||||
Stars = SortCriteria("STARS")
|
||||
Downloads = SortCriteria("DOWNLOADS")
|
||||
)
|
||||
|
||||
// DetailedRepoMeta is a auxiliary structure used for sorting RepoMeta arrays by information
|
||||
// that's not directly available in the RepoMetadata structure (ex. that needs to be calculated
|
||||
// by iterating the manifests, etc.)
|
||||
type DetailedRepoMeta struct {
|
||||
RepoMetadata
|
||||
Rank int
|
||||
Downloads int
|
||||
UpdateTime time.Time
|
||||
}
|
||||
|
||||
func SortFunctions() map[SortCriteria]func(pageBuffer []DetailedRepoMeta) func(i, j int) bool {
|
||||
return map[SortCriteria]func(pageBuffer []DetailedRepoMeta) func(i, j int) bool{
|
||||
AlphabeticAsc: SortByAlphabeticAsc,
|
||||
|
@ -60,33 +52,3 @@ func SortByDownloads(pageBuffer []DetailedRepoMeta) func(i, j int) bool {
|
|||
return pageBuffer[i].Downloads > pageBuffer[j].Downloads
|
||||
}
|
||||
}
|
||||
|
||||
// FindMediaTypeForDigest will look into the buckets for a certain digest. Depending on which bucket that
|
||||
// digest is found the corresponding mediatype is returned.
|
||||
func FindMediaTypeForDigest(repoDB RepoDB, digest godigest.Digest) (bool, string) {
|
||||
_, err := repoDB.GetManifestData(digest)
|
||||
if err == nil {
|
||||
return true, ispec.MediaTypeImageManifest
|
||||
}
|
||||
|
||||
_, err = repoDB.GetIndexData(digest)
|
||||
if err == nil {
|
||||
return true, ispec.MediaTypeImageIndex
|
||||
}
|
||||
|
||||
return false, ""
|
||||
}
|
||||
|
||||
func GetImageDescriptor(repoDB RepoDB, repo, tag string) (Descriptor, error) {
|
||||
repoMeta, err := repoDB.GetRepoMeta(repo)
|
||||
if err != nil {
|
||||
return Descriptor{}, err
|
||||
}
|
||||
|
||||
imageDescriptor, ok := repoMeta.Tags[tag]
|
||||
if !ok {
|
||||
return Descriptor{}, zerr.ErrTagMetaNotFound
|
||||
}
|
||||
|
||||
return imageDescriptor, nil
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
package repodb
|
||||
package types
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
@ -9,6 +9,16 @@ import (
|
|||
"zotregistry.io/zot/pkg/common"
|
||||
)
|
||||
|
||||
// DetailedRepoMeta is a auxiliary structure used for sorting RepoMeta arrays by information
|
||||
// that's not directly available in the RepoMetadata structure (ex. that needs to be calculated
|
||||
// by iterating the manifests, etc.)
|
||||
type DetailedRepoMeta struct {
|
||||
RepoMetadata
|
||||
Rank int
|
||||
Downloads int
|
||||
UpdateTime time.Time
|
||||
}
|
||||
|
||||
// Used to model changes to an object after a call to the DB.
|
||||
type ToggleState int
|
||||
|
||||
|
@ -23,7 +33,7 @@ type (
|
|||
FilterRepoFunc func(repoMeta RepoMetadata) bool
|
||||
)
|
||||
|
||||
type RepoDB interface { //nolint:interfacebloat
|
||||
type MetaDB interface { //nolint:interfacebloat
|
||||
UserDB
|
||||
// IncrementRepoStars adds 1 to the star count of an image
|
||||
IncrementRepoStars(repo string) error
|
||||
|
@ -217,16 +227,12 @@ type SignatureMetadata struct {
|
|||
LayersInfo []LayerInfo
|
||||
}
|
||||
|
||||
type SortCriteria string
|
||||
|
||||
const (
|
||||
Relevance = SortCriteria("RELEVANCE")
|
||||
UpdateTime = SortCriteria("UPDATE_TIME")
|
||||
AlphabeticAsc = SortCriteria("ALPHABETIC_ASC")
|
||||
AlphabeticDsc = SortCriteria("ALPHABETIC_DSC")
|
||||
Stars = SortCriteria("STARS")
|
||||
Downloads = SortCriteria("DOWNLOADS")
|
||||
)
|
||||
type UserData struct {
|
||||
StarredRepos []string
|
||||
BookmarkedRepos []string
|
||||
Groups []string
|
||||
APIKeys map[string]APIKeyDetails
|
||||
}
|
||||
|
||||
type PageInput struct {
|
||||
Limit int
|
||||
|
@ -252,13 +258,6 @@ type FilterData struct {
|
|||
IsBookmarked bool
|
||||
}
|
||||
|
||||
type UserData struct {
|
||||
StarredRepos []string
|
||||
BookmarkedRepos []string
|
||||
Groups []string
|
||||
APIKeys map[string]APIKeyDetails
|
||||
}
|
||||
|
||||
type APIKeyDetails struct {
|
||||
CreatedAt time.Time `json:"createdAt"`
|
||||
CreatorUA string `json:"creatorUa"`
|
|
@ -5,15 +5,15 @@ import (
|
|||
|
||||
"zotregistry.io/zot/pkg/log"
|
||||
"zotregistry.io/zot/pkg/meta/common"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
"zotregistry.io/zot/pkg/storage"
|
||||
)
|
||||
|
||||
// OnUpdateManifest is called when a new manifest is added. It updates repodb according to the type
|
||||
// OnUpdateManifest is called when a new manifest is added. It updates metadb according to the type
|
||||
// of image pushed(normal images, signatues, etc.). In care of any errors, it makes sure to keep
|
||||
// consistency between repodb and the image store.
|
||||
// consistency between metadb and the image store.
|
||||
func OnUpdateManifest(repo, reference, mediaType string, digest godigest.Digest, body []byte,
|
||||
storeController storage.StoreController, repoDB repodb.RepoDB, log log.Logger,
|
||||
storeController storage.StoreController, metaDB mTypes.MetaDB, log log.Logger,
|
||||
) error {
|
||||
imgStore := storeController.GetImageStore(repo)
|
||||
|
||||
|
@ -34,32 +34,32 @@ func OnUpdateManifest(repo, reference, mediaType string, digest godigest.Digest,
|
|||
metadataSuccessfullySet := true
|
||||
|
||||
if isSignature {
|
||||
layersInfo, errGetLayers := repodb.GetSignatureLayersInfo(repo, reference, digest.String(), signatureType, body,
|
||||
layersInfo, errGetLayers := GetSignatureLayersInfo(repo, reference, digest.String(), signatureType, body,
|
||||
imgStore, log)
|
||||
if errGetLayers != nil {
|
||||
metadataSuccessfullySet = false
|
||||
err = errGetLayers
|
||||
} else {
|
||||
err = repoDB.AddManifestSignature(repo, signedManifestDigest, repodb.SignatureMetadata{
|
||||
err = metaDB.AddManifestSignature(repo, signedManifestDigest, mTypes.SignatureMetadata{
|
||||
SignatureType: signatureType,
|
||||
SignatureDigest: digest.String(),
|
||||
LayersInfo: layersInfo,
|
||||
})
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("repodb: error while putting repo meta")
|
||||
log.Error().Err(err).Msg("metadb: error while putting repo meta")
|
||||
metadataSuccessfullySet = false
|
||||
} else {
|
||||
err = repoDB.UpdateSignaturesValidity(repo, signedManifestDigest)
|
||||
err = metaDB.UpdateSignaturesValidity(repo, signedManifestDigest)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Str("repository", repo).Str("reference", reference).Str("digest",
|
||||
signedManifestDigest.String()).Msg("repodb: failed verify signatures validity for signed image")
|
||||
signedManifestDigest.String()).Msg("metadb: failed verify signatures validity for signed image")
|
||||
metadataSuccessfullySet = false
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
err := repodb.SetImageMetaFromInput(repo, reference, mediaType, digest, body,
|
||||
imgStore, repoDB, log)
|
||||
err := SetImageMetaFromInput(repo, reference, mediaType, digest, body,
|
||||
imgStore, metaDB, log)
|
||||
if err != nil {
|
||||
metadataSuccessfullySet = false
|
||||
}
|
||||
|
@ -81,11 +81,11 @@ func OnUpdateManifest(repo, reference, mediaType string, digest godigest.Digest,
|
|||
return nil
|
||||
}
|
||||
|
||||
// OnDeleteManifest is called when a manifest is deleted. It updates repodb according to the type
|
||||
// OnDeleteManifest is called when a manifest is deleted. It updates metadb according to the type
|
||||
// of image pushed(normal images, signatues, etc.). In care of any errors, it makes sure to keep
|
||||
// consistency between repodb and the image store.
|
||||
// consistency between metadb and the image store.
|
||||
func OnDeleteManifest(repo, reference, mediaType string, digest godigest.Digest, manifestBlob []byte,
|
||||
storeController storage.StoreController, repoDB repodb.RepoDB, log log.Logger,
|
||||
storeController storage.StoreController, metaDB mTypes.MetaDB, log log.Logger,
|
||||
) error {
|
||||
imgStore := storeController.GetImageStore(repo)
|
||||
|
||||
|
@ -100,32 +100,32 @@ func OnDeleteManifest(repo, reference, mediaType string, digest godigest.Digest,
|
|||
manageRepoMetaSuccessfully := true
|
||||
|
||||
if isSignature {
|
||||
err = repoDB.DeleteSignature(repo, signedManifestDigest, repodb.SignatureMetadata{
|
||||
err = metaDB.DeleteSignature(repo, signedManifestDigest, mTypes.SignatureMetadata{
|
||||
SignatureDigest: digest.String(),
|
||||
SignatureType: signatureType,
|
||||
})
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("repodb: can't check if image is a signature or not")
|
||||
log.Error().Err(err).Msg("metadb: can't check if image is a signature or not")
|
||||
manageRepoMetaSuccessfully = false
|
||||
}
|
||||
} else {
|
||||
err = repoDB.DeleteRepoTag(repo, reference)
|
||||
err = metaDB.DeleteRepoTag(repo, reference)
|
||||
if err != nil {
|
||||
log.Info().Msg("repodb: restoring image store")
|
||||
log.Info().Msg("metadb: restoring image store")
|
||||
|
||||
// restore image store
|
||||
_, _, err := imgStore.PutImageManifest(repo, reference, mediaType, manifestBlob)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("repodb: error while restoring image store, database is not consistent")
|
||||
log.Error().Err(err).Msg("metadb: error while restoring image store, database is not consistent")
|
||||
}
|
||||
|
||||
manageRepoMetaSuccessfully = false
|
||||
}
|
||||
|
||||
if refferredDigest, hasSubject := common.GetReferredSubject(manifestBlob); hasSubject {
|
||||
err := repoDB.DeleteReferrer(repo, refferredDigest, digest)
|
||||
err := metaDB.DeleteReferrer(repo, refferredDigest, digest)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("repodb: error while deleting referrer")
|
||||
log.Error().Err(err).Msg("metadb: error while deleting referrer")
|
||||
|
||||
return err
|
||||
}
|
||||
|
@ -134,7 +134,7 @@ func OnDeleteManifest(repo, reference, mediaType string, digest godigest.Digest,
|
|||
|
||||
if !manageRepoMetaSuccessfully {
|
||||
log.Info().Str("tag", reference).Str("repository", repo).
|
||||
Msg("repodb: deleting image meta was unsuccessful for tag in repo")
|
||||
Msg("metadb: deleting image meta was unsuccessful for tag in repo")
|
||||
|
||||
return err
|
||||
}
|
||||
|
@ -144,7 +144,7 @@ func OnDeleteManifest(repo, reference, mediaType string, digest godigest.Digest,
|
|||
|
||||
// OnDeleteManifest is called when a manifest is downloaded. It increments the download couter on that manifest.
|
||||
func OnGetManifest(name, reference string, body []byte,
|
||||
storeController storage.StoreController, repoDB repodb.RepoDB, log log.Logger,
|
||||
storeController storage.StoreController, metaDB mTypes.MetaDB, log log.Logger,
|
||||
) error {
|
||||
// check if image is a signature
|
||||
isSignature, _, _, err := storage.CheckIsImageSignature(name, body, reference)
|
||||
|
@ -155,7 +155,7 @@ func OnGetManifest(name, reference string, body []byte,
|
|||
}
|
||||
|
||||
if !isSignature {
|
||||
err := repoDB.IncrementImageDownloads(name, reference)
|
||||
err := metaDB.IncrementImageDownloads(name, reference)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Str("repository", name).Str("reference", reference).
|
||||
Msg("unexpected error for image")
|
||||
|
|
|
@ -15,9 +15,8 @@ import (
|
|||
"zotregistry.io/zot/pkg/extensions/monitoring"
|
||||
"zotregistry.io/zot/pkg/log"
|
||||
"zotregistry.io/zot/pkg/meta"
|
||||
"zotregistry.io/zot/pkg/meta/bolt"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
bolt_wrapper "zotregistry.io/zot/pkg/meta/repodb/boltdb-wrapper"
|
||||
"zotregistry.io/zot/pkg/meta/boltdb"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
"zotregistry.io/zot/pkg/storage"
|
||||
"zotregistry.io/zot/pkg/storage/local"
|
||||
"zotregistry.io/zot/pkg/test"
|
||||
|
@ -36,13 +35,13 @@ func TestOnUpdateManifest(t *testing.T) {
|
|||
true, true, log, metrics, nil, nil,
|
||||
)
|
||||
|
||||
params := bolt.DBParameters{
|
||||
params := boltdb.DBParameters{
|
||||
RootDir: rootDir,
|
||||
}
|
||||
boltDriver, err := bolt.GetBoltDriver(params)
|
||||
boltDriver, err := boltdb.GetBoltDriver(params)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
repoDB, err := bolt_wrapper.NewBoltDBWrapper(boltDriver, log)
|
||||
metaDB, err := boltdb.New(boltDriver, log)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
config, layers, manifest, err := test.GetRandomImageComponents(100)
|
||||
|
@ -61,10 +60,10 @@ func TestOnUpdateManifest(t *testing.T) {
|
|||
|
||||
digest := godigest.FromBytes(manifestBlob)
|
||||
|
||||
err = meta.OnUpdateManifest("repo", "tag1", "", digest, manifestBlob, storeController, repoDB, log)
|
||||
err = meta.OnUpdateManifest("repo", "tag1", "", digest, manifestBlob, storeController, metaDB, log)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
repoMeta, err := repoDB.GetRepoMeta("repo")
|
||||
repoMeta, err := metaDB.GetRepoMeta("repo")
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
So(repoMeta.Tags, ShouldContainKey, "tag1")
|
||||
|
@ -79,14 +78,14 @@ func TestOnUpdateManifest(t *testing.T) {
|
|||
true, true, log, metrics, nil, nil,
|
||||
)
|
||||
|
||||
repoDB := mocks.RepoDBMock{
|
||||
SetManifestDataFn: func(manifestDigest godigest.Digest, mm repodb.ManifestData) error {
|
||||
metaDB := mocks.MetaDBMock{
|
||||
SetManifestDataFn: func(manifestDigest godigest.Digest, mm mTypes.ManifestData) error {
|
||||
return ErrTestError
|
||||
},
|
||||
}
|
||||
|
||||
err := meta.OnUpdateManifest("repo", "tag1", ispec.MediaTypeImageManifest, "digest",
|
||||
[]byte("{}"), storeController, repoDB, log)
|
||||
[]byte("{}"), storeController, metaDB, log)
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
}
|
||||
|
@ -96,7 +95,7 @@ func TestUpdateErrors(t *testing.T) {
|
|||
Convey("On UpdateManifest", func() {
|
||||
imageStore := mocks.MockedImageStore{}
|
||||
storeController := storage.StoreController{DefaultStore: &imageStore}
|
||||
repoDB := mocks.RepoDBMock{}
|
||||
metaDB := mocks.MetaDBMock{}
|
||||
log := log.NewLogger("debug", "")
|
||||
|
||||
Convey("CheckIsImageSignature errors", func() {
|
||||
|
@ -111,7 +110,7 @@ func TestUpdateErrors(t *testing.T) {
|
|||
}
|
||||
|
||||
err := meta.OnUpdateManifest("repo", "tag1", "digest", "media", badManifestBlob,
|
||||
storeController, repoDB, log)
|
||||
storeController, metaDB, log)
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
|
@ -132,7 +131,7 @@ func TestUpdateErrors(t *testing.T) {
|
|||
}
|
||||
|
||||
err = meta.OnUpdateManifest("repo", "tag1", "", "digest", badNotationManifestBlob,
|
||||
storeController, repoDB, log)
|
||||
storeController, metaDB, log)
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
|
@ -159,12 +158,12 @@ func TestUpdateErrors(t *testing.T) {
|
|||
return []byte{}, nil
|
||||
}
|
||||
|
||||
repoDB.UpdateSignaturesValidityFn = func(repo string, manifestDigest godigest.Digest) error {
|
||||
metaDB.UpdateSignaturesValidityFn = func(repo string, manifestDigest godigest.Digest) error {
|
||||
return ErrTestError
|
||||
}
|
||||
|
||||
err = meta.OnUpdateManifest("repo", "tag1", "", "digest", notationManifestBlob,
|
||||
storeController, repoDB, log)
|
||||
storeController, metaDB, log)
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
})
|
||||
|
@ -172,7 +171,7 @@ func TestUpdateErrors(t *testing.T) {
|
|||
Convey("On DeleteManifest", func() {
|
||||
imageStore := mocks.MockedImageStore{}
|
||||
storeController := storage.StoreController{DefaultStore: &imageStore}
|
||||
repoDB := mocks.RepoDBMock{}
|
||||
metaDB := mocks.MetaDBMock{}
|
||||
log := log.NewLogger("debug", "")
|
||||
|
||||
Convey("CheckIsImageSignature errors", func() {
|
||||
|
@ -183,18 +182,18 @@ func TestUpdateErrors(t *testing.T) {
|
|||
}
|
||||
|
||||
err := meta.OnDeleteManifest("repo", "tag1", "digest", "media", badManifestBlob,
|
||||
storeController, repoDB, log)
|
||||
storeController, metaDB, log)
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
Convey("DeleteReferrers errors", func() {
|
||||
repoDB.DeleteReferrerFn = func(repo string, referredDigest, referrerDigest godigest.Digest) error {
|
||||
metaDB.DeleteReferrerFn = func(repo string, referredDigest, referrerDigest godigest.Digest) error {
|
||||
return ErrTestError
|
||||
}
|
||||
|
||||
err := meta.OnDeleteManifest("repo", "tag1", "digest", "media",
|
||||
[]byte(`{"subject": {"digest": "dig"}}`),
|
||||
storeController, repoDB, log)
|
||||
storeController, metaDB, log)
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
})
|
||||
|
@ -202,7 +201,7 @@ func TestUpdateErrors(t *testing.T) {
|
|||
Convey("On GetManifest", func() {
|
||||
imageStore := mocks.MockedImageStore{}
|
||||
storeController := storage.StoreController{DefaultStore: &imageStore}
|
||||
repoDB := mocks.RepoDBMock{}
|
||||
metaDB := mocks.MetaDBMock{}
|
||||
log := log.NewLogger("debug", "")
|
||||
|
||||
Convey("CheckIsImageSignature errors", func() {
|
||||
|
@ -213,18 +212,18 @@ func TestUpdateErrors(t *testing.T) {
|
|||
}
|
||||
|
||||
err := meta.OnGetManifest("repo", "tag1", badManifestBlob,
|
||||
storeController, repoDB, log)
|
||||
storeController, metaDB, log)
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
})
|
||||
|
||||
Convey("SetImageMetaFromInput", func() {
|
||||
imageStore := mocks.MockedImageStore{}
|
||||
repoDB := mocks.RepoDBMock{}
|
||||
metaDB := mocks.MetaDBMock{}
|
||||
log := log.NewLogger("debug", "")
|
||||
|
||||
err := repodb.SetImageMetaFromInput("repo", "ref", ispec.MediaTypeImageManifest, "digest",
|
||||
[]byte("BadManifestBlob"), imageStore, repoDB, log)
|
||||
err := meta.SetImageMetaFromInput("repo", "ref", ispec.MediaTypeImageManifest, "digest",
|
||||
[]byte("BadManifestBlob"), imageStore, metaDB, log)
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
// reference is digest
|
||||
|
@ -240,8 +239,8 @@ func TestUpdateErrors(t *testing.T) {
|
|||
return []byte("{}"), nil
|
||||
}
|
||||
|
||||
err = repodb.SetImageMetaFromInput("repo", string(godigest.FromString("reference")), "", "digest",
|
||||
manifestBlob, imageStore, repoDB, log)
|
||||
err = meta.SetImageMetaFromInput("repo", string(godigest.FromString("reference")), "", "digest",
|
||||
manifestBlob, imageStore, metaDB, log)
|
||||
So(err, ShouldBeNil)
|
||||
})
|
||||
|
||||
|
@ -249,13 +248,13 @@ func TestUpdateErrors(t *testing.T) {
|
|||
imageStore := mocks.MockedImageStore{}
|
||||
log := log.NewLogger("debug", "")
|
||||
|
||||
repoDB := mocks.RepoDBMock{
|
||||
SetManifestDataFn: func(manifestDigest godigest.Digest, mm repodb.ManifestData) error {
|
||||
metaDB := mocks.MetaDBMock{
|
||||
SetManifestDataFn: func(manifestDigest godigest.Digest, mm mTypes.ManifestData) error {
|
||||
return ErrTestError
|
||||
},
|
||||
}
|
||||
err := repodb.SetImageMetaFromInput("repo", "ref", ispec.MediaTypeImageManifest, "digest",
|
||||
[]byte("{}"), imageStore, repoDB, log)
|
||||
err := meta.SetImageMetaFromInput("repo", "ref", ispec.MediaTypeImageManifest, "digest",
|
||||
[]byte("{}"), imageStore, metaDB, log)
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
|
@ -263,13 +262,13 @@ func TestUpdateErrors(t *testing.T) {
|
|||
imageStore := mocks.MockedImageStore{}
|
||||
log := log.NewLogger("debug", "")
|
||||
|
||||
repoDB := mocks.RepoDBMock{
|
||||
SetIndexDataFn: func(digest godigest.Digest, indexData repodb.IndexData) error {
|
||||
metaDB := mocks.MetaDBMock{
|
||||
SetIndexDataFn: func(digest godigest.Digest, indexData mTypes.IndexData) error {
|
||||
return ErrTestError
|
||||
},
|
||||
}
|
||||
err := repodb.SetImageMetaFromInput("repo", "ref", ispec.MediaTypeImageIndex, "digest",
|
||||
[]byte("{}"), imageStore, repoDB, log)
|
||||
err := meta.SetImageMetaFromInput("repo", "ref", ispec.MediaTypeImageIndex, "digest",
|
||||
[]byte("{}"), imageStore, metaDB, log)
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
|
||||
|
@ -281,14 +280,14 @@ func TestUpdateErrors(t *testing.T) {
|
|||
}
|
||||
log := log.NewLogger("debug", "")
|
||||
|
||||
repoDB := mocks.RepoDBMock{
|
||||
SetReferrerFn: func(repo string, referredDigest godigest.Digest, referrer repodb.ReferrerInfo) error {
|
||||
metaDB := mocks.MetaDBMock{
|
||||
SetReferrerFn: func(repo string, referredDigest godigest.Digest, referrer mTypes.ReferrerInfo) error {
|
||||
return ErrTestError
|
||||
},
|
||||
}
|
||||
|
||||
err := repodb.SetImageMetaFromInput("repo", "ref", ispec.MediaTypeImageManifest, "digest",
|
||||
[]byte(`{"subject": {"digest": "subjDigest"}}`), imageStore, repoDB, log)
|
||||
err := meta.SetImageMetaFromInput("repo", "ref", ispec.MediaTypeImageManifest, "digest",
|
||||
[]byte(`{"subject": {"digest": "subjDigest"}}`), imageStore, metaDB, log)
|
||||
So(err, ShouldNotBeNil)
|
||||
})
|
||||
})
|
||||
|
|
|
@ -14,10 +14,8 @@ import (
|
|||
"go.etcd.io/bbolt"
|
||||
|
||||
"zotregistry.io/zot/pkg/log"
|
||||
"zotregistry.io/zot/pkg/meta/bolt"
|
||||
"zotregistry.io/zot/pkg/meta/dynamo"
|
||||
boltdb_wrapper "zotregistry.io/zot/pkg/meta/repodb/boltdb-wrapper"
|
||||
dynamodb_wrapper "zotregistry.io/zot/pkg/meta/repodb/dynamodb-wrapper"
|
||||
"zotregistry.io/zot/pkg/meta/boltdb"
|
||||
mdynamodb "zotregistry.io/zot/pkg/meta/dynamodb"
|
||||
"zotregistry.io/zot/pkg/meta/version"
|
||||
)
|
||||
|
||||
|
@ -26,13 +24,13 @@ var ErrTestError = errors.New("test error")
|
|||
func TestVersioningBoltDB(t *testing.T) {
|
||||
Convey("Tests", t, func() {
|
||||
tmpDir := t.TempDir()
|
||||
boltDBParams := bolt.DBParameters{RootDir: tmpDir}
|
||||
boltDriver, err := bolt.GetBoltDriver(boltDBParams)
|
||||
boltDBParams := boltdb.DBParameters{RootDir: tmpDir}
|
||||
boltDriver, err := boltdb.GetBoltDriver(boltDBParams)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
log := log.NewLogger("debug", "")
|
||||
|
||||
boltdbWrapper, err := boltdb_wrapper.NewBoltDBWrapper(boltDriver, log)
|
||||
boltdbWrapper, err := boltdb.New(boltDriver, log)
|
||||
defer os.Remove("repo.db")
|
||||
So(boltdbWrapper, ShouldNotBeNil)
|
||||
So(err, ShouldBeNil)
|
||||
|
@ -59,7 +57,7 @@ func TestVersioningBoltDB(t *testing.T) {
|
|||
|
||||
Convey("DBVersion is empty", func() {
|
||||
err := boltdbWrapper.DB.Update(func(tx *bbolt.Tx) error {
|
||||
versionBuck := tx.Bucket([]byte(bolt.VersionBucket))
|
||||
versionBuck := tx.Bucket([]byte(boltdb.VersionBucket))
|
||||
|
||||
return versionBuck.Put([]byte(version.DBVersionKey), []byte(""))
|
||||
})
|
||||
|
@ -105,7 +103,7 @@ func TestVersioningBoltDB(t *testing.T) {
|
|||
|
||||
func setBoltDBVersion(db *bbolt.DB, vers string) error {
|
||||
err := db.Update(func(tx *bbolt.Tx) error {
|
||||
versionBuck := tx.Bucket([]byte(bolt.VersionBucket))
|
||||
versionBuck := tx.Bucket([]byte(boltdb.VersionBucket))
|
||||
|
||||
return versionBuck.Put([]byte(version.DBVersionKey), []byte(vers))
|
||||
})
|
||||
|
@ -120,7 +118,7 @@ func TestVersioningDynamoDB(t *testing.T) {
|
|||
)
|
||||
|
||||
Convey("Tests", t, func() {
|
||||
params := dynamo.DBDriverParameters{
|
||||
params := mdynamodb.DBDriverParameters{
|
||||
Endpoint: endpoint,
|
||||
Region: region,
|
||||
RepoMetaTablename: "RepoMetadataTable",
|
||||
|
@ -131,12 +129,12 @@ func TestVersioningDynamoDB(t *testing.T) {
|
|||
VersionTablename: "Version",
|
||||
}
|
||||
|
||||
dynamoClient, err := dynamo.GetDynamoClient(params)
|
||||
dynamoClient, err := mdynamodb.GetDynamoClient(params)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
log := log.NewLogger("debug", "")
|
||||
|
||||
dynamoWrapper, err := dynamodb_wrapper.NewDynamoDBWrapper(dynamoClient, params, log)
|
||||
dynamoWrapper, err := mdynamodb.New(dynamoClient, params, log)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
So(dynamoWrapper.ResetManifestDataTable(), ShouldBeNil)
|
||||
|
|
|
@ -49,7 +49,7 @@ import (
|
|||
"oras.land/oras-go/v2/registry/remote/auth"
|
||||
|
||||
zerr "zotregistry.io/zot/errors"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
"zotregistry.io/zot/pkg/storage"
|
||||
storageCommon "zotregistry.io/zot/pkg/storage/common"
|
||||
"zotregistry.io/zot/pkg/test/inject"
|
||||
|
@ -133,13 +133,13 @@ func (mi *MultiarchImage) Digest() (godigest.Digest, error) {
|
|||
return godigest.FromBytes(indexBlob), nil
|
||||
}
|
||||
|
||||
func (mi *MultiarchImage) IndexData() (repodb.IndexData, error) {
|
||||
func (mi *MultiarchImage) IndexData() (mTypes.IndexData, error) {
|
||||
indexBlob, err := json.Marshal(mi.Index)
|
||||
if err != nil {
|
||||
return repodb.IndexData{}, err
|
||||
return mTypes.IndexData{}, err
|
||||
}
|
||||
|
||||
return repodb.IndexData{IndexBlob: indexBlob}, nil
|
||||
return mTypes.IndexData{IndexBlob: indexBlob}, nil
|
||||
}
|
||||
|
||||
func GetFreePort() string {
|
||||
|
|
|
@ -6,10 +6,10 @@ import (
|
|||
godigest "github.com/opencontainers/go-digest"
|
||||
|
||||
"zotregistry.io/zot/pkg/common"
|
||||
"zotregistry.io/zot/pkg/meta/repodb"
|
||||
mTypes "zotregistry.io/zot/pkg/meta/types"
|
||||
)
|
||||
|
||||
type RepoDBMock struct {
|
||||
type MetaDBMock struct {
|
||||
SetRepoDescriptionFn func(repo, description string) error
|
||||
|
||||
IncrementRepoStarsFn func(repo string) error
|
||||
|
@ -24,80 +24,84 @@ type RepoDBMock struct {
|
|||
|
||||
DeleteRepoTagFn func(repo string, tag string) error
|
||||
|
||||
GetRepoMetaFn func(repo string) (repodb.RepoMetadata, error)
|
||||
GetRepoMetaFn func(repo string) (mTypes.RepoMetadata, error)
|
||||
|
||||
GetUserRepoMetaFn func(ctx context.Context, repo string) (repodb.RepoMetadata, error)
|
||||
GetUserRepoMetaFn func(ctx context.Context, repo string) (mTypes.RepoMetadata, error)
|
||||
|
||||
SetRepoMetaFn func(repo string, repoMeta repodb.RepoMetadata) error
|
||||
SetRepoMetaFn func(repo string, repoMeta mTypes.RepoMetadata) error
|
||||
|
||||
GetMultipleRepoMetaFn func(ctx context.Context, filter func(repoMeta repodb.RepoMetadata) bool,
|
||||
requestedPage repodb.PageInput) ([]repodb.RepoMetadata, error)
|
||||
GetMultipleRepoMetaFn func(ctx context.Context, filter func(repoMeta mTypes.RepoMetadata) bool,
|
||||
requestedPage mTypes.PageInput) ([]mTypes.RepoMetadata, error)
|
||||
|
||||
GetManifestDataFn func(manifestDigest godigest.Digest) (repodb.ManifestData, error)
|
||||
GetManifestDataFn func(manifestDigest godigest.Digest) (mTypes.ManifestData, error)
|
||||
|
||||
SetManifestDataFn func(manifestDigest godigest.Digest, mm repodb.ManifestData) error
|
||||
SetManifestDataFn func(manifestDigest godigest.Digest, mm mTypes.ManifestData) error
|
||||
|
||||
GetManifestMetaFn func(repo string, manifestDigest godigest.Digest) (repodb.ManifestMetadata, error)
|
||||
GetManifestMetaFn func(repo string, manifestDigest godigest.Digest) (mTypes.ManifestMetadata, error)
|
||||
|
||||
SetManifestMetaFn func(repo string, manifestDigest godigest.Digest, mm repodb.ManifestMetadata) error
|
||||
SetManifestMetaFn func(repo string, manifestDigest godigest.Digest, mm mTypes.ManifestMetadata) error
|
||||
|
||||
SetIndexDataFn func(digest godigest.Digest, indexData repodb.IndexData) error
|
||||
SetIndexDataFn func(digest godigest.Digest, indexData mTypes.IndexData) error
|
||||
|
||||
GetIndexDataFn func(indexDigest godigest.Digest) (repodb.IndexData, error)
|
||||
GetIndexDataFn func(indexDigest godigest.Digest) (mTypes.IndexData, error)
|
||||
|
||||
SetReferrerFn func(repo string, referredDigest godigest.Digest, referrer repodb.ReferrerInfo) error
|
||||
SetReferrerFn func(repo string, referredDigest godigest.Digest, referrer mTypes.ReferrerInfo) error
|
||||
|
||||
DeleteReferrerFn func(repo string, referredDigest godigest.Digest, referrerDigest godigest.Digest) error
|
||||
|
||||
GetReferrersFn func(repo string, referredDigest godigest.Digest) ([]repodb.Descriptor, error)
|
||||
GetReferrersFn func(repo string, referredDigest godigest.Digest) ([]mTypes.Descriptor, error)
|
||||
|
||||
GetReferrersInfoFn func(repo string, referredDigest godigest.Digest, artifactTypes []string) (
|
||||
[]repodb.ReferrerInfo, error)
|
||||
[]mTypes.ReferrerInfo, error)
|
||||
|
||||
IncrementImageDownloadsFn func(repo string, reference string) error
|
||||
|
||||
UpdateSignaturesValidityFn func(repo string, manifestDigest godigest.Digest) error
|
||||
|
||||
AddManifestSignatureFn func(repo string, signedManifestDigest godigest.Digest, sm repodb.SignatureMetadata) error
|
||||
AddManifestSignatureFn func(repo string, signedManifestDigest godigest.Digest, sm mTypes.SignatureMetadata) error
|
||||
|
||||
DeleteSignatureFn func(repo string, signedManifestDigest godigest.Digest, sm repodb.SignatureMetadata) error
|
||||
DeleteSignatureFn func(repo string, signedManifestDigest godigest.Digest, sm mTypes.SignatureMetadata) error
|
||||
|
||||
SearchReposFn func(ctx context.Context, searchText string, filter repodb.Filter, requestedPage repodb.PageInput) (
|
||||
[]repodb.RepoMetadata, map[string]repodb.ManifestMetadata, map[string]repodb.IndexData, common.PageInfo, error)
|
||||
SearchReposFn func(ctx context.Context, txt string, filter mTypes.Filter, requestedPage mTypes.PageInput) (
|
||||
[]mTypes.RepoMetadata, map[string]mTypes.ManifestMetadata, map[string]mTypes.IndexData, common.PageInfo,
|
||||
error)
|
||||
|
||||
SearchTagsFn func(ctx context.Context, searchText string, filter repodb.Filter, requestedPage repodb.PageInput) (
|
||||
[]repodb.RepoMetadata, map[string]repodb.ManifestMetadata, map[string]repodb.IndexData, common.PageInfo, error)
|
||||
SearchTagsFn func(ctx context.Context, txt string, filter mTypes.Filter, requestedPage mTypes.PageInput) (
|
||||
[]mTypes.RepoMetadata, map[string]mTypes.ManifestMetadata, map[string]mTypes.IndexData, common.PageInfo,
|
||||
error)
|
||||
|
||||
FilterReposFn func(ctx context.Context, filter repodb.FilterRepoFunc, requestedPage repodb.PageInput) (
|
||||
[]repodb.RepoMetadata, map[string]repodb.ManifestMetadata, map[string]repodb.IndexData, common.PageInfo, error)
|
||||
FilterReposFn func(ctx context.Context, filter mTypes.FilterRepoFunc, requestedPage mTypes.PageInput) (
|
||||
[]mTypes.RepoMetadata, map[string]mTypes.ManifestMetadata, map[string]mTypes.IndexData, common.PageInfo,
|
||||
error)
|
||||
|
||||
FilterTagsFn func(ctx context.Context, filterFunc repodb.FilterFunc, filter repodb.Filter,
|
||||
requestedPage repodb.PageInput,
|
||||
) ([]repodb.RepoMetadata, map[string]repodb.ManifestMetadata, map[string]repodb.IndexData, common.PageInfo, error)
|
||||
FilterTagsFn func(ctx context.Context, filterFunc mTypes.FilterFunc, filter mTypes.Filter,
|
||||
requestedPage mTypes.PageInput,
|
||||
) ([]mTypes.RepoMetadata, map[string]mTypes.ManifestMetadata, map[string]mTypes.IndexData, common.PageInfo,
|
||||
error)
|
||||
|
||||
SearchDigestsFn func(ctx context.Context, searchText string, requestedPage repodb.PageInput) (
|
||||
[]repodb.RepoMetadata, map[string]repodb.ManifestMetadata, error)
|
||||
SearchDigestsFn func(ctx context.Context, searchText string, requestedPage mTypes.PageInput) (
|
||||
[]mTypes.RepoMetadata, map[string]mTypes.ManifestMetadata, error)
|
||||
|
||||
SearchLayersFn func(ctx context.Context, searchText string, requestedPage repodb.PageInput) (
|
||||
[]repodb.RepoMetadata, map[string]repodb.ManifestMetadata, error)
|
||||
SearchLayersFn func(ctx context.Context, searchText string, requestedPage mTypes.PageInput) (
|
||||
[]mTypes.RepoMetadata, map[string]mTypes.ManifestMetadata, error)
|
||||
|
||||
SearchForAscendantImagesFn func(ctx context.Context, searchText string, requestedPage repodb.PageInput) (
|
||||
[]repodb.RepoMetadata, map[string]repodb.ManifestMetadata, error)
|
||||
SearchForAscendantImagesFn func(ctx context.Context, searchText string, requestedPage mTypes.PageInput) (
|
||||
[]mTypes.RepoMetadata, map[string]mTypes.ManifestMetadata, error)
|
||||
|
||||
SearchForDescendantImagesFn func(ctx context.Context, searchText string, requestedPage repodb.PageInput) (
|
||||
[]repodb.RepoMetadata, map[string]repodb.ManifestMetadata, error)
|
||||
SearchForDescendantImagesFn func(ctx context.Context, searchText string, requestedPage mTypes.PageInput) (
|
||||
[]mTypes.RepoMetadata, map[string]mTypes.ManifestMetadata, error)
|
||||
|
||||
GetStarredReposFn func(ctx context.Context) ([]string, error)
|
||||
|
||||
GetBookmarkedReposFn func(ctx context.Context) ([]string, error)
|
||||
|
||||
ToggleStarRepoFn func(ctx context.Context, repo string) (repodb.ToggleState, error)
|
||||
ToggleStarRepoFn func(ctx context.Context, repo string) (mTypes.ToggleState, error)
|
||||
|
||||
ToggleBookmarkRepoFn func(ctx context.Context, repo string) (repodb.ToggleState, error)
|
||||
ToggleBookmarkRepoFn func(ctx context.Context, repo string) (mTypes.ToggleState, error)
|
||||
|
||||
GetUserDataFn func(ctx context.Context) (repodb.UserData, error)
|
||||
GetUserDataFn func(ctx context.Context) (mTypes.UserData, error)
|
||||
|
||||
SetUserDataFn func(ctx context.Context, userProfile repodb.UserData) error
|
||||
SetUserDataFn func(ctx context.Context, userProfile mTypes.UserData) error
|
||||
|
||||
SetUserGroupsFn func(ctx context.Context, groups []string) error
|
||||
|
||||
|
@ -107,7 +111,7 @@ type RepoDBMock struct {
|
|||
|
||||
GetUserAPIKeyInfoFn func(hashedKey string) (string, error)
|
||||
|
||||
AddUserAPIKeyFn func(ctx context.Context, hashedKey string, apiKeyDetails *repodb.APIKeyDetails) error
|
||||
AddUserAPIKeyFn func(ctx context.Context, hashedKey string, apiKeyDetails *mTypes.APIKeyDetails) error
|
||||
|
||||
UpdateUserAPIKeyLastUsedFn func(ctx context.Context, hashedKey string) error
|
||||
|
||||
|
@ -116,7 +120,7 @@ type RepoDBMock struct {
|
|||
PatchDBFn func() error
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) SetRepoDescription(repo, description string) error {
|
||||
func (sdm MetaDBMock) SetRepoDescription(repo, description string) error {
|
||||
if sdm.SetRepoDescriptionFn != nil {
|
||||
return sdm.SetRepoDescriptionFn(repo, description)
|
||||
}
|
||||
|
@ -124,7 +128,7 @@ func (sdm RepoDBMock) SetRepoDescription(repo, description string) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) IncrementRepoStars(repo string) error {
|
||||
func (sdm MetaDBMock) IncrementRepoStars(repo string) error {
|
||||
if sdm.IncrementRepoStarsFn != nil {
|
||||
return sdm.IncrementRepoStarsFn(repo)
|
||||
}
|
||||
|
@ -132,7 +136,7 @@ func (sdm RepoDBMock) IncrementRepoStars(repo string) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) DecrementRepoStars(repo string) error {
|
||||
func (sdm MetaDBMock) DecrementRepoStars(repo string) error {
|
||||
if sdm.DecrementRepoStarsFn != nil {
|
||||
return sdm.DecrementRepoStarsFn(repo)
|
||||
}
|
||||
|
@ -140,7 +144,7 @@ func (sdm RepoDBMock) DecrementRepoStars(repo string) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) GetRepoStars(repo string) (int, error) {
|
||||
func (sdm MetaDBMock) GetRepoStars(repo string) (int, error) {
|
||||
if sdm.GetRepoStarsFn != nil {
|
||||
return sdm.GetRepoStarsFn(repo)
|
||||
}
|
||||
|
@ -148,7 +152,7 @@ func (sdm RepoDBMock) GetRepoStars(repo string) (int, error) {
|
|||
return 0, nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) SetRepoReference(repo string, reference string, manifestDigest godigest.Digest,
|
||||
func (sdm MetaDBMock) SetRepoReference(repo string, reference string, manifestDigest godigest.Digest,
|
||||
mediaType string,
|
||||
) error {
|
||||
if sdm.SetRepoReferenceFn != nil {
|
||||
|
@ -158,7 +162,7 @@ func (sdm RepoDBMock) SetRepoReference(repo string, reference string, manifestDi
|
|||
return nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) DeleteRepoTag(repo string, tag string) error {
|
||||
func (sdm MetaDBMock) DeleteRepoTag(repo string, tag string) error {
|
||||
if sdm.DeleteRepoTagFn != nil {
|
||||
return sdm.DeleteRepoTagFn(repo, tag)
|
||||
}
|
||||
|
@ -166,23 +170,23 @@ func (sdm RepoDBMock) DeleteRepoTag(repo string, tag string) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) GetRepoMeta(repo string) (repodb.RepoMetadata, error) {
|
||||
func (sdm MetaDBMock) GetRepoMeta(repo string) (mTypes.RepoMetadata, error) {
|
||||
if sdm.GetRepoMetaFn != nil {
|
||||
return sdm.GetRepoMetaFn(repo)
|
||||
}
|
||||
|
||||
return repodb.RepoMetadata{}, nil
|
||||
return mTypes.RepoMetadata{}, nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) GetUserRepoMeta(ctx context.Context, repo string) (repodb.RepoMetadata, error) {
|
||||
func (sdm MetaDBMock) GetUserRepoMeta(ctx context.Context, repo string) (mTypes.RepoMetadata, error) {
|
||||
if sdm.GetUserRepoMetaFn != nil {
|
||||
return sdm.GetUserRepoMetaFn(ctx, repo)
|
||||
}
|
||||
|
||||
return repodb.RepoMetadata{}, nil
|
||||
return mTypes.RepoMetadata{}, nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) SetRepoMeta(repo string, repoMeta repodb.RepoMetadata) error {
|
||||
func (sdm MetaDBMock) SetRepoMeta(repo string, repoMeta mTypes.RepoMetadata) error {
|
||||
if sdm.SetRepoMetaFn != nil {
|
||||
return sdm.SetRepoMetaFn(repo, repoMeta)
|
||||
}
|
||||
|
@ -190,25 +194,25 @@ func (sdm RepoDBMock) SetRepoMeta(repo string, repoMeta repodb.RepoMetadata) err
|
|||
return nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) GetMultipleRepoMeta(ctx context.Context, filter func(repoMeta repodb.RepoMetadata) bool,
|
||||
requestedPage repodb.PageInput,
|
||||
) ([]repodb.RepoMetadata, error) {
|
||||
func (sdm MetaDBMock) GetMultipleRepoMeta(ctx context.Context, filter func(repoMeta mTypes.RepoMetadata) bool,
|
||||
requestedPage mTypes.PageInput,
|
||||
) ([]mTypes.RepoMetadata, error) {
|
||||
if sdm.GetMultipleRepoMetaFn != nil {
|
||||
return sdm.GetMultipleRepoMetaFn(ctx, filter, requestedPage)
|
||||
}
|
||||
|
||||
return []repodb.RepoMetadata{}, nil
|
||||
return []mTypes.RepoMetadata{}, nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) GetManifestData(manifestDigest godigest.Digest) (repodb.ManifestData, error) {
|
||||
func (sdm MetaDBMock) GetManifestData(manifestDigest godigest.Digest) (mTypes.ManifestData, error) {
|
||||
if sdm.GetManifestDataFn != nil {
|
||||
return sdm.GetManifestDataFn(manifestDigest)
|
||||
}
|
||||
|
||||
return repodb.ManifestData{}, nil
|
||||
return mTypes.ManifestData{}, nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) SetManifestData(manifestDigest godigest.Digest, md repodb.ManifestData) error {
|
||||
func (sdm MetaDBMock) SetManifestData(manifestDigest godigest.Digest, md mTypes.ManifestData) error {
|
||||
if sdm.SetManifestDataFn != nil {
|
||||
return sdm.SetManifestDataFn(manifestDigest, md)
|
||||
}
|
||||
|
@ -216,15 +220,15 @@ func (sdm RepoDBMock) SetManifestData(manifestDigest godigest.Digest, md repodb.
|
|||
return nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) GetManifestMeta(repo string, manifestDigest godigest.Digest) (repodb.ManifestMetadata, error) {
|
||||
func (sdm MetaDBMock) GetManifestMeta(repo string, manifestDigest godigest.Digest) (mTypes.ManifestMetadata, error) {
|
||||
if sdm.GetManifestMetaFn != nil {
|
||||
return sdm.GetManifestMetaFn(repo, manifestDigest)
|
||||
}
|
||||
|
||||
return repodb.ManifestMetadata{}, nil
|
||||
return mTypes.ManifestMetadata{}, nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) SetManifestMeta(repo string, manifestDigest godigest.Digest, mm repodb.ManifestMetadata) error {
|
||||
func (sdm MetaDBMock) SetManifestMeta(repo string, manifestDigest godigest.Digest, mm mTypes.ManifestMetadata) error {
|
||||
if sdm.SetManifestMetaFn != nil {
|
||||
return sdm.SetManifestMetaFn(repo, manifestDigest, mm)
|
||||
}
|
||||
|
@ -232,7 +236,7 @@ func (sdm RepoDBMock) SetManifestMeta(repo string, manifestDigest godigest.Diges
|
|||
return nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) IncrementImageDownloads(repo string, reference string) error {
|
||||
func (sdm MetaDBMock) IncrementImageDownloads(repo string, reference string) error {
|
||||
if sdm.IncrementImageDownloadsFn != nil {
|
||||
return sdm.IncrementImageDownloadsFn(repo, reference)
|
||||
}
|
||||
|
@ -240,7 +244,7 @@ func (sdm RepoDBMock) IncrementImageDownloads(repo string, reference string) err
|
|||
return nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) UpdateSignaturesValidity(repo string, manifestDigest godigest.Digest) error {
|
||||
func (sdm MetaDBMock) UpdateSignaturesValidity(repo string, manifestDigest godigest.Digest) error {
|
||||
if sdm.UpdateSignaturesValidityFn != nil {
|
||||
return sdm.UpdateSignaturesValidityFn(repo, manifestDigest)
|
||||
}
|
||||
|
@ -248,8 +252,8 @@ func (sdm RepoDBMock) UpdateSignaturesValidity(repo string, manifestDigest godig
|
|||
return nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) AddManifestSignature(repo string, signedManifestDigest godigest.Digest,
|
||||
sm repodb.SignatureMetadata,
|
||||
func (sdm MetaDBMock) AddManifestSignature(repo string, signedManifestDigest godigest.Digest,
|
||||
sm mTypes.SignatureMetadata,
|
||||
) error {
|
||||
if sdm.AddManifestSignatureFn != nil {
|
||||
return sdm.AddManifestSignatureFn(repo, signedManifestDigest, sm)
|
||||
|
@ -258,8 +262,8 @@ func (sdm RepoDBMock) AddManifestSignature(repo string, signedManifestDigest god
|
|||
return nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) DeleteSignature(repo string, signedManifestDigest godigest.Digest,
|
||||
sm repodb.SignatureMetadata,
|
||||
func (sdm MetaDBMock) DeleteSignature(repo string, signedManifestDigest godigest.Digest,
|
||||
sm mTypes.SignatureMetadata,
|
||||
) error {
|
||||
if sdm.DeleteSignatureFn != nil {
|
||||
return sdm.DeleteSignatureFn(repo, signedManifestDigest, sm)
|
||||
|
@ -268,88 +272,89 @@ func (sdm RepoDBMock) DeleteSignature(repo string, signedManifestDigest godigest
|
|||
return nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) SearchRepos(ctx context.Context, searchText string, filter repodb.Filter,
|
||||
requestedPage repodb.PageInput,
|
||||
) ([]repodb.RepoMetadata, map[string]repodb.ManifestMetadata, map[string]repodb.IndexData, common.PageInfo, error) {
|
||||
func (sdm MetaDBMock) SearchRepos(ctx context.Context, searchText string, filter mTypes.Filter,
|
||||
requestedPage mTypes.PageInput,
|
||||
) ([]mTypes.RepoMetadata, map[string]mTypes.ManifestMetadata, map[string]mTypes.IndexData, common.PageInfo, error) {
|
||||
if sdm.SearchReposFn != nil {
|
||||
return sdm.SearchReposFn(ctx, searchText, filter, requestedPage)
|
||||
}
|
||||
|
||||
return []repodb.RepoMetadata{}, map[string]repodb.ManifestMetadata{},
|
||||
map[string]repodb.IndexData{}, common.PageInfo{}, nil
|
||||
return []mTypes.RepoMetadata{}, map[string]mTypes.ManifestMetadata{},
|
||||
map[string]mTypes.IndexData{}, common.PageInfo{}, nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) SearchTags(ctx context.Context, searchText string, filter repodb.Filter,
|
||||
requestedPage repodb.PageInput,
|
||||
) ([]repodb.RepoMetadata, map[string]repodb.ManifestMetadata, map[string]repodb.IndexData, common.PageInfo, error) {
|
||||
func (sdm MetaDBMock) SearchTags(ctx context.Context, searchText string, filter mTypes.Filter,
|
||||
requestedPage mTypes.PageInput,
|
||||
) ([]mTypes.RepoMetadata, map[string]mTypes.ManifestMetadata, map[string]mTypes.IndexData, common.PageInfo, error) {
|
||||
if sdm.SearchTagsFn != nil {
|
||||
return sdm.SearchTagsFn(ctx, searchText, filter, requestedPage)
|
||||
}
|
||||
|
||||
return []repodb.RepoMetadata{}, map[string]repodb.ManifestMetadata{},
|
||||
map[string]repodb.IndexData{}, common.PageInfo{}, nil
|
||||
return []mTypes.RepoMetadata{}, map[string]mTypes.ManifestMetadata{},
|
||||
map[string]mTypes.IndexData{}, common.PageInfo{}, nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) FilterRepos(ctx context.Context, filter repodb.FilterRepoFunc,
|
||||
requestedPage repodb.PageInput,
|
||||
) ([]repodb.RepoMetadata, map[string]repodb.ManifestMetadata, map[string]repodb.IndexData, common.PageInfo, error) {
|
||||
func (sdm MetaDBMock) FilterRepos(ctx context.Context, filter mTypes.FilterRepoFunc,
|
||||
requestedPage mTypes.PageInput,
|
||||
) ([]mTypes.RepoMetadata, map[string]mTypes.ManifestMetadata, map[string]mTypes.IndexData, common.PageInfo, error) {
|
||||
if sdm.FilterReposFn != nil {
|
||||
return sdm.FilterReposFn(ctx, filter, requestedPage)
|
||||
}
|
||||
|
||||
return []repodb.RepoMetadata{}, map[string]repodb.ManifestMetadata{},
|
||||
map[string]repodb.IndexData{}, common.PageInfo{}, nil
|
||||
return []mTypes.RepoMetadata{}, map[string]mTypes.ManifestMetadata{},
|
||||
map[string]mTypes.IndexData{}, common.PageInfo{}, nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) FilterTags(ctx context.Context, filterFunc repodb.FilterFunc, filter repodb.Filter,
|
||||
requestedPage repodb.PageInput,
|
||||
) ([]repodb.RepoMetadata, map[string]repodb.ManifestMetadata, map[string]repodb.IndexData, common.PageInfo, error) {
|
||||
func (sdm MetaDBMock) FilterTags(ctx context.Context, filterFunc mTypes.FilterFunc, filter mTypes.Filter,
|
||||
requestedPage mTypes.PageInput,
|
||||
) ([]mTypes.RepoMetadata, map[string]mTypes.ManifestMetadata, map[string]mTypes.IndexData, common.PageInfo, error) {
|
||||
if sdm.FilterTagsFn != nil {
|
||||
return sdm.FilterTagsFn(ctx, filterFunc, filter, requestedPage)
|
||||
}
|
||||
|
||||
return []repodb.RepoMetadata{}, map[string]repodb.ManifestMetadata{},
|
||||
map[string]repodb.IndexData{}, common.PageInfo{}, nil
|
||||
return []mTypes.RepoMetadata{}, map[string]mTypes.ManifestMetadata{},
|
||||
map[string]mTypes.IndexData{}, common.PageInfo{}, nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) SearchDigests(ctx context.Context, searchText string, requestedPage repodb.PageInput,
|
||||
) ([]repodb.RepoMetadata, map[string]repodb.ManifestMetadata, error) {
|
||||
func (sdm MetaDBMock) SearchDigests(ctx context.Context, searchText string, requestedPage mTypes.PageInput,
|
||||
) ([]mTypes.RepoMetadata, map[string]mTypes.ManifestMetadata, error) {
|
||||
if sdm.SearchDigestsFn != nil {
|
||||
return sdm.SearchDigestsFn(ctx, searchText, requestedPage)
|
||||
}
|
||||
|
||||
return []repodb.RepoMetadata{}, map[string]repodb.ManifestMetadata{}, nil
|
||||
return []mTypes.RepoMetadata{}, map[string]mTypes.ManifestMetadata{}, nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) SearchLayers(ctx context.Context, searchText string, requestedPage repodb.PageInput,
|
||||
) ([]repodb.RepoMetadata, map[string]repodb.ManifestMetadata, error) {
|
||||
func (sdm MetaDBMock) SearchLayers(ctx context.Context, searchText string, requestedPage mTypes.PageInput,
|
||||
) ([]mTypes.RepoMetadata, map[string]mTypes.ManifestMetadata, error) {
|
||||
if sdm.SearchLayersFn != nil {
|
||||
return sdm.SearchLayersFn(ctx, searchText, requestedPage)
|
||||
}
|
||||
|
||||
return []repodb.RepoMetadata{}, map[string]repodb.ManifestMetadata{}, nil
|
||||
return []mTypes.RepoMetadata{}, map[string]mTypes.ManifestMetadata{}, nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) SearchForAscendantImages(ctx context.Context, searchText string, requestedPage repodb.PageInput,
|
||||
) ([]repodb.RepoMetadata, map[string]repodb.ManifestMetadata, error) {
|
||||
func (sdm MetaDBMock) SearchForAscendantImages(ctx context.Context, searchText string,
|
||||
requestedPage mTypes.PageInput,
|
||||
) ([]mTypes.RepoMetadata, map[string]mTypes.ManifestMetadata, error) {
|
||||
if sdm.SearchForAscendantImagesFn != nil {
|
||||
return sdm.SearchForAscendantImagesFn(ctx, searchText, requestedPage)
|
||||
}
|
||||
|
||||
return []repodb.RepoMetadata{}, map[string]repodb.ManifestMetadata{}, nil
|
||||
return []mTypes.RepoMetadata{}, map[string]mTypes.ManifestMetadata{}, nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) SearchForDescendantImages(ctx context.Context, searchText string,
|
||||
requestedPage repodb.PageInput,
|
||||
) ([]repodb.RepoMetadata, map[string]repodb.ManifestMetadata, error) {
|
||||
func (sdm MetaDBMock) SearchForDescendantImages(ctx context.Context, searchText string,
|
||||
requestedPage mTypes.PageInput,
|
||||
) ([]mTypes.RepoMetadata, map[string]mTypes.ManifestMetadata, error) {
|
||||
if sdm.SearchForDescendantImagesFn != nil {
|
||||
return sdm.SearchForDescendantImagesFn(ctx, searchText, requestedPage)
|
||||
}
|
||||
|
||||
return []repodb.RepoMetadata{}, map[string]repodb.ManifestMetadata{}, nil
|
||||
return []mTypes.RepoMetadata{}, map[string]mTypes.ManifestMetadata{}, nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) SetIndexData(digest godigest.Digest, indexData repodb.IndexData) error {
|
||||
func (sdm MetaDBMock) SetIndexData(digest godigest.Digest, indexData mTypes.IndexData) error {
|
||||
if sdm.SetIndexDataFn != nil {
|
||||
return sdm.SetIndexDataFn(digest, indexData)
|
||||
}
|
||||
|
@ -357,15 +362,15 @@ func (sdm RepoDBMock) SetIndexData(digest godigest.Digest, indexData repodb.Inde
|
|||
return nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) GetIndexData(indexDigest godigest.Digest) (repodb.IndexData, error) {
|
||||
func (sdm MetaDBMock) GetIndexData(indexDigest godigest.Digest) (mTypes.IndexData, error) {
|
||||
if sdm.GetIndexDataFn != nil {
|
||||
return sdm.GetIndexDataFn(indexDigest)
|
||||
}
|
||||
|
||||
return repodb.IndexData{}, nil
|
||||
return mTypes.IndexData{}, nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) PatchDB() error {
|
||||
func (sdm MetaDBMock) PatchDB() error {
|
||||
if sdm.PatchDBFn != nil {
|
||||
return sdm.PatchDBFn()
|
||||
}
|
||||
|
@ -373,7 +378,7 @@ func (sdm RepoDBMock) PatchDB() error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) SetReferrer(repo string, referredDigest godigest.Digest, referrer repodb.ReferrerInfo) error {
|
||||
func (sdm MetaDBMock) SetReferrer(repo string, referredDigest godigest.Digest, referrer mTypes.ReferrerInfo) error {
|
||||
if sdm.SetReferrerFn != nil {
|
||||
return sdm.SetReferrerFn(repo, referredDigest, referrer)
|
||||
}
|
||||
|
@ -381,7 +386,7 @@ func (sdm RepoDBMock) SetReferrer(repo string, referredDigest godigest.Digest, r
|
|||
return nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) DeleteReferrer(repo string, referredDigest godigest.Digest,
|
||||
func (sdm MetaDBMock) DeleteReferrer(repo string, referredDigest godigest.Digest,
|
||||
referrerDigest godigest.Digest,
|
||||
) error {
|
||||
if sdm.DeleteReferrerFn != nil {
|
||||
|
@ -391,17 +396,17 @@ func (sdm RepoDBMock) DeleteReferrer(repo string, referredDigest godigest.Digest
|
|||
return nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) GetReferrersInfo(repo string, referredDigest godigest.Digest,
|
||||
func (sdm MetaDBMock) GetReferrersInfo(repo string, referredDigest godigest.Digest,
|
||||
artifactTypes []string,
|
||||
) ([]repodb.ReferrerInfo, error) {
|
||||
) ([]mTypes.ReferrerInfo, error) {
|
||||
if sdm.GetReferrersInfoFn != nil {
|
||||
return sdm.GetReferrersInfoFn(repo, referredDigest, artifactTypes)
|
||||
}
|
||||
|
||||
return []repodb.ReferrerInfo{}, nil
|
||||
return []mTypes.ReferrerInfo{}, nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) GetStarredRepos(ctx context.Context) ([]string, error) {
|
||||
func (sdm MetaDBMock) GetStarredRepos(ctx context.Context) ([]string, error) {
|
||||
if sdm.GetStarredReposFn != nil {
|
||||
return sdm.GetStarredReposFn(ctx)
|
||||
}
|
||||
|
@ -409,7 +414,7 @@ func (sdm RepoDBMock) GetStarredRepos(ctx context.Context) ([]string, error) {
|
|||
return []string{}, nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) GetBookmarkedRepos(ctx context.Context) ([]string, error) {
|
||||
func (sdm MetaDBMock) GetBookmarkedRepos(ctx context.Context) ([]string, error) {
|
||||
if sdm.GetBookmarkedReposFn != nil {
|
||||
return sdm.GetBookmarkedReposFn(ctx)
|
||||
}
|
||||
|
@ -417,31 +422,31 @@ func (sdm RepoDBMock) GetBookmarkedRepos(ctx context.Context) ([]string, error)
|
|||
return []string{}, nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) ToggleStarRepo(ctx context.Context, repo string) (repodb.ToggleState, error) {
|
||||
func (sdm MetaDBMock) ToggleStarRepo(ctx context.Context, repo string) (mTypes.ToggleState, error) {
|
||||
if sdm.ToggleStarRepoFn != nil {
|
||||
return sdm.ToggleStarRepoFn(ctx, repo)
|
||||
}
|
||||
|
||||
return repodb.NotChanged, nil
|
||||
return mTypes.NotChanged, nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) ToggleBookmarkRepo(ctx context.Context, repo string) (repodb.ToggleState, error) {
|
||||
func (sdm MetaDBMock) ToggleBookmarkRepo(ctx context.Context, repo string) (mTypes.ToggleState, error) {
|
||||
if sdm.ToggleBookmarkRepoFn != nil {
|
||||
return sdm.ToggleBookmarkRepoFn(ctx, repo)
|
||||
}
|
||||
|
||||
return repodb.NotChanged, nil
|
||||
return mTypes.NotChanged, nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) GetUserData(ctx context.Context) (repodb.UserData, error) {
|
||||
func (sdm MetaDBMock) GetUserData(ctx context.Context) (mTypes.UserData, error) {
|
||||
if sdm.GetUserDataFn != nil {
|
||||
return sdm.GetUserDataFn(ctx)
|
||||
}
|
||||
|
||||
return repodb.UserData{}, nil
|
||||
return mTypes.UserData{}, nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) SetUserData(ctx context.Context, userProfile repodb.UserData) error {
|
||||
func (sdm MetaDBMock) SetUserData(ctx context.Context, userProfile mTypes.UserData) error {
|
||||
if sdm.SetUserDataFn != nil {
|
||||
return sdm.SetUserDataFn(ctx, userProfile)
|
||||
}
|
||||
|
@ -449,7 +454,7 @@ func (sdm RepoDBMock) SetUserData(ctx context.Context, userProfile repodb.UserDa
|
|||
return nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) SetUserGroups(ctx context.Context, groups []string) error {
|
||||
func (sdm MetaDBMock) SetUserGroups(ctx context.Context, groups []string) error {
|
||||
if sdm.SetUserGroupsFn != nil {
|
||||
return sdm.SetUserGroupsFn(ctx, groups)
|
||||
}
|
||||
|
@ -457,7 +462,7 @@ func (sdm RepoDBMock) SetUserGroups(ctx context.Context, groups []string) error
|
|||
return nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) GetUserGroups(ctx context.Context) ([]string, error) {
|
||||
func (sdm MetaDBMock) GetUserGroups(ctx context.Context) ([]string, error) {
|
||||
if sdm.GetUserGroupsFn != nil {
|
||||
return sdm.GetUserGroupsFn(ctx)
|
||||
}
|
||||
|
@ -465,7 +470,7 @@ func (sdm RepoDBMock) GetUserGroups(ctx context.Context) ([]string, error) {
|
|||
return []string{}, nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) DeleteUserData(ctx context.Context) error {
|
||||
func (sdm MetaDBMock) DeleteUserData(ctx context.Context) error {
|
||||
if sdm.DeleteUserDataFn != nil {
|
||||
return sdm.DeleteUserDataFn(ctx)
|
||||
}
|
||||
|
@ -473,7 +478,7 @@ func (sdm RepoDBMock) DeleteUserData(ctx context.Context) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) GetUserAPIKeyInfo(hashedKey string) (string, error) {
|
||||
func (sdm MetaDBMock) GetUserAPIKeyInfo(hashedKey string) (string, error) {
|
||||
if sdm.GetUserAPIKeyInfoFn != nil {
|
||||
return sdm.GetUserAPIKeyInfoFn(hashedKey)
|
||||
}
|
||||
|
@ -481,7 +486,7 @@ func (sdm RepoDBMock) GetUserAPIKeyInfo(hashedKey string) (string, error) {
|
|||
return "", nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) AddUserAPIKey(ctx context.Context, hashedKey string, apiKeyDetails *repodb.APIKeyDetails) error {
|
||||
func (sdm MetaDBMock) AddUserAPIKey(ctx context.Context, hashedKey string, apiKeyDetails *mTypes.APIKeyDetails) error {
|
||||
if sdm.AddUserAPIKeyFn != nil {
|
||||
return sdm.AddUserAPIKeyFn(ctx, hashedKey, apiKeyDetails)
|
||||
}
|
||||
|
@ -489,7 +494,7 @@ func (sdm RepoDBMock) AddUserAPIKey(ctx context.Context, hashedKey string, apiKe
|
|||
return nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) UpdateUserAPIKeyLastUsed(ctx context.Context, hashedKey string) error {
|
||||
func (sdm MetaDBMock) UpdateUserAPIKeyLastUsed(ctx context.Context, hashedKey string) error {
|
||||
if sdm.UpdateUserAPIKeyLastUsedFn != nil {
|
||||
return sdm.UpdateUserAPIKeyLastUsedFn(ctx, hashedKey)
|
||||
}
|
||||
|
@ -497,7 +502,7 @@ func (sdm RepoDBMock) UpdateUserAPIKeyLastUsed(ctx context.Context, hashedKey st
|
|||
return nil
|
||||
}
|
||||
|
||||
func (sdm RepoDBMock) DeleteUserAPIKey(ctx context.Context, id string) error {
|
||||
func (sdm MetaDBMock) DeleteUserAPIKey(ctx context.Context, id string) error {
|
||||
if sdm.DeleteUserAPIKeyFn != nil {
|
||||
return sdm.DeleteUserAPIKeyFn(ctx, id)
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue