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
try-new-ui
Shivanand Sonnad 2025-02-25 07:37:53 +00:00 committed by Harness
parent 6420c0b5d0
commit 91ce92080a
8 changed files with 61 additions and 2 deletions

View File

@ -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 {

View File

@ -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.

View File

@ -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)

View File

@ -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)

View File

@ -97,3 +97,7 @@ func NewClient(_ types.UpstreamProxy) (*Client, error) {
return client, nil
}
func (a *adapter) GetImageName(imageName string) (string, error) {
return imageName, nil
}

View File

@ -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
}

View File

@ -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)

View File

@ -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)
}