github.com/wanddynosios/cli/v8@v8.7.9-0.20240221182337-1a92e3a7017f/command/v7/upgrade_service_command.go (about)

     1  package v7
     2  
     3  import (
     4  	"code.cloudfoundry.org/cli/actor/actionerror"
     5  	"code.cloudfoundry.org/cli/command/flag"
     6  	"code.cloudfoundry.org/cli/command/translatableerror"
     7  	"code.cloudfoundry.org/cli/command/v7/shared"
     8  )
     9  
    10  type UpgradeServiceCommand struct {
    11  	BaseCommand
    12  
    13  	RequiredArgs flag.ServiceInstance `positional-args:"yes"`
    14  	Force        bool                 `short:"f" long:"force" description:"Force upgrade without asking for confirmation"`
    15  	Wait         bool                 `short:"w" long:"wait" description:"Wait for the operation to complete"`
    16  
    17  	relatedCommands interface{} `related_commands:"services, update-service, update-user-provided-service"`
    18  }
    19  
    20  func (cmd UpgradeServiceCommand) Execute(args []string) error {
    21  	if err := cmd.SharedActor.CheckTarget(true, true); err != nil {
    22  		return err
    23  	}
    24  
    25  	if !cmd.Force {
    26  		upgrade, err := cmd.displayPrompt()
    27  		if err != nil {
    28  			return err
    29  		}
    30  
    31  		if !upgrade {
    32  			cmd.UI.DisplayText("Upgrade cancelled")
    33  			return nil
    34  		}
    35  	}
    36  
    37  	if err := cmd.displayEvent(); err != nil {
    38  		return err
    39  	}
    40  
    41  	serviceInstanceName := string(cmd.RequiredArgs.ServiceInstance)
    42  
    43  	stream, warnings, actorError := cmd.Actor.UpgradeManagedServiceInstance(
    44  		serviceInstanceName,
    45  		cmd.Config.TargetedSpace().GUID,
    46  	)
    47  	cmd.UI.DisplayWarnings(warnings)
    48  
    49  	switch actorError.(type) {
    50  	case nil:
    51  	case actionerror.ServiceInstanceUpgradeNotAvailableError:
    52  		cmd.UI.DisplayText(actorError.Error())
    53  		cmd.UI.DisplayOK()
    54  	case actionerror.ServiceInstanceNotFoundError:
    55  		return translatableerror.ServiceInstanceNotFoundError{Name: serviceInstanceName}
    56  	default:
    57  		return actorError
    58  	}
    59  
    60  	complete, err := shared.WaitForResult(stream, cmd.UI, cmd.Wait)
    61  	switch {
    62  	case err != nil:
    63  		return err
    64  	case complete:
    65  		cmd.UI.DisplayTextWithFlavor("Upgrade of service instance {{.ServiceInstanceName}} complete.", cmd.serviceInstanceName())
    66  	default:
    67  		cmd.UI.DisplayTextWithFlavor("Upgrade in progress. Use 'cf services' or 'cf service {{.ServiceInstanceName}}' to check operation status.", cmd.serviceInstanceName())
    68  	}
    69  
    70  	cmd.UI.DisplayOK()
    71  	return nil
    72  }
    73  
    74  func (cmd UpgradeServiceCommand) Usage() string {
    75  	return "CF_NAME upgrade-service SERVICE_INSTANCE"
    76  }
    77  
    78  func (cmd UpgradeServiceCommand) displayEvent() error {
    79  	user, err := cmd.Actor.GetCurrentUser()
    80  	if err != nil {
    81  		return err
    82  	}
    83  
    84  	cmd.UI.DisplayTextWithFlavor(
    85  		"Upgrading service instance {{.ServiceInstanceName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.Username}}...",
    86  		map[string]interface{}{
    87  			"ServiceInstanceName": cmd.RequiredArgs.ServiceInstance,
    88  			"OrgName":             cmd.Config.TargetedOrganization().Name,
    89  			"SpaceName":           cmd.Config.TargetedSpace().Name,
    90  			"Username":            user.Name,
    91  		},
    92  	)
    93  	cmd.UI.DisplayNewline()
    94  
    95  	return nil
    96  }
    97  
    98  func (cmd UpgradeServiceCommand) displayPrompt() (bool, error) {
    99  	cmd.UI.DisplayText(
   100  		"Warning: This operation may be long running and will block further operations " +
   101  			"on the service instance until it's completed",
   102  	)
   103  
   104  	upgrade, err := cmd.UI.DisplayBoolPrompt(
   105  		false,
   106  		"Do you really want to upgrade the service instance {{.ServiceInstanceName}}?",
   107  		cmd.serviceInstanceName(),
   108  	)
   109  	if err != nil {
   110  		return false, err
   111  	}
   112  
   113  	return upgrade, nil
   114  }
   115  
   116  func (cmd UpgradeServiceCommand) serviceInstanceName() map[string]any {
   117  	return map[string]any{
   118  		"ServiceInstanceName": cmd.RequiredArgs.ServiceInstance,
   119  	}
   120  }