github.com/fastly/cli@v1.7.2-0.20240304164155-9d0f1d77c3bf/pkg/commands/service/delete.go (about) 1 package service 2 3 import ( 4 "fmt" 5 "io" 6 7 "github.com/fastly/go-fastly/v9/fastly" 8 9 "github.com/fastly/cli/pkg/argparser" 10 "github.com/fastly/cli/pkg/errors" 11 "github.com/fastly/cli/pkg/global" 12 "github.com/fastly/cli/pkg/manifest" 13 "github.com/fastly/cli/pkg/text" 14 ) 15 16 // DeleteCommand calls the Fastly API to delete services. 17 type DeleteCommand struct { 18 argparser.Base 19 Input fastly.DeleteServiceInput 20 force bool 21 serviceName argparser.OptionalServiceNameID 22 } 23 24 // NewDeleteCommand returns a usable command registered under the parent. 25 func NewDeleteCommand(parent argparser.Registerer, g *global.Data) *DeleteCommand { 26 c := DeleteCommand{ 27 Base: argparser.Base{ 28 Globals: g, 29 }, 30 } 31 c.CmdClause = parent.Command("delete", "Delete a Fastly service").Alias("remove") 32 33 // Optional. 34 c.CmdClause.Flag("force", "Force deletion of an active service").Short('f').BoolVar(&c.force) 35 c.RegisterFlag(argparser.StringFlagOpts{ 36 Name: argparser.FlagServiceIDName, 37 Description: argparser.FlagServiceIDDesc, 38 Dst: &g.Manifest.Flag.ServiceID, 39 Short: 's', 40 }) 41 c.RegisterFlag(argparser.StringFlagOpts{ 42 Action: c.serviceName.Set, 43 Name: argparser.FlagServiceName, 44 Description: argparser.FlagServiceDesc, 45 Dst: &c.serviceName.Value, 46 }) 47 return &c 48 } 49 50 // Exec invokes the application logic for the command. 51 func (c *DeleteCommand) Exec(_ io.Reader, out io.Writer) error { 52 serviceID, source, flag, err := argparser.ServiceID(c.serviceName, *c.Globals.Manifest, c.Globals.APIClient, c.Globals.ErrLog) 53 if err != nil { 54 return err 55 } 56 if c.Globals.Verbose() { 57 argparser.DisplayServiceID(serviceID, flag, source, out) 58 } 59 60 c.Input.ServiceID = serviceID 61 62 if c.force { 63 s, err := c.Globals.APIClient.GetServiceDetails(&fastly.GetServiceInput{ 64 ServiceID: serviceID, 65 }) 66 if err != nil { 67 c.Globals.ErrLog.AddWithContext(err, map[string]any{ 68 "Service ID": serviceID, 69 }) 70 return err 71 } 72 73 if s.ActiveVersion != nil && fastly.ToValue(s.ActiveVersion.Number) != 0 { 74 _, err := c.Globals.APIClient.DeactivateVersion(&fastly.DeactivateVersionInput{ 75 ServiceID: serviceID, 76 ServiceVersion: fastly.ToValue(s.ActiveVersion.Number), 77 }) 78 if err != nil { 79 c.Globals.ErrLog.AddWithContext(err, map[string]any{ 80 "Service ID": serviceID, 81 "Service Version": fastly.ToValue(s.ActiveVersion.Number), 82 }) 83 return err 84 } 85 } 86 } 87 88 if err := c.Globals.APIClient.DeleteService(&c.Input); err != nil { 89 c.Globals.ErrLog.AddWithContext(err, map[string]any{ 90 "Service ID": serviceID, 91 }) 92 return errors.RemediationError{ 93 Inner: err, 94 Remediation: fmt.Sprintf("Try %s\n", text.Bold("fastly service delete --force")), 95 } 96 } 97 98 // Ensure that VCL service users are unaffected by checking if the Service ID 99 // was acquired via the fastly.toml manifest. 100 if source == manifest.SourceFile { 101 if err := c.Globals.Manifest.File.Read(manifest.Filename); err != nil { 102 c.Globals.ErrLog.Add(err) 103 return fmt.Errorf("error reading fastly.toml: %w", err) 104 } 105 c.Globals.Manifest.File.ServiceID = "" 106 if err := c.Globals.Manifest.File.Write(manifest.Filename); err != nil { 107 c.Globals.ErrLog.Add(err) 108 return fmt.Errorf("error updating fastly.toml: %w", err) 109 } 110 } 111 112 text.Success(out, "Deleted service ID %s", c.Input.ServiceID) 113 return nil 114 }