Skip to content

Commit 5b1294b

Browse files
Make kctrl to exit smoothly on adding the package registry with no changes (#1316)
* Make kctrl to exit smoothly on adding the package registry with no changes Signed-off-by: rcmadhankumar <[email protected]> * Additonal checks added to the test cases Signed-off-by: rcmadhankumar <[email protected]> * review comments fixed Signed-off-by: rcmadhankumar <[email protected]> --------- Signed-off-by: rcmadhankumar <[email protected]>
1 parent 1a63f5f commit 5b1294b

File tree

5 files changed

+77
-6
lines changed

5 files changed

+77
-6
lines changed

cli/pkg/kctrl/cmd/package/repository/add_or_update.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,10 @@ func (o *AddOrUpdateOptions) Run(args []string) error {
190190
return err
191191
}
192192

193+
if o.URL != "" && o.URL == existingRepository.Spec.Fetch.ImgpkgBundle.Image {
194+
return NewRepoTailer(o.NamespaceFlags.Name, o.Name, o.ui, client, RepoTailerOpts{PrintCurrentState: true}).TailRepoStatus()
195+
}
196+
193197
pkgRepository, err := o.updateExistingPackageRepository(existingRepository)
194198
if err != nil {
195199
return err
@@ -271,7 +275,7 @@ func (o *AddOrUpdateOptions) updateExistingPackageRepository(pkgr *kcpkg.Package
271275

272276
func (o *AddOrUpdateOptions) waitForPackageRepositoryInstallation(client kcclient.Interface) error {
273277
o.statusUI.PrintMessagef("Waiting for package repository reconciliation for '%s'", o.Name)
274-
repoWatcher := NewRepoTailer(o.NamespaceFlags.Name, o.Name, o.ui, client)
278+
repoWatcher := NewRepoTailer(o.NamespaceFlags.Name, o.Name, o.ui, client, RepoTailerOpts{})
275279

276280
err := repoWatcher.TailRepoStatus()
277281
if err != nil {

cli/pkg/kctrl/cmd/package/repository/delete.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ func (o *DeleteOptions) Run(args []string) error {
104104

105105
func (o *DeleteOptions) waitForDeletion(client versioned.Interface) error {
106106
o.statusUI.PrintMessagef("Waiting for package repository reconciliation for '%s'", o.Name)
107-
repoWatcher := NewRepoTailer(o.NamespaceFlags.Name, o.Name, o.ui, client)
107+
repoWatcher := NewRepoTailer(o.NamespaceFlags.Name, o.Name, o.ui, client, RepoTailerOpts{})
108108

109109
err := repoWatcher.TailRepoStatus()
110110
if err != nil {

cli/pkg/kctrl/cmd/package/repository/kick.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ func (o *KickOptions) triggerReconciliation(client kcclient.Interface) error {
152152

153153
func (o *KickOptions) waitForReconciliation(client kcclient.Interface) error {
154154
o.statusUI.PrintMessagef("Waiting for package repository reconciliation for '%s'", o.Name)
155-
repoWatcher := NewRepoTailer(o.NamespaceFlags.Name, o.Name, o.ui, client)
155+
repoWatcher := NewRepoTailer(o.NamespaceFlags.Name, o.Name, o.ui, client, RepoTailerOpts{})
156156

157157
err := repoWatcher.TailRepoStatus()
158158
if err != nil {

cli/pkg/kctrl/cmd/package/repository/repo_tailer.go

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,23 +30,40 @@ type RepoTailer struct {
3030

3131
stopperChan chan struct{}
3232
watchError error
33+
opts RepoTailerOpts
3334

3435
lastSeenDeployStdout string
3536
}
3637

37-
func NewRepoTailer(namespace string, name string, ui ui.UI, client kcclient.Interface) *RepoTailer {
38-
return &RepoTailer{Namespace: namespace, Name: name, ui: ui, statusUI: cmdcore.NewStatusLoggingUI(ui), client: client}
38+
type RepoTailerOpts struct {
39+
PrintCurrentState bool
40+
}
41+
42+
func NewRepoTailer(namespace string, name string, ui ui.UI, client kcclient.Interface, opts RepoTailerOpts) *RepoTailer {
43+
return &RepoTailer{Namespace: namespace, Name: name, ui: ui, statusUI: cmdcore.NewStatusLoggingUI(ui), client: client, opts: opts}
3944
}
4045

4146
func (o *RepoTailer) TailRepoStatus() error {
4247
o.stopperChan = make(chan struct{})
43-
_, err := o.client.PackagingV1alpha1().PackageRepositories(o.Namespace).Get(context.Background(), o.Name, metav1.GetOptions{})
48+
pkgRepo, err := o.client.PackagingV1alpha1().PackageRepositories(o.Namespace).Get(context.Background(), o.Name, metav1.GetOptions{})
4449
if err != nil {
4550
if !(errors.IsNotFound(err)) {
4651
return err
4752
}
4853
}
4954

55+
if o.opts.PrintCurrentState {
56+
appStatus := o.appStatusFromPkgrStatus(pkgRepo.Status)
57+
err = o.printTillCurrent(appStatus)
58+
if err != nil {
59+
return err
60+
}
61+
62+
if cmdapp.HasReconciled(appStatus) {
63+
return nil
64+
}
65+
}
66+
5067
informerFactory := kcexternalversions.NewFilteredSharedInformerFactory(o.client, 30*time.Minute, o.Namespace, func(opts *metav1.ListOptions) {
5168
opts.FieldSelector = fmt.Sprintf("metadata.name=%s", o.Name)
5269
})

cli/test/e2e/package_repository_test.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package e2e
66
import (
77
"fmt"
88
"testing"
9+
"time"
910

1011
uitest "github.com/cppforlife/go-cli-ui/ui/test"
1112
"github.com/stretchr/testify/require"
@@ -64,6 +65,43 @@ func TestPackageRepository(t *testing.T) {
6465
kubectl.Run([]string{"get", "pkg/pkg.test.carvel.dev.2.0.0"})
6566
})
6667

68+
logger.Section("adding of existing repository", func() {
69+
start := time.Now()
70+
out := kappCtrl.Run([]string{"package", "repository", "add", "-r", pkgrName, "--url", pkgrURL})
71+
elapsed := time.Since(start).Seconds()
72+
require.Equal(t, elapsed < 5, true, "Adding of existing package repository takes more than 5 seconds")
73+
require.Contains(t, out, "Fetch succeeded")
74+
require.Contains(t, out, "Template succeeded")
75+
require.Contains(t, out, "Deploy succeeded")
76+
require.Contains(t, out, "Succeeded")
77+
})
78+
79+
logger.Section("adding of existing repository with new url", func() {
80+
81+
_, err := kappCtrl.RunWithOpts([]string{"package", "repository", "add", "-r", pkgrName, "--url", "https://carvel.dev"}, RunOpts{
82+
AllowError: true,
83+
})
84+
require.Error(t, err)
85+
86+
kubectl.Run([]string{"get", kind, pkgrName})
87+
88+
kappCtrl.Run([]string{"package", "repository", "add", "-r", pkgrName, "--url", pkgrURL})
89+
90+
out := kappCtrl.Run([]string{"package", "repository", "get", "-r", pkgrName, "--json"})
91+
92+
output := uitest.JSONUIFromBytes(t, []byte(out))
93+
94+
expectedOutputRows := []map[string]string{{
95+
"conditions": "- type: ReconcileSucceeded\n status: \"True\"\n reason: \"\"\n message: \"\"",
96+
"status": "Reconcile succeeded",
97+
"namespace": env.Namespace,
98+
"name": pkgrName,
99+
"source": fmt.Sprintf("(imgpkg) %s", pkgrURL),
100+
"useful_error_message": "",
101+
}}
102+
require.Exactly(t, expectedOutputRows, output.Tables[0].Rows)
103+
})
104+
67105
logger.Section("kicking a repository", func() {
68106
out := kappCtrl.Run([]string{"package", "repository", "kick", "-r", pkgrName})
69107

@@ -130,6 +168,18 @@ func TestPackageRepository(t *testing.T) {
130168
require.Exactly(t, expectedOutputRows, output.Tables[0].Rows)
131169
})
132170

171+
logger.Section("updating a repository with no change in url", func() {
172+
start := time.Now()
173+
out := kappCtrl.Run([]string{"package", "repository", "update", "-r", pkgrName, "--url", pkgrURL})
174+
elapsed := time.Since(start).Seconds()
175+
require.Equal(t, elapsed < 5, true, "Adding of existing package repository takes more than 5 seconds")
176+
require.Contains(t, out, "Fetch succeeded")
177+
require.Contains(t, out, "Template succeeded")
178+
require.Contains(t, out, "Deploy succeeded")
179+
require.Contains(t, out, "Succeeded")
180+
181+
})
182+
133183
logger.Section("creating a repository in a new namespace that doesn't exist", func() {
134184
kappCtrl.Run([]string{"package", "repository", "add", "-r", pkgrName, "--url", pkgrURL, "-n", newRepoNamespace, "--create-namespace"})
135185

0 commit comments

Comments
 (0)