github.com/mook-as/cf-cli@v7.0.0-beta.28.0.20200120190804-b91c115fae48+incompatible/command/v7/delete_command.go (about) 1 package v7 2 3 import ( 4 "code.cloudfoundry.org/cli/actor/actionerror" 5 "code.cloudfoundry.org/cli/actor/sharedaction" 6 "code.cloudfoundry.org/cli/actor/v7action" 7 "code.cloudfoundry.org/cli/command" 8 "code.cloudfoundry.org/cli/command/flag" 9 "code.cloudfoundry.org/cli/command/v7/shared" 10 "code.cloudfoundry.org/clock" 11 ) 12 13 //go:generate counterfeiter . DeleteActor 14 15 type DeleteActor interface { 16 CloudControllerAPIVersion() string 17 DeleteApplicationByNameAndSpace(name, spaceGUID string, deleteRoutes bool) (v7action.Warnings, error) 18 } 19 20 type DeleteCommand struct { 21 RequiredArgs flag.AppName `positional-args:"yes"` 22 Force bool `short:"f" description:"Force deletion without confirmation"` 23 DeleteMappedRoutes bool `short:"r" description:"Also delete any mapped routes"` 24 usage interface{} `usage:"CF_NAME delete APP_NAME [-r] [-f]"` 25 relatedCommands interface{} `related_commands:"apps, scale, stop"` 26 27 UI command.UI 28 Config command.Config 29 SharedActor command.SharedActor 30 Actor DeleteActor 31 } 32 33 func (cmd *DeleteCommand) Setup(config command.Config, ui command.UI) error { 34 cmd.UI = ui 35 cmd.Config = config 36 cmd.SharedActor = sharedaction.NewActor(config) 37 38 ccClient, _, err := shared.GetNewClientsAndConnectToCF(config, ui, "") 39 if err != nil { 40 return err 41 } 42 cmd.Actor = v7action.NewActor(ccClient, config, nil, nil, clock.NewClock()) 43 44 return nil 45 } 46 47 func (cmd DeleteCommand) Execute(args []string) error { 48 err := cmd.SharedActor.CheckTarget(true, true) 49 if err != nil { 50 return err 51 } 52 53 currentUser, err := cmd.Config.CurrentUser() 54 if err != nil { 55 return err 56 } 57 58 if !cmd.Force { 59 prompt := "Really delete the app {{.AppName}}?" 60 if cmd.DeleteMappedRoutes { 61 prompt = "Really delete the app {{.AppName}} and associated routes?" 62 cmd.UI.DisplayText("Deleting the app and associated routes will make apps with this route, in any org, unreachable.") 63 } 64 65 response, promptErr := cmd.UI.DisplayBoolPrompt(false, prompt, map[string]interface{}{ 66 "AppName": cmd.RequiredArgs.AppName, 67 }) 68 69 if promptErr != nil { 70 return promptErr 71 } 72 73 if !response { 74 cmd.UI.DisplayText("App '{{.AppName}}' has not been deleted.", map[string]interface{}{ 75 "AppName": cmd.RequiredArgs.AppName, 76 }) 77 return nil 78 } 79 } 80 81 cmd.UI.DisplayTextWithFlavor("Deleting app {{.AppName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.Username}}...", map[string]interface{}{ 82 "AppName": cmd.RequiredArgs.AppName, 83 "OrgName": cmd.Config.TargetedOrganization().Name, 84 "SpaceName": cmd.Config.TargetedSpace().Name, 85 "Username": currentUser.Name, 86 }) 87 88 warnings, err := cmd.Actor.DeleteApplicationByNameAndSpace( 89 cmd.RequiredArgs.AppName, 90 cmd.Config.TargetedSpace().GUID, 91 cmd.DeleteMappedRoutes, 92 ) 93 cmd.UI.DisplayWarnings(warnings) 94 if err != nil { 95 switch err.(type) { 96 case actionerror.ApplicationNotFoundError: 97 cmd.UI.DisplayWarning("App '{{.AppName}}' does not exist.", map[string]interface{}{ 98 "AppName": cmd.RequiredArgs.AppName, 99 }) 100 case actionerror.RouteBoundToMultipleAppsError: 101 cmd.UI.DeferText( 102 "\nTIP: Run 'cf delete {{.AppName}}' to delete the app and 'cf delete-route' to delete the route.", 103 map[string]interface{}{ 104 "AppName": cmd.RequiredArgs.AppName, 105 }, 106 ) 107 return err 108 default: 109 return err 110 } 111 } 112 113 cmd.UI.DisplayOK() 114 115 return nil 116 }