Skip to content

Commit f54408f

Browse files
authored
Refresh package install after pausing it (#929)
After a package install is paused successfully, the observedGeneration is updated resulting in conflicts while updating the package install
1 parent 9955979 commit f54408f

File tree

2 files changed

+34
-20
lines changed

2 files changed

+34
-20
lines changed

cli/pkg/kctrl/cmd/package/installed/create_or_update.go

+21-17
Original file line numberDiff line numberDiff line change
@@ -349,10 +349,8 @@ func (o *CreateOrUpdateOptions) RunUpdate(args []string) error {
349349
}
350350

351351
func (o CreateOrUpdateOptions) update(client kubernetes.Interface, kcClient kcclient.Interface, pkgInstall *kcpkgv1alpha1.PackageInstall) error {
352-
updatedPkgInstall, changed, err := o.preparePackageInstallForUpdate(pkgInstall)
353-
if err != nil {
354-
return err
355-
}
352+
changed := o.version != "" && o.version != pkgInstall.Spec.PackageRef.VersionSelection.Constraints
353+
updatedPkgInstall := pkgInstall.DeepCopy()
356354

357355
switch {
358356
case changed: // Continue if package install resource is changed
@@ -370,7 +368,7 @@ func (o CreateOrUpdateOptions) update(client kubernetes.Interface, kcClient kccl
370368
reconciliationPaused := false
371369
if (o.valuesFile != "" && len(pkgInstall.Spec.Values) > 0) ||
372370
(len(o.YttOverlayFlags.yttOverlayFiles) > 0 && hasYttOverlays(pkgInstall)) {
373-
updatedPkgInstall, err = o.pauseReconciliation(kcClient)
371+
_, err := o.pauseReconciliation(kcClient)
374372
if err != nil {
375373
return err
376374
}
@@ -379,6 +377,20 @@ func (o CreateOrUpdateOptions) update(client kubernetes.Interface, kcClient kccl
379377
return err
380378
}
381379
reconciliationPaused = true
380+
381+
// observedGeneration is updated after pausing reconciliation
382+
updatedPkgInstall, err = kcClient.PackagingV1alpha1().PackageInstalls(o.NamespaceFlags.Name).Get(
383+
context.Background(), o.Name, metav1.GetOptions{},
384+
)
385+
if err != nil {
386+
return err
387+
}
388+
}
389+
390+
var err error
391+
updatedPkgInstall, err = o.preparePackageInstallForUpdate(updatedPkgInstall)
392+
if err != nil {
393+
return err
382394
}
383395

384396
isSecretCreated, err := o.createOrUpdateValuesSecret(updatedPkgInstall, client)
@@ -734,40 +746,32 @@ func (o *CreateOrUpdateOptions) createOrUpdateServiceAccount(client kubernetes.I
734746
return true, nil
735747
}
736748

737-
func (o *CreateOrUpdateOptions) preparePackageInstallForUpdate(pkgInstall *kcpkgv1alpha1.PackageInstall) (*kcpkgv1alpha1.PackageInstall, bool, error) {
738-
var (
739-
changed bool
740-
err error
741-
)
742-
749+
func (o *CreateOrUpdateOptions) preparePackageInstallForUpdate(pkgInstall *kcpkgv1alpha1.PackageInstall) (*kcpkgv1alpha1.PackageInstall, error) {
743750
updatedPkgInstall := pkgInstall.DeepCopy()
744751

745752
if updatedPkgInstall.Spec.PackageRef == nil || updatedPkgInstall.Spec.PackageRef.VersionSelection == nil {
746-
err = fmt.Errorf("Failed to update package '%s' as no existing package reference/version was found in the package install", o.Name)
747-
return nil, false, err
753+
return nil, fmt.Errorf("Failed to update package '%s' as no existing package reference/version was found in the package install", o.Name)
748754
}
749755

750756
// If o.PackageName is provided by the user (via --package flag), verify that the package name in PackageInstall matches it.
751757
// This will prevent the users from accidentally overwriting an installed package with another package content due to choosing a pre-existing name for the package isntall.
752758
// Otherwise if o.PackageName is not provided, fill it from the installed package spec
753759
if o.packageName != "" && updatedPkgInstall.Spec.PackageRef.RefName != o.packageName {
754-
err = fmt.Errorf("Installed package '%s' is already associated with package '%s'", o.Name, updatedPkgInstall.Spec.PackageRef.RefName)
755-
return nil, false, err
760+
return nil, fmt.Errorf("Installed package '%s' is already associated with package '%s'", o.Name, updatedPkgInstall.Spec.PackageRef.RefName)
756761
}
757762
o.packageName = updatedPkgInstall.Spec.PackageRef.RefName
758763

759764
// If o.Version is provided by the user (via --version flag), set the version in PackageInstall to this version
760765
// Otherwise if o.Version is not provided, fill it from the installed package spec
761766
if o.version != "" {
762767
if updatedPkgInstall.Spec.PackageRef.VersionSelection.Constraints != o.version {
763-
changed = true
764768
updatedPkgInstall.Spec.PackageRef.VersionSelection.Constraints = o.version
765769
}
766770
} else {
767771
o.version = updatedPkgInstall.Spec.PackageRef.VersionSelection.Constraints
768772
}
769773

770-
return updatedPkgInstall, changed, nil
774+
return updatedPkgInstall, nil
771775
}
772776

773777
func (o *CreateOrUpdateOptions) createOrUpdateValuesSecret(pkgInstallToUpdate *kcpkgv1alpha1.PackageInstall, client kubernetes.Interface) (bool, error) {

cli/test/e2e/package_install_test.go

+13-3
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,14 @@ spec:
6262
deploy:
6363
- kapp: {}`
6464

65+
valuesFile1 := `
66+
key1: value1
67+
`
68+
69+
valuesFile2 := `
70+
key2: value2
71+
`
72+
6573
packageCR1 := fmt.Sprintf(packageCR, packageName1, packageVersion1)
6674

6775
packageCR2 := fmt.Sprintf(packageCR, packageName2, packageVersion2)
@@ -95,7 +103,9 @@ spec:
95103
})
96104

97105
logger.Section("Installing test package", func() {
98-
_, err := kappCtrl.RunWithOpts([]string{"package", "installed", "create", "--package-install", pkgiName, "-p", packageMetadataName, "--version", packageVersion1}, RunOpts{})
106+
_, err := kappCtrl.RunWithOpts([]string{"package", "installed", "create", "--package-install", pkgiName,
107+
"-p", packageMetadataName, "--version", packageVersion1,
108+
"--values-file", "-"}, RunOpts{StdinReader: strings.NewReader(valuesFile1)})
99109
require.NoError(t, err)
100110
})
101111

@@ -156,13 +166,13 @@ spec:
156166
})
157167

158168
logger.Section("package installed update", func() {
159-
160169
_, err := kappCtrl.RunWithOpts([]string{
161170
"package", "installed", "update",
162171
"--package-install", pkgiName,
163172
"-p", packageMetadataName,
164173
"--version", packageVersion2,
165-
}, RunOpts{})
174+
"--values-file", "-",
175+
}, RunOpts{StdinReader: strings.NewReader(valuesFile2)})
166176
require.NoError(t, err)
167177

168178
out, err := kappCtrl.RunWithOpts([]string{"package", "installed", "get", "--package-install", pkgiName, "--json"}, RunOpts{})

0 commit comments

Comments
 (0)