Skip to content

Commit d9a094c

Browse files
luwangVMW100mik
authored andcommitted
Allow to update the packageinstall with a difference packageName
1. Prompt user to confirm 2. Add e2e test for this operation Signed-off-by: luwang <[email protected]>
1 parent f51f98c commit d9a094c

File tree

2 files changed

+51
-11
lines changed

2 files changed

+51
-11
lines changed

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -767,11 +767,16 @@ func (o *CreateOrUpdateOptions) preparePackageInstallForUpdate(pkgInstall *kcpkg
767767
return nil, fmt.Errorf("Failed to update package '%s' as no existing package reference/version was found in the package install", o.Name)
768768
}
769769

770-
// If o.PackageName is provided by the user (via --package flag), verify that the package name in PackageInstall matches it.
771-
// 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.
770+
// If o.PackageName provided by the user (via --package flag) is not the same as the package name in PackageInstall
771+
// Prompt user to confirm
772772
// Otherwise if o.PackageName is not provided, fill it from the installed package spec
773773
if o.packageName != "" && updatedPkgInstall.Spec.PackageRef.RefName != o.packageName {
774-
return nil, fmt.Errorf("Installed package '%s' is already associated with package '%s'", o.Name, updatedPkgInstall.Spec.PackageRef.RefName)
774+
o.ui.PrintLinef("Changing Package reference for installation '%s' from Package '%s' to Package '%s'", o.Name, updatedPkgInstall.Spec.PackageRef.RefName, o.packageName)
775+
err := o.ui.AskForConfirmation()
776+
if err != nil {
777+
return nil, err
778+
}
779+
updatedPkgInstall.Spec.PackageRef.RefName = o.packageName
775780
}
776781
o.packageName = updatedPkgInstall.Spec.PackageRef.RefName
777782

cli/test/e2e/package_install_test.go

Lines changed: 43 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,28 +23,31 @@ func TestPackageInstalled(t *testing.T) {
2323
appName := "test-package-name"
2424
pkgiName := "testpkgi"
2525
packageMetadataName := "test-pkg.carvel.dev"
26+
packageMetadataNameNew := "test-pkg.carvel-new.dev"
2627

27-
packageMetadata := fmt.Sprintf(`---
28+
packageMetadataCR := `---
2829
apiVersion: data.packaging.carvel.dev/v1alpha1
2930
kind: PackageMetadata
3031
metadata:
3132
name: %s
3233
spec:
3334
displayName: "Carvel Test Package"
34-
shortDescription: "Carvel package for testing installation"`, packageMetadataName)
35+
shortDescription: "Carvel package for testing installation"`
36+
37+
packageMetadata := fmt.Sprintf(packageMetadataCR, packageMetadataName)
38+
packageMetadataNew := fmt.Sprintf(packageMetadataCR, packageMetadataNameNew)
3539

36-
packageName1 := "test-pkg.carvel.dev.1.0.0"
37-
packageName2 := "test-pkg.carvel.dev.2.0.0"
3840
packageVersion1 := "1.0.0"
3941
packageVersion2 := "2.0.0"
42+
packageVersion3 := "3.0.0"
4043

4144
packageCR := `---
4245
apiVersion: data.packaging.carvel.dev/v1alpha1
4346
kind: Package
4447
metadata:
4548
name: %s
4649
spec:
47-
refName: test-pkg.carvel.dev
50+
refName: %s
4851
version: %s
4952
template:
5053
spec:
@@ -69,12 +72,16 @@ key1: value1
6972
valuesFile2 := `
7073
key2: value2
7174
`
75+
valuesFile3 := `
76+
key3: value3
77+
`
78+
packageCR1 := fmt.Sprintf(packageCR, packageMetadataName+"."+packageVersion1, packageMetadataName, packageVersion1)
7279

73-
packageCR1 := fmt.Sprintf(packageCR, packageName1, packageVersion1)
80+
packageCR2 := fmt.Sprintf(packageCR, packageMetadataName+"."+packageVersion2, packageMetadataName, packageVersion2)
7481

75-
packageCR2 := fmt.Sprintf(packageCR, packageName2, packageVersion2)
82+
packageCR3 := fmt.Sprintf(packageCR, packageMetadataNameNew+"."+packageVersion3, packageMetadataNameNew, packageVersion3)
7683

77-
yaml := packageMetadata + "\n" + packageCR1 + "\n" + packageCR2
84+
yaml := packageMetadata + "\n" + packageCR1 + "\n" + packageCR2 + "\n" + packageMetadataNew + "\n" + packageCR3
7885

7986
cleanUp := func() {
8087
// TODO: Check for error while uninstalling in cleanup?
@@ -218,6 +225,34 @@ key2: value2
218225
require.Exactly(t, expectedOutputRows, output.Tables[0].Rows)
219226
})
220227

228+
logger.Section("package installed update with changing packageName", func() {
229+
_, err := kappCtrl.RunWithOpts([]string{
230+
"package", "installed", "update",
231+
"--package-install", pkgiName,
232+
"-p", packageMetadataNameNew,
233+
"--version", packageVersion3,
234+
"--values-file", "-",
235+
"-y",
236+
}, RunOpts{StdinReader: strings.NewReader(valuesFile3)})
237+
require.NoError(t, err)
238+
239+
out, err := kappCtrl.RunWithOpts([]string{"package", "installed", "get", "--package-install", pkgiName, "--json"}, RunOpts{})
240+
require.NoError(t, err)
241+
242+
output := uitest.JSONUIFromBytes(t, []byte(out))
243+
244+
expectedOutputRows := []map[string]string{{
245+
"conditions": "- type: ReconcileSucceeded\n status: \"True\"\n reason: \"\"\n message: \"\"",
246+
"namespace": env.Namespace,
247+
"name": "testpkgi",
248+
"package_name": packageMetadataNameNew,
249+
"package_version": packageVersion3,
250+
"status": "Reconcile succeeded",
251+
}}
252+
253+
require.Exactly(t, expectedOutputRows, output.Tables[0].Rows)
254+
})
255+
221256
logger.Section("package installed pause", func() {
222257

223258
_, err := kappCtrl.RunWithOpts([]string{

0 commit comments

Comments
 (0)