mirror of
https://github.com/project-zot/zot.git
synced 2026-06-16 04:17:55 +08:00
Modified sync log calls to include error type (#336)
Signed-off-by: Catalin Hofnar <catalin.hofnar@gmail.com>
This commit is contained in:
committed by
Ramkumar Chinchani
parent
111b80625d
commit
a8a65a6c37
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user