Skip to content

Commit 195392b

Browse files
committed
use of packagekey
Signed-off-by: lapentafd <francesco.lapenta@est.tech>
1 parent eb67155 commit 195392b

3 files changed

Lines changed: 44 additions & 46 deletions

File tree

api/porch/v1alpha1/util.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,3 +62,13 @@ var validFirstTaskTypes = []TaskType{TaskTypeInit, TaskTypeEdit, TaskTypeClone,
6262
func IsValidFirstTaskType(t TaskType) bool {
6363
return slices.Contains(validFirstTaskTypes, t)
6464
}
65+
66+
// IsPackageCreation checks if the package revision is an init or clone operation
67+
func IsPackageCreation(pkgRev *PackageRevision) bool {
68+
for _, task := range pkgRev.Spec.Tasks {
69+
if task.Type == TaskTypeInit || task.Type == TaskTypeClone {
70+
return true
71+
}
72+
}
73+
return false
74+
}

pkg/registry/porch/packagerevision.go

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -341,18 +341,17 @@ func creationConflictError(newApiPkgRev *porchapi.PackageRevision) error {
341341

342342
func (r *packageRevisions) validatePackagePathOverlap(ctx context.Context, newPkgRev *porchapi.PackageRevision) error {
343343
// Only validate for init and clone operations
344-
isInitOrClone := false
345-
for _, task := range newPkgRev.Spec.Tasks {
346-
if task.Type == porchapi.TaskTypeInit || task.Type == porchapi.TaskTypeClone {
347-
isInitOrClone = true
348-
break
349-
}
350-
}
351-
if !isInitOrClone {
344+
if !porchapi.IsPackageCreation(newPkgRev) {
352345
return nil
353346
}
354347

355-
newPath := newPkgRev.Spec.PackageName
348+
newPkgKey := repository.PackageKey{
349+
RepoKey: repository.RepositoryKey{
350+
Namespace: newPkgRev.Namespace,
351+
Name: newPkgRev.Spec.RepositoryName,
352+
},
353+
Package: newPkgRev.Spec.PackageName,
354+
}
356355

357356
// List existing package revisions in the same repository
358357
filter := repository.ListPackageRevisionFilter{
@@ -368,28 +367,19 @@ func (r *packageRevisions) validatePackagePathOverlap(ctx context.Context, newPk
368367

369368
existingPaths := []string{}
370369
err := r.listPackageRevisions(ctx, filter, func(ctx context.Context, p repository.PackageRevision) error {
371-
pkgRev, err := p.GetPackageRevision(ctx)
372-
if err != nil {
373-
return err
374-
}
375-
// Only check packages in the same repository
376-
if pkgRev.Spec.RepositoryName != newPkgRev.Spec.RepositoryName {
377-
return nil
378-
}
379-
// Skip packages with same name (allows multiple revisions/workspaces of same package)
380-
if pkgRev.Spec.PackageName == newPath {
381-
return nil
370+
if newPkgKey == p.Key().PkgKey {
371+
return apierrors.NewBadRequest(fmt.Sprintf("package %q already exists in repository %q", newPkgRev.Spec.PackageName, newPkgRev.Spec.RepositoryName))
382372
}
383-
existingPaths = append(existingPaths, pkgRev.Spec.PackageName)
373+
existingPaths = append(existingPaths, p.Key().PkgKey.Package)
384374
return nil
385375
})
386376
if err != nil {
387377
return apierrors.NewInternalError(fmt.Errorf("failed to list existing packages: %w", err))
388378
}
389379

390380
// Check for path overlaps
391-
if conflictingPath := findPathConflict(newPath, existingPaths); conflictingPath != "" {
392-
return apierrors.NewBadRequest(fmt.Sprintf("package path %q conflicts with existing package %q: packages cannot be nested", newPath, conflictingPath))
381+
if conflictingPath := findPathConflict(newPkgRev.Spec.PackageName, existingPaths); conflictingPath != "" {
382+
return apierrors.NewBadRequest(fmt.Sprintf("package path %q conflicts with existing package %q: packages cannot be nested", newPkgRev.Spec.PackageName, conflictingPath))
393383
}
394384

395385
return nil

pkg/registry/porch/packagerevision_test.go

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -606,7 +606,7 @@ func TestValidatePackagePathOverlap(t *testing.T) {
606606
expectError: false,
607607
},
608608
{
609-
name: "no conflict - same package name",
609+
name: "error - same package already exists",
610610
newPkgRev: &porchapi.PackageRevision{
611611
ObjectMeta: metav1.ObjectMeta{Namespace: "default"},
612612
Spec: porchapi.PackageRevisionSpec{
@@ -620,24 +620,8 @@ func TestValidatePackagePathOverlap(t *testing.T) {
620620
existingPkgs: []*porchapi.PackageRevision{
621621
{Spec: porchapi.PackageRevisionSpec{PackageName: "pkg1", RepositoryName: "repo1"}},
622622
},
623-
expectError: false,
624-
},
625-
{
626-
name: "no conflict - different repository",
627-
newPkgRev: &porchapi.PackageRevision{
628-
ObjectMeta: metav1.ObjectMeta{Namespace: "default"},
629-
Spec: porchapi.PackageRevisionSpec{
630-
PackageName: "pkg1/nested",
631-
RepositoryName: "repo1",
632-
Tasks: []porchapi.Task{
633-
{Type: porchapi.TaskTypeInit},
634-
},
635-
},
636-
},
637-
existingPkgs: []*porchapi.PackageRevision{
638-
{Spec: porchapi.PackageRevisionSpec{PackageName: "pkg1", RepositoryName: "repo2"}},
639-
},
640-
expectError: false,
623+
expectError: true,
624+
errorContains: "already exists",
641625
},
642626
}
643627

@@ -668,7 +652,15 @@ func TestValidatePackagePathOverlap(t *testing.T) {
668652
var mockPkgRevs []repository.PackageRevision
669653
for _, existingPkg := range tt.existingPkgs {
670654
mockPkgRev := mockrepo.NewMockPackageRevision(t)
671-
mockPkgRev.On("GetPackageRevision", mock.Anything).Return(existingPkg, nil)
655+
mockPkgRev.On("Key").Return(repository.PackageRevisionKey{
656+
PkgKey: repository.PackageKey{
657+
RepoKey: repository.RepositoryKey{
658+
Namespace: "default",
659+
Name: existingPkg.Spec.RepositoryName,
660+
},
661+
Package: existingPkg.Spec.PackageName,
662+
},
663+
})
672664
mockPkgRevs = append(mockPkgRevs, mockPkgRev)
673665
}
674666
mockEngine.On("ListPackageRevisions", mock.Anything, mock.Anything, mock.Anything).Return(mockPkgRevs, nil)
@@ -966,9 +958,15 @@ func TestCreate(t *testing.T) {
966958
})
967959
existingPkgRev := mockrepo.NewMockPackageRevision(t)
968960
me.On("ListPackageRevisions", mock.Anything, mock.Anything, mock.Anything).Return([]repository.PackageRevision{existingPkgRev}, nil)
969-
existingPkgRev.On("GetPackageRevision", mock.Anything).Return(&porchapi.PackageRevision{
970-
Spec: porchapi.PackageRevisionSpec{PackageName: "parent", RepositoryName: "test-repo"},
971-
}, nil)
961+
existingPkgRev.On("Key").Return(repository.PackageRevisionKey{
962+
PkgKey: repository.PackageKey{
963+
RepoKey: repository.RepositoryKey{
964+
Namespace: "default",
965+
Name: "test-repo",
966+
},
967+
Package: "parent",
968+
},
969+
})
972970
},
973971
expectError: true,
974972
errorContains: "conflicts with existing package",

0 commit comments

Comments
 (0)