mirror of
https://github.com/project-zot/zot.git
synced 2025-01-20 22:52:51 -05:00
refactor: Centralise extensions config entries (#1177)
Except for registry sync config Signed-off-by: Bogdan BIVOLARU <104334+bogdanbiv@users.noreply.github.com>
This commit is contained in:
parent
4aa0106b0a
commit
7c3bf86a6b
10 changed files with 360 additions and 344 deletions
|
@ -3,7 +3,7 @@ package config
|
||||||
import (
|
import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"zotregistry.io/zot/pkg/extensions/sync"
|
"zotregistry.io/zot/pkg/extensions/config/sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
// BaseConfig has params applicable to all extensions.
|
// BaseConfig has params applicable to all extensions.
|
||||||
|
|
43
pkg/extensions/config/sync/config.go
Normal file
43
pkg/extensions/config/sync/config.go
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
package sync
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// key is registry address.
|
||||||
|
type CredentialsFile map[string]Credentials
|
||||||
|
|
||||||
|
type Credentials struct {
|
||||||
|
Username string
|
||||||
|
Password string
|
||||||
|
}
|
||||||
|
|
||||||
|
type Config struct {
|
||||||
|
Enable *bool
|
||||||
|
CredentialsFile string
|
||||||
|
Registries []RegistryConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
type RegistryConfig struct {
|
||||||
|
URLs []string
|
||||||
|
PollInterval time.Duration
|
||||||
|
Content []Content
|
||||||
|
TLSVerify *bool
|
||||||
|
OnDemand bool
|
||||||
|
CertDir string
|
||||||
|
MaxRetries *int
|
||||||
|
RetryDelay *time.Duration
|
||||||
|
OnlySigned *bool
|
||||||
|
}
|
||||||
|
|
||||||
|
type Content struct {
|
||||||
|
Prefix string
|
||||||
|
Tags *Tags
|
||||||
|
Destination string `mapstructure:",omitempty"`
|
||||||
|
StripPrefix bool
|
||||||
|
}
|
||||||
|
|
||||||
|
type Tags struct {
|
||||||
|
Regex *string
|
||||||
|
Semver *bool
|
||||||
|
}
|
|
@ -12,7 +12,7 @@ import (
|
||||||
"zotregistry.io/zot/pkg/api"
|
"zotregistry.io/zot/pkg/api"
|
||||||
"zotregistry.io/zot/pkg/api/config"
|
"zotregistry.io/zot/pkg/api/config"
|
||||||
extconf "zotregistry.io/zot/pkg/extensions/config"
|
extconf "zotregistry.io/zot/pkg/extensions/config"
|
||||||
"zotregistry.io/zot/pkg/extensions/sync"
|
syncconf "zotregistry.io/zot/pkg/extensions/config/sync"
|
||||||
"zotregistry.io/zot/pkg/test"
|
"zotregistry.io/zot/pkg/test"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -23,9 +23,9 @@ func TestEnableExtension(t *testing.T) {
|
||||||
conf := config.New()
|
conf := config.New()
|
||||||
falseValue := false
|
falseValue := false
|
||||||
|
|
||||||
syncConfig := &sync.Config{
|
syncConfig := &syncconf.Config{
|
||||||
Enable: &falseValue,
|
Enable: &falseValue,
|
||||||
Registries: []sync.RegistryConfig{},
|
Registries: []syncconf.RegistryConfig{},
|
||||||
}
|
}
|
||||||
|
|
||||||
// conf.Extensions.Sync.Enable = &falseValue
|
// conf.Extensions.Sync.Enable = &falseValue
|
||||||
|
|
|
@ -16,6 +16,7 @@ import (
|
||||||
ispec "github.com/opencontainers/image-spec/specs-go/v1"
|
ispec "github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
|
|
||||||
"zotregistry.io/zot/pkg/common"
|
"zotregistry.io/zot/pkg/common"
|
||||||
|
syncconf "zotregistry.io/zot/pkg/extensions/config/sync"
|
||||||
"zotregistry.io/zot/pkg/log"
|
"zotregistry.io/zot/pkg/log"
|
||||||
"zotregistry.io/zot/pkg/storage"
|
"zotregistry.io/zot/pkg/storage"
|
||||||
)
|
)
|
||||||
|
@ -58,7 +59,7 @@ func (di *demandedImages) delete(key string) {
|
||||||
di.syncedMap.Delete(key)
|
di.syncedMap.Delete(key)
|
||||||
}
|
}
|
||||||
|
|
||||||
func OneImage(ctx context.Context, cfg Config, storeController storage.StoreController,
|
func OneImage(ctx context.Context, cfg syncconf.Config, storeController storage.StoreController,
|
||||||
repo, reference string, artifactType string, log log.Logger,
|
repo, reference string, artifactType string, log log.Logger,
|
||||||
) error {
|
) error {
|
||||||
// guard against multiple parallel requests
|
// guard against multiple parallel requests
|
||||||
|
@ -91,10 +92,11 @@ func OneImage(ctx context.Context, cfg Config, storeController storage.StoreCont
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func syncOneImage(ctx context.Context, imageChannel chan error, cfg Config, storeController storage.StoreController,
|
func syncOneImage(ctx context.Context, imageChannel chan error,
|
||||||
|
cfg syncconf.Config, storeController storage.StoreController,
|
||||||
localRepo, reference string, artifactType string, log log.Logger,
|
localRepo, reference string, artifactType string, log log.Logger,
|
||||||
) {
|
) {
|
||||||
var credentialsFile CredentialsFile
|
var credentialsFile syncconf.CredentialsFile
|
||||||
|
|
||||||
if cfg.CredentialsFile != "" {
|
if cfg.CredentialsFile != "" {
|
||||||
var err error
|
var err error
|
||||||
|
@ -258,7 +260,7 @@ func syncOneImage(ctx context.Context, imageChannel chan error, cfg Config, stor
|
||||||
imageChannel <- nil
|
imageChannel <- nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func syncRun(regCfg RegistryConfig,
|
func syncRun(regCfg syncconf.RegistryConfig,
|
||||||
localRepo, upstreamRepo, reference string, utils syncContextUtils, sig *signaturesCopier,
|
localRepo, upstreamRepo, reference string, utils syncContextUtils, sig *signaturesCopier,
|
||||||
log log.Logger,
|
log log.Logger,
|
||||||
) (bool, error) {
|
) (bool, error) {
|
||||||
|
|
|
@ -18,6 +18,7 @@ import (
|
||||||
zerr "zotregistry.io/zot/errors"
|
zerr "zotregistry.io/zot/errors"
|
||||||
"zotregistry.io/zot/pkg/api/constants"
|
"zotregistry.io/zot/pkg/api/constants"
|
||||||
"zotregistry.io/zot/pkg/common"
|
"zotregistry.io/zot/pkg/common"
|
||||||
|
syncconf "zotregistry.io/zot/pkg/extensions/config/sync"
|
||||||
"zotregistry.io/zot/pkg/log"
|
"zotregistry.io/zot/pkg/log"
|
||||||
"zotregistry.io/zot/pkg/storage"
|
"zotregistry.io/zot/pkg/storage"
|
||||||
)
|
)
|
||||||
|
@ -26,11 +27,12 @@ type signaturesCopier struct {
|
||||||
client *http.Client
|
client *http.Client
|
||||||
upstreamURL url.URL
|
upstreamURL url.URL
|
||||||
storeController storage.StoreController
|
storeController storage.StoreController
|
||||||
credentials Credentials
|
credentials syncconf.Credentials
|
||||||
log log.Logger
|
log log.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func newSignaturesCopier(httpClient *http.Client, credentials Credentials, upstreamURL url.URL,
|
func newSignaturesCopier(httpClient *http.Client, credentials syncconf.Credentials,
|
||||||
|
upstreamURL url.URL,
|
||||||
storeController storage.StoreController, log log.Logger,
|
storeController storage.StoreController, log log.Logger,
|
||||||
) *signaturesCopier {
|
) *signaturesCopier {
|
||||||
return &signaturesCopier{
|
return &signaturesCopier{
|
||||||
|
|
|
@ -23,6 +23,7 @@ import (
|
||||||
zerr "zotregistry.io/zot/errors"
|
zerr "zotregistry.io/zot/errors"
|
||||||
"zotregistry.io/zot/pkg/api/constants"
|
"zotregistry.io/zot/pkg/api/constants"
|
||||||
"zotregistry.io/zot/pkg/common"
|
"zotregistry.io/zot/pkg/common"
|
||||||
|
syncconf "zotregistry.io/zot/pkg/extensions/config/sync"
|
||||||
"zotregistry.io/zot/pkg/log"
|
"zotregistry.io/zot/pkg/log"
|
||||||
"zotregistry.io/zot/pkg/storage"
|
"zotregistry.io/zot/pkg/storage"
|
||||||
"zotregistry.io/zot/pkg/test"
|
"zotregistry.io/zot/pkg/test"
|
||||||
|
@ -38,44 +39,6 @@ type catalog struct {
|
||||||
Repositories []string `json:"repositories"`
|
Repositories []string `json:"repositories"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// key is registry address.
|
|
||||||
type CredentialsFile map[string]Credentials
|
|
||||||
|
|
||||||
type Credentials struct {
|
|
||||||
Username string
|
|
||||||
Password string
|
|
||||||
}
|
|
||||||
|
|
||||||
type Config struct {
|
|
||||||
Enable *bool
|
|
||||||
CredentialsFile string
|
|
||||||
Registries []RegistryConfig
|
|
||||||
}
|
|
||||||
|
|
||||||
type RegistryConfig struct {
|
|
||||||
URLs []string
|
|
||||||
PollInterval time.Duration
|
|
||||||
Content []Content
|
|
||||||
TLSVerify *bool
|
|
||||||
OnDemand bool
|
|
||||||
CertDir string
|
|
||||||
MaxRetries *int
|
|
||||||
RetryDelay *time.Duration
|
|
||||||
OnlySigned *bool
|
|
||||||
}
|
|
||||||
|
|
||||||
type Content struct {
|
|
||||||
Prefix string
|
|
||||||
Tags *Tags
|
|
||||||
Destination string `mapstructure:",omitempty"`
|
|
||||||
StripPrefix bool
|
|
||||||
}
|
|
||||||
|
|
||||||
type Tags struct {
|
|
||||||
Regex *string
|
|
||||||
Semver *bool
|
|
||||||
}
|
|
||||||
|
|
||||||
type RepoReferences struct {
|
type RepoReferences struct {
|
||||||
contentID int // matched registry config content
|
contentID int // matched registry config content
|
||||||
name string // repo name
|
name string // repo name
|
||||||
|
@ -103,7 +66,7 @@ func GetUpstreamCatalog(client *http.Client, upstreamURL, username, password str
|
||||||
|
|
||||||
// imagesToCopyFromRepos lists all images given a registry name and its repos.
|
// imagesToCopyFromRepos lists all images given a registry name and its repos.
|
||||||
func imagesToCopyFromUpstream(ctx context.Context, registryName string, repoName string,
|
func imagesToCopyFromUpstream(ctx context.Context, registryName string, repoName string,
|
||||||
upstreamCtx *types.SystemContext, content Content, log log.Logger,
|
upstreamCtx *types.SystemContext, content syncconf.Content, log log.Logger,
|
||||||
) ([]types.ImageReference, error) {
|
) ([]types.ImageReference, error) {
|
||||||
imageRefs := []types.ImageReference{}
|
imageRefs := []types.ImageReference{}
|
||||||
|
|
||||||
|
@ -179,7 +142,7 @@ func getCopyOptions(upstreamCtx, localCtx *types.SystemContext) copy.Options {
|
||||||
return options
|
return options
|
||||||
}
|
}
|
||||||
|
|
||||||
func getUpstreamContext(regCfg *RegistryConfig, credentials Credentials) *types.SystemContext {
|
func getUpstreamContext(regCfg *syncconf.RegistryConfig, credentials syncconf.Credentials) *types.SystemContext {
|
||||||
upstreamCtx := &types.SystemContext{}
|
upstreamCtx := &types.SystemContext{}
|
||||||
upstreamCtx.DockerCertPath = regCfg.CertDir
|
upstreamCtx.DockerCertPath = regCfg.CertDir
|
||||||
upstreamCtx.DockerDaemonCertPath = regCfg.CertDir
|
upstreamCtx.DockerDaemonCertPath = regCfg.CertDir
|
||||||
|
@ -192,7 +155,7 @@ func getUpstreamContext(regCfg *RegistryConfig, credentials Credentials) *types.
|
||||||
upstreamCtx.DockerInsecureSkipTLSVerify = types.NewOptionalBool(true)
|
upstreamCtx.DockerInsecureSkipTLSVerify = types.NewOptionalBool(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
if credentials != (Credentials{}) {
|
if credentials != (syncconf.Credentials{}) {
|
||||||
upstreamCtx.DockerAuthConfig = &types.DockerAuthConfig{
|
upstreamCtx.DockerAuthConfig = &types.DockerAuthConfig{
|
||||||
Username: credentials.Username,
|
Username: credentials.Username,
|
||||||
Password: credentials.Password,
|
Password: credentials.Password,
|
||||||
|
@ -203,10 +166,10 @@ func getUpstreamContext(regCfg *RegistryConfig, credentials Credentials) *types.
|
||||||
}
|
}
|
||||||
|
|
||||||
//nolint:gocyclo // offloading some of the functionalities from here would make the code harder to follow
|
//nolint:gocyclo // offloading some of the functionalities from here would make the code harder to follow
|
||||||
func syncRegistry(ctx context.Context, regCfg RegistryConfig,
|
func syncRegistry(ctx context.Context, regCfg syncconf.RegistryConfig,
|
||||||
upstreamURL string,
|
upstreamURL string,
|
||||||
storeController storage.StoreController, localCtx *types.SystemContext,
|
storeController storage.StoreController, localCtx *types.SystemContext,
|
||||||
policyCtx *signature.PolicyContext, credentials Credentials,
|
policyCtx *signature.PolicyContext, credentials syncconf.Credentials,
|
||||||
retryOptions *retry.RetryOptions, log log.Logger,
|
retryOptions *retry.RetryOptions, log log.Logger,
|
||||||
) error {
|
) error {
|
||||||
log.Info().Msgf("syncing registry: %s", upstreamURL)
|
log.Info().Msgf("syncing registry: %s", upstreamURL)
|
||||||
|
@ -266,8 +229,8 @@ func syncRegistry(ctx context.Context, regCfg RegistryConfig,
|
||||||
var imageReferences []types.ImageReference
|
var imageReferences []types.ImageReference
|
||||||
|
|
||||||
if err = retry.RetryIfNecessary(ctx, func() error {
|
if err = retry.RetryIfNecessary(ctx, func() error {
|
||||||
imageReferences, err = imagesToCopyFromUpstream(ctx, upstreamAddr, repoName, upstreamCtx,
|
imageReferences, err = imagesToCopyFromUpstream(ctx, upstreamAddr,
|
||||||
regCfg.Content[contentID], log)
|
repoName, upstreamCtx, regCfg.Content[contentID], log)
|
||||||
|
|
||||||
return err
|
return err
|
||||||
}, retryOptions); err != nil {
|
}, retryOptions); err != nil {
|
||||||
|
@ -458,11 +421,11 @@ func getLocalContexts(log log.Logger) (*types.SystemContext, *signature.PolicyCo
|
||||||
return localCtx, policyContext, nil
|
return localCtx, policyContext, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func Run(ctx context.Context, cfg Config,
|
func Run(ctx context.Context, cfg syncconf.Config,
|
||||||
storeController storage.StoreController,
|
storeController storage.StoreController,
|
||||||
wtgrp *goSync.WaitGroup, logger log.Logger,
|
wtgrp *goSync.WaitGroup, logger log.Logger,
|
||||||
) error {
|
) error {
|
||||||
var credentialsFile CredentialsFile
|
var credentialsFile syncconf.CredentialsFile
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
|
@ -509,7 +472,7 @@ func Run(ctx context.Context, cfg Config,
|
||||||
}
|
}
|
||||||
|
|
||||||
// schedule each registry sync
|
// schedule each registry sync
|
||||||
go func(ctx context.Context, regCfg RegistryConfig, logger log.Logger) {
|
go func(ctx context.Context, regCfg syncconf.RegistryConfig, logger log.Logger) {
|
||||||
for {
|
for {
|
||||||
// increment reference since will be busy, so shutdown has to wait
|
// increment reference since will be busy, so shutdown has to wait
|
||||||
wtgrp.Add(1)
|
wtgrp.Add(1)
|
||||||
|
|
|
@ -13,7 +13,7 @@ import (
|
||||||
"zotregistry.io/zot/pkg/api"
|
"zotregistry.io/zot/pkg/api"
|
||||||
"zotregistry.io/zot/pkg/api/config"
|
"zotregistry.io/zot/pkg/api/config"
|
||||||
extconf "zotregistry.io/zot/pkg/extensions/config"
|
extconf "zotregistry.io/zot/pkg/extensions/config"
|
||||||
"zotregistry.io/zot/pkg/extensions/sync"
|
syncconf "zotregistry.io/zot/pkg/extensions/config/sync"
|
||||||
"zotregistry.io/zot/pkg/test"
|
"zotregistry.io/zot/pkg/test"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -34,7 +34,7 @@ func TestSyncExtension(t *testing.T) {
|
||||||
conf.Storage.RootDirectory = globalDir
|
conf.Storage.RootDirectory = globalDir
|
||||||
conf.Storage.Commit = true
|
conf.Storage.Commit = true
|
||||||
conf.Extensions = &extconf.ExtensionConfig{}
|
conf.Extensions = &extconf.ExtensionConfig{}
|
||||||
conf.Extensions.Sync = &sync.Config{
|
conf.Extensions.Sync = &syncconf.Config{
|
||||||
Enable: &defaultValue,
|
Enable: &defaultValue,
|
||||||
}
|
}
|
||||||
conf.Log.Level = "warn"
|
conf.Log.Level = "warn"
|
||||||
|
|
|
@ -24,6 +24,7 @@ import (
|
||||||
|
|
||||||
"zotregistry.io/zot/errors"
|
"zotregistry.io/zot/errors"
|
||||||
. "zotregistry.io/zot/pkg/common"
|
. "zotregistry.io/zot/pkg/common"
|
||||||
|
syncconf "zotregistry.io/zot/pkg/extensions/config/sync"
|
||||||
"zotregistry.io/zot/pkg/extensions/monitoring"
|
"zotregistry.io/zot/pkg/extensions/monitoring"
|
||||||
"zotregistry.io/zot/pkg/log"
|
"zotregistry.io/zot/pkg/log"
|
||||||
"zotregistry.io/zot/pkg/storage"
|
"zotregistry.io/zot/pkg/storage"
|
||||||
|
@ -133,8 +134,8 @@ func TestSyncInternal(t *testing.T) {
|
||||||
updateDuration := time.Microsecond
|
updateDuration := time.Microsecond
|
||||||
port := test.GetFreePort()
|
port := test.GetFreePort()
|
||||||
baseURL := test.GetBaseURL(port)
|
baseURL := test.GetBaseURL(port)
|
||||||
syncRegistryConfig := RegistryConfig{
|
syncRegistryConfig := syncconf.RegistryConfig{
|
||||||
Content: []Content{
|
Content: []syncconf.Content{
|
||||||
{
|
{
|
||||||
Prefix: testImage,
|
Prefix: testImage,
|
||||||
},
|
},
|
||||||
|
@ -146,8 +147,8 @@ func TestSyncInternal(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
defaultValue := true
|
defaultValue := true
|
||||||
cfg := Config{
|
cfg := syncconf.Config{
|
||||||
Registries: []RegistryConfig{syncRegistryConfig},
|
Registries: []syncconf.RegistryConfig{syncRegistryConfig},
|
||||||
Enable: &defaultValue,
|
Enable: &defaultValue,
|
||||||
CredentialsFile: "/invalid/path/to/file",
|
CredentialsFile: "/invalid/path/to/file",
|
||||||
}
|
}
|
||||||
|
@ -165,8 +166,8 @@ func TestSyncInternal(t *testing.T) {
|
||||||
updateDuration := time.Microsecond
|
updateDuration := time.Microsecond
|
||||||
port := test.GetFreePort()
|
port := test.GetFreePort()
|
||||||
baseURL := test.GetBaseURL(port)
|
baseURL := test.GetBaseURL(port)
|
||||||
syncRegistryConfig := RegistryConfig{
|
syncRegistryConfig := syncconf.RegistryConfig{
|
||||||
Content: []Content{
|
Content: []syncconf.Content{
|
||||||
{
|
{
|
||||||
Prefix: testImage,
|
Prefix: testImage,
|
||||||
},
|
},
|
||||||
|
@ -190,7 +191,8 @@ func TestSyncInternal(t *testing.T) {
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
|
|
||||||
err = syncRegistry(ctx, syncRegistryConfig, "randomUpstreamURL",
|
err = syncRegistry(ctx, syncRegistryConfig, "randomUpstreamURL",
|
||||||
storage.StoreController{DefaultStore: imageStore}, localCtx, policyCtx, Credentials{}, nil, log)
|
storage.StoreController{DefaultStore: imageStore}, localCtx, policyCtx,
|
||||||
|
syncconf.Credentials{}, nil, log)
|
||||||
So(err, ShouldNotBeNil)
|
So(err, ShouldNotBeNil)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -240,8 +242,8 @@ func TestSyncInternal(t *testing.T) {
|
||||||
Convey("Test getUpstreamCatalog() with missing certs", t, func() {
|
Convey("Test getUpstreamCatalog() with missing certs", t, func() {
|
||||||
var tlsVerify bool
|
var tlsVerify bool
|
||||||
updateDuration := time.Microsecond
|
updateDuration := time.Microsecond
|
||||||
syncRegistryConfig := RegistryConfig{
|
syncRegistryConfig := syncconf.RegistryConfig{
|
||||||
Content: []Content{
|
Content: []syncconf.Content{
|
||||||
{
|
{
|
||||||
Prefix: testImage,
|
Prefix: testImage,
|
||||||
},
|
},
|
||||||
|
@ -276,8 +278,8 @@ func TestSyncInternal(t *testing.T) {
|
||||||
baseURL := test.GetBaseURL(port)
|
baseURL := test.GetBaseURL(port)
|
||||||
baseSecureURL := test.GetSecureBaseURL(port)
|
baseSecureURL := test.GetSecureBaseURL(port)
|
||||||
|
|
||||||
syncRegistryConfig := RegistryConfig{
|
syncRegistryConfig := syncconf.RegistryConfig{
|
||||||
Content: []Content{
|
Content: []syncconf.Content{
|
||||||
{
|
{
|
||||||
Prefix: testImage,
|
Prefix: testImage,
|
||||||
},
|
},
|
||||||
|
@ -340,12 +342,12 @@ func TestSyncInternal(t *testing.T) {
|
||||||
Convey("Test imagesToCopyFromUpstream()", t, func() {
|
Convey("Test imagesToCopyFromUpstream()", t, func() {
|
||||||
upstreamCtx := &types.SystemContext{}
|
upstreamCtx := &types.SystemContext{}
|
||||||
|
|
||||||
_, err := imagesToCopyFromUpstream(context.Background(), "localhost:4566", "repo1", upstreamCtx,
|
_, err := imagesToCopyFromUpstream(context.Background(), "localhost:4566", "repo1",
|
||||||
Content{}, log.NewLogger("debug", ""))
|
upstreamCtx, syncconf.Content{}, log.NewLogger("debug", ""))
|
||||||
So(err, ShouldNotBeNil)
|
So(err, ShouldNotBeNil)
|
||||||
|
|
||||||
_, err = imagesToCopyFromUpstream(context.Background(), "docker://localhost:4566", "repo1", upstreamCtx,
|
_, err = imagesToCopyFromUpstream(context.Background(), "docker://localhost:4566", "repo1",
|
||||||
Content{}, log.NewLogger("debug", ""))
|
upstreamCtx, syncconf.Content{}, log.NewLogger("debug", ""))
|
||||||
So(err, ShouldNotBeNil)
|
So(err, ShouldNotBeNil)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -377,7 +379,8 @@ func TestSyncInternal(t *testing.T) {
|
||||||
false, false, log, metrics, nil, nil,
|
false, false, log, metrics, nil, nil,
|
||||||
)
|
)
|
||||||
|
|
||||||
sig := newSignaturesCopier(client, Credentials{}, *regURL, storage.StoreController{DefaultStore: imageStore}, log)
|
sig := newSignaturesCopier(client, syncconf.Credentials{},
|
||||||
|
*regURL, storage.StoreController{DefaultStore: imageStore}, log)
|
||||||
|
|
||||||
err = sig.syncCosignSignature(testImage, testImage, testImageTag, &ispec.Manifest{})
|
err = sig.syncCosignSignature(testImage, testImage, testImageTag, &ispec.Manifest{})
|
||||||
So(err, ShouldNotBeNil)
|
So(err, ShouldNotBeNil)
|
||||||
|
@ -427,7 +430,8 @@ func TestSyncInternal(t *testing.T) {
|
||||||
So(regURL, ShouldNotBeNil)
|
So(regURL, ShouldNotBeNil)
|
||||||
|
|
||||||
client := &http.Client{}
|
client := &http.Client{}
|
||||||
sig := newSignaturesCopier(client, Credentials{}, *regURL, storage.StoreController{DefaultStore: imageStore}, log)
|
sig := newSignaturesCopier(client, syncconf.Credentials{},
|
||||||
|
*regURL, storage.StoreController{DefaultStore: imageStore}, log)
|
||||||
|
|
||||||
canBeSkipped, err = sig.canSkipOCIRefs(testImage, testImageManifestDigest.String(), refs)
|
canBeSkipped, err = sig.canSkipOCIRefs(testImage, testImageManifestDigest.String(), refs)
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
|
@ -544,7 +548,7 @@ func TestSyncInternal(t *testing.T) {
|
||||||
|
|
||||||
Convey("Test filterRepos()", t, func() {
|
Convey("Test filterRepos()", t, func() {
|
||||||
repos := []string{"repo", "repo1", "repo2", "repo/repo2", "repo/repo2/repo3/repo4"}
|
repos := []string{"repo", "repo1", "repo2", "repo/repo2", "repo/repo2/repo3/repo4"}
|
||||||
contents := []Content{
|
contents := []syncconf.Content{
|
||||||
{
|
{
|
||||||
Prefix: "repo",
|
Prefix: "repo",
|
||||||
},
|
},
|
||||||
|
@ -560,7 +564,7 @@ func TestSyncInternal(t *testing.T) {
|
||||||
So(filteredRepos[1], ShouldResemble, []string{"repo/repo2", "repo/repo2/repo3/repo4"})
|
So(filteredRepos[1], ShouldResemble, []string{"repo/repo2", "repo/repo2/repo3/repo4"})
|
||||||
So(filteredRepos[2], ShouldResemble, []string{"repo1", "repo2"})
|
So(filteredRepos[2], ShouldResemble, []string{"repo1", "repo2"})
|
||||||
|
|
||||||
contents = []Content{
|
contents = []syncconf.Content{
|
||||||
{
|
{
|
||||||
Prefix: "[repo%#@",
|
Prefix: "[repo%#@",
|
||||||
},
|
},
|
||||||
|
@ -833,52 +837,52 @@ func TestSyncInternal(t *testing.T) {
|
||||||
func TestURLHelperFunctions(t *testing.T) {
|
func TestURLHelperFunctions(t *testing.T) {
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
repo string
|
repo string
|
||||||
content Content
|
content syncconf.Content
|
||||||
expected string
|
expected string
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
repo: "alpine/zot-fold/alpine",
|
repo: "alpine/zot-fold/alpine",
|
||||||
content: Content{Prefix: "zot-fold/alpine", Destination: "/alpine", StripPrefix: false},
|
content: syncconf.Content{Prefix: "zot-fold/alpine", Destination: "/alpine", StripPrefix: false},
|
||||||
expected: "zot-fold/alpine",
|
expected: "zot-fold/alpine",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
repo: "zot-fold/alpine",
|
repo: "zot-fold/alpine",
|
||||||
content: Content{Prefix: "zot-fold/alpine", Destination: "/", StripPrefix: false},
|
content: syncconf.Content{Prefix: "zot-fold/alpine", Destination: "/", StripPrefix: false},
|
||||||
expected: "zot-fold/alpine",
|
expected: "zot-fold/alpine",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
repo: "alpine",
|
repo: "alpine",
|
||||||
content: Content{Prefix: "zot-fold/alpine", Destination: "/alpine", StripPrefix: true},
|
content: syncconf.Content{Prefix: "zot-fold/alpine", Destination: "/alpine", StripPrefix: true},
|
||||||
expected: "zot-fold/alpine",
|
expected: "zot-fold/alpine",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
repo: "/",
|
repo: "/",
|
||||||
content: Content{Prefix: "zot-fold/alpine", Destination: "/", StripPrefix: true},
|
content: syncconf.Content{Prefix: "zot-fold/alpine", Destination: "/", StripPrefix: true},
|
||||||
expected: "zot-fold/alpine",
|
expected: "zot-fold/alpine",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
repo: "/",
|
repo: "/",
|
||||||
content: Content{Prefix: "/", Destination: "/", StripPrefix: true},
|
content: syncconf.Content{Prefix: "/", Destination: "/", StripPrefix: true},
|
||||||
expected: "/",
|
expected: "/",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
repo: "alpine",
|
repo: "alpine",
|
||||||
content: Content{Prefix: "zot-fold/alpine", Destination: "/alpine", StripPrefix: true},
|
content: syncconf.Content{Prefix: "zot-fold/alpine", Destination: "/alpine", StripPrefix: true},
|
||||||
expected: "zot-fold/alpine",
|
expected: "zot-fold/alpine",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
repo: "alpine",
|
repo: "alpine",
|
||||||
content: Content{Prefix: "zot-fold/*", Destination: "/", StripPrefix: true},
|
content: syncconf.Content{Prefix: "zot-fold/*", Destination: "/", StripPrefix: true},
|
||||||
expected: "zot-fold/alpine",
|
expected: "zot-fold/alpine",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
repo: "alpine",
|
repo: "alpine",
|
||||||
content: Content{Prefix: "zot-fold/**", Destination: "/", StripPrefix: true},
|
content: syncconf.Content{Prefix: "zot-fold/**", Destination: "/", StripPrefix: true},
|
||||||
expected: "zot-fold/alpine",
|
expected: "zot-fold/alpine",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
repo: "zot-fold/alpine",
|
repo: "zot-fold/alpine",
|
||||||
content: Content{Prefix: "zot-fold/**", Destination: "/", StripPrefix: false},
|
content: syncconf.Content{Prefix: "zot-fold/**", Destination: "/", StripPrefix: false},
|
||||||
expected: "zot-fold/alpine",
|
expected: "zot-fold/alpine",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -902,7 +906,7 @@ func TestURLHelperFunctions(t *testing.T) {
|
||||||
func TestFindRepoMatchingContentID(t *testing.T) {
|
func TestFindRepoMatchingContentID(t *testing.T) {
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
repo string
|
repo string
|
||||||
content []Content
|
content []syncconf.Content
|
||||||
expected struct {
|
expected struct {
|
||||||
contentID int
|
contentID int
|
||||||
err error
|
err error
|
||||||
|
@ -910,7 +914,7 @@ func TestFindRepoMatchingContentID(t *testing.T) {
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
repo: "alpine/zot-fold/alpine",
|
repo: "alpine/zot-fold/alpine",
|
||||||
content: []Content{
|
content: []syncconf.Content{
|
||||||
{Prefix: "zot-fold/alpine/", Destination: "/alpine", StripPrefix: true},
|
{Prefix: "zot-fold/alpine/", Destination: "/alpine", StripPrefix: true},
|
||||||
{Prefix: "zot-fold/alpine", Destination: "/alpine", StripPrefix: false},
|
{Prefix: "zot-fold/alpine", Destination: "/alpine", StripPrefix: false},
|
||||||
},
|
},
|
||||||
|
@ -921,7 +925,7 @@ func TestFindRepoMatchingContentID(t *testing.T) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
repo: "alpine/zot-fold/alpine",
|
repo: "alpine/zot-fold/alpine",
|
||||||
content: []Content{
|
content: []syncconf.Content{
|
||||||
{Prefix: "zot-fold/*", Destination: "/alpine", StripPrefix: false},
|
{Prefix: "zot-fold/*", Destination: "/alpine", StripPrefix: false},
|
||||||
{Prefix: "zot-fold/alpine", Destination: "/alpine", StripPrefix: true},
|
{Prefix: "zot-fold/alpine", Destination: "/alpine", StripPrefix: true},
|
||||||
},
|
},
|
||||||
|
@ -932,7 +936,7 @@ func TestFindRepoMatchingContentID(t *testing.T) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
repo: "myFold/zot-fold/internal/alpine",
|
repo: "myFold/zot-fold/internal/alpine",
|
||||||
content: []Content{
|
content: []syncconf.Content{
|
||||||
{Prefix: "zot-fold/alpine", Destination: "/alpine", StripPrefix: true},
|
{Prefix: "zot-fold/alpine", Destination: "/alpine", StripPrefix: true},
|
||||||
{Prefix: "zot-fold/**", Destination: "/myFold", StripPrefix: false},
|
{Prefix: "zot-fold/**", Destination: "/myFold", StripPrefix: false},
|
||||||
},
|
},
|
||||||
|
@ -943,7 +947,7 @@ func TestFindRepoMatchingContentID(t *testing.T) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
repo: "alpine",
|
repo: "alpine",
|
||||||
content: []Content{
|
content: []syncconf.Content{
|
||||||
{Prefix: "zot-fold/*", Destination: "/alpine", StripPrefix: true},
|
{Prefix: "zot-fold/*", Destination: "/alpine", StripPrefix: true},
|
||||||
{Prefix: "zot-fold/alpine", Destination: "/", StripPrefix: true},
|
{Prefix: "zot-fold/alpine", Destination: "/", StripPrefix: true},
|
||||||
},
|
},
|
||||||
|
@ -954,7 +958,7 @@ func TestFindRepoMatchingContentID(t *testing.T) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
repo: "alpine",
|
repo: "alpine",
|
||||||
content: []Content{
|
content: []syncconf.Content{
|
||||||
{Prefix: "zot-fold/*", Destination: "/alpine", StripPrefix: true},
|
{Prefix: "zot-fold/*", Destination: "/alpine", StripPrefix: true},
|
||||||
{Prefix: "zot-fold/*", Destination: "/", StripPrefix: true},
|
{Prefix: "zot-fold/*", Destination: "/", StripPrefix: true},
|
||||||
},
|
},
|
||||||
|
@ -965,7 +969,7 @@ func TestFindRepoMatchingContentID(t *testing.T) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
repo: "alpine/alpine",
|
repo: "alpine/alpine",
|
||||||
content: []Content{
|
content: []syncconf.Content{
|
||||||
{Prefix: "zot-fold/*", Destination: "/alpine", StripPrefix: true},
|
{Prefix: "zot-fold/*", Destination: "/alpine", StripPrefix: true},
|
||||||
{Prefix: "zot-fold/*", Destination: "/", StripPrefix: true},
|
{Prefix: "zot-fold/*", Destination: "/", StripPrefix: true},
|
||||||
},
|
},
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -26,6 +26,7 @@ import (
|
||||||
|
|
||||||
zerr "zotregistry.io/zot/errors"
|
zerr "zotregistry.io/zot/errors"
|
||||||
"zotregistry.io/zot/pkg/common"
|
"zotregistry.io/zot/pkg/common"
|
||||||
|
syncconf "zotregistry.io/zot/pkg/extensions/config/sync"
|
||||||
"zotregistry.io/zot/pkg/extensions/monitoring"
|
"zotregistry.io/zot/pkg/extensions/monitoring"
|
||||||
"zotregistry.io/zot/pkg/log"
|
"zotregistry.io/zot/pkg/log"
|
||||||
"zotregistry.io/zot/pkg/storage"
|
"zotregistry.io/zot/pkg/storage"
|
||||||
|
@ -121,7 +122,7 @@ func parseRepositoryReference(input string) (reference.Named, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// filterRepos filters repos based on prefix given in the config.
|
// filterRepos filters repos based on prefix given in the config.
|
||||||
func filterRepos(repos []string, contentList []Content, log log.Logger) map[int][]string {
|
func filterRepos(repos []string, contentList []syncconf.Content, log log.Logger) map[int][]string {
|
||||||
filtered := make(map[int][]string)
|
filtered := make(map[int][]string)
|
||||||
|
|
||||||
for _, repo := range repos {
|
for _, repo := range repos {
|
||||||
|
@ -155,7 +156,7 @@ func filterRepos(repos []string, contentList []Content, log log.Logger) map[int]
|
||||||
}
|
}
|
||||||
|
|
||||||
// findRepoContentID return the contentID that maches the localRepo path for a given RegistryConfig in the config file.
|
// findRepoContentID return the contentID that maches the localRepo path for a given RegistryConfig in the config file.
|
||||||
func findRepoMatchingContentID(localRepo string, contentList []Content) (int, error) {
|
func findRepoMatchingContentID(localRepo string, contentList []syncconf.Content) (int, error) {
|
||||||
contentID := -1
|
contentID := -1
|
||||||
localRepo = strings.Trim(localRepo, "/")
|
localRepo = strings.Trim(localRepo, "/")
|
||||||
|
|
||||||
|
@ -194,7 +195,7 @@ func findRepoMatchingContentID(localRepo string, contentList []Content) (int, er
|
||||||
return contentID, nil
|
return contentID, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func getRepoSource(localRepo string, content Content) string {
|
func getRepoSource(localRepo string, content syncconf.Content) string {
|
||||||
localRepo = strings.Trim(localRepo, "/")
|
localRepo = strings.Trim(localRepo, "/")
|
||||||
destination := strings.Trim(content.Destination, "/")
|
destination := strings.Trim(content.Destination, "/")
|
||||||
prefix := strings.Trim(content.Prefix, "/*")
|
prefix := strings.Trim(content.Prefix, "/*")
|
||||||
|
@ -219,7 +220,7 @@ func getRepoSource(localRepo string, content Content) string {
|
||||||
}
|
}
|
||||||
|
|
||||||
// getRepoDestination returns the local storage path of the synced repo based on the specified destination.
|
// getRepoDestination returns the local storage path of the synced repo based on the specified destination.
|
||||||
func getRepoDestination(remoteRepo string, content Content) string {
|
func getRepoDestination(remoteRepo string, content syncconf.Content) string {
|
||||||
remoteRepo = strings.Trim(remoteRepo, "/")
|
remoteRepo = strings.Trim(remoteRepo, "/")
|
||||||
destination := strings.Trim(content.Destination, "/")
|
destination := strings.Trim(content.Destination, "/")
|
||||||
prefix := strings.Trim(content.Prefix, "/*")
|
prefix := strings.Trim(content.Prefix, "/*")
|
||||||
|
@ -244,13 +245,13 @@ func getRepoDestination(remoteRepo string, content Content) string {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get sync.FileCredentials from file.
|
// Get sync.FileCredentials from file.
|
||||||
func getFileCredentials(filepath string) (CredentialsFile, error) {
|
func getFileCredentials(filepath string) (syncconf.CredentialsFile, error) {
|
||||||
credsFile, err := os.ReadFile(filepath)
|
credsFile, err := os.ReadFile(filepath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
var creds CredentialsFile
|
var creds syncconf.CredentialsFile
|
||||||
|
|
||||||
err = json.Unmarshal(credsFile, &creds)
|
err = json.Unmarshal(credsFile, &creds)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
Loading…
Add table
Reference in a new issue