From 91ce92080aba5ec805ba0755cbc0e48aa6c6e27a Mon Sep 17 00:00:00 2001 From: Shivanand Sonnad Date: Tue, 25 Feb 2025 07:37:53 +0000 Subject: [PATCH] feat: [AH-932]: fix for docker hub images with library prefix (#3454) * feat: [AH-932]: fix go lint errors * feat: [AH-932]: fix go lint errors * feat: [AH-932]: fix for docker hub images with library prefix --- registry/app/pkg/docker/remote.go | 14 ++++++++++++++ registry/app/remote/adapter/adapter.go | 1 + registry/app/remote/adapter/awsecr/adapter.go | 4 ++++ .../app/remote/adapter/dockerhub/adapter.go | 9 +++++++++ registry/app/remote/adapter/maven/adapter.go | 4 ++++ registry/app/remote/adapter/native/adapter.go | 4 ++++ .../app/remote/controller/proxy/controller.go | 10 ++++++++-- registry/app/remote/controller/proxy/remote.go | 17 +++++++++++++++++ 8 files changed, 61 insertions(+), 2 deletions(-) diff --git a/registry/app/pkg/docker/remote.go b/registry/app/pkg/docker/remote.go index a7e9e98b0..f82b8247b 100644 --- a/registry/app/pkg/docker/remote.go +++ b/registry/app/pkg/docker/remote.go @@ -183,6 +183,13 @@ func (r *RemoteRegistry) ManifestExist( errs = append(errs, errors.New("Proxy is down")) return responseHeaders, descriptor, manifestResult, errs } + + artInfo.Image, err = remoteHelper.GetImageName(ctx, r.spaceFinder, artInfo.Image) + if err != nil { + errs = append(errs, err) + return responseHeaders, descriptor, manifestResult, errs + } + useLocal, man, err := r.proxyCtl.UseLocalManifest(ctx, registryInfo, remoteHelper, acceptHeaders, ifNoneMatchHeader) if err != nil { @@ -259,6 +266,13 @@ func (r *RemoteRegistry) PullManifest( errs = append(errs, errors.New("Proxy is down")) return responseHeaders, descriptor, manifestResult, errs } + + artInfo.Image, err = remoteHelper.GetImageName(ctx, r.spaceFinder, artInfo.Image) + if err != nil { + errs = append(errs, err) + return responseHeaders, descriptor, manifestResult, errs + } + useLocal, man, err := r.proxyCtl.UseLocalManifest(ctx, registryInfo, remoteHelper, acceptHeaders, ifNoneMatchHeader) if err != nil { diff --git a/registry/app/remote/adapter/adapter.go b/registry/app/remote/adapter/adapter.go index 83eab83b3..a87d4d8f2 100644 --- a/registry/app/remote/adapter/adapter.go +++ b/registry/app/remote/adapter/adapter.go @@ -48,6 +48,7 @@ type Factory interface { type Adapter interface { // HealthCheck checks health status of registry. HealthCheck() (string, error) + GetImageName(imageName string) (string, error) } // ArtifactRegistry defines the capabilities that an artifact registry should have. diff --git a/registry/app/remote/adapter/awsecr/adapter.go b/registry/app/remote/adapter/awsecr/adapter.go index 57752a080..ed3362df7 100644 --- a/registry/app/remote/adapter/awsecr/adapter.go +++ b/registry/app/remote/adapter/awsecr/adapter.go @@ -86,6 +86,10 @@ func (a *adapter) HealthCheck() (string, error) { return "Not implemented", nil } +func (a *adapter) GetImageName(imageName string) (string, error) { + return imageName, nil +} + var ( _ adp.Adapter = (*adapter)(nil) _ adp.ArtifactRegistry = (*adapter)(nil) diff --git a/registry/app/remote/adapter/dockerhub/adapter.go b/registry/app/remote/adapter/dockerhub/adapter.go index 8ca6524c3..4acd6e7b5 100644 --- a/registry/app/remote/adapter/dockerhub/adapter.go +++ b/registry/app/remote/adapter/dockerhub/adapter.go @@ -18,6 +18,7 @@ package dockerhub import ( "context" + "strings" "github.com/harness/gitness/app/services/refcache" "github.com/harness/gitness/registry/app/api/openapi/contracts/artifact" @@ -62,6 +63,14 @@ func (f *factory) Create( return newAdapter(ctx, spaceFinder, service, record) } +func (a *adapter) GetImageName(imageName string) (string, error) { + arr := strings.Split(imageName, "/") + if len(arr) == 1 { + imageName = "library/" + imageName + } + return imageName, nil +} + var ( _ adp.Adapter = (*adapter)(nil) _ adp.ArtifactRegistry = (*adapter)(nil) diff --git a/registry/app/remote/adapter/maven/adapter.go b/registry/app/remote/adapter/maven/adapter.go index 87d4325b6..5b2a79b6b 100644 --- a/registry/app/remote/adapter/maven/adapter.go +++ b/registry/app/remote/adapter/maven/adapter.go @@ -97,3 +97,7 @@ func NewClient(_ types.UpstreamProxy) (*Client, error) { return client, nil } + +func (a *adapter) GetImageName(imageName string) (string, error) { + return imageName, nil +} diff --git a/registry/app/remote/adapter/native/adapter.go b/registry/app/remote/adapter/native/adapter.go index 2cd932926..2e44fadbc 100644 --- a/registry/app/remote/adapter/native/adapter.go +++ b/registry/app/remote/adapter/native/adapter.go @@ -117,3 +117,7 @@ func (a *Adapter) DeleteTag(_, _ string) error { func (a *Adapter) CanBeMount(_ string) (mount bool, repository string, err error) { return false, "", nil } + +func (a *Adapter) GetImageName(imageName string) (string, error) { + return imageName, nil +} diff --git a/registry/app/remote/controller/proxy/controller.go b/registry/app/remote/controller/proxy/controller.go index 92b9801d1..f54836e3f 100644 --- a/registry/app/remote/controller/proxy/controller.go +++ b/registry/app/remote/controller/proxy/controller.go @@ -293,14 +293,20 @@ func (c *controller) HeadManifest( func (c *controller) ProxyBlob( ctx context.Context, art pkg.RegistryInfo, repoKey string, proxy types.UpstreamProxy, ) (int64, io.ReadCloser, error) { - remoteImage := getRemoteRepo(art) - log.Debug().Msgf("The blob doesn't exist, proxy the request to the target server, url:%v", remoteImage) rHelper, err := NewRemoteHelper(ctx, c.spaceFinder, c.secretService, repoKey, proxy) if err != nil { return 0, nil, err } + art.Image, err = rHelper.GetImageName(ctx, c.spaceFinder, art.Image) + if err != nil { + return 0, nil, err + } + + remoteImage := getRemoteRepo(art) + log.Debug().Msgf("The blob doesn't exist, proxy the request to the target server, url:%v", remoteImage) + size, bReader, err := rHelper.BlobReader(remoteImage, art.Digest) if err != nil { log.Error().Stack().Err(err).Msgf("failed to pull blob, error %v", err) diff --git a/registry/app/remote/controller/proxy/remote.go b/registry/app/remote/controller/proxy/remote.go index 9829f9f7a..ec98d61fe 100644 --- a/registry/app/remote/controller/proxy/remote.go +++ b/registry/app/remote/controller/proxy/remote.go @@ -45,6 +45,8 @@ type RemoteInterface interface { ManifestExist(registry string, ref string) (bool, *manifest.Descriptor, error) // ListTags returns all tags of the registry. ListTags(registry string) ([]string, error) + + GetImageName(ctx context.Context, spacePathStore refcache.SpaceFinder, imageName string) (string, error) } type remoteHelper struct { @@ -116,3 +118,18 @@ func (r *remoteHelper) ManifestExist(registry string, ref string) (bool, *manife func (r *remoteHelper) ListTags(registry string) ([]string, error) { return r.registry.ListTags(registry) } + +func (r *remoteHelper) GetImageName( + ctx context.Context, spaceFinder refcache.SpaceFinder, imageName string, +) (string, error) { + adapterType := r.upstreamProxy.Source + factory, err := adapter.GetFactory(adapterType) + if err != nil { + return "", err + } + adp, err := factory.Create(ctx, spaceFinder, r.upstreamProxy, r.secretService) + if err != nil { + return "", err + } + return adp.GetImageName(imageName) +}