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 }