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  }