Modified sync log calls to include error type (#336)

Signed-off-by: Catalin Hofnar <catalin.hofnar@gmail.com>
This commit is contained in:
Catalin Hofnar
2022-04-21 11:09:08 +03:00
committed by Ramkumar Chinchani
parent 111b80625d
commit a8a65a6c37
4 changed files with 124 additions and 60 deletions
+30 -15
View File
@@ -98,7 +98,8 @@ func syncOneImage(imageChannel chan error, cfg Config, storeController storage.S
credentialsFile, err = getFileCredentials(cfg.CredentialsFile) credentialsFile, err = getFileCredentials(cfg.CredentialsFile)
if err != nil { if err != nil {
log.Error().Err(err).Msgf("couldn't get registry credentials from %s", cfg.CredentialsFile) log.Error().Str("errorType", TypeOf(err)).
Err(err).Msgf("couldn't get registry credentials from %s", cfg.CredentialsFile)
imageChannel <- err imageChannel <- err
@@ -171,14 +172,16 @@ func syncOneImage(imageChannel chan error, cfg Config, storeController storage.S
// is cosign signature // is cosign signature
cosignManifest, err := getCosignManifest(httpClient, *registryURL, remoteRepo, tag, log) cosignManifest, err := getCosignManifest(httpClient, *registryURL, remoteRepo, tag, log)
if err != nil { if err != nil {
log.Error().Err(err).Msgf("couldn't get upstream image %s:%s:%s cosign manifest", upstreamURL, remoteRepo, tag) log.Error().Str("errorType", TypeOf(err)).
Err(err).Msgf("couldn't get upstream image %s:%s:%s cosign manifest", upstreamURL, remoteRepo, tag)
continue continue
} }
err = syncCosignSignature(httpClient, imageStore, *registryURL, localRepo, remoteRepo, tag, cosignManifest, log) err = syncCosignSignature(httpClient, imageStore, *registryURL, localRepo, remoteRepo, tag, cosignManifest, log)
if err != nil { if err != nil {
log.Error().Err(err).Msgf("couldn't copy upstream image cosign signature %s/%s:%s", upstreamURL, remoteRepo, tag) log.Error().Str("errorType", TypeOf(err)).
Err(err).Msgf("couldn't copy upstream image cosign signature %s/%s:%s", upstreamURL, remoteRepo, tag)
continue continue
} }
@@ -190,14 +193,16 @@ func syncOneImage(imageChannel chan error, cfg Config, storeController storage.S
// is notary signature // is notary signature
refs, err := getNotaryRefs(httpClient, *registryURL, remoteRepo, tag, log) refs, err := getNotaryRefs(httpClient, *registryURL, remoteRepo, tag, log)
if err != nil { if err != nil {
log.Error().Err(err).Msgf("couldn't get upstream image %s/%s:%s notary references", upstreamURL, remoteRepo, tag) log.Error().Str("errorType", TypeOf(err)).
Err(err).Msgf("couldn't get upstream image %s/%s:%s notary references", upstreamURL, remoteRepo, tag)
continue continue
} }
err = syncNotarySignature(httpClient, imageStore, *registryURL, localRepo, remoteRepo, tag, refs, log) err = syncNotarySignature(httpClient, imageStore, *registryURL, localRepo, remoteRepo, tag, refs, log)
if err != nil { if err != nil {
log.Error().Err(err).Msgf("couldn't copy image signature %s/%s:%s", upstreamURL, remoteRepo, tag) log.Error().Str("errorType", TypeOf(err)).
Err(err).Msgf("couldn't copy image signature %s/%s:%s", upstreamURL, remoteRepo, tag)
continue continue
} }
@@ -258,7 +263,8 @@ func syncOneImage(imageChannel chan error, cfg Config, storeController storage.S
return err return err
}, retryOptions); err != nil { }, retryOptions); err != nil {
log.Error().Err(err).Msgf("sync routine: error while copying image %s", demandedImageRef) log.Error().Str("errorType", TypeOf(err)).
Err(err).Msgf("sync routine: error while copying image %s", demandedImageRef)
} }
}() }()
} }
@@ -273,7 +279,8 @@ func syncRun(regCfg RegistryConfig, localRepo, remoteRepo, tag string, utils syn
) (bool, error) { ) (bool, error) {
upstreamImageRef, err := getImageRef(utils.upstreamAddr, remoteRepo, tag) upstreamImageRef, err := getImageRef(utils.upstreamAddr, remoteRepo, tag)
if err != nil { if err != nil {
log.Error().Err(err).Msgf("error creating docker reference for repository %s/%s:%s", log.Error().Str("errorType", TypeOf(err)).
Err(err).Msgf("error creating docker reference for repository %s/%s:%s",
utils.upstreamAddr, remoteRepo, tag) utils.upstreamAddr, remoteRepo, tag)
return false, err return false, err
@@ -281,7 +288,8 @@ func syncRun(regCfg RegistryConfig, localRepo, remoteRepo, tag string, utils syn
upstreamImageDigest, err := docker.GetDigest(context.Background(), utils.upstreamCtx, upstreamImageRef) upstreamImageDigest, err := docker.GetDigest(context.Background(), utils.upstreamCtx, upstreamImageRef)
if err != nil { if err != nil {
log.Error().Err(err).Msgf("couldn't get upstream image %s manifest", upstreamImageRef.DockerReference()) log.Error().Str("errorType", TypeOf(err)).
Err(err).Msgf("couldn't get upstream image %s manifest", upstreamImageRef.DockerReference())
return false, err return false, err
} }
@@ -290,12 +298,14 @@ func syncRun(regCfg RegistryConfig, localRepo, remoteRepo, tag string, utils syn
cosignManifest, err := getCosignManifest(utils.client, *utils.url, remoteRepo, cosignManifest, err := getCosignManifest(utils.client, *utils.url, remoteRepo,
upstreamImageDigest.String(), log) upstreamImageDigest.String(), log)
if err != nil { if err != nil {
log.Error().Err(err).Msgf("couldn't get upstream image %s cosign manifest", upstreamImageRef.DockerReference()) log.Error().Str("errorType", TypeOf(err)).
Err(err).Msgf("couldn't get upstream image %s cosign manifest", upstreamImageRef.DockerReference())
} }
refs, err := getNotaryRefs(utils.client, *utils.url, remoteRepo, upstreamImageDigest.String(), log) refs, err := getNotaryRefs(utils.client, *utils.url, remoteRepo, upstreamImageDigest.String(), log)
if err != nil { if err != nil {
log.Error().Err(err).Msgf("couldn't get upstream image %s notary references", upstreamImageRef.DockerReference()) log.Error().Str("errorType", TypeOf(err)).
Err(err).Msgf("couldn't get upstream image %s notary references", upstreamImageRef.DockerReference())
} }
// check if upstream image is signed // check if upstream image is signed
@@ -316,7 +326,8 @@ func syncRun(regCfg RegistryConfig, localRepo, remoteRepo, tag string, utils syn
localImageRef, err := getLocalImageRef(localCachePath, localRepo, tag) localImageRef, err := getLocalImageRef(localCachePath, localRepo, tag)
if err != nil { if err != nil {
log.Error().Err(err).Msgf("couldn't obtain a valid image reference for reference %s/%s:%s", log.Error().Str("errorType", TypeOf(err)).
Err(err).Msgf("couldn't obtain a valid image reference for reference %s/%s:%s",
localCachePath, localRepo, tag) localCachePath, localRepo, tag)
return false, err return false, err
@@ -328,7 +339,8 @@ func syncRun(regCfg RegistryConfig, localRepo, remoteRepo, tag string, utils syn
_, err = copy.Image(context.Background(), utils.policyCtx, localImageRef, upstreamImageRef, &utils.copyOptions) _, err = copy.Image(context.Background(), utils.policyCtx, localImageRef, upstreamImageRef, &utils.copyOptions)
if err != nil { if err != nil {
log.Error().Err(err).Msgf("error encountered while syncing on demand %s to %s", log.Error().Str("errorType", TypeOf(err)).
Err(err).Msgf("error encountered while syncing on demand %s to %s",
upstreamImageRef.DockerReference(), localCachePath) upstreamImageRef.DockerReference(), localCachePath)
return false, err return false, err
@@ -336,7 +348,8 @@ func syncRun(regCfg RegistryConfig, localRepo, remoteRepo, tag string, utils syn
err = pushSyncedLocalImage(localRepo, tag, localCachePath, utils.imageStore, log) err = pushSyncedLocalImage(localRepo, tag, localCachePath, utils.imageStore, log)
if err != nil { if err != nil {
log.Error().Err(err).Msgf("error while pushing synced cached image %s", log.Error().Str("errorType", TypeOf(err)).
Err(err).Msgf("error while pushing synced cached image %s",
fmt.Sprintf("%s/%s:%s", localCachePath, localRepo, tag)) fmt.Sprintf("%s/%s:%s", localCachePath, localRepo, tag))
return false, err return false, err
@@ -345,7 +358,8 @@ func syncRun(regCfg RegistryConfig, localRepo, remoteRepo, tag string, utils syn
err = syncCosignSignature(utils.client, utils.imageStore, *utils.url, localRepo, remoteRepo, err = syncCosignSignature(utils.client, utils.imageStore, *utils.url, localRepo, remoteRepo,
upstreamImageDigest.String(), cosignManifest, log) upstreamImageDigest.String(), cosignManifest, log)
if err != nil { if err != nil {
log.Error().Err(err).Msgf("couldn't copy image cosign signature %s/%s:%s", utils.upstreamAddr, remoteRepo, tag) log.Error().Str("errorType", TypeOf(err)).
Err(err).Msgf("couldn't copy image cosign signature %s/%s:%s", utils.upstreamAddr, remoteRepo, tag)
return false, err return false, err
} }
@@ -353,7 +367,8 @@ func syncRun(regCfg RegistryConfig, localRepo, remoteRepo, tag string, utils syn
err = syncNotarySignature(utils.client, utils.imageStore, *utils.url, localRepo, remoteRepo, err = syncNotarySignature(utils.client, utils.imageStore, *utils.url, localRepo, remoteRepo,
upstreamImageDigest.String(), refs, log) upstreamImageDigest.String(), refs, log)
if err != nil { if err != nil {
log.Error().Err(err).Msgf("couldn't copy image notary signature %s/%s:%s", utils.upstreamAddr, remoteRepo, tag) log.Error().Str("errorType", TypeOf(err)).
Err(err).Msgf("couldn't copy image notary signature %s/%s:%s", utils.upstreamAddr, remoteRepo, tag)
return false, err return false, err
} }
+40 -20
View File
@@ -36,7 +36,8 @@ func getCosignManifest(client *resty.Client, regURL url.URL, repo, digest string
SetHeader("Content-Type", "application/vnd.oci.image.manifest.v1+json"). SetHeader("Content-Type", "application/vnd.oci.image.manifest.v1+json").
Get(getCosignManifestURL.String()) Get(getCosignManifestURL.String())
if err != nil { if err != nil {
log.Error().Err(err).Str("url", getCosignManifestURL.String()). log.Error().Str("errorType", TypeOf(err)).
Err(err).Str("url", getCosignManifestURL.String()).
Msgf("couldn't get cosign manifest: %s", cosignTag) Msgf("couldn't get cosign manifest: %s", cosignTag)
return nil, err return nil, err
@@ -48,7 +49,8 @@ func getCosignManifest(client *resty.Client, regURL url.URL, repo, digest string
return nil, zerr.ErrSyncSignatureNotFound return nil, zerr.ErrSyncSignatureNotFound
} else if resp.IsError() { } else if resp.IsError() {
log.Error().Err(zerr.ErrSyncSignature).Msgf("couldn't get cosign signature from %s, status code: %d skipping", log.Error().Str("errorType", TypeOf(zerr.ErrSyncSignature)).
Err(zerr.ErrSyncSignature).Msgf("couldn't get cosign signature from %s, status code: %d skipping",
getCosignManifestURL.String(), resp.StatusCode()) getCosignManifestURL.String(), resp.StatusCode())
return nil, zerr.ErrSyncSignature return nil, zerr.ErrSyncSignature
@@ -56,7 +58,8 @@ func getCosignManifest(client *resty.Client, regURL url.URL, repo, digest string
err = json.Unmarshal(resp.Body(), &cosignManifest) err = json.Unmarshal(resp.Body(), &cosignManifest)
if err != nil { if err != nil {
log.Error().Err(err).Str("url", getCosignManifestURL.String()). log.Error().Str("errorType", TypeOf(err)).
Err(err).Str("url", getCosignManifestURL.String()).
Msgf("couldn't unmarshal cosign manifest %s", cosignTag) Msgf("couldn't unmarshal cosign manifest %s", cosignTag)
return nil, err return nil, err
@@ -81,7 +84,8 @@ func getNotaryRefs(client *resty.Client, regURL url.URL, repo, digest string, lo
SetQueryParam("artifactType", notreg.ArtifactTypeNotation). SetQueryParam("artifactType", notreg.ArtifactTypeNotation).
Get(getReferrersURL.String()) Get(getReferrersURL.String())
if err != nil { if err != nil {
log.Error().Err(err).Str("url", getReferrersURL.String()).Msg("couldn't get referrers") log.Error().Str("errorType", TypeOf(err)).
Err(err).Str("url", getReferrersURL.String()).Msg("couldn't get referrers")
return referrers, err return referrers, err
} }
@@ -92,7 +96,8 @@ func getNotaryRefs(client *resty.Client, regURL url.URL, repo, digest string, lo
return ReferenceList{}, zerr.ErrSyncSignatureNotFound return ReferenceList{}, zerr.ErrSyncSignatureNotFound
} else if resp.IsError() { } else if resp.IsError() {
log.Error().Err(zerr.ErrSyncSignature).Msgf("couldn't get notary signature from %s, status code: %d skipping", log.Error().Str("errorType", TypeOf(zerr.ErrSyncSignature)).
Err(zerr.ErrSyncSignature).Msgf("couldn't get notary signature from %s, status code: %d skipping",
getReferrersURL.String(), resp.StatusCode()) getReferrersURL.String(), resp.StatusCode())
return ReferenceList{}, zerr.ErrSyncSignature return ReferenceList{}, zerr.ErrSyncSignature
@@ -100,7 +105,8 @@ func getNotaryRefs(client *resty.Client, regURL url.URL, repo, digest string, lo
err = json.Unmarshal(resp.Body(), &referrers) err = json.Unmarshal(resp.Body(), &referrers)
if err != nil { if err != nil {
log.Error().Err(err).Str("url", getReferrersURL.String()). log.Error().Str("errorType", TypeOf(err)).
Err(err).Str("url", getReferrersURL.String()).
Msgf("couldn't unmarshal notary signature") Msgf("couldn't unmarshal notary signature")
return referrers, err return referrers, err
@@ -129,7 +135,8 @@ func syncCosignSignature(client *resty.Client, imageStore storage.ImageStore,
resp, err := client.R().SetDoNotParseResponse(true).Get(getBlobURL.String()) resp, err := client.R().SetDoNotParseResponse(true).Get(getBlobURL.String())
if err != nil { if err != nil {
log.Error().Err(err).Msgf("couldn't get cosign blob: %s", blob.Digest.String()) log.Error().Str("errorType", TypeOf(err)).
Err(err).Msgf("couldn't get cosign blob: %s", blob.Digest.String())
return err return err
} }
@@ -145,7 +152,8 @@ func syncCosignSignature(client *resty.Client, imageStore storage.ImageStore,
// push blob // push blob
_, _, err = imageStore.FullBlobUpload(localRepo, resp.RawBody(), blob.Digest.String()) _, _, err = imageStore.FullBlobUpload(localRepo, resp.RawBody(), blob.Digest.String())
if err != nil { if err != nil {
log.Error().Err(err).Msg("couldn't upload cosign blob") log.Error().Str("errorType", TypeOf(err)).
Err(err).Msg("couldn't upload cosign blob")
return err return err
} }
@@ -158,7 +166,8 @@ func syncCosignSignature(client *resty.Client, imageStore storage.ImageStore,
resp, err := client.R().SetDoNotParseResponse(true).Get(getBlobURL.String()) resp, err := client.R().SetDoNotParseResponse(true).Get(getBlobURL.String())
if err != nil { if err != nil {
log.Error().Err(err).Msgf("couldn't get cosign config blob: %s", getBlobURL.String()) log.Error().Str("errorType", TypeOf(err)).
Err(err).Msgf("couldn't get cosign config blob: %s", getBlobURL.String())
return err return err
} }
@@ -174,20 +183,23 @@ func syncCosignSignature(client *resty.Client, imageStore storage.ImageStore,
// push config blob // push config blob
_, _, err = imageStore.FullBlobUpload(localRepo, resp.RawBody(), cosignManifest.Config.Digest.String()) _, _, err = imageStore.FullBlobUpload(localRepo, resp.RawBody(), cosignManifest.Config.Digest.String())
if err != nil { if err != nil {
log.Error().Err(err).Msg("couldn't upload cosign config blob") log.Error().Str("errorType", TypeOf(err)).
Err(err).Msg("couldn't upload cosign config blob")
return err return err
} }
cosignManifestBuf, err := json.Marshal(cosignManifest) cosignManifestBuf, err := json.Marshal(cosignManifest)
if err != nil { if err != nil {
log.Error().Err(err).Msg("couldn't marshal cosign manifest") log.Error().Str("errorType", TypeOf(err)).
Err(err).Msg("couldn't marshal cosign manifest")
} }
// push manifest // push manifest
_, err = imageStore.PutImageManifest(localRepo, cosignTag, ispec.MediaTypeImageManifest, cosignManifestBuf) _, err = imageStore.PutImageManifest(localRepo, cosignTag, ispec.MediaTypeImageManifest, cosignManifestBuf)
if err != nil { if err != nil {
log.Error().Err(err).Msg("couldn't upload cosign manifest") log.Error().Str("errorType", TypeOf(err)).
Err(err).Msg("couldn't upload cosign manifest")
return err return err
} }
@@ -215,7 +227,8 @@ func syncNotarySignature(client *resty.Client, imageStore storage.ImageStore,
resp, err := client.R(). resp, err := client.R().
Get(getRefManifestURL.String()) Get(getRefManifestURL.String())
if err != nil { if err != nil {
log.Error().Err(err).Msgf("couldn't get notary manifest: %s", getRefManifestURL.String()) log.Error().Str("errorType", TypeOf(err)).
Err(err).Msgf("couldn't get notary manifest: %s", getRefManifestURL.String())
return err return err
} }
@@ -225,7 +238,8 @@ func syncNotarySignature(client *resty.Client, imageStore storage.ImageStore,
err = json.Unmarshal(resp.Body(), &artifactManifest) err = json.Unmarshal(resp.Body(), &artifactManifest)
if err != nil { if err != nil {
log.Error().Err(err).Msgf("couldn't unmarshal notary manifest: %s", getRefManifestURL.String()) log.Error().Str("errorType", TypeOf(err)).
Err(err).Msgf("couldn't unmarshal notary manifest: %s", getRefManifestURL.String())
return err return err
} }
@@ -237,7 +251,8 @@ func syncNotarySignature(client *resty.Client, imageStore storage.ImageStore,
resp, err := client.R().SetDoNotParseResponse(true).Get(getBlobURL.String()) resp, err := client.R().SetDoNotParseResponse(true).Get(getBlobURL.String())
if err != nil { if err != nil {
log.Error().Err(err).Msgf("couldn't get notary blob: %s", getBlobURL.String()) log.Error().Str("errorType", TypeOf(err)).
Err(err).Msgf("couldn't get notary blob: %s", getBlobURL.String())
return err return err
} }
@@ -253,7 +268,8 @@ func syncNotarySignature(client *resty.Client, imageStore storage.ImageStore,
_, _, err = imageStore.FullBlobUpload(localRepo, resp.RawBody(), blob.Digest.String()) _, _, err = imageStore.FullBlobUpload(localRepo, resp.RawBody(), blob.Digest.String())
if err != nil { if err != nil {
log.Error().Err(err).Msg("couldn't upload notary sig blob") log.Error().Str("errorType", TypeOf(err)).
Err(err).Msg("couldn't upload notary sig blob")
return err return err
} }
@@ -262,7 +278,8 @@ func syncNotarySignature(client *resty.Client, imageStore storage.ImageStore,
_, err = imageStore.PutImageManifest(localRepo, ref.Digest.String(), _, err = imageStore.PutImageManifest(localRepo, ref.Digest.String(),
artifactspec.MediaTypeArtifactManifest, resp.Body()) artifactspec.MediaTypeArtifactManifest, resp.Body())
if err != nil { if err != nil {
log.Error().Err(err).Msg("couldn't upload notary sig manifest") log.Error().Str("errorType", TypeOf(err)).
Err(err).Msg("couldn't upload notary sig manifest")
return err return err
} }
@@ -284,7 +301,8 @@ func canSkipNotarySignature(repo, tag, digest string, refs ReferenceList, imageS
return false, nil return false, nil
} }
log.Error().Err(err).Msgf("couldn't get local notary signature %s:%s manifest", repo, tag) log.Error().Str("errorType", TypeOf(err)).
Err(err).Msgf("couldn't get local notary signature %s:%s manifest", repo, tag)
return false, err return false, err
} }
@@ -318,14 +336,16 @@ func canSkipCosignSignature(repo, tag, digest string, cosignManifest *ispec.Mani
return false, nil return false, nil
} }
log.Error().Err(err).Msgf("couldn't get local cosign %s:%s manifest", repo, tag) log.Error().Str("errorType", TypeOf(err)).
Err(err).Msgf("couldn't get local cosign %s:%s manifest", repo, tag)
return false, err return false, err
} }
err = json.Unmarshal(localCosignManifestBuf, &localCosignManifest) err = json.Unmarshal(localCosignManifestBuf, &localCosignManifest)
if err != nil { if err != nil {
log.Error().Err(err).Msgf("couldn't unmarshal local cosign signature %s:%s manifest", repo, tag) log.Error().Str("errorType", TypeOf(err)).
Err(err).Msgf("couldn't unmarshal local cosign signature %s:%s manifest", repo, tag)
return false, err return false, err
} }
+26 -13
View File
@@ -200,14 +200,16 @@ func imagesToCopyFromUpstream(ctx context.Context, registryName string, repos []
repoRef, err := parseRepositoryReference(fmt.Sprintf("%s/%s", registryName, repoName)) repoRef, err := parseRepositoryReference(fmt.Sprintf("%s/%s", registryName, repoName))
if err != nil { if err != nil {
log.Error().Err(err).Msgf("couldn't parse repository reference: %s", repoRef) log.Error().Str("errorType", TypeOf(err)).
Err(err).Msgf("couldn't parse repository reference: %s", repoRef)
return nil, err return nil, err
} }
tags, err := getImageTags(ctx, upstreamCtx, repoRef) tags, err := getImageTags(ctx, upstreamCtx, repoRef)
if err != nil { if err != nil {
log.Error().Err(err).Msgf("couldn't fetch tags for %s", repoRef) log.Error().Str("errorType", TypeOf(err)).
Err(err).Msgf("couldn't fetch tags for %s", repoRef)
return nil, err return nil, err
} }
@@ -320,7 +322,8 @@ func syncRegistry(ctx context.Context, regCfg RegistryConfig, upstreamURL string
return err return err
}, retryOptions); err != nil { }, retryOptions); err != nil {
log.Error().Err(err).Msg("error while getting upstream catalog, retrying...") log.Error().Str("errorType", TypeOf(err)).
Err(err).Msg("error while getting upstream catalog, retrying...")
return err return err
} }
@@ -362,7 +365,8 @@ func syncRegistry(ctx context.Context, regCfg RegistryConfig, upstreamURL string
return nil return nil
}, retryOptions); err != nil { }, retryOptions); err != nil {
log.Error().Err(err).Msg("error while getting images references from upstream, retrying...") log.Error().Str("errorType", TypeOf(err)).
Err(err).Msg("error while getting images references from upstream, retrying...")
return err return err
} }
@@ -381,7 +385,8 @@ func syncRegistry(ctx context.Context, regCfg RegistryConfig, upstreamURL string
localCachePath, err := getLocalCachePath(imageStore, remoteRepoCopy) localCachePath, err := getLocalCachePath(imageStore, remoteRepoCopy)
if err != nil { if err != nil {
log.Error().Err(err).Msgf("couldn't get localCachePath for %s", remoteRepoCopy) log.Error().Str("errorType", TypeOf(err)).
Err(err).Msgf("couldn't get localCachePath for %s", remoteRepoCopy)
return err return err
} }
@@ -482,7 +487,8 @@ func syncRegistry(ctx context.Context, regCfg RegistryConfig, upstreamURL string
localImageRef, err := getLocalImageRef(localCachePath, localRepo, tag) localImageRef, err := getLocalImageRef(localCachePath, localRepo, tag)
if err != nil { if err != nil {
log.Error().Err(err).Msgf("couldn't obtain a valid image reference for reference %s/%s:%s", log.Error().Str("errorType", TypeOf(err)).
Err(err).Msgf("couldn't obtain a valid image reference for reference %s/%s:%s",
localCachePath, localRepo, tag) localCachePath, localRepo, tag)
return err return err
@@ -495,7 +501,8 @@ func syncRegistry(ctx context.Context, regCfg RegistryConfig, upstreamURL string
return err return err
}, retryOptions); err != nil { }, retryOptions); err != nil {
log.Error().Err(err).Msgf("error while copying image %s to %s", log.Error().Str("errorType", TypeOf(err)).
Err(err).Msgf("error while copying image %s to %s",
upstreamImageRef.DockerReference(), localCachePath) upstreamImageRef.DockerReference(), localCachePath)
return err return err
@@ -504,7 +511,8 @@ func syncRegistry(ctx context.Context, regCfg RegistryConfig, upstreamURL string
err = pushSyncedLocalImage(localRepo, tag, localCachePath, imageStore, log) err = pushSyncedLocalImage(localRepo, tag, localCachePath, imageStore, log)
if err != nil { if err != nil {
log.Error().Err(err).Msgf("error while pushing synced cached image %s", log.Error().Str("errorType", TypeOf(err)).
Err(err).Msgf("error while pushing synced cached image %s",
fmt.Sprintf("%s/%s:%s", localCachePath, localRepo, tag)) fmt.Sprintf("%s/%s:%s", localCachePath, localRepo, tag))
return err return err
@@ -517,7 +525,8 @@ func syncRegistry(ctx context.Context, regCfg RegistryConfig, upstreamURL string
return err return err
}, retryOptions); err != nil { }, retryOptions); err != nil {
log.Error().Err(err).Msgf("couldn't copy notary signature for %s", upstreamImageRef.DockerReference()) log.Error().Str("errorType", TypeOf(err)).
Err(err).Msgf("couldn't copy notary signature for %s", upstreamImageRef.DockerReference())
} }
cosignManifest, err = getCosignManifest(httpClient, *registryURL, remoteRepoCopy, cosignManifest, err = getCosignManifest(httpClient, *registryURL, remoteRepoCopy,
@@ -528,7 +537,8 @@ func syncRegistry(ctx context.Context, regCfg RegistryConfig, upstreamURL string
return err return err
}, retryOptions); err != nil { }, retryOptions); err != nil {
log.Error().Err(err).Msgf("couldn't copy cosign signature for %s", upstreamImageRef.DockerReference()) log.Error().Str("errorType", TypeOf(err)).
Err(err).Msgf("couldn't copy cosign signature for %s", upstreamImageRef.DockerReference())
} }
} }
} }
@@ -554,7 +564,8 @@ func getLocalContexts(log log.Logger) (*types.SystemContext, *signature.PolicyCo
policyContext, err := signature.NewPolicyContext(policy) policyContext, err := signature.NewPolicyContext(policy)
if err := test.Error(err); err != nil { if err := test.Error(err); err != nil {
log.Error().Err(err).Msg("couldn't create policy context") log.Error().Str("errorType", TypeOf(err)).
Err(err).Msg("couldn't create policy context")
return &types.SystemContext{}, &signature.PolicyContext{}, err return &types.SystemContext{}, &signature.PolicyContext{}, err
} }
@@ -572,7 +583,8 @@ func Run(ctx context.Context, cfg Config, storeController storage.StoreControlle
if cfg.CredentialsFile != "" { if cfg.CredentialsFile != "" {
credentialsFile, err = getFileCredentials(cfg.CredentialsFile) credentialsFile, err = getFileCredentials(cfg.CredentialsFile)
if err != nil { if err != nil {
logger.Error().Err(err).Msgf("couldn't get registry credentials from %s", cfg.CredentialsFile) logger.Error().Str("errortype", TypeOf(err)).
Err(err).Msgf("couldn't get registry credentials from %s", cfg.CredentialsFile)
return err return err
} }
@@ -624,7 +636,8 @@ func Run(ctx context.Context, cfg Config, storeController storage.StoreControlle
// first try syncing main registry // first try syncing main registry
if err := syncRegistry(ctx, regCfg, upstreamURL, storeController, localCtx, policyCtx, if err := syncRegistry(ctx, regCfg, upstreamURL, storeController, localCtx, policyCtx,
credentialsFile[upstreamAddr], retryOptions, logger); err != nil { credentialsFile[upstreamAddr], retryOptions, logger); err != nil {
logger.Error().Err(err).Str("registry", upstreamURL). logger.Error().Str("errortype", TypeOf(err)).
Err(err).Str("registry", upstreamURL).
Msg("sync exited with error, falling back to auxiliary registries if any") Msg("sync exited with error, falling back to auxiliary registries if any")
} else { } else {
// if success fall back to main registry // if success fall back to main registry
+28 -12
View File
@@ -34,6 +34,10 @@ type ReferenceList struct {
References []artifactspec.Descriptor `json:"references"` References []artifactspec.Descriptor `json:"references"`
} }
func TypeOf(v interface{}) string {
return fmt.Sprintf("%T", v)
}
// getTagFromRef returns a tagged reference from an image reference. // getTagFromRef returns a tagged reference from an image reference.
func getTagFromRef(ref types.ImageReference, log log.Logger) reference.Tagged { func getTagFromRef(ref types.ImageReference, log log.Logger) reference.Tagged {
tagged, isTagged := ref.DockerReference().(reference.Tagged) tagged, isTagged := ref.DockerReference().(reference.Tagged)
@@ -74,7 +78,8 @@ func filterRepos(repos []string, contentList []Content, log log.Logger) map[int]
matched, err := glob.Match(prefix, repo) matched, err := glob.Match(prefix, repo)
if err != nil { if err != nil {
log.Error().Err(err).Str("pattern", log.Error().Str("errorType", TypeOf(err)).
Err(err).Str("pattern",
prefix).Msg("error while parsing glob pattern, skipping it...") prefix).Msg("error while parsing glob pattern, skipping it...")
continue continue
@@ -208,7 +213,8 @@ func getHTTPClient(regCfg *RegistryConfig, upstreamURL string, credentials Crede
registryURL, err := url.Parse(upstreamURL) registryURL, err := url.Parse(upstreamURL)
if err != nil { if err != nil {
log.Error().Err(err).Str("url", upstreamURL).Msg("couldn't parse url") log.Error().Str("errorType", TypeOf(err)).
Err(err).Str("url", upstreamURL).Msg("couldn't parse url")
return nil, nil, err return nil, nil, err
} }
@@ -221,7 +227,8 @@ func getHTTPClient(regCfg *RegistryConfig, upstreamURL string, credentials Crede
caCert, err := ioutil.ReadFile(caCertPath) caCert, err := ioutil.ReadFile(caCertPath)
if err != nil { if err != nil {
log.Error().Err(err).Msg("couldn't read CA certificate") log.Error().Str("errorType", TypeOf(err)).
Err(err).Msg("couldn't read CA certificate")
return nil, nil, err return nil, nil, err
} }
@@ -233,7 +240,8 @@ func getHTTPClient(regCfg *RegistryConfig, upstreamURL string, credentials Crede
cert, err := tls.LoadX509KeyPair(clientCert, clientKey) cert, err := tls.LoadX509KeyPair(clientCert, clientKey)
if err != nil { if err != nil {
log.Error().Err(err).Msg("couldn't read certificates key pairs") log.Error().Str("errorType", TypeOf(err)).
Err(err).Msg("couldn't read certificates key pairs")
return nil, nil, err return nil, nil, err
} }
@@ -266,7 +274,8 @@ func pushSyncedLocalImage(localRepo, tag, localCachePath string,
manifestContent, _, _, err := cacheImageStore.GetImageManifest(localRepo, tag) manifestContent, _, _, err := cacheImageStore.GetImageManifest(localRepo, tag)
if err != nil { if err != nil {
log.Error().Err(err).Str("dir", path.Join(cacheImageStore.RootDir(), localRepo)). log.Error().Str("errorType", TypeOf(err)).
Err(err).Str("dir", path.Join(cacheImageStore.RootDir(), localRepo)).
Msg("couldn't find index.json") Msg("couldn't find index.json")
return err return err
@@ -275,7 +284,8 @@ func pushSyncedLocalImage(localRepo, tag, localCachePath string,
var manifest ispec.Manifest var manifest ispec.Manifest
if err := json.Unmarshal(manifestContent, &manifest); err != nil { if err := json.Unmarshal(manifestContent, &manifest); err != nil {
log.Error().Err(err).Str("dir", path.Join(cacheImageStore.RootDir(), localRepo)). log.Error().Str("errorType", TypeOf(err)).
Err(err).Str("dir", path.Join(cacheImageStore.RootDir(), localRepo)).
Msg("invalid JSON") Msg("invalid JSON")
return err return err
@@ -284,7 +294,8 @@ func pushSyncedLocalImage(localRepo, tag, localCachePath string,
for _, blob := range manifest.Layers { for _, blob := range manifest.Layers {
blobReader, _, err := cacheImageStore.GetBlob(localRepo, blob.Digest.String(), blob.MediaType) blobReader, _, err := cacheImageStore.GetBlob(localRepo, blob.Digest.String(), blob.MediaType)
if err != nil { if err != nil {
log.Error().Err(err).Str("dir", path.Join(cacheImageStore.RootDir(), log.Error().Str("errorType", TypeOf(err)).
Err(err).Str("dir", path.Join(cacheImageStore.RootDir(),
localRepo)).Str("blob digest", blob.Digest.String()).Msg("couldn't read blob") localRepo)).Str("blob digest", blob.Digest.String()).Msg("couldn't read blob")
return err return err
@@ -293,7 +304,8 @@ func pushSyncedLocalImage(localRepo, tag, localCachePath string,
if found, _, _ := imageStore.CheckBlob(localRepo, blob.Digest.String()); !found { if found, _, _ := imageStore.CheckBlob(localRepo, blob.Digest.String()); !found {
_, _, err = imageStore.FullBlobUpload(localRepo, blobReader, blob.Digest.String()) _, _, err = imageStore.FullBlobUpload(localRepo, blobReader, blob.Digest.String())
if err != nil { if err != nil {
log.Error().Err(err).Str("blob digest", blob.Digest.String()).Msg("couldn't upload blob") log.Error().Str("errorType", TypeOf(err)).
Err(err).Str("blob digest", blob.Digest.String()).Msg("couldn't upload blob")
return err return err
} }
@@ -302,7 +314,8 @@ func pushSyncedLocalImage(localRepo, tag, localCachePath string,
blobReader, _, err := cacheImageStore.GetBlob(localRepo, manifest.Config.Digest.String(), manifest.Config.MediaType) blobReader, _, err := cacheImageStore.GetBlob(localRepo, manifest.Config.Digest.String(), manifest.Config.MediaType)
if err != nil { if err != nil {
log.Error().Err(err).Str("dir", path.Join(cacheImageStore.RootDir(), log.Error().Str("errorType", TypeOf(err)).
Err(err).Str("dir", path.Join(cacheImageStore.RootDir(),
localRepo)).Str("blob digest", manifest.Config.Digest.String()).Msg("couldn't read config blob") localRepo)).Str("blob digest", manifest.Config.Digest.String()).Msg("couldn't read config blob")
return err return err
@@ -311,7 +324,8 @@ func pushSyncedLocalImage(localRepo, tag, localCachePath string,
if found, _, _ := imageStore.CheckBlob(localRepo, manifest.Config.Digest.String()); !found { if found, _, _ := imageStore.CheckBlob(localRepo, manifest.Config.Digest.String()); !found {
_, _, err = imageStore.FullBlobUpload(localRepo, blobReader, manifest.Config.Digest.String()) _, _, err = imageStore.FullBlobUpload(localRepo, blobReader, manifest.Config.Digest.String())
if err != nil { if err != nil {
log.Error().Err(err).Str("blob digest", manifest.Config.Digest.String()).Msg("couldn't upload config blob") log.Error().Str("errorType", TypeOf(err)).
Err(err).Str("blob digest", manifest.Config.Digest.String()).Msg("couldn't upload config blob")
return err return err
} }
@@ -319,7 +333,8 @@ func pushSyncedLocalImage(localRepo, tag, localCachePath string,
_, err = imageStore.PutImageManifest(localRepo, tag, ispec.MediaTypeImageManifest, manifestContent) _, err = imageStore.PutImageManifest(localRepo, tag, ispec.MediaTypeImageManifest, manifestContent)
if err != nil { if err != nil {
log.Error().Err(err).Msg("couldn't upload manifest") log.Error().Str("errorType", TypeOf(err)).
Err(err).Msg("couldn't upload manifest")
return err return err
} }
@@ -411,7 +426,8 @@ func canSkipImage(repo, tag, digest string, imageStore storage.ImageStore, log l
return false, nil return false, nil
} }
log.Error().Err(err).Msgf("couldn't get local image %s:%s manifest", repo, tag) log.Error().Str("errorType", TypeOf(err)).
Err(err).Msgf("couldn't get local image %s:%s manifest", repo, tag)
return false, err return false, err
} }