Skip to content
This repository has been archived by the owner on Oct 10, 2023. It is now read-only.

Commit

Permalink
Add reconcilliation wait for repository operations and package update
Browse files Browse the repository at this point in the history
Signed-off-by: Marjan Alavi <malavi@vmware.com>
  • Loading branch information
maralavi committed Sep 29, 2021
1 parent 6d094c8 commit 325d2ec
Show file tree
Hide file tree
Showing 27 changed files with 480 additions and 251 deletions.
73 changes: 5 additions & 68 deletions cmd/cli/plugin/package/package_install.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,7 @@ package main

import (
"fmt"
"time"

"github.com/briandowns/spinner"
"github.com/spf13/cobra"

"github.com/vmware-tanzu/tanzu-framework/pkg/v1/tkg/log"
Expand Down Expand Up @@ -45,9 +43,11 @@ func init() {
packageInstallCmd.MarkFlagRequired("version") //nolint
}

func packageInstall(_ *cobra.Command, args []string) error {
func packageInstall(cmd *cobra.Command, args []string) error {
packageInstallOp.PkgInstallName = args[0]

cmd.SilenceUsage = true

pkgClient, err := tkgpackageclient.NewTKGPackageClient(packageInstallOp.KubeConfig)
if err != nil {
return err
Expand All @@ -58,12 +58,11 @@ func packageInstall(_ *cobra.Command, args []string) error {
Err: make(chan error),
Done: make(chan struct{}),
}
go pkgClient.InstallPackage(packageInstallOp, pp, false)
go pkgClient.InstallPackage(packageInstallOp, pp, tkgpackagedatamodel.OperationTypeInstall)

initialMsg := fmt.Sprintf("Installing package '%s'", packageInstallOp.PackageName)
if err := displayProgress(initialMsg, pp); err != nil {
if err.Error() == tkgpackagedatamodel.ErrPackageAlreadyInstalled {
log.Warningf("package install '%s' already exists in namespace '%s'", packageInstallOp.PkgInstallName, packageInstallOp.Namespace)
if isNonCriticalErrorMessage(err.Error(), packageInstallOp.PkgInstallName, packageInstallOp.Namespace) {
return nil
}
return err
Expand All @@ -73,65 +72,3 @@ func packageInstall(_ *cobra.Command, args []string) error {
packageInstallOp.PkgInstallName, packageInstallOp.Namespace))
return nil
}

func displayProgress(initialMsg string, pp *tkgpackagedatamodel.PackageProgress) error {
var (
currMsg string
s *spinner.Spinner
err error
)

newSpinner := func() (*spinner.Spinner, error) {
s = spinner.New(spinner.CharSets[9], 100*time.Millisecond)
if err := s.Color("bgBlack", "bold", "fgWhite"); err != nil {
return nil, err
}
return s, nil
}
if s, err = newSpinner(); err != nil {
return err
}

writeProgress := func(s *spinner.Spinner, msg string) error {
s.Stop()
if s, err = newSpinner(); err != nil {
return err
}
log.Infof("\n")
s.Suffix = fmt.Sprintf(" %s", msg)
s.Start()
return nil
}

s.Suffix = fmt.Sprintf(" %s", initialMsg)
s.Start()

defer func() {
s.Stop()
}()
for {
select {
case err := <-pp.Err:
s.FinalMSG = "\n\n"
return err
case msg := <-pp.ProgressMsg:
if msg != currMsg {
if err := writeProgress(s, msg); err != nil {
return err
}
currMsg = msg
}
case <-pp.Done:
for msg := range pp.ProgressMsg {
if msg == currMsg {
continue
}
if err := writeProgress(s, msg); err != nil {
return err
}
currMsg = msg
}
return nil
}
}
}
7 changes: 4 additions & 3 deletions cmd/cli/plugin/package/package_installed_delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,11 @@ func init() {
packageInstalledCmd.AddCommand(packageInstalledDeleteCmd)
}

func packageUninstall(_ *cobra.Command, args []string) error {
func packageUninstall(cmd *cobra.Command, args []string) error {
packageInstalledOp.PkgInstallName = args[0]

cmd.SilenceUsage = true

pkgClient, err := tkgpackageclient.NewTKGPackageClient(packageInstalledOp.KubeConfig)
if err != nil {
return err
Expand All @@ -57,8 +59,7 @@ func packageUninstall(_ *cobra.Command, args []string) error {

initialMsg := fmt.Sprintf("Uninstalling package '%s' from namespace '%s'", packageInstalledOp.PkgInstallName, packageInstalledOp.Namespace)
if err := displayProgress(initialMsg, pp); err != nil {
if err.Error() == tkgpackagedatamodel.ErrPackageNotInstalled {
log.Warningf(fmt.Sprintf("package '%s' is not installed in namespace '%s'. Deleted previously installed resources", packageInstalledOp.PkgInstallName, packageInstalledOp.Namespace))
if isNonCriticalErrorMessage(err.Error(), packageInstalledOp.PkgInstallName, packageInstalledOp.Namespace) {
return nil
}
return err
Expand Down
2 changes: 2 additions & 0 deletions cmd/cli/plugin/package/package_installed_get.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ func init() {
}

func packageInstalledGet(cmd *cobra.Command, args []string) error {
cmd.SilenceUsage = true

kc, err := kappclient.NewKappClient(packageInstalledOp.KubeConfig)
if err != nil {
return err
Expand Down
2 changes: 2 additions & 0 deletions cmd/cli/plugin/package/package_installed_list.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ func init() {
}

func packageInstalledList(cmd *cobra.Command, args []string) error {
cmd.SilenceUsage = true

kc, err := kappclient.NewKappClient(packageInstalledOp.KubeConfig)
if err != nil {
return err
Expand Down
9 changes: 7 additions & 2 deletions cmd/cli/plugin/package/package_installed_update.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,11 @@ func init() {
packageInstalledCmd.AddCommand(packageInstalledUpdateCmd)
}

func packageUpdate(_ *cobra.Command, args []string) error {
func packageUpdate(cmd *cobra.Command, args []string) error {
packageInstalledOp.PkgInstallName = args[0]

cmd.SilenceUsage = true

pkgClient, err := tkgpackageclient.NewTKGPackageClient(packageInstalledOp.KubeConfig)
if err != nil {
return err
Expand All @@ -53,9 +55,12 @@ func packageUpdate(_ *cobra.Command, args []string) error {

initialMsg := fmt.Sprintf("Updating package '%s'", packageInstalledOp.PkgInstallName)
if err := displayProgress(initialMsg, pp); err != nil {
if isNonCriticalErrorMessage(err.Error(), packageInstalledOp.PkgInstallName, packageInstalledOp.Namespace) {
return nil
}
return err
}
log.Infof("\n %s", fmt.Sprintf("Updated package install '%s' in namespace '%s'", packageInstalledOp.PkgInstallName, packageInstalledOp.Namespace))

log.Infof("\n %s", fmt.Sprintf("Updated package install '%s' in namespace '%s'", packageInstalledOp.PkgInstallName, packageInstalledOp.Namespace))
return nil
}
23 changes: 16 additions & 7 deletions cmd/cli/plugin/package/repository_add.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ import (

"github.com/spf13/cobra"

"github.com/vmware-tanzu/tanzu-framework/pkg/v1/cli/component"
"github.com/vmware-tanzu/tanzu-framework/pkg/v1/tkg/log"
"github.com/vmware-tanzu/tanzu-framework/pkg/v1/tkg/tkgpackageclient"
"github.com/vmware-tanzu/tanzu-framework/pkg/v1/tkg/tkgpackagedatamodel"
)

var repositoryAddCmd = &cobra.Command{
Expand All @@ -26,29 +26,38 @@ var repositoryAddCmd = &cobra.Command{
func init() {
repositoryAddCmd.Flags().StringVarP(&repoOp.RepositoryURL, "url", "", "", "OCI registry url for package repository bundle")
repositoryAddCmd.Flags().BoolVarP(&repoOp.CreateNamespace, "create-namespace", "", false, "Create namespace if the target namespace does not exist, optional")
repositoryAddCmd.Flags().BoolVarP(&repoOp.Wait, "wait", "", true, "Wait for the package repository reconciliation to complete, optional. To disable wait, specify --wait=false")
repositoryAddCmd.Flags().DurationVarP(&repoOp.PollInterval, "poll-interval", "", tkgpackagedatamodel.DefaultPollInterval, "Time interval between subsequent polls of package repository reconciliation status, optional")
repositoryAddCmd.Flags().DurationVarP(&repoOp.PollTimeout, "poll-timeout", "", tkgpackagedatamodel.DefaultPollTimeout, "Timeout value for polls of package repository reconciliation status, optional")
repositoryAddCmd.MarkFlagRequired("url") //nolint
repositoryCmd.AddCommand(repositoryAddCmd)
}

func repositoryAdd(cmd *cobra.Command, args []string) error {
repoOp.RepositoryName = args[0]

cmd.SilenceUsage = true

pkgClient, err := tkgpackageclient.NewTKGPackageClient(repoOp.KubeConfig)
if err != nil {
return err
}

_, err = component.NewOutputWriterWithSpinner(cmd.OutOrStdout(), outputFormat,
fmt.Sprintf("Adding package repository '%s'...", repoOp.RepositoryName), true)
if err != nil {
return err
pp := &tkgpackagedatamodel.PackageProgress{
ProgressMsg: make(chan string, 10),
Err: make(chan error),
Done: make(chan struct{}),
}
go pkgClient.AddRepository(repoOp, pp, tkgpackagedatamodel.OperationTypeInstall)

if err := pkgClient.AddRepository(repoOp); err != nil {
initialMsg := fmt.Sprintf("Adding package repository '%s'", repoOp.RepositoryName)
if err := displayProgress(initialMsg, pp); err != nil {
if isNonCriticalErrorMessage(err.Error(), repoOp.RepositoryName, repoOp.Namespace, repoOp.RepositoryURL) {
return nil
}
return err
}

log.Infof("\n Added package repository '%s'", repoOp.RepositoryName)

return nil
}
29 changes: 17 additions & 12 deletions cmd/cli/plugin/package/repository_delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@ import (
"github.com/pkg/errors"
"github.com/spf13/cobra"

"github.com/vmware-tanzu/tanzu-framework/pkg/v1/cli/component"
"github.com/vmware-tanzu/tanzu-framework/pkg/v1/tkg/log"
"github.com/vmware-tanzu/tanzu-framework/pkg/v1/tkg/tkgpackageclient"
"github.com/vmware-tanzu/tanzu-framework/pkg/v1/tkg/tkgpackagedatamodel"
)

var repositoryDeleteCmd = &cobra.Command{
Expand All @@ -26,6 +26,9 @@ var repositoryDeleteCmd = &cobra.Command{

func init() {
repositoryDeleteCmd.Flags().BoolVarP(&repoOp.IsForceDelete, "force", "f", false, "Force deletion of the package repository, optional")
repositoryDeleteCmd.Flags().BoolVarP(&repoOp.Wait, "wait", "", true, "Wait for the package repository reconciliation to complete, optional. To disable wait, specify --wait=false")
repositoryDeleteCmd.Flags().DurationVarP(&repoOp.PollInterval, "poll-interval", "", tkgpackagedatamodel.DefaultPollInterval, "Time interval between subsequent polls of package repository reconciliation status, optional")
repositoryDeleteCmd.Flags().DurationVarP(&repoOp.PollTimeout, "poll-timeout", "", tkgpackagedatamodel.DefaultPollTimeout, "Timeout value for polls of package repository reconciliation status, optional")
repositoryCmd.AddCommand(repositoryDeleteCmd)
}

Expand All @@ -36,27 +39,29 @@ func repositoryDelete(cmd *cobra.Command, args []string) error {
return errors.New("incorrect number of input parameters. Usage: tanzu package repository delete REPO_NAME [FLAGS]")
}

cmd.SilenceUsage = true

pkgClient, err := tkgpackageclient.NewTKGPackageClient(repoOp.KubeConfig)
if err != nil {
return err
}

_, err = component.NewOutputWriterWithSpinner(cmd.OutOrStdout(), outputFormat,
fmt.Sprintf("Deleting package repository '%s'...", repoOp.RepositoryName), true)
if err != nil {
return err
pp := &tkgpackagedatamodel.PackageProgress{
ProgressMsg: make(chan string, 10),
Err: make(chan error),
Done: make(chan struct{}),
}

found, err := pkgClient.DeleteRepository(repoOp)
if !found {
log.Warningf("\n package repository '%s' does not exist in namespace '%s'", repoOp.RepositoryName, repoOp.Namespace)
return nil
}
if err != nil {
go pkgClient.DeleteRepository(repoOp, pp)

initialMsg := fmt.Sprintf("Deleting package repository '%s'", repoOp.RepositoryName)
if err := displayProgress(initialMsg, pp); err != nil {
if isNonCriticalErrorMessage(err.Error(), repoOp.RepositoryName, repoOp.Namespace) {
return nil
}
return err
}

log.Infof("\n Deleted package repository '%s' from namespace '%s'", repoOp.RepositoryName, repoOp.Namespace)

return nil
}
3 changes: 3 additions & 0 deletions cmd/cli/plugin/package/repository_get.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@ func repositoryGet(cmd *cobra.Command, args []string) error {
} else {
return errors.New("incorrect number of input parameters. Usage: tanzu package repository get REPOSITORY_NAME [FLAGS]")
}

cmd.SilenceUsage = true

pkgClient, err := tkgpackageclient.NewTKGPackageClient(repoOp.KubeConfig)
if err != nil {
return err
Expand Down
2 changes: 2 additions & 0 deletions cmd/cli/plugin/package/repository_list.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ func init() {
}

func repositoryList(cmd *cobra.Command, _ []string) error {
cmd.SilenceUsage = true

pkgClient, err := tkgpackageclient.NewTKGPackageClient(repoOp.KubeConfig)
if err != nil {
return err
Expand Down
23 changes: 16 additions & 7 deletions cmd/cli/plugin/package/repository_update.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ import (

"github.com/spf13/cobra"

"github.com/vmware-tanzu/tanzu-framework/pkg/v1/cli/component"
"github.com/vmware-tanzu/tanzu-framework/pkg/v1/tkg/log"
"github.com/vmware-tanzu/tanzu-framework/pkg/v1/tkg/tkgpackageclient"
"github.com/vmware-tanzu/tanzu-framework/pkg/v1/tkg/tkgpackagedatamodel"
)

var repositoryUpdateCmd = &cobra.Command{
Expand All @@ -27,29 +27,38 @@ func init() {
repositoryUpdateCmd.Flags().StringVarP(&repoOp.RepositoryURL, "url", "", "", "OCI registry url for package repository bundle")
repositoryUpdateCmd.Flags().BoolVarP(&repoOp.CreateRepository, "create", "", false, "Creates the package repository if it does not exist, optional")
repositoryUpdateCmd.Flags().BoolVarP(&repoOp.CreateNamespace, "create-namespace", "", false, "Create namespace if the target namespace does not exist, optional")
repositoryUpdateCmd.Flags().BoolVarP(&repoOp.Wait, "wait", "", true, "Wait for the package repository reconciliation to complete, optional. To disable wait, specify --wait=false")
repositoryUpdateCmd.Flags().DurationVarP(&repoOp.PollInterval, "poll-interval", "", tkgpackagedatamodel.DefaultPollInterval, "Time interval between subsequent polls of package repository reconciliation status, optional")
repositoryUpdateCmd.Flags().DurationVarP(&repoOp.PollTimeout, "poll-timeout", "", tkgpackagedatamodel.DefaultPollTimeout, "Timeout value for polls of package repository reconciliation status, optional")
repositoryUpdateCmd.MarkFlagRequired("url") //nolint
repositoryCmd.AddCommand(repositoryUpdateCmd)
}

func repositoryUpdate(cmd *cobra.Command, args []string) error {
repoOp.RepositoryName = args[0]

cmd.SilenceUsage = true

pkgClient, err := tkgpackageclient.NewTKGPackageClient(repoOp.KubeConfig)
if err != nil {
return err
}

_, err = component.NewOutputWriterWithSpinner(cmd.OutOrStdout(), outputFormat,
fmt.Sprintf("Updating package repository '%s'...", repoOp.RepositoryName), true)
if err != nil {
return err
pp := &tkgpackagedatamodel.PackageProgress{
ProgressMsg: make(chan string, 10),
Err: make(chan error),
Done: make(chan struct{}),
}
go pkgClient.UpdateRepository(repoOp, pp)

if err := pkgClient.UpdateRepository(repoOp); err != nil {
initialMsg := fmt.Sprintf("Updating package repository '%s'", repoOp.RepositoryName)
if err := displayProgress(initialMsg, pp); err != nil {
if isNonCriticalErrorMessage(err.Error(), repoOp.RepositoryName, repoOp.Namespace, repoOp.RepositoryURL) {
return nil
}
return err
}

log.Infof("\n Updated package repository '%s' in namespace '%s'", repoOp.RepositoryName, repoOp.Namespace)

return nil
}
Loading

0 comments on commit 325d2ec

Please sign in to comment.