Skip to content

Commit 9902281

Browse files
authored
Recognize latest package revision on publishing (#3079)
When package is published, make sure to recognize its latest status
1 parent 3aedf4b commit 9902281

File tree

3 files changed

+83
-31
lines changed

3 files changed

+83
-31
lines changed

porch/pkg/cache/cache_test.go

Lines changed: 78 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -23,39 +23,15 @@ import (
2323
"github.com/GoogleContainerTools/kpt/porch/api/porchconfig/v1alpha1"
2424
"github.com/GoogleContainerTools/kpt/porch/pkg/git"
2525
"github.com/GoogleContainerTools/kpt/porch/pkg/repository"
26+
gogit "github.com/go-git/go-git/v5"
2627
"github.com/google/go-cmp/cmp"
2728
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2829
)
2930

3031
func TestLatestPackages(t *testing.T) {
31-
tempdir := t.TempDir()
32-
tarfile := filepath.Join("..", "git", "testdata", "nested-repository.tar")
33-
_, address := git.ServeGitRepository(t, tarfile, tempdir)
34-
3532
ctx := context.Background()
36-
37-
cache := NewCache(t.TempDir(), CacheOptions{})
38-
cachedGit, err := cache.OpenRepository(ctx, &v1alpha1.Repository{
39-
TypeMeta: metav1.TypeMeta{
40-
Kind: v1alpha1.RepositoryGVK.Kind,
41-
APIVersion: v1alpha1.RepositoryGVK.GroupVersion().Identifier(),
42-
},
43-
ObjectMeta: metav1.ObjectMeta{
44-
Name: "nested",
45-
Namespace: "default",
46-
},
47-
Spec: v1alpha1.RepositorySpec{
48-
Deployment: false,
49-
Type: v1alpha1.RepositoryTypeGit,
50-
Content: v1alpha1.RepositoryContentPackage,
51-
Git: &v1alpha1.GitRepository{
52-
Repo: address,
53-
},
54-
},
55-
})
56-
if err != nil {
57-
t.Fatalf("OpenRepository(%q) of %q failed; %v", address, tarfile, err)
58-
}
33+
tarfile := filepath.Join("..", "git", "testdata", "nested-repository.tar")
34+
_, cachedGit := openRepositoryFromArchive(t, ctx, tarfile, "nested")
5935

6036
wantLatest := map[string]string{
6137
"sample": "v2",
@@ -93,3 +69,78 @@ func TestLatestPackages(t *testing.T) {
9369
t.Errorf("Latest package revisions differ (-want,+got): %s", cmp.Diff(wantLatest, gotLatest))
9470
}
9571
}
72+
73+
func TestPublishedLatest(t *testing.T) {
74+
ctx := context.Background()
75+
tarfile := filepath.Join("..", "git", "testdata", "nested-repository.tar")
76+
_, cached := openRepositoryFromArchive(t, ctx, tarfile, "publish-test")
77+
78+
revisions, err := cached.ListPackageRevisions(ctx, repository.ListPackageRevisionFilter{
79+
Package: "catalog/gcp/bucket",
80+
Revision: "v2",
81+
})
82+
if err != nil {
83+
t.Fatalf("ListPackageRevisions failed: %v", err)
84+
}
85+
86+
// Expect a single result
87+
if got, want := len(revisions), 1; got != want {
88+
t.Fatalf("ListPackageRevisions returned %d packages; want %d", got, want)
89+
}
90+
91+
bucket := revisions[0]
92+
// Expect draft package
93+
if got, want := bucket.Lifecycle(), api.PackageRevisionLifecycleDraft; got != want {
94+
t.Fatalf("Bucket package lifecycle: got %s, want %s", got, want)
95+
}
96+
97+
update, err := cached.UpdatePackage(ctx, bucket)
98+
if err != nil {
99+
t.Fatalf("UpdatePackaeg(%s) failed: %v", bucket.Key(), err)
100+
}
101+
if err := update.UpdateLifecycle(ctx, api.PackageRevisionLifecyclePublished); err != nil {
102+
t.Fatalf("UpdateLifecycle failed; %v", err)
103+
}
104+
closed, err := update.Close(ctx)
105+
if err != nil {
106+
t.Fatalf("Close failed: %v", err)
107+
}
108+
resource := closed.GetPackageRevision()
109+
if got, ok := resource.Labels[api.LatestPackageRevisionKey]; !ok {
110+
t.Errorf("Label %s not found as expected", api.LatestPackageRevisionKey)
111+
} else if want := api.LatestPackageRevisionValue; got != want {
112+
t.Errorf("Latest label: got %s, want %s", got, want)
113+
}
114+
}
115+
116+
func openRepositoryFromArchive(t *testing.T, ctx context.Context, tarfile, name string) (*gogit.Repository, *cachedRepository) {
117+
t.Helper()
118+
119+
tempdir := t.TempDir()
120+
repo, address := git.ServeGitRepository(t, tarfile, tempdir)
121+
122+
cache := NewCache(t.TempDir(), CacheOptions{})
123+
cachedGit, err := cache.OpenRepository(ctx, &v1alpha1.Repository{
124+
TypeMeta: metav1.TypeMeta{
125+
Kind: v1alpha1.RepositoryGVK.Kind,
126+
APIVersion: v1alpha1.RepositoryGVK.GroupVersion().Identifier(),
127+
},
128+
ObjectMeta: metav1.ObjectMeta{
129+
Name: name,
130+
Namespace: "default",
131+
},
132+
Spec: v1alpha1.RepositorySpec{
133+
Deployment: false,
134+
Type: v1alpha1.RepositoryTypeGit,
135+
Content: v1alpha1.RepositoryContentPackage,
136+
Git: &v1alpha1.GitRepository{
137+
Repo: address,
138+
},
139+
},
140+
})
141+
if err != nil {
142+
t.Fatalf("OpenRepository(%q) of %q failed; %v", address, tarfile, err)
143+
}
144+
145+
return repo, cachedGit
146+
}

porch/pkg/cache/draft.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ func (cd *cachedDraft) Close(ctx context.Context) (repository.PackageRevision, e
3131
if closed, err := cd.PackageDraft.Close(ctx); err != nil {
3232
return nil, err
3333
} else {
34-
cd.cache.update(closed)
35-
return closed, nil
34+
return cd.cache.update(closed), nil
3635
}
3736
}

porch/pkg/cache/repository.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,13 +193,15 @@ func (r *cachedRepository) UpdatePackage(ctx context.Context, old repository.Pac
193193
}, nil
194194
}
195195

196-
func (r *cachedRepository) update(closed repository.PackageRevision) {
196+
func (r *cachedRepository) update(closed repository.PackageRevision) *cachedPackageRevision {
197197
r.mutex.Lock()
198198
defer r.mutex.Unlock()
199199

200-
r.cachedPackages = updateOrAppend(r.cachedPackages, &cachedPackageRevision{PackageRevision: closed})
200+
cached := &cachedPackageRevision{PackageRevision: closed}
201+
r.cachedPackages = updateOrAppend(r.cachedPackages, cached)
201202
// Recompute latest package revisions.
202203
identifyLatestRevisions(r.cachedPackages)
204+
return cached
203205
}
204206

205207
func updateOrAppend(revisions []*cachedPackageRevision, new *cachedPackageRevision) []*cachedPackageRevision {

0 commit comments

Comments
 (0)