[fix]: [AH-952]: fix override of files for maven artifacts (#3692)

* [fix]: [AH-952]: Fixed pr check
* [fix]: [AH-952]: Fixed pr check
* [fix]: [AH-952]: Fixed pr check
* [fix]: [AH-952]: Fixed pr check
* [fix]: [AH-952]: Fixed pr check
* [fix]: [AH-952]: Fixed pr check
* [fix]: [AH-952]: fix override of files for maven artifacts
This commit is contained in:
Pragyesh Mishra 2025-05-02 18:54:52 +00:00 committed by Harness
parent 8d13a4beb3
commit 2ec6fb8a58
7 changed files with 63 additions and 26 deletions

View File

@ -528,8 +528,10 @@ func initSystem(ctx context.Context, config *types.Config) (*server.System, erro
registryHelper := rpm.LocalRegistryHelperProvider(fileManager, artifactRepository) registryHelper := rpm.LocalRegistryHelperProvider(fileManager, artifactRepository)
indexService := index.ProvideService(registryHelper, lockerLocker) indexService := index.ProvideService(registryHelper, lockerLocker)
apiHandler := router.APIHandlerProvider(registryRepository, upstreamProxyConfigRepository, fileManager, tagRepository, manifestRepository, cleanupPolicyRepository, imageRepository, storageDriver, spaceFinder, transactor, authenticator, provider, authorizer, auditService, artifactRepository, webhooksRepository, webhooksExecutionRepository, service2, spacePathStore, reporter10, downloadStatRepository, indexService, config, registryBlobRepository) apiHandler := router.APIHandlerProvider(registryRepository, upstreamProxyConfigRepository, fileManager, tagRepository, manifestRepository, cleanupPolicyRepository, imageRepository, storageDriver, spaceFinder, transactor, authenticator, provider, authorizer, auditService, artifactRepository, webhooksRepository, webhooksExecutionRepository, service2, spacePathStore, reporter10, downloadStatRepository, indexService, config, registryBlobRepository)
packageTagRepository := database2.ProvidePackageTagDao(db)
localBase := base.LocalBaseProvider(registryRepository, fileManager, transactor, imageRepository, artifactRepository, nodesRepository, packageTagRepository)
mavenDBStore := maven.DBStoreProvider(registryRepository, imageRepository, artifactRepository, spaceStore, bandwidthStatRepository, downloadStatRepository, nodesRepository, upstreamProxyConfigRepository) mavenDBStore := maven.DBStoreProvider(registryRepository, imageRepository, artifactRepository, spaceStore, bandwidthStatRepository, downloadStatRepository, nodesRepository, upstreamProxyConfigRepository)
mavenLocalRegistry := maven.LocalRegistryProvider(mavenDBStore, transactor, fileManager) mavenLocalRegistry := maven.LocalRegistryProvider(localBase, mavenDBStore, transactor, fileManager)
mavenController := maven.ProvideProxyController(mavenLocalRegistry, secretService, spaceFinder) mavenController := maven.ProvideProxyController(mavenLocalRegistry, secretService, spaceFinder)
mavenRemoteRegistry := maven.RemoteRegistryProvider(mavenDBStore, transactor, mavenLocalRegistry, mavenController) mavenRemoteRegistry := maven.RemoteRegistryProvider(mavenDBStore, transactor, mavenLocalRegistry, mavenController)
controller2 := maven.ControllerProvider(mavenLocalRegistry, mavenRemoteRegistry, authorizer, mavenDBStore) controller2 := maven.ControllerProvider(mavenLocalRegistry, mavenRemoteRegistry, authorizer, mavenDBStore)
@ -540,8 +542,6 @@ func initSystem(ctx context.Context, config *types.Config) (*server.System, erro
packagesHandler := api2.NewPackageHandlerProvider(registryRepository, downloadStatRepository, spaceStore, tokenStore, controller, authenticator, provider, authorizer) packagesHandler := api2.NewPackageHandlerProvider(registryRepository, downloadStatRepository, spaceStore, tokenStore, controller, authenticator, provider, authorizer)
genericHandler := api2.NewGenericHandlerProvider(spaceStore, genericController, tokenStore, controller, authenticator, provider, authorizer, packagesHandler) genericHandler := api2.NewGenericHandlerProvider(spaceStore, genericController, tokenStore, controller, authenticator, provider, authorizer, packagesHandler)
handler3 := router.GenericHandlerProvider(genericHandler) handler3 := router.GenericHandlerProvider(genericHandler)
packageTagRepository := database2.ProvidePackageTagDao(db)
localBase := base.LocalBaseProvider(registryRepository, fileManager, transactor, imageRepository, artifactRepository, nodesRepository, packageTagRepository)
pythonLocalRegistry := python.LocalRegistryProvider(localBase, fileManager, upstreamProxyConfigRepository, transactor, registryRepository, imageRepository, artifactRepository, provider) pythonLocalRegistry := python.LocalRegistryProvider(localBase, fileManager, upstreamProxyConfigRepository, transactor, registryRepository, imageRepository, artifactRepository, provider)
localRegistryHelper := python.LocalRegistryHelperProvider(pythonLocalRegistry, localBase) localRegistryHelper := python.LocalRegistryHelperProvider(pythonLocalRegistry, localBase)
proxy := python.ProxyProvider(upstreamProxyConfigRepository, registryRepository, imageRepository, artifactRepository, fileManager, transactor, provider, spaceFinder, secretService, localRegistryHelper) proxy := python.ProxyProvider(upstreamProxyConfigRepository, registryRepository, imageRepository, artifactRepository, fileManager, transactor, provider, spaceFinder, secretService, localRegistryHelper)

View File

@ -112,19 +112,23 @@ func (h *Handler) GetArtifactInfo(r *http.Request, remoteSupport bool) (pkg.Mave
pathRoot := getPathRoot(r.Context()) pathRoot := getPathRoot(r.Context())
info := &pkg.MavenArtifactInfo{ info := &pkg.MavenArtifactInfo{
BaseInfo: &pkg.BaseInfo{ ArtifactInfo: &pkg.ArtifactInfo{
PathRoot: pathRoot, BaseInfo: &pkg.BaseInfo{
RootIdentifier: rootIdentifier, PathRoot: pathRoot,
RootParentID: rootSpace.ID, RootIdentifier: rootIdentifier,
ParentID: registry.ParentID, RootParentID: rootSpace.ID,
ParentID: registry.ParentID,
},
Registry: *registry,
RegIdentifier: registryIdentifier,
RegistryID: registry.ID,
Image: groupID + ":" + artifactID,
}, },
RegIdentifier: registryIdentifier, GroupID: groupID,
RegistryID: registry.ID, ArtifactID: artifactID,
GroupID: groupID, Version: version,
ArtifactID: artifactID, FileName: fileName,
Version: version, Path: r.URL.Path,
FileName: fileName,
Path: r.URL.Path,
} }
log.Ctx(ctx).Info().Msgf("Dispatch: URI: %s", path) log.Ctx(ctx).Info().Msgf("Dispatch: URI: %s", path)

View File

@ -80,6 +80,8 @@ type LocalBase interface {
Exists(ctx context.Context, info pkg.ArtifactInfo, version string, fileName string) bool Exists(ctx context.Context, info pkg.ArtifactInfo, version string, fileName string) bool
ExistsByFilePath(ctx context.Context, registryID int64, filePath string) (bool, error)
CheckIfVersionExists(ctx context.Context, info pkg.PackageArtifactInfo) (bool, error) CheckIfVersionExists(ctx context.Context, info pkg.PackageArtifactInfo) (bool, error)
DeletePackage(ctx context.Context, info pkg.PackageArtifactInfo) error DeletePackage(ctx context.Context, info pkg.PackageArtifactInfo) error
@ -311,6 +313,11 @@ func (l *localBase) Exists(ctx context.Context, info pkg.ArtifactInfo, version s
return exists return exists
} }
func (l *localBase) ExistsByFilePath(ctx context.Context, registryID int64, filePath string) (bool, error) {
exists, _, err := l.GetSHA256ByPath(ctx, registryID, filePath)
return exists, err
}
func (l *localBase) CheckIfVersionExists(ctx context.Context, info pkg.PackageArtifactInfo) (bool, error) { func (l *localBase) CheckIfVersionExists(ctx context.Context, info pkg.PackageArtifactInfo) (bool, error) {
artifacts, err := l.artifactDao.GetArtifactMetadata(ctx, artifacts, err := l.artifactDao.GetArtifactMetadata(ctx,
info.BaseArtifactInfo().ParentID, info.BaseArtifactInfo().RegIdentifier, info.BaseArtifactInfo().ParentID, info.BaseArtifactInfo().RegIdentifier,

View File

@ -58,14 +58,12 @@ func (a *ArtifactInfo) SetRepoKey(key string) {
} }
type MavenArtifactInfo struct { type MavenArtifactInfo struct {
*BaseInfo *ArtifactInfo
RegIdentifier string GroupID string
RegistryID int64 ArtifactID string
GroupID string Version string
ArtifactID string FileName string
Version string Path string
FileName string
Path string
} }
type GenericArtifactInfo struct { type GenericArtifactInfo struct {

View File

@ -18,6 +18,7 @@ import (
"context" "context"
"database/sql" "database/sql"
"encoding/json" "encoding/json"
"fmt"
"io" "io"
"net/http" "net/http"
"strings" "strings"
@ -26,6 +27,7 @@ import (
"github.com/harness/gitness/registry/app/dist_temp/errcode" "github.com/harness/gitness/registry/app/dist_temp/errcode"
"github.com/harness/gitness/registry/app/metadata" "github.com/harness/gitness/registry/app/metadata"
"github.com/harness/gitness/registry/app/pkg" "github.com/harness/gitness/registry/app/pkg"
"github.com/harness/gitness/registry/app/pkg/base"
"github.com/harness/gitness/registry/app/pkg/commons" "github.com/harness/gitness/registry/app/pkg/commons"
"github.com/harness/gitness/registry/app/pkg/filemanager" "github.com/harness/gitness/registry/app/pkg/filemanager"
"github.com/harness/gitness/registry/app/pkg/maven/utils" "github.com/harness/gitness/registry/app/pkg/maven/utils"
@ -39,11 +41,13 @@ const (
) )
func NewLocalRegistry( func NewLocalRegistry(
dBStore *DBStore, tx dbtx.Transactor, localBase base.LocalBase,
dBStore *DBStore,
tx dbtx.Transactor,
fileManager filemanager.FileManager, fileManager filemanager.FileManager,
) Registry { ) Registry {
return &LocalRegistry{ return &LocalRegistry{
localBase: localBase,
DBStore: dBStore, DBStore: dBStore,
tx: tx, tx: tx,
fileManager: fileManager, fileManager: fileManager,
@ -51,6 +55,7 @@ func NewLocalRegistry(
} }
type LocalRegistry struct { type LocalRegistry struct {
localBase base.LocalBase
DBStore *DBStore DBStore *DBStore
tx dbtx.Transactor tx dbtx.Transactor
fileManager filemanager.FileManager fileManager filemanager.FileManager
@ -120,6 +125,21 @@ func (r *LocalRegistry) PutArtifact(ctx context.Context, info pkg.MavenArtifactI
responseHeaders *commons.ResponseHeaders, errs []error, responseHeaders *commons.ResponseHeaders, errs []error,
) { ) {
filePath := utils.GetFilePath(info) filePath := utils.GetFilePath(info)
fileExists, err := r.localBase.ExistsByFilePath(ctx, info.RegistryID, strings.TrimPrefix(filePath, "/"))
if err != nil {
return responseHeaders, []error{
fmt.Errorf("error occurred while checking file existence for GroupID: %s, "+
"ArtifactID: %s and Version: %s with file name: %s in registry: %s with error: %w",
info.GroupID, info.ArtifactID, info.Version, info.FileName, info.RegIdentifier, err)}
}
if fileExists {
return responseHeaders, []error{
fmt.Errorf("file already exists for GroupID: %s, "+
"ArtifactID: %s and Version: %s with file name: %s in registry: %s. "+
"Try deleting this version and push it again", info.GroupID, info.ArtifactID,
info.Version, info.FileName, info.RegIdentifier)}
}
fileInfo, err := r.fileManager.UploadFile(ctx, filePath, fileInfo, err := r.fileManager.UploadFile(ctx, filePath,
info.RegistryID, info.RootParentID, info.RootIdentifier, nil, fileReader, info.FileName) info.RegistryID, info.RootParentID, info.RootIdentifier, nil, fileReader, info.FileName)
if err != nil { if err != nil {

View File

@ -18,6 +18,7 @@ import (
"github.com/harness/gitness/app/auth/authz" "github.com/harness/gitness/app/auth/authz"
"github.com/harness/gitness/app/services/refcache" "github.com/harness/gitness/app/services/refcache"
corestore "github.com/harness/gitness/app/store" corestore "github.com/harness/gitness/app/store"
"github.com/harness/gitness/registry/app/pkg/base"
"github.com/harness/gitness/registry/app/pkg/filemanager" "github.com/harness/gitness/registry/app/pkg/filemanager"
"github.com/harness/gitness/registry/app/remote/controller/proxy/maven" "github.com/harness/gitness/registry/app/remote/controller/proxy/maven"
"github.com/harness/gitness/registry/app/store" "github.com/harness/gitness/registry/app/store"
@ -28,12 +29,14 @@ import (
) )
func LocalRegistryProvider( func LocalRegistryProvider(
localBase base.LocalBase,
dBStore *DBStore, dBStore *DBStore,
tx dbtx.Transactor, tx dbtx.Transactor,
fileManager filemanager.FileManager, fileManager filemanager.FileManager,
) *LocalRegistry { ) *LocalRegistry {
//nolint:errcheck //nolint:errcheck
return NewLocalRegistry(dBStore, return NewLocalRegistry(localBase,
dBStore,
tx, tx,
fileManager, fileManager,
).(*LocalRegistry) ).(*LocalRegistry)

View File

@ -119,6 +119,11 @@ func (m *MockLocalBase) Exists(ctx context.Context, info pkg.ArtifactInfo, versi
return args.Bool(0) return args.Bool(0)
} }
func (m *MockLocalBase) ExistsByFilePath(ctx context.Context, registryID int64, filePath string) (bool, error) {
args := m.Called(ctx, registryID, filePath)
return args.Bool(0), args.Error(1)
}
func (m *MockLocalBase) Download(ctx context.Context, info pkg.ArtifactInfo, version, filename string) ( func (m *MockLocalBase) Download(ctx context.Context, info pkg.ArtifactInfo, version, filename string) (
*commons.ResponseHeaders, *storage.FileReader, string, error, *commons.ResponseHeaders, *storage.FileReader, string, error,
) { ) {