Skip to content

Commit

Permalink
Allow to update the packageinstall with a difference packageName
Browse files Browse the repository at this point in the history
1. Prompt user to confirm
2. Add e2e test for this operation

Signed-off-by: luwang <lu.wang@broadcom.com>
  • Loading branch information
luwangVMW committed Feb 10, 2025
1 parent a1c5d04 commit 859905e
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 11 deletions.
11 changes: 8 additions & 3 deletions cli/pkg/kctrl/cmd/package/installed/create_or_update.go
Original file line number Diff line number Diff line change
Expand Up @@ -767,11 +767,16 @@ func (o *CreateOrUpdateOptions) preparePackageInstallForUpdate(pkgInstall *kcpkg
return nil, fmt.Errorf("Failed to update package '%s' as no existing package reference/version was found in the package install", o.Name)
}

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

Expand Down
51 changes: 43 additions & 8 deletions cli/test/e2e/package_install_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,28 +23,31 @@ func TestPackageInstalled(t *testing.T) {
appName := "test-package-name"
pkgiName := "testpkgi"
packageMetadataName := "test-pkg.carvel.dev"
packageMetadataNameNew := "test-pkg.carvel-new.dev"

packageMetadata := fmt.Sprintf(`---
packageMetadataCR := `---
apiVersion: data.packaging.carvel.dev/v1alpha1
kind: PackageMetadata
metadata:
name: %s
spec:
displayName: "Carvel Test Package"
shortDescription: "Carvel package for testing installation"`, packageMetadataName)
shortDescription: "Carvel package for testing installation"`

packageMetadata := fmt.Sprintf(packageMetadataCR, packageMetadataName)
packageMetadataNew := fmt.Sprintf(packageMetadataCR, packageMetadataNameNew)

packageName1 := "test-pkg.carvel.dev.1.0.0"
packageName2 := "test-pkg.carvel.dev.2.0.0"
packageVersion1 := "1.0.0"
packageVersion2 := "2.0.0"
packageVersion3 := "3.0.0"

packageCR := `---
apiVersion: data.packaging.carvel.dev/v1alpha1
kind: Package
metadata:
name: %s
spec:
refName: test-pkg.carvel.dev
refName: %s
version: %s
template:
spec:
Expand All @@ -69,12 +72,16 @@ key1: value1
valuesFile2 := `
key2: value2
`
valuesFile3 := `
key3: value3
`
packageCR1 := fmt.Sprintf(packageCR, packageMetadataName+"."+packageVersion1, packageMetadataName, packageVersion1)

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

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

yaml := packageMetadata + "\n" + packageCR1 + "\n" + packageCR2
yaml := packageMetadata + "\n" + packageCR1 + "\n" + packageCR2 + "\n" + packageMetadataNew + "\n" + packageCR3

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

logger.Section("package installed update with changing packageName", func() {
_, err := kappCtrl.RunWithOpts([]string{
"package", "installed", "update",
"--package-install", pkgiName,
"-p", packageMetadataNameNew,
"--version", packageVersion3,
"--values-file", "-",
"-y",
}, RunOpts{StdinReader: strings.NewReader(valuesFile3)})
require.NoError(t, err)

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

output := uitest.JSONUIFromBytes(t, []byte(out))

expectedOutputRows := []map[string]string{{
"conditions": "- type: ReconcileSucceeded\n status: \"True\"\n reason: \"\"\n message: \"\"",
"namespace": env.Namespace,
"name": "testpkgi",
"package_name": packageMetadataNameNew,
"package_version": packageVersion3,
"status": "Reconcile succeeded",
}}

require.Exactly(t, expectedOutputRows, output.Tables[0].Rows)
})

logger.Section("package installed pause", func() {

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

0 comments on commit 859905e

Please sign in to comment.