github.com/henvic/wedeploycli@v1.7.6-0.20200319005353-3630f582f284/command/delete/delete.go (about) 1 package delete 2 3 import ( 4 "context" 5 "errors" 6 "fmt" 7 8 "github.com/henvic/wedeploycli/cmdflagsfromhost" 9 "github.com/henvic/wedeploycli/color" 10 "github.com/henvic/wedeploycli/command/canceled" 11 "github.com/henvic/wedeploycli/command/internal/we" 12 "github.com/henvic/wedeploycli/fancy" 13 "github.com/henvic/wedeploycli/projects" 14 "github.com/henvic/wedeploycli/services" 15 "github.com/spf13/cobra" 16 ) 17 18 var force bool 19 20 // DeleteCmd is the delete command to undeploy a project or service 21 var DeleteCmd = &cobra.Command{ 22 Use: "delete", 23 Short: "Delete project or services\n\t\t", 24 Args: cobra.NoArgs, 25 PreRunE: preRun, 26 RunE: run, 27 Example: ` lcp delete --url data.chat.lfr.cloud 28 lcp delete --project chat 29 lcp delete --project chat --service data`, 30 } 31 32 type undeployer struct { 33 context context.Context 34 project string 35 service string 36 infrastructureDomain string 37 serviceDomain string 38 } 39 40 var setupHost = cmdflagsfromhost.SetupHost{ 41 Pattern: cmdflagsfromhost.FullHostPattern, 42 43 Requires: cmdflagsfromhost.Requires{ 44 Project: true, 45 Auth: true, 46 }, 47 48 PromptMissingProject: true, 49 } 50 51 func init() { 52 // the --quiet parameter was removed 53 _ = DeleteCmd.Flags().BoolP("quiet", "q", false, "") 54 _ = DeleteCmd.Flags().MarkHidden("quiet") 55 56 DeleteCmd.Flags().BoolVar(&force, "force", false, 57 "Force deleting services without confirmation") 58 setupHost.Init(DeleteCmd) 59 } 60 61 func preRun(cmd *cobra.Command, args []string) error { 62 return setupHost.Process(context.Background(), we.Context()) 63 } 64 65 func run(cmd *cobra.Command, args []string) error { 66 var u = undeployer{ 67 context: context.Background(), 68 project: setupHost.Project(), 69 service: setupHost.Service(), 70 infrastructureDomain: setupHost.InfrastructureDomain(), 71 serviceDomain: setupHost.ServiceDomain(), 72 } 73 74 if err := u.checkProjectOrServiceExists(); err != nil { 75 return err 76 } 77 78 if err := u.confirmation(); err != nil { 79 return err 80 } 81 82 return u.do() 83 } 84 85 func (u *undeployer) confirmation() error { 86 if force { 87 return nil 88 } 89 90 if u.service != "" { 91 fmt.Print(color.Format(color.FgRed, color.Bold, "Deleting a service cannot be undone.")) 92 fmt.Println(" All the access and domains related to this service will be lost.") 93 fmt.Printf("Enter the service ID %s to delete it permanently:\n", 94 color.Format(color.ReverseVideo, u.service)) 95 } else { 96 fmt.Print(color.Format(color.FgRed, color.Bold, "Deleting a project cannot be undone.")) 97 fmt.Println(" All the services and the access and domains related to this project will be lost.") 98 fmt.Printf("Enter the project ID %s to delete it permanently:\n", 99 color.Format(color.ReverseVideo, u.project)) 100 } 101 102 var verify, askErr = fancy.Prompt() 103 104 if askErr != nil { 105 return askErr 106 } 107 108 switch { 109 case verify == "": 110 return canceled.Skip() 111 case (u.service != "" && verify == u.service) || u.service == "" && verify == u.project: 112 return nil 113 default: 114 return errors.New("invalid value") 115 } 116 } 117 118 func (u *undeployer) do() (err error) { 119 switch u.service { 120 case "": 121 projectsClient := projects.New(we.Context()) 122 err = projectsClient.Delete(u.context, u.project) 123 default: 124 servicesClient := services.New(we.Context()) 125 err = servicesClient.Delete(u.context, u.project, u.service) 126 } 127 128 if err != nil { 129 return err 130 } 131 132 switch u.service { 133 case "": 134 fmt.Printf(color.Format( 135 color.FgHiBlack, "Deleting project \"")+ 136 "%s"+ 137 color.Format(color.FgHiBlack, "\" on ")+ 138 u.infrastructureDomain+ 139 color.Format(color.FgHiBlack, ".")+ 140 "\n", 141 u.project) 142 default: 143 fmt.Printf(color.Format( 144 color.FgHiBlack, "Deleting service \"")+ 145 "%v"+ 146 color.Format(color.FgHiBlack, "\" on project \"")+ 147 "%v"+ 148 color.Format(color.FgHiBlack, "\" on ")+ 149 u.infrastructureDomain+ 150 color.Format(color.FgHiBlack, ".")+ 151 "\n", 152 u.service, 153 u.project) 154 } 155 156 return nil 157 } 158 159 func (u *undeployer) checkProjectOrServiceExists() (err error) { 160 if u.service == "" { 161 projectsClient := projects.New(we.Context()) 162 _, err = projectsClient.Get(u.context, u.project) 163 } else { 164 servicesClient := services.New(we.Context()) 165 _, err = servicesClient.Get(u.context, u.project, u.service) 166 } 167 168 return err 169 }